本项目旨在介绍并探讨 Transformer 及其衍生模型在大模型领域的发展历程。本节主要关注 Attention 机制,结合相关论文与常见问题进行解析。
- 文献链接: Attention Is All You Need (arXiv:1706.03762)
- 背景: 该论文由 Vaswani 等人在 2017 年提出,为自然语言处理和序列建模带来了革新,其核心在于 Self-Attention 及 Multi-Head Attention 技术。
核心公式:
在计算注意力分数 (scores
的数值会变大,导致 Softmax 的输入出现极端值,从而引发训练不稳定(梯度爆炸或消失)等问题。
为此,论文提出缩放(Scaling) 方案 —— 除以
- 保持注意力分数的数值分布相对稳定,利于训练收敛。
总结:除以
$\sqrt{d_k}$ 可以让数值更平滑,避免Softmax的输出分布过度集中,减轻梯度问题。
在注意力机制中,我们通常需要对某些位置进行“屏蔽”(Mask),包括:
- Padding Mask : 对无效位置(如填充符)进行屏蔽;
- Causal Mask : 在自回归模型中屏蔽未来时刻的token(只允许看到过去)。
做法是:
scores = scores.masked_fill(mask == 0, float('-inf'))
之后进行Softmax时,这些被置为-∞
的位置,其注意力权重就会趋近于0,从而实现屏蔽的效果。
总结:用
-∞
来使被遮挡位置的Softmax输出为0,彻底杜绝模型从无效区域获取信息。
attention_weights = self.dropout(attention_weights)
- Dropout会随机把一部分注意力权重置为0,从而抑制过拟合,提升模型的泛化能力。
- 在注意力机制中,这被视作在训练时增加随机性,增强鲁棒性。
总结:Dropout在这里是对注意力权重做随机丢弃,减少对特定连接的过度依赖。
-
Q, K, V 各司其职
-
$Q$ (Query): “查询”向量 -
$K$ (Key): “键”向量 -
$V$ (Value): “值”向量
-
-
注意力三步走
- 计算
$\text{scores} = QK^\top$ ,得到各元素之间的相似度; - 通过
$\text{Softmax}$ 将相似度变为概率分布; - 用得到的概率分布加权
$V$ ,得到最终上下文向量。
- 计算
若将
总结:先对
$QK^\top$ 做Softmax获得注意力分布,再基于此分布加权$V$ ,这是Attention机制的核心流程。
多头注意力(MHA) 可以理解为并行地做多份“Scaled Dot-Product Attention”,然后将各头的结果拼接起来并投影到输出空间。其优点在于:
- 并行关注不同位置: 每个注意力头可捕捉不同的特征或上下文依赖;
- 表达能力更强: 增加了模型对序列多方面信息的捕获能力。
计算流程:
- 对输入$X$线性映射成
$Q, K, V$ ; - 进行多头拆分(
view
,transpose
),得到形如$(batch_size, num_heads, seq_len, d_k)$ 的张量; - 计算
$\text{Attention}(Q, K, V) = \text{Softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right) V$ ; - 结果拼接,过线性层得到最终输出。
- GPT-1 (2018): Improving Language Understanding by Generative Pre-Training
OpenAI Blog | Paper (PDF)
此后有GPT-2 (2019), GPT-3 (2020), GPT-4 (2023)等持续演进,都使用了Decoder-only自注意力和因果掩码来实现从左到右生成。
GPT使用因果掩码(Causal Mask)在计算Softmax前对未来位置进行屏蔽,保证只能看“过去”token。
- 标准多头注意力(如Transformer Encoder)则不需要这种因果限制;
- 若是Transformer Decoder,也要显式传递一个look-ahead mask。
总结:GPT与标准MHA最大区别在于自动加“因果掩码”。
- 在自注意力场景下(Self-Attention),
$Q=K=V$ 都来自同一批张量,如GPT。 - 在Encoder-Decoder Attention场景下,
$Q$ 通常来自Decoder隐状态,$K, V$ 来自Encoder隐状态,所以要分别传入。
总结:GPT自注意力中
$Q=K=V$ 都是同一个输入;在通用的多头注意力中,$Q、K、V$ 被分开是为了更灵活的使用场景。
MLA(Multi-Head Latent Attention)在Key/Value上进行低秩压缩,可显著减小推理时的KV缓存开销,同时在实践中也会带来一定的加速。具体来说:
- K, V不再是
$(batch_size, seq_len, d_model)$ ,而是被映射到更小的维度$(d_c)$ ; - 再将
$(d_c)$ 投影到多头所需的$(d_c^h + d_r^h)$ 维度,用以参与注意力运算; - 只在注意力核心流程上保留较小的矩阵维度,从而降低计算量与内存。
- 降维后运算量更小
Key/Value的维度变小,Attention过程中的矩阵乘法规模也随之减小。 - KV缓存量更小
对大模型推理尤其重要,可减少显存或网络带宽瓶颈。
- 在本地测试中,GPT自注意力封装更直接,函数调用路径更短或可能存在其他优化,从而运行更快。
- Mask并不会真正“少算”矩阵乘法(一般PyTorch实现中只是在乘法后填充负无穷),更多是实现细节或随机波动造成时差。
- RoPE的核心思想是让
$QK^\top$ 中出现可体现位置关系的旋转算子,$Q, K$ 各自携带位置信息后,即可让注意力分布反映相对位置。 - V不需要做旋转;若也做,则还得考虑“逆向”操作,复杂且无明显收益。
- PyTorch中
permute
用于调整张量的维度顺序,与单纯的2D“转置”不同,可在更高维张量中任意交换维度。 - 在注意力中,常见用法是将
$(batch_size, seq_len, n_heads, d_k)$ 变为$(batch_size, n_heads, seq_len, d_k)$ ,方便后续进行矩阵乘法或计算注意力分布。
-
Scaled Dot-Product Attention是Transformer的基础,除以
$\sqrt{d_k}$ 来稳定数值; Mask填充-∞
可屏蔽无效位置,配合Softmax使注意力权重归零; - Dropout对注意力权重做随机丢弃,防止过拟合;
-
Q, K, V各自扮演“查询、键、值”角色,先计算
$QK^\top$ 相关性,再做Softmax加权$V$ ; - GPT自注意力同样遵循多头注意力原理,但加了因果掩码来保证只能看过去;
- MLA通过Key/Value低秩压缩,减小推理缓存与计算量,适合大模型优化;
-
RoPE只加在
$Q$ 和$K$ 上,以在相关性分数中注入位置信息; -
permute
用于多维度交换,为注意力计算做形状适配。
以上即为对Attention相关问题与三种实现方式的简要梳理,以及相应原理的解释。希望能帮助你更好地理解Transformer体系及其演化思路。