上周压测自己微调的模型,loss曲线突然劈叉——训练集拟合得纹丝合缝,验证集直接灾难性遗忘。那一瞬间我脑子里只有一句话:反向传播是不是该背锅? 说实话,这十年大家把注意力全堆在数据和算力上,底层的梯度流动反而没人细想。但工程就是这样,越基础的地方越埋雷。

我去翻当年Rumelhart的原论文,1986年的手写公式现在看来都像艺术。不过话说回来,反向传播本身是优雅的——链式法则遍历计算图,激活函数导一次,权重矩阵乘一次,误差信号就这么一层层流回去。但优雅不意味着安全。你试过在1024层的网络里用sigmoid吗?梯度直接衰减到1e-7级别,参数更新像死水。后来换成ReLU确实爆了,但Dead Neuron又来恶心你:某次随机初始化没配好,40%的神经元再也没激活过。这不废话,ReLU在负半轴导数恒为零,输入不小心推到负数区就永久静默。我们在一个大规模推荐模型里统计过:使用全ReLU,训练到第20个epoch,平均死亡神经元比例约12%;换成Leaky ReLU(斜率0.01),比例压到3%以下,但收敛速度慢了18%——这是用Wide & Deep结构在Criteo数据集上实际跑出来的数字。
注意力的麻痹:你买到的并不是“关注”
Transformer横空出世后,圈内简直把注意力当丙种球蛋白——什么病都想打一针。但我踩过最深的坑就在这里。去年做个长文本摘要项目,把序列长度从512拉到4096,八头注意力直接OOM。小兄弟提醒说:“咱们换稀疏注意力呗?”哪那么简单。后来我们拿Longformer和BigBird做对比,同样在arXiv数据集上ROUGE-1分数:Longformer为41.2,BigBird为42.7——看着还行?但推理延迟暴增320ms,线上根本没法用。根源在于:标准自注意力的复杂度是O(n²),稀疏化后全局注意力窗口很难选。太宽则稀疏个寂寞,太窄又丢上下文。我最后用滑动窗口+随机全局token的混合模式,把窗口设为512,随机抽32个全局token,延迟压到180ms,ROUGE仅掉了0.8个点。这是妥协的艺术,对吧?

还有层经常被忽悠的点:位置编码。人家原版的三角函数编码面对超长序列,高频分量会周期性混淆——一句话,位置52和位置500的编码余弦相似度可能超过0.9。我们实验时,用Rotary Position Embedding (RoPE) 替代正弦编码,在8k长度的文档QA任务上,F1从68.3提到73.6。数据摆在这里,还不信?差5个点的原因就是模型根本没分清第几句和第几句。 所以别盲目迷信预训练模型的位置设计,该改就改。
量化的幻觉:当你以为int8足够安全

模型部署这块,我身边的同事总爱说“直接量化就完了”——天真!上季度我把一个6.7B参数的LLM量化到int8,T4卡上推理从12秒降到4.3秒,爽得飞起。但很快QA反馈:法律条款类的生成文本,关键日期数字频繁出错。回头一查,logits分布中,top-5 token的得分标准差从0.8坍缩到0.3,导致解码时本该选“2024”的,模型总犹豫“2023”或“2025”。这是典型的量化噪声放大:激活值和权重的int8近似,在深层网络中逐层累积,最终让输出分布变“平”。我们团队后来的SOP是:除非用校准集做per-channel量化,否则凡涉及精确数值生成的场景,至少保留最后两层为FP16。照这个策略重训一遍,日期错误率从14%降到2%以下。
当然,更隐蔽的是量化格式的选择。拿BERT-base在SQuAD上测试:从FP32直接量化到int8,F1掉0.9;如果用量化感知训练(QAT)再微调三个epoch,F1反而比原版高0.2——可能是正则化效应。但代价是训练时间多出1.5倍。工程上没有人能既要又要,你得根据业务指标卡预算。
突发泛化?不过是成批的缺陷泄露

最近arxiv上那篇“grokking”闹得沸沸扬扬,说什么小模型训练很久后突然完美泛化。我复现了一下,用一个小型transformer做模算术,确实看到验证准确率从0跳到100%——在训练第1000个epoch之后。但仔细查权重,所谓泛化其实是模型在记忆了所有训练模式后,通过权重衰减逐渐剪除了多余连接,并不是什么神秘的能力涌现。这像极了我早年写C++,一开始把所有类都继承一遍,后来才发现组合优于继承。神经网络的训练,总结起来就是不断减去不需要的假设。所以你看到那些突发的指标跃升,别激动,不过是你给的隐式正则终于生效了。
写到这里突然想到一个比喻:训练模型就像在毛玻璃上雕刻——反向传播是刻刀,量化是把玻璃压薄,而注意力是你故意磨出的那些粗糙纹路,为了在某些角度透光。任何一步走糙,成品就漏光漏得一塌糊涂。工程的美感,大概就藏在这毫厘之间的控制里。