Transformer原理详解:从整体架构到Self-Attention机制
Transformer原理详解:从整体架构到Self-Attention机制
Transformer是谷歌在2017年提出的革命性模型,通过引入自注意力机制(self-attention mechanism),在自然语言处理(NLP)领域取得了突破性进展。本文将从整体架构、Encoder和Decoder的结构与工作流程等方面,深入讲解Transformer的核心原理。
一、Transformer的整体架构
在机器翻译任务中,Transformer能够将一种语言转换为另一种语言。如果将Transformer视为一个黑盒,那么其内部主要由多个编码器(Encoder)和解码器(Decoder)组成,原论文中分别使用了6个。下图展示了Transformer的整体框架:
从图中可以看出,Encoder包含一个多头注意力(Multi-Head Attention)模块,而Decoder包含两个Multi-Head Attention。在Multi-Head Attention上方还包括一个Add & Norm层,其中Add表示残差连接(Residual Connection),用于防止网络退化;Norm表示层归一化(Layer Normalization),用于对每一层的激活值进行归一化。
Transformer的工作流程可以分为以下三个步骤:
- 获取输入句子的每一个单词的表示向量:由单词的Embedding和单词位置Embedding相加得到。
- 将单词向量矩阵传入Encoder模块:经过N个Encoder后得到句子所有单词的编码信息矩阵。
- 将Encoder输出的编码矩阵传递到Decoder中:Decoder会根据当前翻译过的单词预测下一个单词。
以将"我有一只猫"翻译为"I have a cat"为例,Decoder的输入首先是一个开始符"
二、Encoder
下图展示了编码器(Encoder)的结构:
2.1 输入
Encoder的输入由单词Embedding和位置Embedding相加得到:
2.1.1 单词Embedding
单词的Embedding可以通过Word2vec等模型预训练得到。在Transformer中,可以加入Embedding层,将输入的句子Embedding为矩阵,其中每个单词Embedding为向量。
2.1.2 位置Embedding
由于Transformer不采用RNN结构,而是使用全局信息,因此不能利用单词的顺序信息。为了解决这个问题,Transformer使用位置Embedding来保存单词在序列中的相对或绝对位置。位置Embedding的维度与单词Embedding相同,可以通过训练得到,也可以使用某种公式计算得到。在Transformer中采用了后者,计算公式如下:
其中,表示单词在句子中的位置,表示的维度。
2.2 内部结构
在Encoder模块中,主要包括一个Multi-Head Attention + Add&Norm模块,以及一个Feed Forward + Add&Norm模块。
2.2.1 Multi-Head Attention(多头注意力机制)
Multi-Head Attention是由多个Self-Attention组成,具体结构如下图,其中左图为Self-Attention,右图为多个注意力头组成的多头注意力Multi-Head Attention。
Self-Attention的内部逻辑:
Self-Attention的输入由Q(查询)、K(键)和V(值)组成,其中Q、K和V是通过输入矩阵和(学习得到的)权重矩阵、、相乘得到的:
得到Q、K和V后,就可以计算出Self-Attention的输出。矩阵Z的行数代表句子中单词的个数。计算公式如下:
为了防止内积过大,因此除以的平方根。Q乘以K的转置后,得到的矩阵行列数都为n,n为句子单词数,这个矩阵可以表示单词之间的Attention强度。下图为Q乘以,1234表示的是句子中的单词:
得到之后,使用Softmax计算每一个单词对于其他单词的Attention系数,公式中的Softmax是对矩阵的每一行进行Softmax,即每一行的和都变为1:
得到Softmax矩阵之后可以和V相乘,得到最终的输出Z:
上图中Softmax矩阵的第1行表示单词1与其他所有单词的Attention系数,最终单词1的输出等于所有单词的值根据Attention系数的比例加在一起得到。
Multi-Head Attention:
在上一步,我们已经知道怎么通过Self-Attention计算得到输出矩阵Z,而Multi-Head Attention是由多个Self-Attention组合形成的。下图是Multi-Head Attention的结构图:
可以看出,Multi-Head Attention是由个Self-Attention堆叠而成的。这个Self-Attention的权重矩阵、、不相同,将输入分别传入个Self-Attention中,然后分别计算得出。下图是的情况,此时会得出8个输出矩阵:
在得到8个输出矩阵后,Multi-Head Attention将它们拼接在一起(Concat),然后传入一个Linear层,得到Multi-Head Attention最终的输出矩阵(可以看出输出矩阵Z与输入矩阵X的维度相同):
2.2.2 Add & Norm
Add指X+MultiHeadAttention(X),是一种残差连接,通常用于解决多层网络训练的问题,可以让网络只关注当前差异的部分,在ResNet中经常用到。
Norm指Layer Normalization,也即层归一化,通常用于RNN结构,Layer Normalization会将每一层神经元的输入都转成均值方差都相等,这样可以加快收敛。
2.2.3 Feed Forward(前向传播网络)
Feed Forward层比较简单,是一个两层的全连接层,第一层的激活函数为Relu,第二层不使用激活函数,对应的公式如下:
2.2.4 Add & Norm
Add指X+MultiHeadAttention(X),是一种残差连接,通常用于解决多层网络训练的问题,可以让网络只关注当前差异的部分,在ResNet中经常用到。
Norm指Layer Normalization,也即层归一化,通常用于RNN结构,Layer Normalization会将每一层神经元的输入都转成均值方差都相等,这样可以加快收敛。
2.3 输出
按照从2.1-2.2的顺序执行一遍后,即完成一个Encoder的编码,循环6次后,完成整个Encoder的编码,最后输出编码信息矩阵C。
第一个Encoder的输入为句子单词的表示向量矩阵,后续Encoder的输入是前一个Encoder的输出。所有Encoder的输入矩阵和输出矩阵维度相同,为(n, d),其中n为句子中单词的个数,d为向量的维度(在论文中,d = 512)。
三、Decoder
下图展示了译码器(Decoder)的结构:
3.1 输入
Decoder模块的输入主要由三部分组成:
- Encoder编码器输出的编码信息矩阵C;
- 前一时刻的Decoder(走完所有流程的完整的Decoder)输出;
- 位置Embedding
3.2 内部结构
Decoder与Encoder在结构上很相似,但是存在一些细微区别:
- 包含两个Multi-Head Attention层。
- 第一个Multi-Head Attention层采用了Masked操作。
- 第二个Multi-Head Attention层的K, V矩阵使用Encoder的编码信息矩阵C进行计算,而Q使用上一个Decoder block的输出计算。
- 最后有一个Softmax层计算下一个翻译单词的概率。
3.2.1 Masked Multi-Head Attention
Decoder的第一个Multi-Head Attention采用了Masked操作,因为在翻译的过程中是顺序翻译的,即翻译完第i个单词,才可以翻译第i+1个单词。通过Masked操作可以防止第i个单词知道i+1个单词之后的信息。下面以"我有一只猫"翻译成"I have a cat"为例,了解一下Masked操作。
在Decoder的时候,是需要根据之前的翻译,求解当前最有可能的翻译,如下图所示。首先根据输入"
在预测第i个输出时,就要将第i+1之后的单词掩盖住,注意Mask操作是在Self-Attention的Softmax之前使用的,下面用0 1 2 3 4 5分别表示"
第一步:是Decoder的输入矩阵和Mask矩阵,输入矩阵包含"
第二步:接下来的操作和之前的Self-Attention一样,通过输入矩阵X计算得到Q,K和V矩阵。然后计算和的乘积。
第三步:在得到之后需要进行Softmax,计算attention score,我们在Softmax之前需要使用Mask矩阵遮挡住每一个单词之后的信息,遮挡操作如下:
得到Mask之后在上进行Softmax,每一行的和都为1。但是单词0在单词1, 2, 3, 4上的attention score都为0。
第四步:使用与矩阵V相乘,得到输出Z,则单词1的输出向量是只包含单词1的信息。
第五步:通过上述步骤就可以得到一个Mask Self-Attention的输出矩阵,然后和Encoder类似,通过Multi-Head Attention拼接多个输出然后计算得到第一个Multi-Head Attention的输出Z,在经过多个头相加再乘以权重矩阵之后,Z与输入X维度一样。
3.2.2 Multi-Head Attention
Decoder的Multi-Head Attention模块变化不大,主要的区别在于其中Self-Attention的K, V矩阵不是使用上一个Decoder的输出计算的,而是使用Encoder的编码信息矩阵C计算的。
根据Encoder的输出C计算得到K, V,根据上一个Decoder的输出Z计算Q (如果是第一个Decoder则使用输入矩阵X进行计算),后续的计算方法与之前描述的一致。
这样做的好处是在Decoder的时候,每一位单词都可以利用到Encoder所有单词的信息 (这些信息无需Mask)。
3.2.3 Feed Forward
与Encoder模块中的Feed Forward类似,此处不再赘述。
3.3 输出
3.3.1 Linear层
译码器Decoder最后的部分是利用Softmax预测下一个单词,在Softmax之前,会经过Linear变换,将维度转换为词表的个数。
3.3.2 Softmax层
按照从3.2.1-3.2.3的顺序执行一遍后,即完成一个Dncoder的译码,循环6次后,完成整个Dncoder的译码,最后输出编码信息矩阵Z。因为Mask的存在,使得单词0的输出只包含单词0的信息,如下:
Softmax根据输出矩阵的每一行预测下一个单词:
Softmax预测单词的动图演示(此演示列举了两个例子,即第5行和第4行):
3.4 Decoder在训练和推理时的区别
Decoder在训练时,是并行化的;在推理时,是串行化的
- Decoder在训练时,输入为已知的整个目标句子(也就是训练数据集中的Y标签),在跟Masked矩阵结合后,通过Decoder得到输出,往后再经过Linear层和Softmax层,得到预测输出(字数跟Y标签相同),然后通过对比Loss,进行网络的反向传播,从而完成网络的训练。
- Decoder在推理时,输入为当前的输入+前一时刻预测的输出。以从中文“我有一只猫”翻译为英文“I have a cat”为例,首先根据输入"
"预测出第一个单词为"I",然后根据输入" I"预测下一个单词"have"。如下图所示。需要注意的是,每次输入矩阵的维度相同,即后面的行的元素为0。通过Decoder得到输出,往后再经过Linear层和Softmax层,得到预测输出,从而完成推理。
四、总结
- Transformer与RNN不同,可以比较好地并行训练(在训练时是并行化的;在推理时是串行化的);
- Transformer的重点是Self-Attention结构;
- Transformer中Multi-Head Attention中有多个Self-Attention,可以捕获单词之间多种维度上的注意力得分Attention score。
本文原文来自CSDN