在反向传播期间,这些案例会有不同的效果: -
我对数值的主要怀疑,但所有这些都会产生影响。
1号和2号之间的区别基本上是:由于sum
将导致大于mean
,因此sum
操作的梯度幅度将更大,但方向将相同。
这是一个小演示,让我们首先声明必要的变量:
x = torch.tensor([4,1,3,7],dtype=torch.float32,requires_grad=True)
target = torch.tensor([4,2,5,4],dtype=torch.float32)
现在让我们使用x
使用L2
损失计算sum
的梯度:
loss = ((x-target)**2).sum()
loss.backward()
print(x.grad)
输出:tensor([ 0., -2., -4., 6.])
现在使用mean
:(重置x
毕业后)
loss = ((x-target)**2).mean()
loss.backward()
print(x.grad)
这个输出:tensor([ 0.0000, -0.5000, -1.0000, 1.5000])
注意后来渐变是如何恰好是sum
的1/4,这是因为这里的张量包含4个元素。
关于第三种选择,如果我理解正确,那是不可能的。在使用sum
,mean
或其他任何内容将单个像素错误聚合到标量之前,您无法反向传播。