机器学习——Transformer
10.6.2节中比较了卷积神经网络(CNN)、循环神经网络(RNN)和自注意力(self-attention)。值得注意的是,自注意力同时具有并行计算和最短的最大路径长度这两个优势。因此,使用自注意力来设计深度架构是很有吸引力的。对比之前仍然依赖循环神经网络实现输入表示的自注意力模型 (Cheng et al., 2016, Lin et al., 2017, Paulus et al., 2017),Transformer模型完全基于注意力机制,没有任何卷积层或循环神经网络层 (Vaswani et al., 2017)。尽管Transformer最初是应用于在文本数据上的序列到序列学习,但现在已经推广到各种现代的深度学习中,例如语言、视觉、语音和强化学习领域。
模型
🤔如何理解掩蔽注意力?
-
在解码器中,每个位置都需要根据输入序列和已生成的输出序列来进行预测。为了保持自回归的特性,即预测仅依赖于已生成的输出词元,我们需要限制每个位置只能看到它之前的位置。
-
为了实现这种限制,我们使用了掩蔽(masked)注意力机制。在计算注意力权重时,我们对当前位置之后的位置进行掩蔽,将它们的注意力权重设为零。这样,当前位置就只能考虑该位置之前的所有位置,并且不会受到未来位置的影响。
-
通过掩蔽注意力机制,解码器可以按顺序生成输出序列,每个位置只依赖于前面已生成的输出词元。这确保了输出的自回归性质,避免了未来信息的泄漏。
基于位置的前馈网络
基于位置的前馈网络对序列中的所有位置的表示进行变换时使用的是同一个多层感知机(MLP),这就是称前馈网络是基于位置的(positionwise)的原因。在下面的实现中,输入X
的形状(批量大小,时间步数或序列长度,隐单元数或特征维度)将被一个两层的感知机转换成形状为(批量大小,时间步数,ffn_num_outputs
)的输出张量。
该前馈网络的作用是对每个位置的特征进行非线性变换和映射。具体而言,它将每个位置的特征向量作为输入,并通过一系列的线性变换和激活函数(通常是ReLU)来生成新的表示。
这个前馈网络的设计有两个关键点:
-
独立性:基于位置的前馈网络是"位置-独立"的,即每个位置的特征都会被独立地映射和处理,不会受到其他位置的干扰。这使得Transformer能够更好地捕捉序列中不同位置的相关性和特征。
-
维度变换:基于位置的前馈网络通过线性变换将输入特征的维度从d_model(通常是Transformer模型的隐藏层大小)映射到一个更高的维度,然后再映射回d_model的维度。这个维度变换可以增加模型的表达能力,并引入更多的非线性性。
总结起来,基于位置的前馈网络是Transformer模型中用于对每个位置的特征进行独立的非线性变换和映射的子层结构。它帮助模型捕捉序列中不同位置的信息,并增强模型的表达能力。
残差连接和层规范化
现在让我们关注 图10.7.1中的加法和规范化(add&norm)组件。正如在本节开头所述,这是由残差连接和紧随其后的层规范化组成的。两者都是构建有效的深度架构的关键。
7.5节中解释了在一个小批量的样本内基于批量规范化对数据进行重新中心化和重新缩放的调整。层规范化和批量规范化的目标相同,但层规范化是基于特征维度进行规范化。尽管批量规范化在计算机视觉中被广泛应用,但在自然语言处理任务中(输入通常是变长序列)批量规范化通常不如层规范化的效果好。
在Transformer模型中,残差连接和层规范化是两个重要的技术,用于帮助提升模型的训练效果和加速收敛。
-
残差连接(Residual Connections): 残差连接是指将输入的特征与经过某个子层处理后的特征进行直接相加。在Transformer中,每个子层(如自注意力机制和前馈网络)的输出都通过残差连接与输入相加。这样做的目的是允许信息在模型中更容易地传播,避免梯度消失或梯度爆炸的问题。残差连接还可以帮助模型更好地优化浅层网络层,因为它们可以直接从较深层获得原始输入的信息。
-
层规范化(Layer Normalization): 层规范化是一种用于减少内部协变量转移(Internal Covariate Shift)的技术。在Transformer中,层规范化被应用于每个子层的输入和输出。它通过对每个特征维度进行归一化,使得特征在每个样本上的分布保持稳定。具体而言,层规范化对每个特征维度进行均值归一化和方差归一化,以减少不同特征之间的相关性对模型训练的影响,并提高模型的鲁棒性和训练速度。
残差连接和层规范化是Transformer中至关重要的技术。残差连接通过直接连接输入和子层的输出来促进信息传播,避免梯度消失和梯度爆炸问题。而层规范化则通过特征归一化来提高模型的鲁棒性和训练效果。这两个技术的结合使得Transformer模型能够更好地捕捉序列信息,并在各种任务上取得优异的表现。
🤔层规范化和批量规范化的区别
-
归一化对象:
- 批量规范化:批量规范化将特征在每个批次上进行归一化。它计算每个特征维度的均值和方差,并对整个批次中的样本进行归一化。
- 层规范化:层规范化将特征在每个样本上进行归一化。它计算每个特征维度的均值和方差,并对单个样本进行归一化。
-
训练时和推断时的计算:
- 批量规范化:批量规范化在训练过程中利用了批次内的均值和方差进行归一化,但在推断(测试)阶段需要使用全局均值和方差进行归一化。
- 层规范化:层规范化在训练和推断过程中都使用每个样本的均值和方差进行归一化。
-
归一化位置:
- 批量规范化:批量规范化通常应用于深度神经网络的隐藏层,在线性变换和激活函数之间进行归一化。
- 层规范化:层规范化通常应用于Transformer模型中的每个子层,如自注意力机制和前馈网络。
-
适用场景:
- 批量规范化:批量规范化在较深的神经网络中可以有效地减少内部协变量转移,加速模型收敛。它在计算机视觉领域的卷积神经网络中得到广泛应用。
- 层规范化:层规范化在序列建模任务中(如自然语言处理)的Transformer模型中表现出色,能够捕捉到序列中不同位置的相关性。
编码器
有了组成Transformer编码器的基础组件,现在可以先实现编码器中的一个层,包含两个子层:多头自注意力和基于位置的前馈网络,这两个子层都使用了残差连接和紧随的层规范化。
解码器
如 图10.7.1所示,Transformer解码器也是由多个相同的层组成。在DecoderBlock
类中实现的每个层包含了三个子层:解码器自注意力、“编码器-解码器”注意力和基于位置的前馈网络。这些子层也都被残差连接和紧随的层规范化围绕。
正如在本节前面所述,在掩蔽多头解码器自注意力层(第一个子层)中,查询、键和值都来自上一个解码器层的输出。关于序列到序列模型(sequence-to-sequence model),在训练阶段,其输出序列的所有位置(时间步)的词元都是已知的;然而,在预测阶段,其输出序列的词元是逐个生成的。因此,在任何解码器时间步中,只有生成的词元才能用于解码器的自注意力计算中。
总结
-
Transformer是编码器-解码器架构的一个实践,尽管在实际情况中编码器或解码器可以单独使用。
-
在Transformer中,多头自注意力用于表示输入序列和输出序列,不过解码器必须通过掩蔽机制来保留自回归属性。
-
Transformer中的残差连接和层规范化是训练非常深度模型的重要工具。
-
Transformer模型中基于位置的前馈网络使用同一个多层感知机,作用是对所有序列位置的表示进行转换。