Pythonで学ぶAIの概念

Pythonで学ぶ勾配降下法と誤差逆伝播法

学習とは、損失を減らすように重みを調整することです。勾配は損失が増える方向を示すので、勾配降下法はその逆方向へ小さく進みます。誤差逆伝播法は連鎖律を使って、すべての重みの勾配を計算します。

やさしい言葉で概念を理解する

学習とは、損失を減らすように重みを調整することです。勾配は損失が増える方向を示すので、勾配降下法はその逆方向へ小さく進みます。誤差逆伝播法は連鎖律を使って、すべての重みの勾配を計算します。

勾配降下法でニューロンを学習させます。連鎖律で各重みが損失にどう影響するかを求め、坂を下るように進みます。

重要なポイント

  • 勾配は、各重みに対する損失の傾きです。
  • 学習率は歩幅を決めます。大きすぎると行き過ぎ、小さすぎると遅くなります。
  • 誤差逆伝播法は、出力から最初の層へ向かって連鎖律を適用します。
  • 1エポックは学習データ全体を1回通すことです。

どのような場面で使う?

  • ニューラルネットワークやAIライブラリの内部で何が起きているかを理解する。
  • 対応するチャレンジで実装する前に考え方をつかむ。
  • 機械学習の講座、面接、プロジェクトに備える。

動かして理解する

再生を押すと学習が始まります。直線が点に近づき、オレンジの経路が損失の地形を下って最も低い点へ進みます。

サンプルコード

コードを実行 →
main.py
# Train one neuron y = w * x + b to fit points on the line y = 2x + 1.
data = [(0, 1), (1, 3), (2, 5), (3, 7)]
w, b = 0.0, 0.0
learning_rate = 0.05

for epoch in range(1, 201):
    grad_w = grad_b = 0.0
    for x, y in data:
        error = (w * x + b) - y          # prediction minus target
        # Chain rule: d(error²)/dw = 2 * error * x, d(error²)/db = 2 * error
        grad_w += 2 * error * x
        grad_b += 2 * error
    # Step against the gradient to make the loss smaller.
    w -= learning_rate * grad_w / len(data)
    b -= learning_rate * grad_b / len(data)
    if epoch in (1, 10, 50, 200):
        loss = sum(((w * x + b) - y) ** 2 for x, y in data) / len(data)
        print(f"epoch {epoch:>3}: w={w:.3f} b={b:.3f} loss={loss:.4f}")

期待される出力

epoch   1: w=0.850 b=0.400 loss=7.0587
epoch  10: w=2.009 b=0.958 loss=0.0009
epoch  50: w=2.005 b=0.989 loss=0.0000
epoch 200: w=2.000 b=1.000 loss=0.0000

仕組み

各点の誤差は予測から目標を引いた値です。連鎖律から二乗誤差の勾配は、wについて2·error·x、bについて2·errorになります。データ全体で平均して勾配の逆へ進むと、wとbは2と1に近づき、損失はほぼ0まで下がります。

値を変更し、PythonをインストールせずにCodeUtilityオンラインPythonコンパイラで実行できます。

練習問題

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

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

チャレンジで練習する

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

すべてのチャレンジ