Pythonで学ぶAIの概念

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コンパイラで実行できます。

練習問題

入力値と境界ケースを変更し、より大きなデータでも動作を確認してください。

  1. 入力や重みを変えて、実行前に出力を予想してみましょう。
  2. 途中の値を出力して、計算の各ステップを追いましょう。
  3. 下のリンクのチャレンジを解いて、自分でアイデアを実装しましょう。
Python IDEで実行 →

チャレンジで練習する

このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。

すべてのチャレンジ