本文へスキップ
BecomeCoder

PyTorchコース · 第4章 PyTorch入門 ― 自動微分と訓練ループ · レッスン12

なぜPyTorchか ― テンソルと自動微分(autograd)

ローカル実施

導入

PyTorch を一言でいえば「自動で微分してくれる numpy」です。第3章で苦労した逆伝播の手計算が、.backward() の1行に置き換わります。これが革命的だった理由を見ていきましょう。

説明

PyTorch のテンソルは numpy 配列そっくりですが、requires_grad=True を付けると、その値を使った計算の履歴を裏で記録します。そして .backward() を呼ぶと、記録をさかのぼって勾配を自動計算してくれます。これが autograd(自動微分) です。

flowchart LR
  t["テンソル<br/>requires_grad=True"] --> c["計算<br/>(履歴を記録)"]
  c --> loss["損失"]
  loss --> bw[".backward()"]
  bw --> g["各テンソルの .grad に<br/>勾配が自動で入る"]

第2章で数値微分と解析微分を手で照合しましたが、PyTorch ではその心配は不要。どんな複雑な計算でも、正しい勾配を自動で出してくれます。

第1章の例 L(w) = (w-3)^2(勾配は 2(w-3))を PyTorch で書くとこうなります。

import torch

w = torch.tensor(10.0, requires_grad=True)   # 勾配を追跡する
loss = (w - 3) ** 2
loss.backward()          # 逆伝播 → w.grad に勾配が入る

print(w.grad)            # → tensor(14.)  (2*(10-3) と一致)

手で微分の式を書かなくても、w.grad2*(10-3)=14 が自動で入ります。numpy 版で書いた numerical_grad2*(w-3) も、もう要りません。

補足:勾配降下法も数行に

第1章の勾配降下ループも、PyTorch なら次の通りです。

import torch

w = torch.tensor(10.0, requires_grad=True)
lr = 0.1
for step in range(30):
    loss = (w - 3) ** 2
    loss.backward()              # 勾配を自動計算
    with torch.no_grad():        # 更新中は履歴を記録しない
        w -= lr * w.grad
    w.grad.zero_()               # 次のステップのため勾配をリセット
print(w)                         # → 3 に近づく

w.grad.zero_() を忘れると勾配が累積してしまう点だけ注意です(PyTorch は勾配を足し込む仕様)。

まとめ

  • PyTorch のテンソルは「自動微分できる numpy 配列」。
  • requires_grad=True → 計算履歴を記録 → .backward()勾配を自動計算
  • 第3章で手計算した逆伝播が、.backward() の1行になる。これが PyTorch の核心。