五、编码器
编码器stack和解码器stack分别由多个(通常是六个)编码器和解码器组成,按顺序连接。
编码器stack中的第一个编码器接收经过嵌入层和位置编码层的输入嵌入,而其他编码器则接收前一个编码器的输出作为输入。编码器将其输入传入多头自注意力层,自注意力层的输出进入前馈神经网络层,然后将其输出向上发送到下一个编码器。如下所示:
自注意力层和前馈神经网络层均有一个skip-connection,然后进行LayerNorm归一化层。最后一个编码器的输出被送入解码器stack中的每个解码器,如下所述。
六、 解码器
解码器的结构与编码器的结构非常相似,但也有一些不同之处。与编码器一样,解码器stack中的第一个解码器接收嵌入层和位置编码层处理后的输出嵌入作为输入。stack中的其他解码器接收上一个解码器的输出作为输入。
解码器将其输入传递给多头自注意力层。该层的工作方式与编码器略有不同。它只允许关注序列中较早的位置。这是通过mask位置屏蔽来实现的,我们稍后将讨论这一点。
与编码器不同,解码器有第二个多头交叉注意力层,即编码器-解码器交叉注意力层。编码器-解码器交叉注意力层的工作原理与自注意力层类似,只是它结合了两个输入源–其下的自注意力层和编码器stack的输出。该注意力层的输出被送入前馈神经网络层,然后将其向上输出发送到下一个解码器。
每个子层(自注意力层、编码器-解码器交叉注意力层和前馈层)周围都有一个残差连接,然后是LayerNorm归一化层。
七、Attention
在Transformer系列第一篇文章中,我们谈到了为什么在处理序列时注意力机制如此重要。在 Transformer 中,Attention 有三个用途:
- 编码器中的自注意力层 - 关注输入序列自身
- 解码器中的自注意力层 - 关注目标序列自身
- 解码器中的交叉注意力层 - 目标序列关注输入序列
Attention层的输入有三个Query,Key和Value。在编码器的自注意力层中,编码器的输入会传递给Q、K、V这三个参数,如下所示:
与之类似,在解码器的自注意力层中,解码器的输入被传递给所有三个参数,即Q、K和V。
与之不同的是,在解码器的交叉注意力层中,编码器stack中最后一个编码器的输出被传递给参数V 和 K。其下的自注意力模块的输出则传递给参数Q。如下所示:
八、Multi-head Attention
Transformer将每个注意力处理器称为一个注意力头,并并行重复多次。这就是所谓的多头注意力。它通过将多个类似的注意力计算组合在一起,使注意力具有更强的特征表达能力。
Query、Key和Value分别通过独立的线性层,每个线性层都有自己的权重,产生三个结果,分别称为 Q、K 和 V。然后,如下图所示,使用注意力公式将这些结果合并在一起,计算得出注意力分数。
这里需要注意的是,Q、K 和 V 包含了序列中每个单词的编码表示。然后,Attention的计算会将序列中的每个单词与其他单词结合起来,这样注意力得分就可以用来衡量单词应该重点关注序列中的哪些单词。