象信办公室里,老王宣布,自己从来不相信平滑的曲线。
“真正做过训练的人都知道,”他端着咖啡说,“越平静,越危险。”
三天前,他说的还是:
“曲线这么平,说明路线完全正确。”
小帅没有接话。
自从上次那个冒号差点把训练送走以后,他养成了一个习惯:老王讲话时,不争论,先保存日志。
这次,象信正在训练决策模型 xiangxin-3.0 的第六版。
训练跑得不错。
损失往下走,验证准确率往上走,验证 NLL 也在缓慢下降。大家已经开始讨论,该留下哪个检查点。
然后,第1500步附近,右下角的曲线突然蹿了起来。
老王把杯子往桌上一放。
“停。回退。”
他的动作很熟练,像一位终于等到病人咳嗽的退休名医。
“跳升之前的版本留下,后面的不要了。”
小帅看了一眼屏幕。
“可是,另外三张图还没变坏。”
老王转过身。
“等变坏,就晚了。”
一、一个数,接管了整间会议室
小美赶到工位时,老王已经完成了诊断。
“梯度爆炸。”
这四个字说得很重,仿佛下一秒服务器就会从机柜里飞出来。
小美是团队里的印度籍数据科学家。上次排查以后,她的中文词汇里新增了“倚老卖老”,但一直没有找到合适的公开使用场合。
她拉过椅子。
“你说的爆炸,具体是指什么?”
“梯度范数突然高了。”
“然后呢?”
“还需要然后?”
小美把页面上的四张图一起投到会议室屏幕上。
训练损失,没有同步明显反弹。
验证准确率,没有明显下降。
验证 NLL,仍在低位缓慢下降。
只有梯度范数,在训练后段突然抬起了头。
老王敲了敲右下角。
“这个最敏感。别的还没来得及反应。”
小帅点点头。
“所以,它是警报。”
“对。”
“那我们现在知道警报响了。还不知道模型坏没坏。”
老王不说话了。
他不喜欢实习生拿自己刚说过的话,往下推理。
二、老王把音量,当成了车速
小帅在白板上画了一排小箭头。
“模型训练时,每个可训练参数都有梯度,表示损失对这个参数变化有多敏感。梯度范数,就是把这些梯度汇总起来,得到一个整体大小。”
小美补了一句:
“可以先理解成,这一步收到的调整信号有多强。”
老王接过笔,在旁边写:
梯度大 → 更新大 → 模型坏。
写完,还画了一个圈。
小美把中间那根箭头擦了。
“这一步,不能直接跳过去。”
梯度交给优化器以后,还要经过历史状态、学习率等因素的处理。如果使用梯度裁剪,还会先受到限制。
页面右下角写得很清楚:
裁剪前,对数刻度。
也就是说,曲线上那个吓人的数,是裁剪前的梯度范数。它并不直接等于参数最后实际走了多远。
小帅想了想。
“像导航突然大喊‘急转弯’。声音很大,值得注意。但车最后转了多少,还得看司机怎么操作。”
老王扣上笔帽。
“这些基础知识,我当然知道。”
小美看了一眼白板。
那串“模型坏”,还没擦。
三、那条长尾巴,可能戴着滤镜
老王很快找到了第二条证据。
“你们看,跳上去以后,半天没下来。说明不是一下,是持续异常。”
这次,小帅差点点头。
深色曲线确实拖着一条缓缓下降的尾巴。
小美却指向页面上方的滑块。
平滑:0.80。
“先别把显示效果,当成完整的训练过程。”
图里既有浅色的原始曲线,也有深色的平滑曲线。
原始数据突然冒出一根尖峰,经过平滑以后,影响可能会在后面延续一段时间,画出一条尾巴。
连续多步都偏高,也可能画出类似的形状。
只盯着深色线,看起来都像一座山。
但山是怎么形成的,不能靠轮廓猜。
小帅重新看向浅色曲线。
异常附近确实有明显尖峰,后面也有波动。但截图能展示的信息有限,不能据此断定整个后段都维持在异常水平。
“先关掉平滑,再看附近的原始记录。”他说。
老王向后一靠。
“反正不正常。”
“值得查。”小美说。
她刻意换了一个词。
上次,他们已经为“肯定就是这个”“彻底解决了”付过不少算力费。
四、三张安静的图,替模型争取了时间
老王坚持认为,右下角那张图已经足够定案。
小美却把另外三张图放大了。
“它们也在同一个页面上,不能因为没喊,就不让作证。”
训练损失仍在低位波动,没有随着尖峰出现明显反弹。
验证准确率保持高位。
验证 NLL 也没有抬头。
至少从这份验证结果看,尚未出现明显的质量退化迹象。
老王皱眉。
“准确率没掉,也可能已经过拟合了。”
“所以要继续查。”小美说,“但不能把‘可能’写成‘已经’。”
小帅盯着 NLL 那张图看了一会儿。
对于决策模型,只看答对多少题,还不够。
还得看它如何分配概率。
同一道题,两个模型都答错了。
一个说:“我不太确定。”
另一个拍着胸口:“绝对正确。”
在准确率里,它们都算一道错题。
但在实际使用中,第二种错误可能更麻烦。
NLL 会反映模型给真实答案分配的概率;如果模型自信地答错,惩罚会很明显。
不过,NLL 好一点,也不等于所有能力都更好。概率是否校准、困难场景有没有退步,仍然需要另外检查。
小帅在本子上写下:
看答没答对,也看它相信自己到什么程度。
老王看了看。
“你们这是在给后面的模型找理由。”
小美摇头。
“我们是在给所有候选,用同一套理由。”
五、上一集的凶手,又被传唤了
下午,老王带着新结论回来了。
“还是最前面那几个专家。”
上次那场事故,确实牵涉过特定输入路径、专家模块和优化器历史状态。
老王对这个结论非常熟悉。
尤其熟悉适合写进汇报的部分。
“老问题复发。”他说,“按上次处理。”
小帅没有马上打开修改脚本。
上次,他们靠局部实验、权重替换和历史记录,一点点缩小了问题范围。
这次,首先摆在眼前的,是总梯度范数的一次跳升。
一个总数,不会告诉你是哪一层、哪个模块、哪条路径贡献了变化。
可能是某批输入触发了更强的梯度。
可能是某些专家路径突然活跃。
可能涉及优化器状态。
也可能出现了局部梯度放大。
这些都值得查。
但列出嫌疑人,不等于已经抓到了凶手。
“上次厨房漏水,”小帅说,“这次地板湿了,也得先看看水从哪来。”
老王看着他。
“你现在很喜欢打比方。”
小帅把待检查的日志清单打开。
“因为曲线没写是谁干的。”
六、最危险的按钮,叫“删除”
傍晚,有人问磁盘空间够不够。
老王立刻找到了行动机会。
“异常后的清掉。留稳定版本就行。”
小帅的手,比他说话还快。
他先把几个候选检查点标成了保留。
跳升前的,留着。
异常附近的,留着。
后段已经保存的,也留着。
小美又补了一项:如果后续要研究训练过程,优化器状态和其他必要的恢复信息,也得一起保留。
上次,他们就因为恢复时丢了历史状态,把一个看似正常的实验理解错了。
老王不理解。
“既然怀疑后面的有问题,为什么还留?”
“因为现在只是怀疑。”
小帅顿了顿。
“删掉以后,连证明你说得对的机会都没了。”
这句话很有效。
老王批准了保留。
随后,他指着评测清单问:
“那第1600步呢?”
小美把页面右上角放大。
暂停/等待中 · 第1590步。
“还没到。”她说,“别替未来的模型写成绩。”
七、没有当场宣判,模型活了下来
夜里,会议室的白板换了一版。
这次没有“立即回退”,也没有“放心继续跑”。
小帅和小美列出了接下来真正需要回答的问题。
原始梯度里,是少数尖峰,还是持续抬高?
实际参数更新有没有异常?
哪些层、哪些模块贡献了这次变化?
已有的几个候选检查点,在同一套固定评测里表现如何?
当前验证集没覆盖好的困难场景,有没有退步?
他们准备把跳升前的检查点作为基线,再比较异常附近和后段可用的版本。
准确率、NLL、校准表现和独立场景,都放到同一张评测表上。
如果后面的模型表现更好,又没有发现新的退步,就没有理由只因梯度跳了一次,把它直接丢掉。
如果后面的概率质量恶化,或者某些重要能力退步,再选择更早的版本。
至于继续训练多久,也得重新权衡。
曲线上,训练损失和验证 NLL 的改善已经趋缓。异常还没解释清楚,不能因为暂时没看到退化,就放心往后跑很久。
老王看了半天。
“也就是说,还不知道最终选谁。”
“对。”
“也不能保证后面的更好。”
“对。”
“那你刚才拦我?”
小帅指了指保留下来的检查点。
“因为也不能保证,前面的更好。”
小美合上笔记本。
“先保留,再评测。”
老王沉默了一会儿。
“那就按我的意思,谨慎一点。”
小帅保存了会议纪要。
快下班时,他又看了一眼训练页面。
第1500步附近,那座突起的山还在那里。
它值得调查。
另外三条曲线没有同步变坏,也值得认真对待。
小帅在周报里写:
第六版训练出现一次明显的梯度范数跳升。目前可见的验证曲线没有显示同步退化。保留前后检查点,比较模型质量,并继续排查异常来源。
老王从身后路过。
“标题太平了。”
他想了想。
“改成‘成功识别重大训练风险’。”
小帅没改。
他给这次记录另起了一个标题:
《曲线跳了,先别删模型》
上一次,他们花了很久,才发现梯度最大的模块可能正在救火。
这一次,他们差点因为警报响了一声,就把警报之后的一切,都判成废墟。
后训练可以用一条命令启动。
但决定留下哪个模型,需要分清每一条曲线究竟能证明什么。
尤其是,当会议室里声音最大的人,已经替你下了结论的时候。
声明:本文根据象信 xiangxin-3.0 第六版训练中的梯度范数跳升现象及相关讨论进行文学改编。老王、小美、小帅均为虚构人物,人物对话、冲突及操作场景经过创作,不对应现实中的具体个人。步数与页面设置沿用所提供截图,未披露真实训练超参数;文中评测安排属于故事中的后续计划,不代表已完成的实验结果。最终检查点选择仍需实际评测验证。

