之前研究了一番Transformer模型,也有一个笔记Transformer学习笔记,现在我们用PyTorch实现。笔记链接:https://github.com/luozhouyang/machine-learning-notes/blob/master/transformer.ipynb
Word embedding的实现
这个已经是seq2seq最基本的操作了。PyTorch也有实现,直接调用即可:
Position encoding的实现
再回顾一下什么是Position encoding。我们知道Transformer模型由于没有使用RNN,必须使用额外的手段来获取文本序列的顺序(或者说位置)信息。我们的Position encoding(PE)就是实现这个目标而出现的。
Position encoding和Word embedding十分相似。Word embeddings是对词语的内容进行嵌入,而Position encoding是对词语的位置进行嵌入。所以,Position encoding还有个很流行的名字,叫做Position embedding。
下面我们看代码吧,然后讲解代码,你就可以弄懂其中的所有细节了。
Layer normalization的实现
Layer nomalization和Batch normalization的比较,在文章开头提到的笔记已经有说明了。
接下来就来实现它吧。
Scaled dot-product attention的实现
具体的原理在另一个笔记有提到。咱们现在实现它,这个代码也比较简单,根据论文的公式即可。唯一要注意的是,有个mask。
代码如下:
Multihead attention的实现
重点戏来啦,那就是multihead attention的实现。分析可以看文章开始提到的笔记。
代码如下:
Positional-wise feed forward network的实现
实际上就是一维卷积。代码如下:
Encoder的实现
编码器有6层,每一层的结构为EncoderLayer,总的编码器为Encoder。
代码如下:
Decoder的实现
Decoder也有6层,每一层的结构为DecoderLayer,整个解码器为Decoder。
代码如下:
Padding mask和sequence mask的实现
笔记有说到,这里的mask有两种。
代码如下:
Transformer的实现
现在把encoder和decoder组合起来,就行啦。
代码如下:
花了好几天时间读文章和看代码,基本上搞懂了,本来打算在这里把每一个细节都写清楚的,但是感觉好累。。。所以后面基本上没啥注释了。。。
对内容不清楚的或者有疑惑的,欢迎和我交流。
完整的代码:https://github.com/luozhouyang/machine-learning-notes/blob/master/transformer/transformer_pytorch.py
贴一些有用的链接供大家参考:
https://medium.com/@kolloldas/building-the-mighty-transformer-for-sequence-tagging-in-pytorch-part-i-a1815655cd8
https://medium.com/@kolloldas/building-the-mighty-transformer-for-sequence-tagging-in-pytorch-part-ii-c85bf8fd145
http://nlp.seas.harvard.edu/2018/04/03/attention.html
https://github.com/jadore801120/attention-is-all-you-need-pytorch
https://github.com/JayParks/transformer
领取专属 10元无门槛券
私享最新 技术干货