为什么评估很重要?——没有尺子的裁缝
没有评估 = 没有方向。就像裁缝没有尺子,无法知道衣服是否合身。训练模型时,如果没有科学的评估方法,你不知道模型是在进步还是在退步。
评估的三个维度:
1. 能力评估:模型能做什么?(问答、翻译、代码、推理)
2. 安全评估:模型不应该做什么?(生成有害内容、泄露隐私、产生偏见)
3. 效率评估:模型的成本如何?(推理速度、内存占用、能耗)
常见评估指标:
| 指标 | 衡量什么 | 适用场景 | 优缺点 |
|---|---|---|---|
| Perplexity | 模型预测能力 | 预训练、语言建模 | 客观但只看概率,不评估质量 |
| BLEU | 生成文本与参考的匹配度 | 机器翻译、文本生成 | 快速自动评估,但不考虑语义 |
| ROUGE | 摘要与参考的重叠度 | 文本摘要 | 类似BLEU,关注召回率 |
| HumanEval | 代码生成正确率 | 代码能力 | 直接测试功能性,最真实 |
| MMLU | 多学科知识 | 通用知识 | 57个学科,全面但只是选择题 |
Perplexity:模型的“困惑程度”
<p><b>Perplexity(PPL)是衡量语言模型预测能力的核心指标。</b></p><p><b>公式:</b></p><pre>PPL = exp( -(1/N) * Σ log P(wᵢ | w₁...wᵢ₋₁) ) = exp(L) 其中:L = 平均交叉熵损失 N = 词的总数</pre><p><b>直观理解:</b>PPL = 模型每次预测下一个词时,面临的等效选择数量。PPL=100意味着模型每次预测时,相当于从100个等概率词中猜。PPL=10意味着从10个词中猜。PPL越低越好。</p><p><b>类比:猜拳游戏。</b>如果我能100%猜中你出什么,PPL=1(没有选择)。如果我只能猜中10%,PPL=10(10个等概率选择)。如果完全随机猜,PPL=词汇表大小(几万个)。</p><p><b>数值例子:</b></p><pre>GPT-2 (1.5B参数): PPL ≈ 18.3 (WebText测试集) GPT-3 (175B参数): PPL ≈ 12.0 GPT-4 (估计): PPL ≈ 8~10 人类水平: PPL ≈ 5~8 (估计)</pre><p><b>PPL的局限性:</b>PPL只衡量预测能力,不衡量生成质量、安全性、有用性。一个PPL很低的模型可能生成有害内容或胡说八道。</p><p><b>参数说明:</b></p><table border="1"><tr><th>参数</th><th>含义</th><th>典型值</th><th>太大/太小</th></tr><tr><td>PPL</td><td>困惑度</td><td>8~20 (越好越小)</td><td>太大→预测能力差;太小→可能过拟合</td></tr><tr><td>测试集</td><td>评估用的数据</td><td>与训练集不同分布</td><td>同分布→过拟合;差距太大→评估不准</td></tr></table>
HumanEval与MMLU:直接测试能力
HumanEval:代码能力的终极测试。OpenAI 2021年发布。包含164个编程问题,每个问题有函数签名、文档字符串和若干测试用例。模型需要补全函数体,让测试用例全部通过。
HumanEval例子:
def has_close_elements(numbers: List[float], threshold: float) -> bool:
""" Check if in given list of numbers, any two numbers are closer than given threshold."""
# 模型需要补全这里
pass
# 测试用例:
assert has_close_elements([1.0, 2.0, 3.0], 0.5) == False
assert has_close_elements([1.0, 2.0, 2.5], 0.6) == True
assert has_close_elements([1.0, 2.0, 2.4], 0.5) == True
assert has_close_elements([1.0, 2.0, 2.3], 0.3) == False
assert has_close_elements([1.0, 2.0, 2.2], 0.2) == True
# 正确补全:
for i in range(len(numbers)):
for j in range(i+1, len(numbers)):
if abs(numbers[i]-numbers[j]) < threshold:
return True
return FalseHumanEval分数:
GPT-3.5: 48.1% GPT-4: 67.0% GPT-4o: 90.2% Claude 3.5 Sonnet: 92.0% 人类程序员: ~80-95%
MMLU(Massive Multitask Language Understanding):加州大学伯克利分校发布。包含57个学科(数学、物理、化学、生物、历史、法律、计算机等),每个学科有多个选择题。测试模型的通用知识。
MMLU分数:
GPT-3: 43.9% GPT-3.5: 70.0% GPT-4: 86.4% 人类专家: 89.8% Claude 3 Opus: 86.8%
其他重要基准:
| 基准 | 测试什么 | 代表模型分数 |
|---|---|---|
| GSM8K | 小学数学推理 | GPT-4: 92.0% |
| HellaSwag | 常识推理 | GPT-4: 95.3% |
| TruthfulQA | 回答真实性 | GPT-4: 60.0% (仍有提升空间) |
| BBH | 复杂推理 | GPT-4: 83.1% |
例子:计算BLEU分数
场景:机器翻译任务。参考翻译(人类翻译)和机器翻译结果如下。
参考翻译:The cat is on the mat.
机器翻译A:The cat is on the mat. (完美匹配)
机器翻译B:There is a cat on the mat. (语义相同,用词不同)
机器翻译C:The dog is under the table. (完全错误)
BLEU计算(简化版,只看1-gram):
参考的1-gram:The, cat, is, on, the, mat (6个) 机器翻译A的1-gram:The, cat, is, on, the, mat (6个,全部匹配) 机器翻译B的1-gram:There, is, a, cat, on, the, mat (7个,匹配:is, cat, on, the, mat = 5个) 机器翻译C的1-gram:The, dog, is, under, the, table (6个,匹配:The, is, the = 3个) BLEU-A = 6/6 = 1.0 (100%) BLEU-B = 5/7 ≈ 0.71 (71%) BLEU-C = 3/6 = 0.5 (50%) 加上长度惩罚(防止生成短句): 翻译A长度=6,参考长度=6,惩罚=1.0 翻译B长度=7,参考长度=6,惩罚≈0.95 翻译C长度=6,参考长度=6,惩罚=1.0 最终BLEU: A: 1.0 * 1.0 = 1.0 B: 0.71 * 0.95 ≈ 0.67 C: 0.5 * 1.0 = 0.5
结论:BLEU-A最高(完美匹配),BLEU-B次之(语义正确但用词不同),BLEU-C最差(完全错误)。但注意:BLEU-B的语义其实和A一样,只是BLEU没考虑语义,只看词匹配。
练习:LLM评估
Q1:PPL=20和PPL=5,哪个模型更好?如果PPL=1呢?
Q2:BLEU分数高是否一定代表翻译质量好?为什么?
Q3:HumanEval测试模型的什么能力?为什么它比PPL更能反映实际能力?
Q4:MMLU包含57个学科,为什么用选择题而不是开放题?
Q5:如果一个模型PPL很低但TruthfulQA分数也很低,说明什么问题?
查看答案
A1:PPL=5更好。PPL越低表示模型预测能力越强。PPL=1意味着模型能100%预测正确(不可能,因为语言有歧义)。PPL=1可能是过拟合或测试集泄露。
A2:不一定。BLEU只看词匹配,不考虑语义。例如“There is a cat on the mat”和“The cat is on the mat”语义相同,但BLEU可能不高。BLEU还受参考翻译数量影响(参考越多,BLEU越可靠)。
A3:HumanEval测试代码生成能力。它直接运行测试用例,看代码是否能正确执行。PPL只衡量语言预测能力,一个PPL很低的模型可能完全不会写代码。HumanEval是功能性测试,最贴近实际应用。
A4:选择题便于自动评估。开放题需要人工评判,成本高、主观性强、难以复现。选择题可以标准化评估,但局限性是只测试知识记忆,不测试创造性思维。
A5:说明模型虽然预测能力强(PPL低),但可能生成不真实的内容(幻觉)。TruthfulQA低表示模型经常编造事实、错误信息。这揭示了仅优化PPL的局限性——模型需要同时优化真实性和有用性。