Transformer是一个编码-解码结构。编码器将一个符号表示的输入序列(x_1, x_2, … , x_n)映射为一个连续表示的序列Z=(z_1, z_2, … , z_3)。给定了Z,然后解码器一次生成一个符号的输出序列(y_1, y_2, … , y_n)。在解码的每一步模型都是自回归(auto-regressive)的,即在生成下一个符号的时候,使用之前生成的符号作为额外的输入。

Encoder

Encoder层由两个子层组成。第一层是多头的SA、第二层是基于每一个位置的FFN。

Encoder层中的两个子层中间之间都有残差结构和layer normalization。具体地,每一个子层的输出是

为了方便这些残差连接,该模型中的所有子层,包括embedding层生成的输出的维度为512。

具体实现时细节

Mask

在NLP中,文本一般是不定长的。所以在进行batch训练之前,要先进行长度的统一,过长的句子截断,过短的句子padding。但是padding只是为了统一长度,并没有实际的价值。因此,希望在之后的计算中屏蔽它们,所以这时候就需要mask。
image.png
self-attention中,Q和K在点积之后,需要先经过mask再进行softmax。因此,对于要屏蔽的部分,mask之后的输出需要为负无穷,这样softmax之后输出才为0。

Decoder

Decoder层除了Encoder层中包含的两个子层还插入了第三种子层,该子层基于encoder模块的输出进行MSA。

但是Decoder层的SA与Encoder层中的SA有些许差异。Decoder层修改SA子层来以防止序列中的位置对当前解码位置及后续位置的关注。这种mask和输出embedding向右移动一位的操作配合,来确保位置i的预测只能依赖于小于位置i的已知输出。