你好,我正在为语言建模实现一个 lstm 对于家庭作业,我处于亏损实施阶段。我们的讲师告诉我们使用 F.nll_loss,但序列被填充,我们必须考虑给出的掩码,该掩码告诉我们序列何时停止。
输入:
在不考虑掩码的情况下工作的幼稚实现:
import torch.nn.functional as F
loss = F.nll_loss(log_probas.transpose(1, 2), targets)
我一直在网上爬行并敲打着脑袋,但似乎无法找到有关如何将掩码纳入损失平均方案的答案。
答案 0 :(得分:1)
您可以重塑张量并使用掩码来选择未填充的标记,并计算损失
vocab_size = log_probas.size(-1)
log_probas = log_probas.view(-1, vocab_size)
target = target.view(-1)
mask = mask.view(-1).bool()
loss = F.nll_loss(log_probas[mask], targets[mask])