【问题标题】:Pytorch NLP sequence length of target in TransformerTransformer中目标的Pytorch NLP序列长度
【发布时间】:2020-12-31 03:52:20
【问题描述】:

我正在尝试理解 Transformer 的代码 (https://github.com/SamLynnEvans/Transformer)。

如果在“train”脚本中看到train_model函数,我想知道为什么需要使用与trg不同的trg_input序列长度:

trg_input = trg[:, :-1]

在这种情况下,trg_input 的序列长度是“seq_len(trg) - 1”。 这意味着 trg 就像:

<sos> tok1 tok2 tokn <eos>

而 trg_input 是这样的:

<sos> tok1 tok2 tokn    (no eos token)

请告诉我原因。

谢谢。

相关代码如下:

    for i, batch in enumerate(opt.train):
        src = batch.src.transpose(0, 1).to('cuda')
        trg = batch.trg.transpose(0, 1).to('cuda')

        trg_input = trg[:, :-1]
        src_mask, trg_mask = create_masks(src, trg_input, opt)
        preds = model(src, trg_input, src_mask, trg_mask)
        ys = trg[:, 1:].contiguous().view(-1)
        opt.optimizer.zero_grad()
        loss = F.cross_entropy(preds.view(-1, preds.size(-1)), ys, ignore_index=opt.trg_pad)
        loss.backward()
        opt.optimizer.step()


def create_masks(src, trg, opt):
    
    src_mask = (src != opt.src_pad).unsqueeze(-2)

    if trg is not None:
        trg_mask = (trg != opt.trg_pad).unsqueeze(-2)
        size = trg.size(1) # get seq_len for matrix
        np_mask = nopeak_mask(size, opt)
        if trg.is_cuda:
            np_mask.cuda()
        trg_mask = trg_mask & np_mask
        
    else:
        trg_mask = None
    return src_mask, trg_mask

【问题讨论】:

    标签: nlp pytorch mask transformer


    【解决方案1】:

    这是因为整个目标是根据我们目前看到的令牌生成下一个令牌。当我们得到预测时,看看模型的输入。我们不仅提供源序列,还提供目标序列直到我们当前的步骤Models.py 里面的模型长这样:

    class Transformer(nn.Module):
        def __init__(self, src_vocab, trg_vocab, d_model, N, heads, dropout):
            super().__init__()
            self.encoder = Encoder(src_vocab, d_model, N, heads, dropout)
            self.decoder = Decoder(trg_vocab, d_model, N, heads, dropout)
            self.out = nn.Linear(d_model, trg_vocab)
        def forward(self, src, trg, src_mask, trg_mask):
            e_outputs = self.encoder(src, src_mask)
            #print("DECODER")
            d_output = self.decoder(trg, e_outputs, src_mask, trg_mask)
            output = self.out(d_output)
            return output
    

    因此您可以看到forward 方法接收srctrg,它们分别被馈送到编码器和解码器。如果你看一下the original paper的模型架构,这会更容易掌握:

    “输出(右移)”对应代码中的trg[:, :-1]

    【讨论】:

      猜你喜欢
      • 2022-10-17
      • 2021-02-28
      • 2020-04-10
      • 2019-02-13
      • 1970-01-01
      • 2022-12-09
      • 2021-03-07
      • 2022-12-04
      • 2018-05-13
      相关资源
      最近更新 更多