首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Transformer的PyTorch实现

之前研究了一番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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180901G0YBYI00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券