📉 STEP 12: 学習率のスケジューリング
学習の進行に応じて学習率を調整し、より効率的な学習を実現しよう
📋 このステップで学ぶこと
- 学習率とは何か?なぜ重要か?
- 学習率が大きすぎる・小さすぎるとどうなるか?
- Learning Rate Decay(学習率減衰)の基本
- Step Decay:階段状に学習率を下げる
- Exponential Decay:滑らかに学習率を下げる
- ReduceLROnPlateau:学習状況に応じて自動調整(実務で最推奨)
- 複数のコールバックを組み合わせる実践的な設定
🎯 1. 学習率の重要性
1-1. 学習率とは何か?
学習率(Learning Rate)は、勾配降下法でパラメータを更新する際の「一歩の大きさ」を決める重要なハイパーパラメータです。
w_new = w_old – η × ∂L/∂w
η(イータ)= 学習率
この値が「一歩の大きさ」を決めます。
例:η = 0.01 なら、勾配の0.01倍だけ重みを更新
霧が深くて周りが見えない山の頂上から、麓(最低点)を目指すとき:
学習率 = 一歩の大きさ
・大きな一歩 → 速く進めるが、谷底を飛び越えてしまう危険
・小さな一歩 → 確実だが、時間がかかりすぎる
・適切な一歩 → 効率よく谷底に到達できる
1-2. 学習率が大きすぎるとどうなる?
以下の図は横スクロールできます。
1-3. 学習率が小さすぎるとどうなる?
1-4. 適切な学習率の場合
1-5. 問題:学習の段階によって最適な学習率は異なる
実は、学習の初期と後期で適切な学習率は異なります。
学習初期(最適値から遠い):
→ 大きめの学習率で速く移動したい
学習後期(最適値に近い):
→ 小さい学習率で細かく調整したい
→ この問題を解決するのが「学習率スケジューリング」です!
📉 2. Learning Rate Decay(学習率減衰)
2-1. 基本的な考え方
Learning Rate Decayは、学習の進行に応じて学習率を徐々に小さくする手法です。
スタート(前半):
→ 大きく速く走る(大きい学習率)
→ ゴールまで遠いので、効率よく距離を稼ぐ
中盤:
→ ペースを落として調整(中程度の学習率)
→ 体力を温存しながら進む
ゴール手前(終盤):
→ 細かくペースを調整してゴール(小さい学習率)
→ ぴったりゴールラインを踏むために微調整
2-2. 学習率減衰のイメージ
- 収束の安定化:最適値の周りでの振動を抑制
- 精度の向上:最後に細かい調整ができる
- 学習の効率化:初期は速く、後期は丁寧に学習
2-3. 主な学習率スケジューリング手法
| 手法 | 特徴 | 推奨度 |
|---|---|---|
| Step Decay | 一定エポックごとに階段状に減少 | ★★★☆☆ |
| Exponential Decay | 滑らかな曲線で減少 | ★★★☆☆ |
| ReduceLROnPlateau | 学習状況を見て自動で減少 | ★★★★★(最推奨) |
⬇️ 3. Step Decay(ステップ減衰)
3-1. Step Decayとは?
Step Decayは、一定のエポック数ごとに学習率を階段状に減少させる手法です。
η_t = η_0 × drop^floor(epoch / step_size)
各記号の意味:
・η_t:t エポック目の学習率
・η_0:初期学習率(例:0.1)
・drop:減衰率(例:0.5 = 半分にする)
・step_size:何エポックごとに減衰するか(例:10)
・floor():小数点以下を切り捨て
3-2. 具体例で理解する
3-3. 視覚的なイメージ
以下の図は横スクロールできます。
3-4. Kerasでの実装方法
LearningRateScheduler
エポックごとに学習率を変更するためのコールバックです。
自分で定義した関数を渡して、学習率の計算方法を指定します。
step_decay(epoch)
現在のエポック数を受け取り、その時点での学習率を返す関数です。
callbacks=[lr_scheduler]
model.fit()のcallbacksパラメータにリストで渡します。
学習中、各エポックの開始時にstep_decay関数が呼ばれます。
Epoch 1: Learning Rate = 0.1 Epoch 2: Learning Rate = 0.1 ... Epoch 10: Learning Rate = 0.1 Epoch 11: Learning Rate = 0.05 ← 10エポック経過で半分に! Epoch 12: Learning Rate = 0.05 ... Epoch 20: Learning Rate = 0.05 Epoch 21: Learning Rate = 0.025 ← さらに半分に!
📉 4. Exponential Decay(指数減衰)
4-1. Exponential Decayとは?
Exponential Decayは、学習率を指数関数的に滑らかに減少させる手法です。
Step Decayのような「急な変化」がなく、連続的に減少します。
η_t = η_0 × decay_rate^(step / decay_steps)
各記号の意味:
・η_t:現在の学習率
・η_0:初期学習率
・decay_rate:減衰率(例:0.96)
・step:現在のステップ数
・decay_steps:何ステップで1回減衰するか
4-2. 視覚的なイメージ
以下の図は横スクロールできます。
4-3. Step Decay vs Exponential Decay
学習率
↑
0.1│ ● ← Step Decay(階段状)
│ \──────●
│ \──────●
│ \──────●
│
0.1│ ● ← Exponential Decay(曲線)
│ \_
│ \__
│ \___
└────────────────────→ エポック
| 項目 | Step Decay | Exponential Decay |
|---|---|---|
| 変化の仕方 | 階段状(急に変化) | 滑らかな曲線 |
| 特徴 | 一定期間は学習率が固定 | 常に少しずつ減少 |
| メリット | 理解しやすい、調整しやすい | 滑らかな収束 |
| デメリット | 段差で不連続 | パラメータ調整が微妙 |
4-4. Kerasでの実装
ExponentialDecay
Kerasに組み込まれた学習率スケジューラです。
オプティマイザに直接渡して使います。
staircase=True/False
True:階段状(Step Decay風)
False:滑らかな曲線(Exponential Decay)
🎯 5. ReduceLROnPlateau(実務で最推奨!)
5-1. ReduceLROnPlateauとは?
ReduceLROnPlateauは、検証損失が改善しなくなったら自動的に学習率を下げる賢い手法です。
エポック数に基づく機械的な減衰ではなく、実際の学習状況を見て判断します。
Step Decay / Exponential Decay の問題点:
- エポック数に基づいて機械的に減衰
- 学習がまだ進んでいるのに減衰してしまうことがある
- 逆に、もう改善しないのに高い学習率を維持してしまうことも
ReduceLROnPlateauの利点:
- 実際の学習状況を見て判断する
- 「損失が改善しない」=「学習率が大きすぎるかも」と判断
- 自動で最適なタイミングで学習率を下げる
5-2. 動作の仕組み
設定:patience=5(5エポック改善なしで学習率を下げる)
以下の図は横スクロールできます。
5-3. Kerasでの実装
monitor=’val_loss’
監視する指標を指定します。’val_loss’(検証損失)が最も一般的です。
他には’val_accuracy’(検証精度)なども使えます。
factor=0.5
学習率をどれだけ下げるかを指定します。
0.5 = 半分にする、0.2 = 5分の1にする
patience=5
何エポック改善がなければ学習率を下げるかを指定します。
通常は3〜10の範囲で設定します。
min_lr=1e-7
学習率の最小値です。これ以下には下げません。
0に近すぎると学習が完全に止まってしまうため。
verbose=1
学習率が変更されたときにログを表示します。
1 = 表示する、0 = 表示しない
Epoch 1/100 469/469 - loss: 0.5123 - val_loss: 0.4231 ... Epoch 15/100 469/469 - loss: 0.3012 - val_loss: 0.3456 Epoch 16/100 Epoch 16: ReduceLROnPlateau reducing learning rate to 0.0005. 469/469 - loss: 0.2876 - val_loss: 0.3298 ↑ 学習率が0.001から0.0005に自動で減少! Epoch 17/100 469/469 - loss: 0.2654 - val_loss: 0.3156 ↑ 損失が再び減少し始めた!
5-4. パラメータの推奨設定
| パラメータ | 推奨値 | 説明 |
|---|---|---|
| monitor | ‘val_loss’ | 検証損失を監視するのが最も一般的 |
| factor | 0.5 または 0.2 | 0.5(半分)が穏やか、0.2(5分の1)が急激 |
| patience | 3 〜 10 | 小さいと敏感、大きいと鈍感 |
| min_lr | 1e-7 | これ以下には下げない |
| verbose | 1 | 変更時にログを表示 |
🔄 6. 実務で使う!複数コールバックの組み合わせ
6-1. 実務での標準的な設定
実務では、複数のコールバックを組み合わせて使うのが一般的です。
以下の3つを組み合わせるのが標準的な設定です。
- EarlyStopping:過学習を検知して学習を早期終了
- ModelCheckpoint:最良のモデルを自動保存
- ReduceLROnPlateau:学習率を自動調整
6-2. 各コールバックの役割
役割:検証損失が改善しなくなったら、学習を途中で止める
効果:過学習を防ぎ、無駄な計算を省く
restore_best_weights=True:最良の状態の重みを復元する
役割:学習中に最良のモデルを自動保存
効果:学習が中断しても最良のモデルを失わない
save_best_only=True:最良の時だけ保存(容量節約)
役割:損失が改善しなくなったら学習率を下げる
効果:学習の効率化、収束の安定化
EarlyStoppingより先に発動:patienceを小さめに設定
6-3. 実装コード(推奨設定)
patience の設定のコツ
ReduceLROnPlateau の patience(5)を
EarlyStopping の patience(10)より小さくします。
理由:学習率を下げてから様子を見る時間が必要だから
callbacks=[early_stop, checkpoint, reduce_lr]
3つのコールバックをリストで渡します。
学習中、各エポック終了時に全てのコールバックが実行されます。
Epoch 1/100 ... Epoch 15/100 Epoch 15: val_accuracy improved from 0.8765 to 0.8823, saving model to best_model.h5 ↑ ModelCheckpoint: 最良モデルを保存 Epoch 20/100 Epoch 20: ReduceLROnPlateau reducing learning rate to 0.0005. ↑ ReduceLROnPlateau: 学習率を減少 Epoch 35/100 Epoch 35: val_accuracy improved from 0.8891 to 0.8912, saving model to best_model.h5 ↑ ModelCheckpoint: さらに良いモデルを保存 Epoch 50/100 Epoch 50: early stopping ↑ EarlyStopping: 10エポック改善なしで学習終了 Restoring model weights from the end of the best epoch: 40. ↑ 最良のエポック(40)の重みを復元
6-4. 完成コード(コピー用)
📊 7. 学習率スケジューリングの選び方
7-1. 各手法の比較
| 手法 | 特徴 | 設定難易度 | 推奨場面 |
|---|---|---|---|
| 固定学習率 | 学習率が一定 | 非常に簡単 | 短時間の実験、Adamと併用 |
| Step Decay | 階段状に減少 | 簡単 | エポック数が予測可能な場合 |
| Exponential Decay | 滑らかに減少 | 中 | 滑らかな減衰を重視 |
| ReduceLROnPlateau | 状況に応じて自動調整 | 簡単 | 実務で最推奨! |
7-2. 選択フローチャート
以下の図は横スクロールできます。
📝 STEP 12 のまとめ
- 学習率は「一歩の大きさ」を決める重要なパラメータ
- 大きすぎると発散、小さすぎると遅すぎる
- Learning Rate Decayで学習の進行に応じて学習率を調整
- Step Decay:階段状に減少(シンプル)
- Exponential Decay:滑らかに減少(連続的)
- ReduceLROnPlateau:学習状況を見て自動調整(最推奨!)
- 実務ではEarlyStopping + ModelCheckpoint + ReduceLROnPlateauの3点セット
この設定で、効率的かつ安定した学習が実現できます!
学習率スケジューリングを習得したので、次のSTEP 13ではバッチ正規化(Batch Normalization)を学びます。
バッチ正規化は、学習を安定化・高速化する強力なテクニックです。
学習率スケジューリングと組み合わせることで、さらに効率的な学習が可能になります!
📝 練習問題
学習率の影響
学習率が大きすぎる場合に起こる問題として、正しいものを選んでください。
- A. 学習が遅くなる
- B. 振動して収束しない、または発散する
- C. 過学習が起こる
- D. メモリ使用量が増える
学習率が大きすぎる問題
学習率が大きすぎると、最適解の周りで振動して収束しない、または発散してしまいます。
他の選択肢の解説:
Aが間違い:学習が遅くなるのは、学習率が「小さすぎる」場合です。
Cが間違い:過学習は学習率ではなく、モデルの複雑さやデータ量に関係します。
Dが間違い:メモリ使用量は学習率とは関係ありません。
ReduceLROnPlateauの特徴
ReduceLROnPlateauについて、正しい説明を選んでください。
- A. エポック数に基づいて機械的に学習率を下げる
- B. 検証損失が改善しなくなったら自動的に学習率を下げる
- C. 学習率を常に一定に保つ
- D. 学習率を徐々に上げていく
ReduceLROnPlateauの動作
ReduceLROnPlateauは、検証損失が改善しなくなったら自動的に学習率を下げる賢い手法です。
実務での推奨設定
実務でニューラルネットワークを学習させる際、最も推奨されるコールバックの組み合わせはどれですか?
- A. EarlyStopping のみ
- B. ModelCheckpoint のみ
- C. EarlyStopping + ModelCheckpoint + ReduceLROnPlateau
- D. コールバックは使わない
実務の3点セット
実務では、EarlyStopping + ModelCheckpoint + ReduceLROnPlateauの組み合わせが最も推奨されます。
学習率スケジューリングの理解
以下のReduceLROnPlateauの設定について、学習率が最初に下がるタイミングとして正しいものを選んでください。
- A. エポック3の後
- B. エポック4の後
- C. 検証損失が3エポック連続で改善しなかった後
- D. 検証損失が0.5未満になった後
ReduceLROnPlateauの動作条件
ReduceLROnPlateauは、検証損失がpatienceエポック連続で改善しなかった後に学習率を下げます。
他の選択肢の解説:
A, Bが間違い:エポック数ではなく、改善の有無で判断します。
Dが間違い:factor=0.5は「学習率を半分にする」という意味で、損失の閾値ではありません。
学習メモ
ディープラーニング基礎 - Step 12