第三章 完整 Transformer 的组成与推导
Attention 是 Transformer 的核心信息交换算子,但模型能否表达顺序、能否稳定堆叠、如何接收输入和产生输出,取决于完整结构。本章先解释各组件承担的工作,再组装原始 Encoder-Decoder Transformer。
1 为什么需要位置信息
暂时考虑没有位置编码、没有 mask 的 Self-Attention。设 $P$ 是交换序列行顺序的置换矩阵,将输入改成 $PX$ 后,Q/K/V 的行也相应置换。得分矩阵变成:
$$ (PQ)(PK)^\top=P(QK^\top)P^\top $$
Softmax 沿每一行归一化,与行列同步置换相容,所以:
$$ \operatorname{Attention}(PX)=P\operatorname{Attention}(X) $$
这称为置换等变:输入重排,输出跟着重排,而内容计算本身没有“第一个”“第二个”的绝对位置概念。逐位置共享的 FFN、Norm 也不会主动提供位置信息。
因果 mask 确实通过可见性引入了顺序约束,因此不能把上述结论原样套到固定因果 mask 上。但仅有可见性约束,与显式表示距离、绝对位置,是不同层次的信息。
2 绝对位置编码与正弦位置编码
最直接的方法是给每个位置一个向量 $p_i$,与 token embedding 相加:
$$ x_i=e_i+p_i $$
如果 $p_i$ 可学习,就得到位置 embedding 表。这增加了参数,并使未训练位置如何处理成为一个单独问题。
正弦位置编码用固定函数生成向量。对偶数宽度 $d$:
$$ \operatorname{PE}(p,2r)=\sin\left(p/10000^{2r/d}\right) $$
$$ \operatorname{PE}(p,2r+1)=\cos\left(p/10000^{2r/d}\right) $$
不同维度使用不同频率,形成多个尺度的位置变化。由正弦、余弦的和角公式,固定偏移 $\Delta$ 对每对维度对应一个线性变换;这为模型利用相对位移提供了一种结构性线索,但不保证训练外的长距离一定泛化良好。
固定函数可以在新位置计算数值,与模型能在更长上下文中保持能力,并不是同一个结论。后面的 RoPE 也需要遵守这个区别。
3 FFN 负责每个位置内部的非线性变换
标准逐位置 FFN 为:
$$ \operatorname{FFN}(x)=\operatorname{ReLU}(xW_1+b_1)W_2+b_2 $$
其中 $W_1\in\mathbb{R}^{d\times m}$,$W_2\in\mathbb{R}^{m\times d}$。同一层所有位置共享这些权重,但不同层通常使用不同权重。
先扩展到 $m$ 维,再通过非线性选择和组合特征,最后回到 $d$ 维。若去掉激活函数,两次线性变换可合并为一次线性变换,扩展维度本身不会产生相同的非线性表达能力。
FFN 不直接混合位置,但它的输入已经包含 Attention 聚合的上下文。因此“逐位置”不意味着“看不到上下文”。它是在每个位置上加工已经交换过的信息。
4 残差为什么有助于堆叠
残差子层写成:
$$ y=x+f(x) $$
它允许子层在已有表示基础上添加更新,而不要求每次从头重建信息。对输入求导:
$$ \frac{\partial y}{\partial x}=I+J_f(x) $$
显式的恒等通路为信息和梯度提供直接路径。它不保证任意深度、任意初始化都稳定,但解释了残差如何改变优化问题。
相加要求 $x$ 与 $f(x)$ 的形状相同,因此 Attention 的输出投影和 FFN 的降维投影都要回到隐藏宽度 $d$。这也是后续参数量公式中反复出现 $d$ 的结构原因。
5 LayerNorm 如何归一化
对一个 token 的特征向量 $x\in\mathbb{R}^{d}$,LayerNorm 沿特征维计算:
$$ \mu=\frac1d\sum_rx_r,\qquad \sigma^2=\frac1d\sum_r(x_r-\mu)^2 $$
$$ \operatorname{LN}(x)_r=\gamma_r\frac{x_r-\mu}{\sqrt{\sigma^2+\epsilon}}+\beta_r $$
$\gamma,\beta$ 是可学习参数,$\epsilon$ 防止分母过小。这个归一化不需要跨 batch 汇总统计;标准形式也不会跨序列位置混合信息,因此可与因果建模相容。
Norm 用于控制表示尺度、改善优化,不是把所有 token 变成相同向量。它保留了向量内部的相对变化,并有可学习缩放和平移。
6 Post-Norm 与 Pre-Norm
两种常见子层形式为:
$$ \text{Post-Norm}:\quad y=\operatorname{LN}(x+f(x)) $$
$$ \text{Pre-Norm}:\quad y=x+f(\operatorname{LN}(x)) $$
前者的恒等分支也会经过外部 Norm;后者让残差主干保留更直接的恒等路径,并在子层输入端进行归一化。关于 Norm 位置与初始化梯度、warm-up 的关系,可参考On Layer Normalization in the Transformer Architecture。
原始 Transformer 使用 Post-Norm。许多后续语言模型采用 Pre-Norm,并在最后增加一次 Norm。两者不能混在同一组结构假设里计算精确参数或解释梯度路径。Pre-Norm 也不意味着可以无条件取消学习率调度或其他稳定训练措施。
7 组装原始 Encoder
设输入词向量与位置编码合成 $H^{(0)}$。简化掉 dropout 后,一个 Post-Norm Encoder block 为:
$$ U^{(\ell)}=\operatorname{LN}\left(H^{(\ell-1)}+\operatorname{MHA}(H^{(\ell-1)})\right) $$
$$ H^{(\ell)}=\operatorname{LN}\left(U^{(\ell)}+\operatorname{FFN}(U^{(\ell)})\right) $$
Encoder Self-Attention 通常允许源位置读取整段源序列,排除 padding。因为源句在翻译开始前已知,这种双向读取不会泄露尚待生成的目标 token。
经过多层后,输出 $H_{\rm enc}$ 仍然是一组按位置排列的向量,不是必须压缩成一个向量。Decoder 可以针对不同目标位置分别读取它。
8 组装原始 Decoder
Decoder 的一个 block 有三个子层:因果 Self-Attention、Cross-Attention、FFN。以 Post-Norm 表示:
$$ U=\operatorname{LN}(H+\operatorname{MaskedMHA}(H)) $$
$$ R=\operatorname{LN}(U+\operatorname{CrossAttn}(U,H_{\rm enc})) $$
$$ H'=\operatorname{LN}(R+\operatorname{FFN}(R)) $$
Cross-Attention 中 Q 来自当前 Decoder 状态,K/V 来自 Encoder 输出。若目标长度为 $S_y$、源长度为 $S_x$,它的注意力分数形状为 $S_y\times S_x$,而不是必然的方阵。
三个子层的功能依次是:汇总已知目标前缀,读取与当前目标位置相关的源信息,再加工得到下一层表示。
原始架构还在若干位置使用 dropout,且输入 embedding 带有尺度处理。本文公式为突出数据依赖省略了这些训练细节;实现原论文时应按其完整定义补齐。原始 Transformer 论文
9 输出分布与三种架构
最终 hidden state $h_i$ 经过词表投影得到 logits:
$$ z_i=h_iW_{\rm out}+b,\qquad p(x_{i+1}=v\mid x_{\le i})=\operatorname{softmax}(z_i)_v $$
logits 宽度是 $V$。它们是用于形成概率分布的分数,不是 token ID,也不是最终文本。
理解原始结构后,可以区分三类常见组织方式:
| 架构 | 主要可见性 | 典型任务形式 |
|---|---|---|
| Encoder-only | 输入内部双向读取 | 表示学习、分类、掩码位置预测 |
| Decoder-only | 通常为因果读取 | 自回归续写,将任务信息放入前缀 |
| Encoder-decoder | 源双向、目标因果、跨序列读取 | 翻译、条件生成 |
“Decoder-only”这个名称不意味着保留原始 Decoder 的所有子层再删掉 Encoder;常见语言模型会直接去掉 Cross-Attention,只保留因果 Self-Attention 与 FFN。
下一章:训练目标与自回归生成。