自然语言处理N天-使用Pytorch实现Transformer第二节(模型整合)

从今天开始,我会再看一遍Transformer(这是第3遍了吧……)。
这次是依据Transformer 模型的 PyTorch 实现进行学习,再梳理一下Transformer模型的重点,最后用Pytorch实现。
本来想用AllenNLP一步到位,但是前天敲了一天发现不行,我对Pytorch不懂,同时还是不了AllenNLP,干脆从头再来。

在这里参考The Annotated Transformer进行实现。

  • 第一节完成各个模块的编写
  • 第二节完成模型的组成
  • 第三节运行训练和预测

这一节比较简单
注意,在运行测试的时候,报了一个错

“exp” not implemented for 'torch.LongTensor''

定位之后发现是在之前PositionalEnconding类,记得将那里的

position = torch.arange(0, max_len).unsqueeze(1)
div_term = torch.exp(torch.arange(0, d_model, 2) * -(math.log(10000.0) / d_model))

改为

position = torch.arange(0., max_len).unsqueeze(1)
div_term = torch.exp(torch.arange(0., d_model, 2) * -(math.log(10000.0) / d_model))

OK,继续实现模型

def make_model(src_vocab, tgt_vocab, N=6, d_model=512, h=8, d_ff=2048, dropout=0.1):
    c = copy.deepcopy
    attn = MultiHeadedAttention(h, d_model)
    ff = PositionwiseFeedForward(d_model, d_ff, dropout)
    position = PositionalEncoding(d_model, dropout)
    model = EncoderDecoder(
        Encoder(EncoderLayer(d_model, c(attn), c(ff), dropout), N),
        Decoder(DecoderLayer(d_model, c(attn), c(attn), c(ff), dropout), N),
        nn.Sequential(Embeddings(d_model, src_vocab), c(position)),
        nn.Sequential(Embeddings(d_model, tgt_vocab), c(position)),
        Generator(d_model, tgt_vocab)
    )
    for p in model.parameters():
        if p.dim() > 1:
            nn.init.xavier_uniform_(p)
    return model


if __name__ == '__main__':
    tmp_model = make_model(10, 10, 2)

到此,模型构建就完成了。

整体大致了解了,但是问题是让我徒手撸一个全新的 Transformer依旧不行,所以接下来就是加深对这个模型各部分实现的认识。

你可能感兴趣的:(自然语言处理N天-使用Pytorch实现Transformer第二节(模型整合))