NLP(自然言語処理) 学習率の変更と早期停止(ReduceLROnPlateau/EarlyStopping)

model.compile()を用いるとき,オプティマイザ(最適化アルゴリズム)に学習率を設定します。

optimizer = Adam(lr=0.01)
model.compile(loss='categorical_crossentropy',
    optimizer=optimizer,
    metrics=['accuracy'])

lr=0.01が学習率です。

学習率は,いわば,学習の精度に関係する値であると見なすことができます。

これは,地図上である特定の場所を探す作業に例えることができます。あなたが,地図アプリでマンハッタンを見つけようとするとき,あなたの家の近隣が表示された地図では役に立たないでしょう。まず,アメリカ全体の地図を表示し,ニューヨーク州を探します。そして,ニューヨーク州を拡大し,海岸線に沿ってマンハッタンの小さな島を探すはずです。

学習率は地図の縮尺に似ています。初めは学習率を大きくし,正解に近い概ねの値を探します。そして正解に近づいたら学習率を小さくし,より厳密な正解の位置を特定していくのです。

ReduceLROnPlateau

from keras.callbacks import ReduceLROnPlateau
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=2, min_lr=0.0001)

ReduceLROnPlateauは与えられた条件に基づいて,学習率を小さくします。

monitor='val_loss'は検証データの損失関数を監視することを表します。val_loss を有効にするためには,model.fit()に検証データを与える必要があります。詳しくは,NLP(自然言語処理)訓練データと検証データを分けるを参照して下さい。

patience=2val_lossが2epochにおいて改善しない場合,学習率を変更することを表します。factor=0.5は,例えば,初めの学習率が0.01のとき,次の学習率を0.005に変更することを表しています。

min_lr=0.0001は,学習率の最小値で,これ以上小さくなることはありません。

EarlyStopping

from keras.callbacks import EarlyStopping
EarlyStopping = EarlyStopping(monitor='val_loss', min_delta=0, patience=10, mode='auto')

EarlyStoppingは訓練結果に改善が見られない場合,訓練を停止します。

monitor='val_loss'は検証データの損失関数を監視することを表します。min_deltaは与えられた絶対値より変化が小さい場合,改善していないと判定します。patience=10val_lossが10epochにおいて改善しない場合,訓練を停止します。

modeは観測値の増加や減少を監視する方法を指定します。通常はautoにします。

最終的に,これらの機能はfit()callbacksで指定します。

model.fit(
 ......, callbacks=[EarlyStopping, reduce_lr])