External Memory

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

ドロップアウトにおける過学習抑止と学習精度のためのkeep率の設定

ニューラルネットワークを用いた機械学習において、
ドロップアウトは汎用性、つまり学習用データの正答率とテストデータの正答率のギャップを埋めるためのものであり、ニューラルネットワークそのものの学習精度を向上させるものとは言い切れない。

テストデータに対する正答率は、
学習用データに対する正答率を超えることは普通はないと思われる。
学習用データの正答率そのものが小さければ、
いくら汎用性を獲得してもテストデータの正答率は良くはならない。

そういう意味で学習用データの正答率や誤差関数(loss)値は学習精度の一つの目安となりえると思われる。また過学習防止のほかに、入力データの典型的な特徴をうまく抽出できなければならない。よってドロップアウト過学習防止と学習精度とのトレードオフのような関係を作り出す。

また、入力データに十分な普遍性が備わることがあれば、それはテストデータの正答率向上に反映されるはずなので過学習であっても問題はないように思う。



検討においてMNISTデータを使用し、
ニューラルネットワークはCNNではなくすべて全結合層で行った。

前回の検討においてドロップアウトの処理を最終層のみに限定したが、
全結合層のみで構成されたニューラルネットワークでは層間ごとにドロップアウトが必要であるように見えたので、まずそれら比較を行った。

学習のstep数を30000とし、過学習の影響がより明確に見えるように学習用のデータによる正答率とloss値も出力するようにした。

ここでのkeep率とはドロップアウト処理における出力の保持率のことである。

以下はkeep率を0.5に固定した時の比較結果である。
unitsは層ごとのunit数である。右端が入力層、左端が出力層、中央の二つがhidden layerである。データが多いので途中経過は省略した。
train_lossとtrain_accはそれぞれ学習データに対するloss値と正答率、
test_lossとtest_accはテストデータに対するloss値と正答率である。

units                  step   train_loss    train_acc    test_loss     test_acc
----------------------------------------------------------------------------------
最終層間のみドロップアウト処理keep率0.5
784,392,392,10        30000       0.0029       0.9994       0.1230       0.9824
784,784,784,10        30000       0.0081       0.9980       0.1749       0.9824
784,1024,1024,10      30000       0.0054       0.9984       0.2209       0.9791 
784,392,100,10        30000       0.0004       1.0000       0.1305       0.9834
784,784,392,10        30000       0.0029       0.9986       0.1586       0.9835
784,1024,784,10       30000       0.0092       0.9980       0.1744       0.9812

すべての層間でドロップアウト処理keep率0.5 
784,392,392,10        30000       0.0474       0.9870       0.0783       0.9766
784,784,784,10        30000       0.0332       0.9928       0.0717       0.9804
784,1024,1024,10      30000       0.0460       0.9888       0.0780       0.9791
784,392,100,10        30000       0.0438       0.9864       0.0731       0.9787
784,784,392,10        30000       0.0363       0.9902       0.0689       0.9791
784,1024,784,10       30000       0.0429       0.9906       0.0805       0.9766

最終層間のみのドロップアウト処理の場合は学習データのloss値とテストデータでのloss値を見ると、明らかに過学習の兆候が見られる。ここでは途中の結果は省略しているが、テストデータのloss値はあるstep数からstep数の増加に従って悪化する傾向にあった。学習データに対する正答率が0.999以上は受け入れがたい。

すべての層間でドロップアウト処理処理をした場合は、過学習の傾向が明確に抑えられている。テストデータのloss値が小さくなっているのが分かる。

しかしテストデータの正答率は悪化している。
loss値と正答率にはそれなりの相関があると直観的に思われるが、
ここではそうではないので、後々よく考える必要がある。

一方、学習データでの正答率は0.99前後で飽和した。この辺りが学習精度の限界であると思われる。よって、step数を増やしてもテストデータの正答率が0.99を上回ることはほぼない。

そこでkeep率を少し大きくして、検討を行った。
具体的には全ての層間に対してkeep率を0.7、0.8とした。

units                   step   train_loss    train_acc    test_loss     test_acc
----------------------------------------------------------------------------------
keep率0.7
784,392,392,10         30000       0.0060       0.9984       0.0595       0.9846
784,784,784,10         30000       0.0084       0.9980       0.0680       0.9836
784,1024,1024,10       30000       0.0068       0.9986       0.0716       0.9841
784,392,100,10         30000       0.0073       0.9984       0.0662       0.9818
784,784,392,10         30000       0.0067       0.9980       0.0590       0.9841
784,1024,784,10        30000       0.0110       0.9960       0.0776       0.9821

keep率0.8 
784,392,392,10         30000       0.0030       0.9994       0.0711       0.9826
784,784,784,10         30000       0.0032       0.9992       0.0739       0.9854
784,1024,1024,10       30000       0.0072       0.9978       0.0845       0.9837
784,392,100,10         30000       0.0026       0.9996       0.0620       0.9843
784,784,392,10         30000       0.0029       0.9990       0.0786       0.9837
784,1024,784,10        30000       0.0034       0.9988       0.0867       0.9848

過学習の傾向を抑えながらも、うまく学習精度の上限を上げることができている。
テストデータに対する正答率も向上した。
keep率0.8では少し過学習の兆候が見られたので、この系においてはkeep率0.7-0.8付近に最適値があると思われる。


ドロップアウトを用いる場合、最終の出力層だけでなく全結合層間すべてに行うのが無難であると思われる。


loss値と正答率の関係がよく分からない。
loss値が小さいからと言って正答率が良くなるとは限らないようである。
loss値が小さいということは、惜しい間違いを数多く出してしまっていると考えられるから、必要な特徴量を抽出しきれていないということが思いつく。
逆にloss値が大きいのに正答率が良い場合、出力において確率分布の分散が大きくなりやすくなる傾向があることが考えられる。

比喩としては、視力検査でぼんやりとしか見えないけどなんとなく判別がつくということと、はっきり判別がつくことの差異みたいなものを想像する。
keep率が小さいときにそれらの特徴が目についたことを考えると、
特徴がぼやけてしまうのはそれなりに妥当であるかもしれない。

さらに精度を上げるためには、それなりにもっとうまく特徴量を抽出できるように
一工夫加えるだけでいいかもしれないし、
根本的なところから考慮に入れるべきであるかもしれない。