Transformer是一个用于翻译的模型。由N个结构完全相同的encoder(训练时N个encoder参数独立训练)和N个结构完全相同的decoder(训练时N个decoder参数独立训练)组成。其中“N”是可以自己设定的,论文中给定的一个参考值为6.
Transformer模型框架:
将Transformer进一步细化为Encoder部分和Decoder部分。
**
Encoder
**
而Encoder部分又可分为3个部分:输入部分、注意力机制、前馈神经网络。
输入部分
包括两个:1.embedding 2.位置嵌入
为什么需要位置编码?
在RNN中,输入参数U、隐藏参数W和输出参数V是一套参数,在RNN的所有time steps中共享一套U、W、V参数。比如下面这张图,将左边这张图按时间线展开之后,可以看到右边在每个time step U、W、V是一样的,而不是Ut-1、Ut、Ut+1,所以RNN叫循环神经网络。
而Transformer具有并行化,一句话所有单词是可以一起处理的,而不是像RNN这样一个单词一个单词按照序列处理。这样做增快了速度,但是忽略了单词之间的位置信息(比如某些单词是在前面的,某些单词是在后面的)。
公式理解:pos是单词在句中的位置,2i和2i+1分别表示偶数位置和奇数位置,偶数位置使用sin公式计算,奇数位置使用cos公式计算。比如下面这个单词“爱”,如果它的位置编码向量为512维度,那么在每个偶数维度上使用上图中sin公式计算,在每个奇数维度上使用上图中cos公式计算。最终得到了一个512维的位置编码向量。
而“爱”这个词最终的编码向量是:位置编码+embedding(shape相同,对应位置相加)
注意力机制
注意力机制的输入必须要有三个矩阵:Q、K、V,通过计算Q和K的相似度并除以一个超参数得到相似的概率分布,最后与V矩阵进行相乘。在Transformer中如何计算Q、K、V呢?
经过了位置编码和embedding,我们已经获得了单词“Thinking”的Embedding,如何获取Q、K、V呢?如上图所示,只需要将其分别与WQ、WK、WV(参数矩阵首先初始化,然后训练更新其中参数)相乘。单词“Machine”也是一样的操作。下图中展示了计算Attention的过程。
上图中红框中是上面步骤得到的query、key、和value向量,紫框中的计算公式如下:
其中X是一个句子中所有单词的embedding矩阵。
上图中计算Attention的过程只是一套WQ、WK、WV来获得Q、K、V,多头注意力机制是指使用多套WQ、WK、WV。如下图:
多个头会有多个输出,最后将输出拼接在一起。
如上图所示,残差+LayerNorm的过程:单词“Thinking”和单词“Machines”经过embedding和position embedding之后相加得到黄色的x1、x2(拼接之后为x),接着输入到self-attention网络中得到输出z1和z2(拼接之后为x),然后将黄色的x和粉色的z相加(这里就是残差)并进行归一化(layerNorm)。
前馈神经网络
两层的全连接层和 残差+LN
**
Decoder
**
Decoder的重点是Maseked Multi-Head Attention 以及Multi-Head Attention
Maseked Multi-Head Attention
为什么需要mask?mask的又是什么呢?看下图:
因为在训练过程中有ground truth,如果Decoder的输入没有mask,那么,就会发生这样一种现象,当某一时刻,使用“LOVE”生成“YOU”的时候,Decoder能够看到后面的单词“YOU”和“NOW”,也就是在“S”、“I”、“LOVE”、“YOU”、“NOW”的共同影响下,生成了“YOU”这个词。但在测试过程中,没有ground truth,那么测试的时候结果就会与训练时候大相径庭(也称gap)。因此我们需要在训练时mask掉当前单词及当前单词之后的单词。
Multi-head Attention
Decoder中的Multi-head的K、V来自encoder框架中最后一个encoder的输出,Q来自decoder中multi-head attention的前一层输出。如下图所示:
本文参考b站一位up主视频,链接原视频还会讲关于Transformer的面试题目以及解答