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コンパイラで実行できます。
練習問題
入力値と境界ケースを変更し、より大きなデータでも動作を確認してください。
- 入力や重みを変えて、実行前に出力を予想してみましょう。
- 途中の値を出力して、計算の各ステップを追いましょう。
- 下のリンクのチャレンジを解いて、自分でアイデアを実装しましょう。
チャレンジで練習する
このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。
- 活性化関数の導関数 sigmoid、ReLU、Leaky ReLU、tanh の各値での導関数を計算します。誤差逆伝播法が必要とする傾きです。 簡単
- 1つのニューロンの勾配 連鎖律を使い、sigmoid ニューロンの各重みとバイアスに対する損失の変化を求めます。 中級
- 2層ネットワークの誤差逆伝播法 sigmoid の隠れ層1つと sigmoid の出力1つを持つネットワークの、すべての重みとバイアスの勾配を計算します。 難しい
- 勾配降下法でニューロンを学習させる 順伝播、勾配計算、重み更新を繰り返して、例から sigmoid ニューロンを学習させます。 中級
- XOR を解くニューラルネットワークを学習させる すべてを組み合わせ、2-2-1 の sigmoid ネットワークを誤差逆伝播法で XOR を学習するまで訓練します。 難しい