Transformer 与 Attention
Paper: https://arxiv.org/abs/1706.03762
Transformer是谷歌等在2017年的论文Attention is all you need中提出适用于机器翻译任务的模型结构,其在机器翻译任务上的表现远超同期的RNN和CNN。目前在NLP领域最后欢迎。
其中,论文重要内容是:
- 常用的序列模型都是基于卷积神经网络或者循环神经网络,表现最好的模型也是基于encoder-decoder框架的基础加上attention机制。
- 提出一种基于attention机制的新模型transformer,抛弃了传统的模型结构。
- 模型在2014WMT翻译数据集上,比现存最好的模型的bleu值高2个点。
Transformer的结构
Transformer模型与大多数Seq2Seq模型一样,也使用了Encoder-Decoder(编码器-解码器)结构。
Ecoders负责接收源端输入语句,提取特征并输出语义向量。Decoder负责根据语义向量,逐字生成目标语言的译文。Encoder与Decoder不像传统的RNN模型一样按时序展开,而是完整的且参数不共享的特征提取层。如上图,Transformer有双6层block组成。
上图的左边是Encoder的结构,内部包含两个子层,分别是self-Attention层与Feed Forward层;Decoder的结构比Encoder的多了一个Encoder-Decoder Attention层,这一层是链接两个语种语义特征融合层,让Decoder接收Encoder提取的语义信息。
继续拆解Self-Attention层与Feed Forward层会得到基本的单元层,Self-Attention层中的Muti-Head Attention 层与LN层通过残差结构链接, Feed Forward层中的全连接层与LN层通过残差结构链接。注意:LN层与BN层同属于归一化层,虽然归一化的维度不同,但目的都是解决训练过程中中可能出现的梯度消失或者梯度爆炸问题,达到加速训练及正则化的效果。
上图左边是由N个Encoder堆叠而成的Encoders,右边是由N个Decoder堆叠而成的Decoders。需要注意的是,与常规的数据流串行模型不同,Transformer-Encoders的输出特征向量并不是一次性输入到Decoders中,而输入到Decoders中的每个Decoder的Encoder-Decoder Attention层中。除了最核心的Encoder-Decoder框架,完整的模型还包括输入的Embedding层、位置编码(Positional Embedding, PE)层,以及输出的Linear层和Softmax层。
深绿色的
x
1
x_1
x1代表Embedding层的输出,加上代表Positional Embedding的深蓝色向量
t
1
t_1
t1之后,得到最后输入Encoder中的特征向量,即黄色向量
x
1
x_1
x1,其维度保持不变,为512。随后进入Encoders的第一层,浅绿色向量
x
1
x_1
x1和
x
2
x_2
x2分别表示单词“Je”和“suis”的特征向量,其中
x
1
x_1
x1进过Self-Attention层,变成粉红色向量
z
1
z_1
z1,同时,
x
1
x_1
x1作为残差结构的直连向量,直接与
z
1
z_1
z1相加,进行LN操作,得到粉色的向量
z
1
z_1
z1。随后,
z
1
z_1
z1进过Feed Forward层,经过残差结构与自身相加,同样进过LN层,最后输出向量
r
1
r_1
r1。同时,
r
1
r_1
r1也将作为下一层Encoder的输入,代替
x
x
x的角色,如此循环,直到就最后 一层Encoder
Decoder的数据流与Encoder的基本一致,Decoder比Encoder多一个Encoder-Decoder Attention层(它们的输入和输出均为512维向量)。Decoder与Encoder最大的不同是:Encoder接收目标语言的前n个词,输出第n+1个词的概率,即每次运行Decoders只生成一个词。
进入Linear层的向量为句子“I am a” 中“a”所对应的Decoder输出向量,即图3.9中的底部向量。经过Linear层后,输出维度变成词表维度,即向量的每个元素都代表词表中的一个词。经过Softmax层后,向量中每个元素的值代表词表中具有相同序列的词表作为翻译的结果概率。经过Softmax层后的概率向量进行arg max操作,得到概率最大的词表序号为5,查词表可得下一个词的最佳翻译为“Student”,即可的得到完整的翻译“I am a Student”。
Self-Attention: 从全局中找到重点
以单词“Thinking”和“Machines”为例,两个词向量在Self-Attention计算中的特征转化过程,先将每个词向量与三个矩阵相乘,分别转化为三个向量
q
,
k
,
v
q,k,v
q,k,v。其中,矩阵
W
Q
,
W
K
,
W
V
W_Q, W_K, W_V
WQ,WK,WV为学习的模型参数,
x
1
x_1
x1向量分别右乘上述矩阵。得到
q
1
,
k
1
,
v
1
q_1,k_1,v_1
q1,k1,v1。
得到
q
1
,
k
1
,
v
1
q_1,k_1,v_1
q1,k1,v1之后,需要计算每个词与其他词的关系,用一个分值表示关系的亲疏。如计算“Thinking”和“Machines”的关系,由
x
1
x_1
x1计算得到的
q
1
q_1
q1向量与
x
i
(
i
=
1
,
2
)
x_i(i=1,2)
xi(i=1,2)计算得到
k
i
(
i
=
1
,
2
)
k_i(i=1,2)
ki(i=1,2)向量做内积,得到标量分值,该分值越高,表明关系越重要。
接下来,对分值做缩放,除以一个系数,通常为向量
q
q
q维数的平方根。在Transformer Base的参数中,q向量的维数为64,分值缩放操作是为了让梯度更加平稳。随后,缩放得到的分值经过Softmax层得到一维的概率向量(和为1)。
概率向量的每个元素都表示一个概率值即当前词在不同位置的语义信息含义。若当前词是名词或者动词等携带信息的词,则在当前词的位置计算得到的概率值会较大。概率分布体现了句子中每个词与其他词的关注度,即Attention分布。此处需要注意的,Attention的概率分布不具备对称性,
x
1
x_1
x1在
x
2
x_2
x2位置的概率并不等于
x
2
x_2
x2在
x
1
x_1
x1位置的概率, 即
q
1
k
2
q_1k_2
q1k2和
q
2
k
1
q_2k_1
q2k1不一定相等。然后,将得到的概率分别与
v
v
v向量分别相乘并相加,得到新的特征向量
z
z
z。
Self-Attention计算的矩阵形式,X表示输入的向量矩阵,每一行代表一个词向量,由多个词向量组成的矩阵X表示一个句子。通过三个权重矩阵右乘,得到矩阵
Q
,
K
,
V
Q,K,V
Q,K,V,其中每一行表示一个词的
q
,
k
,
v
q,k,v
q,k,v向量。然后对K矩阵进行转置,左乘Q矩阵,得到新的矩阵,将其进行缩放后,按行做Softmax操作,得到概率分布,其中第i行第j列的元素表示第i个词与第j个词的语义关联概率。随后右乘V矩阵,得到最后的特征矩阵Z,Z的第i行表示第i个词经过Self-Attention 操作的输出。
接下来讲一下Multi-Head-Attention!
将单个Self-attention进行分裂就得到Multi-head Self-attention,这里以2个heads为例进行说明(实际使用时head数目也是需要作为参数进行调的)。
上图将
q
i
q^i
qi 分别乘2个不同的矩阵就得到将
q
i
,
1
q^{i,1}
qi,1 和
q
i
,
2
q^{i,2}
qi,2 ,k和v的处理过程类似,然后按照Self-attention的流程最终得到将
b
i
,
1
b^{i,1}
bi,1 ,同理获得
b
i
,
2
b^{i,2}
bi,2 ,得到的
b
i
,
1
b^{i,1}
bi,1 和
b
i
,
2
b^{i,2}
bi,2 可以直接连接形成
b
i
b^i
bi ,当然如果对连接产生的维度不满意也可以继续乘上个矩阵进行降维,过程如下:
因为不同head之间attention的点可能不太一样,比如有的head更重视和自己邻近上下文的信息,而其他的head可能更容易注意到全局信息,这样许多heads就可以各司其职进行更复杂的任务。
参考
Jay Alammar: https://jalammar.github.io/illustrated-transformer/
刘一烽 预训练语言模型
欢迎关注公众号: