← 機械学習テキスト 一覧

🎓 レベル:標準 | 重要度:B(標準)

📎 前提:勾配降下法モーメンタムとAdam系最適化(最適化器)

要点(BLUF)


なぜ学習率が最重要なのか

更新式はどの最適化器でも本質的に「勾配の方向へ歩幅 η\eta だけ進む」形です。

θt+1=θtηgt\theta_{t+1} = \theta_t - \eta\, g_t

ここで η\eta が学習率(歩幅)、gtg_t が勾配(Adam なら適応的にスケールされた勾配)。**要するに η\eta は「1歩でどれだけ動くか」**で、ここを外すと他をどれだけ調整しても学習は成立しません。

だから「1つの良い η\eta を固定で当てる」のではなく、学習の進行に応じて η\eta を変える=スケジュールを組みます。最適な初期値の探索自体は ハイパーパラメータ最適化 の手法(グリッド/ランダム/ベイズ最適化)で行います。

xychart-beta
    title "学習率の大きさと損失のイメージ"
    x-axis "更新ステップ" 0 --> 10
    y-axis "損失" 0 --> 10
    line [9, 9.5, 8.8, 9.7, 8.5, 9.9, 8.2, 9.8, 8.6, 9.5, 8.8]
    line [9, 6, 4.2, 3, 2.2, 1.7, 1.4, 1.2, 1.1, 1.05, 1.0]
    line [9, 8.7, 8.4, 8.1, 7.85, 7.6, 7.4, 7.2, 7.05, 6.9, 6.8]

上から順に「大きすぎ(振動・発散)」「ちょうど良い(速く下がる)」「小さすぎ(遅い)」のイメージです。


学習率スケジュール

学習を進めながら ηt\eta_t を変える代表パターンです。

① ステップ減衰(step decay)

一定エポックごとに η\eta を定数倍(例:30エポックごとに 0.1 倍)で落とします。

ηt=η0γt/s(0<γ<1)\eta_t = \eta_0 \cdot \gamma^{\lfloor t / s \rfloor} \quad (0 < \gamma < 1)

要するに「段階的に歩幅を縮める」。実装が単純で古典的なCNNで広く使われましたが、いつ・どれだけ落とすか(s,γs, \gamma)を手で決める必要があります。

② コサインアニーリング(cosine annealing)

全学習期間 TT にわたり、η\eta をコサインカーブで滑らかに最小値へ落とします。

ηt=ηmin+12(ηmaxηmin)(1+cos ⁣πtT)\eta_t = \eta_{\min} + \tfrac{1}{2}\left(\eta_{\max} - \eta_{\min}\right)\left(1 + \cos\!\frac{\pi t}{T}\right)

要するに「最初はゆっくり、中盤で一気に、最後はまたゆっくり」減らす。中盤で大きく動いて探索し、終盤は歩幅を絞って細かく収束させる――実務で経験的に良いとされてきた挙動を、閾値の手調整なしに自動で実現します。Transformer 系・大規模事前学習でほぼ標準になっています。なお最小値はゼロではなく最大値の 1/10 程度まで落とすレシピがよく使われます。

派生:ウォームリスタート(cosine annealing with warm restarts, SGDR) は、コサインで底まで下げたら η\eta を周期的に跳ね上げて再び下げる。複数の解を渡り歩いてアンサンブル的な効果を狙います。

③ ウォームアップ(warmup)

学習の最初だけ η\eta をゼロ付近から目標値まで線形に上げる短い助走区間です。その後に上記②などの減衰へ繋ぎます(「線形ウォームアップ+コサイン」が定番)。

ηt=ηtargettTwarmup(tTwarmup)\eta_t = \eta_{\text{target}} \cdot \frac{t}{T_{\text{warmup}}} \quad (t \le T_{\text{warmup}})

なぜ必要か:学習序盤はパラメータがランダムで勾配が大きく暴れやすい。いきなり大きな η\eta を当てると初手で発散します。最初を小さく抑え、状態が落ち着いてから本来の大きな η\eta に乗せることで、より高いピーク学習率に耐えられ、結果として最終性能も上がりやすくなります。特に後述の大バッチ学習や Transformer の Adam では事実上必須です。ウォームアップ期間は全ステップの 0.1〜0.5% 程度が目安とされます(要最新確認:適切な長さはモデル・データ規模に依存)。

xychart-beta
    title "学習率スケジュールの比較(ウォームアップ+減衰)"
    x-axis "学習の進行" 0 --> 10
    y-axis "学習率" 0 --> 10
    line [9, 9, 9, 1, 1, 1, 0.1, 0.1, 0.1, 0.1, 0.1]
    line [9, 8.7, 7.8, 6.4, 5, 3.6, 2.2, 1.2, 0.5, 0.15, 0.1]
    line [1, 5, 9, 8.8, 8.3, 7, 5.2, 3.2, 1.5, 0.5, 0.1]

線①ステップ減衰(階段状)、②コサイン(滑らかなS字減衰)、③ウォームアップ+コサイン(最初に上昇してから減衰)。


ミニバッチサイズの影響

1回の更新で勾配を平均する標本数 BB がバッチサイズです。これは速度・安定性・汎化に効きます。

線形スケーリング則(linear scaling rule)

バッチサイズを kk 倍にしたら、学習率も kk 倍にするという実務則です。

BkB    ηkηB \to kB \;\Rightarrow\; \eta \to k\,\eta

直観:勾配は BB 個の標本平均なので、BB を増やすと勾配推定の分散が下がる=1ステップの「実効的な情報量」が増えます。それに合わせて歩幅も大きく取らないと、せっかく大きなバッチで計算した割に進みが遅くなります。ResNet を ImageNet で大バッチ(〜8192)短時間学習する際にこの則が使われました。

ただし重要な但し書き(要最新確認):


勾配クリッピング

勾配のノルムに上限を設けて、超えたら縮める手法です。勾配爆発(exploding gradients)への対症療法で、特に RNN/LSTM や Transformer の学習で使います。

g^={ggccggg>c\hat{g} = \begin{cases} g & \|g\| \le c \\[4pt] c\,\dfrac{g}{\|g\|} & \|g\| > c \end{cases}

要するに「勾配ベクトルが長すぎたら、向きはそのまま長さだけ cc に切り詰める」(clip-by-norm)。向きを保つので学習の方向は壊さず、一発の暴れた更新だけを抑えられます。


学習曲線の診断

横軸=エポック(または反復)、縦軸=損失で、訓練損失と検証損失を重ねて描いたものが学習曲線です。これは学習の「計器盤」で、形から原因を読みます。土台となる訓練/検証/テストの分け方は 訓練・検証・テストと交差検証 を参照。

曲線の形診断打ち手
訓練・検証ともに高止まり(早く頭打ち)未学習(高バイアス)モデルを大きく/学習を長く/η\eta を上げる/正則化を弱める
訓練は下がり続けるが検証が途中から上昇(U字)過学習(高バリアンス)正則化・ニューラルネットの正則化 を強める/データ拡張/早期終了
訓練・検証ともに下がり続けて終わる未収束(打ち切り早すぎ)エポックを増やす
損失が振動・スパイク・nanη\eta が大きすぎ/勾配爆発η\eta を下げる/ウォームアップ/勾配クリッピング
検証が訓練より低いデータリーク or 検証セットが楽すぎ分割・前処理を疑う

ポイントは訓練と検証の「差」:差が小さく両方高い=バイアス、差が大きい(訓練だけ低い)=バリアンス。この読み分けが 汎化と過学習・バイアスバリアンス分解 の実地版です。

flowchart TD
    A["学習曲線を描く(訓練損失・検証損失)"] --> B{"損失が振動 / nan ?"}
    B -- "はい" --> C["学習率を下げる<br/>ウォームアップ・勾配クリッピング"]
    B -- "いいえ" --> D{"訓練損失は十分下がった?"}
    D -- "いいえ(高止まり)" --> E["未学習:容量を増やす<br/>長く学習・正則化を弱める"]
    D -- "はい" --> F{"検証損失も追従して下がる?"}
    F -- "途中から上昇(U字)" --> G["過学習:正則化を強める<br/>データ拡張・早期終了"]
    F -- "まだ下がり続ける" --> H["未収束:エポックを増やす"]
    F -- "良好に収束" --> I["完了:チェックポイント保存"]

学習を回す周辺の実務


実務のレシピ(順番が大事)

  1. まず動かす:小さなモデル・少データ・短いエポックで、損失が下がること・nan が出ないことを確認。ここでパイプライン(前処理・損失・ログ・チェックポイント)を固める。
  2. 過学習できることを確認:ごく少量のデータで訓練損失をほぼ0まで落とせるか。落とせないなら実装バグを疑う(学習を始める前の最重要チェック)。
  3. 学習率を合わせる:これが最優先ハイパラ。スケジュール(ウォームアップ+コサイン等)を入れる。
  4. バッチサイズを決め、線形/平方根スケーリングで lr を整合(独立に弄らない)。
  5. 正則化を調整ニューラルネットの正則化・重み減衰・データ拡張・早期終了で検証損失を最小化。
  6. その他のハイパラハイパーパラメータ最適化 で詰める。

鉄則:一度に1つだけ変える。複数同時に変えると、効いた要因が分からなくなります。


⚠️ よくある誤解・落とし穴


対応するシミュレーション

simulations/early_stopping.py:過学習しやすい小さなMLPを長く学習させ、訓練誤差と検証誤差をエポックごとに記録します。訓練誤差は下がり続けるのに検証誤差は底を打って上昇に転じることを(対数軸で)可視化し、検証誤差が最小のエポックで止める早期終了が追加の正則化項なしに汎化を保つことを示します。L2正則化に近い効果をもちます(正則化の理論)。なお学習率と収束の挙動そのものは 勾配降下法モーメンタムとAdam系最適化 のシミュレーションが対応します。

検証誤差の底で止める早期終了


まとめ


関連ノート