テクノロジー

ディープラーニング初心者が知りたいKerasにおけるdropoutの使い方

ディープラーニング初心者が知りたいKerasにおけるdropoutの使い方

ディープラーニングを学習し始めた皆さんは、一度はKerasというライブラリを耳にしたことがありますよね。KerasはTensorflowやCNTK、Theanoといったライブラリ上で動くライブラリという点で、少し異色の存在です。

Kerasはディープラーニングをなるべく簡単に記述することを目的としたライブラリです。ディープラーニングを学んだ皆さんは、すでにディープラーニングが入力層、複数の中間層、出力層という構造であることをご存知かもしれません。Kerasを使うとディープラーニングの1つの層あたり1行から数行程度で記述することが可能になります。

dropoutはディープラーニングの手法の1つであるConbolutional Neural Network(CNN)を特徴付ける機能です。dropoutのおかげでニューラルネットワークの精度が向上し、ニューラルネットワークが世に普及したと言っても過言ではありません。実はそんなdropoutは、Kerasを用いると簡単にできるのだとか。

それでは今回はKerasの数ある機能の中でもdropoutを中心に解説をしましょう。まずは、Keras dropoutについての解説を始めます。

Kerasでのdropoutとは

推定のイメージ
dropoutとはHinton氏によって過学習を抑制するために提案された方法です。dropoutはニューラルネットワークにおける中間層のノードを一定の割合で不活性化します。

下の図は一般的なディープラーニングを示したものです。ノードとは図の中間層の○のことです。それぞれのノードは前の層のノードに係数と活性化関数を足し合わせて計算されます。活性化関数とはノードの数値にあわせた係数のことで、ノードが正なら1、負なら0という関数がよく用いられるでしょう。

ノードの説明図

不活性化とは、教師データを用いて学習を実施する際、中間層の一部のノードを学習に使用しないことです。このような処理をすることで機械学習の推定精度を向上させられます。この操作によりなぜ推定精度が向上させられるかについては後ほど説明します。

まずは、Kerasでdropoutを導入する方法を紹介します。Tensorflow上でのKerasの場合、dropoutを持つ層を示すプログラムは下記のようになります。

keras.layers.Dropout(rate)

このように、たったの1行でKerasのdropoutを導入できます。何割のノードを不活性化するかをrateに数値を入れて設定します。rateの部分に0から1のdropoutをさせる割合を入力して利用しましょう。例えば、keras.layers.Dropout(0.1)とすれば中間層のノードの内、1割は常にランダムに無視されて学習が進みます。

ランダムに無視されるというのもdropoutの特徴の1つで、後ほどランダムではないdropoutの手法についても説明します。

たったこれだけで機械学習の精度が格段にあげられるなら、利用しない手はありませんよね

dropoutの基本的なこと

3人寄れば文殊の知恵のイメージ
それでは、なぜdropoutで学習精度が上げられるのかの理由を解説しましょう。

dropoutを利用したディープラーニングは、それぞれのノードが少しづつ異なる教師データを使用して学習しています。これにより、擬似的に複数のディープラーニングを作り出しました。「三人寄れば文殊の知恵」というように、複数のディープラーニングによる推定結果は1つのディープラーニングの推定結果より精度が高くなるとのこと。

上記のような複数のディープラーニングの結果を総合することで推定精度を上げる手法のことを「アンサンブル」と言います。世界最高峰の機械学習コンペとしてKaggleが有名ですが、Kaggle上位者はもれなくこのアンサンブルを利用しています。

※アンサンブルについての記事はこちら

以上の内容を非常に単純化すると、対象のデータがAかBかを推定するとき、1個のディープラーニングがAだと推定した場合より10個のディープラーニングすべてがAだと判断した場合の方が信用できますよね。それがアンサンブルです。観念的な説明になりましたが、dropoutの効果は以上のようなメカニズムによってもたらされています。

ディープラーニングでの問題点

計算量が多いイメージ
dropoutをディープラーニングに導入する際の問題点として、学習に時間がかかるということが挙げられます。ディープラーニングのノードの視点から見た場合、全結合に対してrate=0.1のdropoutを実施すると単純に学習に利用する学習データが1割減ってしまいます。この見かけ上の学習データの減少を補うため、学習回数を増やす必要が発生するので計算量が多くなってしまうでしょう。

もちろん個人の趣味で機械学習を行なっている場合、計算量が大きくなることはそれほど問題にならないかもしれません。dropoutで学習に時間がかかるといってもせいぜい数倍程度の時間なので、丸一日の計算が丸二日に増えても計算が終わるのを待てば良いだけなのでそれほど問題にはならないです。

しかしながら、企業レベルでスーパーコンピューターなどを利用している場合はそうも言っていられません。計算時間に比例して多額の費用を支払う必要があるため、計算量が小さいに越したことはありませんよね。

このためdropoutを利用する際には、dropoutによる効果と計算量の増加を天秤にかけ、ちょうど良いrateを選択するようにしましょう。経験的にはまずrate=0.1程度に設定し、その結果に合わせて増減させるのがオススメです。

過学習について

失敗のイメージ
dropoutのもう1つのメリットとして、過学習の抑制があります。ディープラーニングにおける過学習とは、学習に利用した教師データに対して推定を最適化しすぎた結果、教師データに対しては非常に高い推定ができるにも関わらず本番データでの推定は低くなってしまう現象です。

※過学習について知りたい方はこちら

実際、教師データに対する推定精度は99%なのに、本番データに対して推定してみると70%程度の推定精度しか得られなかったということはよくあります。

この過学習を抑制するため、dropoutは非常によく利用され、大きな効果を得ることができます。「三人寄れば文殊の知恵」の効果によってdropoutの推定精度が高くなると述べましたが、これは過学習の抑制にも高い効果を発揮しています。

ディープラーニングが過学習している場合、推定結果は過学習の影響をまともに受けてしまいます。しかし、dropoutにより擬似的に複数のディープラーニングが存在していると、その中にはあまり過学習していないものも含まれています。これにより、過学習の影響を薄めることができ、過学習の抑制につながるでしょう。

SpatialDropoutの方法

画像のイメージ
画像認識の分野でのdropoutの手法としてSpatialDropoutがあります。dropoutはランダムに一部のノードを無視すると説明しましたが、SpactialDropoutは画像のある領域に対応するノードをごっそり無視する手法です。SpactialDropoutはdropoutの特殊な方法なので基本的には通常のdropoutを利用し、画像認識を行う場合にSpactialDropoutが有効かを試すようにしましょう。

ここでSpatialDropoutを非常に簡単に説明します。例えば何か写真を思い浮かべてください。その写真を縦縞になるように黒く塗っていき、黒い部分に対応するノードを無視して学習するのがSpatialDropoutの動作になります。

今度は先ほど思い浮かべた写真のうち、先ほど黒く塗らなかった部分を塗りつぶしましょう。これも縦縞に塗られた写真ですが、先ほどの写真とは塗りつぶした部分が入れ替わっていますよね。このように、1枚の写真を擬似的に2枚として扱うようなノードの不活性化手法により、通常のdropoutより強く擬似的な複数のディープラーニングを生み出すのがこのSpatialDropoutなのです。

画像は特に領域ごとに意味を持つため、このような領域ごとにdropoutするSpatialDropoutと相性が良く、頻繁に用いられる手法になっています。KerasでSpactialDropoutを実装する場合は以下のように記述しましょう。

tf.keras.layers.SpatialDropout1D(rate)

dropoutの場合と同じく、rateは0から1の値となります。このように、Kerasを用いるSpatialDropoutの層でもたった1行で記述することができます。

まとめ
さて、今回はKerasの数ある機能の中でもdropoutを中心に解説しました。以上の内容をまとめると、下記のようになります。

  • dropoutとは中間層の一部のノードを無視して学習する手法
  • Kerasならkeras.layers.Dropout(rate)の一行でdropoutを導入可能
  • dropoutにより「三人寄れば文殊の知恵」の効果で推定精度を向上できる
  • dropoutを導入すると計算量が多くなってしまう
  • dropoutは過学習を抑制することができる
  • Kerasならkeras.layers.SpatialDropout1D(rate)の一行でSpatialDropoutを導入可能

Kerasを用いると、dropoutやSpatialDropoutといった手法でもたったの一行で導入が可能で、簡単に機械学習の推定精度を上げることができます。ディープラーニングによる機械学習を行う際は、まず初めにdropoutの導入を検討してください。

ぜひKerasのdropoutについてしっかりと理解し、自分の機械学習に応用できるようになりましょう!

トップへ戻る
タイトルとURLをコピーしました