你在这一课要弄清一个问题:参数原本只是一些数字,为什么经过训练后,它们会变成有用的模型?先不用大网络,用两个参数就可以看到整个过程。
先把预测和损失分开
设模型是 prediction = w × x + b。输入 x 是 2,正确答案 y 是 5,初始参数 w 是 1、b 是 0。模型给出的预测是 2,误差是 −3。如果用平方误差作为损失,L 就是 9。
预测回答“模型说什么”,损失回答“这次说得有多差”。损失必须是可用于优化的数值目标,它不是准确率,也不是一个参数。不同任务可以用不同损失,但训练需要把这个目标和参数连接起来。
用链式法则找到更新方向
把计算拆成三步:p = w×x+b,e = p−y,L = e²。反向计算时,先有 dL/de = 2e,再有 de/dp = 1,最后 dp/dw = x、dp/db = 1。
代入当前数值,dL/dw = 2×(−3)×2 = −12,dL/db = −6。这两个负数表示:在当前位置稍微增大 w 或 b,会让损失下降。它们是局部变化率,不是下一次参数应当直接取的值。
梯度下降使用 parameter = parameter − learning_rate × gradient。若学习率是 0.01,更新后 w=1.12、b=0.06,预测变成 2.3,损失变成 7.29。我们已经让模型往正确答案走近了一点。
用 PyTorch 核对这次计算
以下代码在已安装 PyTorch 的环境中可独立运行。输入、标签和初始参数都与手算保持一致。
import torch
w = torch.tensor(1.0, requires_grad=True)
b = torch.tensor(0.0, requires_grad=True)
x, y = 2.0, 5.0
loss = (w * x + b - y) ** 2
loss.backward()
print(loss.item(), w.grad.item(), b.grad.item())
with torch.no_grad():
w -= 0.01 * w.grad
b -= 0.01 * b.grad
print(((w * x + b - y) ** 2).item())
第一行输出应为 9、−12、−6;最后的损失接近 7.29。浮点数显示可能有微小误差。no_grad() 让更新参数这一步不进入新的求导图;真正训练多个批次时,还需要清空旧梯度。
这一步怎样延续到语言模型
micrograd 视频把同一条链式法则扩展到计算图和神经网络。你观看时,重点追踪一个参数的梯度,而不是一口气记住所有类和函数。
下一课会把预测目标换成“下一个字符”。参数会更多,损失也会换一种表达,但“前向预测 → 计算损失 → 反向求导 → 更新参数”的结构仍然成立。先确认自己能够解释上述四步,再往下走。