作者丨Alexander Rush来源丨哈工大SCIR编辑丨极市平台

导读

本文分享一篇来自哈佛大学关于Transformer的文章,作者为此文章写了篇注解文档,详细介绍了模型结构,训练过程并给出了可实现的Transformer的代码。本文仅作为研究人员和开发者的入门版教程。 下面分享一篇实验室翻译的来自哈佛大学一篇关于Transformer的详细博文。

"Attention is All You Need"[1] 一文中提出的Transformer网络结构最近引起了很多人的关注。Transformer不仅能够明显地提升翻译质量,还为许多NLP任务提供了新的结构。虽然原文写得很清楚,但实际上大家普遍反映很难正确地实现。

所以我们为此文章写了篇注解文档,并给出了一行行实现的Transformer的代码。本文档删除了原文的一些章节并进行了重新排序,并在整个文章中加入了相应的注解。此外,本文档以Jupyter notebook的形式完成,本身就是直接可以运行的代码实现,总共有400行库代码,在4个GPU上每秒可以处理27,000个tokens。

想要运行此工作,首先需要安装PyTorch[2]。这篇文档完整的notebook文件及依赖可在github[3] 或 Google Colab[4]上找到。

需要注意的是,此注解文档和代码仅作为研究人员和开发者的入门版教程。这里提供的代码主要依赖OpenNMT[5]实现,想了解更多关于此模型的其他实现版本可以查看Tensor2Tensor[6] (tensorflow版本) 和 Sockeye7

0. 准备工作

        # !pip install http://download.pytorch.org/whl/cu80/torch-0.3.0.post4-cp36-cp36m-linux_x86_64.whl numpy matplotlib spacy torchtext seaborn

内容目录

准备工作 背景 模型结构

  • Encoder和Decoder
  • Encoder
  • Decoder
  • Attention
  • Attention在模型中的应用
  • Position-wise前馈网络
  • Embedding和Softmax
  • 位置编码
  • 完整模型 (由于原文篇幅过长,其余部分在下篇) 训练
  • 批和掩码
  • 训练循环
  • 训练数据和批处理
  • 硬件和训练进度
  • 优化器
  • 正则化
  • 标签平滑 第一个例子
  • 数据生成
  • 损失计算
  • 贪心解码 真实示例
  • 数据加载
  • 迭代器
  • 多GPU训练
  • 训练系统附加组件:BPE,搜索,平均 结果
  • 注意力可视化 结论 本文注解部分都是以引用的形式给出的,主要内容都是来自原文。

1. 背景

减少序列处理任务的计算量是一个很重要的问题,也是Extended Neural GPU、ByteNet和ConvS2S等网络的动机。上面提到的这些网络都以CNN为基础,并行计算所有输入和输出位置的隐藏表示。 在这些模型中,关联来自两个任意输入或输出位置的信号所需的操作数随位置间的距离增长而增长,比如ConvS2S呈线性增长,ByteNet呈现以对数形式增长,这会使学习较远距离的两个位置之间的依赖关系变得更加困难。而在Transformer中,操作次数则被减少到了常数级别。

Self-attention有时候也被称为Intra-attention,是在单个句子不同位置上做的Attention,并得到序列的一个表示。它能够很好地应用到很多任务中,包括阅读理解、摘要、文本蕴涵,以及独立于任务的句子表示。端到端的网络一般都是基于循环注意力机制而不是序列对齐循环,并且已经有证据表明在简单语言问答和语言建模任务上表现很好。 据我们所知,Transformer是第一个完全依靠Self-attention而不使用序列对齐的RNN或卷积的方式来计算输入输出表示的转换模型。

2. 模型结构

目前大部分比较热门的神经序列转换模型都有Encoder-Decoder结构[9]。Encoder将输入序列 映射到一个连续表示序列 。 对于编码得到的z,Decoder每次解码生成一个符号,直到生成完整的输出序列: 。对于每一步解码,模型都是自回归的[10],即在生成下一个符号时将先前生成的符号作为附加输入。

Transformer的整体结构如下图所示,在Encoder和Decoder中都使用了Self-attention, Point-wise和全连接层。Encoder和decoder的大致结构分别如下图的左半部分和右半部分所示。

2. Encoder和Decoder

Encoder

Encoder由N=6个相同的层组成。

我们在每两个子层之间都使用了残差连接(Residual Connection) [11]和归一化 [12]。

每层都有两个子层组成。第一个子层实现了“多头”的 Self-attention,第二个子层则是一个简单的Position-wise的全连接前馈网络。

Dncoder

Decoder也是由N=6个相同层组成。

除了每个编码器层中的两个子层之外,解码器还插入了第三种子层对编码器栈的输出实行“多头”的Attention。 与编码器类似,我们在每个子层两端使用残差连接进行短路,然后进行层的规范化处理。

3. Attention

“多头”机制能让模型考虑到不同位置的Attention,另外“多头”Attention可以在不同的子空间表示不一样的关联关系,使用单个Head的Attention一般达不到这种效果。

4. Attention在模型中的应用

Transformer中以三种不同的方式使用了“多头”Attention:

  1. 在"Encoder-Decoder Attention"层,Query来自先前的解码器层,并且Key和Value来自Encoder的输出。Decoder中的每个位置Attend输入序列中的所有位置,这与Seq2Seq模型中的经典的Encoder-Decoder Attention机制[15]一致。

  2. Encoder中的Self-attention层。在Self-attention层中,所有的Key、Value和Query都来同一个地方,这里都是来自Encoder中前一层的输出。Encoder中当前层的每个位置都能Attend到前一层的所有位置。

  3. 类似的,解码器中的Self-attention层允许解码器中的每个位置Attend当前解码位置和它前面的所有位置。这里需要屏蔽解码器中向左的信息流以保持自回归属性。具体的实现方式是在缩放后的点积Attention中,屏蔽(设为负无穷)Softmax的输入中所有对应着非法连接的Value。

5. Position-wise前馈网络

6. Embedding和Softmax

7. 位置编码

我们也尝试了使用预学习的位置Embedding,但是发现这两个版本的结果基本是一样的。我们选择正弦曲线版本的实现,因为使用此版本能让模型能够处理大于训练语料中最大序了使用列长度的序列。

8. 完整模型

下面定义了连接完整模型并设置超参的函数。

END. 参考链接

[1] https://arxiv.org/abs/1706.03762 [2] https://pytorch.org/ [3] https://github.com/harvardnlp/annotated-transformer [4] https://drive.google.com/file/d/1xQXSv6mtAOLXxEMi8RvaW8TW-7bvYBDF/view?usp=sharing [5] http://opennmt.net [6] https://github.com/tensorflow/tensor2tensor [7] https://github.com/awslabs/sockeye [8] https://twitter.com/harvardnlp [9] https://arxiv.org/abs/1409.0473 [10] https://arxiv.org/abs/1308.0850 [11] https://arxiv.org/abs/1512.03385 [12] https://arxiv.org/abs/1607.06450 [13] https://arxiv.org/abs/1409.0473 [14] https://arxiv.org/abs/1703.03906 [15] https://arxiv.org/abs/1609.08144 [16] https://arxiv.org/abs/1608.05859 [17] https://arxiv.org/pdf/1705.03122.pdf

原文 :http://nlp.seas.harvard.edu/2018/04/03/attention.html

本文仅做学术分享,如有侵权,请联系删文。

成为VIP会员查看完整内容
105

相关内容

Transformer是谷歌发表的论文《Attention Is All You Need》提出一种完全基于Attention的翻译架构

知识荟萃

精品入门和进阶教程、论文和代码整理等

更多

查看相关VIP内容、论文、资讯等
【KDD2022教程】Transformers多模态数据分类,41页ppt
专知会员服务
83+阅读 · 2022年8月18日
深度学习简史:从感知机到Transformer
专知会员服务
95+阅读 · 2022年6月1日
最新《Transformers模型》教程,64页ppt
专知会员服务
274+阅读 · 2020年11月26日
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
67+阅读 · 2020年1月17日
【干货】用BRET进行多标签文本分类(附代码)
专知会员服务
84+阅读 · 2019年12月27日
我用Transformer修复代码bug
夕小瑶的卖萌屋
1+阅读 · 2021年9月9日
一文读懂自注意力机制:8大步骤图解+代码
新智元
153+阅读 · 2019年11月26日
从头开始了解Transformer
AI科技评论
24+阅读 · 2019年8月28日
百闻不如一码!手把手教你用Python搭一个Transformer
大数据文摘
18+阅读 · 2019年4月22日
深度学习500问!一份火爆GitHub的面试手册
人工智能前沿讲习班
40+阅读 · 2019年3月18日
干货 | BERT fine-tune 终极实践教程
AINLP
40+阅读 · 2018年11月24日
可视化循环神经网络的注意力机制
论智
22+阅读 · 2018年9月23日
国家自然科学基金
0+阅读 · 2015年12月31日
国家自然科学基金
0+阅读 · 2014年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
2+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
0+阅读 · 2008年12月31日
Arxiv
0+阅读 · 2022年8月19日
Arxiv
39+阅读 · 2021年11月11日
Arxiv
19+阅读 · 2021年4月8日
Arxiv
17+阅读 · 2021年3月29日
Arxiv
19+阅读 · 2020年12月23日
Arxiv
15+阅读 · 2020年2月5日
VIP会员
相关VIP内容
【KDD2022教程】Transformers多模态数据分类,41页ppt
专知会员服务
83+阅读 · 2022年8月18日
深度学习简史:从感知机到Transformer
专知会员服务
95+阅读 · 2022年6月1日
最新《Transformers模型》教程,64页ppt
专知会员服务
274+阅读 · 2020年11月26日
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
67+阅读 · 2020年1月17日
【干货】用BRET进行多标签文本分类(附代码)
专知会员服务
84+阅读 · 2019年12月27日
相关资讯
我用Transformer修复代码bug
夕小瑶的卖萌屋
1+阅读 · 2021年9月9日
一文读懂自注意力机制:8大步骤图解+代码
新智元
153+阅读 · 2019年11月26日
从头开始了解Transformer
AI科技评论
24+阅读 · 2019年8月28日
百闻不如一码!手把手教你用Python搭一个Transformer
大数据文摘
18+阅读 · 2019年4月22日
深度学习500问!一份火爆GitHub的面试手册
人工智能前沿讲习班
40+阅读 · 2019年3月18日
干货 | BERT fine-tune 终极实践教程
AINLP
40+阅读 · 2018年11月24日
可视化循环神经网络的注意力机制
论智
22+阅读 · 2018年9月23日
相关基金
国家自然科学基金
0+阅读 · 2015年12月31日
国家自然科学基金
0+阅读 · 2014年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
2+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2011年12月31日
国家自然科学基金
0+阅读 · 2008年12月31日
相关论文
微信扫码咨询专知VIP会员