TadaoYamaokaの日記

山岡忠夫Homeで公開しているプログラムの開発ネタを中心に書いていきます。

tanh vs sigmoid

AlphaGoのValue Networkの出力にはtanhが使用されている。
一方、将棋AIでは評価関数から勝率に変換する際、sigmoidが使われている。

tanhとsigmoidのどちらがよいか、dlshogiの学習で検証してみたが、Policy NetworkとValue Networkのマルチタスク学習を行っているためはっきりした結果が得られなかった。

そこで、MNISTのデータセットで多層パーセプトロンを学習するというシンプルなケースで比較を行ってみた。

MNISTは0から9の数値分類のデータセットだが、tanhとsigmoidを比較するため、偶数か奇数かの2値分類を行う。

以下の3パターンで比較を行う。

出力関数 損失関数
1 tanh 平均二乗誤差(MSE)
2 sigmoid 交差エントロピー
3 sigmoid 平均二乗誤差(MSE)

比較結果

測定条件
average train loss

f:id:TadaoYamaoka:20171107213115p:plain

test loss

f:id:TadaoYamaoka:20171107213131p:plain

test accuracy

f:id:TadaoYamaoka:20171107213207p:plain

考察

train lossは、それぞれスケールが異なるため大小では比較できないが、sigmoid+MSEは、lossの減少が他に比べて遅い。
test accuracyは、tanhが最も高くなっている。

このことから、MNISTの多層パーセプトロンによる2値分類では、tanh+MSEが最も効率よく学習できることがわかった。
また、出力関数がsigmoidならば、損失関数は平均二乗誤差より交差エントロピーにした方が良い。

他のデータセットや、深層畳み込みニューラルネットワークでも同じ傾向かは実験してみないとわからない。

検証に使用したソース

github.com