Image Caption是结合了CV和NLP的综合性任务,它的输入是一张图像,输出则是对该福图像进行描述的一段文字。该任务要求模型可以识别出图片中的物体,还可以用一句话描述表达出各个物体之间的关系。
image caption常用数据集有:
(1)Flickr8k:它包含8000张照片。6000训练,1000验证,1000测试;
(2)Flickr30k:它包含3.1万张图片。我们有29000张train,1000张验证,1000张测试;
(3)MSCOCO:在训练集中包含82,783个图像,验证集中40504个图像,测试集中40775个图像,由于MSCOCO测试集的ground truth不可用,验证集进一步被分割,成为模型选择和测试子集的验证子集。
在image caption问题中,常见的评价指标为BLEU评分、Meteor、ROUGUE、CIDEr和SPICE。其中,BLEU评分与Metor主要是用于评测机器翻译,ROUGE是评测自动摘要的,最后两个是为capiton定制的。
BLEU是事实上的机器翻译评测标准,n 常取1到4,基于准确率(precision)的评测。我们首先看一下它在机器翻译里是怎么做的。(在机器翻译中,翻译的评测是以句子为单位的)
(1) 首先来看一个最简单的思路:对于一个源语言句子,计算模型生成的译文中的 n-gram 的个数,然后再计算这些 n-gram 中有多少是同时出现在了参考译文(不止一句)中,从而计算出一个百分比来作为 precision 。
但这样的做法存在一些问题:比如说参考句子1是“the cat is on the mat”,参考句子2是“there is a cat on the mat”,而模型生成的句子是“the the the the the the the”,那么按照上述定义,考察 n=1 的情况将得到 7/7 这样的满分,但是这样的译文显然没有意义。为了获得较高的指标,模型完全可以在任何位置都去生成一个“百搭”的词,使得分子随着分母的增长而增长。
(2) 为了解决“百搭”词的问题,需要修正 precision 的计算方式。考虑模型生成的句子 cc 的全部 n-gram ,考察其中的任一 n-gram :首先计算其在 c中出现的次数 Count(n-gram);然后统计其在各参考句子中分别出现的次数的最大值,将该值与 Count(n-gram)的较小者记作该 n-gram 的匹配次数Countclip(n-gram) 。之后,再把每个 n-gram 的计算结果累加起来,得到句子的结果。所以precision可以用如下方式计算:
优点:BLEU着重考虑n-gram而不是词,即考虑到了更长的匹配信息;
缺点:不管什么样的 n-gram 被匹配上了,都会被同等对待。比如说动词匹配上的重要性从直觉上讲应该是大于冠词的。
类比到caption任务上:
对于测试集的一张图片,模型生成的caption记为ci∈C( C 是全部ci构成的集合),且将任一 n-gram 记作ωk ;人工给出的参考caption的集合为 Si={si1,si2,…,sim}∈S(S 是全部 Si 构成的集合),sij为句子,m为参考caption的数量(数据集里的一张图片通常会有多个参考caption,比如Flickr、COCO数据集上每张图片都有5个参考。将某个 n-gram ωk出现在句子 ci中的次数记作 hk(ci),类似地,可定义 hk(sij)。则在整个测试集上,precision值为:
惩罚因子项为:
最终的BLEU值为:
ROUGE是出于召回率来计算的,所以是自动摘要任务的评价标准。
这个指标将每个句子都看作“文档”,将其表示成 tf-idf 向量的形式,然后计算参考caption与模型生成的caption的余弦相似度,作为评分。换句话讲,就是向量空间模型。
TD-IDF算法:https:///sangyongjia/article/details/52440063?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159532752819195188447618%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=159532752819195188447618&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v3~pc_rank_v3-1-52440063.pc_ecpm_v3_pc_rank_v3&utm_term=tf-idf&spm=1018.2118.3001.4187
对于一张图像I,有 n-gram ωk 和参考caption sij ,则tf-idf 计算方式为:
式中的 Ω 是全部 n-gram 构成的词表。可以看出 idf 的分母部分代表的是 ωk出现于参考caption的图片个数。
那么,CIDEr的值可以用余弦相似度的平均值来计算:
类似于BLEU的做法:
motivation:这个指标在一定程度上解决了BLEU的一个缺点,就是对所有gram都同等对待,实际上部分词语应该更加重要。
NIC模型结构比较简单,用的是encoder-decoder框架,即首先利用CNN作为encoder提取图像的特征,具体到文中为将GoogleNet的softmax之前的那一层固定位数的向量作为图像特征;然后 利用RNN(也可LSTM)作为decoder,即decoder的输入即为图像特征。模型的训练就是使用最大化对数似然来训练,然后在测试阶段采用beam search来减少搜索空间。
此外,NIC模型仅在decoder的开始时输入了图像特征,而不是在每个解码时刻都输入图像特征,作者给出的原因是每个时刻都输入图像特征,模型会把图像的噪声放大,并且容易过拟合。
该框架的优缺点:
优点:非常灵活,不限输入和输出的模态,同时不限制两个网络的类型
缺点:当输入端是文本时,将变长序列表达为固定维数向量,存在信息损失,并且目前还不能处理太长的文本。
在训练过程中,固定学习率且不加动量(momentum);词条化后去掉了词频小于5的词;在ImageNet上预训练GoogLeNet,并且在训练caption模型时这部分的参数保持不变;在大型新闻语料上预训练词向量,但是效果并没有明显提升;使用dropout和模型ensemble,并权衡模型的容量:隐层单元个数与网络深度;使用困惑度(perplexity)来指导调参。
作者在论文中多次强调,需要更好的自动评价计算方式。因为以自动评价指标来评测的话,模型的评测结果在很多时候要比人写的caption的评测结果还要好,但人工评价的结果显示,实际上模型的caption相比于人写的caption还有很大差距。
需要大量标注数据的有监督类学习一直有两个问题:
1、是否可以把在某个数据集下训练的模型迁移到另一数据集;
2、高质量的标注数据和更多的数据可以补偿多少领域错配问题。
首先来看迁移学习的问题,作者首先指出,在Flickr8k和Flick30k这两个数据集上,如果用Flickr30k来训练,效果会提升4个BLEU,更大量的数据带来了更好的效果,凸显data-driven的价值。但是如果用COCO做训练,尽管数据量五倍于Flickr30k,但由于收集过程不统一,带来了词表的差别以及较大的领域错配,效果下降了10个BLEU。
然后再看标注质量的问题。此前已经提到过,SBU数据集的噪声较大,所以可以看作是“弱标注”的(weak labeling),但尽管如此,如果使用COCO来训练,效果依旧会下降。
多样性:作者挑了测试集里的三个图片的caption,每张图片都有模型生成的3-best描述,不同的描述展现出了图像不同的方面,因此作者认为该模型生成的caption具备多样性。
质量:如果只考虑模型生成的最佳候选caption,那么它们中的80%在训练集中出现过;如果考虑top15,则有一半是完全新的描述,但仍然具备相似的BLEU分,因此作者认为该模型生成的caption兼具了多样性和高质量。
改进点:
1、Batch Normalization:在encoder的GoogLeNet中引入了Batch Normalization
2、encoder端的fine-tuning:
刚才提到,encoder端的CNN在预训练后,是不参与caption模型的训练的,其参数值是保持不变的。而这里他们进行了微调:首先固定encoder的参数,训练500k步decoder,以得到一个不错的LSTM;然后encoder和decoder联合训练100k步。作者特别强调,CNN不能陪着LSTM一起从头开始就联合训练,而必须在LSTM已经不错的情况下再进行联合训练,否则预训练的CNN也会被“带跑”。另外,作者说使用K20单机训练了超过三周,而并行训练时会使效果变差。CNN的fine-tuning带来的效果是,一些例子可以正确描述颜色。作者认为,在ImageNet预训练的过程,使得“颜色”这样的和分类无关的特征被抛弃了。
3、RNN的训练使用Scheduled Sampling:对应于2015NIPS的文章,RNN的训练trick。
对于 Image Caption 和 Machine Translation 等一系列生成变长序列的任务,RNN的训练和测试过程其实存在不统一的地方:训练时,对于输入 I 和目标序列 S 构成的样本 (I, S) ,目标是最大化似然函数 P(S|I) ,进而 train 出来模型的参数。我们知道,似然函数是被拆解成条件概率的连乘形式,而每个词的条件概率求解过程中,RNN接受的输入信息包括上一时刻的隐状态、encoder的编码向量以及上一时刻的词。
问题就出在,“上一时刻的词”在训练过程中是被指定为目标序列 S 中的词的,也就是说它是“正确的”;而在测试时,“正确的”上一时刻目标词是不知道的,取而代之的是由模型生成的词(虽然仍然是Softmax计算出词表中概率最大的那个词,但是训练过程会使模型去拟合Softmax计算的词与正确的词之间的loss;而测试过程就真的只是生成一个词之后就不管了,因为没有监督信号),这就带来了训练和测试的不统一(discrepancy)。如果测试过程中的某个时刻生成了错误的词,那么这个错误会被快速放大,因为生成的这段序列很有可能没在训练过程中出现过。
测试过程中使用softmax来取概率最大的词(并结合 beam search )已经是很“正确”的做法了。作者在RNN的训练过程中做一些变化:Scheduled Sampling就是指RNN在训练时会随机使用模型真实输出来作为下一个时刻的输入,而不像原先那样只会使用目标词来作为下一时刻的输入。作者认为,这种方式可以强迫模型在训练过程中“学会”如何处理错误。
4、模型ensemble:改变一些训练条件,训练出多个模型。作者训练了5个Scheduled Sampling模型和10个fine-tuning CNN模型。
5、减小beam search的候选结果个数(k)
在NIC模型中,作者只取了1和20两个值。在改进过程中,发现k取3是最好的搜索规模。按道理说,k越大应该越好,但实际上是较小的k取得了最好的结果,说明目标函数与人工的标准不匹配,或者模型过拟合;作者同时发现,减少k可以提升新颖性(生成的caption出现在训练集的比例从80%降到了60%),所以认为模型是过拟合了。这样的话,减少k可以视作一种正则化。
转载:http://www.cnblogs.com/Determined22/
因篇幅问题不能全部显示,请点此查看更多更全内容