Transformer模型是什么?

前言
是一个利用注意力机制来提高模型训练速度的模型 。关于注意力机制可以参看这篇文章,可以说是完全基于自注意力机制的一个深度学习模型,因为它适用于并行化计算,和它本身模型的复杂程度导致它在精度和性能上都要高于之前流行的RNN循环神经网络 。
在本文中,我们将试图把模型简化一点,并逐一介绍里面的核心概念,希望让普通读者也能轻易理解 。
is All You Need: Is All You Need
1. 整体结构
首先介绍的整体结构,下图是用于中英文翻译的整体结构:
的整体结构,左图和右图
可以看到 由和两个部分组成,和都包含 6 个 block 。的工作流程大体如下:
第一步:获取输入句子的每一个单词的表示向量X,X由单词的 (就是从原始数据提取出来的) 和单词位置的相加得到 。
的输入表示
第二步:将得到的单词表示向量矩阵 (如上图所示,每一行是一个单词的表示x) 传入中,经过 6 个block 后可以得到句子所有单词的编码信息矩阵C,如下图 。单词向量矩阵用Xn×d表示,n 是句子中单词个数,d 是表示向量的维度 (论文中 d=512) 。每一个block 输出的矩阵维度与输入完全一致 。
编码句子信息
第三步:将输出的编码信息矩阵C传递到中,依次会根据当前翻译过的单词 1~ i 翻译下一个单词 i+1,如下图所示 。在使用的过程中,翻译到单词 i+1 的时候需要通过Mask (掩盖)操作遮盖住 i+1 之后的单词 。
预测
上图接收了的编码矩阵C,然后首先输入一个翻译开始符 "",预测第一个单词 "I";然后输入翻译开始符 "" 和单词 "I",预测单词 "have",以此类推 。这是使用时候的大致流程,接下来是里面各个部分的细节 。
2.的输入
中单词的输入表示x由单词 和位置 ( )相加得到 。
的输入表示
2.1 单词
单词的有很多种方式可以获取,例如可以采用 、Glove 等算法预训练得到,也可以在中训练得到 。
2.2 位置
中除了单词的,还需要使用位置表示单词出现在句子中的位置 。因为不采用 RNN 的结构,而是使用全局信息,不能利用单词的顺序信息,而这部分信息对于 NLP 来说非常重要 。所以中使用位置保存单词在序列中的相对或绝对位置 。
位置用PE表示,PE的维度与单词是一样的 。PE 可以通过训练得到,也可以使用某种公式计算得到 。在中采用了后者,计算公式如下:
其中,pos 表示单词在句子中的位置,d 表示 PE的维度 (与词一样),2i 表示偶数的维度,2i+1 表示奇数维度 (即 2i≤d, 2i+1≤d) 。使用这种公式计算 PE 有以下的好处:
将单词的词和位置相加,就可以得到单词的表示向量x,x就是的输入 。
3. Self-(自注意力机制)

上图是论文中的内部结构图,左侧为block,右侧为block 。红色圈中的部分为Multi-Head,是由多个Self-组成的,可以看到block 包含一个 Multi-Head,而block 包含两个 Multi-Head(其中有一个用到 ) 。Multi-Head上方还包括一个 Add & Norm 层,Add 表示残差连接 ( ) 用于防止网络退化,Norm 表示 Layer,用于对每一层的激活值进行归一化 。
因为Self-是的重点,所以我们重点关注 Multi-Head以及 Self-,首先详细了解一下 Self- 的内部逻辑 。
3.1 Self- 结构
Self- 结构
上图是 Self- 的结构,在计算的时候需要用到矩阵Q(查询),K(键值),V(值) 。在实际中,Self- 接收的是输入(单词的表示向量x组成的矩阵X) 或者上一个block 的输出 。而Q,K,V正是通过 Self- 的输入进行线性变换得到的 。
3.2 Q, K, V 的计算
Self- 的输入用矩阵X进行表示,则可以使用线性变阵矩阵WQ,WK,WV计算得到Q,K,V 。计算如下图所示,注意 X, Q, K, V 的每一行都表示一个单词 。