みんなのAI
機械学習AI論文
読み込み中…

学ぶ

🏅マイ実績

Ch.02

最適化アルゴリズム:慣性と適応的学習率

モデル学習は、目隠しをしたまま巨大な山脈で最も深い谷(誤差最小)を探す登山に似ています。最適化は、今いる場所からどの方向に、どれだけの歩幅で進むかを決めるナビゲーションです。
Ch.01 で出発点を決めたら、本章では勾配を感じながら安全に下る技を学びます。一歩ずつの SGD、慣性の モーメンタム、地形に合わせて歩幅を変える Adam まで、実務で毎日使う最適化を直感的に扱います。
目隠しで同じ損失の山を下っても、SGD・モーメンタム・Adam は違うルートを選びます(単純化した谷の比較)。
loss
SGDモーメンタムAdam
赤(SGD)は初期から左右に細かく揺れながら下り、ジグザグ感が強く残ります。緑(モーメンタム)は揺れを抑えつつ、終盤は谷底の中心から少し横にずれた位置に留まり、青(Adam)は最も速く谷底の中央へ寄ります。

流れ:順伝播 → 損失 → 逆伝播 → オプティマイザ step

更新:θ←θ−η⋅(Adam 等で作ったステップ)\theta \leftarrow \theta - \eta \cdot(\text{Adam 等で作ったステップ})θ←θ−η⋅(Adam 等で作ったステップ)

  • ① SGD: 毎ステップ勾配の反対方向(ミニバッチノイズでジグザグ)
  • ② モーメンタム: 速度 vvv を蓄積し、曲がりを滑らかに
  • ③ Adam: 座標ごとに適応的なステップ幅
  • ④ 実務: ログ・スケジュール・初期化(Ch.01)と合わせて調整

最適化アルゴリズム:速度と方向を賢く調整する

1. 勾配降下法と SGD:下り坂の反対=上り勾配の反対へ
概念: 下山で確実なのは、足元を踏んで一番急な下りへ一歩ずつ進むことです。それが勾配降下の核心です。
直感: 濃い霧の山を下ると想像してください。歩幅(学習率)が大きすぎれば崖から落ちたり、向こうの峰に跳ね返ったりします。狭すぎれば日が暮れても谷底に届きません。
中心の式:
θ←θ−η∇L(θ)\theta \leftarrow \theta - \eta \nabla L(\theta)θ←θ−η∇L(θ)
- θ\thetaθ: 今いる位置(重み)
- η\etaη: 歩幅=学習率(0.01、0.001 などが多い)
- ∇L\nabla L∇L: 今の位置の勾配
実務のコツ: 地図全体を毎回見るのは遅いので、ミニバッチ SGD で一部だけ見て素早く方向を決めるのが基本です。
2. モーメンタム:氷上のボウリング球
概念: SGD は目の前の坂だけ見るので、狭い谷でジグザグに時間を浪費します。過去の移動の慣性を足したのがモーメンタムです。
直感: 紙コップは小石でも向きを変えますが、重いボウリング球は凹凸を押し抜け、元の方向へ進みます。モーメンタムはその「重み」を与えます。
中心の式:
v←βv+(1−β)gv \leftarrow \beta v + (1-\beta)gv←βv+(1−β)g
θ←θ−ηv\theta \leftarrow \theta - \eta vθ←θ−ηv
- vvv: 速度(慣性ベクトル)
- β\betaβ: 過去をどれだけ残すか(多くは 0.9)
- ggg: 今の勾配
補足: ネステロフは、慣性で進んだ先の点で勾配を見ます。
3. 適応型(AdaGrad, RMSProp, Adam):輪ごとにブレーキ
概念: パラメータによってはもう目的地近く、まだ遠いものもあります。同じ η\etaη ではなく、座標ごとに歩幅を適応させます。
発展の流れ:
- AdaGrad: 「よく動いた次元は歩幅を小さく」— 二乗勾配を蓄積します。
- RMSProp: AdaGrad の「後半ほぼ止まる」問題を、古い履歴をEMA で忘れることで緩和しました。
- Adam: モーメンタム(方向)と RMSProp 的スケーリングを組み合わせた現代の定番です。
実務: 論文では weight decay を分離した AdamW がよく使われます。
4. 三つの目標:安定性・速度・汎化
概念: オプティマイザ選びは「速く谷底へ」だけではありません。どの谷底に着くかでテスト性能が変わります。
直感: 新幹線(Adam)は早く着くが、各停(SGD+モーメンタム)は時間はかかっても、より良い一般化の谷に着くことがあります。
実務: 序盤は歩幅をゆっくり広げる ウォームアップ、終盤は小さくする スケジューラを、オプティマイザとセットで使います。

数式をやさしく

SGD 1ステップ θ←θ−ηg^\theta \leftarrow \theta - \eta \hat{g}θ←θ−ηg^​ — g^\hat{g}g^​ はミニバッチ推定、η\etaη はステップ幅です。
モーメンタム v←βv+(1−β)gv \leftarrow \beta v + (1-\beta)gv←βv+(1−β)g, θ←θ−ηv\theta \leftarrow \theta - \eta vθ←θ−ηv — 過去の方向が vvv に溜まりジグザグを和らげます。
Adam(概念) — 勾配とその二乗のEMAを座標ごとに使い、初期ステップのバイアスを補正します。
適応的な直感 — 履歴で勾配が大きい座標ほど実効ステップを小さくします。

なぜ重要か

プロジェクトの時間とコストを決める
学習率が大きすぎると発散し、小さすぎると 1 時間で終わるはずが 1 週間になります。適切な設定は GPU 代と残業を減らす魔法です。
テストの点数(汎化)を変える
同じデータでもオプティマイザで品質が変わります。どの谷に落ちるかでテスト精度が変わるからです。
モデルの「体温計」
損失が下がらない、NaN が出るとき、まず疑うのは 学習率とオプティマイザです。原理を知れば慌てずデバッグを始められます。

どう使うか

① 実験ログを残し、一度に一つだけ変える
API はライブラリで違いますが、習慣は同じです。学習率・バッチ・オプティマイザ・シードを記録し、不調なら一度に一つだけ変えて原因を切り分けます。損失が激しく振れるならバッチ・lr・モーメンタムを、長く回すと更新がほぼ止まるなら AdaGrad 系から RMSProp / Adam への切り替えを検討します。症状とつまみを対応づけて考える練習が大切です。
② チートシート
  • 状況まずベースラインを早く
  • おすすめ`Adam` / `AdamW`
  • 理由適応的で初期 lr に鈍感になりやすい
  • 状況NLP・Transformer
  • おすすめ`AdamW`
  • 理由疎な構造でも安定しやすい
  • 状況CNN を極限まで
  • おすすめ`SGD + Momentum`
  • 理由調整は難しいが、最適なら汎化が伸びることが多い
状況おすすめ理由
まずベースラインを早く`Adam` / `AdamW`適応的で初期 lr に鈍感になりやすい
NLP・Transformer`AdamW`疎な構造でも安定しやすい
CNN を極限まで`SGD + Momentum`調整は難しいが、最適なら汎化が伸びることが多い
③ モニタリング:目を離さない
TensorBoard や W&B で損失曲線を見てください。のこぎりのように振動なら、学習率を下げるタイミングかもしれません。

まとめ

最適化は、勾配情報を更新ステップに変換して損失 L(θ)L(\theta)L(θ) を下げるプロセスです。
SGD はミニバッチ勾配 g^\hat{g}g^​ で更新し、モーメンタム は速度 vvv でジグザグを緩和、Adam/AdamW は 1次・2次モーメントで座標ごとのステップ幅を適応的に調整します。
実務デバッグ要約(症状 → 優先点検)
- 損失の振動: `lr`、モーメンタム、バッチサイズ
- 初期発散/NaN: 初期化、`lr`、`grad_norm`、clipping
- 学習停滞: スケジューラ(warmup 含む)、オプティマイザ再選択(SGD↔AdamW)
- 検証停滞: weight decay、データ拡張、early stopping
実戦チューニング順
1) ログ正常性確認 → 2) `lr` を先に調整 → 3) オプティマイザ選択 → 4) スケジュール結合 → 5) 安定化手法追加 → 6) 平均性能・分散・再現性で最終選択
運用原則: 変数は一度に一つだけ変更し、`optimizer/lr/batch_size/weight_decay/seed/scheduler` を記録して比較する。

問題の解き方

最適化は、逆伝播で得た勾配を使ってパラメータ θ\thetaθ をどう更新するかを決め、損失 L(θ)L(\theta)L(θ) を下げるプロセスです。基本の SGD はミニバッチ勾配 g^\hat{g}g^​ で θ←θ−ηg^\theta \leftarrow \theta - \eta \hat{g}θ←θ−ηg^​ と1ステップ進み、学習率 η\etaη が歩幅そのものを決めます。モーメンタム は速度 vvv を蓄積して狭い谷でのジグザグを減らし、Adam/AdamW は 1次・2次モーメントで座標ごとに異なる適応型更新を行います。損失が振れたり発散したりするときは、オプティマイザ名だけを変えるのではなく、学習率・バッチサイズ・学習率スケジューラをセットで点検することが実務では先です。
例(定義)
「モーメンタムの主な役割は?
① 学習率を 0 にする
② 過去方向を蓄積して振動を減らす
③ 逆伝播を省略する」
モーメンタムは速度 vvv により方向の慣性を保つ。→ 答え 2

例(応用)
「学習損失が大きく振動するとき、最初に確認する組み合わせは?
① 学習率・モーメンタム・バッチサイズ
② 学習データ 0
③ 全レイヤ削除」
振動はステップ幅と勾配ノイズに関係するため、
①を先に確認する。→ 答え 1

例(計算)
η=0.001\eta=0.001η=0.001, g=20g=20g=20 のとき、SGD の更新量 ηg\eta gηg は?
0.001×20=0.020.001 \times 20 = 0.020.001×20=0.02。→ 答え 0.02
定義例 — 「Adam が同時に使う情報は?
① 1次・2次モーメント
② バッチ番号のみ
③ ドロップアウトマスクのみ」→ Adam は 1次・2次モーメントを使う。答え 1

正誤例 — 「RMSProp は二乗勾配の指数移動平均(EMA)を使う。」→ 正しい。答え 1

応用例 — 「学習初期が不安定なとき、まず確認するのは?
① warmup・学習率スケジュール
② 逆伝播を切る
③ データ削除」→ warmup とスケジュールを先に確認。答え 1

選択例 — 「Nesterov の特徴は?
① 先読み点の勾配
② 現在点のみ
③ 勾配を使わない」→ 先読み点を使う。答え 1

概念例 — 「AdaGrad で頻繁に更新される座標の有効ステップ幅は?
① 小さくなる傾向
② 常に同じ
③ 大きくなる傾向」→ 累積により小さくなる傾向。答え 1

計算例 — 「サンプル数 64、バッチサイズ 16 のとき 1 エポックのステップ数は?」→ 64/16=464/16=464/16=4。答え 4