我正在尝试实现一个类似于论文的自回归变压器模型,attention is all you need。据我了解,为了完全复制架构,我需要给变压器解码器 3 个掩码。
目标后续掩码:这是为了因果关系。
目标填充索引:仅查看非填充索引。
编码器填充索引:仅查看来自编码器的非填充输入。
片段在这里:
y = self.decoder(y, x,
tgt_mask=tgt_causal_mask,
tgt_key_padding_mask=tgt_padding_mask,
memory_key_padding_mask=src_padding_mask)
像这样生成掩码:
def generate_no_peek_mask(self, sz):
mask = (torch.triu(torch.ones(sz, sz)) == 1).transpose(0, 1)
mask = mask.float().masked_fill(mask == 0, float("-inf")).masked_fill(mask == 1, float(0.0))
mask = mask.to(self.device)
return mask
def generate_padding_mask(self, seq, pad_idx):
return (seq != pad_idx).to(self.device)
问题是使用这些掩码会因为 NaN 值而导致 Softmax 函数出现问题。没有这些掩码,模型不会生成任何 NaN 值。我试过玩弄各种输入长度,看看当我确保我的输入适度大时会发生什么,但它仍然不起作用。唯一有效的方法是不给解码器提供掩码。