本系列将记录一些最近的机器翻译模型,作为笔记,以备日后查看。
3、Attention Is All You Need
本文提出一个新的网络结构transfomer,不采用卷积与循环神经网络,仅仅依赖于注意力机制。对于循环神经网络由于其序列输入特性,导致难以并行。而卷积网络可以捕获任意位置的信息,导致随着距离的增大,也越难学习长距离的依赖关系。本文提出一种自注意机制的端到端网络。结构如下图。
编码端采用多头自注意力机制,通过下式进行attention的计算。其中q的维度与k的维度都为dk维,key的维度为dv维。其中与普通的点乘计算attention不同的是,加入了dk的开方的scale。由于点乘带来大的量级的增长,导致经过sigmoid后,产生极小的梯度。为了减少这种影响,对attention进行了scale。
其中,多头注意力机制即进行h次的attention并行计算,最终进行拼接。具体做法是将隐层分裂为dk/h, dv/h维。文中采用8个头进行并行计算。最终将8个头的输出进行连接。
编码端将自注意力的输出输入到一个位置相关的全连接前向网络中。FFN采用两个线性变换。在相同层的不同位置使用相同的权重,在不同层采用不同的权重。这个对于输入长度不固定比较适用,这个也可以理解成两个大小为1的核的卷积。注意力与ffn共同构成了一个layer,编码采用多层layer的叠加。在每个子层的输出中加入该子层的输入,作为残差连接。
在解码端采用同样的多头注意力机制与残差连接。除此之外,还有encoder与decoder的注意力层。其中key和value来自于编码层的输出,query来自于解码层的输出。最终通过线性函数与softmax输出来预测下一个词的可能性。
对于embedding输入权重矩阵,该模型将encoder与decoder以及softmax前的线性变换矩阵三者共享权重。可以减少参数数量同时提高模型的性能[2]。同样为了保证模型的方差稳定,将输入embbeding乘以隐藏层开方的个数。
该模型加入了position encoding,与之前[3]不同的是,该文直接采用固定的值作为embedding。其中i为隐层的维度,偶数维采用sin,奇数维采用cos, 两个的分别为d/2维度,拼接,达到与输入embedding一样的维度。采用正弦函数可以让模型外推,比训练时翻译更长的句子。不同的隐层数所产生的正弦函数是不一样的。
该模型采用adam作为优化器,采用warmup学习率
实验结果
参考文献:
[1] Attention Is All You Need
[2] Using the Output Embedding to Improve Language Models