Python 现代开发学习笔记

(十一)批量均方误差与形状核对

现在同时读取两条样本:x=1、2,实际值为 3、5,初始仍为 w=1、b=0。预测为 1、2,误差为 -2、-3,平均损失为:

L=(−2)2+(−3)22=6.5. L=\frac{(-2)^2+(-3)^2}{2}=6.5.

对每条样本先按上一节求偏导,再取平均:

∂L∂w=2(−2)×1+2(−3)×22=−8. \frac{\partial L}{\partial w}=\frac{2(-2)\times1+2(-3)\times2}{2}=-8.

∂L∂b=2(−2)+2(−3)2=−5. \frac{\partial L}{\partial b}=\frac{2(-2)+2(-3)}{2}=-5.

# 项目文件:demos/batch_gradient.py
import torch
from torch import nn

x = torch.tensor([[1.0], [2.0]])
y = torch.tensor([[3.0], [5.0]])
w = torch.tensor(1.0, requires_grad=True)
b = torch.tensor(0.0, requires_grad=True)
prediction = x * w + b
loss = nn.MSELoss()(prediction, y)  # 两项平方误差 4、9 取平均。
loss.backward()
print("批损失", loss.item(), "梯度", w.grad.item(), b.grad.item())
# 少掉末尾这一轴后,广播会生成 2×2,改变了实际比较的对象。
wrong = prediction.detach().squeeze(1) - y
print("错误相减形状", tuple(wrong.shape), "错误平均", wrong.square().mean().item())

nn.MSELoss 默认取所有误差元素的平均。这里预测与目标都为 (2, 1),每行一一比较,得到 6.5、-8、-5。

如果把预测压成 (2,),却仍保留目标 (2, 1),相减会按广播变成 (2, 2):每个实际值都和两项预测比较,误差矩阵是 [[-2,-1],[-4,-3]],平方平均变为 7.5。程序成功运行,但任务已经变了。先写清“每条样本对应几个结果”,再核对两边形状。

两条样本各自形成误差和梯度再取平均,对照错误广播形成四个比较项的矩阵,解释六点五与七点五的差别

笔记正文与全部题解 · Ctrl / ⌘ K