ニューラルネットワークを使用するうえで気おつけなければならない問題として、過学習があります。ニューラルネットワークではこの過学習を防ぐための方法の一つとしてDropoutという手法があります。
今回はこのDropoutについて調べました。
Contents
過学習
層の深いニューラルネットワークは表現力や自由度が高いので過学習しやすいといわれています。過学習とはニューラルネットワークの訓練時に訓練データに適合しすぎてしまい、訓練データには高い正答率を出しますが訓練データ以外の未知のデータでの正答率が低くなってしまうことです。
過学習のイメージを下に示します。
点が訓練データ、黒線が本来学習してほしい曲線、赤線が過学習してしまった曲線です。図のように訓練データの部分では非常によく合いますが、それ以外の部分では合わなくなってしまいます。
過学習の原因の一つとして訓練データのデータ数が少ないということがあります。そのため訓練データをたくさん集める手学習すれば過学習を防ぐことができます。
しかし十分な数の訓練データを集めることは大変であったり、集められない場合もあります。
そこで訓練データの数を増やさず、過学習を防ぐ方法が求められました。その一つが今回調べたDropoutという方法です。
Dropout
DropOutはニューラルネットワークの過学習を防ぐ強力な方法です。
Dropoutのイメージを書きに示します。
Dropoutは学習毎にニューラルネットワーク内のユニットをランダムに消失させた状態で学習を行います。そして学習終了後推論を行う際にはネットワーク内のすべてのユニットを使用し、出力に学習時に消失させたユニットに割合を掛け合わせます。
Dropoutによって過学習が防げる理由は、Dropoutが疑似的にアンサンブル学習を行っているからだと言われています。アンサンブル学習とは異なる複数個のモデルを学習させ、それぞれのモデルの出力の平均を全体の出力とする方法です。
Dropoutは学習時にランダムにユニットを消去することで、毎回異なるモデルの学習を行います。そのためアンサンブル学習と同じような効果を生み出しています。
DropotはTensorflowでは簡単に利用することができます。TensorFlowでは次のように行います。
1 2 3 4 5 6 7 8 9 10 |
#dropout tf.nn.dropout(x, keep_prob) #x : テンソル #keep_prob : Dropoutで消すユニットの割合 0.5 #dropoutの利用例 f1 = tf.nn.relu(tf.matmul(x, W1) + b1) #第1層目 f1_drop = tf.nn.dropout(f1, keep_prob) f2 = tf.nn.relu(tf.matmul(x, W2) + b2) #第2層目 |
Dropoutの利用
それではニューラルネットワークにDropoutを組み込むとどうなるか試して見ました。
今回は下記の記事のニューラルネットワークをもとに、Dropout有りと無しの場合を比較します。
今回の学習条件は次のように設定しました。
- バッチサイズ:50
- イタレーション:100000
- Dropoutのkeep_prob:0.5
実行結果を示します。まず初めに学習の損失です。灰色がDropout無し、オレンジ色がDropout有りの結果です。
Dropout無しでは途中から学習の損失が上昇し始めてしまいました。これはおそらく過学習が起きてしまっているのだと思います。一方Dropout有りのモデルでは損失が順調に落ちていき、過学習の兆候は見れませんでした。
次に学習の正解率について示します。同じく灰色がDropout無し、オレンジ色がDropout有りの結果です。
Dropout無しでは途中から正解率がほとんど変化ませんでしが、Dropout有りでは正解率が上昇し続けました。
このようにニューラルネットワークにDropoutを組み込むことによって、過学習を防ぐことができることがわかりました。
まとめ
- 学習したデータに適合しすぎてしまうことを過学習という
- ニューラルネットワークは自由度が高いため、過学習が起こりやすい
- ニューラルネットワークの過学習を防ぐ方法としてDropoutという手法があり、Tensorflowからは簡単に利用できる
- Dropout有り無しで学習の損失、正解率を比較し、Dropoutを組み込んだほうが高い正解率を示した
関連記事