Skip to content

Attention 与 Transformer ​

本页沿着“注意力计算—位置与掩码—Transformer Block—反向传播—预训练架构”的主线整理 Transformer。

一、注意力机制:从 MHA 到 GQA 与 MLA ​

注意力机制根据 Query 与 Key 的匹配程度,对 Value 做加权汇总。自注意力中,Q、K、V 都来自同一段隐藏表示;多头注意力则把表示投影到多个子空间并行计算,使不同头可以关注不同的位置关系。

1.1 Scaled Dot-Product Attention 与维度约束 ​

单个注意力头的基本形式为:

Attention(Q,K,V)=softmax(QKTdk)V

若:

Q∈Rnq×dk,K∈Rnk×dk,V∈Rnk×dv

则注意力分数矩阵 QKT 的形状为 nq×nk,最终输出形状为 nq×dv。因此,能够进行点积的必要条件是 Query 与 Key 的最后一维相同:

dQ=dK=dk

Value 的最后一维只参与最后的加权求和,不要求与 dk 相同:

dv≠dk

在工程实现中经常令 dv=dk,但这是常见设计选择,而不是矩阵乘法的数学必要条件。

Softmax 不是把原始分数直接除以分数总和,而是先指数化再归一化:

softmax(z)i=exp⁡(zi)∑jexp⁡(zj)

手算 Self-Attention 时,可以固定按以下顺序检查:

X→Q,K,V→S=QKTdk→A=softmax(S)→O=AV

其中 Softmax 对分数矩阵的每一行独立计算。A 是“每个 Query 应该关注各个 Key 多少”的注意力权重,O 才是利用这些权重从 Value 中汇总得到的输出;不能把 Softmax 的结果直接当成最终表示。对第 i 个位置而言:

oi=∑j=1nkaijvj

因此,Q 和 K 共同决定“看谁”,V 决定“取回什么内容”。这是检查手算结果时最容易漏掉的一步。

Self-Attention 的矩阵计算示例

下面用两个 token 演示完整的数据流。为突出“注意力权重还要继续加权 V”,先采用未缩放的点积:

X=[0120],WQ=[1112],WK=[0110],WV=[2001]

先做三组线性投影:

Q=XWQ=[1222],K=XWK=[1002],V=XWV=[0140]

然后计算所有 Query 对所有 Key 的分数:

S=QKT=[1424]

对每一行应用 Softmax:

A=softmax(S)≈[0.04740.95260.11920.8808]

最后不能停在 A,还要计算:

O=AV≈[3.81040.04743.52320.1192]

例如第一行表示第一个 token 主要读取第二个 token 的 Value:

o1≈0.0474[0,1]+0.9526[4,0]=[3.8104,0.0474]

这里还要注意维度与缩放因子的对应关系:上面的 Q、K 最后一维实际为 2,所以如果严格使用标准 Scaled Dot-Product Attention,应当将 QKT 除以 2,数值结果会与未缩放示例不同。若题目另行规定缩放因子为 1,才对应上面展示的简化计算。dk 应由 Query/Key 的最后一维决定,不能只看题干中的一个独立数字。

多头注意力可以写为:

headi=Attention(QWiQ,KWiK,VWiV)MHA(Q,K,V)=Concat(head1,…,headh)WO

其中 h 是头数,每个头拥有自己的投影子空间。Scaled Dot-Product 中除以 dk 的作用是控制点积的数值尺度,而不是加入位置信息或增加模型容量。

在总模型维度 dmodel 固定的标准比较中,头数增加时每个头的维度通常同步减小:

dh=dmodelh

序列长度为 n 时,单个头计算 QiKiT 的复杂度约为 O(n2dh),h 个头合计约为:

h⋅O(n2dh)=O(n2dmodel)

因此不能简单说“有 h 个头,注意力计算量就变成单头的 h 倍”。在总维度固定时,投影层的主要复杂度也通常仍近似为 O(ndmodel2)。如果比较时同时固定每个头的维度而不是固定总模型维度,结论则需要重新计算。

多头注意力提供的是多个表示子空间和关系视角,但它本身不能替代位置编码。仅依赖 token 内容的自注意力无法自然区分顺序关系,因此 Transformer 还需要绝对位置编码、相对位置编码、RoPE 或 ALiBi 等位置机制。可以将两者区分为:注意力决定“关注什么”,位置机制补充“位于哪里”。

为什么要除以 dk

在各维独立、均值约为 0、方差约为 1 的近似条件下:

qTk=∑r=1dkqrkr

包含 dk 项相加,因此其方差大致与 dk 成正比:

Var(qTk)≈dk

缩放后:

Var(qTkdk)≈1

如果不缩放,较大的点积可能让 Softmax 输出过于尖锐,进入饱和区,使反向梯度变小。除以 dk 可以把 logits 控制在更稳定的范围;它不是保证梯度永远稳定的充分条件,实际结果仍受初始化、归一化和输入分布影响。

Softmax 的数值稳定实现

当 logits 很大时,直接计算 exp⁡(zi) 可能溢出。由于对任意常数 c 都有:

softmax(z)=softmax(z−c)

工程实现通常取 c=maxizi,先将最大值减为 0,再计算指数。这样不会改变 Softmax 的结果,却能显著降低指数溢出的风险。

1.2 Causal Mask:限制信息流向 ​

因果掩码(Causal Mask)用于自回归序列建模,使第 i 个位置只能访问当前位置及其之前的位置,不能访问未来位置。可将掩码写成:

Mij={0,j≤i−∞,j>i

然后在 Softmax 前加入掩码:

A=softmax(QKTdk+M)

被置为 −∞ 的位置经过 Softmax 后权重为 0,因此训练时不会把目标序列的未来信息泄漏给当前位置。因果掩码限制的是信息可见性,不是局部注意力,也不是为了增强空间局部性。

经典 Transformer 中,Encoder 的自注意力通常可以双向访问输入,Decoder 的自注意力需要使用因果掩码来保持自回归性质;Encoder-Decoder Cross-Attention 是否需要掩码则取决于源序列和目标序列的可见性规则。因果掩码也不限于文本,只要任务是根据过去预测未来,就可以用于音频、图像 token、视频、时间序列或动作序列。

Causal Mask 的数值示例

设未缩放的分数矩阵和因果掩码分别为:

S=[2413],M=[0−∞00]

相加后:

S+M=[2−∞13]

按行应用 Softmax,第一行变为 (1,0);第二行则为:

(ee+e3,e3e+e3)≈(0.119,0.881)

因此注意力权重为:

[10ee+e3e3e+e3]

这里不能把 (1,3) 直接按 1:3 归一化为 (0.25,0.75);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 数量为 NQ,K/V Head 数量为 NKV,通常要求 NQ 可以被 NKV 整除,以便将 Query Head 均匀分组:

注意力形式NQNKV核心结构
MHAhh每个 Query Head 使用自己的 K/V Head
GQAhg,其中 1<g<h每组 Query Head 共享一个 K/V Head
MQAh1所有 Query Head 共享一个 K/V Head

因此,MHA、GQA、MQA 是 K/V 共享程度逐渐提高的一条连续路线。共享 K/V 不会迫使不同 Query 组串行计算;各组仍然可以组织成批量矩阵运算,在 GPU 上并行执行。它改变的是投影和缓存的组织方式,而不是把注意力变成只能逐组执行的循环。

1.4 KV Cache:为什么主要影响推理 ​

自回归生成时,每次只新增一个 token,但新 Query 需要与此前所有位置的 Key 计算匹配,并使用此前所有位置的 Value。因此,推理过程会缓存已经计算过的 K/V,避免重复计算:

KV Cache={K1,V1,…,Kt,Vt}

虽然 Q、K、V 都由当前隐藏状态经过线性投影得到:

qt=htWQ,kt=htWK,vt=htWV

但它们在自回归解码中的复用方式不同。当前 Query 只负责本步查询历史缓存:

ot=softmax(qt[K1,…,Kt]Tdk)[V1,…,Vt]

本步的 qt 计算完成后通常没有后续复用价值;而历史 Ki,Vi 会被之后的 qt+1,qt+2,… 反复读取,所以需要追加到 KV Cache。历史 Query 当然也可以被存储,但缓存它通常不能减少后续解码所需的核心计算。

因果结构还保证了过去位置不能读取未来 token,因此已经算好的历史 Ki,Vi 不会因为新 token 到来而需要重新计算。这正是 KV Cache 能够安全复用的条件之一。

在 batch size 为 B、层数为 L、当前缓存长度为 T、每个 K/V Head 的维度近似为 dh、每个元素占 s 字节时,KV Cache 的显存占用可粗略写成:

MemoryKV≈2BLTNKVdhs

因此,在 Query Head 数和每头维度相同的情况下,GQA 相对 MHA 的缓存比例大致为:

MemoryGQAMemoryMHA≈NKVNQ

例如 NQ=32、NKV=8 时,K/V 缓存约为 MHA 的四分之一。上下文长度、batch size 和并发请求数增大时,KV Cache 会线性增长,并可能成为推理显存和内存带宽的主要瓶颈。

GQA 通常是 MHA 与 MQA 之间的折中:减少缓存和带宽压力,同时保留多组 K/V 以降低过度共享带来的表达能力损失。但具体质量、延迟和吞吐仍取决于模型结构、硬件、量化方式和实现,不能把某个固定比例当成所有模型的保证。

1.5 MLA:对 K/V 做联合低秩压缩 ​

MLA(Multi-head Latent Attention,多头潜在注意力)与 GQA 的改造方向不同。GQA 主要减少 K/V Head 的数量;MLA 则把每个 token 的 K/V 信息投影到较低维的潜在空间,缓存压缩后的表示。

一种概念化写法是:

ctKV=WDKVht

其中 ht 是当前 token 的隐藏表示,ctKV 是低维 latent,通常满足:

dim⁡(ctKV)≪dim⁡(Kt,Vt)

随后可以通过上投影产生注意力需要的内容信息:

ktC=WUKctKV,vt=WUVctKV

实际 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 的隐藏表示分别为 Henc、Hdec,则:

Q=HdecWQ,K=HencWK,V=HencWV

因此,Decoder 提供 Query,Encoder 提供 Key 和 Value。Decoder 当前状态相当于当前的查询条件,Key 用于计算输入中的哪些位置相关,Value 则提供被加权读取的内容。

注意力类型Q 的来源K,V 的来源典型可见性
Encoder Self-AttentionEncoderEncoder通常双向
Decoder Masked Self-AttentionDecoderDecoder当前位置及过去
Encoder-Decoder Cross-AttentionDecoderEncoder由源序列和任务规则决定

Cross-Attention 不应与 Decoder 的 Masked Self-Attention 混淆:后者的 Q,K,V 都来自 Decoder,Causal Mask 主要约束的也是这条自回归自注意力路径。

1.7 RoPE:把位置关系编码进 Query 和 Key ​

直接相加的绝对位置编码通常写成:

xi′=xi+pi

RoPE(Rotary Position Embedding)则根据位置对 Query 和 Key 做旋转,而不是把位置向量直接加到 token embedding 上。对二维子空间,旋转矩阵可以写成:

R(θ)=[cos⁡θ−sin⁡θsin⁡θcos⁡θ]

对位置 m、n 的 Query 和 Key,概念上有:

qm=Rmq,kn=Rnk

由于旋转矩阵满足 RmTRn=Rn−m,注意力内积包含相对位置差:

qmTkn=qTRmTRnk=qTRn−mk

实际高维 RoPE 会在多个二维子空间上分别旋转。它的关键不是生成一组独立的位置向量,而是让 QKT 对位置差具有结构化感知能力。RoPE 常用于自回归 Decoder,也可以用于其他 Transformer 结构;它不保证任意超出训练长度的上下文都能稳定外推,长度扩展仍依赖频率设置和相应的 scaling 方法。

位置机制速记

绝对位置编码把位置表示加到隐藏向量上;RoPE 把位置旋转到 Query 和 Key 中,使注意力内积能够感知相对位置。多头注意力解决“关注什么”,位置机制补充“位于哪里”。

1.8 长序列与推理优化:FlashAttention、Linear Attention、PagedAttention ​

标准全注意力的核心配对仍然要处理长度为 N 的位置两两关系,注意力矩阵的计算复杂度约为 O(N2d),朴素实现还可能显式保存 N×N 的注意力分数或权重。下面三种技术解决的层次不同,不能混为一谈。

FlashAttention 是对标准 Softmax Attention 的 IO-aware 精确实现。它通过 tiling、在线 Softmax 和片上 SRAM 分块计算,减少 HBM 与 SRAM 之间的读写,并避免显式保存完整的 N×N 注意力矩阵。标准 FlashAttention 计算的仍是精确的标准注意力,不是低秩近似,因此不会把核心算术复杂度从 O(N2d) 自动改成 O(N);它主要改善实际运行时间、显存峰值和内存访问效率。

Linear Attention 则改变注意力的计算形式。通过特征映射 ϕ,可以将相似度写成可结合的形式。一个带归一化项的因果形式为:

St=St−1+ϕ(kt)vtTzt=zt−1+ϕ(kt)ot=ϕ(qt)TStϕ(qt)Tzt

这里 St 和 zt 是随时间更新的固定大小状态。若特征维度固定,单个新 token 的计算不再需要与全部历史 Key 逐一配对,总体序列成本可以随 N 线性增长;代价是它通常改变了标准 Softmax 相似度,可能带来表达能力或精度取舍。因此,Linear Attention 是改写计算形式,而 FlashAttention 是更高效地执行原来的计算。

PagedAttention 主要解决 KV Cache 的内存分配问题。它把逻辑上的 KV Cache 切成固定大小的 block,通过 block table 将逻辑 block 映射到不必连续的物理显存 block,类似操作系统的分页机制:

逻辑 Block⟶物理 Block

这样可以减少不同长度请求造成的预留浪费和显存碎片,也便于请求之间共享或回收缓存块。但 PagedAttention 不改变每个 token 需要保存相应 KV 信息这一事实:

MemoryKV=O(T)

其中 T 是缓存长度。它优化的是“KV Cache 如何分配和存放”,不是“每个 token 需要多少 KV 信息”。

技术主要优化对象是否改变标准注意力形式长度相关结论
FlashAttentionHBM/SRAM 数据搬运和中间结果存储否,标准实现是精确计算核心计算仍约为 O(N2d)
Linear Attention注意力代数形式和历史状态是,通常使用特征映射固定状态下总体可做到线性于 N
PagedAttentionKV Cache 的 block 分配和回收否Cache 对单请求仍近似随 T 线性增长
Sliding Window只保留最近窗口的历史信息是,限制可见范围窗口固定时 Cache 可受窗口大小限制,但远距离依赖会被截断

长序列优化速记

FlashAttention:同一个标准 Attention 算得更省显存、更快;Linear Attention:改变计算形式并维护递归状态;PagedAttention:把 KV Cache 分页管理,减少碎片和预留浪费。

二、对比学习与 InfoNCE ​

对比学习通过同时利用正样本和负样本学习表示:正样本在表示空间中应更接近,负样本应更容易区分。以图文对齐为例,一个 batch 中有 N 个配对样本 (vi,ti),其中 vi 与 ti 是正样本,vi 与 tj(j≠i)是候选负样本。

先定义图像和文本表示的相似度,例如归一化向量的余弦相似度:

sij=viTtj‖vi‖‖tj‖

以图像检索文本为方向,常见的 InfoNCE 损失为:

Lv→t=−1N∑i=1Nlog⁡exp⁡(sii/τ)∑j=1Nexp⁡(sij/τ)

其中 τ>0 是温度参数。分子提高正确图文对的相似度,分母则让错误配对参与竞争;训练目标不是只把正样本拉近,而是让正样本在 batch 内的候选中具有更高相似度。许多跨模态模型还会对文本检索图像计算反方向损失,并取两个方向的平均:

L=12(Lv→t+Lt→v)

因此,对比学习可以理解为把“匹配关系”转成 batch 内的分类问题,并通过交叉熵或 NLL 形式优化。batch 中的其他样本提供了 in-batch negatives;batch 越小,负样本多样性通常越有限。还需要注意语义相近但被标成不同配对的样本可能形成 false negative,温度、向量归一化和负样本构造都会影响训练效果。

配对 MSE:

‖vi−ti‖2

可以直接拉近正样本,但它没有自然地惩罚 vi 与错误文本过于接近的情况,也不直接利用 batch 中的负样本。若所有图像和文本都被映射到同一个向量,配对 MSE 仍可能很小甚至为 0,但模型无法区分不同配对;对比损失会因为分母中的错误候选而惩罚这种塌缩。MSE 并非任何表示对齐任务都不能使用,但对于需要检索和区分配对关系的跨模态任务,InfoNCE 通常更合适。

对比学习速记

正样本拉近、负样本推远;InfoNCE 用 Softmax 和负对数似然让正确配对在候选集合中得分最高。只使用配对 MSE 只能保证“配对接近”,不能充分保证“错配分离”。

三、Logits、Softmax 与多类交叉熵 ​

对于互斥多分类,神经网络最后的线性层输出 K 个 logits。Softmax 的定义、概率范围、概率和为 1 的性质,以及它与 Sigmoid 在二分类和多标签任务中的区别,参见机器学习基础中的分类输出函数。在神经网络中,Softmax 位于分类输出的最后阶段,把 logits 映射为类别概率分布。

Sigmoid 与 Softmax 的输入输出粒度

单个 Sigmoid 通常把一个标量 logit 映射为一个独立概率;对向量使用 Sigmoid 时,是逐分量计算,各分量之间不要求加和为 1。Softmax 则接收一组 logits,输出一组相互耦合且总和为 1 的概率。因此,前者常用于二分类或多标签输出,后者常用于互斥多分类输出。

设真实类别为 c,记 Softmax 输出的真实类别概率为 pc,则 one-hot 标签下的多类交叉熵可写为:

LCE=−log⁡pc

交叉熵衡量预测概率分布与目标分布之间的差异,会鼓励模型提高真实类别的概率;如果模型对错误类别过度自信,使 pc 接近 0,损失会显著增大。不同标签形式对应的输出层和损失函数,参见机器学习基础中的分类输出函数。

3.1 Softmax + 交叉熵、NLL 与 MLE ​

对第 i 个样本,设真实类别索引为 ci,Softmax 给出该类别的概率 pi,ci。one-hot 交叉熵的单样本形式为:

ℓCE,i=−log⁡pi,ci

整个数据集的交叉熵总和与负对数似然(NLL)只差一个记号:

从似然到 NLL 的推导

假设样本在给定模型参数 θ 时条件独立,则真实类别序列的似然为:

P(θ)=∏i=1npi,ci

取负对数后,乘积变为求和:

LNLL(θ)=−log⁡P(θ)=−∑i=1nlog⁡pi,ci

这正是 one-hot 交叉熵的总和。若使用批量平均,只是再除以固定的样本数 n。

由于取平均不会改变最优参数,最小化 Softmax + 交叉熵等价于最小化 NLL,也等价于最大化似然:

arg⁡minθLCE(θ)=arg⁡minθLNLL(θ)=arg⁡maxθP(θ)

因此,在分类概率模型和 one-hot 标签的条件下,最小化 Softmax + 交叉熵等价于最大似然估计(MLE)。

工程实现中通常直接把 logits 和标签交给带 logits 的交叉熵接口,由内部完成 log-softmax 与 NLL 的组合,而不是先显式计算 Softmax 再取对数。这样可以减少数值下溢和上溢风险。减去同一个最大 logit 不会改变 Softmax 的结果,也是常见的数值稳定化思路。

Softmax 与交叉熵速记

Softmax 把 logits 转成和为 1 的类别概率;交叉熵惩罚真实类别概率过低的情况;one-hot 标签下,Softmax + 交叉熵就是分类 NLL,最小化它等价于做 MLE。

四、Transformer Block:Attention、FFN、残差与归一化 ​

4.1 LayerNorm:沿 hidden_dim 归一化 ​

LayerNorm(Layer Normalization)对每个样本或每个 token 的隐藏向量单独计算统计量。若某个隐藏向量为 xi∈Rd,其中 d 是 hidden_dim,则沿特征维计算:

μi=1d∑j=1dxijσi2=1d∑j=1d(xij−μi)2

归一化并施加可学习的缩放和平移参数后:

LN(xij)=γjxij−μiσi2+ε+βj

对于形状为 B×T×d 的 Transformer 表示,d 就是最后一个 hidden_dim 维度。LayerNorm 通常对每个样本中的每个 token 单独计算均值和方差,不依赖当前 batch 中其他样本的统计量。γ 和 β 是可学习参数,用于重新调整归一化后的表示尺度。

因此,归一化的中间结果通常接近均值 0、方差 1,但 LayerNorm 的最终输出不必继续满足这两个数值。逐维看,在忽略 ε 影响的近似下:

E[yj]≈βj,Var(yj)≈γj2

γ 和 β 不是用来强制输出保持标准正态分布,而是让模型可以恢复所需的尺度和平移自由度。

归一化方法统计量主要沿哪一侧计算是否依赖 batch常见场景
LayerNorm每个样本/token 的 hidden_dim通常不依赖Transformer、序列模型
BatchNormbatch 维,以及适用时的空间位置训练阶段依赖 batch 统计量CNN、部分全连接网络

由于统计量只来自当前 token 的 hidden_dim,LayerNorm 不要求不同样本具有相同的序列长度,也不依赖较大的 batch;推理时即使 B=1,仍然可以对每个实际存在的 token 独立归一化。

从 LayerNorm 算子自身看,主要操作是沿 hidden_dim 的归约统计、归一化和逐元素仿射变换,单个隐藏向量的计算量为 O(d)。QKV 投影、注意力计算和 FFN 不属于 LayerNorm 的内部步骤,而是网络中其他子层的矩阵乘法或注意力运算;在 Transformer 的总计算量中,它们通常比 LayerNorm 更重。

4.2 Attention 与 Position-wise FFN 的分工 ​

设一个 Transformer Block 的输入表示为:

X∈RN×dmodel

Attention 负责不同位置之间的信息交互。第 i 个位置的输出可以读取其他位置的 Value:

hi′=∑j=1Nαijvj

因此 Attention 建立的是 token 与 token 之间的联系,适合处理指代、依赖和跨位置上下文。

标准的 Position-wise FFN 则对每个位置独立使用同一组参数:

FFN(x)=W2σ(W1x+b1)+b2

它对每个 token 都执行相同的两层非线性变换,但处理某个位置时不会直接读取其他位置的表示。二者分工为:

Attention:跨 token 交流FFN:逐 token 加工

二者的主要计算规模也不同。Attention 的位置两两交互核心约为 O(N2d),而 FFN 约为 O(Ndmodeldff);当 dff 与 dmodel 成正比时,后者通常写成 O(Ndmodel2)。因此长序列更容易放大 Attention 的二次项,而短序列且隐藏维度很大时,FFN 和线性投影可能占据更多计算。

标准两层 FFN 只计算权重时的参数量约为:

2dmodeldff

如果两层线性层都带 bias,完整参数量为:

NFFN=dmodeldff+dff+dffdmodel+dmodel=2dmodeldff+dff+dmodel

其中,dff+dmodel 是两层 bias 的参数量。带门控的 SwiGLU 等结构会使用不同数量的投影,不能直接套用标准两层 FFN 的公式。

标准 FFN 参数量示例

当 dmodel=768、扩展比为 4 时:

dff=4×768=3072

两层权重参数量为:

768×3072+3072×768=4,718,592

因此每层约为 4.72M 个权重;如果把 bias 也计入,完整参数量为:

4,718,592+768+3072=4,722,432≈4.72M

若要计算多层 FFN 的总量,才需要再乘以 Transformer 层数。

4.3 残差连接与 Pre-LN ​

Transformer 子层通常通过残差连接保留输入:

y=x+F(x)

其局部梯度为:

∂y∂x=I+∂F(x)∂x

恒等矩阵 I 提供了一条不必完全穿过子层变换的梯度路径。即使 F 分支的局部梯度较小,残差路径也有助于深层网络中的梯度传播;但它不是保证梯度永远不会消失或爆炸的定理。

现代 Transformer 中常见的 Pre-LN 结构可以抽象为:

xl′=xl+Attention(LN(xl))xl+1=xl′+FFN(LN(xl′))

对于单个子层,经典 Post-LN 可以写成:

xl+1=LN(xl+F(xl))

两者的区别不只是公式位置变化:Pre-LN 把归一化放在 Attention 或 FFN 之前,使残差主路径更直接;Post-LN 在残差相加后归一化。深层训练时的稳定性还取决于初始化、学习率、残差缩放和具体架构,不能把任一种形式视为所有模型的绝对最优方案。

这里 LayerNorm 负责稳定子层输入的数值尺度,残差连接负责保留主路径和梯度通路。二者作用不同,但经常组合使用;单纯增加层数并不能解决深层训练困难。

4.4 RMSNorm:只做尺度归一化 ​

RMSNorm(Root Mean Square Layer Normalization)可以看作 LayerNorm 的简化形式。它不先减去特征均值,而是直接用均方根对当前 token 的隐藏向量进行尺度归一化:

RMS(x)=1d∑i=1dxi2+εRMSNorm(x)=γ⊙xRMS(x)

其中 γ∈Rd 是可学习的逐维缩放参数。基础形式不包含 LayerNorm 中的均值中心化,也通常不包含额外的 β 平移参数,因此计算步骤和参数略少。

方法主要操作是否减均值常见特点
LayerNorm减均值,再按标准差缩放是中心化和尺度归一化,通常带 γ,β
RMSNorm按均方根缩放否结构更简单,常用于现代 Transformer,但并非所有模型都适用

RMSNorm 的动机是:对优化有帮助的未必是重新中心化本身,稳定特征尺度可能已经足够。它不是把输出强制成标准正态分布,也不意味着一定比 LayerNorm 效果更好;具体取舍仍需结合模型结构、训练稳定性和验证结果判断。

LayerNorm 与 RMSNorm 速记

LayerNorm:减均值后按标准差缩放;RMSNorm:不减均值,只按均方根缩放。

4.5 BatchNorm:训练时 batch 统计,推理时 running 统计 ​

BatchNorm(Batch Normalization)通常按特征或通道归一化,但统计量来自当前 mini-batch。以某个被归一化的特征为例,训练阶段先计算:

μB=1m∑i=1mxi,σB2=1m∑i=1m(xi−μB)2

再使用:

x^i=xi−μBσB2+ε,yi=γx^i+β

同时,BatchNorm 会维护训练期间累计的 running mean 和 running variance。用 ρ 表示某种移动平均系数时,可以抽象为:

μrun←ρμrun+(1−ρ)μBσrun2←ρσrun2+(1−ρ)σB2

不同框架对 momentum 参数的定义可能相反,因此使用接口时应以具体实现的约定为准。核心行为不变:

模式归一化使用的统计量目的
训练模式当前 mini-batch 的 μB,σB2适应当前训练批次并更新 running statistics
推理模式训练期间累计的 μrun,σrun2让结果不依赖推理时同批的其他样本

当 batch 很小时,μB 和 σB2 的估计通常更不稳定,BatchNorm 的效果可能变差。推理时如果直接使用一个样本的 batch 统计量,方差估计也可能失去意义,所以训练框架通常需要区分训练模式和推理模式。

Dropout 与 BatchNorm 同时使用时,顺序需要谨慎。若 Dropout 放在 BatchNorm 前,BatchNorm 训练时看到的是随机置零后的激活分布,而推理时 Dropout 被关闭,训练期间累计的统计量可能与推理分布不匹配。这不表示两者绝对不能一起使用,但应避免把这种组合当成没有分布偏移的无条件叠加。

BatchNorm 通过稳定中间激活的尺度,通常可以让优化更平稳、对初始化不那么敏感,并允许在合适条件下使用相对更大的学习率。它可能间接改善最终泛化效果,但不保证测试集准确率必然提高;其可学习参数主要是每个特征或通道的 γ 和 β,参数增量通常很小。

教材常把 BatchNorm 的作用概括成“减少 Internal Covariate Shift”,但这不是唯一或充分的机制解释。更稳妥的理解是:归一化改善了数值尺度和优化条件,而最终效果仍取决于 batch 大小、网络结构、数据分布和训练配置。

与 LayerNorm 对比时,最重要的区别是:

BN 与 LN 的统计方向

BatchNorm 跨样本统计;LayerNorm 在当前样本或 token 内沿 hidden_dim 统计。

五、反向传播:用链式法则计算梯度 ​

反向传播(backpropagation)是一种高效计算梯度的算法,不是优化器。给定前向传播得到的损失 L,它沿计算图从输出向输入反向应用链式法则,计算各层参数的梯度 ∂L/∂θ,再由 SGD、Adam 等优化器根据这些梯度更新参数。

5.1 计算图与链式法则 ​

把网络拆成若干个中间变量后,每个变量都可以看成计算图中的一个节点。对于串联计算:

x→gu→fv→LL

从 L 向左传递时,梯度等于上游梯度与当前节点局部导数的乘积:

∂L∂x=∂L∂v∂v∂u∂u∂x

前向传播负责计算输出并保存反向传播需要的中间值,例如线性层输入、加权和与激活结果;反向传播按照计算图的逆拓扑顺序逐层传递梯度。实际自动微分框架通常计算向量与雅可比矩阵的乘积,而不是显式构造完整的雅可比矩阵,以降低内存和计算开销。

5.2 线性层的梯度 ​

沿用列向量表示,设一个线性层的输入为 h,输出为:

a=Wh+b

令上游传来的梯度为 ga=∂L/∂a,则该层对参数和输入的梯度为:

∇WL=gahT∇bL=ga∇hL=WTga

这三个结果分别用于更新权重、偏置,以及继续向前一层传递梯度。对一个 mini-batch,梯度需要沿 batch 维累加或求平均,具体取决于损失函数的 reduction 设置;不能把每个样本的梯度任意丢弃。

5.3 激活函数对梯度的影响 ​

如果线性层输出 a 经过逐元素激活函数得到 h=ϕ(a),且上游梯度为 gh,则:

ga=gh⊙ϕ′(a)

其中 ⊙ 表示逐元素相乘。以 ReLU 为例:

ϕ′(a)={1,a>00,a<0

a=0 处不可导,实际实现会选取一个次梯度。ReLU 的负半轴梯度为 0,如果某个神经元长期落在负半轴,可能出现“死亡 ReLU”;Sigmoid 和 Tanh 在绝对值较大时也会饱和,使导数变小。

连续多层反向传播会把许多局部导数相乘:局部导数长期小于 1 容易导致梯度消失,长期大于 1 则可能导致梯度爆炸。合理的参数初始化、归一化、残差连接和激活函数选择,都是缓解梯度问题的常见手段。

5.4 Softmax 与交叉熵的输出梯度 ​

在未加权的互斥多分类任务中,设 p=softmax(z),one-hot 标签为 y,损失为:

L=−∑k=1Kyklog⁡pk

Softmax 与交叉熵组合后,对 logits 的梯度可以直接化简为:

∂L∂zk=pk−yk

因此,真实类别对应的梯度为 pc−1,其他类别对应的梯度为其预测概率 pk。这个简洁梯度也是工程中通常直接使用“带 logits 的交叉熵”接口的原因之一。

Softmax + 交叉熵梯度的化简

Softmax 的对数导数满足:

∂log⁡pj∂zk=δjk−pk

代入交叉熵并利用 one-hot 标签满足 ∑jyj=1:

∂L∂zk=−∑j=1Kyj(δjk−pk)=pk−yk

5.5 反向传播中的常见误区 ​

概念正确理解
反向传播用链式法则计算损失对参数和中间变量的梯度
优化器根据梯度和学习率实际修改参数,例如 SGD 或 Adam
梯度方向梯度指向损失增大的方向,梯度下降沿负梯度方向更新
多条路径一个变量从多条路径影响损失时,各路径梯度需要相加
计算图缓存反向传播需要前向阶段保留的中间值,训练框架通常会管理其生命周期
梯度累积多次反向传播可能累积到参数梯度中,开始下一步前通常需要按框架约定清零或有意累积

反向传播速记

前向传播保存中间值,反向传播沿计算图使用链式法则;局部导数乘以上游梯度得到当前梯度,优化器再根据梯度更新参数。

六、深度网络的一次训练闭环 ​

可以把有监督训练概括为四步:

  1. 前向传播:输入经过线性层、激活函数和输出层,得到 logits 或预测值;

  2. 计算损失:分类通常使用交叉熵,回归可使用 MSE、MAE 或 Huber;

  3. 反向传播:沿计算图反向应用链式法则,计算损失对各层参数的梯度;

  4. 参数更新:优化器按照梯度调整参数,例如梯度下降的一步为:

    θ←θ−η∇θL

其中 η 是学习率。反向传播解决“梯度如何传回去”,优化器解决“根据梯度如何更新参数”;二者不是同一个概念。

七、BERT、GPT、T5 与 BART 的架构 ​

经典 Transformer 模型可以按照 Encoder 和 Decoder 的组合方式分为三类:

架构注意力可见范围典型训练目标更擅长的任务
Encoder-only输入 token 之间通常可以双向注意Masked Language Modeling 等表示学习、分类、序列标注、抽取
Decoder-only第 t 个位置只能看不晚于 t 的 tokenNext-token prediction续写、对话、代码生成
Encoder-DecoderEncoder 读完整输入,Decoder 因果生成并 Cross-Attend 到 Encoder条件生成、去噪重建、文本到文本翻译、摘要、改写和输入到输出的生成任务

因此,判断模型架构时应同时看两件事:信息在注意力中如何流动,以及预训练目标要求模型完成什么任务。不能只根据“是否使用 Transformer”判断模型属于 Encoder 还是 Decoder。

7.1 BERT:Encoder-only 的双向理解模型 ​

BERT 使用 Encoder-only 架构。对于被遮住的 token,模型可以利用它左右两侧的上下文:

P(xi∣x1,…,xi−1,xi+1,…,xn)

这对应 Masked Language Modeling(MLM)。原始 BERT 还使用过 Next Sentence Prediction(NSP),用于判断两个句子是否具有原文中的连续关系;后续模型变体可能移除或替换 NSP,因此不能把 NSP 当成所有 Encoder 模型的必要组件。

BERT 的双向表示非常适合理解输入内容,例如文本分类、情感分析、命名实体识别、序列标注和抽取式问答。但它不是按照从左到右的因果分解训练的,直接用于连续长文本生成并不自然;反复填充 Mask 可以完成某些 infilling 任务,却不等价于原生的自回归生成。

原始 BERT 的输入表示还包含句段信息:

Token Embedding+Position Embedding+Token-Type Embedding

在句子对任务中,Token-Type ID 可以区分句子 A 和句子 B。这里的 Token-Type Embedding 是输入表示的一部分,不是用来替代位置编码或上下文 Attention 的。

7.2 GPT:Decoder-only 的自回归生成模型 ​

GPT 使用 Decoder-only 架构和因果注意力。其核心目标是按从左到右的顺序预测下一个 token:

P(x1,…,xn)=∏t=1nP(xt∣x<t)

因为第 t 个位置不能访问未来 token,模型训练目标与推理阶段的逐 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输出文本

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 模型,训练时先对原文本施加破坏,再让模型恢复原文:

Corrupted Text→EncoderLatent Representation→DecoderOriginal Text

破坏方式可以包括遮盖、删除、打乱或填充文本片段。Encoder 负责从受损输入中提取双向表示,Decoder 负责自回归地重建目标文本。

常把 BART 直观地理解为“BERT 式 Encoder 与 GPT 式 Decoder 的组合”,但这只是帮助记忆的结构类比;更准确的描述是:BART 通过去噪自编码目标训练一个 Encoder-Decoder 生成模型。因此它适合摘要、翻译、文本恢复和其他条件生成任务。

7.5 四类模型的统一比较 ​

模型架构主要信息流典型目标或用途
BERTEncoder-only双向读取输入,输出上下文表示MLM、原始 BERT 的 NSP、分类和抽取
GPTDecoder-only因果读取历史,逐 token 生成Next-token prediction、对话和续写
T5Encoder-DecoderEncoder 编码输入,Decoder 条件生成Text-to-Text、翻译和摘要
BARTEncoder-DecoderEncoder 编码受损输入,Decoder 重建文本去噪重建、摘要和文本生成

Transformer 模型架构速记

BERT 重点是双向读懂输入;GPT 重点是因果地接着生成;T5 和 BART 都是 Encoder-Decoder,先编码输入,再由 Decoder 生成目标文本。

使用 Markdown 与 VitePress 构建