本文へスキップ
BecomeCoder

PyTorchコース · 第2章 numpyで「学習」を実装する · レッスン6

勾配はどう計算する ― 数値微分と解析微分

ブラウザで完結

導入

前のレッスンでは勾配の式を「公式」として渡しました。では、その勾配はどうやって求めるのでしょう。じつは方法は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章)。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

Python — ライブラリ付きで実行(Pyodide)

numpy / pandas / matplotlib が使える本物のPython(Pyodide)を読み込みます。初回のみ読み込みに少し時間がかかります(以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。