(DecoderLayer, self).__init__() self.size = size self.self_attn = self_attn self.src_attn = src_attn self.feed_forward = feed_forward self.sublayer = clones(SublayerConnection(size, dropout), 3) def forward(self, x, memory, src_mask, tgt_mask): "Follow Figure 1 (right) for ...
def forward(self, x, memory,src_mask, tgt_mask): #forward函数中的参数有4个,x代表目标数据的嵌入表示,memory是编码器层的输出,source_mask,target_mask代表源数据和目标数据的掩码张量,然后就是对每个层进行循环,当然这个循环就是变量x通过每一个层的处理,得出最后的结果,再进行一次规范化返回即可。 for la...
tgt_mask = (tgt != pad).unsqueeze(-2) tgt_mask = tgt_mask & Variable( subsequent_mask(tgt.size(-1)).type_as(tgt_mask.data)) return tgt_mask 笔者注:接下来我们创建一个通用的训练和评分函数来跟踪损失。我们传递了一个通用的损失计算函数,它也处理参数更新。 训练循环 def run_epoch(data_ite...
tgt_len]。在后续实现过程中,我们将通过generate_square_subsequent_mask方法来生成这样一个矩阵。同时,...
x = self.sublayer[0](x,lambdax: self.self_attn(x, x, x, tgt_mask)) #接着进入第二个子层,这个子层中常规的注意力机制,q是输入x;k,v是编码层输出memory,同样也传入source_mask,但是进行源数据遮掩的原因并非是抑制信息泄露,而是遮蔽掉对结果没有意义的padding。
def forward(self, query, key, value, attn_mask=None, key_padding_mask=None): """ 在论文中,编码时query, key, value 都是同一个输入, 解码时 输入的部分也都是同一个输入, 解码和编码交互时 key,value指的是 memory, query指的是tgt :param query: # [tgt_len, batch_size, embed_dim], tgt...
(x, x, x, tgt_mask))# 这里使用的是 Self-Attention 机制,其实 m 是encoder的输出,x是decoder第一部分的输出,# 因为上面一部分的输出中, 未被预测的单词的 query 其实是 0(padding), 那么在这里可以直接使用 src_maskx = self.sublayer[1](x,lambdax: self.src_attn(x, m, m, src_mask))# ...
returnmask #设置对<PAD>的注意力为0 def pad_mask(data, pad=0): 'Mask out pad positions.' mask = (data!=pad).unsqueeze(-2) returnmask #计算一个batch数据的src_mask和tgt_mask class MaskedBatch: 'Object for holding a batch of data with mask during training.' ...
x = self.sublayer[0](x, lambda x: self.self_attn(x, x, x, tgt_mask)) #接着进入第二个子层,这个子层中常规的注意力机制,q是输入x;k,v是编码层输出memory,同样也传入source_mask,但是进行源数据遮掩的原因并非是抑制信息泄露,而是遮蔽掉对结果没有意义的padding。
x = layer(x, memory, src_mask, tgt_mask) return self.norm(x) 4.2 解码器层 每个解码器层由三个子层连接结构组成,第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接,第二个子层连接结构包括一个多头注意力子层和规范化层以及一个残差连接,第三个子层连接结构包括一个前馈全连接...