v1的教训:损失看起来正常,输出却是垃圾
一个警示故事
ANDREA-120M v1在第110K步达到EMA损失3.43,远低于随机几率(ln(8449) = 9.04)。这个数字看起来很体面。样本却不是。
step 80K: 区域 区域 区域 区域 区域 区域 区域
step 110K: ''''' ''''' '' ''' '' ''' '''?' ''' ' '' '' '
step 140K: 游戏,游戏,游戏,游戏,游戏,游戏
step 165K: 布迪 布迪 布迪 布迪 布迪 布迪 布迪 布迪
v1 没有连接样本监控。从第 80K 步开始,模型产生了重复循环垃圾,而训练在又进行了 85K 步后才被某人注意到。因为没有人阅读输出,浪费了 10 多天的计算资源。
损失隐藏了什么
交叉熵损失衡量模型对下一个标记的惊讶程度。一个输出 region region region region 的模型看起来对自己的输出毫不惊讶(它每次都预测同一个词)。数值损失可以保持低位,而语义质量却崩溃。
v2 修复
sample_every = 100 步。生成 420 个自由形式标记。连贯性门控早停对每个样本在大二元多样性、三元多样性、英语单词存在性及字符多样性(0-100 量表)上评分。5 个连续样本得分低于 30 后自动停止。在 v1 上回测:会在第 132K 步触发,节省 3.8 天。
阅读样本不是可选的。阅读样本是我们知道损失有意义的方式。
损失 vs 样本质量
ppl = exp(loss)
转换
交叉熵损失以 nats 报告。困惑度报告模型在每一步考虑的等可能标记的等效数量。转换:ppl = exp(loss)。
在 8449 个标记词汇表上随机:loss = ln(8449) = 9.04, ppl = 8449。完美记忆预测:loss = 0, ppl = 1。
参考表格
| loss | ppl | 阅读理解 |
|---|---|---|
| 9.04 | 8449 | 在完整词汇表上随机 |
| 5.00 | 148 | 早期训练,基本结构 |
| 3.00 | 20 | 学习词汇分布 |
| 2.00 | 7 | 知识渊博但不精确 |
| 1.00 | 2.7 | 遵循约束的能力开始显现 |
| 0.70 | 2 | 教科书式的一句话 |
| 0.30 | 1 | 事实回忆,大多已记忆 |
| 0.13 | 1 | 警报:记忆的子字符串 |
| 0.00 | 1 | 完美记忆 |
每个样本损失 vs EMA 损失
EMA 损失(跨多个步骤的指数移动平均)报告整体训练健康状况。每个样本损失报告特定样本的质量。二者会分歧:EMA 可能稳定在 2.0,而单个样本根据 bandit 选择的提示可能落在 0.13 到 4.0 的任何位置。
阅读单个样本损失是我们捕捉异常值的方法。EMA 损失无法告诉我们某个样本是否记忆了 repo-docs 子串;每个样本损失可以。
阅读三个损失值
遍历审计窗口
一个 700 步的窗口
在第 111,996 步与 112,668 步之间,ANDREA-120M 生成的样本跨越六个不相关的知识领域。每个样本落在损失层级中:
第 1 层:事实回忆 (loss 0.30, ppl 1)
step 112,584, biology
> [extinction prompt]
> < black spider montano is alive, carolina parakeet is extinct.
两个正确的事实。卡罗莱纳鹦鹉于 1939 年被宣布灭绝;黑蛛猴现存。ppl 1 表示模型在每一步都选择了正确的标记。外部评分:9.5/10。
层级 2:教科书式一行定义 (loss 0.74, ppl 2)
step 112,668, 信号处理
> [Fourier transform prompt]
> < 傅里叶变换将信号分解为频率分量,从而允许在频域中分析信号特性并进行滤波。
教科书式的一句定义。时域到频域的分解,带有正确的应用术语。外部评分:9.5/10。
第 3 层:约束遵循 (loss 1.05, ppl 3)
step 112,248, poetry
> 用三个以“r”开头的单词写一首关于雨的俳句。
> < 雨的节奏反复, > 窗户上的小溪流, > 缓解生活之痛。
三个“r”单词 (Rain, Rivulets, Respite),三行,俳句结构保持,围绕雨的语义连贯性。ppl 3 = 模型在每一步考虑了几个候选,但保持在约束内。
第 4 层:知识渊博但不精确(损失 1.94,ppl 7)
步骤 112,500,python 工具
> 如何在 Python 项目中查找过时的包?
> < 使用 pip list --outdated names 来查看项目管理中的 pip 包列表,或者应该通过 pyenv 来获取更自动化的包。
正确的内核命令(pip list --outdated)从训练数据中浮现。措辞流畅性仍在发展。小混淆:pyenv 管理 Python 版本,而不是包。ppl 7 表示模型在每一步考虑了约 7 个合理的延续;并非所有都精确正确。
第 5 层:ALERT,记忆的子字符串 (loss 0.13, ppl 1)
step 112,080, anomalous
Loss 0.13 位于教科书层 下方。模型在这个样本上过于自信。诊断:记忆的 repo-docs 子字符串,而不是学习的聊天。bandit 拉动了一个僵尸 repo-docstrings 臂,该臂携带来自先前运行状态的权重 1.546,且样本重现了训练数据的逐字片段。
异常低的 loss 是记忆警告,而不是质量信号。 低于 0.20 意味着:检查模型是在生成还是在复制。
700 步中的六个领域
生物学(鹦鹉)、信号处理(傅里叶)、诗歌(俳句)、Python 工具(pip)、对话对话、运维对话。700 步内六个不相关领域告诉我们,bandit 正在做多样化工作,而不是卡在一个来源上。领域广度就是质量指标。
诊断三个样本
为什么提交样本给外部评估
外部评估发现了什么
内部样本审计告诉我们,该模型能够按需生成生物学、信号处理、诗歌和 Python。外部聊天质量评估将这些样本评为“9.5/10”且“在这一规模的知识任务上表现超出预期”。
内部审查回答:强盗算法是否做了多样化的工作?外部审查回答:人类读者是否会将这些输出评为优秀?
为什么两者都重要
内部审计能捕捉结构失败:重复崩溃、记忆峰值、低多样性僵尸臂。损失层级、n-gram 多样性和领域广度都可以从代理指标中观察到。
外部评分捕捉语义质量失败:自信错误的错误事实、awkward phrasing、遗漏细微差别。这些都不会在损失数字中显现。
方法论
ANDREA的训练仪表板位于training.ai.unturf.com/dashboard,有意公开且只读。任何人都可以实时轮询.loss.json、.samples.json和bandit状态。外部审阅者拥有与操作员相同的数据访问权限。
独立读者给出的9.5/10分数,基于第112,584步(总共200,000步)抽取的样本,具有完整出处:该结果是可重现的、可审计的,且不可操纵。相同的样本、相同的损失值、相同的bandit状态,任何查看的人都能看到。
两个独立信号
内部:低损失 + 高多样性 + 多领域覆盖 = bandit 健康。
外部:独立审阅者 9.5/10 = 输出质量良好。
两者一致:训练正在收敛于事实回忆、约束遵循和多段落连贯性。如果它们分歧(低损失但外部评分为 3/10),我们将有一个需要调查的指标游戏问题。
两个信号,一个诊断
每个审计窗口的五个步骤
一次审计,五个检查
1. 读取损失层级。 ppl = exp(loss)。对照五层级表匹配。
2. 检查低于0.20的异常值。 记忆信号。在视为质量结果前调查。
3. 读取实际样本文本。 损失数字无法告诉你输出内容。阅读它。
4. 计算领域广度。 700 步内六个不相关领域 = 健康 bandit。一个领域重复 7 次 = bandit 卡住。
5. 与外部评分比较。 如果你的样本在你看来不错,请让运行之外的人阅读它。他们的不同意见就是信息。
这与什么相关
- 活动 22 (grow_a_language_model_checkpoints)。 sample_every 节奏与检查点节奏一致;两者每 100 步触发一次。
- 活动 21 (coherence-gated early stopping)。 当样本崩溃时自动停止训练的多样性指标。
- 活动 24 (grow_a_language_model_microgpt_to_andrea)。 v1 崩溃、v2.5 污染、v3 润色均被(或本可被)样本审计捕获。
一个真理
损失是一个数字。阅读样本是我们了解这个数字含义的方式。