本文へスキップ
BecomeCoder

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

最適化ループ ― loss.backward() と optimizer

ローカル実施

導入

モデルができたら、あとは学習の輪を回すだけ。第2〜3章で手書きした「損失 → 勾配 → 更新」が、PyTorch では定型の数行になります。この型はどんなモデルでも同じなので、丸ごと覚えてしまいましょう。

説明

更新を担当するのが optimizer(最適化器)optim.SGD は第2章でやった素朴な勾配降下法そのもの、optim.Adam はそれを賢くした定番です。

flowchart TD
  z["optimizer.zero_grad()<br/>前回の勾配をリセット"] --> f["pred = model(x)<br/>順伝播"]
  f --> l["loss = 損失関数(pred, y)"]
  l --> b["loss.backward()<br/>勾配を自動計算"]
  b --> s["optimizer.step()<br/>全パラメータを更新"]
  s --> z

第3章の XOR 訓練(5000エポックの手書きループ)は、PyTorch ではこうです。

import torch
import torch.nn as nn

X = torch.tensor([[0,0],[0,1],[1,0],[1,1]], dtype=torch.float32)
Y = torch.tensor([[0],[1],[1],[0]], dtype=torch.float32)

model = XORNet()
criterion = nn.MSELoss()                                  # 損失関数
optimizer = torch.optim.Adam(model.parameters(), lr=0.05) # 最適化器

for epoch in range(2000):
    optimizer.zero_grad()        # ① 勾配をリセット
    pred = model(X)              # ② 順伝播
    loss = criterion(pred, Y)    # ③ 損失
    loss.backward()              # ④ 逆伝播(勾配を自動計算)
    optimizer.step()             # ⑤ 更新
    if epoch % 500 == 0:
        print(f"epoch {epoch}: loss = {loss.item():.4f}")

print(model(X).detach())         # 学習後の予測

第3章で20行以上あった逆伝播+更新が、zero_grad → backward → step3行に凝縮されました。numpy 版と見比べると、PyTorch が何を肩代わりしているかが一目瞭然です。

この5ステップが基本形

zero_grad → forward → loss → backward → step。画像認識でも言語モデルでも、訓練ループの骨格はいつもこれです。まずこの型を体に入れましょう。

まとめ

  • optimizer(SGD/Adam)がパラメータ更新を担当。損失関数nn.MSELoss など既製品を使う。
  • 訓練ループの基本形は zero_grad → forward → loss → backward → step の5ステップ。
  • 第3章の手書き逆伝播が3行になる。この型はどんなモデルでも共通。