摘要: NLP重要评价准则之一——BLEU,真的完美无缺么?
刚接触自然语言处理的朋友通常会问我:当系统的输出是文本,而非对输入文本进行某种分类,如何对该系统进行评估。当模型的输入是文本信息,输出也是文本信息时,我们称之为序列到序列问题,也可称为字符串转换问题。
序列到序列建模是解决NLP中较难任务的核心,它包括:
1、 自动文摘(Text Summarization);
2、 文本简化(Text simplification);
3、 问答(Question answering);
4、 聊天机器人(Chatbots);
5、 机器翻译(Machine translation);
理解序列到序列建模问题相对容易,如何对其进行评价才是难点。
对于刚入门NLP的人来说,选取衡量标准较为困难。目前最流行的评价指标之一BLEU虽然常用,但也存在较大的缺陷。
本文将介绍BELU的工作原理,指出其存在的问题,并探索如何结合自己的工作最大程度规避这些问题。
一个难题
BELU最初是评价机器翻译的指标,所以我们会以翻译(法语—英语)为例进行讲解。
J’ai mangé trois filberts.
下面两句为英语参考译文:
I have eaten three hazelnuts.
I ate three filberts.
假设下面的翻译是由我们训练的神经网络产生。
I ate three hazelnuts.
问题来了:如何给上述翻译结果打分。
要想利用机器学习来建立一个翻译系统,就需要一个实值分数来对其性能进行衡量。如果我们能够获取潜在的最佳得分,便能够计算它与实际值之间的误差。这能够在训练时为系统提供反馈,通过最小实际分数与潜在分数之间的差值来改进翻译模型,并通过查看同一任务上训练过的系统得分比较不同的模型。
假设:如果输出句子中的单词在任何一个参考句出现,就给它打1分,如果没有出现,打0分。为了使计数标准化,使分数始终介于0和1之间。我们可以将某个参考译文中出现的单词总数除以输出句子中的单词总数。我们称该方法为unigram precision。
在上面的翻译示例中,“I ate three hazelnuts”,我们能够在输出句子中看到至少一个参考句中的单词,再除以单词数4,该翻译的最终得分为1。但如果换成了下面的句子,该如何打分呢?
Three three three three.
按照刚才的衡量标准,得分依旧为1。但很明显,“I ate three hazelnuts”比“Three three three three”翻译得好。但如何将这一点告知我们正在训练的系统呢?
你可以通过限定单词出现在翻译句子中的最大次数来调整分数。经过调整,“I ate three hazelnuts”计算出的得分仍然为1,而“Three three three three”为0.25。
这解决了单词简单重复的问题,但新问题来了,如果单词的排列是无序的呢?就像下面:
Ate hazelnuts I three
如果继续用刚才的方法,这个句子得分为1。通过计数可以解决这个问题,但此时并非统计单个单词,而是相邻的单词。该方法称为n-grams,n是每组单词的数量,unigrams,bigrams,trigrams以及4-grams分别由一个、两个、三个、四个单词组成。
在这个例子中,我们使用bigrams。通常来讲,BLEU的分数是unigram,bigram,trigram,4-grams的加权平均。为了简便,我们选择bigram,并忽略句子开头和结尾定义边界的单词。基于上述规则,句子排序如下:
[Ate hazelnuts]
[hazelnuts I]
[I three]
如果我们利用bigrams计算句子得分,“I ate three hazelnuts”是0分,“Three three three three”是0分,“I eat three hazelnuts”为1分,而下面这个例子也是0分:
I ate.
很明显这不是我们想要的。解决这个问题的方法是将目前的分数乘以一个简短惩罚因子。通过这个因子,得分高的候选翻译结果,能够同时在长度、词语选择、词语顺序等方面与参考句子匹配。
如果翻译结果比参考句子更长或者一样长,惩罚因子为1。
如果翻译译文长度比参考译文要短,就需要一个惩罚的机制去控制。在示例“I ate”中,句子长度为2个单词,与其最接近的参考句长度为4个单词。其简洁惩罚为0.36,乘以bigram的精度分数1,最终得分降至0.36。
该指标旨在探测输出翻译与参考语句中有多少个n-grams重叠,并乘以简洁惩罚值后输出得分。BLEU由Kishore Papineni, Salim Roukos, Todd Ward, and Wei-Jing Zhu于2002年提出,是NLP中非常流行的度量指标,特别是对于系统输出是文本信息而不是分类的任务,其中包括机器翻译和自然语言生成。它解决了我们在文章开头提出的问题:找到一种方法,告诉我们翻译结果有多“好”,并为其打分。
BLEU存在的问题
在此之前,先概括一下BLEU的优势:
1、它方便,快速,容易计算,结果比较接近人类评分;
2、在相同的任务中,能够很容易地将模型与基准进行比较;
但这些便利使得人们过度的使用它,即使在它不是最佳度量标准的任务中也作为了首选。
尽管我们只以一句话为例进行了介绍,但BLEU是一种语料库级别的度量标准。计算语料库中的每个句子的BLEU分数,然后求它们的平均值会使得分数过大。
BLEU的问题主要有以下四点:
1、 不考虑意义;
2、 不直接考虑句子结构
3、 不能很好地处理形态丰富的语言
4、 不能很好的映射到人类判断
BLEU不考虑意义
由于BLEU不考虑意义,我们便不能只使用它对机器翻译进行评估。作为一名机器翻译软件的用户,我更希望准确理解原文的含义,即使翻译的句子中在语法或句法上有所欠缺,只要清楚的表达了原文的意义也能接受。
但BLEU并不考虑意义,它只奖励精确匹配的n-grams。这意味着一个虚词(如“an”或“on”)的差异和一个更重要的与内容相关的词语受到的惩罚是一样的。如果一个译文中有一个完全有效的同义词,只是没有出现在参考译文中,也会受到惩罚,但这并不合理。
以下列句子为例对这个问题进行分析:
Original (French): J’ai mangé la pomme.
Reference translation: I ate the apple.
下列的句子都是BLEU评出的 “糟糕的翻译”:
I consumed the apple.
I ate an apple.
I ate the potato.
但作为机器翻译的使用者,我觉得前面两句也表达清楚了原文的意思,即使它们和参考译文有所出入。第三句话让人不能接受,它完全改变了原文的意思。
NIST方法是在BLEU方法上的一种改进。最主要的是引入了每个n-gram的信息量(information)的概念。BLEU算法只是单纯的将n-gram的数目加起来,而NIST是在得到信息量累加起来再除以整个译文的n-gram片段数目。这样相当于对于一些出现少的重点的词权重就给的大了。因此,在更常见的n-gram(如“of”)上的不匹配将受到更小的惩罚,而在更罕见的n-gram(如“buffalo buffalo”)上的不匹配将受到更大的惩罚。虽然这解决了赋予虚词过多权重的问题,但实际上却使惩罚同义词(如“ambled”代替“walked”)的问题变得更糟,因为这些同义词只出现在更少见的n-gram中,因此惩罚因子会更大。
BLEU不直接考虑句子结构
即使你通过调整词序改变句子的结构,仍然可以获得很高的BLEU分数。
句法是对句子结构的研究,以词作为基本单位,并且各单词按照一定顺序排列。“I saw the dog with the telescope”一句,即能表示“I was using the telescope to look at the dog”,也可以说“the dog had the telescope”。二者的区别通过句子中各单词的排列顺序体现。
在自然语言中,句子的内部结构特别重要,将句子各单词顺序打乱,既破坏了其完整含义,又让人难以理解。
通过parsing可解决该问题。但parsing的计算相当密集,每次求值时必须解析所有输出,增加了开销。
但不考虑句法结构,词序混乱的翻译与意思连贯的翻译获得相同的分数显得极其不合理。
Callison-Burch等人在2006年对此进行了说明:
Orejuela appeared calm as he was led to the American www.fengshen157.com/ plane which will take him to Miami, Florida.
Orejuela appeared calm while being escorted to the plane that would take him to Miami, Florida.
Orejuela appeared calm as he was being led to the American plane that was to carry him to Miami in Florida.
Orejuela seemed quite calm as he was being led to the American plane that would take him to Miami in Florida.
翻译如下:
Appeared calm when he was taken to the American plane, which will to Miami, Florida.
这个翻译并不完美,它删除了人名,且句子后半段“will”后面没有动词,但它并非一点意义没有,毕竟比下面的翻译好,虽然两句话获得的BLEU分数相同:
which will he was, when taken appeared calm to the American plane to Miami, Florida.
BELU不能很好地处理形态丰富的语言
BELU基于单词级别进行匹配,对于形态丰富的语言,显得并不适用。
语素是语言中最小的音义结合体,它们组合在一起构成单词。以英语单词“cats”中的“s”为例,它告诉我们不止一只猫。有些语言,如土耳其语,在一个单词中有很多的语素,而英语,通常每个单词中的语素很少。
以秘鲁语句为例:
Jawen jemara ani iki.
Jawen jemaronki ani iki.
两句话都是可接受的英语“her village is large”的翻译。其中,以“jemar-”开头的单词在两个句子中有不同的结尾。不同的结尾代表不同的词素,这句话表明说话人很确定这个村子很大。上面那句话是他们去过那里见到了很大的村子,而下面那句话则表示他们是从别人那听说村子很大。
这种特殊类型的语素被称为“证据标记(evidentiality marker)”,这在英语中不存在,而在秘鲁语中,一个句子的语法需要二者中的一个,所以我们的参考译文也应该有其中的一个。但是,如果我们没有在参考句中准确地找到该单词,就会对它进行惩罚,即使这两个句子都很好的表达了英语原句的意思。
public class Topic
{
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public DateTime CreateTime { get; set; }
public ICollection<Post> Posts { get; set; }
}
public class Post
{
public int Id { get; set; }
public int TopicId { get; set; }
public string Content { get; set; }
public DateTime CreateTime { get; set; }
public Topic Topic { get; set; }
}
1.4 编写上下文对象
public class MySqlForumContext : DbContext
{
public MySqlForumContext(DbContextOptions<MySqlForumContext> options) www.078881.cn: base(options) { }
public DbSet<Topic>www.gcyL157.com Topics { get; set; }
public DbSet<Post>www.mingheyl178.com/ Posts { get; set; }
}
该上下文对象非常简单,只是声明了一个 MySqlForumContext 对象,然后继承自 DbContext ,并将 Topic 和 Post 实体对象映射到该上下文中,这个使用方式和之前的文章中连接 MSSQL 数据库的使用方式是完全一致的,这点非常难得,通过 EFCore,无论你连接到的是哪种类型的数据库,其 API 的使用方式几乎是没有什么不同的,可以让开发人员平滑的过渡。
1.5 在 appsetting.json 中配置数据库连接字符串
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"Mysql.Forum": "server=127.0.0.1;port=3406;uid=root;pwd=root;database=Forum;"
}
BELU不能很好的映射到人类判断
构建机器翻译,聊天机器人以及问答系统最终的目的是希望人们能够使用它们。如果一个系统不能提供有效的输出,就没有意义。所以优化目的是使更多的人喜欢并尽可能多的使用所开发的系统。
BELU首次提出时,作者进行了相关的行为测试,以确保与人类的判断相关。但当研究人员进行更多的实验时,发现BELU分数并不能很好的映射到人类判断。在一些任务中,甚至其它的评价方法更接近人类判断。
Turian在2003年发现,BLEU在机器翻译中与人类判断的相关性最差,F1与人类判断最为相关,NIST次之。Sun在2010年比较了BLEU,GTM以及TER,发现BELU与人类判断的相关性最小。