Pythonで学ぶニューラルネットワークの最適化手法:SGD、Momentum、Adam
最適化手法(オプティマイザ)は、勾配を重みの更新に変えるルールです。通常の勾配降下法は現在の勾配だけを使い、Momentumは過去の方向を覚え、Adamはさらに重みごとに歩幅を調整します。
やさしい言葉で概念を理解する
最適化手法(オプティマイザ)は、勾配を重みの更新に変えるルールです。通常の勾配降下法は現在の勾配だけを使い、Momentumは過去の方向を覚え、Adamはさらに重みごとに歩幅を調整します。
同じ関数を少しずつ最小化しながら、通常の勾配降下法、Momentum、Adamを比べます。
重要なポイント
- Momentumは速度を持つので、平らな場所や小さな凹凸を転がって越えられます。
- Adamは勾配と勾配の二乗の移動平均を保持します。
- バイアス補正(1 − βᵗで割る)が、最初の数ステップでの平均のずれを直します。
- 良い重みの初期化やミニバッチも、学習を速く安定させます。
どのような場面で使う?
- ニューラルネットワークやAIライブラリの内部で何が起きているかを理解する。
- 対応するチャレンジで実装する前に考え方をつかむ。
- 機械学習の講座、面接、プロジェクトに備える。
動かして理解する
再生を押すと、3つの最適化手法が同じでこぼこの谷を下ります。学習率を大きくすると、Momentumの行き過ぎが見られます。
サンプルコード
main.py
import math
# Minimise f(x) = (x - 3)² with three optimizers. The gradient is 2(x - 3).
grad = lambda x: 2 * (x - 3)
def sgd(steps, lr=0.1):
x = 0.0
for _ in range(steps):
x -= lr * grad(x)
return x
def momentum(steps, lr=0.1, beta=0.9):
x, v = 0.0, 0.0
for _ in range(steps):
v = beta * v + grad(x) # remember the direction we were going
x -= lr * v
return x
def adam(steps, lr=0.3, b1=0.9, b2=0.999, eps=1e-8):
x, m, v = 0.0, 0.0, 0.0
for t in range(1, steps + 1):
g = grad(x)
m = b1 * m + (1 - b1) * g # running mean of gradients
v = b2 * v + (1 - b2) * g * g # running mean of squared gradients
m_hat, v_hat = m / (1 - b1 ** t), v / (1 - b2 ** t)
x -= lr * m_hat / (math.sqrt(v_hat) + eps)
return x
for steps in (5, 20, 50):
print(f"{steps:>2} steps sgd={sgd(steps):.3f} momentum={momentum(steps):.3f} adam={adam(steps):.3f}")
期待される出力
5 steps sgd=2.017 momentum=4.741 adam=1.476
20 steps sgd=2.965 momentum=4.048 adam=3.813
50 steps sgd=3.000 momentum=3.091 adam=3.014
仕組み
3つとも(x − 3)²を最小化し、最小点はx = 3です。SGDは着実に進み、Momentumは勢いがついて行き過ぎてから落ち着き、Adamは勾配とその二乗の移動平均で各ステップを調整します。50ステップ後には3つとも3に近づきます。
値を変更し、PythonをインストールせずにCodeUtilityオンラインPythonコンパイラで実行できます。
練習問題
入力値と境界ケースを変更し、より大きなデータでも動作を確認してください。
- 入力や重みを変えて、実行前に出力を予想してみましょう。
- 途中の値を出力して、計算の各ステップを追いましょう。
- 下のリンクのチャレンジを解いて、自分でアイデアを実装しましょう。
チャレンジで練習する
このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。
- Xavier と He の重み初期化 層の重みを初期化するときに使う範囲または標準偏差を計算します。 簡単
- ミニバッチ勾配降下法 データ全体ではなく、小さなバッチごとに重みを更新して線形モデルを学習させます。 中級
- モーメンタム付き勾配降下法 前のステップの一部を残すモーメンタム更新を適用し、一貫した方向への学習を加速させます。 簡単
- Adam オプティマイザ ディープラーニングの標準オプティマイザ Adam を、移動平均とバイアス補正つきで実装します。 中級