5.10 NLP评估 困惑度、BLEU与ROUGE
1.分类好打分:生成任务却难评
说起来,前面那些章节我们谈训练、谈调参、谈稳定性,多半默认有一份明确的对错摆在那里,模型预测对了得分,预测错了扣分。这种思路用在分类任务上特别顺手,比方说识别一张图里是猫还是狗,判断一封邮件是正常邮件还是垃圾邮件,答案就那么几个类别,用一个简单的准确率或者F1就能交代清楚。
可一到生成式任务,事情就棘手了。所谓生成式任务,说的是让模型自己写出一段自然语言文本,常见的有机器翻译(把一句中文翻成英文)、文本摘要(把一篇长文章压成几句关键话),还有后来大热的对话和问答。这些任务的输出是开放文本,同一句话的合理解释往往有好多种。小明做翻译时写下(今天天气真好),小红写下(今日天气不错),两个都对,意思也都到位,可要是只拿字面是否完全一致来打分,这两份不错的译文都会被一律判作全错。
这就是为什么NLP(自然语言处理)评估得专门拎出来讲一章。模型越做越大,越做越会说话,评估要是跟不上,我们就根本判断不出哪一种方法真的更好,训练也就失去了方向感。说穿了,5.1 节里聊预训练语言模型时,这个问题就已经埋下了,那时候大家把模型训出来,却发现很难用一个简单的数字说清楚它到底好不好,所以才催生了一整套专门的评估指标。这一章我们挑三个最经典的来谈,分别是困惑度、BLEU和ROUGE。
2.困惑度:模型对一段文本有多惊讶
我们先讲困惑度,英文Perplexity,习惯上简写成PPL。这个指标只用来评语言模型本身,不评下游任务,是讲语言模型时最常被搬出来的一个数。
要理解困惑度,不妨先回想一下1.4 节里讲概率信息论时提过的交叉熵和似然。语言模型做的事情,是给定一段文本,去算每一个词在它前面那些词的条件下出现的概率。比方说句子里前面几个词连起来是(今天天气真),那么下一个词是(好)的概率就应该挺高,是(鸭)的概率就该很低。我们把一段文本 记作 ,其中 是这段文本里词的总数, 表示第 个词, 是词的位置编号。模型给这段文本算出的平均负对数似然就是:
这里 就是平均负对数似然,它本质上也就是1.4 节里说的交叉熵。 是自然对数, 是连加符号,意思是从第 个词到第 个词逐个累加。 表示在前面那些词已经出现的条件下,第 个词出现的概率,竖线 读作给定。这个 衡量的是模型对这段文本有多意外, 越小,说明模型越能把每个词都预测得八九不离十。
困惑度PPL就建立在 之上,它定义为:
其中 表示以自然常数 为底的指数函数, 表示困惑度的值。直观上,困惑度可以理解成模型在每个位置上平均要纠结几个候选词。PPL越低,说明模型越胸有成竹,每个词几乎都能猜准。PPL越高,则说明模型在每个词面前都拿不准,仿佛在一堆候选里乱猜。
打个比方,我有个朋友是位话剧演员,背台词这件事对她来说几乎是肌肉记忆,整场戏每一句接什么字,她张口就来,毫不犹豫,这种笃定就像PPL很低的语言模型。反过来让我们这种没背过词的人上台,每一句都得在心里盘算半天下一个字该是什么,盘算的候选越多,困惑度就越高。
关于PPL,有几点要专门提醒一下。第一,PPL只在同一个词表、同一份数据上才有比较意义,换一份语料、换一种分词方式(比如BPE或者WordPiece),PPL就没法直接横着比了。第二,PPL只评语言模型预测下一个词的能力,它不直接反映翻译或者摘要的好坏。一个PPL很低的模型,写出来的摘要可能照样答非所问。所以PPL一般用来监控预训练阶段的进展,到了下游任务,还得另请别的指标。
3.BLEU:看译文里有多少词组来自参考译文
困惑度讲完了,我们再看专门给机器翻译用的BLEU(bilingual evaluation understudy,双语评估替代)。这个指标最早是IBM那帮人在2002年提出来的,思路说起来很朴素,就是看模型翻译出来的句子里,有多少片段能在参考译文里找得到。
BLEU的核心是n-gram的精确率 , 表示n-gram的精确率,下标 表示片段长度。所谓n-gram,就是连续 个词组成的片段。比方说(今天天气真好)这六个字,1-gram就是每个单字,2-gram就是(今天)(天天)(天气)(气真)(真好)这种相邻两字组成的片段。 的算法是拿模型译文里能对上参考译文的n-gram个数(做过截断修正),除以模型译文里所有n-gram的总数。BLEU通常会算 从 到 时的四个精确率。
这里分子要做一个修正,叫截断计数。为什么要截断呢,因为模型可能反复输出同一个高频词来凑数。比方说参考译文里某个词出现了两次,模型却一连输出十个一样的词,要是不做限制,分子就特别高,指标就被钻了空子。截断的做法是,模型译文里每个n-gram的出现次数,最多只算到它在参考译文里出现的次数为止,多出来的部分一律不算分。
把 到 这几个精确率取几何平均,再乘上一项简短惩罚 (brevity penalty),就得到最终的BLEU:
其中 表示简短惩罚系数, 仍是以 为底的指数函数, 是给四个精确率各分配相等的权重。为什么要加简短惩罚呢,因为模型要是只输出短短几个词,每个词都恰好出现在参考译文里, 就能逼近 ,可这种翻译显然没法交差。简短惩罚的定义是这样的:
这里 表示模型译文的长度(按词数计), 表示参考译文的长度。当 时 ,不惩罚。当 时 会小于 ,把分数往下压,越短压得越狠。
BLEU的取值范围是 ,越接近 说明译文和参考译文越贴合。BLEU有点像一个拿着红笔的语文老师,专门把你作文里和范文对得上的词组都圈出来,圈得多分就高,你要是偷懒只写两句,他就给你扣分。BLEU的好处是完全自动,跑一次脚本就出分,特别适合在迭代过程中频繁地比较模型。它的局限我们留到最后一节再细说。
4.ROUGE:看摘要覆盖了多少参考里的要点
BLEU站在精确率那一侧,关心的是模型输出的内容有多少是有据可查的。可摘要任务偏偏是另一回事,一篇长文章压缩成几句话,要是漏掉了关键信息,那才是最要命的,至于多了一点点无关紧要的修饰,反而没那么严重。所以摘要任务的指标ROUGE(recall-oriented understudy for gisting evaluation,面向召回的摘要评估替代)就把重点放在召回率上。
ROUGE-N是ROUGE家族里最基础的一个,它算的是n-gram的召回率。算法是拿参考摘要里被模型摘要覆盖到的n-gram个数,除以参考摘要里所有n-gram的总数。和BLEU不一样,ROUGE的分母是参考摘要那一边的,所以它衡量的是参考摘要里的关键内容有多少被覆盖到了。
除此之外,还有一个常用的变体叫ROUGE-L,名字里的 表示最长公共子序列(longest common subsequence)。所谓最长公共子序列,是不要求连续、只要求先后顺序一致的最长共有片段。比方说参考摘要写(小明去公园散步遇到了小红),模型摘要写成(小明散步时见到小红),两句话的共同子序列里最长的一条,可以是(小明)(散步)(小红)这三个词按原顺序串起来,中间跳过的词不计较。ROUGE-L就用这种最长公共子序列的长度算一个综合了召回和精确的F值(也就是召回和精确的调和平均)。ROUGE-L的好处是不再死板地盯连续片段,能容许模型换一种语序来表达,比单纯的ROUGE-N灵活一些。
ROUGE呢,像一个细心的导师在审你的论文摘要,重点看你有没有把原文里的核心发现都点到,至于你写得啰嗦还是简洁,他倒是没那么计较。这种思路和BLEU恰好互补,所以翻译任务通常报BLEU,摘要任务通常报ROUGE,两边的评估哲学各自贴合了任务本身的特点。
5.自动指标的局限:字面重合不等于语义正确
聊到这里,三个指标都过了一遍,乍看好像什么都能量化了。其实远没那么乐观。
先说一个最直接的问题,困惑度、BLEU、ROUGE都是从字面去数重合的,它们看不懂语义。举个常见的例子,参考译文是(这只猫在睡觉),模型翻译成(这只猫没有在睡觉),只差一个(没)字,字面n-gram几乎全对得上,BLEU分数会很高,可意思恰好反了。字面重合度高的句子,意思完全可以南辕北辙。
再说事实性这一关。这两年大模型最让人头疼的就是胡编乱造,行话叫幻觉(hallucination)。模型可能把一个不存在的人物编得煞有介事,把一件事的时间地点全搞错,可这些错误在BLEU和ROUGE眼里完全看不出来,只要字面对得上就给分。我之前看过一本讲人工智能历史的书,里面提到早期有个对话系统被问法国的首都是什么,它答(法国的首都是柏林),按字面看和参考答案(法国的首都是巴黎)重合度极高,只差最后两个字,可这答案是彻头彻尾错的。自动指标面对这种情况,几乎束手无策。
再有就是答案本身的多样性。同一句话可以有十种合情合理的表达,自动指标只盯一份参考译文或者参考摘要,对那些字面不同但意思到位的输出毫不留情。这就像用一把固定的尺子去量形状各异的石头,怎么量都不准。
正是因为这些局限,重要场合还得靠人工评估。找几位懂行的人,按一份预先定好的标准(比如流畅度、相关性、事实性)给模型输出打分,再算一下评分彼此之间的一致性,这样得到的结论才靠谱。5.5 节里聊RLHF(基于人类反馈的强化学习)的时候,我们就提到过,现代大模型之所以能写得这么合人心意,背后就是靠大量的人工标注把人类偏好一点一点教给模型。说穿了,自动指标负责大规模、低成本地初筛,人工评估负责在小批量上把好关,两者搭配才是一个相对完整的评估方案。
练习
Q1. 困惑度(PPL)定义为 ,其中 是平均负对数似然。直观上PPL代表什么?为什么不同模型/不同词表之间不能直接横着比?
直观上PPL可以理解成模型在每个位置上平均要"纠结"几个候选词——PPL越低说明模型越胸有成竹、几乎每个词都能猜准,PPL越高说明在每个词面前都拿不准、像在一堆候选里乱猜。不能直接横比的原因:PPL只在同一个词表、同一份数据上才有比较意义,换一份语料、换一种分词方式(比如BPE和WordPiece不同),词表大小和切分粒度都变了,PPL的数值就没法直接比较了。
Q2. BLEU为什么要加"简短惩罚"(brevity penalty, BP)?如果模型译文长度 小于参考译文长度 ,BP怎么算?
因为模型如果只输出短短几个词、每个词都恰好出现在参考译文里,n-gram精确率 就能逼近1,可这种偷懒翻译显然没法交差,所以要加BP把分数往下压。当 (模型译文比参考短)时,,是个小于1的数,越短压得越狠;当 (模型译文比参考长)时 ,不惩罚。最终 。
Q3. 易错点:参考译文是"这只猫在睡觉",模型翻译成"这只猫没有在睡觉",只差一个字,BLEU分数会很高,能说明翻译质量好吗?
不能,这是自动指标的根本局限——它们只从字面数重合,看不懂语义。只差一个"没"字,字面n-gram几乎全对得上,BLEU分数会很高,可意思恰好反了(睡觉 vs 没睡觉),字面重合度高但语义南辕北辙。再比如"法国的首都是柏林"和"法国的首都是巴黎"也几乎全重合,可答案彻头彻尾错。自动指标面对事实性错误几乎束手无策,所以重要场合还得靠人工评估(按流畅度、相关性、事实性打分),自动指标只负责大规模低成本初筛。