本文经自动驾驶之心公众号授权转载,转载请联系出处。
Transformer的强大在于它的设计。高票答案已经详细讲解了Transformer在长距离依赖建模方面的能力,我就试着从设计方面补充一下“Transformer能够work很好”的其他几个原因吧。抛砖引玉,大家轻拍。
并行计算 + 强大的表达与泛化能力
传统的循环神经网络(RNN)在处理序列数据时需要按顺序逐步计算,无法并行。而Transformer可以做到”同时计算所有位置的输出”!它是怎样做到的呢?
上图是论文中 Transformer 的内部结构图,左侧为 Encoder block,右侧为 Decoder block。
首先,Transformer使用位置编码(Position Encoding)来记录各单词在语句中的位置或次序,位置编码的值遵循一定规则(如由三角函数生成),每个源单词(或目标单词)的Word Embedding与对应的位置编码相加(位置编码向量与Word Embedding的维度相同)得到自己的编码,并最终成为Encoder的输入。
Transformer的Encoder组件由6个相同结构的Encoder串联而成,Decoder组件也是由6个结构相同的Decoder串联而成。最后一层Encoder的输出将传入Decoder的每一层。
进一步看,每个Encoder中的Multi-Head Attention,通过多个独立的注意力头并行计算,可以从不同的子空间中学习到不同的表示,从而使模型拥有关注语言不同方面的能力。下面是Multi-Head Attention的内部结构,
从上图可以看到 Multi-Head Attention 包含多个 Self-Attention 层,首先将输入X分别传递到 h 个不同的 Self-Attention 中,计算得到 h 个输出矩阵。
然后,Multi-Head Attention 将它们拼接在一起 (Concat),传入一个Linear层,得到 Multi-Head Attention 最终的输出Z
Linear层(全连接的神经网络层)的映射是非线性变换,它的作用是对输入进行维度变换和特征提取。线性变换只能进行简单的比例缩放和平移操作,而非线性变换可以引入更多的复杂性,例如曲线形状、峰值和谷底等。这样可以使模型更加灵活,能够更好地适应不同类型的数据分布,从而增加模型的表达能力。
Multi-Head Attention 上方还包括一个 Add & Norm 层,Add 表示残差连接 (Residual Connection) 用于防止网络退化(这也是RNN的顽疾),而Norm 表示 Layer Normalization,用于对每一层的激活值进行归一化,也就是将每一层神经元的输入都转成均值方差都一样的,这样可以加快收敛。
除了多头机制,Transformer还使用了Feed Forward前馈网络,它由两个线性变换和一个非线性激活函数(通常是ReLU)组成。输入的词向量经过一个线性变换,将其映射到一个更高维度的空间。然后,通过ReLU进行非线性变换。最后,再经过一个线性变换,将其映射回原始的词向量维度。通过多层前馈网络的堆叠,模型可以学习到更复杂的特征表示,从而更好地捕捉输入序列中的语义信息。
Transformer架构强大的表达与泛化能力使之成为GPT等大语言模型的底层核心,如果你也对Transformer和大模型感兴趣,想掌握使用和开发大模型的必备技巧,最终进入这一领域,那么选择一门相应的网课是比较快的路径。
自注意力模型的设计
传统序列模型在处理长序列时,由于信息的传递是依次进行的,容易出现梯度消失或梯度爆炸的问题,同时也无法充分捕捉到序列中不同位置之间的依赖关系。
通过引入注意力机制,我们可以对每个位置的注意力权重进行独立计算,不需要像传统序列模型那样依次进行计算,从而实现全局的信息交互。这也使得自注意力模型在处理长序列时具有更高的效率。
在这个模型中,MatMul是矩阵乘法的操作。具体来说,MatMul将查询矩阵Q与键矩阵K相乘,得到一个注意力分数矩阵。这个注意力分数矩阵表示了查询与每个键之间的相关性或相似度,从而决定在注意力机制中分配多少注意力权重给每个键对应的值(Value)。通过将注意力分数矩阵与值矩阵V相乘,可以得到最终的注意力表示。
Scale是指对注意力分数进行缩放的操作。在计算注意力分数时,通常会将点积的结果除以一个缩放因子,这个缩放因子是注意力机制中的一个超参数。缩放的目的是为了控制注意力分数的大小,使其更稳定和可解释。
具体来说,计算注意力分数的公式为:Attention(Q, K) = softmax(QK^T / sqrt(d_k)) * V
其中,Q表示查询(Query),K表示键(Key),V表示值(Value),d_k表示键的维度。在计算注意力分数时,将点积结果除以sqrt(d_k)来进行缩放。这个缩放因子可以使得注意力分数的范围更合适,避免了点积结果过大或过小的情况。
较大的缩放因子可以增加注意力分数的范围,使得模型更加关注不同位置之间的差异;较小的缩放因子可以减小注意力分数的范围,使得模型更加平均地分配注意力权重。
这种注意力机制不依赖于外部的上下文信息,而是通过内部的自我关注来计算注意力权重。因此,它被称为self-attention自注意力机制。
Mask是一种用于控制注意力机制的操作。它被用来屏蔽或限制模型在计算注意力分数时对某些位置的关注。在自注意力模型中,常见的mask操作有两种:padding mask和sequence mask。
- Padding mask(填充掩码):在处理变长序列时,为了保持序列的长度一致,通常会在序列的末尾添加一些特殊的填充符号(如0)。Padding mask的作用是将这些填充符号对应的位置的注意力分数设为一个很小的值(如负无穷),从而使模型在计算注意力分数时忽略这些padding符号。这样可以避免填充的内容对计算产生干扰。
- Sequence mask(序列掩码):在某些任务中,为了避免模型在生成序列时看到未来的信息,需要对注意力分数进行掩码操作。Sequence mask的作用是将当前位置之后的位置的注意力分数设为一个很小的值,从而使模型只能关注当前位置之前的信息。这样可以保证模型在生成序列时只依赖于已经生成的部分,而不会受到未来信息的影响。
通过使用mask操作,自注意力模型可以更好地处理变长序列和生成任务,并且能够控制模型在计算注意力分数时的关注范围。不同的任务和应用场景可能需要不同类型的mask操作。
比如在机器翻译任务中,我们希望将一个源语言句子逐步翻译成目标语言句子。使用sequence mask可以确保模型只能依赖于之前已生成的部分,逐步生成目标语言句子。
而在文本分类任务中,输入的文本长度可能不一致。使用padding mask可以将填充部分的注意力权重设为0,忽略填充部分的影响,确保模型只关注真实的文本内容。
演化
如今当我们谈论Transformer时,其实是在谈论一个大家族。2018年年初,AllenNLP发布了一个新模型ELMo。ELMo是一种比Word2vec更好的训练词向量的模型。而之后的BERT、RoBERTa、XLNet、T5、ALBERT、GPT-3等模型从自然语言理解及自然语言生成等角度,不断刷新自然语言处理领域任务的SotA(State of the Art)表现。
Transformer架构也像其他AI新技术一样,会不断迭代和更新,如果你也对Transformer大家族感兴趣,想进入大模型开发这一热门领域,那么通过学习一门靠谱的网课会是比较快的路径。