文章目录
神经翻译笔记7. Transformer
编码器-解码器架构,是使用神经网络方法作为机器翻译问题解决方案的基石,自问世以来广受关注,也获得了比较大的成功。然而,这种架构主要使用是RNN,而由前面对RNN的介绍可知,这种网络在时刻 t t t的隐藏状态是由前一时刻的隐藏状态和该时刻的输入共同计算得出,因此不太好并行化,在句子很长的时候容易陷入性能瓶颈。基于CNN的编码器试图解决这样的算力问题,但是如何学习长距离依赖又成为了一个难点。注意力机制使得模型能够对长距离依赖更好地建模,但是在被Bahdanau引入以后开始的一段时间该机制一直都紧密依附于底层的RNN,因此也受限于RNN按时间逐步展开的计算方式。对此,[Vaswani2017]提出了里程碑式的工作Transformer,发扬了注意力机制的优势,摒弃了RNN和CNN各自的弱点,将机器翻译的研究工作带入了一个新的时代。而在其基础上发展出来的BERT则更是将大部分NLP任务的SOTA效果提高到了一个新的高度
本文参考了如下资料
- 原始论文
- The Illustrated Transformer(强推,图解过程很多,更加直观)
- 史上最全Transformer面试题
体系结构
本节所有配图如无特别说明均出自原文[Vaswani2017]
上图给出了Transformer的整体结构,可见它仍然沿用了前述的编码器解码器架构(左为编码器,右为解码器),但是无论编码器和解码器都不再使用RNN,而是大量使用了注意力机制、残差连接 (图中的Add操作) 和层归一化 (图中的Norm操作)
-
编码器包括了 N = 6 N=6 N=6个结构相同的层,每层由两部分(两个子层)构成,其一是多头自注意力机制,其二是一个全连接层。每个子层都会使用残差连接(图中的Add操作)然后接一个层归一化(图中的Norm操作),即各子层的输出为
L a y e r N o r m ( x + S u b L a y e r ( x ) ) {\rm LayerNorm}(x + {\rm SubLayer}(x)) LayerNorm(x+SubLayer(x))
其中 S u b L a y e r \rm SubLayer SubLayer是全连接操作或多头自注意力操作。编码器的所有向量(包括词向量)维度都为 d m o d e l = 512 d_{\rm model}=512 dmodel=512。残差连接的使用使得训练可以更加稳定,保留更多原始信息,尤其是在Transformer有很多子层的情况下。关于LayerNorm的使用,相关学者作了若干研究,将在后面单独发文讨论
-
解码器也分 N = 6 N=6 N=6层,每层结构也都相同。其与编码器不同的结构主要有两点:其一,是自注意力部分使用了掩码,使解码到位置 i i i时解码器看不到该位置后面的内容;其二,是在自注意力部分和全连接部分中间插了一个对编码器输出的多头注意力子层
在图中可以见到有两个比较新,同时比较重要的概念:多头注意力 (Multi-head Attention) 和位置编码
多头注意力
在介绍多头注意力机制之前,有必要再厘清注意力机制的一般形式,以及Transformer基本单元对注意力机制的使用方法
注意力机制的一般形式
注意力机制本质是学习一个函数,其接受输入可以看作是一种查询query,给出的输出是值向量value的加权和,权重由query和键key一起计算并经过softmax归一化后得出,每个键与每个值一一对应。该函数的核心是一个打分函数 S c o r e \rm Score Score,作用可以看作是判定各键向量 k i \boldsymbol{k}_i ki与查询向量 q \boldsymbol{q} q的相似度。即
α i = exp ( S c o r e ( q , k i ) ) ∑ j exp ( S c o r e ( q , k j ) ) A t t e n t i o n ( q , K , V ) = ∑ i α i v i \begin{aligned} \alpha_i &= \frac{\exp({\rm Score}(\boldsymbol{q}, \boldsymbol{k}_i))}{\sum_j \exp({\rm Score}(\boldsymbol{q}, \boldsymbol{k}_j))} \\ {\rm Attention}(\boldsymbol{q}, \boldsymbol{K}, \boldsymbol{V}) &= \sum_i\alpha_i\boldsymbol{v}_i \end{aligned} αiAttention(q,K,V)=∑jexp(Score(q,kj))exp(Score(q,ki))=i∑αivi
如果不考虑键值分开的情况,例如[Meng2018]所提出的网络结构,对一般NMT模型都有 k = v \boldsymbol{k} = \boldsymbol{v} k=v。对于前述的使用RNN的编码器解码器架构,每个查询向量