1 基本コンセプト

1.1 学習率定義

学習率(Learning Rate)は、機械学習および深層学習の最適化プロセスにおいて、損失関数勾配に基づいてモデルパラメータを更新する際のステップサイズを決定するハイパーパラメータである。これは最適化アルゴリズムがパラメータ空間を移動する速度を制御し、値が大きければパラメータ更新の影響が大きく、小さければ影響が小さい。適切な学習率はモデルのトレーニング効率と最終性能に直接影響を与える。

1.2 勾配降下法との関係

1.2.1 更新式の数学的表現

勾配降下法におけるパラメータ更新は次の式で表される:θₜ₊₁ = θₜ - η ∇L(θₜ)。ここでθₜは時刻tのパラメータ、ηは学習率、∇L(θₜ)は損失関数の勾配である。この式はパラメータが勾配の逆方向にη倍の距離だけ移動することを示す。

1.2.2 収束速度への影響

学習率は収束速度に直接作用する。ηが大きいとパラメータ更新が急激に行われ、早期に大まかな最適解に近づくが、極小値付近で振動や発散を起こしやすい。ηが小さいと更新が緩やかで安定するが、多くの反復回数が必要となり、局所最適に陥るリスクが高まる。理想的なηは損失関数の地形に合わせて調整される。

2 学習率の種類

2.1 固定学習率

固定学習率はトレーニング全体を通じて一定値のηを使用する方式である。実装が簡単で計算負荷が低いが、非凸最適化問題では適切な値を事前に決定することが難しく、トレーニング後半では不十分な微調整や振動を引き起こす可能性がある。単純な凸問題や小規模モデルで用いられることが多い。

2.2 動的学習率

2.2.1 ステップ減衰

ステップ減衰は事前に設定したエポック数またはイテレーション数ごとに学習率を一定の係数(例えば0.1倍)で減少させる手法である。これによりトレーニング初期に大きなステップで探索し、後半に小さなステップで微調整することが可能となる。スケジュールは経験的に設計される。

2.2.2 指数減衰

指数減衰は学習率をηₜ = η₀ × exp(-kt)またはηₜ = η₀ × γᵗ(γ<1)のように指数関数的に減少させる。連続的かつ滑らかな減衰曲線を提供し、手動調整の手間を軽減する。しかし減衰速度がトレーニング動態と一致しない場合がある。

2.3 適応的学習率

2.3.1 AdaGrad

AdaGradはパラメータごとに学習率を適応的に調整する手法である。過去の勾配の二乗和に反比例して学習率を減少させるため、頻繁に更新されるパラメータの学習率は小さくなり、疎な特徴に対しては大きな更新が可能となる。しかし累積和が増加し続けるため、学習率が極端に小さくなりゼロに近づく問題がある。

2.3.2 RMSProp

RMSPropはAdaGradの勾配二乗和の累積を指数移動平均に置き換えた手法である。これにより学習率の単調減少を緩和し、非定常環境での最適化を改善する。現在の勾配の大きさに応じて学習率を調整し、パラメータ空間の曲率に適応する。

2.3.3 Adam

AdamはRMSPropにモーメンタムを組み合わせた手法であり、一次モーメント(勾配の平均)と二次モーメント(勾配の分散)の両方を指数移動平均で推定する。バイアス補正を施した更新式により、学習率の自動調整を実現する。多くの深層学習タスクでデフォルトの選択肢となっており、初期学習率は典型的に0.001が使用される。

3 学習率の調整手法

3.1 手動調整

3.1.1 対数スケールでの探索

手動調整では、対数スケールで候補値を設定する(例:10⁻¹, 10⁻², 10⁻³, 10⁻⁴)。これにより学習率の桁を効率的に探索できる。初期値から数回のトレーニングを試行し、損失の推移を観察して範囲を絞り込む方法が一般的である。

3.1.2 経験的ルール

経験的ルールとして、学習率はバッチサイズに比例して大きくする(線形スケーリング則)や、小規模モデルでは比較的大きな値から試す、データセットが大きい場合は小さな値から開始するなどの指針がある。また損失関数が振動する場合は学習率を下げ、収束が遅い場合は上げるという調整が行われる。

3.2 自動調整

3.2.1 学習率スケジューリング

学習率スケジューリングはトレーニング中に事前定義されたルールに従って学習率を変更する手法である。代表的なスケジューラには、一定間隔で減衰するステップスケジューラ、エポックごとに減衰する指数スケジューラ、コサイン関数に従って減衰するコサインスケジューラなどがある。フレームワークに組み込まれたスケジューラクラスを利用することで容易に実装できる。

3.2.2 サイクリック学習率

サイクリック学習率は学習率を周期的に上下させる手法である。三角波やコサイン波の形状で、一定の範囲内(例:最小値と最大値)を変動させる。これにより局所最適から脱出しやすくなり、適切な範囲設定で収束性能が向上する。CLR(Cyclical Learning Rate)として知られる手法が有名である。

3.2.3 ウォームアップ

ウォームアップはトレーニング初期に学習率を徐々に目標値まで増加させる手法である。例えば線形に0から初期学習率まで上昇させる。これにより初期の不安定な勾配更新を抑制し、特に大規模バッチやTransformer系モデルで有効である。ウォームアップ後は通常のスケジューリングに移行する。

4 学習率がもたらす課題と対策

4.1 高学習率の問題

4.1.1 発散

学習率が大きすぎると、パラメータ更新が損失関数の谷を飛び越えてしまい、損失が増加し続けて発散に至る。対策として、学習率の上限を設定する、勾配クリッピングを併用する、または損失の増加を検出して学習率を自動的に減少させる仕組みを導入する。

4.1.2 振動

極小値付近で学習率が大きいと、パラメータが最小値の周囲を行き来し、損失が一定値に収束しない振動現象が発生する。対策として学習率の減衰を導入するか、モーメンタムを調整して振動を抑制する。具体的にはAdamのβパラメータ調整が有効である。

4.2 低学習率の問題

4.2.1 局所最適への捕捉

学習率が小さすぎると、パラメータの更新幅が微小となり、損失関数の浅い極小点から脱出できずに局所最適に留まる可能性が高まる。対策としてモーメンタムの追加やウォームスタートの活用、または複数の初期値からトレーニングを試行する。

4.2.2 収束の遅延

低学習率では各更新による損失減少がわずかであり、十分な性能に達するまでに膨大なエポック数が必要となる。時間的コストが増大するため、現実的なトレーニング時間内に収束しない可能性がある。対策として学習率を適宜上げるスケジューリング(サイクリック法)や適応的学習率アルゴリズムの採用が推奨される。

4.3 ベストプラクティス

4.3.1 学習率の初期値設定

初期学習率の設定は一般的に0.1から0.0001の範囲で探索する。対数スケールで数値実験を行い、損失が最初の数百イテレーションで安定して減少する値を選択する。大まかな目安として、バッチサイズが256程度の標準的な画像分類タスクでは0.01が、Transformer系モデルでは0.001がよく使われる。

4.3.2 早期停止との併用

早期停止(Early Stopping)は検証損失が改善しなくなった時点でトレーニングを打ち切る手法である。学習率が小さくなりすぎると早期停止が発動しにくくなるため、学習率スケジューリングと組み合わせて、適切なタイミングで学習率を減少させつつ、検証性能の停滞を検出してトレーニングを終了する。これにより過学習と収束の遅延を同時に防ぐ。

5 実践とツール

5.1 フレームワークでの実装例

5.1.1 TensorFlow/Keras

TensorFlow/Kerasではtf.keras.optimizersモジュールで様々な最適化アルゴリズムと学習率スケジューラを提供する。例えばtf.keras.optimizers.Adam(learning_rate=0.001)でAdamオプティマイザを定義し、tf.keras.callbacks.LearningRateSchedulertf.keras.optimizers.schedules.ExponentialDecayを用いて動的学習率を実装できる。またカスタムコールバックを作成して任意のスケジューリングを適用することも可能である。

5.1.2 PyTorch

PyTorchではtorch.optimモジュールでオプティマイザを定義し、torch.optim.lr_schedulerで学習率スケジューラを組み合わせる。例えばoptimizer = torch.optim.SGD(model.parameters(), lr=0.1)に対して、scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)とすると30エポックごとに学習率が0.1倍になる。スケジューラは各エポック終了時にscheduler.step()を呼び出して更新する。

5.2 学習率の可視化ツール

学習率の変化やその影響を可視化するツールとして、TensorBoardのtf.summary.scalarを用いて学習率のログを記録する方法がある。同様にPyTorchではtorch.utils.tensorboard.SummaryWriterにより学習率と損失を同時に可視化できる。また、Learning Rate Finderと呼ばれるツール(例:fastaiのlr_find)は、小規模なトレーニングで学習率を連続的に変化させ、損失の推移をプロットして最適範囲を視覚的に特定する。さらにmatplotlibを用いてカスタムプロットを作成し、学習率曲線とトレーニング損失を重ねて表示することも一般的である。