SwishをCIFAR10で試してみる

ReLUの代わりになる活性化関数Swishの提案。
Swishの形はシンプル。 {} $$ f(x) = x \cdot σ (x) $$ f:id:yusuke_ujitoko:20171021112551p:plain

ReLUとの違いは,non-monotonicityとsmoothnessだと思う.
小さい負の入力はReLUを通すと全てゼロになるが, Swishでは負の値を出力する.

また,smoothnessという観点では,
2入力・2出力の6層NNに対して、
ランダムに入力を与えたときの出力(x,y)をヒートマップで描画すると,以下のようになる。 f:id:yusuke_ujitoko:20171021133644p:plain ReLUは値の変化が鋭い領域があるのがわかる。
Swishのこのsmoothnessはlossに影響を与えて最適化しやすいらしい.

これらの特徴がどういう効果を具体的に持つのかはまだよくわかっていないが、 既存の活性化関数を使った場合を性能でoutperformしたとのことなので、
手元のCIFAR10で試してみた。

SwishをCIFAR10で試す

CIFAR10をResNetで分類する際の、
ネットワーク内のReLUをSwishに変更して精度を比較してみる。
(もともとresidual block内にのみReLUは存在)

論文にもCIFAR10に対する素のResNetでの分類結果が書かれていたが、
ResNet-164を利用していた。
今回はそれよりも層が少ないResNetで試してみた。

まずは20層のResNetの場合、

f:id:yusuke_ujitoko:20171021111354p:plain

訓練データ、テストデータに対する精度ともに、 ReLUの代わりにSwishを用いた場合の方が高い。
次に56層のResNetの場合、

f:id:yusuke_ujitoko:20171021135357p:plain

56層の場合は、学習は早く進むものの、
最終的な結果に違いがあまり出なかった。

その他

過去に同様の活性化関数が既に提案されているようだ。
https://arxiv.org/pdf/1702.03118.pdf

また浅い層のネットワークには有効ではないという噂もある。