递归模型通常沿着输入输出序列进行因子计算,这排除了训练样本的并行化,尤其是输入长序列时,因为内存限制了样本批处理。注意力机制通常对依赖关系建模,而不考虑输入输出序列中他们的距离。Transformer是第一个完全依靠自我注意来计算其输入和输出的表示而不使用序列对齐的rnn或卷积的转换模型。
模型架构
大多数神经序列转换模型用的是编码-解码结构,编码器将输入序列表征表征为连续表征,解码器在给定z的情况下生成序列。
模型架构如下:
encoder
encoder包含6个独立层,每个层包含一个多头注意力子层和一个全连接前馈网络子层,这两个子层都加入了残差连接,每个子层的输出为LayerNorm(x+Sublayer(x))。
decoder
decoder也包含6个独立层,每个层除了编码器的的两个子层,还包含一个对编码器堆栈输出执行多头注意。类似于编码层,还加入了残差连接和层归一化。同时修改了decoder堆栈的自注意力层,避免关注后面的位置。
注意力层
归一化点积注意力
输入包含了维度为d_k的query和key,以及维度为的value,计算。当很大时,点积会很大,经过softmax后到达梯度较小的地方,因此乘以进行归一化。
多头注意力
相较于直接对维度的query、key、value计算注意力,同时做h次将query、key和value映射为、和维度的向量更有益处,这些输出的d_v维向量连接起来再做一次映射,得到最终的值。多头注意力可以使模型在不同位置上关注来自不同子空间的信息,计算如下:
在本工作中h=8,且。
Transformer中的多头注意力
-
在encoder-decoder attention中,query来自前一个decoder层,key和value来自encoder输出。这使得decoder的每个位置都将注意到输入序列的所有位置。
-
encoder中包含self-attention层,query、key、value来自encoder前一层的输出。这使得encoder的每个位置可以注意到前一层的所有位置。
-
decoder中包含self-attention层,使得decoder的每个位置都能注意到前一层该位置之前(包含该位置)的所有位置。我们要防止decoder中信息向左流动以保持自回归特性,通过在归一化点积注意力屏蔽(设置为)softmax输入中与非法连接对应的所有值。
position-wise 前向传馈网络
encoder和decoder中均包含一个全连接前向传馈网络,该网络包含两次线性变换和一个ReLU激活函数,在每个位置上独立地应用:。输入输出的维度为,隐藏层维度为。
Emeddings和Softmax
将输入token和输出token转换为维度d_{model}的向量,用decoder输出预测next-token概率。在embedding层,将权重乘以。
Position embedding
为了让模型利用序列中的顺序,需要加入序列中token的绝对或相对位置信息。position embedding与embedding具有相同的维度,如下:
选择正余弦函数是因为给定一个固定的偏置k,可以表征为的线性变换。
为什么使用self-attention
1、当序列长度n小于表示维数d时,自注意层比循环层速度快。
2、个体的注意力头不仅清楚地学会了执行不同的任务,且似乎表现出与句子的句法和语义结构相关的行为。