Attention is all you need是一篇将 Attention 思想发挥到极致的论文,出自 Google。这篇论文中提出一个全新的模型,叫 Transformer,抛弃了以往深度学习任务里面使用到的 CNN 和 RNN。这个模型广泛应用于NLP领域,例如机器翻译,问答系统,文本摘要和语音识别等等方向。到目前为止仿佛有种此生不识Transformer,就称英雄也枉然的感觉。
在本文中,我们将研究Transformer模型,把它掰开揉碎,理解它的工作原理。
目录
1.概览
2.Encoder
3.Self-attention
4.Multi-head attention
5.Feed Forward Layer
6.Positional Encoding
7.Residuals
8.Decoder
9.Softmax Layer
10.Conclusion and Reference
1
概览
模型总览:
Transformer 整体结构宏观上看是一个Encoder-Decoder结构,下面的简化图展示了这样的基本结构。
这里以机器翻译为应用背景介绍下Transformer模型。上图中,模型的输入是对应一种语言的句子,输出是对应另一种语言的句子。
这里的主要结构是Encoder及Decoder。
-
Encoder: 顾名思义就是对输入句子Source进行编码,将输入句子通过非线性变换转化为中间语义表示向量。
-
Decoder: 根据句子Source的中间语义表示C和之前已经生成的历史信息,来生成i时刻的单词。
Encoder和Decoder都是可以堆叠的,原始论文中Encoder和Decoder分别是6层。
所有的Encoder在结构上都是相同的。每一个Encoder里面包含两个子层,分别是Self-Attention层和Feed-Forward层。
-
Self-Attention层主要用来帮助编码器在对特定的单词进行编码时查看输入句子中的其他单词。
-
Feed-Forward层接收来自Self-Attention的输入。
所有的Decoder在结构上也都是相同的。每一个Decoder拥有三个子层,除了刚刚介绍的 Self-Attention 和 Feed Forward 外,还有一层 Encoder-Decoder Attention 层(以下简称 Attention 层,区别于 Self-Attention)
-
Attention 层位于 Self-Attention 和 Feed Forward 层之间,主要用来帮助解码器将注意力集中在输入语句的相关部分。
后面我们会仔细研究上述各个结构。
2
Encoder
第一层Encoder的输入是句子中各个单词的Embedding。我们需要将每个输入单词转换成 Embedding向量。原始论文中向量维度是512。
Embedding 只发生在第一层的Encoder中,其他Encoder接收下层的输出作为输入。
输入序列中的每个 Embedding 向量都需要经过Encoder的 Self-Attention层和 Feed Forward层:
这里我们需要注意:在 Self-Attention 层中,这些单词之间存在依赖关系;但 Feed Forward 层没有依赖,所以可以在 Feed Forward 层并行化训练。
3
Self-Attenion
Self-Attention概念是由谷歌首次提出的,并成功应用于机器翻译。
假设我们现在要翻译下面的这个这句话:
“The animal didn't cross the street because it was too tired”
这个句子中的 it 指的是什么呢?是指 street 还是 animal 呢?这对人来说比较简单,但是对算法来说就没那么简单了。
而 Self-Attention 就可以解决这个问题,在处理 it 时会将它和 animal 联系起来。
我们来看一下它是怎么工作的。
Self-Attention允许当前处理的单词查看输入序列中的其他单词,从而寻找到有助于编码这个单词的线索。
以下图为例,展示了第五层Encoder的Self-Attention情况,颜色越深表明关联性越强。
可以看到在编码 it 时, Self-Attention 机制将The animal 和自身的 it 编码到新的 it 上。
Self-Attention细节
Self-Attention是如何做到的呢?
首先 ,对于每个单词及其Embedding向量,我们可以得到其它三个向量:查询向量(Querry)、键向量(Key)和值向量(Value)。
这些向量是通过单词的 Embedding 分别与对应的查询矩阵 WQ 、键矩阵 WK 和值矩阵 WV 相乘得来的。这些矩阵都是模型的参数。
原始论文中新向量是512/8=64维,其大小与矩阵的维度相关。
第二步 ,将当前单词的Query向量和其他单词的Key向量分别做内积,得到各自的分数。如下图中的Score所示,对Think单词做内积。
这个分数可理解为其它单词对当前单词的贡献度。也就是将一个单词编码到某个位置时,需要将多少注意力放在句子的位置部分。
第三步 ,将上述得到的分数做归一化处理。这里将分数除以 8(Value向量维度的平方根,原论文中为64维),然后Softmax它们加起来等于1。如下图中的Softmax。
Softmax分值越高表示与当前单词的相关性更大。
第四步 ,将每个单词的 Value向量乘以Softmax分数并相加得到一个汇总向量,这个向量便是Self-Attention 层的当前单词的输出向量。如图所示的 Z1 向量是Thinking的输出向量。
上面便是Self-Attention的分解计算过程,得到的各个单词的输出向量,直接输送给下一层的 Feed Forward层。
在实现过程中,是通过矩阵运算来完成的,这样可以提高计算效率。
首先是通过输入矩阵和参数矩阵得到查询矩阵、键矩阵和值矩阵。
然后用 softmax 计算权重,并加权求和:
4
Multi-Head Attention
Transformer对Self-Attention进行了扩展,采用了Multi-Head Attention。 Multi-Head Attention其实就是包含了多个Self-Attention层。 所以 Multi-Head Attention 有多个不同的查询矩阵、键矩阵和值矩阵,为单词提供了多个表示向量。
这里的Multi-Head指的就是Self-Attention层的数量。
Transformer中每层Multi-Head Attention都会使用512/64=8个独立的矩阵,所以每个单词也会得到 8 个独立的输出Z向量。这里Head=8。
但是 Feed Forward层并不需要 8 个矩阵,它只需要一个矩阵(每个单词对应一个向量)。所以我们将 8 个 Z 向量拼接起来,然后乘上另一个权值矩阵 W,得到后的矩阵可以输送给 Feed Forward层。
以上便是 Multi-Head Attention 的内容。
我们来看一下 Multi-Head Attention 的例子,以Head=2来看看不同的Attention把 it 编码到哪里去了。图示中的棕黄色和绿色分别表示Attention。
可以看到对于单词it,一个 Attention 关注了 animal,另一个专注了 tired。多层Attention很好的捕获了不同维度的语义信息。
5
Feed-Forward Layer
Feed-Fordward的作用是将Multi-Head Attention提炼好的向量再投影到一个更大的空间(论文里将空间放大了4倍),在那个大空间里可以更方便地提取需要的信息(使用Relu激活函数),最后再投影回token向量原来的空间。
这个可以借鉴SVM来理解:SVM对于比较复杂的问题通过将特征其投影到更高维的空间使得问题简单到一个超平面就能解决。这里token向量里的信息通过Feed Forward Layer被投影到更高维的空间,在高维空间里向量的各类信息彼此之间更容易区别,即使像ReLU这样的弟中弟也可以完成提取信息的任务。
6
Positional Encoding
其实到目前为止为了方便叙述,一直没有提及一个问题:Transformer无法将单词的次序信息学习到并编码到向量中。
为了解决这个问题,Transformer 向每个输入的 Embedding 向量添加一个位置向量,有助于确定每个单词的绝对位置,或与序列中不同单词的相对位置:
位置向量使用下面公式进行编码:
其中 为单词在句子里的位置, 为Embedding的维度, 为Embedding中的某一对应维度。
上面采用了静态方法对位置进行编码,这样处理优势有:
-
对于序列长度没有限制,可以随着序列长度的增加而动态增加,而且不需要学习参数。
-
对于任何位置的PE(pos+k),都可以由PE(pos)通过线性投影来得到,得益于我们的正弦余弦公式:
接着,将单词向量与位置向量相加,就得到Encoder的输入向量。
7
Residuals
这里还要提一个Encoder的细节,每个Encoder中的每个子层(Self-Attention, Feed Forward)都有一个围绕它的虚线,然后是一层 ADD & Normalize 的操作。
这个虚线其实就是一个残差,为了防止出现梯度消失问题。而 Add & Normalize 是指将上一层传过来的数据和通过残差结构传过来的数据相加,并进行归一化:
同样适用于Decoder的子层:
Layer Normalization的方法可以和Batch Normalization对比着进行理解,因为Batch Normalization不是Transformer中的结构,这里不做详解。
8
Decoder Side
Encoder首先处理输入序列,然后将顶部Encoder的输出转换成一组 Attention 矩阵 K 和 V,这两个矩阵主要是给每个Decoder的 "Encoder-Decoder Attention" 层使用的,这有助于Decoder将注意力集中在输入序列中的适当位置:
下图展示了翻译过程,不断重复此过程直到出现结束符号为止。像我们处理Encoder的输入一样,我们将输出单词的 Embedding 向量和位置向量合并,并输入到Decoder中,然后通过Decoder得到最终的输出结果。
Decoder的 Self-Attention 层操作方式与Encoder中的略有不同。
在Decoder中,Self-Attention 层 只允许注意到输出单词注意它前面的单词信息 。在实现过程中通过在将 Self-Attention 层计算的 Softmax 步骤时,屏蔽当前单词的后面的位置来实现的(设置为-inf)。
Decoder中的“Encoder-Decoder Attention”层的工作原理与 “Multi-Head Attention” 层类似,只是它从其下网络中创建查询矩阵,并从Encoder堆栈的输出中获取键和值矩阵(刚刚传过来的 K/V 矩阵)。
9
Softmax Layer
Decoder输出浮点数向量,怎么把它变成一个单词呢?这就是最后一层 Linear 和 Softmax 层的工作了。
Linear 层是一个简单的全连接网络,它将解码器产生的向量投影到一个更大的向量上,称为 logits 向量。
假设我们有 10,000 个不同的英语单词,这时 logits 向量的宽度就是 10,000 个单元格,每个单元格对应一个单词的得分。这就解释了模型是怎么输出的了。
然后利用 Softmax 层将这些分数转换为概率。概率最大的单元格对应的单词作为此时的输出。
10
总结
Transformer 提出了 Self-Attention 方式来代替 RNN 从而防止出现梯度消失和无法并行化的问题,并通过 Multi-Head Attention 机制集成了 Attention 丰富了特征的表达,最终在精度和速度上较 Seq2Seq 模型都有了很大的提升。
Transformer就介绍到这里了,后来的很多经典的模型比如BERT、GPT-2都是基于Transformer的思想。后续有机会再详细介绍这两个刷新很多记录的经典模型。
推荐阅读
太赞了!Springer面向公众开放电子书籍,附65本数学、编程、机器学习、深度学习、数据挖掘、数据科学等书籍链接及打包下载
深度学习如何入门?这本“蒲公英书”再适合不过了!豆瓣评分9.5!【文末双彩蛋!】
数学之美中盛赞的 Michael Collins 教授,他的NLP课程要不要收藏?
From Word Embeddings To Document Distances 阅读笔记
模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法
可解释性论文阅读笔记1-Tree Regularization
关于AINLP
AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。
以上所述就是小编给大家介绍的《图文带你深入理解Transformer原理》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。