文章目录
- 7.前馈网络
- 8.加法和归一化组件
- 9.组合所有编码器组件构成完整编码器
7.前馈网络
编码器块中的前馈网络子层如下图所示:
图1.32 – 编码器块
前馈网络由两个带有ReLU激活函数的全连接层组成。全连接层(Fully Connected Layer)有时也称为密集层,即每一层的每个神经元都与上一层的所有神经元相连。在Transformer的前馈网络中,这样的密集层有两个。
第一个密集层将输入数据映射到一个更高维度的空间。
第二个密集层则将第一个密集层的输出映射回原始维度。
在这两个密集层之间,通常会加入ReLU(Rectified Linear Unit)激活函数。ReLU激活函数的定义如下:
f(x) = max(0,x)
这意味着,ReLU函数会将所有负数输入映射到0,而正数输入保持不变。ReLU激活函数有助于引入非线性因素,使得神经网络能够学习和模拟更复杂的函数。
前馈网络的参数在不同的句子位置上是相同的,但在不同的编码器块上是不同的。
在下一节中,我们将介绍编码器的另一个组件——加法和归一化组件。
8.加法和归一化组件
在Transformer的编码器中还有一个重要的组件,加法和归一化组件。它连接着一个子层的输入和输出。也就是说,如下图所示(虚线),我们可以观察到加法和归一化组件:
(1)将多头注意力子层的输入连接到其输出
(2)将前馈子层的输入连接到其输出
图1.33 – 带有加法和归一化组件的编码器块
加法和归一化组件基本上是一个残差连接,后面跟着层归一化。层归一化通过防止每层中的值发生重大变化,从而可以得到更快的训练。
现在我们已经了解了编码器的所有组件,让我们在下一节中将它们全部放在一起,看看编码器作为一个整体是如何工作的。
9.组合所有编码器组件构成完整编码器
下图显示了两个编码器的堆叠(为了看上去更加简洁清晰,只展开了编码器1):
图1.34 – 编码器堆叠,仅编码器1展开
从图1.34所示的编码器中,我们可以看到:
(1)首先,我们将输入转换为输入嵌入(嵌入矩阵embedding matrix),然后添加位置编码(position encoding)并作为输入喂给最底层的编码器(encoder 1)。
(2)编码器1接收到输入后,将其发送到多头注意力(multi-head attention)子层,多头注意力子层运算后输出注意力矩阵(attention matrix)。
(3)将注意力矩阵作为输入喂给下一个子层——前馈网络。前馈网络接收注意力矩阵作为输入,并输出编码器表示(encoder representation)。
(4)接下来,我们取编码器1的输出(encoder representation)并将其作为输入喂给下一级编码器(encoder 2)。
(5)编码器2执行相同的流程,并输出给定输入句子的编码器表示(encoder representation)。
我们可以将N个编码器一个接一个地逐层堆叠;最后一级的编码器(最顶层编码器)获得的输出(encoder representation)将是给定输入句子的表示(representation)。让我们将最终编码器(在我们上面所举的例子中是编码器2)获得的编码器表示记为R。
我们取最终编码器(编码器2)获得的编码器表示R,并将其作为输入喂给解码器。解码器接收编码器表示R作为输入,并尝试生成目标句子。
现在我们已经理解了transformer的编码器部分,下一节我们将详细介绍解码器是如何工作的。
感谢您的阅读,欢迎关注!