ニューラルネットワークでドロップアウトを使う際の訓練・テスト時の振る舞いの違いについて【Hilton氏の論文を読んでみた】

ニューラルネットワークでドロップアウトを使う際に、訓練時とテスト時にドロップアウトの挙動が異なるという話があったので、その点について少し調べてみました。

 

 

具体的には、Hilton氏のドロップアウトの有名な論文を読んでみました。(アブストだけですが!!)

ドロップアウトに関する論文

スポンサーリンク
スポンサーリンク

ドロップアウトは、テスト時に再現できない

ドロップアウトは過学習を防ぎ、かつ、学習率を向上させるニューラルネットワークを利用する上でもとても有効な手法の1つです。

(出典:sonickun.log

 

上の図のようにランダムに層の一部のノードを省略して、学習を行います。

 

 

このランダムっていうのが重要です。ノードをランダム省略してしまうと処理毎にモデルが変わってしまうため、モデルに再現性がありません。(ノードのランダム省略がバッチ毎なのかエポック毎なのかは私はよくわかっていませんが・・・)

 

 

再現性がないということは、ドロップアウトを使って訓練時に良い結果がでても、それと全く同じモデルを作ることは不可能だということです。

 

 

これだと、いくら良い結果が出ようとも実践投入することは不可能。しかし、Hilton氏の論文にはこの解決法がしっかりと書かれています。

ドロップアウト率を重みの値に掛けてやる

その方法とは、テスト時に各層の重みの値にドロップアウト率を掛け算してやるという方法です。

 

 

ドロップアウト率はどれだけのノードを省略させるか、その割合を示すものです。例えば、ドロップアウト率0.5で学習データを訓練させたとします。

 

 

テスト時には、ノードをドロップアウトさせることはせず、全てのノードを用いてデータを学習しますが、その代わり各ノードの重みに0.5を掛けて値を小さくします。

 

 

1つの層(レイヤー)に10ノードあったとして、ドロップアウト率0.5だと訓練時に用いるノードは5ノードになります。そして、5つのノードで必要な重みを計算するわけなので、当然、1つ1つのノードに定められた重みの値は、10ノード全てを使う時よりも大きい値になります。

 

 

つまり、ドロップアウトを使うと1つ1つのノードの重みが大きくなるわけです。この状態でテスト時に10ノードを使って学習してしまうと、重みの値が大きすぎて正しい数値が計算できないので、重み全体をドロップアウト率で掛けてその値を小さくしています。

 

 

Hiltonの論文によれば、この方法を使えばドロップアウトしたのとほぼ同じ値が算出可能らしいです。ただ、具体的な理論や証明については私もわかっておりません。(感覚的になんとなく近似しそうなのはわかる)

 

 

詳細はわからずとも、ニューラルネットワークのために用意されている多くのモジュールでこの手法が用いられています。私が使っているkerasも同様のようです(参考文献にHiltonの論文が掲載されている)。

keras

 

ニューラルネットワークについては簡単に扱えるモジュールがたくさんあって、ドロップアウトも知識がなくても簡単に扱えますが、訓練時とテスト時で仕組みが違う点は知っておいたほうが良さそうだったので、備忘録としてまとめておきました。

 

 

それにしてもドロップアウト率を重みに掛けると、ドロップアウトしたのと似た結果になるというのは、どんな理論なんでしょうかね。論文を全部読めていないのですが、論文に書いてあるのかな?気になるところです。

コメント