为什么 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 可行,它可能会简单得多。但是我哪里错了?
编辑:
我正在使用一系列单词索引作为输入。输出与输入的序列相同。
据我了解 - 该模型不会阻止每个单词在多层上下文中间接“看到自己”。我尝试使用一层 - 看起来模型有效。但是训练太慢了。
我正在尝试通过用对角线 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 可行,它可能会简单得多。但是我哪里错了?
编辑:
我正在使用一系列单词索引作为输入。输出与输入的序列相同。
据我了解 - 该模型不会阻止每个单词在多层上下文中间接“看到自己”。我尝试使用一层 - 看起来模型有效。但是训练太慢了。