Appearance
Attention 与 Transformer
本页沿着“注意力计算—位置与掩码—Transformer Block—反向传播—预训练架构”的主线整理 Transformer。
一、注意力机制:从 MHA 到 GQA 与 MLA
注意力机制根据 Query 与 Key 的匹配程度,对 Value 做加权汇总。自注意力中,
1.1 Scaled Dot-Product Attention 与维度约束
单个注意力头的基本形式为:
若:
则注意力分数矩阵
Value 的最后一维只参与最后的加权求和,不要求与
在工程实现中经常令
Softmax 不是把原始分数直接除以分数总和,而是先指数化再归一化:
手算 Self-Attention 时,可以固定按以下顺序检查:
其中 Softmax 对分数矩阵的每一行独立计算。
因此,
Self-Attention 的矩阵计算示例
下面用两个 token 演示完整的数据流。为突出“注意力权重还要继续加权
先做三组线性投影:
然后计算所有 Query 对所有 Key 的分数:
对每一行应用 Softmax:
最后不能停在
例如第一行表示第一个 token 主要读取第二个 token 的 Value:
这里还要注意维度与缩放因子的对应关系:上面的
多头注意力可以写为:
其中
在总模型维度
序列长度为
因此不能简单说“有
多头注意力提供的是多个表示子空间和关系视角,但它本身不能替代位置编码。仅依赖 token 内容的自注意力无法自然区分顺序关系,因此 Transformer 还需要绝对位置编码、相对位置编码、RoPE 或 ALiBi 等位置机制。可以将两者区分为:注意力决定“关注什么”,位置机制补充“位于哪里”。
为什么要除以
在各维独立、均值约为
包含
缩放后:
如果不缩放,较大的点积可能让 Softmax 输出过于尖锐,进入饱和区,使反向梯度变小。除以
Softmax 的数值稳定实现
当 logits 很大时,直接计算
工程实现通常取
1.2 Causal Mask:限制信息流向
因果掩码(Causal Mask)用于自回归序列建模,使第
然后在 Softmax 前加入掩码:
被置为
经典 Transformer 中,Encoder 的自注意力通常可以双向访问输入,Decoder 的自注意力需要使用因果掩码来保持自回归性质;Encoder-Decoder Cross-Attention 是否需要掩码则取决于源序列和目标序列的可见性规则。因果掩码也不限于文本,只要任务是根据过去预测未来,就可以用于音频、图像 token、视频、时间序列或动作序列。
Causal Mask 的数值示例
设未缩放的分数矩阵和因果掩码分别为:
相加后:
按行应用 Softmax,第一行变为
因此注意力权重为:
这里不能把
1.3 MHA、GQA 与 MQA
标准 MHA 为每个 Query Head 配置独立的 Key Head 和 Value Head。GQA(Grouped-Query Attention)把 Query Head 分成若干组,每组共享一个 K/V Head;MQA(Multi-Query Attention)则让所有 Query Head 共享同一个 K/V Head。
设 Query Head 数量为
| 注意力形式 | 核心结构 | ||
|---|---|---|---|
| MHA | 每个 Query Head 使用自己的 K/V Head | ||
| GQA | 每组 Query Head 共享一个 K/V Head | ||
| MQA | 所有 Query Head 共享一个 K/V Head |
因此,MHA、GQA、MQA 是 K/V 共享程度逐渐提高的一条连续路线。共享 K/V 不会迫使不同 Query 组串行计算;各组仍然可以组织成批量矩阵运算,在 GPU 上并行执行。它改变的是投影和缓存的组织方式,而不是把注意力变成只能逐组执行的循环。
1.4 KV Cache:为什么主要影响推理
自回归生成时,每次只新增一个 token,但新 Query 需要与此前所有位置的 Key 计算匹配,并使用此前所有位置的 Value。因此,推理过程会缓存已经计算过的 K/V,避免重复计算:
虽然
但它们在自回归解码中的复用方式不同。当前 Query 只负责本步查询历史缓存:
本步的
因果结构还保证了过去位置不能读取未来 token,因此已经算好的历史
在 batch size 为
因此,在 Query Head 数和每头维度相同的情况下,GQA 相对 MHA 的缓存比例大致为:
例如
GQA 通常是 MHA 与 MQA 之间的折中:减少缓存和带宽压力,同时保留多组 K/V 以降低过度共享带来的表达能力损失。但具体质量、延迟和吞吐仍取决于模型结构、硬件、量化方式和实现,不能把某个固定比例当成所有模型的保证。
1.5 MLA:对 K/V 做联合低秩压缩
MLA(Multi-head Latent Attention,多头潜在注意力)与 GQA 的改造方向不同。GQA 主要减少 K/V Head 的数量;MLA 则把每个 token 的 K/V 信息投影到较低维的潜在空间,缓存压缩后的表示。
一种概念化写法是:
其中
随后可以通过上投影产生注意力需要的内容信息:
实际 MLA 实现还可能把位置信息从内容表示中解耦,并为位置相关部分保留额外的紧凑表示,例如结合 RoPE 的位置分量。因此,“MLA 只缓存一个 latent、完全不需要任何其他缓存”是过度简化;更准确的说法是:它不再缓存完整的每头 K/V,而是缓存低秩压缩后的 K/V 信息及必要的位置信息。
| 方法 | 降低 KV Cache 的主要方式 | 典型取舍 |
|---|---|---|
| GQA | 多个 Query Head 共享一组 K/V Head | 实现相对直接;共享过多可能损失部分表达能力 |
| MQA | 所有 Query Head 共享唯一 K/V Head | 缓存最小,但质量退化风险通常更明显 |
| MLA | 对 K/V 做联合低秩压缩,缓存 latent 及必要的位置分量 | 压缩更激进;需要额外投影、重计算或硬件适配 |
MLA 的突出目标是降低生成阶段的 KV Cache、显存占用和内存带宽压力,而不是普遍保证训练速度快于 MHA。实际推理速度还会受到矩阵吸收、是否重构 K/V、硬件访存和算力比例等因素影响。
注意力变体速记
MHA:每个 Query Head 有自己的 K/V;GQA:一组 Query Head 共享一组 K/V;MQA:所有 Query Head 共享一组 K/V;MLA:把 K/V 信息压缩到低维 latent 后缓存。GQA 是“少存几组”,MLA 是“压缩后再存”。
1.6 Encoder-Decoder Cross-Attention
在 Encoder-Decoder 架构中,Cross-Attention 让 Decoder 的当前位置查询 Encoder 对输入序列产生的上下文表示。若 Encoder 和 Decoder 的隐藏表示分别为
因此,Decoder 提供 Query,Encoder 提供 Key 和 Value。Decoder 当前状态相当于当前的查询条件,Key 用于计算输入中的哪些位置相关,Value 则提供被加权读取的内容。
| 注意力类型 | 典型可见性 | ||
|---|---|---|---|
| Encoder Self-Attention | Encoder | Encoder | 通常双向 |
| Decoder Masked Self-Attention | Decoder | Decoder | 当前位置及过去 |
| Encoder-Decoder Cross-Attention | Decoder | Encoder | 由源序列和任务规则决定 |
Cross-Attention 不应与 Decoder 的 Masked Self-Attention 混淆:后者的
1.7 RoPE:把位置关系编码进 Query 和 Key
直接相加的绝对位置编码通常写成:
RoPE(Rotary Position Embedding)则根据位置对 Query 和 Key 做旋转,而不是把位置向量直接加到 token embedding 上。对二维子空间,旋转矩阵可以写成:
对位置
由于旋转矩阵满足
实际高维 RoPE 会在多个二维子空间上分别旋转。它的关键不是生成一组独立的位置向量,而是让
位置机制速记
绝对位置编码把位置表示加到隐藏向量上;RoPE 把位置旋转到 Query 和 Key 中,使注意力内积能够感知相对位置。多头注意力解决“关注什么”,位置机制补充“位于哪里”。
1.8 长序列与推理优化:FlashAttention、Linear Attention、PagedAttention
标准全注意力的核心配对仍然要处理长度为
FlashAttention 是对标准 Softmax Attention 的 IO-aware 精确实现。它通过 tiling、在线 Softmax 和片上 SRAM 分块计算,减少 HBM 与 SRAM 之间的读写,并避免显式保存完整的
Linear Attention 则改变注意力的计算形式。通过特征映射
这里
PagedAttention 主要解决 KV Cache 的内存分配问题。它把逻辑上的 KV Cache 切成固定大小的 block,通过 block table 将逻辑 block 映射到不必连续的物理显存 block,类似操作系统的分页机制:
这样可以减少不同长度请求造成的预留浪费和显存碎片,也便于请求之间共享或回收缓存块。但 PagedAttention 不改变每个 token 需要保存相应 KV 信息这一事实:
其中
| 技术 | 主要优化对象 | 是否改变标准注意力形式 | 长度相关结论 |
|---|---|---|---|
| FlashAttention | HBM/SRAM 数据搬运和中间结果存储 | 否,标准实现是精确计算 | 核心计算仍约为 |
| Linear Attention | 注意力代数形式和历史状态 | 是,通常使用特征映射 | 固定状态下总体可做到线性于 |
| PagedAttention | KV Cache 的 block 分配和回收 | 否 | Cache 对单请求仍近似随 |
| Sliding Window | 只保留最近窗口的历史信息 | 是,限制可见范围 | 窗口固定时 Cache 可受窗口大小限制,但远距离依赖会被截断 |
长序列优化速记
FlashAttention:同一个标准 Attention 算得更省显存、更快;Linear Attention:改变计算形式并维护递归状态;PagedAttention:把 KV Cache 分页管理,减少碎片和预留浪费。
二、对比学习与 InfoNCE
对比学习通过同时利用正样本和负样本学习表示:正样本在表示空间中应更接近,负样本应更容易区分。以图文对齐为例,一个 batch 中有
先定义图像和文本表示的相似度,例如归一化向量的余弦相似度:
以图像检索文本为方向,常见的 InfoNCE 损失为:
其中
因此,对比学习可以理解为把“匹配关系”转成 batch 内的分类问题,并通过交叉熵或 NLL 形式优化。batch 中的其他样本提供了 in-batch negatives;batch 越小,负样本多样性通常越有限。还需要注意语义相近但被标成不同配对的样本可能形成 false negative,温度、向量归一化和负样本构造都会影响训练效果。
配对 MSE:
可以直接拉近正样本,但它没有自然地惩罚
对比学习速记
正样本拉近、负样本推远;InfoNCE 用 Softmax 和负对数似然让正确配对在候选集合中得分最高。只使用配对 MSE 只能保证“配对接近”,不能充分保证“错配分离”。
三、Logits、Softmax 与多类交叉熵
对于互斥多分类,神经网络最后的线性层输出
Sigmoid 与 Softmax 的输入输出粒度
单个 Sigmoid 通常把一个标量 logit 映射为一个独立概率;对向量使用 Sigmoid 时,是逐分量计算,各分量之间不要求加和为
设真实类别为
交叉熵衡量预测概率分布与目标分布之间的差异,会鼓励模型提高真实类别的概率;如果模型对错误类别过度自信,使
3.1 Softmax + 交叉熵、NLL 与 MLE
对第
整个数据集的交叉熵总和与负对数似然(NLL)只差一个记号:
从似然到 NLL 的推导
假设样本在给定模型参数
取负对数后,乘积变为求和:
这正是 one-hot 交叉熵的总和。若使用批量平均,只是再除以固定的样本数
由于取平均不会改变最优参数,最小化 Softmax + 交叉熵等价于最小化 NLL,也等价于最大化似然:
因此,在分类概率模型和 one-hot 标签的条件下,最小化 Softmax + 交叉熵等价于最大似然估计(MLE)。
工程实现中通常直接把 logits 和标签交给带 logits 的交叉熵接口,由内部完成 log-softmax 与 NLL 的组合,而不是先显式计算 Softmax 再取对数。这样可以减少数值下溢和上溢风险。减去同一个最大 logit 不会改变 Softmax 的结果,也是常见的数值稳定化思路。
Softmax 与交叉熵速记
Softmax 把 logits 转成和为
四、Transformer Block:Attention、FFN、残差与归一化
4.1 LayerNorm:沿 hidden_dim 归一化
LayerNorm(Layer Normalization)对每个样本或每个 token 的隐藏向量单独计算统计量。若某个隐藏向量为
归一化并施加可学习的缩放和平移参数后:
对于形状为
因此,归一化的中间结果通常接近均值
| 归一化方法 | 统计量主要沿哪一侧计算 | 是否依赖 batch | 常见场景 |
|---|---|---|---|
| LayerNorm | 每个样本/token 的 hidden_dim | 通常不依赖 | Transformer、序列模型 |
| BatchNorm | batch 维,以及适用时的空间位置 | 训练阶段依赖 batch 统计量 | CNN、部分全连接网络 |
由于统计量只来自当前 token 的 hidden_dim,LayerNorm 不要求不同样本具有相同的序列长度,也不依赖较大的 batch;推理时即使
从 LayerNorm 算子自身看,主要操作是沿 hidden_dim 的归约统计、归一化和逐元素仿射变换,单个隐藏向量的计算量为
4.2 Attention 与 Position-wise FFN 的分工
设一个 Transformer Block 的输入表示为:
Attention 负责不同位置之间的信息交互。第
因此 Attention 建立的是 token 与 token 之间的联系,适合处理指代、依赖和跨位置上下文。
标准的 Position-wise FFN 则对每个位置独立使用同一组参数:
它对每个 token 都执行相同的两层非线性变换,但处理某个位置时不会直接读取其他位置的表示。二者分工为:
二者的主要计算规模也不同。Attention 的位置两两交互核心约为
标准两层 FFN 只计算权重时的参数量约为:
如果两层线性层都带 bias,完整参数量为:
其中,
标准 FFN 参数量示例
当
两层权重参数量为:
因此每层约为
若要计算多层 FFN 的总量,才需要再乘以 Transformer 层数。
4.3 残差连接与 Pre-LN
Transformer 子层通常通过残差连接保留输入:
其局部梯度为:
恒等矩阵
现代 Transformer 中常见的 Pre-LN 结构可以抽象为:
对于单个子层,经典 Post-LN 可以写成:
两者的区别不只是公式位置变化:Pre-LN 把归一化放在 Attention 或 FFN 之前,使残差主路径更直接;Post-LN 在残差相加后归一化。深层训练时的稳定性还取决于初始化、学习率、残差缩放和具体架构,不能把任一种形式视为所有模型的绝对最优方案。
这里 LayerNorm 负责稳定子层输入的数值尺度,残差连接负责保留主路径和梯度通路。二者作用不同,但经常组合使用;单纯增加层数并不能解决深层训练困难。
4.4 RMSNorm:只做尺度归一化
RMSNorm(Root Mean Square Layer Normalization)可以看作 LayerNorm 的简化形式。它不先减去特征均值,而是直接用均方根对当前 token 的隐藏向量进行尺度归一化:
其中
| 方法 | 主要操作 | 是否减均值 | 常见特点 |
|---|---|---|---|
| LayerNorm | 减均值,再按标准差缩放 | 是 | 中心化和尺度归一化,通常带 |
| RMSNorm | 按均方根缩放 | 否 | 结构更简单,常用于现代 Transformer,但并非所有模型都适用 |
RMSNorm 的动机是:对优化有帮助的未必是重新中心化本身,稳定特征尺度可能已经足够。它不是把输出强制成标准正态分布,也不意味着一定比 LayerNorm 效果更好;具体取舍仍需结合模型结构、训练稳定性和验证结果判断。
LayerNorm 与 RMSNorm 速记
LayerNorm:减均值后按标准差缩放;RMSNorm:不减均值,只按均方根缩放。
4.5 BatchNorm:训练时 batch 统计,推理时 running 统计
BatchNorm(Batch Normalization)通常按特征或通道归一化,但统计量来自当前 mini-batch。以某个被归一化的特征为例,训练阶段先计算:
再使用:
同时,BatchNorm 会维护训练期间累计的 running mean 和 running variance。用
不同框架对 momentum 参数的定义可能相反,因此使用接口时应以具体实现的约定为准。核心行为不变:
| 模式 | 归一化使用的统计量 | 目的 |
|---|---|---|
| 训练模式 | 当前 mini-batch 的 | 适应当前训练批次并更新 running statistics |
| 推理模式 | 训练期间累计的 | 让结果不依赖推理时同批的其他样本 |
当 batch 很小时,
Dropout 与 BatchNorm 同时使用时,顺序需要谨慎。若 Dropout 放在 BatchNorm 前,BatchNorm 训练时看到的是随机置零后的激活分布,而推理时 Dropout 被关闭,训练期间累计的统计量可能与推理分布不匹配。这不表示两者绝对不能一起使用,但应避免把这种组合当成没有分布偏移的无条件叠加。
BatchNorm 通过稳定中间激活的尺度,通常可以让优化更平稳、对初始化不那么敏感,并允许在合适条件下使用相对更大的学习率。它可能间接改善最终泛化效果,但不保证测试集准确率必然提高;其可学习参数主要是每个特征或通道的
教材常把 BatchNorm 的作用概括成“减少 Internal Covariate Shift”,但这不是唯一或充分的机制解释。更稳妥的理解是:归一化改善了数值尺度和优化条件,而最终效果仍取决于 batch 大小、网络结构、数据分布和训练配置。
与 LayerNorm 对比时,最重要的区别是:
BN 与 LN 的统计方向
BatchNorm 跨样本统计;LayerNorm 在当前样本或 token 内沿 hidden_dim 统计。
五、反向传播:用链式法则计算梯度
反向传播(backpropagation)是一种高效计算梯度的算法,不是优化器。给定前向传播得到的损失
5.1 计算图与链式法则
把网络拆成若干个中间变量后,每个变量都可以看成计算图中的一个节点。对于串联计算:
从
前向传播负责计算输出并保存反向传播需要的中间值,例如线性层输入、加权和与激活结果;反向传播按照计算图的逆拓扑顺序逐层传递梯度。实际自动微分框架通常计算向量与雅可比矩阵的乘积,而不是显式构造完整的雅可比矩阵,以降低内存和计算开销。
5.2 线性层的梯度
沿用列向量表示,设一个线性层的输入为
令上游传来的梯度为
这三个结果分别用于更新权重、偏置,以及继续向前一层传递梯度。对一个 mini-batch,梯度需要沿 batch 维累加或求平均,具体取决于损失函数的 reduction 设置;不能把每个样本的梯度任意丢弃。
5.3 激活函数对梯度的影响
如果线性层输出
其中
连续多层反向传播会把许多局部导数相乘:局部导数长期小于
5.4 Softmax 与交叉熵的输出梯度
在未加权的互斥多分类任务中,设
Softmax 与交叉熵组合后,对 logits 的梯度可以直接化简为:
因此,真实类别对应的梯度为
Softmax + 交叉熵梯度的化简
Softmax 的对数导数满足:
代入交叉熵并利用 one-hot 标签满足
5.5 反向传播中的常见误区
| 概念 | 正确理解 |
|---|---|
| 反向传播 | 用链式法则计算损失对参数和中间变量的梯度 |
| 优化器 | 根据梯度和学习率实际修改参数,例如 SGD 或 Adam |
| 梯度方向 | 梯度指向损失增大的方向,梯度下降沿负梯度方向更新 |
| 多条路径 | 一个变量从多条路径影响损失时,各路径梯度需要相加 |
| 计算图缓存 | 反向传播需要前向阶段保留的中间值,训练框架通常会管理其生命周期 |
| 梯度累积 | 多次反向传播可能累积到参数梯度中,开始下一步前通常需要按框架约定清零或有意累积 |
反向传播速记
前向传播保存中间值,反向传播沿计算图使用链式法则;局部导数乘以上游梯度得到当前梯度,优化器再根据梯度更新参数。
六、深度网络的一次训练闭环
可以把有监督训练概括为四步:
前向传播:输入经过线性层、激活函数和输出层,得到 logits 或预测值;
计算损失:分类通常使用交叉熵,回归可使用 MSE、MAE 或 Huber;
反向传播:沿计算图反向应用链式法则,计算损失对各层参数的梯度;
参数更新:优化器按照梯度调整参数,例如梯度下降的一步为:
其中
七、BERT、GPT、T5 与 BART 的架构
经典 Transformer 模型可以按照 Encoder 和 Decoder 的组合方式分为三类:
| 架构 | 注意力可见范围 | 典型训练目标 | 更擅长的任务 |
|---|---|---|---|
| Encoder-only | 输入 token 之间通常可以双向注意 | Masked Language Modeling 等 | 表示学习、分类、序列标注、抽取 |
| Decoder-only | 第 | Next-token prediction | 续写、对话、代码生成 |
| Encoder-Decoder | Encoder 读完整输入,Decoder 因果生成并 Cross-Attend 到 Encoder | 条件生成、去噪重建、文本到文本 | 翻译、摘要、改写和输入到输出的生成任务 |
因此,判断模型架构时应同时看两件事:信息在注意力中如何流动,以及预训练目标要求模型完成什么任务。不能只根据“是否使用 Transformer”判断模型属于 Encoder 还是 Decoder。
7.1 BERT:Encoder-only 的双向理解模型
BERT 使用 Encoder-only 架构。对于被遮住的 token,模型可以利用它左右两侧的上下文:
这对应 Masked Language Modeling(MLM)。原始 BERT 还使用过 Next Sentence Prediction(NSP),用于判断两个句子是否具有原文中的连续关系;后续模型变体可能移除或替换 NSP,因此不能把 NSP 当成所有 Encoder 模型的必要组件。
BERT 的双向表示非常适合理解输入内容,例如文本分类、情感分析、命名实体识别、序列标注和抽取式问答。但它不是按照从左到右的因果分解训练的,直接用于连续长文本生成并不自然;反复填充 Mask 可以完成某些 infilling 任务,却不等价于原生的自回归生成。
原始 BERT 的输入表示还包含句段信息:
在句子对任务中,Token-Type ID 可以区分句子 A 和句子 B。这里的 Token-Type Embedding 是输入表示的一部分,不是用来替代位置编码或上下文 Attention 的。
7.2 GPT:Decoder-only 的自回归生成模型
GPT 使用 Decoder-only 架构和因果注意力。其核心目标是按从左到右的顺序预测下一个 token:
因为第
text
提示词 → 生成 token 1 → 生成 token 2 → 生成 token 3 → …因此 GPT 类模型天然适合续写、对话、代码生成和开放式文本生成。在经典架构分类和面试题语境中,GPT 系列通常归入 Decoder-only;对于闭源模型,不应根据公开资料过度推断未披露的内部实现细节。
GPT 通常不使用 BERT 那种专门区分句子 A/B 的 Token-Type Embedding,主要依赖 token 表示、位置机制和 Decoder 层完成自回归建模;具体实现仍可能随模型版本而变化。
7.3 T5:统一的 Encoder-Decoder 文本到文本框架
T5(Text-to-Text Transfer Transformer)使用 Encoder-Decoder 架构,把不同 NLP 任务统一改写成“输入文本到输出文本”:
Encoder 可以双向读取输入;Decoder 使用因果 Mask 生成输出,并通过 Cross-Attention 读取 Encoder 的表示。翻译任务可以写成:
text
translate English to Chinese: I love AI
→ 我 喜欢 人工智能因此 T5 同时具备理解输入和条件生成输出的能力,适合翻译、摘要、问答、改写等任务。它不是单纯的 Encoder-only,也不是只依赖历史输出的 Decoder-only。
7.4 BART:通过去噪重建训练的 Encoder-Decoder
BART 也是 Encoder-Decoder 模型,训练时先对原文本施加破坏,再让模型恢复原文:
破坏方式可以包括遮盖、删除、打乱或填充文本片段。Encoder 负责从受损输入中提取双向表示,Decoder 负责自回归地重建目标文本。
常把 BART 直观地理解为“BERT 式 Encoder 与 GPT 式 Decoder 的组合”,但这只是帮助记忆的结构类比;更准确的描述是:BART 通过去噪自编码目标训练一个 Encoder-Decoder 生成模型。因此它适合摘要、翻译、文本恢复和其他条件生成任务。
7.5 四类模型的统一比较
| 模型 | 架构 | 主要信息流 | 典型目标或用途 |
|---|---|---|---|
| BERT | Encoder-only | 双向读取输入,输出上下文表示 | MLM、原始 BERT 的 NSP、分类和抽取 |
| GPT | Decoder-only | 因果读取历史,逐 token 生成 | Next-token prediction、对话和续写 |
| T5 | Encoder-Decoder | Encoder 编码输入,Decoder 条件生成 | Text-to-Text、翻译和摘要 |
| BART | Encoder-Decoder | Encoder 编码受损输入,Decoder 重建文本 | 去噪重建、摘要和文本生成 |
Transformer 模型架构速记
BERT 重点是双向读懂输入;GPT 重点是因果地接着生成;T5 和 BART 都是 Encoder-Decoder,先编码输入,再由 Decoder 生成目标文本。