14. 误差分析(Error Analysis)与灾难性遗忘
很多人训练模型时习惯:
训练
→ 看分数
→ 继续训练
但优秀的大模型团队真正的工作流程是:
评估
→ 发现错误
→ 分析错误
→ 修复问题
→ 重新训练
实际上:
误差分析(Error Analysis)往往比训练本身更重要。
因为训练只能告诉你模型变好了还是变坏了,
而误差分析告诉你:
模型为什么出错。
为什么误差分析重要
假设:
数学正确率
80%
→
85%
虽然提高了。
但是:
到底是哪20%的题目错了?
你并不知道。
因此:
指标只能告诉你结果,误差分析才能告诉你原因。
误差分析流程
graph TD A[模型评估] --> B[收集失败样本] B --> C[人工分析错误] C --> D[错误聚类] D --> E[发现共性问题] E --> F[提出修复方案] F --> G[重新训练] G --> H[重新评估] H --> A
这是一个持续迭代的闭环。
一个真实的误差分析例子
问题:
23 ÷ 13 等于多少?
模型回答:
步骤1...
步骤2...
2.47
步骤3...
最终答案:2.47
正确答案:
23 ÷ 13 ≈ 1.769
显然错误。
第一反应通常是错误的
很多人会立即得出结论:
模型不会除法
但事实上:
这可能完全不是数学能力的问题。
进一步测试
测试1:
23 ÷ 13 等于多少?
错误。
测试2:
23 ÷ 13
正确。
测试3:
计算 23 ÷ 13
正确。
测试4:
请问23÷13等于多少?
错误。
此时发现:
问题可能和除法本身无关。
而与:
自然语言表达
有关。
真正的问题
模型可能在:
等于多少?
这种表达方式下,
激活了错误的推理模式。
或者:
步骤推理
和
最终答案
发生了混淆。
为什么需要错误聚类
如果只有:
1个错误
无法发现规律。
但如果有:
10000个错误
就需要自动分析。
Error Clustering(错误聚类)
核心思想:
相似错误通常来源于相同原因。
例如:
错误样本:
23 ÷ 13 等于多少?
我有23个苹果分给5个人怎么分?
100除以17是多少?
10个橘子分给3个人怎么办?
这些错误可能属于:
数学推理错误
同一个簇(Cluster)。
错误聚类流程
graph TD A[失败样本] --> B[Embedding Model] B --> C1[问题向量1] B --> C2[问题向量2] B --> C3[问题向量3] C1 --> D[Similarity计算] C2 --> D C3 --> D D --> E[K-Means聚类] E --> F1[数学推理错误] E --> F2[工具调用错误] E --> F3[幻觉错误] E --> F4[指令遵循错误]
Embedding 在误差分析中的作用
Embedding Model 会把文本变成向量:
Question
↓
Embedding
↓
1536维向量
例如:
23÷13等于多少
变成:
[0.1,0.4,0.7,...]
Similarity(相似度)
常见方法:
Cosine Similarity
计算:
两个向量夹角
结果:
接近1
→ 非常相似
接近0
→ 不相似
K-Means 聚类
工业界常用:
K-Means
步骤:
graph LR A[错误样本] --> B[Embedding] B --> C[向量空间] C --> D[K-Means] D --> E[Cluster1] D --> F[Cluster2] D --> G[Cluster3]
sklearn 示例
from sklearn.cluster import KMeans
kmeans = KMeans(
n_clusters=10,
random_state=42
)
labels = kmeans.fit_predict(
embeddings
)
输出:
Cluster 0
数学错误
Cluster 1
工具调用错误
Cluster 2
代码错误
使用 LLM 做错误分类
现代团队越来越多使用:
LLM as Judge
让另一个模型帮助分析错误。
Prompt示例
请分析下面错误属于哪一类:
问题:
...
模型回答:
...
分类:
1. Factuality
2. Hallucination
3. Reasoning
4. Instruction Following
5. Tool Use Error
6. Under Refusal
常见错误分类
| 类型 | 说明 |
|---|---|
| Factuality | 事实错误 |
| Hallucination | 幻觉 |
| Reasoning | 推理错误 |
| Instruction Following | 指令未遵循 |
| Tool Use Error | 工具调用错误 |
| Formatting Error | 格式错误 |
| Under Refusal | 应拒绝但未拒绝 |
| Over Refusal | 过度拒绝 |
从错误到修复
发现错误后:
需要提出假设。
例如:
数学错误很多
假设:
缺少长链推理数据
修复:
增加CoT数据
增加数学RL
增加Verifier
然后再次训练。
Error Analysis 实际闭环
graph TD A[发现错误] --> B[聚类分析] B --> C[提出假设] C --> D[设计修复方案] D --> E[训练模型] E --> F[重新评估] F --> G[验证假设] G --> A
灾难性遗忘(Catastrophic Forgetting)
微调中另一个常见问题:
Catastrophic Forgetting
什么是灾难性遗忘
例如:
原模型:
会数学
会代码
会写作
会翻译
只用代码数据微调:
代码能力 ↑
但:
翻译能力 ↓
数学能力 ↓
模型忘记了原来的知识。
这就是:
灾难性遗忘。
为什么会发生
因为微调阶段:
梯度持续朝同一个方向更新
导致:
旧知识被覆盖
灾难遗忘示意图
graph LR A[预训练知识] --> B[代码微调] B --> C[代码能力提升] B --> D[部分能力下降]
如何缓解灾难遗忘
方法1:混入预训练数据
最经典的方法:
训练时加入少量通用数据。
例如:
99%
代码数据
1%
通用预训练数据
很多论文发现:
1%~5%
往往已经有效。
方法2:多任务训练
同时训练:
数学
代码
对话
翻译
避免模型只看到一种数据。
方法3:参数高效微调
例如:
- LoRA
- QLoRA
因为:
原模型参数被冻结
遗忘会明显减少。
Error Analysis Flow 总结
graph TD A[Review Failures] --> B[Cluster Errors] B --> C[Develop Hypotheses] C --> D[Implement Fixes] D --> E[Run Experiments] E --> F[Evaluate] F --> A
一句话总结
训练决定模型参数,评估决定模型方向,而误差分析决定下一步应该修复什么。
优秀的大模型团队通常不会直接增加数据或继续训练,而是先通过 Error Analysis 找到错误模式,再针对性地修改数据、奖励模型或训练策略。