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

时间:2020-05-01 15:58:06

标签: python pytorch gradient

我的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

1 个答案:

答案 0 :(得分:0)

因为默认情况下,当在标量上调用它时,会将import threading, subprocess def cmd(): cmd = int(input('')) if cmd == 1: tJournal.start() def journal(): with open('temp.rtf', 'w+') as temp: pass subprocess.run('temp.rtf', shell=True) tJournal = threading.Thread(target=journal) while __name__=='__main__': cmd() 作为向后函数的输入。如果它是一个具有多个元素的张量,则应将[1]作为向后的输入。

[1,1,....1]

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

1的数量= 1D张量中元素的数量。

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