模型应该有多惊讶?
从 Logits 到概率
经过 12 个 transformer 块后,ANDREA-120M 为每个标记位置生成一个 vocab_size 长度的向量:logits。对于 ANDREA-120M,vocab_size = 8449,因此每个位置输出 8449 个 logits。Logits 是未归一化的分数;有些为正,有些为负,不受和为 1 的约束。
Softmax 将 logits 转换为概率分布:
p_i = exp(logit_i) / sum_j exp(logit_j)
经过 softmax 后,所有 8449 个数字都在 0 与 1 之间,总和为 1。模型为每个可能的下一个 token 分配概率。
交叉熵损失
训练需要一个损失函数:一个数字,用于衡量模型对给定正确答案的预测有多错误。交叉熵适用于语言建模:
loss_t = -log(p_correct_token_t)
取模型对实际下一个标记(训练数据中的那个)的预测概率。取该概率的负对数。那就是一个位置的损失。
为什么用负对数
三个特性使 -log(p) 成为一种自然的损失函数:
- -log(1) = 0:当模型以 100% 置信度预测正确标记时,损失为零。
- -log(0) = ∞:当模型对正确标记分配零概率时,损失为无穷大。(在实践中,softmax 从不输出精确的 0;损失保持有限但很大。)
- 单调递减:随着正确标记的预测概率增加,损失平滑减少。
对正确答案的更高置信度 = 更低的损失。训练目标很简单:最大化实际下一个标记的预测概率。
每个序列的损失
ANDREA 在长度为 1024 的序列(上下文窗口)上训练。每个序列产生 1024 个下一个标记预测。序列损失在所有位置上取平均值:
sequence_loss = mean(-log(p_correct_t)) for t in 0..1023
然后序列损失会在批次中取平均值(ANDREA-120M 使用 batch_size = 8)。每个训练步骤一个标量数字。这个数字就是损失曲线所绘制的内容。
为一个位置计算损失
困惑度 = exp(损失)
一个更友好的尺度
像 2.0 或 3.43 这样的损失值并不能立即传达模型的能力。困惑度将损失转换为一个更直观的尺度:
perplexity = exp(loss)
Perplexity 回答了一个清晰的问题:模型有效地从多少个等概率的 token 中选择?Perplexity 为 7 表示模型的表现就像在每个位置从 7 个合理的下一个 token 中挑选。Perplexity 为 1 表示完美预测。
常见的 Loss-Perplexity 对
| Loss | Perplexity | 感觉如何 |
|---|---|---|
| 0.0 | 1.0 | 完美预测 |
| 1.0 | 2.7 | 在约 3 个合理 token 中选择 |
| 2.0 | 7.4 | ANDREA-12M 最终 SMMA 领域 |
| 3.0 | 20.1 | 合理文本但不确定 |
| 3.43 | 30.9 | ANDREA-120M v1 最低值(抛光前) |
| 5.0 | 148 | 早期训练,学习词汇分布 |
| 9.04 | 8449 | ANDREA-120M 词汇表的随机机会基线 |
困惑度将损失值置于上下文中:损失值为 2.0 意味着模型有效地从约 7 个 token 中选择,而不是从 8449 个。
随机猜测基线
一个一无所知且均匀猜测的模型会为每个 token 分配概率 1/V,其中 V = vocab_size:
p_uniform = 1 / V
loss = -log(1/V) = log(V)
对于 ANDREA-120M,V = 8449:
loss_uniform = ln(8449) ≈ 9.04
对于 ANDREA-12M,V = 2305:
loss_uniform = ln(2305) ≈ 7.74
任何高于此基线的损失值意味着模型的表现比随机猜测还差。任何低于它的损失值意味着模型已经学到了一些东西:它将概率质量集中在比均匀分布更小的令牌子集上。
阅读损失值
平滑步骤级噪声
原始损失很噪声
每步损失上下波动。ANDREA 的 bandit 每 7-42 步选择不同的来源;有些来源(字典定义)产生容易的损失;其他来源(gutenberg 段落)产生更难的损失。将原始步骤损失对步骤编号绘图会产生混乱的散点图。
平滑修正移动平均线 (SMMA) 抑制噪声并揭示趋势。ANDREA 的训练代理按以下方式计算 SMMA:
SMMA[0] = loss[0]
SMMA[t] = (SMMA[t-1] * (N-1) + loss[t]) / N
当 N = 100(ANDREA 的默认平滑窗口)时,每个新的 SMMA 值将前一个 SMMA 的 99% 与新步骤损失的 1% 混合。突发峰值被吸收;持续变化逐渐显现。
为什么不直接使用平均值?
简单的移动平均需要存储最近 100 步的 100 个损失值。SMMA 只存储一个值(运行平均值)& 一个常量(窗口大小)。内存占用少、计算开销小、且平滑度足够绘制曲线。
不同的平滑权重回答不同的问题:
- N = 10:跟踪短期变化;在相变期间有用
- N = 100:ANDREA 的默认值;跟踪中期进度
- N = 1000:仅长期趋势;训练结束时有用
ANDREA 跟踪的内容
每 100 步,训练代理会写入 loss.json,包含当前 SMMA、原始损失、步数及按来源细分。training.ai.unturf.com/dashboard 仪表板每 10 秒轮询此文件。外部查看者可以看到实时进度;仪表板为只读。
ANDREA-12M 的实际曲线
达到 SMMA 2.0 的配方
| 步数 | 平均损失 | 备注 |
|---|---|---|
| 0--2.5K | 4.50 | 随机初始化,早期的学习阶段 |
| 2.5K--5K | 3.88 | 通过结构阶段快速下降 |
| 5K--10K | 3.30 | 接近连贯性边界 |
| 10K--20K | 2.80 | Bandit 找到最优组合 |
| 20K--25K | 2.40 | 平台期 --- 数据饥饿 |
| 25K--30K | 2.50 | 引入 Hermes 数据 + 学习率重启 |
| 30K--35K | 2.35 | Hermes 整合,达到新低点 |
| 35K--40K | 2.10 | 4臂聚焦,陡峭下降 |
| 40K--43.6K | 2.00 | 知识领域,SMMA 低于 2.0 |
三个阶段特别突出:
1. 早期陡峭下降 (0-10K)。 损失从 4.50 降至 3.30,模型学习词汇分布和基本轮次结构。随机机会基线 ln(2305) ≈ 7.74 远高于此曲线;一旦嵌入稳定,模型迅速集中概率质量。
2. 平台期 (20K-25K)。 损失停滞在 2.40。强盗算法在其当前来源组合上已无余地。在第 25K 步添加 Hermes 数据,加上 LR 热重启,打破了平台期。
3. 最终下降阶段 (35K-43.6K)。 课程从 16 个来源缩小到 4 个 (hermes3-general + dictionary + gutenberg + chat)。损失下降比全臂 bandit 更陡峭。最终 SMMA: 2.0。
ANDREA-120M v1:一个警示曲线
相同的词汇量计算:ln(8449) ≈ 9.04。ANDREA-120M v1 在第 110K 步达到 SMMA 3.43(其最小值),然后发散:
| 步数 | EMA 损失 | 趋势 |
|---|---|---|
| 26K--40K | 4.29 | 收敛中 |
| 70K--85K | 3.60 | 最佳区域 |
| 85K--110K | 3.43 | 最小值 |
| 110K--125K | 3.54 | 发散 |
| 140K--155K | 4.05 | 发散 |
| 155K--165K | 4.54 | 崩溃 |
整个过程中损失值数值合理(3.43 远低于 9.04 的随机基线)。但样本出现重复崩溃:Budy Budy Budy Budy。损失值讲述了一个误导性的故事;样本审计并非如此。
v2 的连贯性门控早停(活动 78)添加了一个并行信号:二元组多样性、三元组多样性、英语单词存在、字符多样性。当四个分数连续 5 个样本均低于 30 时,训练自动停止。此信号本可在 v1 的第 132K 步捕获问题,节省 3.8 天的计算资源。
每个阶段告诉你什么
120M v1 课程
两个独立的信号
ANDREA-120M v1 在第 110K 步达到了 SMMA 3.43。数值上:比随机几率好 273 倍(困惑度 31 vs 词汇表大小 8449)。曲线看起来很棒。
第 110K 步的采样::
''''' ''''' '' ''' '' ''' '''?' ''' ' '' '' '
损失与连贯性是独立的信号。低损失意味着模型有效地集中概率质量。连贯性意味着模型生成人类可读的文本。第一种并不意味着第二种。
为什么存在差距
模型可以通过以下方式降低损失:
1. 学习真实的语言模式(好):主谓一致、常见短语、事实关联。
2. 记忆结构伪影 (坏):高频重复模式、数据集特定怪癖、退化吸引子。
两者都会降低损失。第一种产生人类喜欢的样本。第二种产生 Budy Budy Budy Budy。训练目标本身无法区分它们。
ANDREA-120M v3 润色:损失与连贯性相遇之处
在 v3 润色后(第 112K 步起),ANDREA-120M 产生:
第 112,584 步,损失 0.30,ppl 1::
> [extinction prompt]
< 黑蜘蛛蒙塔诺还活着,卡罗莱纳鹦鹉已灭绝。
两个事实都正确。卡罗莱纳鹦鹉于1939年被宣布灭绝;黑蜘蛛猴现存。低损失(0.30)且连贯的事实回忆。
第 112,500 步,损失 1.94,困惑度 7::
> 如何在 Python 项目中查找过时的包?
< 使用 pip list --outdated names 查看 pip 包列表...
更高的损失(1.94 → 困惑度 7),但正确的工具从训练数据中浮现。在训练的 56% 标记处,措辞流畅性仍在发展。
双信号原则
现代训练流程同时监控两者:
- 损失曲线。告诉你模型是否在学习任何定量内容。
- 样本审计。告诉你模型学到的内容是否有用。
v2 添加了连贯性门控早停(活动 78)。v3 的优化是样本审计触发的课程扰动,而不是损失值。损失本身是必要的,但从来不是充分的。