9.7.3 损失函数
回忆一下,super(MaskedSoftmaxCELoss, self).forward
就相当于直接计算损失函数,这是nn.Module
的普遍做法;还要注意nn.CrossEntropyLoss
会对传入的数据做\(\text{Softmax}\),不需要我们传入一个已经做了\(\text{Softmax}\)的数据
nn.CrossEntropyLoss
的输入要求如下
unweighted_loss
的形状是(batch_size, num_steps)
,也就是对应每一个样本的每一步的直接的交叉熵损失
weighted_loss
那一行,应该不是mean
,应该是先sum
之后再除以有效样本长度。评论区有人提出,但是没有明确回答,不知道是不是应该改(但其实感觉好像也有问题,因为预测输出和标签的长度可能不一致,那么有效样本长度到底该取哪一个呢?)。感觉可能不改,从后面的训练来看,这里传入的valid_len
是标签的有效长度,因为输出的长度可能完全跟标签不一样,这样子就无法确定分母到底是谁的长度