Transformer模型详解(图解最完整版)
Transformer模型详解(图解最完整版)
Transformer模型是自然语言处理领域的核心技术,由论文《Attention is All You Need》提出,现在是谷歌云TPU推荐的参考模型。本文将对Transformer模型进行详细解析,包括其整体结构、输入表示、自注意力机制、Encoder和Decoder的结构等核心概念。
1. Transformer 整体结构
Transformer由Encoder和Decoder两个部分组成,每个部分包含6个block。其工作流程如下:
- 获取输入句子的每一个单词的表示向量X,X由单词的Embedding和单词位置的Embedding相加得到。
- 将得到的单词表示向量矩阵传入Encoder中,经过6个Encoder block后可以得到句子所有单词的编码信息矩阵C。
- 将Encoder输出的编码信息矩阵C传递到Decoder中,Decoder依次会根据当前翻译过的单词1~i翻译下一个单词i+1。
Transformer的输入表示
2. Transformer 的输入
Transformer中单词的输入表示x由单词Embedding和位置Embedding相加得到。
2.1 单词 Embedding
单词的Embedding可以通过Word2Vec、Glove等算法预训练得到,也可以在Transformer中训练得到。
2.2 位置 Embedding
Transformer中使用位置Embedding表示单词出现在句子中的位置。位置EmbeddingPE的维度与单词Embedding是一样的。PE可以通过训练得到,也可以使用某种公式计算得到。在Transformer中采用了后者,计算公式如下:
Transformer的输入表示
3. Self-Attention(自注意力机制)
Self-Attention是Transformer的重点,它由多个Multi-Head Attention组成。Multi-Head Attention上方还包括一个Add & Norm层,Add表示残差连接,Norm表示Layer Normalization。
3.1 Self-Attention 结构
Self-Attention结构在计算的时候需要用到矩阵Q(查询),K(键值),V(值)。在实际中,Self-Attention接收的是输入(单词的表示向量x组成的矩阵X) 或者上一个Encoder block的输出。而Q,K,V正是通过Self-Attention的输入进行线性变换得到的。
3.2 Q, K, V 的计算
Self-Attention的输入用矩阵X进行表示,则可以使用线性变阵矩阵WQ,WK,WV计算得到Q,K,V。计算如下图所示,注意X, Q, K, V的每一行都表示一个单词。
3.3 Self-Attention 的输出
得到矩阵Q, K, V之后就可以计算出Self-Attention的输出了,计算的公式如下:
Q乘以K的转置的计算
得到QK之后,使用Softmax计算每一个单词对于其他单词的attention系数,公式中的Softmax是对矩阵的每一行进行Softmax,即每一行的和都变为1。
对矩阵的每一行进行Softmax
得到Softmax矩阵之后可以和V相乘,得到最终的输出Z。
Zi的计算方法
3.4 Multi-Head Attention
在上一步,我们已经知道怎么通过Self-Attention计算得到输出矩阵Z,而Multi-Head Attention是由多个Self-Attention组合形成的,下图是论文中Multi-Head Attention的结构图。
Q乘以K的转置的计算
从上图可以看到Multi-Head Attention包含多个Self-Attention层,首先将输入X分别传递到h个不同的Self-Attention中,计算得到h个输出矩阵Z。下图是h=8时候的情况,此时会得到8个输出矩阵Z。
对矩阵的每一行进行Softmax
得到8个输出矩阵Z1到Z8之后,Multi-Head Attention将它们拼接在一起(Concat),然后传入一个Linear层,得到Multi-Head Attention最终的输出Z。
Zi的计算方法
可以看到Multi-Head Attention输出的矩阵Z与其输入的矩阵X的维度是一样的。
4. Encoder 结构
Transformer Encoder block由Multi-Head Attention, Add & Norm, Feed Forward, Add & Norm组成。
4.1 Add & Norm
Add & Norm层由Add和Norm两部分组成,其计算公式如下:
Q乘以K的转置的计算
其中X表示Multi-Head Attention或者Feed Forward的输入,MultiHeadAttention(X)和FeedForward(X)表示输出(输出与输入X维度是一样的,所以可以相加)。
Add指X+MultiHeadAttention(X),是一种残差连接,通常用于解决多层网络训练的问题,可以让网络只关注当前差异的部分,在ResNet中经常用到。
Norm指Layer Normalization,通常用于RNN结构,Layer Normalization会将每一层神经元的输入都转成均值方差都一样的,这样可以加快收敛。
4.2 Feed Forward
Feed Forward层比较简单,是一个两层的全连接层,第一层的激活函数为Relu,第二层不使用激活函数,对应的公式如下。
对矩阵的每一行进行Softmax
X是输入,Feed Forward最终得到的输出矩阵的维度与X一致。
4.3 组成 Encoder
通过上面描述的Multi-Head Attention, Feed Forward, Add & Norm就可以构造出一个Encoder block,Encoder block接收输入矩阵X(n×d),并输出一个矩阵C(n×d)。通过多个Encoder block叠加就可以组成Encoder。
第一个Encoder block的输入为句子单词的表示向量矩阵,后续Encoder block的输入是前一个Encoder block的输出,最后一个Encoder block输出的矩阵就是编码信息矩阵C,这一矩阵后续会用到Decoder中。
Zi的计算方法
5. Decoder 结构
Transformer Decoder block与Encoder block相似,但是存在一些区别:
- 包含两个Multi-Head Attention层。
- 第一个Multi-Head Attention层采用了Masked操作。
- 第二个Multi-Head Attention层的K, V矩阵使用Encoder的编码信息矩阵C进行计算,而Q使用上一个Decoder block的输出计算。
- 最后有一个Softmax层计算下一个翻译单词的概率。
5.1 第一个 Multi-Head Attention
Decoder block的第一个Multi-Head Attention采用了Masked操作,因为在翻译的过程中是顺序翻译的,即翻译完第i个单词,才可以翻译第i+1个单词。通过Masked操作可以防止第i个单词知道i+1个单词之后的信息。
5.2 第二个 Multi-Head Attention
Decoder block第二个Multi-Head Attention变化不大,主要的区别在于其中Self-Attention的K, V矩阵不是使用上一个Decoder block的输出计算的,而是使用Encoder的编码信息矩阵C计算的。
根据Encoder的输出C计算得到K, V,根据上一个Decoder block的输出Z计算Q(如果是第一个Decoder block则使用输入矩阵X进行计算),后续的计算方法与之前描述的一致。
这样做的好处是在Decoder的时候,每一位单词都可以利用到Encoder所有单词的信息(这些信息无需Mask)。
5.3 Softmax 预测输出单词
Decoder block最后的部分是利用Softmax预测下一个单词,在之前的网络层我们可以得到一个最终的输出Z,因为Mask的存在,使得单词0的输出Z0只包含单词0的信息,如下:
Q乘以K的转置的计算
Softmax根据输出矩阵的每一行预测下一个单词:
对矩阵的每一行进行Softmax
这就是Decoder block的定义,与Encoder一样,Decoder是由多个Decoder block组合而成。
6. Transformer 总结
- Transformer与RNN不同,可以比较好地并行训练。
- Transformer本身是不能利用单词的顺序信息的,因此需要在输入中添加位置Embedding,否则Transformer就是一个词袋模型了。
- Transformer的重点是Self-Attention结构,其中用到的Q, K, V矩阵通过输出进行线性变换得到。
- Transformer中Multi-Head Attention中有多个Self-Attention,可以捕获单词之间多种维度上的相关系数attention score。