導入
モデルができたら、あとは学習の輪を回すだけ。第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 → step の3行に凝縮されました。numpy 版と見比べると、PyTorch が何を肩代わりしているかが一目瞭然です。
この5ステップが基本形
zero_grad → forward → loss → backward → step。画像認識でも言語モデルでも、訓練ループの骨格はいつもこれです。まずこの型を体に入れましょう。
まとめ
- optimizer(SGD/Adam)がパラメータ更新を担当。損失関数は
nn.MSELossなど既製品を使う。 - 訓練ループの基本形は
zero_grad → forward → loss → backward → stepの5ステップ。 - 第3章の手書き逆伝播が3行になる。この型はどんなモデルでも共通。