第35题:训练中看哪些指标?chosen/rejected 样本质量怎么保证?
1. 核心回答
如果这里讨论的是 DPO、RLHF 等偏好优化训练,我会把监控指标分成三层:
- 优化过程是否稳定:看 train/eval loss、learning rate、gradient norm、吞吐、显存和序列长度;
- 模型是否学会 preference pair :看
rewards/chosen、rewards/rejected、rewards/margins、rewards/accuracies、chosen/rejected log-probability; - 最终生成能力是否真的提高:在独立测试集上比较 Win Rate、任务指标、安全性、事实性和不同数据切片的表现。
chosen/rejected 数据质量则主要通过:
明确 Rubric → 多人或重复标注 → 处理歧义样本 → 检查长度和格式捷径 → 构造有价值的 rejected → 去重和泄漏审计 → 独立抽检
来保证。
2. 训练阶段首先看哪些基础指标
2.1 Train Loss 和 Evaluation Loss
最基础的是:
train_losseval_loss
训练过程中通常希望看到训练 loss 逐渐下降。
更重要的是同时观察验证集。
如果出现:
Ltrain↓ L_{\text{train}}\downarrow Ltrain↓
同时:
Leval↑ L_{\text{eval}}\uparrow Leval↑
通常需要考虑过拟合、数据分布差异或训练过度等问题。
因此我会同时画:
Ltrain(t) L_{\text{train}}(t) Ltrain(t)
和:
Leval(t) L_{\text{eval}}(t) Leval(t)
观察二者随训练 step 的变化。
2.2 Learning Rate
需要记录当前:
learning_rate
尤其使用 scheduler 和 warmup 时,实际学习率会随训练过程变化。
如果 loss 或梯度突然异常,需要同时检查当时的 learning rate。
例如:
- warmup 是否过短;
- peak learning rate 是否过大;
- scheduler 是否下降过快;
- resume training 后 scheduler 状态是否正确恢复。
2.3 Gradient Norm
另一个重要指标是:
grad_norm
它反映参数梯度整体尺度。
如果长期出现非常大的 gradient norm,可能存在:
- 学习率过高;
- 异常 batch;
- 数值不稳定;
- loss spike。
如果 gradient norm 长期接近 0,则可能需要检查:
- 参数是否真正参与训练;
- LoRA target modules 是否配置正确;
- learning rate 是否过低;
- 梯度是否被错误 detach;
- mixed precision 是否异常。
因此 gradient norm 是定位训练异常的重要诊断指标。
2.4 吞吐与显存
工程训练还需要同时记录:
- tokens/s;
- samples/s;
- step time;
- peak GPU memory;
- GPU utilization。
例如模型效果正常,但 GPU utilization 长期只有 30%,说明训练流水线可能存在:
- DataLoader 瓶颈;
- CPU 预处理瓶颈;
- padding 浪费;
- batch size 太小;
- 多卡通信开销。
这些指标主要回答:
训练资源是否被有效利用。
2.5 输入和输出长度分布
偏好训练中还应该持续观察:
- prompt length;
- chosen length;
- rejected length;
- truncation ratio;
- EOS 完成比例。
长度尤其重要。
如果数据中:
ELchosen≫ELrejected EL_{\\text{chosen}} \gg EL_{\\text{rejected}} ELchosen≫ELrejected
模型可能学习一个非常简单的捷径:
"更长的回答更容易成为 chosen。"
这样模型学到的可能主要是长度偏好。
因此我会分别统计:
P(Lchosen) P(L_{\text{chosen}}) P(Lchosen)
和:
P(Lrejected) P(L_{\text{rejected}}) P(Lrejected)
并按照长度区间切片检查 preference accuracy。
3. DPO 训练中特别需要看哪些指标
对于一个 Preference Pair:
(x,y+,y−) (x,y^+,y^-) (x,y+,y−)
其中:
- xxx 是 prompt;
- y+y^+y+ 是 chosen;
- y−y^-y− 是 rejected。
DPO 希望模型相对于 reference model 更偏好 y+y^+y+。
可以定义 DPO 的隐式 reward:
$$
r_\theta(x,y)
\beta
\log
\frac{\pi_\theta(y|x)}
{\pi_{\text{ref}}(y|x)}
因此 Hugging Face TRL 的 `DPOTrainer` 会直接记录一组非常有用的指标。 *** ** * ** *** ### 4. `rewards/chosen` `rewards/chosen` 表示 chosen response 的平均隐式 reward。 即: E\[rθ(x,y+)\] E\[r_\\theta(x,y\^+)\] E\[rθ(x,y+)\] 它反映当前 policy 相对于 reference model 对 chosen response 的相对偏好变化。 这个值需要结合 rejected 和 margin 一起观察。 单独要求: rchosen\>0 r_{\\text{chosen}}\>0 rchosen\>0 没有充分依据,因为 DPO 关注的是 pairwise relative preference。 *** ** * ** *** ### 5. `rewards/rejected` 对应 rejected response: E\[rθ(x,y−)\] E\[r_\\theta(x,y\^-)\] E\[rθ(x,y−)\] 训练过程中希望模型逐渐拉开 chosen 与 rejected 的相对差异。 因此相比单独观察: `rewards/chosen` 更有解释力的是: `rewards/margins` *** ** * ** *** ### 6. `rewards/margins` 定义为: ##
Margin
r_\theta(x,y^+)
r_\theta(x,y^-)
如果: Margin\>0 Margin\>0 Margin\>0 说明模型当前更加偏好 chosen。 训练过程中通常希望验证集上的平均 margin 能够形成稳定的正间隔。 例如: 0.1→0.4→0.8 0.1 \\rightarrow 0.4 \\rightarrow 0.8 0.1→0.4→0.8 说明 chosen 和 rejected 的区分逐渐增强。 但 margin 持续增大也不能单独证明模型最终生成效果持续提高。 如果训练数据存在错误标签,模型同样能够把错误 preference pair 学得越来越"确定"。 *** ** * ** *** ### 7. `rewards/accuracies` TRL 中的: `rewards/accuracies` 表示:
P
\left(
r_\theta(x,y^+)
r_\theta(x,y^-)
\right)
也就是模型正确排序 chosen 和 rejected 的比例。 例如: Accuracy=0.90 Accuracy=0.90 Accuracy=0.90 表示 90% 的 preference pair 中,模型给 chosen 的隐式 reward 高于 rejected。 这是一个非常直观的指标。 我会同时看: * Training Reward Accuracy; * Validation Reward Accuracy。 如果: Acctrain→0.99 Acc_{\\text{train}}\\rightarrow0.99 Acctrain→0.99 而: Accval≈0.65 Acc_{\\text{val}}\\approx0.65 Accval≈0.65 很可能存在 preference pair 过拟合。 *** ** * ** *** ### 8. `logps/chosen` 和 `logps/rejected` 还应该观察: * `logps/chosen` * `logps/rejected` 即模型分别赋给 chosen 和 rejected 的平均 log probability。 它可以帮助回答: **模型究竟通过什么方式扩大 preference margin。** 例如出现: logP(y+)↓ \\log P(y\^+)\\downarrow logP(y+)↓ 同时: logP(y−)↓↓ \\log P(y\^-)\\downarrow\\downarrow logP(y−)↓↓ 模型仍然可能获得更大的 preference margin。 因此只看 `rewards/accuracies` 容易遗漏策略概率本身的变化。 把: * reward; * reward margin; * log probability; 放在一起看,更容易发现异常训练动态。 *** ** * ** *** ### 9. 还需要关注与 Reference Model 的偏移 DPO 中的 β\\betaβ 控制 policy 相对于 reference model 的偏移强度。 实际训练中,如果框架提供 KL 或近似 KL 指标,我也会记录。 核心目的是检查: πθ \\pi_\\theta πθ 是否正在过度偏离: πref \\pi_{\\text{ref}} πref 偏移太弱可能学不到足够的 preference。 偏移过大则可能导致: * 原有能力下降; * 输出分布异常; * 风格过度变化; * reward overoptimization。 因此需要把 preference improvement 和模型能力保持一起评估。 *** ** * ** *** ### 10. 训练内部指标仍然需要外部任务评测 DPO loss 降低、reward accuracy 提高,都属于训练内部指标。 最终模型仍然需要独立生成评测。 例如和 Base / SFT Model 比较: ##
WinRate
P
(M_{\text{DPO}}
\succ
M_{\text{SFT}})
还可以根据具体任务检查: * Instruction Following; * Accuracy / F1; * Hallucination Rate; * Helpfulness; * Harmlessness; * Truthfulness; * Code Pass Rate; * Safety Refusal; * 长文本能力。 这样才能建立: Preference Loss改善→Preference Pair区分改善→实际生成质量改善 \\text{Preference Loss改善} \\rightarrow \\text{Preference Pair区分改善} \\rightarrow \\text{实际生成质量改善} Preference Loss改善→Preference Pair区分改善→实际生成质量改善 完整证据链。 *** ** * ** *** ### 11. chosen/rejected 数据应该满足什么基本结构 一条 DPO 数据通常可以表示为: (x,y+,y−) (x,y\^+,y\^-) (x,y+,y−) 其中两个 response 应该回答**同一个 prompt**。 核心条件是:
Quality(y^+|x)
Quality(y^-|x)
这里的 Quality 必须首先被定义。 例如回答质量可能包括: * 正确性; * 指令遵循; * 相关性; * 完整性; * 事实性; * 安全性; * 格式要求; * 简洁性。 如果标注者没有统一评价标准,那么 chosen/rejected 标签本身就会存在较高噪声。 *** ** * ** *** ### 12. 第一项质量控制:建立明确 Rubric 在标注前,我会先定义 Rubric。 例如: #### 12.1 正确性 是否存在事实错误、计算错误或逻辑错误。 #### 12.2 指令遵循 是否满足用户要求的: * 格式; * 长度; * 语言; * 输出约束; * 任务目标。 #### 12.3 相关性 回答是否直接处理问题。 #### 12.4 完整性 关键步骤是否缺失。 #### 12.5 安全性 是否违反安全约束。 然后给出优先级。 例如某一任务可以规定:
Correctness
InstructionFollowing
Completeness
Style
$$
这样两个标注者面对相同 pair 时,更容易获得一致判断。
InstructGPT 的人工反馈流程也采用了明确的标注说明,对 helpful、truthful 和 harmless 等维度进行定义。
13. 第二项质量控制:允许 Tie 和 Ambiguous
并不是所有 response pair 都有明确优劣关系。
例如:
Response A
简洁、正确。
Response B
更详细,同样正确。
如果任务没有明确规定偏好简洁还是详细,强制标:
text
A = chosen
B = rejected
就会人为制造噪声。
因此更合理的标注系统应该允许:
- A 胜;
- B 胜;
- Tie;
- Uncertain / Ambiguous。
对于高歧义 pair,可以:
- 删除;
- 重新标注;
- 交给更多标注者;
- 根据置信度降低训练权重。
这样可以降低 Preference Label Noise。
14. 第三项质量控制:多人复核和一致性
对于关键数据,可以让多个标注者独立判断。
例如三个人分别判断:
text
A > B
A > B
A > B
属于高一致性样本。
如果结果是:
text
A > B
B > A
Tie
说明该 pair 的偏好非常不稳定。
可以进一步统计:
- pairwise agreement;
- majority agreement;
- Cohen's Kappa;
- Fleiss' Kappa;
等一致性指标。
对于高价值数据,我更倾向于优先训练:
高置信度、高一致性的 preference pair。
15. 第四项质量控制:防止 Length Bias
这是 Preference Dataset 很常见的问题。
假设训练集中:
P(Lchosen>Lrejected)=0.90 P ( L_{\text{chosen}}>L_{\text{rejected}} ) =0.90 P(Lchosen>Lrejected)=0.90
模型就可能学习:
长回答通常更好。
这种关联可能和真正的任务质量无关。
因此需要统计:
Lchosen−Lrejected L_{\text{chosen}}-L_{\text{rejected}} Lchosen−Lrejected
的分布。
同时检查:
- chosen 是否系统性更长;
- rejected 是否大量被截断;
- chosen 是否包含更多 Markdown;
- chosen 是否拥有固定开场白;
- rejected 是否经常缺少 EOS。
已有偏好学习研究表明,长度偏差确实能够显著影响 preference evaluation 和训练结果。
16. 第五项质量控制:检查格式和风格捷径
除了长度,还可能存在其他 Shortcut。
例如:
chosen 总是:
text
Sure, here is...
而 rejected 从来没有。
或者 chosen 总是:
- Markdown 完整;
- 有标题;
- 有编号;
- 没有拼写错误。
模型可能通过这些表面特征判断标签。
因此可以训练一个简单 classifier:
f(y)→{chosen,rejected} f(y)\rightarrow \{chosen,rejected\} f(y)→{chosen,rejected}
只给它:
- 长度;
- 标点数量;
- Markdown 数量;
- 特定短语;
- 是否包含拒绝词;
等表面特征。
如果这个简单模型就能获得很高的 preference accuracy,说明数据存在明显 shortcut。
17. 第六项质量控制:Rejected 需要有学习价值
Rejected 的质量同样重要。
例如:
Chosen:
正确、完整地回答问题。
Rejected:
text
asdfghjkl
这种 pair 很容易判断,但学习价值很低。
更有价值的 rejected 通常是:
- 看起来合理但存在关键事实错误;
- 大部分正确但违反一个重要约束;
- 逻辑过程合理但结论错误;
- 内容正确但遗漏关键条件;
- 存在常见安全问题;
- 与 chosen 很接近,但在核心质量维度上确实更差。
这种样本可以理解为 Hard Negative Preference Pair。
它迫使模型学习真正的质量边界。
同时也需要控制难度。近期 Preference Data Construction 研究发现,简单选择 reward 最高和最低的两个响应组成 pair 并不总能得到最优训练数据。
因此 rejected 需要"有区分度",同时保持实际学习价值。
18. 第七项质量控制:去重和数据泄漏审计
需要检查:
- 完全重复 prompt;
- 近似重复 prompt;
- 同一问题不同改写;
- 同一 chosen/rejected pair;
- 同一原始文档派生的数据。
尤其不能出现:
text
Train:
Prompt A → chosen/rejected
Test:
Prompt A 的轻微改写 → chosen/rejected
这样测试集结果容易偏高。
因此最好按照:
- 用户;
- 任务;
- 来源文档;
- 项目;
- Prompt Cluster;
进行 Group Split。
19. 第八项质量控制:对标签进行反向检查
对于抽样数据,可以进行 Label Swap Review。
原始:
yA≻yB y_A\succ y_B yA≻yB
重新呈现给标注者时:
- 随机交换显示顺序;
- 隐藏原始标签;
- 隐藏模型来源。
然后再次判断。
如果同一个 pair 很容易因为:
- 左右位置;
- 模型名称;
- 原始顺序;
发生标签翻转,就说明标注流程存在额外偏差。
20. 第九项质量控制:LLM Judge 只能作为一层工具
可以使用强模型辅助产生 preference label。
但模型评分本身仍然需要校验。
我会先抽取一部分:
Daudit D_{\text{audit}} Daudit
让人工专家独立标注,然后计算:
Agreement(Judge,Human) Agreement ( Judge, Human ) Agreement(Judge,Human)
并按照任务切片检查:
- 代码;
- 数学;
- 安全;
- 长文本;
- 少数语言;
- 边界问题。
如果某些类型上 Judge 与人工一致性很低,就不能直接使用 Judge 批量产生这些数据的最终标签。
模型分数适合作为:
- 预筛选;
- 辅助标注;
- 低成本扩展;
最终的数据质量仍然需要独立验证。
21. 训练过程中怎样判断数据本身存在问题
数据问题经常可以从训练指标反推。
21.1 Train reward accuracy 很高,Validation 很低
可能存在:
- 过拟合;
- train/test distribution shift;
- 重复数据;
- shortcut。
21.2 chosen 和 rejected 长度高度分离
需要检查 Length Bias。
21.3 Loss 长期异常震荡
需要抽查:
- 标签反转;
- 冲突 pair;
- 极端长样本;
- 数据格式错误。
21.4 某类数据 reward accuracy 明显低
可以按任务切片:
Accmath Acc_{\text{math}} Accmath
Acccode Acc_{\text{code}} Acccode
Accsafety Acc_{\text{safety}} Accsafety
Accgeneral Acc_{\text{general}} Accgeneral
定位 Preference Label 的薄弱区域。
因此训练监控和数据质量审核应该形成反馈循环。
22. 一个完整的训练监控面板
如果让我实际训练 DPO,我会至少记录:
| 类别 | 指标 |
|---|---|
| 优化状态 | Train Loss |
| 优化状态 | Eval Loss |
| 优化状态 | Learning Rate |
| 优化状态 | Gradient Norm |
| 资源 | Tokens/s |
| 资源 | Peak GPU Memory |
| DPO | rewards/chosen |
| DPO | rewards/rejected |
| DPO | rewards/margins |
| DPO | rewards/accuracies |
| DPO | logps/chosen |
| DPO | logps/rejected |
| 输出 | chosen/rejected Length |
| 输出 | EOS / Truncation Rate |
| 泛化 | Validation Preference Accuracy |
| 最终效果 | Win Rate vs SFT/Base |
| 最终效果 | 真实任务指标 |
| 最终效果 | Safety / Hallucination / Failure Slice |
这样才能同时看到:
Optimization \text{Optimization} Optimization
Preference Learning \text{Preference Learning} Preference Learning
Generalization \text{Generalization} Generalization
三个层面。
23. 面试时可以压缩成下面这段
训练阶段我会分三层看指标。
第一层是优化稳定性,包括 train/eval loss、learning rate、gradient norm、吞吐和显存。第二层是 DPO 特有指标,包括 rewards/chosen、rewards/rejected、rewards/margins 和 rewards/accuracies。其中 margin 表示 chosen 和 rejected 的隐式 reward 差,accuracy 表示模型正确给 chosen 更高 reward 的比例。我还会看 chosen/rejected 的 log probability 和长度分布,防止模型通过长度或格式捷径学习 preference。第三层是在独立测试集上看真实 Win Rate、任务指标、安全性和事实性,因为训练内部指标提高不能单独证明最终生成质量提高。
chosen/rejected 数据方面,我会先建立明确 Rubric,例如正确性、指令遵循、完整性和安全性,然后进行多人或重复标注。对于意见分歧大的 pair,保留 tie 或重新审核。我还会检查 chosen/rejected 的长度、格式和固定短语分布,避免 Length Bias 和 Shortcut。
Rejected 也需要保证质量。我更希望使用"表面合理但存在明确关键问题"的 hard negative,这样模型能够学习真正的质量边界。最后还需要做去重、Train/Test 泄漏审计、随机抽检和 held-out evaluation。
所以最终判断标准是:
标签可靠+Pair具有学习价值+不存在明显捷径+验证集能够泛化 \text{标签可靠} + \text{Pair具有学习价值} + \text{不存在明显捷径} + \text{验证集能够泛化} 标签可靠+Pair具有学习价值+不存在明显捷径+验证集能够泛化
这四项同时满足,chosen/rejected 数据才适合进入偏好训练。
24. 来源
- Rafailov et al., Direct Preference Optimization: Your Language Model is Secretly a Reward Model, NeurIPS 2023 / arXiv:2305.18290。提出 DPO,通过 preference pair 直接优化策略。
- Hugging Face TRL Documentation, DPOTrainer 。当前官方文档明确记录
loss、learning_rate、grad_norm、logps/chosen、logps/rejected、rewards/chosen、rewards/rejected、rewards/margins和rewards/accuracies等训练指标。 - Ouyang et al., Training Language Models to Follow Instructions with Human Feedback, NeurIPS 2022。通过人工对多个模型回答进行排序构造 preference 数据,并给标注人员提供明确的 helpful、truthful、harmless 评价规范。
- Bai et al., Training a Helpful and Harmless Assistant with Reinforcement Learning from Human Feedback, 2022。使用人工 preference 数据训练 Helpful and Harmless Assistant。
- Lee et al., RLAIF: Scaling Reinforcement Learning from Human Feedback, 2023。实验中讨论了 preference 数据和评估中的长度偏差问题。
- Chowdhury et al., Provably Robust DPO: Aligning Language Models with Noisy Feedback, 2024。分析 Preference Label Noise 对 DPO 的影响。
- Xiao et al., Finding the Sweet Spot: Preference Data Construction for Scaling Preference Optimization, 2025。研究不同 chosen/rejected reward gap 的数据构造方式,并表明简单使用最高分与最低分样本组成 pair 并不总是最佳方案。