導入
前のレッスンでは勾配の式を「公式」として渡しました。では、その勾配はどうやって求めるのでしょう。じつは方法は2通りあり、PyTorch の心臓部を理解する鍵になります。
説明
- 数値微分:
wをほんの少し(h)動かし、損失がどれだけ変わったかを見る。(L(w+h) − L(w−h)) / (2h)。単純だが、パラメータが多いと激烈に遅い。 - 解析微分:微分の公式を使って勾配の式を導く。速く正確。前レッスンの
dw, dbはこれ。
数値微分は「実際に少し動かして確かめる」愚直な方法、解析微分は「数式で一気に出す」賢い方法です。両者が一致すれば、勾配計算が正しい証拠になります(この照合を 勾配チェック と呼びます)。
flowchart TD q["勾配を知りたい"] --> num["数値微分<br/>少し動かして差を見る<br/>遅いが簡単"] q --> ana["解析微分<br/>公式で導く<br/>速く正確"] num -. 一致するか照合 .-> ana ana --> pt["PyTorchはこれを<br/>自動でやる(autograd)"]
やってみよう
損失 L(w) = (w - 3)**2 について、数値微分と解析微分(2*(w-3))を計算し、両者がほぼ一致することを確かめます。PyTorch の autograd は、この解析微分をあなたの代わりに自動でやってくれる仕組みです。第4章で登場します。
import numpy as np
def loss(w):
return (w - 3) ** 2
def numerical_grad(f, w, h=1e-5):
return (f(w + h) - f(w - h)) / (2 * h)
for w in [0.0, 3.0, 6.0, 10.0]:
num = numerical_grad(loss, w)
ana = 2 * (w - 3) # 解析的な勾配
print(f"w={w:5.1f}: 数値微分={num:8.4f} 解析微分={ana:8.4f}")
演習
損失を L(w) = w**3 に変えてみましょう。解析的な勾配は 3*w**2 です。loss 関数と解析微分の式を書き換えて、両者が一致するか確かめてください。
ヒント1を見る
def loss(w): return w ** 3 に変え、比較する解析微分を 3 * w ** 2 にします。
ヒント2を見る
どんな関数でも、数値微分(少し動かして差を見る)と正しい解析微分は一致します。これが勾配チェックの考え方です。
まとめ
- 勾配の求め方は数値微分(愚直・遅い)と解析微分(公式・速い)の2通り。
- 両者を照合する勾配チェックで、実装の正しさを確認できる。
- PyTorch の autograd は、この解析微分を自動でやってくれる(第4章)。