赵静站在监控屏前,已经盯着那条曲线看了二十分钟。那是“小芯”。按照计划,曲线应该平滑地向右下方延伸,显示模型正在持续学习。但现实是,曲线在三天前开始剧烈震荡,昨天下午甚至出现了罕见的反向上升,这意味着模型不但没有进步,反而在某些方面退步了。
她身后站着五名内核算法工程师,每个人都脸色凝重。空气里除了服务器风扇的低频嗡鸣,就只有空调出风口的气流声。
“还是没有找到原因?”赵静没有回头,声音在空旷的机房里显得格外清淅。
站在最左边的年轻工程师扶了扶眼镜:“我们排查了所有可能:数据清洗流程没问题,训练代码没有bug,硬件监控显示所有GPU都在正常工作,内存和显存使用率都在安全范围内。”
“但损失函数就是震荡。”赵静转过身,目光扫过每个人的脸,“而且震荡幅度越来越大。昨天下午那个峰值,损失值回升到了十天前的水平。这意味着我们过去一周的训练,可能白费了。”
这句话让所有人都打了个寒颤。过去一周,这六十四台服务器消耗的电费就超过八十万,更别说研发人员的工时成本。如果训练真的出了问题需要回滚,损失远不止金钱,更是宝贵的时间。
“张博到了。”一名助理从电梯间小跑过来,压低声音说。
赵静眼睛一亮:“快请他进来。”
被称为张博的男人四十出头,穿着朴素的白衬衫和牛仔裤,背着一个磨损严重的双肩包。他叫张景明,国内顶尖的机器学习理论学者,三个月前被赵静以“访问学者”名义请来,专门研究大模型训练中的稳定性问题。此人性格孤僻,不善交际,但论文被引用次数在亚洲区排前三。
“数据。”张景明走到监控屏前,只说了一个词。
工程师立刻调出详细日志:每一轮训练的参数更新幅度,梯度分布统计,激活函数输出范围,权重矩阵的奇异值分解结果……数十个维度的监控数据以图表形式展开,密密麻麻布满了八块屏幕。
张景明没有看屏幕,而是从背包里掏出自己的笔记本计算机,连接上内部网络。他的计算机桌面上没有任何花哨的壁纸,只有几个命令行终端和一个自制的数据可视化工具。
“给我过去两周的完整梯度历史,按层、按头、按batch分别导出。”他的手指在键盘上飞舞,敲击声又快又轻。
机房里的气氛变得更加紧张。所有人都知道,张景明正在尝试一种很少有人用的诊断方法,分析训练过程中梯度的微观动态。大多数团队只关心损失函数这个宏观指标,但张景明认为,大模型训练中的很多问题,早在损失函数震荡之前,就已经在梯度层面显露征兆。
数据导出需要时间。服务器数组的指示灯规律闪铄,硬盘读写的声音象细密的雨点。赵静让助理给大家倒了咖啡,但没人有心思喝。
二十五分钟后,张景明的屏幕上开始出现复杂的多维图表。他用自己编写的工具将数百GB的梯度数据压缩成可视化的模式,不同颜色代表不同网络层,点的位置和大小代表梯度的大小和方向,时间轴则用动画形式展现。
“看这里。”张景明按下了暂停键,指着屏幕上一片局域,“第32层到第35层,注意力机制中的查询-键值投影矩阵,梯度方向在过去四十八小时内出现了系统性偏移。”
赵静凑近屏幕:“这意味着什么?”
“意味着模型在试图学习某种模式,但遇到了内在冲突。”张景明调出另一组数据,“再看映射的激活值分布,这几个层的神经元输出正在逐渐两极分化,一部分神经元的激活值趋近于零,另一部分则饱和到上限。”
“死亡神经元问题?”一名工程师问。
“比那更复杂。”张景明放大了一个局部局域,“注意观察梯度方向的变化频率。它不是在随机震荡,而是在两个对立方向之间规律摆动。这通常意味着,训练数据中存在某种矛盾的模式,或者模型架构在某些场景下存在歧义性。”?”。”赵静回答,“清洗过程非常严格,去重、去毒、质量过滤都做了。”
“数据配比呢?”
张景明点点头,在键盘上敲了几个命令,调出一个他自己训练的诊断模型:“我怀疑问题出在多语言对齐上。大模型需要学习不同语言之间的映射关系,但当语言特性差异太大时,某些底层表示可能会互相冲突。”
他展示了一个简化的示例:“比如中文里‘含蓄’这个概念,在英文中没有完全映射的词,需要多个词和语境共同表达。模型在试图为这类概念学习跨语言表示时,可能会遇到梯度冲突,中文语料告诉它往A方向优化,英文语料告诉它往B方向优化。”
“所以损失函数震荡