機械学習は、最終的に機能のセッ したがって、モデルの性能を一般化するためにできることは、純利益と見なされます。 ドロップアウトは、モデルが過剰適合するのを防ぐために使用される手法です。 ドロップアウトは、学習フェーズの更新ごとに非表示ユニット(非表示レイヤーを構成するニューロン)の出力エッジをランダムに0に設定することによ ドロップアウト層のKerasドキュメントを見ると、Geoffrey Hintonとfriendsによって書かれたホワイトペーパーへのリンクが表示されます。
先に進む例では、Kerasを使用して手書きの数字を認識することを目的としたニューラルネットワークを構築します。
from keras.datasets import mnist
from matplotlib import pyplot as plt
plt.style.use('dark_background')
from keras.models import Sequential
from keras.layers import Dense, Flatten, Activation, Dropout
from keras.utils import normalize, to_categorical
Kerasを使用してデータをプログラムにインポートします。 データは既にトレーニングセットとテストセットに分割されています。p>
(X_train, y_train), (X_test, y_test) = mnist.load_data()
私たちが作業しているものを見てみましょう。div>
モデルのトレーニングが完了したら、前の画像を五つとして認識できるはずです。
事前に実行する必要がある少し前処理があります。 ピクセル(特徴)が0から1の範囲になるように正規化します。 これにより、モデルははるかに高速な解に収束することができます。 次に、指定されたサンプルの各ターゲットラベルを1と0の配列に変換します。1のインデックスは、画像が表す数字を示します。 そうしないと、モデルは数字9を数字3よりも高い優先順位を持つと解釈するため、これを行います。
X_train = normalize(X_train, axis=1)
X_test = normalize(X_test, axis=1)
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
ドロップアウトなし
ニューラルネットワークに2次元行列を供給する前に、我々はそれを前の行に後続の各行を追加することによ それぞれ128個のニューロンで構成される二つの隠れ層と、10個のニューロンで構成される出力層を使用し、それぞれ10桁の数字のいずれかを使用します。 Softmax活性化関数は、サンプルが指定された数字を表す確率を返します。div>
私たちはクラスを予測しようとすると、損失関数としてカテゴリカル-クロスエントロピーを使用します。 精度を使用してモデルの性能を測定します。検証のためにデータの10%を脇に設定します。 これを使用して、モデルがドロップアウトの有無にかかわらずオーバーフィットする傾向を比較します。 32のバッチサイズは、ニューラルネットワークを介して32個のサンプルを通過した後、勾配を計算し、学習率に等しい大きさで勾配の方向に一歩を踏み エポックの数で指定された合計10回これを行います。/div>
関数fitによって返された履歴変数を使用して、各エポックでの学習と検証の精度をプロットできます。ご覧のとおり、ドロップアウトなしでは、検証損失は3番目のエポックの後に減少しなくなります。
As you can see, without dropout, the validation accuracy tends to plateau around the third epoch.
Using this simple model, we still managed to obtain an accuracy of over 97%.div>
ドロップアウト
ドロップアウトをアクティブ化関数の前または後に配置するかどうかについては、いくつかの議論があります。 経験則として、relu以外のすべてのアクティブ化機能について、アクティブ化機能の後にドロップアウトを配置します。 0.5を渡すと、すべての隠れた単位(ニューロン)は0に設定され、確率は0.5に設定されます。 言い換えれば、与えられたニューロンの出力が強制的に0になるという50%の変化があります。Div>
再び、クラスを予測しようとしているので損失関数としてカテゴリカルクロセントロピーを使用します。
model_dropout.compile(
loss='categorical_crossentropy',
optimizer='adam',
metrics=
)
validations splitパラメーターを提供することにより、モデルはトレーニングデータの一部を分離し、各エポックの終わりにこのデータの損失とモデルメトリクス ドロップアウトの背後にある前提が成り立つ場合、検証精度には以前のモデルと比較して顕著な違いがあるはずです。 Shuffleパラメーターは、各エポックの前に学習データをシャッフルします。div>
ご覧のように、モデルは収束しました以前のモデルは、第三のエポックの周りにplateauedのに対し、はるかに高速で、検証セットで98%に近いの精度を得ました。div>
テストセットで得られた精度はあまりありませんドロップアウトのないモデルから得られたものとは異なります。 これは、おそらくサンプル数が限られているためです。div>
final thoughts
ドロップアウトは、与えられたニューロンの出力をランダムに0に設定することによって、モデルを一般化するのに役立ちます。 出力を0に設定すると、cost関数は、逆伝播のプロセス中に重みが更新される方法を変更する隣接するニューロンに対してより敏感になります。