(十一)批量均方误差与形状核对
现在同时读取两条样本:x=1、2,实际值为 3、5,初始仍为 w=1、b=0。预测为 1、2,误差为 -2、-3,平均损失为:
对每条样本先按上一节求偏导,再取平均:
# 项目文件: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。程序成功运行,但任务已经变了。先写清“每条样本对应几个结果”,再核对两边形状。