Transformer架构解析
前言
Transformer在现在人工智能领域几乎是很多任务的backbone,不过网上很多解析都不够小白,分析太多,本文将详细解读Transformer的架构和Transformer的代码,遵循是什么,为什么来介绍,分析放在最后。
架构解析
现在从下往上,从左到右我们分部介绍其中的细节。
Inputs
在大多情况下,作为NLP任务,假设模型的输入是一串英文文本(texts),它由很多词(words)和标点(punctuations)组成。我们把每个词和标点看作一个单位,为了输入模型,目前的相关工作中有各种方法,如word2vec,one-hot编码等,将它们转换为一个一维的嵌入向量(Embeddings)。那么假设texts中有n个words(包括标点),在生成词嵌入的方法中我们规定嵌入向量的长度为k,就生成一个n*k的矩阵,每行都是一个词的特征向量(features),这其实就是图中的inputs和embeddings。
Positional Encoding
位置编码就是将每个词在文本序列中的位置进行编码得到的向量,将它作为额外的特征拼接到每个单词向量的后面。可以有不同的计算方式,Transformer中使用下面的式子:
位置编码有很多不同的方式,发展到这里已经比较成熟,公式中pos是word在文本中的位置,i指PE中第i个元素,d_model是词向量的维度。实际上这种编码就是正余弦函数在不断震荡。
之所以加入位置编码是因为,得到每个词的特征向量后,我们实际上是做了一个类似字典的工作,然而在模型中我们如果仅仅将代表整个文本的特征矩阵输入进行乘法,实际上代表words的不同行都在同时进行计算。因此不同于RNN,Transformer没有将输入作为一个序列而是作为一个整体,也就确实了每个words在文本序列中本来的位置信息。
除了这个原因外,Transformer中还会进行自注意力的计算,如果不加上位置特征,那么不同位置的同个word会查询出相同的value,后面我们会再讲到。
到这里我们计算了完整的输入特征矩阵,它包括原本的词嵌入和位置编码。
注意力机制
这是Transformer非常著名的部分,多头注意力由多个自注意力机制组成,上面Add表示残差连接,Norm表示归一化。我们先看注意力机制。
自注意力机制
图中左边是自注意力的计算方式,其实就是用三个公用的可训练的参数矩阵W_Q,W_K,W_V,分别乘以输入的特征矩阵X,就为每个词都得到Q(query),K(key),V(value)三个矩阵(图是偷的):
同样每一行代表一个单词,这三个矩阵随着训练会包含所有位置上单词的信息,为了方便理解我们认为Q提炼了单词会对其他哪些单词感兴趣,K提炼了单词哪些部分可能会被其他哪些单词注意,V尽可能保留单词意义,提供健全的查询内容。
如图中所示使用该公式计算注意力矩阵,该矩阵Z尺寸和Q,K,V相同。
多头注意力机制
多头注意力就是多个自注意力的组合,前面图中h表示注意力头的数量,按照自注意力方式计算h个自注意力矩阵Z,然后直接按行拼接,再用一个线性变换矩阵将矩阵变换为和输入X一致的尺寸。
此外,在这里还有一个Mask机制,分别是padding mask和sequence mask,分别在encoder和decoder中使用,前者对空闲的输入位置补负无穷,以保证这些位置的预测概率为0,后者对序列中第i个位置之后的输入元素补0以保证encoder不会使用未来的信息进行预测,以模拟类似RNN的输入方式。
Add & Norm
残差连接
是一种提升网络训练性能的方法,将输入X加到输出中,就可以让网络仅关注该层上差异的部分。
LayerNormalization
把数据变回正态分布的计算方法,对输出的矩阵进行了变换。
Feed Forward
两层的MLP,第一层用ReLU,第二层不用激活函数。