基于自注意力的序列到序列模型
除长期依赖问题外,基于循环神经网络的序列到序列模型的另一个不足是
无法并行计算。
为了提高并行计算效率以及捕捉长距离的依赖关系,
可以使用自注意模型来建立一个全连接的网络结构。
本文简单介绍一个典型的基于自注意力的序列到序列模型:
Transformer[Vaswaniet al., 2017]。
1.1 自注意力
对于一个向量序列H=[h1,⋅⋅⋅,hT]∈Rdh×T,首先用自注意力模型来对
其进行编码。
self−att(Q,K,V)=softmax(dhKTQV)Q=WQH,K=WkX,V=WVX
其中 dh 是输入向量 ht的维度,WQ∈Rdk×dh,Wk∈Rdk×dh,Wv∈Rdv×dh
1.2 多头自注意力
自注意力模型可以看作是在一个线性投影空间中建立向量H 之间交互关系,
为了提取更多得交互信息,采用多头分注意力,
在多个不同的投影空间中捕捉不同的交互信息。
MultiHead(H)=Wo[head1;...;headM]headm=self−att(Qm,Km,Vm)∀m∈[1:M],Qm=WQmH,K=WkmX,V=WVmX
其中 Wo∈Rdh×Xdv为输出投影矩阵,
WQm∈Rdk×dh,Wkm∈Rdk×dh,Wvm∈Rdv×dh为投影矩阵
m∈[1,M]
基于自注意力模型的序列编码
对于一个序列 x1:T,可以构建一个多层的多头自注意力来对其进行编码,
但由于自注意力模型忽略输入信息的位置信息,因此出事的输入序列中加入位置编码信息来修正。
对于一个输入序列 x[1:T]
H(0)=[ex1⊕p1,...,ext⊕pt]
其中ext表示词 xt 的嵌入向量,pt 为位置t的向量表示
第 l层的隐状态 H(l)为:
Z(l)=norm(h(l−1)+MultiHead(H(l−1)))H(l)=norm(Z(l)+FNN(Z(l)))
其中 norm(x) 表示层归一化 ,
FNN(x) 表示逐位置的前馈神经网络。
对于输入序列中的每个位置上向量Z
FFN(z)=W2ReLu(W1Z+b1)+b2
基于自注意力模型的序列编码可以看作是一个全连接的前馈神经网络,第
l 层的每个位置都接受第l − 1层的所有位置的输出。不同的是,其连接权重是
通过注意力机制动态计算得到。
Transformer
将自注意力模型应用在序列到序列任务中,其整个网络结构可以分为两
部分:
编码器
编码器只包含多层的自注意力模块,每一层都接受前一层的输出作为输
入。编码器的输入为序列 x1:s,输出为一个向量序列 He=[h1e,...,hse]
解码器
解码器依是通过自回归的方式来生成目标序列。和编码器不同,解码器
可以由以下三个模块构成:
- 自注意力模块:第t步时,先使用自注意力模型对已生成的前缀序列y1:(t−1)
进行编码得到Hd=[h1d,...,h(t−1)d]。
在训练时,解码器的输入为整个目标序列,这时可以通过一个掩码(mask)来
阻止每个位置选择其后面的输入信息。
- 解码器到编码器注意力模块:使用h(t−1)d作为查询向量,
通过注意力机制来从输入序列He 中选取有用的信息。
- 逐位置的前馈神经网络:使用一个前馈神经网络来综合得到所有信息。
- 将上述三个步骤重复多次,最后通过一个全连接前馈神经网络来计算输出
概率。
参考:
https://nndl.github.io/