为什么 pytorch transformer src_mask 不阻止职位参加?

Why pytorch transformer src_mask doesn't block positions from attending?

我正在尝试通过用对角线 src_mask:

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 可行,它可能会简单得多。但是我哪里错了?

编辑:

我正在使用一系列单词索引作为输入。输出与输入的序列相同。

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