MODULE 06 · PROGRESS 0%
PyTorch:第一次亲眼看见“权重被更新”
不追求数学推导,先用最小神经网络理解张量、前向、Loss、反向传播、优化器。
6.1 Tensor
Tensor 可以看成带有形状和数据类型的多维数组。模型权重、输入 token embedding、attention 矩阵最终都是 tensor。你最先要会看 shape、dtype、device。训练中大量 bug 本质上就是 shape 或 device 不一致。
6.2 参数与前向传播
神经网络里的 Linear 层有可训练 weight 和 bias。输入经过层得到预测,这叫 forward。此时只是“算答案”,参数还没有改变。
6.3 Loss
Loss 把预测和目标之间的错误压成一个可优化的数字。语言模型常用 cross entropy。Loss 下降通常说明模型在训练数据分布上学到了东西,但 Loss 下降不等于实际任务一定变好,因此后面必须配 Eval。
6.4 backward()
PyTorch 的 autograd 会记录运算图。loss.backward() 计算每个参数对 Loss 的梯度。optimizer.step() 根据梯度更新参数,optimizer.zero_grad() 清掉旧梯度。训练循环最核心就是这几步不断重复。
6.5 学习率
学习率决定每次更新步长。过大可能震荡甚至发散,过小可能几乎学不动。你以后看到训练 Loss 突然 NaN,学习率、数值精度、异常数据都值得检查。
本课最小代码 / 结构
import torch
x = torch.tensor([[1.],[2.],[3.],[4.]])
y = 2*x + 1
model = torch.nn.Linear(1,1)
opt = torch.optim.SGD(model.parameters(), lr=0.05)
for step in range(200):
pred = model(x)
loss = ((pred-y)**2).mean()
opt.zero_grad()
loss.backward()
opt.step()
if step % 20 == 0:
print(step, loss.item())动手实验:不做完不算学完
常见错误 / 排错提醒
- 只盯训练 Loss,不做任务 Eval
- 忘记 optimizer.zero_grad 导致梯度累积
- CPU tensor 和 GPU tensor 混用
本课验收产物
一个几十行的 PyTorch 小实验,证明参数确实在训练中被改变。