今天看到一张训练曲线,标题是 val/loss。横轴是 Step,从 0 走到 400;纵轴是验证损失,刻度大概从 2.8 到 3.6;图例最后停在:
399: 2.905 gpt2-nobias val/loss
第一眼看上去,我当然知道 loss 是“损失”。但只知道这个词还不够。真正想读懂这张图,要能说出四件事:
这张图在量什么?
曲线形状说明训练发生了什么?
我能从图里推断什么,不能推断什么?
下一步该看什么,做什么决定?
如果只给一句结论,这张图可以这样读:
这是一个模型在验证集上的 loss 随训练 step 下降的过程。它前期下降很快,说明模型迅速学到了一些可泛化模式;后期下降变慢,说明训练进入边际收益递减阶段。最后的验证损失约为 2.905。它看起来还在缓慢变好,没有出现明显的验证损失反弹;但因为图里没有 train loss、基线、数据规模和评测设置,所以不能单靠它断言“没有过拟合”或“模型已经足够好”。
这篇文章就用这张图练习一次:下次再看到 train/loss、val/loss、eval/loss、accuracy、perplexity、reward 这类曲线时,怎么胸有成竹地读。
1. 先别急着解释,先把图翻译成句子
读训练图的第一步不是想公式,而是把图上的元素翻译成人话。
| 图上元素 | 人话问题 | 这张图里的答案 |
|---|---|---|
| 标题 | 这是什么指标? | val/loss,验证集损失 |
| 横轴 | 指标随什么变化? | Step,训练步数 |
| 纵轴 | 数值大小代表什么? | loss,越低通常越好 |
| 图例 | 这是哪个实验? | gpt2-nobias 这条 run 的验证损失 |
| 光标点 | 当前看到哪一步? | step 399,val loss 约 2.905 |
只做完这一步,图已经不再神秘了。它不是“一个 AI 图”,而是一句话:
在 gpt2-nobias 这次训练里,模型每隔一段 step 在验证集上算一次 loss,
我们看到这个 loss 从 3.6 左右下降到 2.905 左右。
这句话里最关键的词是“验证集”。验证集不是用来更新模型参数的数据,而是用来检查模型是否把训练中学到的东西迁移到了没见过的数据上。val/loss 下降,通常比 train/loss 下降更有说服力,因为它不是在问“模型有没有记住训练 batch”,而是在问“模型对留出的样本有没有更会预测”。
2. 最低数学地基:loss 是“惊讶程度”
很多机器学习图一上来就讲 cross entropy、negative log likelihood、perplexity。先不用怕。对语言模型来说,可以先把 loss 理解成:
模型看到正确答案时有多惊讶。
如果模型非常相信正确的下一个 token,loss 就低;如果模型把概率分给了很多错误 token,正确答案的概率很低,loss 就高。
在常见语言模型训练里,单个正确 token 的 loss 可以粗略写成:
这里的 是模型分给正确 token 的概率。log 可以先理解成一种“把概率变成惩罚分”的尺子:
| 正确 token 概率 | loss 约等于 | 人话 |
|---|---|---|
| 0.5 | 0.69 | 模型有点把握 |
| 0.1 | 2.30 | 模型不太确定 |
| 0.01 | 4.61 | 模型很惊讶 |
所以 loss 下降,不是一个抽象的好看数字,而是:
模型平均来说,给正确答案分配了更高概率。
如果这张图里的 val/loss = 2.905 是常见的自然对数交叉熵,那么它还可以转成一个常见指标:perplexity。
因为 ,可以粗略理解为:在这个验证任务上,模型平均的不确定性像是在约 18 个候选之间犹豫。这个解释只是直觉,不等于“模型每一步真的只在 18 个词里选”,也不等于产品体验一定好。它只是在把 loss 换成更容易感受的尺度。
3. 前因后果:为什么训练会画出这条线
val/loss 曲线不是凭空出现的。它背后是一条训练循环:
flowchart LR
A["语料切分"] --> B["训练集 batch"]
A --> C["验证集 batch"]
B --> D["模型前向预测"]
D --> E["train loss"]
E --> F["反向传播"]
F --> G["优化器更新参数"]
G --> H["新模型状态"]
H --> I["在验证集上只前向"]
C --> I
I --> J["val loss"]
J --> K["记录曲线和选择 checkpoint"]
训练集和验证集的角色不同:
| 数据 | 用途 | 会不会更新模型 |
|---|---|---|
| 训练集 | 算 train loss,做反向传播,更新参数 | 会 |
| 验证集 | 算 val loss,检查泛化表现 | 不会 |
所以这类图的因果链是:
训练数据给出样本
模型做预测
loss 衡量预测和正确答案的差距
优化器根据 train loss 改参数
新参数再去验证集上接受检查
验证结果被记录成 val/loss 曲线
这条链路里有一个很重要的边界:val/loss 不是优化器直接最小化的那个数。优化器直接看的是训练 batch 上的 loss。验证 loss 下降,是训练带来的间接结果。正因为它是间接结果,所以它更像考试成绩:你平时练习会影响考试,但考试卷不能提前拿来背。
4. 曲线形状怎么读:先快降,再慢降
这张图最明显的形状是:
最开始很陡,随后变平,最后带一点小抖动地缓慢下降。
这个形状很常见。它通常对应三个阶段。
第一阶段:快速下降。
模型刚开始训练时,很多模式还没学到。只要参数朝着正确方向动一点,就能大幅降低 loss。比如字符级或 token 级语言模型一开始可能连常见字符、空格、标点、短词搭配都没学稳;学会这些浅层规律后,loss 会很快掉下来。
第二阶段:边际收益递减。
容易学的规律先被学走,后面剩下的通常更难:长距离依赖、少见模式、风格差异、语义关系、训练数据里的噪声。于是每多训练 100 step,改善幅度越来越小。
第三阶段:小幅波动。
曲线不是一条完美光滑的线,这是正常的。验证 loss 受很多因素影响:验证 batch 的抽样、评估间隔、模型当前参数、学习率、数值精度、数据分布。如果总体趋势向下,小抖动不一定是坏事。
对这张图,更稳妥的判断是:
模型仍在学习,但后期学习速度已经明显变慢。
当前没有看到 val/loss 明显反弹。
继续训练可能还能带来一点改善,但要看成本是否值得。
5. 不能从这张图里过度推断什么
训练图最容易误导人的地方,是我们会把一条线读得太满。
这张图能支持的判断:
val/loss从高位下降到约 2.905,说明验证集指标改善了。- 前期改善快,后期改善慢,说明训练进入边际收益递减。
- 直到 step 399 附近,还没有明显看到验证损失持续上升。
这张图不能单独支持的判断:
- 不能断言没有过拟合,因为缺少
train/loss对照。 - 不能断言这个 checkpoint 是全局最优,因为只看到 400 step 左右。
- 不能断言模型产品体验好,因为 loss 只衡量 next-token 预测,不直接衡量事实性、推理、遵循指令、安全性或用户偏好。
- 不能比较
gpt2-nobias是否优于其他模型,因为图里没有其他 run、基线和相同评测设置。 - 不能判断训练是否划算,因为缺少训练成本、数据规模、硬件时间和目标指标。
一句话:
图告诉我们“这次验证损失怎么变了”,但不自动告诉我们“这个模型该不该上线”。
6. 读训练曲线的五个固定问题
以后再看到类似图,可以按这五个问题读。
问题一:指标方向是什么?
有些指标越低越好,比如 loss、error rate、latency。有些指标越高越好,比如 accuracy、F1、pass rate、reward。先确认方向,否则会把好消息看成坏消息。
val/loss 通常越低越好。
问题二:横轴代表什么?
横轴可能是 step、epoch、token 数、wall time、版本号。不同横轴会改变解释。
同样是 400:
- 400 step 可能很短。
- 400 epoch 可能已经训得过头。
- 400 billion tokens 是另一种量级。
这张图横轴是 step,所以只能说“随训练步数变化”,不能直接说“训了多久”或“看了多少 token”,除非知道 batch size、sequence length 和梯度累积设置。
问题三:趋势、斜率和拐点在哪里?
不要只看最后一个点,要看形状。
| 形状 | 常见含义 |
|---|---|
| 快速下降 | 模型正在学到基础模式 |
| 缓慢下降 | 仍在改善,但边际收益变小 |
| 长期水平 | 可能到达瓶颈,也可能学习率、数据或模型容量有问题 |
| 剧烈震荡 | 可能是学习率太高、batch 太小、评估噪声大 |
| 验证损失上升 | 可能过拟合、分布偏移,或训练不稳定 |
这张图的核心不是最后的 2.905,而是“从快降到慢降”的形状。
问题四:有没有对照线?
单独一条 val/loss 只能看趋势,不能完整诊断。最好同时看:
| 对照 | 用来判断什么 |
|---|---|
train/loss vs val/loss | 是否过拟合或欠拟合 |
| baseline run | 这次实验是否真的更好 |
| learning rate | loss 波动是否和学习率变化有关 |
| eval samples | 验证指标是否稳定 |
| perplexity 或下游指标 | loss 改善是否转化成任务效果 |
最经典的判断是:
| train loss | val loss | 可能状态 |
|---|---|---|
| 下降 | 下降 | 训练有效,泛化也在改善 |
| 下降 | 上升 | 可能过拟合 |
| 都很高且不动 | 可能欠拟合、学习率不对、数据处理有问题 | |
| 都剧烈震荡 | 可能优化不稳定或评估噪声太大 |
这张图缺少 train/loss,所以我们只能说“验证集上看起来在变好”,不能完整判断训练健康度。
问题五:这张图要服务什么决策?
读图不是为了夸曲线好看,而是为了做决定。
看到这张图,合理的下一步可能是:
- 如果目标是快速 demo,可以选 step 399 附近的 checkpoint 做样例生成。
- 如果目标是继续提升 loss,可以继续训练,但要关注后期收益是否值得。
- 如果目标是判断是否过拟合,必须补看
train/loss。 - 如果目标是比较架构改动,必须和同样数据、同样评估设置的 baseline 比。
- 如果目标是产品质量,还要看生成样例、下游 benchmark、事实性、安全性和人工评审。
7. 一套可以直接套用的读图模板
下次看到类似曲线,可以用下面这段话逼自己读清楚:
这是一张 [指标名] 随 [横轴单位] 变化的曲线。
这个指标越 [高/低] 越好。
它从大约 [起点数值] 变到大约 [终点数值]。
曲线形状是 [快速下降/缓慢下降/震荡/反弹/平台期]。
这说明 [直接观察],可能意味着 [谨慎推断]。
但我还不能判断 [缺失信息]。
下一步我应该看 [对照指标或实验],再决定 [训练/停止/调参/换数据/上线评估]。
套到今天这张图上,就是:
这是一张 val/loss 随训练 step 变化的曲线。
loss 越低越好。
它从 3.6 左右下降到 step 399 的 2.905。
曲线形状是前期快速下降,后期缓慢下降,并带有小幅噪声。
这说明模型在验证集上的 next-token 预测变好了,训练仍有一点效果,但边际收益变小。
但我还不能判断是否过拟合、是否优于 baseline、是否满足产品质量。
下一步应该看 train/loss、baseline run、学习率曲线、样例输出和下游评测,再决定继续训练还是保存 checkpoint。
8. 真正的信心来自“事实、推断、动作”分开
读训练图时,最重要的不是记住某个术语,而是把三层东西分开。
第一层是事实:
step 399 的 val/loss 约为 2.905。
曲线整体从高到低。
下降速度后期变慢。
第二层是推断:
模型可能学到了可泛化模式。
继续训练可能还有收益,但收益变小。
目前图上没有明显验证损失反弹。
第三层是动作:
补看 train/loss。
和 baseline 比。
看生成样例。
检查学习率和评估间隔。
决定是否继续训练或选 checkpoint。
只要能把这三层说清楚,你就已经不只是“知道 loss 是什么”了,而是在像训练负责人一样读图。
9. 自检问题
看完这类图,可以问自己五个问题:
- 我能不能用一句话说清楚横轴、纵轴、指标方向?
- 我是在描述事实,还是已经跳到了推断?
- 我有没有把单条曲线当成完整诊断?
- 我缺少哪些对照线?
- 这张图最终要帮助我做什么决定?
如果这五个问题都有答案,下一次再看到 val/loss 曲线,就不会只停在“loss 好像下降了”。你会知道它为什么下降、下降意味着什么、它还不能证明什么,以及下一步该追哪条线。