智能单元
首发于智能单元
看图说话的AI小朋友——图像标注趣谈(上)

看图说话的AI小朋友——图像标注趣谈(上)

版权声明:本文智能单元首发,本人原创,禁止未授权转载。
前言:近来图像标注(Image Caption)问题的研究热度渐高。本文希望在把问题和研究介绍清楚的同时行文通俗有趣让非专业读者也能一窥其妙。文中还提出了开源构建一个基于守望先锋的中文图像标注数据集的构想,欢迎知友讨论参与。

内容列表:

  • 图像标注问题简介
    • 图像标注是什么
    • 当前水平
    • 价值和意义
  • 图像标注数据集
    • MSCOCO
    • Flickr8K和Flickr30K
    • PASCAL 1K
    • 创建一个守望先锋数据集
  • 图像标注评价标准
    • 人类判断与自动评价标准
    • Perplexity
    • BLEU
    • ROUGE
    • METEOR
    • CIDEr 注:上篇截止处
  • 图像标注模型发展
    • 百度的m-RNN
    • 谷歌的NIC
    • 斯坦福的NeuralTalk
    • 目前的State of art
    • 对几个模型的比较
  • 代码实践
    • CS231n的LSTM_Captioning
    • 基于Numpy的NerualTalk
  • 图像标注问题展望
    • 模型图像部分、语言部分和连接方式上的更新
    • 自动评价标注的更新
    • 数据集的更新
    • 小结

问题简介

图像标注问题其本质是视觉到语言(Visual-to-Language,即V2L)的问题,解释起来很简单,就是四个字:看图说话。就像老师要求小朋友们在看图说话作业中完成的任务一样,我们也希望算法能够根据图像给出能够描述图像内容的自然语言语句。然而这种对于人类实在是小事一桩的小儿科级任务,在计算机视觉领域却不能不说是一个挑战:因为图像标注问题需要在两种不同形式的信息(图像信息到文本信息)之间进行“翻译”。

随着深度学习领域的发展,一种将深度卷积神经网络(Deep Convolutional Neural Network)和循环神经网络(Recurrent Neural Network)结合起来的方法在图像标注问题上取得了显著的进步。由于该方法的成功,使得基于该方法的对图像标注问题研究迅速地火热起来,在2016年的IEEE国际计算机视觉与模式识别会议(即IEEE Conference on Computer Vision and Pattern Recognition,缩写为CVPR)上专门有一个小型会议(session)的主题就是图像标注。

然而在“人工智能领域取得进展”这个问题上,显然大众和专业研究者们敏感程度是大不相同的,吐槽如下图所示:

研究者:看我们根据图像生成了描述语句咯,不是以前的标签咯,厉不厉害?!~\(≧▽≦)/~

热心AI的大众→_→

暴雪:在“智能危机”结束之后,一群被放逐的智能机器人感受到了被其称为“灵魂觉醒”的升华之道。他们在冥思其存在本质和意义多年之后,渐渐相信他们不止是人工智能而已,和人类一样,他们也有灵魂。——摘自守望先锋官网英雄禅雅塔简介

热心AI的大众:和尚放大了!恁死对面的源氏!世界需要更多的英雄!

之所以有这种反差,是大众对于人工智能认识的起点,几乎是人工智能研究者奋斗的终极目标:)

回到图像标注问题,那么现在该领域最厉害的方法,到底达到了什么样的水平?我的看法是:貌似接近人类,其实差距尚大

为什么说貌似接近人类呢?这里引用几篇论文中表格:

上面这个表格来自于目前图像标注领域结果最好的论文:《What Value Do Explicit High Level Concepts Havein Vision to Language Problems?》,作者们来自澳大利亚Adelaide大学的计算机学院。上面表格是论文中作者们展示了自己的算法和其他算法在微软的COCO数据库的测试集上取得的测试结果。其中,5-Refs和40-Refs表示的是测试集中有两个数据集,一个数据集每张图像有5个参考标注(也就是人类输入的正确语句),一个数据集每张图像有40个参考标注。

B-N(N=1,2,3,4),M,R和CIDEr代表的是4中不同的对于算法的自动评价标准,后文会详细介绍,这里只需要知道得分越高越好。参与比较的有包含论文方法在内的4种图像标注算法和人类水平。可以看见在14个得分中,论文方法有13个得分都超过了人类得分

那么是不是论文方法就已经超越人类水平了呢?在我看来,答案是否定的。至于为什么,原因将在后文关于图像标注算法评价标准的小节中揭晓。

虽说我个人认为最高水平的算法也尚未超过人类表现,但是其进展是毋庸置疑的,各种算法已经能够让人类评价者觉得非常不错的图像标注了。比如在上表中提到的LRCN模型,就能根据图像生成这样的描述:

大家看了是不是觉得已经非常惊艳了?不要太激动,依旧存在一些惨不忍睹的:

这些错误的图像标注案例是来自斯坦福视觉实验室的论文《Deep Visual-Semantic Alignments for Generating Image Descriptions》,第一作者是Andrej Karpathy,学习了斯坦福深度学习课程CS231n 2016的同学对作为讲师的他应该很熟悉了。我们可以看见最右边的图像标注语句尤其离谱,“在路中间站着一匹马”,大兄弟,感情这马?是透明的咯?

图像标注问题如果能够得到很好的解决,那么价值是显而易见的,可以应用到图像检索,儿童教育和视力受损人士的生活辅助等方面。而从学术的角度来看,当前图像标注问题的研究,促使人工智能领域的两大领域,计算机视觉和自然语言处理很好地结合,这种跨子领域的结合能够催生出更让人惊艳的方法吗?我个人表示很期待。

图像标注数据集

到目前为止,深度学习依旧是一种需要大量数据来进行驱动的方法。小样本学习尚未有突破性的进展,所以数据对于基于深度学习的算法依旧非常重要。在图像标准问题研究的过程中,研究者们对于基准数据库的选择偏好也在发生变化,一些数据集运用的越来越广泛,而一些数据集则越来越少地被使用。本小节将基于图像标注问题,对这些数据集做简要的介绍和对比。

Microsoft COCO Caption数据集

Microsoft COCO Caption数据集的推出,是建立在Microsoft Common Objects in COntext (COCO)数据集的工作基础上的。在论文《Microsoft COCO Captions: Data Collection and Evaluation Server》中,作者们详细介绍了他们基于MS COCO数据集构建MS COCO Caption数据集的工作。

简要地来说,就是对于原COCO数据集中约330,000张图像,使用亚马逊公司的“土耳其机器人(Mechanical Turk)”服务,人工地为每张图像都生成了至少5句标注,标注语句总共超过了约150万句。至于亚马逊的“土耳其机器人”服务,其实也就是另一种形式的雇人拿钱干活而已。

实际上,COCO Caption数据集包含了两个数据集:

  • 第一个数据集是MS COCO c5。它包含的训练集、验证集合测试集图像和原始的MS COCO数据库是一致的,只不过每个图像都带有5个人工生成的标注语句。
  • 第二个数据集是MS COCO c40。它只包含5000张图片,而且这些图像是从MS COCO数据集的测试集中随机选出的。和c5不同的是,它的每张图像都有用40个人工生成的标注语句。

之所以要做MS COCO c40数据集,是因为如果有更多的参考标注语句,很多对于算法生成的标注的自动计算标准能够和人类判断有更高的相关性。下一步可能将MS COCO验证集中所有的图像都加上40个人工生成的标注语句。

作者们的另一个主要工作就是搭建了一个评价服务器,实现了当前最流行的评价标准(BLEU, METEOR, ROUGE and CIDEr)。使用MS COCO Caption数据集训练并用验证机调参后,研究者可以按照固定的JSON格式:

[{
"image_id":int,
"caption" :str,
}]

向服务器上传自己算法对于测试集图像生成的标注语句,服务器将自动地给出各种评价标准的得分。要上传结果,需要在CodaLab注册账号,且每个账号能够提交结果的次数是有限的。微软在Github上也提供了能够在本地对验证集数据生成标注进行评价的代码,地址在这里

简言之,MS COCO Caption数据集就是针对图像标注问题创建的,图像及其标注数量大,提供了现成的评价标准计算服务器和代码。就目前发表的高水平论文来看,MS COCO Caption数据集已经越来越成为研究者的首选。

Flickr8K和30K

Flickr8K和Flickr30K数据集的特性从它们的命名就能很方便地猜测出来:

  • 图像数据来源是雅虎的相册网站Flickr;
  • 数据集中图像的数量分别是8,000张和30,000张(确切地说是31,783);

这两个数据库中的图像大多展示的是人类在参与到某项活动中的情景。每张图像的对应人工标注依旧是5句话。这两个数据库本是同根生,所以其标注的语法比较类似。数据库也是按照标准的训练集、验证集合测试集来进行分块的。

相较于MS COCO Caption数据集,Flickr8K和Flickr30K数据集的明显劣势就在于其数据量不足。我个人“不乏恶意”地揣度:

微软:他们搞图像标注都用什么数据库呀?
员工:Flickr数据集居多吧
微软:数量多少呀?
员工:开始是8k,后来出了个30k,感觉够用了。
微软:搞个大新闻,让他们只有我们一个零头!做个330k的
员工:好的老板,是的老板,微软大法好!

在论文《Learning a Recurrent Visual Representation for Image Caption Generation》中作者指出:


We observed this fine- tuning strategy is particularly helpful for MS COCO, but does not give much performance gain on Flickr Datasets before it overfits. The Flickr datasets may not provide enough training data to avoid overfitting.

翻译:我们观察到这个精细调整策略在使用MS COCO数据集训练的时候效果很好,但是在Flickr数据集上算法却没有很明显的提升。可能是因为Flickr数据集没有提供足够多的数据来防止算法过拟合吧。

眼尖的知友会发现,上面这篇论文的作者中,有一位是微软的......于是我又忍不住“邪恶”脑洞一下:

员工:老板,论文发了!
微软:不错,黑得有水平,不留痕迹。
员工:那您看......
微软:好说好说。

以上虽然是玩笑话,但是数据量上的劣势,确实使Flickr数据集正逐渐失宠,14年论文中几乎都使用,现在一些高水平论文仅在补充文档中展示甚至不采用。个人还是希望Flickr数据集能够有一个比较好的更新,比如来个333k的?


PASCAL 1K

该数据集的图像是大名鼎鼎的PASCAL VOC challenge图像数据集的一个子集,对于其20个分类,随机选出了50张图像,共1,000张图像。然后同样适用亚马逊公司的土耳其机器人服务为每张图像人工标注了5个描述语句。一般说来,这个数据集只是用来测试的。

在其他论文中,还有一些诸如IAPR TC-12SBU等数据集,数据采集思路都大同小异,这里就不一一介绍了。

创建基于守望先锋的图像标注数据集?

标注:来自东方的戴眼镜的某组织领导者正在殴打来自东方某半岛的女性直播。

脑洞简言之:开源搭建一个简单的图像标注页面,接受玩家的游戏截图投稿和对图像的中文标注,当数据收集达到目标数量后,数据集对所有参与贡献的人开放。做这件事的价值有两点:

  • 目前为止,个人没有看到一个基于中文的公开图像标注数据集
  • 基于守望先锋的故事背景,能够吸引更多的年轻人从对游戏中人工智能的兴趣进而对真正的人工智能研究感兴趣

为啥我对守望先锋情有独钟,主要是游戏基于后人工智能危机时代的世界观设定和故事吸引。看着网易乐呵呵地说守望先锋的销量超过了暗黑破坏神3,那么守望的销量也该有300万了吧?基于这个庞大的玩家群体,如果这个数据集创建项目能够在玩家中有一定影响力,那么数据集的图像和标注数量应该比较客观。

当然,这只是我的一个小脑洞,欢迎认可这个脑洞的知友在评论中留言讨论!我个人是真心希望推动这个脑洞成真。对了,个人倾向于使用Ruby On Rails来搭建网站及后台。

图像标注评价标准

在简介中,提到虽然在多个评价标准的得分中,最新的方法的得分已经超过人类得分,但是我仍然不认为算法的真实水平超过人类,其原因就在于这些自动评价标准(automatic evaluation metric)上!

人类判断与自动评价标准

简而言之,算法根据图像生成出来的标注语句质量高不高?和图像内容是不是相符?语法上有没有错误?评价这些最靠谱最权威的还是咱们人类老爷!而各类的自动评价标准的目前都是尽量让自己的计算结果能够和人类判断结果相关

论文《Comparing Automatic Evaluation Measures for Image Description》关于这个问题就有很细致的分析。论文基于Flickr8K和E&K数据集,对BLEU、ROUGE、METEOR,TER几个评价标准与人类判断的相关性进行了研究,结果显示:

论文中指出:与人类判断的相关性co-efficient在0.0–0.1是不相关,0.11–0.4是弱相关,0.41–0.7是中等相关,0.71–0.90是强相关,如果在0.91–1.0那就很完美了。所以论文的结论是首先推荐METEOR,或者使用ROUGE SU-4和Smoothed BLEU。PS:由于CIDEr标准是2015发布,所以这篇论文中没有体现。

而在谷歌2015年的论文《Show and Tell: A Neural Image Caption Generator》中,更是三图胜千言:

我们可以看到:在表1中,实验使用了微软的COCO数据集,3中评价标准的得分,谷歌NIC模型的得分和人类(Human)得分是不相仲伯的。在表2中,基于不同数据集统一计算BLEU-1得分,NIC的得分和人类得分也比较接近。是不是很牛了?

然而难能可贵的是人家马上就自己打自己的脸!在装了逼后,作者们马上开始说实话。补充了一个基于人类判断的实验,邀请人类对于自己生成的标准语句进行评级,一共分成4个等级:

如上图所示,分成“描述没有错误”、“描述中有点小错误”、“多少还是和图像相关”和“和图像无关”4个等级,分别得分从4到1。那么,真实的对比就来了:

上图中,x坐标是BLEU得分,y坐标是表示积累分布(也就是说,输出的描述语句集合中,有百分只多少的得分大于当前的x)。其中:

  • Flickr-8k:NIC表示的是使用NIC模型在Flick8k测试集上跑的结果的得分曲线;
  • Pascal:NIC表示的是是使用NIC模型在Pascal测试集上跑的结果的得分曲线;
  • COCO-1k:NIC表示的是是使用NIC模型在COCO-1k测试集上跑的结果的得分曲线;
  • Flickr-8k:ref表示的是另一篇论文的结果的得分曲线,这里作为一个基准;
  • Flickr-8k:GT表示的是对Flickr-8k图像的人工标注语句同样进项人工分等级评价的结果。

由此可见:虽然自动裁判员BLEU-4认为NIC模型的得分超出了人类得分,但是如果让人类来当裁判员,NIC还差得远哪!这一结果也印证了上一篇论文中对于不同自动评价标准的分析。

当然,自动评价标准也在持续发展着,2015年发布的专门面向图像标注问题的自动评价标准CIDEr就做的更好些。

在刚才的人类判断与自动评价标准讨论中,几个标准的名称大家都应该比较熟悉了,接下来我就简单地介绍一下,并帮助大家理解它们是如何进行计算的:

Perplexity

首先,这个perplexity该翻译成中文的哪个词就让我反复琢磨了好些天。查阅资料的过程中,大家要么就是不翻译(非我所认同),或者翻译为复杂度混乱度或者困惑度等。如何翻译先按下不表,所谓“信达雅”,第一是要把事情说明白,那么我们就先来把Perplexity理解了,再来选择译名不迟:

关于perplexity,在维基百科上有详细的解释,但是这里我想引用的是2014年百度的论文《Explain Images with Multimodal Recurrent Neural Networks》中对perplexity的定义公式。为什么引用这篇呢?这篇论文是我读的论文中最早提出将RNN和CNN结合起来用于图像标注的,以此表示敬意。作者们在简介中也是这么说的:

To the best of our knowledge, this is the first work that incorporates the Recurrent Neural Network in a deep multimodal architecture.

他们提出的m-RNN模型也是后续论文方法的常用比较方法之一。在论文中,作者们结合图像标注任务,将perplexity定义为:

log_2PPL(w_{1:L}|I)=-\frac{1}{L}\sum^L_{n=1}log_2P(w_n|w_{1:n-1},I)

其中,L是句子的长度,PPL(w_{1:L}|I)就是根据图像I给出的描述句子w_{1:L}的perplexity。而P(w_n|w_{1:n-1},I)是根据图像I和前面的单词序列w_{1:n-1}生成下一个单词w_n的概率。对于此前没有接触过自然语言处理的同学(包括我)来说,此刻的感觉就是:what fxxk ?!

不要惊慌。——《银河系漫游指南

举例子:下面我们用守望先锋的游戏画面来举个例子。假设知友们和玩家们很给力,前面提到的守望先锋图像标注数据集已经有了足够的数据量了,我们也成功地训练了一个图像标注模型,恩,就叫她ATHENA吧!Athena是Advanced Tactical Heroine Assistance的缩写!(劳资真是缩写拼凑小王子!)

我们将上面这张图输入模型,假设模型给出了图像标注句子:

there are two screens on the table.

恩,语句和图像内容相关度还不错,那么我们就计算一下PPL来评价下这个句子。首先我们应该将句子补充一下,添加一个特殊的开始和结束符号

<STA>there are two screens on the table<END>

我们知道,RNN生成句子的方式是采取一个单词一个单词预测的方式,那么假设咱们的词汇表里面有100个单词吧(挺少的),好了,现在从开始符号开始:

  1. 模型根据图像,从<STA>符号开始,对词汇表中100个单词分别给出了每个单词可能为<STA>下一个单词的可能性,其中由于there单词的可能性为0.6,高于其他单词,所以最终就选择了there;
  2. 模型根据图像和<STA>there序列,再次对词汇表中100个单词分别给出了每个单词可能为下一个单词的可能性,其中are的可能性为0.8,高于其他单词,所以选择了are;
  3. 以此类推,假设two的可能性为0.3,screens的可能性为0.4,on的可能性为0.3,the的可能性为0.5,table的可能性为0.6;
  4. 当table出现后,模型预测下一个为<END>结束符号,句子生成结束。

那么根据上面例子,L=7,上面公式的右部就变成了:

-\frac{1}{L}\sum^L_{n=1}log_2P(w_n|w_{1:n-1},I)=-\frac{1}{7}(log_2(0.6)+log_2(0.8)+log_2(0.3)+log_2(0.4)+log_2(0.3)+log_2(0.5)+log_2(0.6))

由此可得:

log_2PPL(w_{1:L}|I)=1.0845

于是:

PPL(w_{1:7}|I)=2^{1.0845}=2.12

于是我们就得到了这个根据图像得出的标注语句的Perplexity值为2.12。那么我们的Athena的perplexity水平如何呢?这里引用一下百度这篇论文的结果表格:

可以看见,m-RNN的PPL(即perplexity的缩写)值是6.92。那么这个分数值是低好一些还是高好一些呢?

我们利用刚才的例子重新算一遍,将每个单词的可能性都降低一些,就会发现perplexity值会升高。这就说明:当模型对于下一个生成单词的确信程度降低时,perplexity值反而升高。我们当然是期望一个模型对于它预测的单词能比较有把握啊,所以perplexity值是越低越好

到了这里,我们就可以讨论perplexity到底可以怎么翻译了,其实我个人比较赞同@硅谷王川在文章中的一句话:

换言之, 聊天机器人使用的语言模型, 如果困惑度足够低,那么它就能够写出流利通顺和逻辑清晰的语句。借用韩愈老师在<师说>里的话:“机器非生而知之者,孰能无惑?". 语言模型里进一步解惑的工具,则来自更多的数据和更精巧的算法。

机器非生而知之者,孰能无惑?妙!所以我个人认为将perplexity翻译为困惑度比较好

BLEU

BLEU是Bilingual Evaluation Understudy的缩写。这个计算标准在图像标注结果评价中使用是很广泛的,但是它的设计初衷并不是针对图像标注问题,而是针对机器翻译问题,它是用于分析待评价的翻译语句和参考翻译语句之间n元组的相关性的。直白地来说,它的核心思想就是:机器翻译语句与人类的专业翻译语句越接近就越好

一些需要说明的符号含义:对于图像I_i,模型会生成对应的标注语句c_i,自动评价标准能够根据参考标注语句(也就是人工标注的语句)的一个集合S_i=\{s_{i1},...,s_{im} \}\in S,对待评价的标准语句c_i的质量做出评价。标注语句都是用n元组(n-gram)来表示的,一个n元组w_k\in \Omega是一个由一个或者多个有顺序单词组成的序列。现在一般只探索n元组从1个单词到4个单词的情况。n元组w_k在语句s_{ij}中出现的次数被记为h_k(s_{ij}),n元组w_k在待评价语句c_i\in C中出现的次数被记为h_k(c_i)


明确上述符号含义后,BLEU的计算公式如下:

首先计算的是全局的n元组精度:其中k指的是长度为n的可能的n元组的集合数。

CP_n(C,S)=\frac{\sum_i \sum_kmin(h_k(c_i),max_{j\in m}h_k(s_{ij}))}{\sum_i \sum_kh_k(c_i)}

然后计算的是简洁性惩罚值:其中l_C是待评价语句c_i们的总长,l_S是全局级别的有效参考句子的总长度。如果对于一个待评价语句有多个参考语句,那么就选择让简洁性惩罚最小的那个。

b(C,S)=\left\{
\begin{array}{rcl}
1           &      & {if \qquad l_C      >      l_S}\\
e^{1-l_S/l_C}       &      & {if \qquad l_C \leq l_S}
\end{array} \right.

最终计算BLEU分数:其中N=1,2,3,4,对于所有的nw_n都是常量。

BLEU_N(C,S)=b(C,S)exp\left(\sum^N_{n=1}w_nlogCP_n(C,S) \right)

怎么算?同学你看懂了吗?反正我刚开始是没看懂:(,直到我看了维基百科上的例子如下:

举例子:假设我们现在有1个模型生成的待评价句子和2个参考句子如下:


如果我们先来计算1元组the的精度的话,根据精度的公式:
P=\frac{m}{w_t}=\frac{7}{7}=1
其中,m怎么理解呢?就是如果一个单词是待评价句子中的,同时在在参考句子中也能找到的这个单词,那么这个单词在待评价语句中出现的次数就是m,在现在例子中the在待评价语句中出现了,也在参考语句中出现了,所以符合条件,而在待评价语句中,the出现了7次,所以这里m=7。而w_t是待评价句子总的单词数量,很显然w_t的值也是7。现在就看到这个例子的奇葩之处了,看起来精度很完美,但是实际上翻译效果很差。

BLEU就是要解决这种问题:所以对于待评价句子中的任意一个单词,算法计算其在参考句子中出现的最大次数max_{j\in m}h_k(s_{ij}),比如,the在参考1中出现了2次,在参考2中出现了1次,那么max_{j\in m}h_k(s_{ij})=2
对于待评价句子,其中每个单词的出现次数h_k(c_i)将被记为该单词的最大出现次数,比如对于the,值为7。
而又因为min(h_k(c_i),max_{j\in m}h_k(s_{ij})),要在这两个值之间取最小值,所以值就是2了。
于是,1元组the的精度分数CP_n(C,S)就是2/7了。
然而在实际中,使用单个单词来比较并不是最理想的,所以BLEU使用n元组来计算,n值最高为4。1元组分数对于评价翻译并不足够。更长的元组得分对应的是语言的流畅性。

接下来计算简洁性惩罚,为啥还要引入一个简洁性惩罚呢?这是因为BLEU倾向于更短的句子,这样精度分数就会很高。为了解决这个问题,使用了乘以一个简洁性惩罚来防止很短的句子获得很高的分数。令l_S为参考句子的总长度,l_C是待评价句子的总长度,如果l_C小于等于l_S,那么惩罚生效,计算e^{1-l_S/l_C}。反之,简洁性惩罚值为1。如果有多个参考句子,那么就选取长度和待评价句子长度最接近的那个参考句子的长度。最后一步的计算相对比较清晰,就不过多解释了。

一句话BLEU得分越高越好。

ROUGE

ROUGE是一个设计用来评价文本摘要算法的自动评价标准集,其中有3个评价标准,分别是ROUGE-N,ROUGE-L和ROUGE-S。下面逐个进行介绍:

ROUGE_N是第一个ROUGE标准。根据给出的待评价句子,它对所有的参考摘要计算一个简单的n元组召回:

ROUGE_n(c_i,S_i)=\frac{\sum_j \sum_kmin(h_k(c_i),h_k(s_{ij}))}{\sum_i \sum_kh_k(s_{ij})}

回顾一下:n元组w_k在语句s_{ij}中出现的次数被记为h_k(s_{ij}),n元组w_k在待评价语句c_i\in C中出现的次数被记为h_k(c_i)。所以上面ROUGE_N的计算还是挺容易理解的。

ROUGE_L是基于longest common subsequence(LCS)的一种测量方法。所谓LCS,就是一个同时出现在两个句子中的单词集合,且单词出现的顺序也是相同的。和n元组不同的是,在单词之间可能还存在能够创建出LCS的单词。将比较的两个句子间的LCS的长度记为:l(c_i,s_{ij})。ROUGE-L通过计算F-meansure(F1 score)来求得:

R_l=max_j\frac{l(c_i,s_{ij})}{|s_{ij}|}P_l=max_j\frac{l(c_i,s_{ij})}{|c_i|}ROUGE_L(c_i,S_i)=\frac{(1+\beta^2)R_lP_l}{R_l+\beta^2P_l}

R_l是召回,P_l是精度,\beta一般等于1.2,在这个计算中不需要管n元组。

ROUGE_S是最后一个标准,没有使用LCS或n元组,使用的是跳跃二元组(skip bigram)。跳跃二元组是句子中有序的单词对,和LCS类似,在单词对之间,单词可能被跳过。比如一句有4个单词的句子,按照排列组合就可能有6种跳跃二元组。再次使用精度和召回率来计算F,将句子s_{ij}中跳跃二元组的个数记为f_k(s_{ij}),则计算公式如下:

R_s=max_j\frac{\sum_kmin(f_k(c_i),f_k(s_{ij}))}{\sum_kf_k(s_{ij})}P_s=max_j\frac{\sum_kmin(f_k(c_i),f_k(s_{ij}))}{\sum_kf_k(c_i)}

GOUGE_S(c_i,S_i)=\frac{(1+\beta^2)R_sP_s}{R_s+\beta^2P_s}

跳跃二元组能够捕获到长距离的句子结构。在实践中,跳跃二元组计算的时候单词间最长距离为4。ROUGE-SU是在跳跃二元组基础上增加使用了1元组。

一句话:ROUGE得分越高越好

METEOR

METEOR是用来评价机器翻译输出的标准。该方法基于一元组的精度和召回的调和平均(Harmonic mean),召回的权重比精度要高一点。这个标准还有一些其他标准没有的特性,设计它是为了解决BLEU存在的一些问题。它与人类判断相关性高,而且和BLEU不同,它不仅在整个集合,而且在句子和分段级别,也能和人类判断的相关性高。在全集级别,它的相关性是0.964,BLEU是0.817。在句子级别,它的相关性最高到了0.403。

METEOR的计算公式:其中m是平面图(alignments)的集合,ch是块(chunk)的数量,P_m是精度,R_m是召回率。

Pen=\gamma\left(\frac{ch}{m}  \right)^{\theta}

F_{mean}=\frac{P_mR_m}{\alpha P_m+(1-\alpha)R_m}

P_m=\frac{|m|}{\sum_k h_k(c_i)}

R_m=\frac{|m|}{\sum_k h_k(s_{ij})}

METEOR=(1-Pen)F_{mean}

理解:看公式总是挺抽象的,下面我们还是看看来自维基百科的例子吧。计算的最基本单元是句子。算法首先从待评价字符串和参考字符串之间创建一个平面图如下:

所谓平面图,就是1元组之间的映射集。平面图有如下的一些限制:在待评价翻译中的每个1元组必须映射到参考翻译中的1个或0个一元组,然后根据这个定义创建平面图。如果有两个平面图的映射数量相同,那么选择映射交叉数目较少的那个。也就是说,上面左侧平面图会被选择。状态会持续运行,在每个状态下只会向平面图加入那些在前一个状态中尚未匹配的1元组。一旦最终的平面图计算完毕,就开始计算METEOR得分:

1元组精度:P=\frac{m}{w_t}

其中m是在参考句子中同样存在的,待评价句子中的一元组的数量。w_t是待评价翻译中一元组的数量。

1元组召回率:R=\frac{m}{w_r}

m同上,w_r是参考翻译中一元组的数量。
然后使用调和平均来计算F-mean,且召回的权重是精度的9倍。

F_{mean}=\frac{10PR}{R+9P}

到目前为止,这个方法只对单个单词的一致性进行了衡量,却没有对参考翻译和待评价翻译中更大的分段进行衡量。为了将其计算在内,使用更长的n元组来计算对于平面图的惩罚p。在参考和待评价句子中的没有毗连的映射越多,惩罚就越高。为了计算惩罚,1元组被分组成最少可能的块(chunks)。块的定义是在待评价语句和参考语句中毗邻的一元组集合。在待评价语句和参考语句之间的毗邻映射越长,块的数量就越少。一个待评价翻译如果和参考翻译相同,那么就只有一个块。惩罚p的计算如下:

p=0.5\left(\frac{c}{u_m} \right)^3

其中c就是块的数量,u_m是被映射的一元组的数量。p可以减少F-mean的值。
最后M=(1-p)F_{mean}

计算例子:这里偷个懒,直接截图维基百科,可以结合这个例子对照看自己的计算是否正确。

一句话:METEOR得分越高越好

CIDEr

CIDEr是专门设计出来用于图像标注问题的,它是通过对每个n元组进行Term Frequency Inverse Document Frequency (TF-IDF) 权重计算,来衡量图像标注的一致性的。一个n元组wk在出现在参考句子sij中的次数被记为h_k(s_{ij}) ,如果出现在待评价句子中,则被记为h_k(c_i)。CIDEr为每个n元组wk都计算TF-IDF权重g_k(s_{ij})

g_k(s_{ij})=\frac{h_k(s_{ij})}{\sum_{w_l\in \Omega}}log \left(\frac{|I|}{\sum_{I_p \in I}min(1,\sum_qh_k(s_{pq}))} \right)

其中\Omega是所有n元组的词汇表,I是数据集中所有图像的集合。公式第一个部分计算的是每个n元组wk的TF,公式第二部分是使用IDF来计算w_k的稀有程度。从直观上来说,如果一些n元组频繁地出现在描述图像的参考标注中,TF对于这些n元组将给出更高的权重,而IDF则降低那些在所有描述语句中都常常出现的n元组的权重。也就是说,IDF提供了一种测量单词显著性的方法,这就是将那些容易常常出现,但是对于视觉内容信息没有多大帮助的单词的重要性打折。
IDF的计算方法是:分子为数据集中图像的数量I,分母为一些图像的数量,这些图像是其任意一个描述中出现了n元组w_k的图像,然后再对着个分数求对数。对于长度为n的n元组的CIDEr-n分数是使用待评价句子和参考句子之间的平均相似性来计算的,其中精度和召回率都要占比例:

CIDEr_n(c_i,S_i)=\frac{1}{m}\sum_j\frac{g^n(c_i)\cdot g^n(s_{ij})}{||g^n(c_i)|||| g^n(s_{ij})||}

其中,g^n(c_i)是一个由g_k(c_i)生成的向量,对应的是所有长度为n的n元组。||g^n(c_i)||是向量的大小。而g^n(s_{ij})的情况类似。更长的n元组是用来获取语法性质和更丰富的语义信息的。不同长度的n元组的得分计算如下:

CIDEr(c_i,S_i)=\sum^N_{n=1}w_nCIDEr_n(c_i,S_i)

标准权重w_n=1/N,N=4比较常用。

CIDEr-D是修改版本,为的是让CIDEr对于gaming问题更加鲁棒。什么是Gaming问题?它是一种现象,就是一个句子经过人工判断得分很低,但是在自动计算标准中却得分很高的情况。为了避免这种情况,CIDEr-D增加了截断(clipping)和基于长度的高斯惩罚

CIDEr\text{-}D_n(c_i,S_i)=\frac{10}{m}\sum_j e^{\frac{-(l(c_i)-l(s_{ij}))^2}{2\sigma^2}} \frac{min(g^n(c_i),g^n(s_{ij}))\cdot g^n(s_{ij})}{||g^n(c_i)|||| g^n(s_{ij})||}
其中,l(c_i)l(s_{ij})分别表示的是待评价句子和参考句子的长度,\sigma=6,分子为10是为了让得分和其他标准比较相似。最终:

CIDEr\text{-}D(c_i,S_i)=\sum^N_{n=1}w_nCIDEr\text{-}D_n(c_i,S_i)

一句话:CIDEr得分越高越好

下篇预告

由于文章篇幅较长,顾分为上下篇发布。在上篇中,介绍了图像标准问题,以及研究问题的数据集,人工和自动评价标准,并脑洞了开源创建守望先锋图像标注数据集的想法

在下篇中,将介绍比较几个有代表性的图像标注方法,一些代码实践,和对于图像标准问题的思考

作者反馈

  1. 欢迎大家对文中的不当之处留言批评指正,共同学习提高;
  2. 由于希望写得有趣和通俗些,所以解释和比喻较多,行文稍显冗余,不知阅读效果如何?请批评;
  3. 真心想做一个基于守望先锋游戏画面的图像标注数据集,为什么特别指明用Ruby呢?因为朋友天天安利我说Ruby on rails做网站好,我对网站这一块不太懂,就信任小伙伴咯,不希望因为这个问题引战:)
编辑于 2016-09-20

文章被以下专栏收录

    面向通用人工智能和机器人学习,聚焦深度增强学习,可微神经计算机和生成对抗模型。