type
Post
status
Published
date
Aug 9, 2026
slug
Transform-Scaling-Trick
summary
Transformer 在推荐系统中也开始被广泛地采用,加上参数和算力的 Scaling Up,可以持续地在推荐系统中获得收益。但是从日常面试中,我也发现大多数的推荐系统从业者缺乏对 Transformer 的基本认知,导致了在Scaling 中出现常识性地错误引发失败。
Transformer Scaling 的核心问题,是尺度匹配。
Transformer 从来不是一个可以随意放大的黑盒模型。当模型的深度和宽度发生变化时,residual stream 的尺度、每一层的梯度、参数更新量、Attention logit、优化器的二阶矩估计,甚至最优 learning rate 都会一起发生变化。如果这些量没有被控制在合适的区间里,增加的参数不但不会变成有效容量,反而可能让模型进入一个“能训练,但没有真正学好”的状态。
tags
推荐
Transformer
category
推荐系统
icon
password
priority
3
Transformer 在推荐系统中也开始被广泛地采用,加上参数和算力的 Scaling Up,可以持续地在推荐系统中获得收益。但是从日常面试中,我也发现大多数的推荐系统从业者缺乏对 Transformer 的基本认知,导致了在Scaling 中出现常识性地错误引发失败。
Transformer Scaling 的核心问题,是尺度匹配。
Transformer 从来不是一个可以随意放大的黑盒模型。当模型的深度和宽度发生变化时,residual stream 的尺度、每一层的梯度、参数更新量、Attention logit、优化器的二阶矩估计,甚至最优 learningrate 都会一起发生变化。如果这些量没有被控制在合适的区间里,增加的参数不但不会变成有效容量,反而可能让模型进入一个“能训练,但没有真正学好”的状态。
所以一个能够稳定 Scaling 的 Transformer,依赖的从来不是某个单一维度地调整,而是一整套互相配合的设计:
- Norm 和 residual 决定信息与梯度如何穿过几十甚至上百层网络;
- 初始化和 residual scaling 决定模型加深以后,各层写入 residual stream 的尺度是否仍然合理;
- Attention 的尺度控制 决定模型会不会走向过度锐化或者 token 平均化;
- 优化器和超参数化 决定模型变宽、batch 变大之后,参数更新是否仍然处于原来的工作区间;
- 而最终,模型容量的 Scaling 还必须伴随输入复杂度和数据复杂度的 Scaling。否则再大的 Transformer,也只是在处理一个根本不需要这么大容量的问题。
Post-Norm
早在 Bert 那个时候,模型已经有 24层了,最初的代码是 Post-Norm 实现,Post-Norm 给训练叠层出了第一个难题。
Post-Norm 的含义是“Norm 在 residual add 之后”,Transformer 的一个 block 可以写成:
“On Layer Normalization in the Transformer Architecture”,是Pre-LN vs Post-LN 之争的关键理论研究,它在论证Post-LN的稳定性问题:为什么 Post-LN Transformer 必须依赖 learning rate warm-up,而这个 stage 能不能去掉。
Post-Nom 的输出层附近参数的梯度范数很大,量级约 O(d√(ln d)),且不随层数 L 衰减。这意味着训练一开始就用正常大小的 learning rate 会直接让模型爆炸。所以它必须做 warmup,本质是初始化时梯度尺度失衡。
事后来看,BERT-Large 的 24 层/340M 已经进入 Post-Norm 原始 recipe 非常脆弱的工作区了。peak LR 只有 1e-4,10k steps linear warmup,Adam(β2=0.999)。Megatron-LM想把 BERT 从 340M 往上 scale,发现 post-norm 结构在更大规模下 loss 直接劣化,必须把 LayerNorm 挪位置(改成 pre-norm 式的残差排布)才能训出 3.9B 的 BERT。也就是说 24 层/340M 差不多就是 post-norm + 朴素 recipe 的极限操作点。
如果是崩溃还好,你发现 loss 炸了,各出都是 NaN,就会着手解决问题,但是它更多的是"指标正常但效果差"这种 silent failure。
loss spike 后恢复,但留下永久伤。训练中途梯度瞬时爆一下,loss 尖峰然后回落,曲线看起来"自愈"了。但伤害可能是持久的:
- Adam 的 second moment 被 spike 灌大之后,要 ~1/(1−β₂) 步才衰减回来,期间这些层的 learning rate 被压制,等于变相欠训练;
- spike 期间可能发生 attention entropy collapse 或神经元死亡,loss 恢复了但模型质量已经掉档。
甚至全程平稳,但收敛到更差的解。这是哪些通过 warm-up 和小 LR避开了崩溃——靠近输出梯度过大。Post-Norm 还有一个问题,就是靠近输入层:梯度逐层衰减。
假设 Transformer 有 L 层 Block 是,每个 Block 包含一层 Attention,一层 FFN。去掉 Norm 之后,多层网络在有残差链接的情况下,它的最终输出相当于每一层output 的累加和,这个我们称之为残差流。
Post-Norm 的设置是把Norm套在了残差流之上的,它改变了残差流的恒等性质,反向传播每穿过一层都要乘一次 LN 的 Jacobian,梯度到输入层时已经衰减得很厉害。loss 曲线平滑下降、grad norm 正常、没有任何 spike,但底部若干层的参数几乎没动,模型实际上在用"半个深度"干活,这是更常见的静默失败。
Pre-Norm
今天LLM更主流的选择是Pre-Norm,就是把Norm 从残差流里拉出来,套在每一层分支的输入上:

没有了 Norm 的影响,Pre-LN 的 block 是 ,对它求 Jacobian:
从顶层回传到第 l 层的梯度是这些 Jacobian 的连乘。关键一步是把连乘展开:
每一项对应一条残差流里的“路径”——经过哪些 block、跳过哪些 block 的一种选择。这就是“梯度高速公路”的严格含义:其中恒有一条纯 identity 路径,系数精确等于 1。
对于输出爆炸的问题,虽然残差流的 Norm 在累加放大,但是所有分支读入前都做了 Norm处理,抵抗了这个影响。对一个总深度为 L 的 Pre-LN 网络,每一层的参数梯度范数全都约是 这个量级,也没有靠近输出成梯度范数大的问题。
Pre-Norm的修补
Pre-Norm的引入极大地改善了训练的稳定性,但是并非是一个完美地替换。大家发现同样层数的的Post-Norm 和 Pre-Norm,在突破了训练稳定性之后,Post-Norm 是优于 Pre-Norm 的。DeepNorm 的工作就是在研究这个,它猜测“Pre-LN 中前面层的 gradient 往往比后面层更大,导致各层训练不均衡,从而可能损伤最终性能”,也就是说同等的层是,Pre-Norm 更容易没有利用好靠近输出的层,导致了实质性地层数更低,效果变差。DeepNorm是在 Post-Norm 里做稳定性修补,但是并不是今天主流,但他揭示出来 Pre-Norm 潜藏的问题。
Pre-Norm 的问题关键就在于残差流的是各层的累加,它的范数和方差是逐层累加的。
一个 Pre-LN residual block 可以简化写成:
所以它的 Jacobian 是:
关键就在第二项。对于 LayerNorm / RMSNorm,大致有:
也就是说,residual stream 的尺度越大,Norm 的 Jacobian 越小。Pre-LN 又不断做 residual accumulation,更深层的Jacobian的第二项会趋近于 0,最后被恒等的 identity 主导,靠近输出层的贡献就自然减弱,它在内科指标上的体现就是,相邻两层的 hidden state 方向越来越像,angular distance 变小。
除此之外,由于残差流的尺度是随深度变化的,当深度 L 改变时,最优超参也在改变,这也影响对 Scaling 的判断。
接下来说的,就是在 Pre-LN 上要打的经典的补丁。
GPT-2 里就包含了一个一行代码就能大幅提升的高 ROI 做法。在写回残差流的 NN 初始化使用如下的初始化:
2L 就是因为L 个 blocks 的 Transformer 包含 2L 次残差流的写入,一个是 Attention 的 output,一个是 FFN 的 Down Projection。depth-aware 初始化换来了很大程度上其他参数的depth-independent,避免了 Scaling 时无效,实际是因为方差增大导致其他超参失效。
“The Curse of Depth in Large Language Models”工作里,它是以 GPT-2 的Scaled Initialization为基线来研究的。它把每一层的方差打印了出来,有趣的是这个初始化虽然带来了更好的效果,但他最终的方差分布没有太大的变化,它更多的是影响了早期的参数更新。

也能看出来,我们上面说靠近输出层的 layer 被identity 主导,实际更新的方向无效,但是却提供了巨大的方差。
在控制方差的思路影响下,Pre-Norm 有一系列的变体:
结构 | 公式 |
Pre-Norm | |
经典 Post-Norm | |
Sandwich-Norm | |
OLMo 2-reordered norm | |
LNS: LayerNormScaling |
Sandwich-Norm是在分支的输出写回残差流前,又补了一个 Norm 来控制写入方差,从而抑制 residual stream 随深度发生过快的尺度增长。
OLMo2 是把Norm 调到了分支的输出处,控制了写入残差流的 Norm 和方差,那么它的输入范数也变成了随层数线性增长,去掉输入的 Norm 也就无妨了。
除了改变Pre-Norm 的形式,做一些修补可能更有效。“The Curse of Depth in Large Language Models”,就是在每一层分支写回残差流前除以了 , 是层的 index。思想是很朴素的,既然越深的层写入方差大,那就反向给他压下去,它和 GPT-2 的初始化有异曲同工的妙处,但也发现这两者是不能联合用的,反而变差。

对比 Pre-Norm 的变式:

之前我们也经历过,Post-Norm 叠给3 层就出问题了,但可能是早期不懂得如何初始化和设置超参,换了pre-norm 可以多叠几层,这就是上面说的它让可行超参的范围大了很多,但也有层数极限。再加上残差流的尺度控制策略,又能继续叠层。这里残差尺度控制和让最优超参对于深度无关Transformer Scaling 的关键技术。
Scale-Aware 超参
当你 Scaling Transformer 的时候,只改单一深度或宽度去对比,对比来的结果是不对的,因为对应的最优超参会随着Scaling 轴的变化而变化。所以,它的价值是让你能够愉快地只调其中一个轴观察变化,而不是每次都要重新调参。另一个更具经济价值的优势,你可以在一个小的模型上调好超参,迁移到更大模型上,节约大量的算力。
刚才提到的 Scaled initialization 和 LayerNormScaling 就一定程度上起到了模型超参在深度上的 Scale Aware。而模型 Scaling 的宽度轴也是一样有这个问题。
“Tensor Programs V”的工作指出(如图),把 Transformer 的
d_model 从 128 一路扩到 8192,同一个 Adam LR 的效果会发生非常明显的变化,最优 LR 会随着 width 漂移。这里面就是经典的问题,Scaling 之后,反而效果变差了。
它的做法也很简单,参数的初始化已经是Xavier的了,处理 QKVO 和 FFN的 weight,如
区别在于Adam 的LR在 Scaling 的时候也做缩放,假如下调出了,Scaling 之后:
这里面关键的问题就是,它的初始化是按实际是 ,但是LR 的却是按 除的,文章的解释是参数更更新是存在相关性的,初始化的时候每一个变量是随机和零均值的。而同样的思路,我们通常对于Attention 的 除以 ,它修改成了除以 。
以上操作的核心目的,让 width 增大时,每层 update 对 activation 造成的影响保持 O(1),从而让最优超参跨宽度稳定。
Attention的崩溃
Attention 崩溃有两个问题,一个是过度的锐化,即Attention 集中在某一个 token,可以称之为attention entropy collapse;另一正相反,过度平均化,rank collapse。这两者都严重损害效果。
模型变大、训练时间变长以后,、 可能不断增大,即使方向没有变, 也会越来越大,logits 翻倍概率会接近 one-hot。如:[2, 1, 0] -> softmax ≈ [0.67, 0.24, 0.09],但[200, 100, 0] -> softmax ≈ [1, 0, 0]。
QK-Norm 就是对 和先做 Norm 处理,再计算内积,它有效的地避免了过对锐化,被OLMo 2、Gemma 3 采用。它不是消除了尺度,由于 RMSNorm里有learnable
γ ,实际的尺度是它来控制的。再来说 Attention 的 rank collapse。Attention 天生是一个“token mixing / averaging operator”,“Attention is Not All You Need”的工作,证明了纯 self-attention、没有 skip connection 和 MLP 时,会以非常快的速度趋向 token 平均化。
直观地理解残差流的作用,它让原始的 token 信息直通任意一层,注入token 最原本的区分度。那么控制残差流和汇入分支的强度配比就是关键问题了,如果分支过强,就是多层之后的 token mixing 过强,直接让结果平均化。
所以自然地做法就是弱化汇入的分支强度,这里回想上面讲过的 pre-norm,GPT-2 的标准差初始化,LNS 的除以,也就是从另一个角度解释效果:除了控制残差流的方差,同时也防止了累计 mixing 把 token-specific 信号给淹没。
AdamW与梯度动力
推荐系统采用的优化器是五花八门的,早年我测过各类优化器,当时的结论是在参数精调之后,优化器的选择不是一个关键问题。但是在 Transformer 上,AdamW 已经逐步变成了行业标配。
所以不客气地说,如果你用了 Transformer,你至少应该是上了 AdamW 的,否则出现的各种异常都说不清楚是哪里的问题。它核心的逻辑并不是AdamW 是一个很好的优化器,而是在大量 Norm 存的的零齐次网络中,梯度的动力学彻底被改变了。AdamW 相比于它之前的优化器,可以说是能做到基本正确的,而不是更优。
上面的文章有非常详尽的讨论,简而言之:
- 在这个独特的动力学场域中,我们关于机器学习的直觉被颠覆了,Norm的物理含义从特征强度表示变成了学习进度的旋钮,Norm理论上稳步增加,SGD自带学习率衰减,但是刹车踩的太狠导致了学习的早停,而Weight Decay从正则化项进化为有效学习率的动态调节阀。
- AdamW如何成为标配:Adam做到了梯度的步长恒定,有效学习率的平缓刹车;Warmup来处理训练早期的权重过小(梯度爆炸)和二阶矩估计不准的问题;AdamW修正了L2正则的问题,引入Weight Decay,把“方向更新”和“进度控制”拆成两个干净的旋钮。
它的直接表象,如果你发现训练中你的 Norm 始终在增长,虽然不会崩溃,但是大概率是不够优的。如果看大模型全开源的checkpoint,会发现在很早期由于 Weigh Decay 的牵拉,Norm 实际已经稳定住了。
Adam里的 β₁ 和 β₂ 也很关键,它分别代表了“方向记忆”和“尺度记忆”的强度。在推荐系统里时效性非常重要,加上特征的泛化性不足,历史的梯度方向往往会更快地失效。而 β₂ 需要综合考虑噪声大小和 effective batch 的大小,比如Bert 当时是小 batch,继承了当时常用的 β₂ = 0.999,而如今 LLM 则更常使用 0.95,是因为 batch 更大,噪声更小,以及 需要更快地速度响应spike的出现。
内科指标监控
除了关注 loss 和 norm,还应该针对上述问题监控更多的内科指标。
per-layer grad norm ratio(bottom vs top layers):Post-LN 的 silent failure 会表现为底层梯度持续比顶层小一到两个量级。
update-to-weight ratio(,健康值 ~1e-3 量级):直接看每层参数实际在不在动,比 grad norm 更贴近"有没有在学"。
层间 representation 相似度:相邻层输出 cosine similarity 持续接近 1,说明深层在空转。
max attention logit:关注Attention 的 entropy collapse 问题。
输入的复杂化
单纯地 Scaling 参数带来的收益没有这么大,但会经常被拿来否定Scaling的价值。这一点和 NLP 是一样的,Scaling Law 说地不是把参数拉到很大,效果就来了。它讲的是数据和参数的配比,算力的分配,数据和参数要一起 Scaling。
放到推荐系统也一样,如果已经利用了历史的全部数据,那么推荐似乎已经提早完成了数据 Scaling,但是输入特征的丰富度和复杂度也是 Scaling 的一部分,它要和参数 Scaling 一起提升,才会发挥 Scaling 巨大的价值。
举个例子,可能在 4 年前我们就做过多模态embedding 的特征,当时发现直接加进去效果不加,最后是用它来做了target 物品和序列的距离计算得到一个图内中间特征,才有效的。但是在 Scaling 参数之后,我们发现直接把多模态 embedding 丢进去就有巨大的效果,这里面的差异就来自于模型的参数容量。
拿LLM 的原生多模态举个例子,非原生多模态是把一个预训好的 ViT 嫁接到一个预训好的 LLM 里 co-trian,ViT 充当了一个 encoder。而原生多模态是直接把图片 patch 给 embedding 化,依靠 LLM 主体的 Transformer 来处理视觉 token 与文本 token 及他们复杂的交互。原来由视觉 Encoder 承担的建模能力,必须迁移进主体 Transformer,因此主体模型必须为视觉建模预留足够的参数容量和计算量。
推荐系统其实有非常类似的演进。过去我们会针对一组特征设计一个精巧的子网络:DIN、DCN、多模态 Encoder、序列 Encoder。先把复杂信息压缩成一个 embedding,再交给主排序网络。这个子网络本质上也是一个 Encoder。
但如果主体 Transformer 足够大,并且原始信息能够以合适的 token 形式直接输入,那么就可以进一步问:为什么一定要在 Transformer 之前,把这部分信息提前压缩掉?
反过来讲,Scaling 没有用,还有一种可能是 input 的复杂度不够,数据量不够,它压根不需要这么复杂的容量和层数来处理,那不如老老实实地用回你的 DCN。
总结
如果拿电脑性能做比喻,大家用 Transformer 做推荐时,不能把它当成一台开箱即用的笔记本电脑,而应该把它看成一块布满接口和线头的高性能主板。
Transformer 只是提供了一套足够通用、足够强的计算骨架。你的特征、序列、优化器、模型规模和超参,以及训练和推理方式,都必须围绕这块主板重新设计、彼此匹配。只有把这些部件真正组装到一起,才能攒出一台高性能 PC。
所以,用上 Transformer 并不等于完成了 Transformer 化,能 Scaling 的 Transformer 才是真的 Transformer化。
references
Attention is not all you need
BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
Language Models are Unsupervised Multitask Learners
A Theory on Adam Instability in Large-Scale Machine Learning
The Curse of Depth in Large Language Models
Tensor Programs V: Tuning Large Neural Networks via Zero-Shot Hyperparameter Transfer
Query-Key Normalization for Transformers
Scaling Vision Transformers to 22 Billion Parameters.
On Layer Normalization in the Transformer Architecture
Attention is Not All You Need: Pure Attention Loses Rank Doubly Exponentially with Depth
DeepNet: Scaling Transformers to 1,000 Layers
CogView: Mastering Text-to-Image Generation via Transformers
2 OLMo 2 Furious
Gemma 3 Technical Report