z814081807/DeepNER

在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’. 这样才可以使用反向传播.