【发布时间】:2020-10-10 14:11:26
【问题描述】:
我正在尝试通过使用对角线 src_mask 屏蔽单词本身来使用 Transformer 编码器训练单词嵌入:
def _generate_square_subsequent_mask(self, sz):
mask = torch.diag(torch.full((sz,),float('-inf')))
return mask
def forward(self, src):
if self.src_mask is None or self.src_mask.size(0) != len(src):
device = src.device
mask = self._generate_square_subsequent_mask(len(src)).to(device)
self.src_mask = mask
src = self.embedding(src) * math.sqrt(self.ninp)
src = self.dropout(src)
src = self.pos_encoder(src)
src = self.transformer_encoder(src, self.src_mask)
output = self.decoder(src) # Linear layer
return output
训练后,模型从输入中预测出完全相同的句子。如果我更改输入中的任何单词 - 它会预测新单词。所以模型不会根据掩码进行阻塞。
为什么会这样?
我知道我的逻辑存在错误,因为如果 BERT 有效,它可能会简单得多。但是我哪里错了?
编辑:
我使用一系列单词索引作为输入。输出与输入的顺序相同。
【问题讨论】:
-
你使用什么作为输入和输出?
-
请查看我的编辑
-
您的预测代码是什么样的?你的注意力面具很可疑。考虑一下如果输入序列的长度为 1 会发生什么。
标签: pytorch word-embedding transformer