External Memory

プログラミング周辺知識の備忘録メイン

活性化関数ReLUとその類似関数

ニューラルネットワークにおいて、活性化関数ReLUはよく用いられている。
シグモイド関数とは違って、ReLUのような区分線形な関数はその形状から、
逆伝播時の勾配消失問題を回避することができる。
また、線形ニューラルネットワークと比較して、複雑な識別が可能となる。
TensorFlowのAPIリストをいろいろ眺めていると数種類のReLUに類似な関数がある。

ReLU関数

 f(x) = max(x,0)

TensorFlowには類似関数ReLU6、CReLU、ELUがある。
類似関数は他にもあるようですがこの3つを紹介し、
実際にFFNNとCNNを使って比較する。

ReLU6

http://www.cs.utoronto.ca/~kriz/conv-cifar10-aug2010.pdf

上記論文ではReLU6を実際に使用してCIFAR-10の学習を行っている。
ReLU6は以下で表される関数である。

f(x)=min(max(x,0),6)

直観的には重みが大きすぎると、勾配の値が大きくなりすぎて精度が低下すると思われるから、それを防ぐためのもののように見える。
文献には、スパースな特徴を早期に学習するとか、ノイズモデルにおいてノイズの特徴に対するペナルティを抑えられるというような記載があるが、DBNやスパース性についてまだよく知らないのであまり理解できなかった。
要はノイズを避けて学習してほしい特徴を抽出しやすいということだろうか。

CReLU

https://arxiv.org/pdf/1603.05201.pdf
上記論文ではCReLUを用いてCIFAR-10/100の学習を行っている。
CReLUは以下で表される関数である。

f(x)=(ReLU(x),ReLU(-x))

ぱっと式を見てもあまり感覚をつかめない。
文献によると、古典的なCNNで自然画像を学習すると正の相と負の相のペアが最初の畳み込み層の出力で観察される(文献のFigure.1参照)。
ReLUでは正の相のみが抽出されるため、負の相は消えてしまう。
また、層が深くなるにつれて正と負の相が重なってしまうので、比較的浅い層でReLUの代わりにCReLUを使って、負の層の特徴を消さないようにすることで精度の向上を狙っているようだ。

ELU

http://arxiv.org/abs/1511.07289
上記論文ではELUを用いてCIFAR-10/100の学習を行っている。
ELUは以下で表される関数である

f(x)=\begin{cases} \alpha(\exp(x)-1)&(x<0) \\ x&(otherwise) \end{cases}

フィッシャー情報行列や自然勾配という知らない概念がまた出てきたが、
層のユニットの活性値の平均がゼロに近ければバイアスシフトが抑えられて、学習速度が上がるらしい。
バイアスシフトが抑えられるという証明は論文に記載されてあったが、フィッシャー最適化に結び付く証明ではなかった。
さらに突っ込むのはここでは保留。
平均値をゼロにするという意味では、ReLUよりELUの方が適している。
多くのCNN構造でELUを用いることで精度が向上した結果が得られている。

MNISTで分類精度比較

活性化関数だけ変更して、MNISTの分類精度を比較した。
FFNNとCNNの両方で行ったがCReLUに関しては、今回は自然画像対象ではないのでCIFAR-10を用いるときに別途検証する。

FFNN
units                   step   train_loss    train_acc    test_loss     test_acc
-----------------------------------------------------------------------------------
ReLU
784,784,784,10         30000       0.0093       0.9972       0.0776       0.9846
ReLU6
784,784,784,10         30000       0.0064       0.9972       0.0773       0.9844
ELU
784,784,784,10         30000       0.0133       0.9950       0.1148       0.9832

CNN
 step           loss      accurancy
--------------------------------------
ReLU
20000         0.0251         0.9927
ReLU6
20000         0.0273         0.9921
ELU
20000         0.0441         0.9899

ReLUとReLU6で差がほとんど見られないことから、おそらくもともと重みがとびぬけて大きくなっていないものと思われる。
ELUは他と比べて若干学習速度は遅く、正答率もわずかに悪かった。
99%付近での差となると、原因の予測がつかない。
負の重みがノイズであって正の重みに影響を与えているとか、そもそも手書き数字においてノイズと有効な特徴の差異どう判別するかとかいろいろ思い浮かんだりするが、
文献等で実施されているように統計的根拠において検証と考察、試行錯誤を行うべきなのか。


上記の文献ではすべてCIFAR-10/100で検証を行っているので、そういう複雑なデータの分類に向いているのかもしれない。
当然ながらTensorFlowのAPIも単純なものの分類よりそういった複雑なデータ向けのものが増えていくのだろう。