从今天开始,我会再看一遍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依旧不行,所以接下来就是加深对这个模型各部分实现的认识。