在nn.CrossEntropyLoss(reduction='none')中的问题
taishan1994 opened this issue · 3 comments
在训练中:loss.backward()会报错:
grad can be implicitly created only for scalar outputs
意思是nn.CrossEntropyLoss(reduction='none')这里计算的损失是每一个token的,返回的是一个张量loss,而loss.backward()中的loss需要一个标量,请问存在这种问题吗?
在训练中:loss.backward()会报错:
grad can be implicitly created only for scalar outputs
意思是nn.CrossEntropyLoss(reduction='none')这里计算的损失是每一个token的,返回的是一个张量loss,而loss.backward()中的loss需要一个标量,请问存在这种问题吗?
你如果不需要对loss进行操作,直接用默认的mean就可以了,不要用none
在训练中:loss.backward()会报错:
grad can be implicitly created only for scalar outputs
意思是nn.CrossEntropyLoss(reduction='none')这里计算的损失是每一个token的,返回的是一个张量loss,而loss.backward()中的loss需要一个标量,请问存在这种问题吗?你如果不需要对loss进行操作,直接用默认的mean就可以了,不要用none
了解了,感谢您的回复。
在训练中:loss.backward()会报错:
grad can be implicitly created only for scalar outputs
意思是nn.CrossEntropyLoss(reduction='none')这里计算的损失是每一个token的,返回的是一个张量loss,而loss.backward()中的loss需要一个标量,请问存在这种问题吗?
是的, 这里原始的代码有问题, 在 model_utils.py 中的 283行
reduction = 'none'
if loss_type == 'ce':
self.criterion = nn.CrossEntropyLoss(reduction=reduction)
这里不应该将 reduction 设为 ‘none’, 而是使用 default 即‘mean’. 这样才可以使用反向传播.