对于key padding mask ,它在 Transformer 中有3个地方被用到,也就是图1中横着看的第二大块;而 attention mask 则只会被用在解码器中的 Masked-multi Head Attention 中。 那现在问题来,Decoder 中的 tgt key padding mask 是否真是可以不用呢? 3 tgt key padding mask 真的可以不用吗? 真的可以不用。
再看pytorch中的Transformer组成:nn.Transformer是一个完整的Transformer模型;nn.TransformerEncoder、nn.TransformerDecoder分别为编码器、解码器。并各自由多个nn.TransformerXXcoderLayer组成 nn.Transformer,执行一次Encoder、执行一次Decoder,结束。注意mask一共有两种(xx_mask和xx_key_padding_mask),有三类(src_xx,tgt_...
tgt, tgt_mask)defencode(self, src, src_mask):# 先对输入进行embedding,然后再经过encoderreturnself.encoder(self.src_embed(src), src_mask)defdecode(self, memory, src_mask, tgt, tgt_mask):# 先对目标进行embedding,然后经过decoderreturnself.decoder(self.tgt_embed(tgt), memory, src_mask, tgt_...
在训练阶段,预测序列是直接全部喂到decoder的输入的,只是在算self-attention的时候加了一个mask,前面时间步的不能看到后面时间步的词,decoder的预测也是一次就全部出来了,也就是Teacher Forcing机制,如下图所示,在训练的时候,需要预测一段语音,decoder端的input,就直接把gt喂进去了,当然加进去前还需要shift right,在...
x = self.sublayer[0](x, lambda x: self.self_attn(x, x, x, tgt_mask)) # 这里使用的是 Self-Attention 机制,其实 m 是encoder的输出,x是decoder第一部分的输出, # 因为上面一部分的输出中, 未被预测的单词的 query 其实是 0(padding), 那么在这里可以直接使用 src_mask ...
self.decoder = decoder self.src_embed = src_embed self.tgt_embed = tgt_embed self.generator = generator def forward(self, src, tgt, src_mask, tgt_mask): "Take in and process masked src and target sequences." return self.decode(self.encode(src, src_mask), src_mask, tgt, tgt_mask...
使得 decoder 只能看到目标序列的一部分(前缀),不能看见未来的信息。即对于一个序列,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。这就是Sequence mask。可以将这个过程想象为一个时间线:在预测一个特定的词时,你不能“预知”它之后的词汇,因为在实际情境中,之后的部分尚未发生。
self.decoder=decoder self.src_embed=src_embed self.tgt_embed=tgt_embed self.generator=generator defforward(self,src,tgt,src_mask,tgt_mask):"Take in and process masked src and target sequences."returnself.decode(self.encode(src,src_mask),src_mask,tgt,tgt_mask)defencode(self,src,src_mask)...
tgt_mask = torch.tril(torch.ones(max_len, max_len)).unsqueeze(0) == 0 # 将输入张量传递到DecoderLayer output = decoder_layer(input_sequence, encoder_output, src_mask, tgt_mask) # 输出形状 print('Output shape:', output.shape)
这里面最大的区别就是*mask_和*_key_padding_mask,_至于*是src还是tgt,memory,这不重要,模块出现在encoder,就是src,出现在decoder,就是tgt,decoder每个block的第二层和encoder做cross attention的时候,就是memory。 *mask 对应的API是attn_mask,*_key_padding_mask对应的API是key_padding_mask ...