【问题标题】:Why pytorch transformer src_mask doesn't block positions from attending?为什么 pytorch 转换器 src_mask 不阻止职位参加?
【发布时间】: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


【解决方案1】:

据我了解 - 该模型不会阻止每个单词在多层上下文中间接“看到自己”。我尝试使用一层 - 看起来模型有效。但是训练太慢了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-01
    • 1970-01-01
    • 2023-03-16
    • 2011-05-20
    • 2018-10-04
    • 2019-12-25
    • 1970-01-01
    相关资源
    最近更新 更多