原始 Transformer 用的是 post-LN:每个残差块输出先加回主干、再过 LayerNorm,$x_{l+1}=\mathrm{LN}(x_l + f_l(x_l))$。这个摆法前向很稳,但训练深模型时有两个配套现象:不加学习率 warmup 直接发散,而且超过十几层就明显训不动。这两个现象同一个根源——梯度每穿过一层 LayerNorm 就被投影一次,被投影掉的正是它最需要保留的分量。这篇文章把收缩机制算出来。
归一化雅可比的谱性质
记 $u = x_l + f_l(x_l)$,$\hat u = u/\|u\|$(忽略 $\varepsilon$ 与逐通道增益,只看方向归一的骨架),则
$$ \frac{\partial \hat u}{\partial u} = \frac{1}{\|u\|}\big(I - \hat u \hat u^\top\big). $$
括号内是向 $\hat u$ 的正交补投影:它保留垂直于 $\hat u$ 的分量、消掉平行分量,并且整体乘以 $1/\|u\|$。两个性质都要记住。第一,投影矩阵的谱范数是 1,但它是降秩的(秩 $d-1$),每一次经过都把向量往一个特定方向($\hat u$ 方向)压扁一层。第二,$1/\|u\|$ 因子意味着主干范数越大,穿过去的梯度越小。
复合 L 层:收缩因子逐层相乘
整条链的梯度从 loss 回传到第 $l$ 层主干:
$$ \frac{\partial \mathcal L}{\partial x_l} = \frac{\partial \mathcal L}{\partial x_L}\prod_{j=l}^{L-1} J_j\,(I + F_j),\qquad J_j = \frac{1}{\|u_j\|}\big(I - \hat u_j\hat u_j^\top\big),\ F_j=\frac{\partial f_j}{\partial x_j}. $$
关心两个通路各自的下场。经过残差主干的通路携带因子 $(I+F_j)$ 中的恒等部分,这部分梯度方向大致沿 $x_j$ 本身;而经验观察是 $u_j=x_j+f_j$ 的方向与 $x_j$ 高度相关(分支输出是主干的增量修正),所以下一层的 $J_{j+1}$ 的投影面 $\hat u_{j+1}$ 几乎就是冲着这部分梯度来的——最需要沿主干回传的梯度分量,恰好是每层投影删掉的那个方向。每层的有效收缩大致是保留正交补的 $(d-1)/d$ 比例的范数再乘方向失配损失,量级估计为
$$ \Big\|\frac{\partial \mathcal L}{\partial x_l}\Big\| \lesssim \Big\|\frac{\partial \mathcal L}{\partial x_L}\Big\| \cdot \prod_{j=l}^{L-1}\frac{1}{\|u_j\|}\cdot\big(1 - c_j\big), $$
其中 $c_j\in(0,1)$ 是梯度方向与 $\hat u_j$ 对齐程度的惩罚。$(1-c_j)$ 是常数小于 1 的数,L 层复合就是指数衰减:$(1-c)^L$。$c$ 哪怕只有 $0.2$,$L=24$ 层就剩 $0.8^{24}\approx 0.005$。这就是"深 post-LN 网络最下面几层几乎收不到梯度"的定量图像——不是消失到零,是被压到对训练没有实质贡献的量级。
warmup 为什么能救,为什么救不彻底
学习率 warmup 的机制和这里的分析接得上。训练初期 $u_j$ 的范数还没涨起来,$1/\|u_j\|$ 因子远大于稳态值,梯度穿层时被额外放大,叠加 Adam 二阶矩估计尚未稳定(分母偏小、更新步偏大),参数一步走飞、主干范数失稳,训练发散。warmup 用小学习率熬过这段 transient,等范数与优化器状态都进入稳态再放开。实测上 post-LN + warmup 能训到几十层,但收缩的结构性问题没解决——浅层梯度仍然比顶层小几个数量级,只是衰减程度从不发散降到了"能训"。
另一个工程补救是 Admin(Liu et al., 2021):把 $x_{l+1}=\mathrm{LN}(x_l+f_l)$ 改写为 $\mathrm{LN}(\omega_l x_l + f_l)$,用数据驱动初始化 $\omega_l$ 使每层输出方差与位置解耦,等于给投影收缩提前补一个增益。它能缓解,但思路已经是"在 post-LN 框架里打补丁",而 pre-LN 是直接换掉病根。
pre-LN 的对照:恒等通路无损
pre-LN 的梯度是 $\partial\mathcal L/\partial x_l = \partial\mathcal L/\partial x_L\prod(I+F_j')$,主干上没有任何投影矩阵,恒等分量原样回传——第 1 层和第 L 层参数收到的主干梯度同量级。代价前一篇已经讨论:主干范数无人约束、按 $\sqrt{L}$ 膨胀,需要输出端归一化和初始化技巧来接。可以说这两个架构把同一个矛盾(归一化放哪)的账记在了不同科目上:post-LN 记在梯度流上(深层梯度消失,靠 warmup 打补丁),pre-LN 记在残差范数上(增长靠 final norm 和初始化对账,深层贡献被存量淹没)。
小结
post-LN 的梯度消失不是玄学:$\partial\hat u/\partial u = (I-\hat u\hat u^\top)/\|u\|$ 这个雅可比每作用一次,就删掉梯度里沿归一化方向的分量并乘 $1/\|u\|$,而主干梯度方向恰与该方向高度对齐,于是每层承受 $(1-c)$ 的常数收缩,L 层复合成指数消失。warmup 与 Admin 是补丁,pre-LN 是换药。看清这个机制的价值在于:下一代归一化方案(DeepNorm、residual scaling 一类)几乎全是在两者之间找新的记账科目,而不是发明第三种账。