笔记作个人理解和备忘之用,如有错误请轻喷
1、摘要
Transformer是一个完全基于注意力机制(attention mechanisms)的简单网络架构,完全不需要循环(recurrence)和卷积(convolutions),具有并行性,加速计算速度使得模型训练的时间显著减少。
2、模型架构
原论文《Attention Is All You Need》中第一部分的导言和第二部分的背景介绍略过。下面直接讨论第三部分开始的模型架构。
大部分competitive neural sequence transduction模型都具有解码器和编码器的结构,编码器将输入的序列X映射到序列z,z的每个元素表示一个向量。给定z,解码器会给出输出为y。模型自回归。transformer遵循这种整体架构,使用堆叠的self-attention和全连接网络构造编码器层和解码器层,如下图所示:
在原论文中,编码器和解码器层都使用了6次图中所示的结构块的堆叠,即N=6。
编码器和解码器仅仅相差一个masked-Multi-Head-Attention模块,其他计算过程均相同,我们首先讨论编码器的部分:
首先,输入经过input embedding,将输入的序列转化为维度为d的向量,通过positional encoding的位置编码与embedding后的向量相加共同得到输入,position encoding的使用是因为transformer完全基于注意力机制,相比传统的rnn、lstm等模型没有记录序列的位置信息,因此需要引入位置信息作为标记。在transformer中,使用频率不同的正弦和余弦函数来记录位置空间信息。
pos表示位置,i表示维度,也就是每个维度的位置编码都对应一个正弦波。
接着输入同时作为三个矩阵(Q,K,V)传给多头注意力机制函数(Multi-Head Attention),同时将原始输入与经过Multi-Head Attention函数得到的结果进行一个残差连接,之后经过一个LayerNorm层进行归一化后,传递给全连接层神经网络,再次残差连接并LayerNorm归一化,得到一个输出z传递给解码器。
LayerNorm不同于BatchNorm,BatchNorm是在输入的通道数上进行分割,将每个通道的NWH单独拿出来进行归一化,当batch_size越小的时候,计算得到的均值和方差无法代表全局,效果会越差。LayerNorm在数量N上进行分割,对每一个样本的CWH进行归一化,对所有的特征进行缩放,避免无法代表全局的情况。
Multi-Head-Attention是transformer最关键的注意力函数,首先需要了解Scaled Dot-Product Attention。
其中Q和K是将query和key打包成了Q和K矩阵,其维度均为dk,value打包为V矩阵,维度为dv,QK除根号dk是为计算query和key的距离,经过softmax函数输出以此作为value的权重。除以根号dk的原因,作者有在论文提到:
当dk过大时,点积运算的增长幅度比较大,容易将softmax函数推到梯度非常小的范围里面去,导致梯度消失,因此除以了一个根号dk。
图中即为Scaled Dot-Product Attention的运算过程。mask(opt)表示将序列中结点i之后的结点均设置为不可见,因为transformer中的全局均是可见的,但模型要求是自回归的,因此需要对当前结点之后的部分作隐藏处理。
Multi-Head-Attention将Q,K,V均通过h次线性投影到dk,dk,dv的维度,在此基础上进行并行的attention函数运算,提高模型的计算速度,最后将所有的计算结果concat起来,再次投影回去得到输出。
全连接层中包括两个线性变换,使用relu激活函数:
输入和输出的维度为d_model=512,隐藏层的维度d_ff=2048,即先映射到维度为2048的高维空间,通过使用relu激活函数进行非线性的变换增强模型的表达能力,最后再映射回512的低维空间。
下面讨论解码器的部分:
解码器部分大致流程与编码器部分相同,但在编码器的架构前多加了一个Masked-Multi-Head-Attention。因为模型是自回归的,序列的当前结点不应该查看到后续结点的信息,因此作mask处理,隐藏后续的结点信息,经过Multi-Head-Attention的机制作为query传递给下一个Multi-Head-Attention,而key和value都来自编码器的输出,其他过程和编码器部分一致。
transformer中使用Adam的优化器,优化器的参数β1=0.9,β2=0.98,ε=1e-9,学习率根据以下公式变化:
transformer中大量使用dropout进行正则化,Dropout率为0.1,在每个子层的输出,embedding和position encoding都使用了Dropout。
transformer在原架构的基础上进行了一些变种的实验结果如下: