大模型基石 >> Transformer
核心思想:完全摒弃了传统的循环神经网络(RNN)和卷积神经网络(CNN),仅依赖“自注意力机制”来构建一个强大的序列到序列模型。
**设计目标:**解决了
并行化问题和长距离依赖问题
核心设计目标如何实现的
- 并行问题: 解决了传统RNN逐词处理的操作,支持并行处理所有输入,极大程度提升了模型的整体效率(细说则是训练效率)
- 长距离依赖问题: 引入了自注意力的机制,让序列中 每个元素 都能直接与序列中的 其它元素 进行交互,从而捕捉到全局依赖关系。
自注意力机制的计算原理
1、创建Query、Key、Value (Q,K,V)
- 每个词都会生成三个新的向量,是将输入的词向量与三个不同的权重矩阵相乘得到的。
- Query(查询):“我是谁,我在寻找什么?”
- Key(键):“我是谁,我能提供什么信息?”
- Value(值):“我真正要表达的内容是什么?”
- 这通过将输入词向量与三个不同的权重矩阵相乘得到。
- 这三个权重矩阵是W_Q,W_K,W_V
- W_Q, W_K, W_V 这三个权重矩阵是Transformer模型的核心可学习参数。它们的值不是人为设计的,而是在训练过程中,模型为了最小化预测误差,自动从数据中学习和优化出来的。正是通过这个过程,模型才学会了语言中复杂的依赖关系和语义信息。
2、计算注意力分数
- 为了计算当前词(如“it”)与其他所有词的关系,我们用“it”的Query向量去点乘所有词的Key向量。点乘分数越高,表示关联度越大。
- 例如,“it”的Query与“animal”的Key点乘分数可能不高,但与“tired”的Key点乘分数会很高。
3、缩放与Softmax
- 将上一步的分数除以一个常数(Key向量维度的平方根,为了稳定梯度),然后通过Softmax函数归一化,得到一组权重(所有权重之和为1)。这组权重代表了在编码“it”时,应该**“关注”** 其他每个词的强度。
4、加权求和
- 将上一步得到的权重分别乘以对应词的Value向量,然后求和。这个求和结果就是“it”在当前这一层自注意力机制下的新表示。
- 对于“it”这个词,由于它和“tired”的权重最高,所以它的新表示中会包含大量“tired”的信息。
多头注意力机制
为了从不同角度捕捉信息,Transformer将自注意力机制并行执行多次。例如,一个头可能专注于指代关系(“it” -> “animal”),另一个头可能专注于动作关系(“didn‘t cross” -> “street”)。最后将所有头的输出拼接起来,再通过一个线性层融合。
核心思想:让模型从多个不同的"视角"或"子空间"同时关注输入序列的不同方面
-
多头注意力主要是为了让模型对 ‘内容’ 具备 多维 的分析能力
-
单头注意力数学表达
-
# Attention(Q, K, V) = softmax(QKᵀ/√dₖ)V
-
-
多头注意力数学表达
-
# MultiHead(Q, K, V) = Concat(head₁, head₂, ..., headₕ)Wᵒ # 其中 headᵢ = Attention(QWᵢᵠ, KWᵢᴷ, VWᵢⱽ)
-
位置编码
Transformer 的位置编码是为了给模型提供序列中词语的位置信息,因为自注意力机制本身不具备序列顺序的信息。
位置编码通常有两种方式:正弦余弦编码(Sinusoidal Positional Encoding)和可学习的位置编码(Learned Positional Encoding)。
-
解决问题:为排列不变的自注意力机制注入位置信息
-
数学原理:使用不同频率的正弦余弦函数生成唯一的位置签名
-
数学表达
-
PE(pos, 2i) = sin(pos / 10000^(2i/d_model)) PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model)) -
pos:词在序列中的位置(0, 1, 2, ...) -
i:维度索引(0 ≤ i < d_model/2) -
d_model:词向量的维度
-
-
特性:
- 每个位置有唯一的编码
- 能够表示相对位置关系
- 可扩展到训练时未见过的序列长度
残差连接与层归一化
残差连接最早在ResNet中被提出,用于解决深度网络中的梯度消失和梯度爆炸问题。在Transformer中,残差连接被用在每个子层(自注意力层和前馈神经网络)之后。
层归一化是一种归一化技术,它对每个样本的所有特征维度进行归一化,使得每个样本的均值为0,方差为1。在Transformer中,层归一化被用在每个子层的残差连接之后。
残差连接的作用
- 缓解梯度消失:通过残差连接,梯度可以直接反向传播到浅层,使得深层网络更容易训练。
- 保留原始信息:即使网络层数很深,原始输入的信息也能通过残差连接传递到后面,避免信息在多层传递后丢失。
层归一化的作用
- 稳定训练过程:通过归一化,使得每一层的输入分布相对稳定,减少内部协变量偏移(Internal Covariate Shift)。
- 加速收敛:归一化使得梯度更加稳定,从而可以使用更大的学习率,加快训练速度。
- 改善模型泛化能力:有一定的正则化效果。
编码器与解码器
编码器-解码器注意力
在解码器中,第二个子层是编码器-解码器注意力层,其中查询(Query)来自解码器前一层的输出,而键(Key)和值(Value)来自编码器的输出。这使得解码器能够关注输入序列的相关部分。
整体工作流程
- 输入序列经过编码器,得到编码后的表示。
- 解码器从编码器接收这个表示,并自回归地生成输出序列(在训练时,使用教师强制,即输入是目标序列的移位版本,并掩码未来位置;在推理时,逐个生成词)。
编码器
编码器由N个(原论文中N=6)相同的层堆叠而成。每个层有两个子层:
- 多头自注意力机制(Multi-Head Self-Attention)
- 前馈神经网络(Feed-Forward Neural Network)
原理:
编码器的目标是将输入序列转换为一个富含上下文信息的表示序列。每个编码器层通过自注意力机制捕捉序列中每个元素与其他元素之间的关系,然后通过前馈网络进行非线性变换。
【构成】
每个子层都使用残差连接(Residual Connection)和层归一化(Layer Normalization)。也就是说,每个子层的输出是 LayerNorm(x + Sublayer(x)),其中 Sublayer(x) 是子层本身的计算。为了便于残差连接,模型中的所有子层以及嵌入层的输出维度都是 d_model(原论文中为512)。
【工作流程】
- 输入嵌入:将输入序列的每个词转换为一个向量,维度为
d_model。 - 位置编码:将位置编码加到输入嵌入上,以注入位置信息。
- 编码器层处理:
- 对于每个编码器层:
- 多头自注意力:计算输入序列中每个位置与其他位置的注意力,得到每个位置的上下文向量。
- 残差连接与层归一化:将注意力层的输出与输入(注意力的输入)相加,然后进行层归一化。
- 前馈网络:对每个位置独立应用前馈网络(两层全连接,中间有ReLU激活)。
- 残差连接与层归一化:将前馈网络的输出与前馈网络的输入相加,然后进行层归一化。
- 对于每个编码器层:
- 重复步骤3共N次,得到编码器的输出,这个输出将作为解码器中编码器-解码器注意力的Key和Value。
【核心价值】
- 双向上下文:自注意力机制允许每个位置关注输入序列中的所有位置,因此每个位置的表示都包含了整个序列的信息。
- 层次化特征:通过多层堆叠,模型可以捕捉不同层次的抽象特征。
解码器
解码器也由N个(原论文中N=6)相同的层堆叠而成。每个层有三个子层:
- 掩码多头自注意力机制(Masked Multi-Head Self-Attention)
- 多头注意力机制(Multi-Head Attention,用于关注编码器的输出)
- 前馈神经网络(Feed-Forward Neural Network)
原理
解码器的目标是根据编码器的输出和已生成的部分输出序列,生成下一个词。解码器使用自回归的方式,逐步生成输出序列。
【构成】
每个子层都使用残差连接和层归一化。解码器的第一个自注意力层是掩码的,以确保在生成每个词时只能看到前面的词,不能看到未来的词。
【工作流程】
- 输出嵌入:将目标序列的每个词转换为向量(在训练时,使用整个目标序列,但会掩码未来位置;在推理时,使用已生成的部分序列)。
- 位置编码:同样加入位置编码。
- 解码器层处理:
- 对于每个解码器层:
- 掩码多头自注意力:对目标序列进行自注意力计算,但使用掩码确保每个位置只能看到之前的位置(包括自身)。
- 残差连接与层归一化。
- 编码器-解码器注意力:查询(Query)来自解码器上一层的输出,键(Key)和值(Value)来自编码器的输出。这允许解码器关注输入序列中与当前生成词相关的部分。
- 残差连接与层归一化。
- 前馈网络:与编码器相同的前馈网络。
- 残差连接与层归一化。
- 对于每个解码器层:
- 重复步骤3共N次,得到解码器的输出。
- 线性层和Softmax:将解码器的输出通过一个线性层映射到词汇表大小,然后通过Softmax得到每个词的概率。
【核心价值】
- 自回归生成:通过掩码自注意力,解码器可以逐个生成词,每一步都基于已生成的词和编码器的输入表示。
- 关注输入序列:通过编码器-解码器注意力,解码器在生成每个词时都可以关注输入序列中最相关的部分,这对于翻译、摘要等任务至关重要。
总结
Transformer的整体架构通过编码器和解码器的堆叠,结合自注意力和前馈网络,实现了强大的序列到序列建模能力。其核心创新在于自注意力机制,它允许模型在处理每个元素时直接关注序列中的所有元素,从而更好地捕捉长距离依赖。编码器用于对输入序列进行编码,解码器用于生成输出序列,两者通过编码器-解码器注意力连接,使得生成过程可以关注输入序列。