【tensorflow】ドロップアウトとバッチ正規化が分かる【Kaggle Course – Intro to Deep Learning 5】Dropout and Batch Normalization

Kaggle

アメリカのデータ分析コンペKaggleでは、世界中の優秀なデータサイエンティストによって作成された様々なeラーニング教材が無料で公開されています。

中でも、この記事では以下の講座について解説します。

全編英語ですし、ところどころ説明を省略しているところもあるので、私なりにかみ砕いて解説していきます。

この記事で取り扱うライブラリ、モジュール、クラスは以下の通りです。

Method
tf.keras.layers.Dropout
tf.keras.layers.BatchNormalization

Dropout and Batch Normalization(ドロップアウトとバッチ正規化)

Introduction(イントロダクション)

今回は、Kerasのモデルに便利な機能を追加する、2つの層layersについて学びます。

Dropout(ドロップアウト)

1つ目はドロップアウト層です。

ドロップアウト層を追加することで、ニューラルネットワークの一部のニューロンをランダムに無効化し、オーバーフィット(過学習)を抑制することができます。

下記の動画は、2つの隠れ層に50%のドロップアウトを適用した様子を表しています。

訓練時のニューロンの数がランダムに絞られるので、特定の重みに対して過度に依存することがなくなり、より汎化性能の高いモデルができあがります

 

ランダムフォレストでは決定木をサンプリングしていましたし、確率的勾配降下法では訓練データをサンプリングしていました。同様に、ドロップアウトではニューロンをサンプリングしています。どれもサンプリングをうまく使うことで、効率的で高精度なモデル作成を実現していますね。

Adding Dropout(ドロップアウトの実装)

Kerasでは、下記のようにドロップアウト層Dropoutを追加し、続く全結合層Denseへの入力をランダムに無効化します。

ここで、rateにはドロップアウトのレートを指定します。

keras.Sequential([
    # ...
    layers.Dropout(rate=0.3), # apply 30% dropout to the next layer
    layers.Dense(16),
    # ...
])

Batch Normalization(バッチ正規化)

2つ目はバッチ正規化層です。

正規化とは、機械学習がデータを処理しやすくするために、数値データの幅をそろえることです。

英語ではNormalizationとかScalingとか言ったりします。

例えば、家の価格を予測するときに、部屋の広さが10-200㎡、フロアの数が1ー10個というように、特徴量の幅がばらばらだと学習が収束しづらくなります。

そのため、正規化の1つであるMean Normalizationのような手法で、ー1≦x≦1の間に値を揃えます。

このような正規化のプロセスはデータの前処理として、ニューラルネットワークの外で行われますが、ネットワークの中でも行うことができます。それがバッチ正規化です。

バッチ正規化のメリットとして、学習が完了するまでの時間が少なくて済みます。

Adding Batch Normalization(バッチ正規化の実装)

バッチ正規化層は、ネットワークのどこに置いても問題ありません。

例えば、バッチ正規化層は正規化したい層の後に置いたり、

layers.Dense(16, activation='relu'),
layers.BatchNormalization(),

正規化したい層と活性化関数の間に置いたりします。

layers.Dense(16),
layers.BatchNormalization(),
layers.Activation('relu'),

また、一番最初の層の前に置けば、データの前処理と同じ効果があるでしょう。

Example – Using Dropout and Batch Normalization(ドロップアウトとバッチ正規化の具体例)

ドロップアウトとバッチ正規化を実装した具体例を見てみましょう。

ここでは、バッチ正規化の効果を示すため、あえてデータの前処理における正規化を行っていません

from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential([
    layers.Dense(1024, activation='relu', input_shape=[11]),
    layers.Dropout(0.3),
    layers.BatchNormalization(),
    layers.Dense(1024, activation='relu'),
    layers.Dropout(0.3),
    layers.BatchNormalization(),
    layers.Dense(1024, activation='relu'),
    layers.Dropout(0.3),
    layers.BatchNormalization(),
    layers.Dense(1),
])

学習曲線を見ると、オーバーフィットもアンダーフィットも見られず、収束していますね。

 

通常は、きちんと前処理の段階で正規化をした方がいいパフォーマンスを得られますが、バッチ正規化をネットワークの中に織り込んでも、効果が得られることが分かりました。

Your Turn(練習問題)

Kaggle Courseでは、学んできたことを実践するための練習問題が用意されています。読んだり見たりするだけでなく、実際に手を動かすことは大切ですので、ぜひチャレンジしてみて下さい。

今回はKaggle Courseでドロップアウトとバッチ正規化について学びました。次回は分類問題について学んでいきます。

以上、最後までお読みいただきありがとうございました。

コメント

タイトルとURLをコピーしました