ニューラルネットワークと活性化関数

(2017-09-18)

ニューラルネットワークの活性化関数は各層での重み掛けバイアス足しのあとに適用する非線形の関数。 というのも、線形な計算を繰り返したところで

f(x) = ax + b
g(x) = f(f(x)) = (a^2)x + (ab + b)

のように単一の線形関数で表現できてしまい、多層にする意味がないため。 また、バックプロバゲーション(誤差逆伝播法)のために微分できる必要もある。

Tensorflowでも以下の活性化関数が用意されている

sigmoid

シグモイド関数

y = 1 / (1 + exp(-x))。値域は(0,1)でシグマの語末系ςに似たS字を描く。 xが大きいときに微分係数が小さくなるため、何層もこの関数を適用するとき、バックプロバゲーションで微分係数を掛けた結果、勾配が消滅(Gradient vanishing)する問題があり、あまり使われないようだ。値域が(-1,1)で似たグラフを描くtanh(Hyperbolic tangent)もある。

softsign

softsign

x/(1 + abs(x))。tanhと比べて漸近線に近づく速度が遅くなっている。 それほど性能は変わらないが、初期化においてロバストになるはたらきがあるようだ。

softplus

softplus

log(1 + exp(x))。ReLUに続く。

ReLU(Rectified Linear Unit)

ReLU

max(0, x)。単純だけど最有力。Gradient vanishingも起きない。 softplusと比べてexpやlogを含まない分高速に計算できるので、 膨大で複雑なデータセットに対して多くの層を用いることができる。

0以下は等しく0になるため、トレーニング中に落ちてしまうとニューロンが死んでしまうことがある。 そのような場合は0以下のときy = exp(x) - 1にするELU(Exponential Linear Unit) などを使う。

ELU

参考

Activation functions and it’s types-Which is better?

最適化から見たディープラーニングの考え方

Understanding the difficulty of training deep feedforward neural networks

Rectifier (neural networks) - Wikipedia