如果通常应平均梯度(而不是损失),为什么要平均批次中所有元素的损失?

问题描述 投票:1回答:1

我的loss输出是

tensor([0.0430, 0.0443, 0.0430, 0.0430, 0.0443, 0.0466, 0.0466, 0.0466],
       grad_fn=<AddBackward0>)

[执行loss.backward()时,我获得了*** RuntimeError: grad can be implicitly created only for scalar outputs

[在某些地方,他们建议使用loss.mean().backward()loss.sum().backward()

为什么使用.mean().backward(),即,如果通常应平均梯度(而不是损失),为什么要对批次中所有元素的损失求平均?

这里是我的code

python pytorch gradient
1个回答
0
投票

由于默认情况下,当在标量上调用它时,会将[1]作为后向函数的输入传递。如果它是一个具有多个元素的张量,则应将[1,1,....1]作为输入传递给后向。

loss.backward(torch.Tensor([1, 1, 1, 1, 1, 1, ... ,1])) 

loss.backward(torch.ones(batch_size)) 

个数=您所用一维张量中的元素数。

回答为什么我们使用均值和全部,因为它充当归一化术语。我们没有使单个批次的所有损失受到巨大影响,而是将其影响归一化。这有问题吗?不会。相反,通过缩放比例,我们对损耗曲线的行为有了更合理的认识。

© www.soinside.com 2019 - 2024. All rights reserved.