⚡ STEP 11: 最適化アルゴリズム
SGD、Momentum、Adam など、効率的な学習を実現する最適化手法を習得しよう
📋 このステップで学ぶこと
- 最適化アルゴリズムとは何か?なぜ重要か?
- SGD(確率的勾配降下法):最も基本的な手法
- Momentum:慣性を利用して加速する
- AdaGrad:学習率を自動調整する
- RMSprop:AdaGradの問題を解決
- Adam:最も人気のある最適化手法
- どの最適化手法を選べばいいか?
🎯 1. 最適化アルゴリズムとは?
1-1. 学習の流れを復習
まず、ニューラルネットワークの学習の流れを復習しましょう。
以下の図は横スクロールできます。
1-2. 最適化アルゴリズムの役割
逆伝播で計算した勾配を使って、重みをどのように更新するかを決める方法です。
目標:損失を最小化する重みを見つけること
1-3. なぜ最適化アルゴリズムが重要なのか?
霧が深くて周りが見えない山の頂上から、麓(最低点)を目指すことを考えます。
いろいろな戦略があります:
- SGD:足元の傾きだけを頼りに、一歩ずつ慎重に下りる
- Momentum:勢いをつけて走って下りる(小さな谷は越えられる)
- Adam:地形に応じて歩幅を自動調整しながら効率的に下りる
同じネットワーク構造でも、最適化手法が違うだけで:
・学習速度が10倍以上変わることもある
・最終的な精度が大きく異なる
・局所最適解(小さな谷)に陥りにくくなる
🚶 2. SGD(確率的勾配降下法)
2-1. SGDとは?
SGD(Stochastic Gradient Descent)は、最もシンプルで基本的な最適化手法です。
「勾配の方向に重みを少しずつ更新する」というシンプルなアイデアです。
w_new = w_old – η × ∂L/∂w
各記号の意味:
・w_new:更新後の重み(新しい値)
・w_old:更新前の重み(古い値)
・η(イータ):学習率(一歩の大きさ、例:0.01)
・∂L/∂w:損失Lの重みwに関する勾配(逆伝播で計算した値)
2-2. なぜマイナス(−)なのか?
以下の図は横スクロールできます。
2-3. 学習率の役割
学習率が大きすぎる場合(η = 1.0):
→ 一歩が大きすぎて、最小値を飛び越えてしまう
→ 発散して学習に失敗する
学習率が小さすぎる場合(η = 0.0001):
→ 一歩が小さすぎて、なかなか最小値に到達しない
→ 学習に時間がかかりすぎる
適切な学習率(η = 0.01〜0.001):
→ ちょうどいいペースで最小値に到達できる
2-4. Kerasでの実装
from tensorflow.keras.optimizers import SGD
KerasのSGDオプティマイザをインポートします。
SGD(learning_rate=0.01)
学習率0.01でSGDオプティマイザを作成します。
学習率は問題に応じて調整が必要です。
2-5. SGDの問題点
問題1:谷で振動する
細長い谷では、左右に振動してなかなか底に到達できない
問題2:局所最適解に陥る
小さな谷で止まってしまい、より深い谷(真の最適解)に到達できない
問題3:学習率の選択が難しい
大きすぎると発散、小さすぎると遅すぎる
これらの問題を解決するために、様々な改良版が開発されました。
次のセクションから、それらを見ていきましょう。
🏃 3. Momentum(モメンタム)
3-1. Momentumとは?
Momentumは、過去の勾配の情報を利用して「慣性」をつける手法です。
物理学の「運動量(momentum)」から名前が来ています。
SGD(慣性なし):
ボールを手で持って、一歩ずつ慎重に下ろしていく
→ 小さな谷があると、そこで止まってしまう
Momentum(慣性あり):
ボールを転がす。勢いがついてどんどん加速する
→ 小さな谷は勢いで越えて、より深い谷を見つけられる!
3-2. Momentumの更新式
v = β × v + η × ∂L/∂w (速度を更新)
w_new = w_old – v (重みを更新)
各記号の意味:
・v:速度(velocity)、過去の勾配の蓄積
・β(ベータ):モメンタム係数(通常0.9)
・η:学習率
・∂L/∂w:現在の勾配
3-3. なぜβ=0.9なのか?
3-4. Momentumの動作イメージ
以下の図は横スクロールできます。
3-5. Kerasでの実装
momentum=0.9
モメンタム係数を0.9に設定します。
これが標準的な値で、ほとんどの場合0.9でOKです。
- 収束が速い:一貫した方向に加速するので、SGDより早く最適解に到達
- 局所最適解を回避:勢いで小さな谷を越えられる
- 振動の抑制:谷での左右の振動が減る
📊 4. AdaGrad(適応的勾配法)
4-1. AdaGradとは?
AdaGrad(Adaptive Gradient)は、各パラメータごとに学習率を自動調整する手法です。
「よく更新されるパラメータは学習率を小さく、あまり更新されないパラメータは学習率を大きく」します。
得意科目(よく勉強した):
→ すでに十分理解している → 少しだけ復習すればOK(学習率小)
苦手科目(あまり勉強していない):
→ まだ理解が不十分 → たくさん勉強する必要がある(学習率大)
4-2. AdaGradの更新式
h = h + (∂L/∂w)² (勾配の二乗を累積)
w_new = w_old – (η / √h) × ∂L/∂w (重みを更新)
各記号の意味:
・h:勾配の二乗和の累積(過去にどれだけ更新されたかを記録)
・η:基本の学習率
・√h:hの平方根
・η / √h:実効学習率(hが大きいほど小さくなる)
4-3. AdaGradの動作イメージ
4-4. Kerasでの実装
4-5. AdaGradの問題点
h = h + (∂L/∂w)²
↑ hは単調増加する(減ることがない)
学習が進むと:
→ h がどんどん大きくなる
→ 学習率 η/√h がどんどん小さくなる
→ 最終的に学習率が0に近づいて学習が止まる!
この問題を解決したのが、次に紹介するRMSpropです。
🔄 5. RMSprop
5-1. RMSpropとは?
RMSprop(Root Mean Square Propagation)は、AdaGradの問題(学習率が0に近づく)を解決した手法です。
過去の勾配の影響を徐々に忘れることで、学習率が極端に小さくなるのを防ぎます。
5-2. RMSpropの更新式
h = γ × h + (1 – γ) × (∂L/∂w)² (移動平均)
w_new = w_old – (η / √h) × ∂L/∂w
AdaGradとの違い:
・AdaGrad:h = h + (∂L/∂w)² ←すべて累積
・RMSprop:h = γ×h + (1-γ)×(∂L/∂w)² ←移動平均
γ(ガンマ)= 減衰率(通常0.9)
5-3. なぜ移動平均が良いのか?
【AdaGrad】
h = 0 → 100 → 200 → 300 → 400 → … → ∞
学習率 → どんどん0に近づく → 学習が止まる!
【RMSprop(γ=0.9)】
h = 0.9×h + 0.1×(新しい勾配)²
h = 0 → 10 → 19 → 27 → 34 → … → 一定値に収束
学習率 → 適度な値を維持 → 学習が継続!
5-4. Kerasでの実装
rho=0.9
減衰率γの設定です。0.9が標準的な値です。
「過去の90%を維持し、新しい情報を10%追加」という意味です。
- AdaGradの改良版:学習率が0に近づく問題を解決
- RNN/LSTMで特に効果的:時系列データの学習に強い
- 実務でも人気:特にRNN、LSTMを使う場合に推奨される
👑 6. Adam(最も人気の最適化手法)
6-1. Adamとは?
Adam(Adaptive Moment Estimation)は、MomentumとRMSpropの良いところを組み合わせた最適化手法です。
現在、最も人気があり、実務で広く使われているオプティマイザです。
Momentum由来:過去の勾配の情報を使って加速(慣性)
RMSprop由来:各パラメータごとに学習率を自動調整
→ 速く、安定して、効率的に学習できる!
6-2. Adamの更新式
① 1次モーメント(勾配の移動平均)= Momentum的な要素
m = β₁ × m + (1 – β₁) × ∂L/∂w
② 2次モーメント(勾配の二乗の移動平均)= RMSprop的な要素
v = β₂ × v + (1 – β₂) × (∂L/∂w)²
③ バイアス補正(初期の偏りを修正)
m̂ = m / (1 – β₁ᵗ)
v̂ = v / (1 – β₂ᵗ)
④ パラメータ更新
w_new = w_old – (η / √v̂) × m̂
6-3. 各パラメータの意味
| パラメータ | 標準値 | 意味 |
|---|---|---|
| η(learning_rate) | 0.001 | 基本の学習率 |
| β₁(beta_1) | 0.9 | 1次モーメントの減衰率(Momentum) |
| β₂(beta_2) | 0.999 | 2次モーメントの減衰率(RMSprop) |
| ε(epsilon) | 1e-8 | 0除算を防ぐ小さな値 |
6-4. Kerasでの実装
Adam(learning_rate=0.001)
Adamはデフォルト設定のままで十分良い性能を発揮します。
迷ったらこの1行で始めましょう!
6-5. Adamの長所と短所
| 長所 | 短所 |
|---|---|
|
✅ 収束が速い ✅ 学習率の調整がほぼ不要 ✅ ノイズに強い ✅ 実務で最も人気 ✅ 幅広い問題に対応 |
❌ メモリ使用量がやや多い ❌ 一部の問題では汎化性能が劣る (SGDの方がテスト精度が高いことも) |
📊 7. 最適化手法の比較
7-1. 性能比較表
| 手法 | 収束速度 | 安定性 | 調整難易度 | 推奨場面 |
|---|---|---|---|---|
| SGD | 遅い | 中 | 難しい | 汎化性能重視、時間に余裕あり |
| Momentum | 中 | 良い | 中 | SGDの改良として |
| AdaGrad | 中 | 中 | 易しい | 短時間の学習のみ |
| RMSprop | 速い | 良い | 易しい | RNN/LSTM |
| Adam | 速い | 非常に良い | 非常に易しい | 迷ったらこれ! |
7-2. 学習曲線の比較イメージ
以下の図は横スクロールできます。
🎯 8. 最適化手法の選び方
8-1. 選択フローチャート
以下の図は横スクロールできます。
8-2. 問題別の推奨設定
画像分類(CNN):
時系列予測(RNN/LSTM):
自然言語処理(NLP):
うまくいかない場合:
8-3. 最適化手法の比較コード
実際に複数の最適化手法で学習を比較してみましょう。
optimizers = { … }
4種類のオプティマイザを辞書で定義します。
これをループで回して、それぞれの性能を比較します。
for name, optimizer in optimizers.items():
辞書の各要素(オプティマイザ)に対してループします。
verbose=0
学習中の出力を抑制します(比較のため)。
=== SGD で学習 === 訓練精度: 0.9543 テスト精度: 0.9521 === Momentum で学習 === 訓練精度: 0.9732 テスト精度: 0.9698 === RMSprop で学習 === 訓練精度: 0.9891 テスト精度: 0.9801 === Adam で学習 === 訓練精度: 0.9912 テスト精度: 0.9823 → Adamが最も速く、高精度に収束!
plt.subplot(1, 2, 1)
1行2列のグラフの1番目(左側)を描画します。
📝 STEP 11 のまとめ
- SGD:最もシンプル。勾配の方向に一歩ずつ進む
- Momentum:慣性をつけて加速。局所最適解を回避しやすい
- AdaGrad:各パラメータごとに学習率を調整。長時間学習に不向き
- RMSprop:AdaGradの改良版。RNN/LSTMで効果的
- Adam:MomentumとRMSpropの組み合わせ。最も人気!
- 迷ったらAdamを使う。RNN/LSTMならRMSpropも検討
1. まずAdamで始める
optimizer = Adam(learning_rate=0.001)
2. うまくいかなければ学習率を下げる
optimizer = Adam(learning_rate=0.0001)
3. RNN/LSTMならRMSpropも試す
optimizer = RMSprop(learning_rate=0.001)
最適化アルゴリズムを理解したので、次のSTEP 12では学習率のスケジューリングを学びます。
学習の進行に応じて学習率を動的に調整することで、さらに効率的な学習を実現しましょう!
📝 練習問題
Adamの特徴
Adamについて、正しい説明を選んでください。
- A. MomentumとAdaGradの組み合わせ
- B. MomentumとRMSpropの組み合わせ
- C. SGDとAdaGradの組み合わせ
- D. RMSpropとAdaGradの組み合わせ
Adamの構成要素
Adamは、MomentumとRMSpropの良いところを組み合わせた最適化手法です。
最適化手法の選択
初めてディープラーニングに取り組む際、最も推奨される最適化手法はどれですか?
- A. SGD
- B. Momentum
- C. AdaGrad
- D. Adam
「迷ったらAdam」が鉄則
この1行で始められます!
Momentumの効果
MomentumがSGDより優れている点として、最も適切なものを選んでください。
- A. メモリ使用量が少ない
- B. 実装がシンプル
- C. 局所最適解を回避しやすい
- D. 学習率の調整が不要
Momentumの効果
Momentumは、過去の勾配に基づく慣性をつけることで、局所最適解を回避しやすくなります。
他の選択肢の解説:
Aが間違い:Momentumは速度vを保存するため、SGDよりメモリを使います。
Bが間違い:SGDの方がシンプルです(Momentumは速度の計算が追加)。
Dが間違い:Momentumでも学習率の調整は必要です。
RNN/LSTMの最適化
RNNやLSTMを使った時系列予測の際、特に推奨される最適化手法はどれですか?
- A. SGD
- B. Momentum
- C. RMSprop または Adam
- D. AdaGrad
RNN/LSTMでの推奨
RNN/LSTMでは、RMSprop または Adamが特に効果的です。
まずAdamを試し、うまくいかなければRMSpropを試すのが一般的です。
AdaGradの問題点
AdaGradの問題点と、それを解決する手法の組み合わせとして、正しいものを選んでください。
- A. 学習率が大きくなりすぎる → Momentumで解決
- B. 学習率が0に近づく → RMSpropで解決
- C. メモリ使用量が多い → SGDで解決
- D. 収束が遅い → Adamで解決
AdaGradの問題と解決策
AdaGradの問題点は、学習率が単調減少して0に近づくことです。
他の選択肢の解説:
Aが間違い:AdaGradの問題は「大きくなる」ではなく「0に近づく」です。
Cが間違い:メモリ使用量は主要な問題ではありません。
Dが間違い:収束速度ではなく、学習率が0になることが問題です。
学習メモ
ディープラーニング基礎 - Step 11