大部分序列到序列(seq2seq)模型都使用编码器-解码器结构 (引用)。编码器把一个输入序列(1,...)(x1,...xn)映射到一个连续的表示=(1,...)z=(z1,...zn)中。解码器对z中的每个元素,生成输出序列(1,...)(y1,...ym)。解码器一个时间步生成一个输出。在每一步中,模型都是自回归的(引用),在生成下一个结果时,会将先前生成的结果加入输入序列来一起预测。
编码器的每层encoder包含Self Attention 子层和FFNN子层,每个子层都使用了残差连接(cite),和层标准化(layer-normalization) (cite)。
我们称呼子层为:Sublayer()Sublayer(x),每个子层的最终输出是LayerNorm(+Sublayer())LayerNorm(x+Sublayer(x))。 dropout (cite)被加在Sublayer上。
每一层encoder都有两个子层。 第一层是一个multi-head self-attention层,第二层是一个简单的全连接前馈网络,对于这两层都需要使用SublayerConnection类进行处理。
单层decoder与单层encoder相比,decoder还有第三个子层,该层对encoder的输出执行attention:即encoder-decoder-attention层,q向量来自decoder上一层的输出,k和v向量是encoder最后层的输出向量。与encoder类似,我们在每个子层再采用残差连接,然后进行层标准化。
对于单层decoder中的self-attention子层,我们需要使用mask机制,以防止在当前位置关注到后面的位置。
Attention功能可以描述为将query和一组key-value映射到输出,其中query、key、value和输出都是向量。输出为value的加权和,其中每个value的权重通过query与相应key的计算得到。
我们将particular attention称之为“缩放的点积Attention”(Scaled Dot-Product Attention")。其输入为query、key(维度是dk)以及values(维度是dv)。我们计算query和所有key的点积,然后对每个除以 ⎯⎯⎯⎯√dk, 最后用softmax函数获得value的权重。
multi-head attention在Transformer中有三种不同的使用方式:
除了attention子层之外,我们的编码器和解码器中的每个层都包含一个全连接的前馈网络,该网络在每个层的位置相同(都在每个encoder-layer或者decoder-layer的最后)。该前馈网络包括两个线性变换,并在两个线性变换中间有一个ReLU激活函数。
此外,我们会将编码器和解码器堆栈中的embedding和位置编码的和再加一个dropout。对于基本模型,我们使用的dropout比例是=0.1。