PyTorch 入門
Tensor・autograd・学習ループ・Dataset/DataLoader という PyTorch の基本要素を学びます。
Tensor と autograd#
PyTorch の中心は Tensor(NumPy 配列に似た多次元配列、GPU 対応)と、
自動微分の autograd です。requires_grad=True のテンソルに対する計算は記録され、
backward() で勾配が自動計算されます。
import torch
x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
y = (x ** 2).sum()
y.backward()
print(x.grad) # tensor([2., 4., 6.]) ← dy/dx = 2xDataset と DataLoader#
データ供給は Dataset(1 件の取り出し方)と DataLoader(バッチ化・シャッフル)で行います。
from torch.utils.data import Dataset, DataLoader
class TableDataset(Dataset):
def __init__(self, X, y):
self.X = torch.tensor(X, dtype=torch.float32)
self.y = torch.tensor(y, dtype=torch.float32)
def __len__(self):
return len(self.X)
def __getitem__(self, i):
return self.X[i], self.y[i]
loader = DataLoader(TableDataset(X, y), batch_size=64, shuffle=True)学習ループ#
PyTorch では学習ループを自分で書きます。勾配のゼロ初期化 → 順伝播 → 損失 → 逆伝播 → 更新が定型です。
import torch.nn as nn
model = nn.Sequential(nn.Linear(X.shape[1], 64), nn.ReLU(), nn.Linear(64, 1))
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
loss_fn = nn.BCEWithLogitsLoss()
model.train()
for xb, yb in loader:
optimizer.zero_grad() # 勾配を初期化
pred = model(xb).squeeze(1) # 順伝播
loss = loss_fn(pred, yb) # 損失
loss.backward() # 逆伝播
optimizer.step() # 更新注意
optimizer.zero_grad() を忘れると勾配が蓄積され、学習が壊れます。各ステップの先頭で必ず呼びます。
推論時は model.eval() と torch.no_grad() を使い、Dropout 等を無効化します。
理解度チェック#
次のステップ#
次は、表形式データに DL を適用する方法(MLP・Entity Embedding)を学びます。