Momentum (Optimization)
モメンタム最適化は、過去の勾配を利用してモデルのトレーニングを加速し、ノイズの多い更新を平滑化して、学習率とのバランスを取りながら収束を改善します。
モメンタムは、勾配ベースのトレーニングに過去の更新の情報を持たせる最適化手法です。現在の勾配と、減衰する過去の勾配の履歴を組み合わせることで、一貫した方向への進行を加速し、前後に揺れ動く動きを抑えます。これにより、機械学習モデルはトレーニングの目的関数をより効率的に最小化できます。検索エンジン最適化はウェブサイトの可視性に関するものであり、モメンタムはモデルパラメーターの数値更新に関するものです。
モメンタムの仕組み#
勾配降下法では、モデルは勾配、つまり損失関数が最も急速に増加する方向とは逆向きに重みを更新します。古典的なモメンタムは、ポリアクのモメンタムまたはヘビーボール法とも呼ばれ、この更新に慣性を加えます。ボリス・ポリアクは、反復法の高速化に関する1964年の研究でこの手法を提案しました。
オプティマイザーは速度バッファーを保持し、各パラメーターについて値を1つずつ蓄積します。各更新では、古いバッファーにモメンタム係数を掛け、現在の勾配を加算し、得られたバッファーに学習率を掛けた値を重みから差し引きます。ニューラルネットワークでは、誤差逆伝播法によって勾配が計算され、オプティマイザーは更新のたびにバッファーを保持します。
モメンタムは、谷を横切る方向の曲率が急で、谷底に沿う方向の曲率が緩やかな、細長い損失曲面で特に役立ちます。谷に沿う方向を繰り返し指す勾配は蓄積され、谷を横切る方向の交互の成分は部分的に相殺されます。確率的勾配降下法では、この履歴によってミニバッチ間の変動も平滑化されます。モメンタムを用いた二次損失のダイナミクスは、モメンタムによる加速と、最小値の近くで生じる可能性がある振動の両方を説明します。
モメンタム、学習率、および関連手法#
モメンタム係数は一般にベータまたはミューと表記され、通常は0から1の間の値を取ります。0にすると通常の勾配降下法になり、値が1に近いほど古い勾配が長く保持されます。0.9は一般的な初期値です。正規化されていない速度バッファーを使い、勾配が一定の場合、0.9では蓄積された速度はその勾配の10倍に近づきますが、0.99では100倍に近づきます。そのため、ハイパーパラメーター調整では、モメンタムと学習率が強く相互作用します。
組み合わせが過度に強いとオーバーシュートが発生し、更新が最小値を何度も通り越すことで、損失が振動したり発散したりします。これは滑らかな二次目的関数でも起こります。学習率スケジュールはトレーニング中に更新の大きさを変化させ、モメンタムは方向の履歴がどの程度保持されるかを決定します。
密接に関連する2つの最適化アルゴリズムは、この履歴を異なる方法で利用します。
- ネステロフ・モメンタムは、保持された速度を使って先読みした位置で勾配を評価し、予測された移動を勾配によって修正できるようにします。
- Adamは、指数加重された勾配の平均と、パラメーターごとに更新を個別にスケーリングする二乗勾配の平均を組み合わせます。その
beta1は勾配の履歴を制御します。
PyTorchの最小限の例#
このPyTorchの例では、細長い二次目的関数に対し、開始点と学習率を同一にして比較します。公式のSGD実装がモメンタムバッファーを自動的に管理します。
import torch
# Curvature is 50 times greater along the second coordinate.
scale = torch.tensor([1.0, 50.0])
for momentum in (0.0, 0.9):
weights = torch.tensor([5.0, 1.0], requires_grad=True)
optimizer = torch.optim.SGD([weights], lr=0.015, momentum=momentum)
for step in range(100):
optimizer.zero_grad()
loss = (scale * weights.square()).sum()
loss.backward()
optimizer.step()
final_loss = (scale * weights.square()).sum().item()
print(f"Momentum {momentum}: loss = {final_loss:.6f}")100回更新した後の損失は、モメンタムなしでは約0.056531、モメンタムありでは約0.000216です。方向の履歴が蓄積されることで、曲率が緩やかな座標に沿った進行が加速します。
コンピュータービジョンのトレーニングでの用途#
モメンタムは、画像分類や物体検出向けの畳み込みニューラルネットワークのトレーニングを支援します。Ultralytics YOLOのトレーニングでは、optimizer="SGD"が選択されている場合にネステロフ・モメンタムが有効になり、momentum設定で保持する更新履歴を制御します。トレーナーの実装は、その係数をnesterov=Trueとともにオプティマイザーに渡します。
代表的な適用例は、ImageNet向けの初期のResNetトレーニング手順です。これらのモデルでは、モメンタムを0.9に設定したSGD、256のバッチサイズ、重み減衰0.0001、および誤差が頭打ちになった際に10分の1にする初期学習率0.1が使われました。










