看图说话(Image Caption)任务是结合CV和NLP两个领域的一种比较综合的任务,Image Caption模型的输入是一幅图像,输出是对该幅图像进行描述的一段文字。这项任务要求模型能够识别图片中的物体、理解物体间的关系,并用一句天然语言表达出来。html
应用场景:好比说用户在拍了一张照片后,利用Image Caption技术能够为其匹配合适的文字,方便之后检索或省去用户手动配字;此外它还能够帮助视觉障碍者去理解图像内容。相似的任务还有Video Caption,输入是一段视频,输出是对视频的描述。git
目前来讲,Image Caption任务主要集中在英文上,数据集包括微软的COCO(CodaLab组织了一个排行榜;本地评测在这里)、Flickr8k、Flickr30k和SBU等。下图是 [1] 给出的统计信息,其中除了SBU外,每一个图片都有5我的工参考描述,而且SBU来自用户上传时所配,噪声较大。github
此外,今年ACL上出现了日文的数据集。web
根据 [1] ,将理解图片和生成描述这两个子任务统一到一块儿的话,那么Image Caption任务的训练过程能够描述为这个形式:对于训练集的一张图片 $I$ ,其对应的描述为序列 $S=\{S_1,S_2,...\}$(其中 $S_i$ 表明句子中的词)。对于模型 $\theta$ ,给定输入图片$I$ ,模型生成序列 $S$ 的几率为网络
$$P(S|I;\theta)=\prod_{t=0}^NP(S_t|S_0,S_1,...,S_{t-1},I;\theta)$$架构
拆解成连乘的形式后,问题就变成了建模条件几率 $P(S_t|S_0,S_1,...,S_{t-1},I;\theta)$ 。一般来讲,RNN是当仁不让的第一选择,由于理论上它能够保留所有上文信息(对于“长时依赖”问题,使用LSTM来缓解),而不像 n-gram 或者 CNN 那样只能取一个窗口。框架
将似然函数取对数,获得对数似然函数:ide
$$\log P(S|I;\theta)=\sum_{t=0}^N\log P(S_t|S_0,S_1,...,S_{t-1},I;\theta)$$函数
模型的训练目标就是最大化所有训练样本的对数似然之和:学习
$$\theta^*=\arg\max_{\theta}\sum_{(I,S)}\log P(S|I;\theta)$$
式中 $(I,S)$ 为训练样本。这种极大似然估计的方式等价于使用对数损失函数的经验风险最小化。
训练好模型后,对于生成过程,则是根据输入的一张图片 $I$ ,推断出最可能的序列来输出:
$$\arg\max_{S}P(S|I;\theta^*)$$
固然,计算所有序列的几率而后选出几率最大的序列固然是不可行的,由于每一个位置都有词表规模的词做为候选,搜索规模会随序列的长度而指数级增加,因此须要用beam search来缩小搜索空间。
看到这,想到了什么?是否是机器翻译,自动摘要,encoder-decoder……
ok,下面说一下自动评价方法的评价指标。在2015年COCO比赛的排行榜上(C40的意思是每张测试集的图片有40我的工给出的参考caption),能够看到经常使用的指标是BLEU、Meteor、ROUGE、CIDEr和SPICE。前两个是评测机器翻译的,第三个是评测自动摘要的,最后两个应该是为caption定制的。下面简单介绍一下前四个。
对于英文来讲,模型生成的caption和人工给出的参考caption都通过了预处理:词条化(tokenization),去除标点。通常来讲,评价生成的序列与参考序列的差别时,都是基于 n-gram 的,进而考察局部性质而非只考察单个词。另外,COCO官方提到 n-gram 中的词没有通过词干还原(stemming,启发式地去掉单词两端词缀)这个步骤。
1. BLEU(BiLingual Evaluation Understudy)
BLEU是事实上的机器翻译评测标准,n 常取1到4,基于准确率(precision)的评测。咱们首先看一下它在机器翻译里是怎么作的。如下内容参考自 [6] :
须要明确,在机器翻译中,翻译的评测是以句子为单位的。
(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 的状况,也就是unigram,模型生成的句子包含7个 unigram ,这7个 unigram 所有出如今了参考句子集合中,因此将获得 7/7 这样的满分,可是这样的译文显然没有意义。为了得到较高的指标,模型彻底能够在任何位置都去生成一个“百搭”的词,使得分子随着分母的增加而增加。
(2) 为了解决“百搭”词的问题,须要修正 precision 的计算方式。考虑模型生成的句子 $c$ 的所有 n-gram ,考察其中的任一 n-gram :首先计算其在 $c$ 中出现的次数 $Count(n\text{-gram})$ ;而后统计其在各参考句子中分别出现的次数的最大值,将该值与 $Count(n\text{-gram})$ 的较小者记做该 n-gram 的匹配次数 $Count_{\text{clip}}(n\text{-gram})$ 。以后,再把每一个 n-gram 的计算结果累加起来,获得句子的结果。因此precision能够用以下方式计算:
$$p_n=\frac{\displaystyle\sum_{c\in\{\text{Candidates}\}}\sum_{n\text{-gram}\in c}Count_{\text{clip}}(n\text{-gram})}{\displaystyle\sum_{c\in\{\text{Candidates}\}}\sum_{n\text{-gram}\in c}Count(n\text{-gram})}$$
式中 $\{\text{Candidates}\}$ 表明须要评测的多句译文的集合。当n取1时,$\displaystyle\sum_{n\text{-gram}\in c}Count(n\text{-gram})$ 就是句子 $c$ 的长度。
回过头来看上面那个例子,译文句子的 unigram 只有“the”,它在译文中出现了7次,故 $Count(\text{the})=7$;在参考句子1中出现2次,参考句子2中出现1次,最大值为2,因此“the”的匹配次数为 $Count_{\text{clip}}(\text{the})=\min\{7, 2\}=2$ ,所以precision为 2/7 。
(3) 可是这样的计算方式仍然存在问题:好比模型生成的句子是“the cat is on”,那么从 n 不论取一、二、3仍是4,得分都是1,满分。换言之,因为评价的是precision,因此会倾向于短句子,若是模型只翻译最有把握的片断,那么就能够获得高分,所以要对短句子进行惩罚。
惩罚的方式就是在原先的评价指标值上乘一个惩罚因子(brevity penalty factor):当模型给出的译文句子 $c$ 的长度 $l_c$ 要比参考句子的长度 $l_s$ 长时,就不进行惩罚,即惩罚因子为1,好比说有三个参考句子的长度分别为十二、1五、17,模型给出的译文句子长度为12,那么就不进行惩罚,比较的是各参考句子长度里最接近的那个;不然就惩罚:
$$BP=\begin{cases}1, & l_C>l_S;\\\exp(1-\dfrac{l_S}{l_C}), & l_C\leq l_S\end{cases}$$
式中的 $l_C$ 表明模型给出的测试集所有句子译文的长度总和,$l_S$ 表明与模型给出译文句子长度最接近的参考译文的长度(语料级别)。
综合起来,BLEU的评分公式采用的是对数加权平均值(这是由于当n增大时评分会指数级减少),再乘上惩罚因子:
$$BLEU@N=BP\cdot \exp(\sum_{n=1}^Nw_n\log p_n)$$
式中的 N 一般取4,权重 $w_n$ 一般取 $\dfrac1N$(几何平均)。最终评分在0到1之间,1表示彻底与人工翻译一致。
BLEU的优势是它考虑的粒度是 n-gram 而不是词,考虑了更长的匹配信息;BLEU的缺点是无论什么样的 n-gram 被匹配上了,都会被同等对待。好比说动词匹配上的重要性从直觉上讲应该是大于冠词的。
(4) 在caption任务中,处理方式和机器翻译是同样的:多张图片就至关于翻译里的多个源语言句子。为了描述清楚仍是给一下公式:
对于测试集的一张图片 $I_i$ ,模型生成的caption记为 $c_i\in C$( $C$ 是所有 $c_i$ 构成的集合),且将任一 n-gram 记做 $\omega_k$ ;人工给出的参考caption的集合为 $S_i=\{s_{i1},s_{i2},...,s_{im}\}\in S$( $S$ 是所有 $S_i$ 构成的集合),$s_{ij}$ 为句子,$m$ 为参考caption的数量(数据集里的一张图片一般会有多个参考caption,好比Flickr、COCO数据集上每张图片都有5个参考caption)。将某个 n-gram $\omega_k$ 出如今句子 $c_i$ 中的次数记做 $h_k(c_i)$ ,相似地,可定义 $h_k(s_{ij})$ 。
在整个测试集上,precision值为
$$p_n(C,S)=\frac{\displaystyle\sum_i\sum_k\min\{h_k(c_i),\max_{j\leq m}h_k(s_{ij})\}}{\displaystyle\sum_i\sum_kh_k(c_i)}$$
惩罚因子的值为
$$BP(C,S)=\begin{cases}1, & l_C>l_S;\\\exp(1-\dfrac{l_S}{l_C}), & l_C\leq l_S\end{cases}$$
因此BLEU@N的值为
$$BLEU@N(C,S)=BP(C,S)\cdot \exp(\sum_{n=1}^Nw_n\log p_n(C,S))$$
2. ROUGE
ROUGE是出于召回率来计算,因此是自动摘要任务的评价标准。详情可见以前写过的一篇关于摘要的博客。
3. Meteor
如下内容参考自 [6] :
Meteor也是来评测机器翻译的,对模型给出的译文与参考译文进行词对齐,计算词汇彻底匹配、词干匹配和同义词匹配等各类状况的准确率、召回率和F值。
首先计算 unigram 状况下的准确率 P 和召回率 R(计算方式与BLEU、ROUGE相似),获得调和均值(F值)
$$F=\frac{(\alpha^2+1)P}{R+\alpha P}$$
若是 $\alpha>1$ 就说明 R 的权重高。看到这可能尚未什么特别的。
Meteor的特别之处在于,它不但愿生成很“碎”的译文:好比参考译文是“A B C D”,模型给出的译文是“B A D C”,虽然每一个 unigram 都对应上了,可是会受到很严重的惩罚。惩罚因子的计算方式为
$$Penalty=\gamma (\frac{\#chunks}{\#unigrams\_matched})^{\theta}$$
式中的 $\#chunks$ 表示匹配上的语块个数,若是模型生成的译文很碎的话,语块个数会很是多;$\#unigrams\_matched$ 表示匹配上的 unigram 个数。因此最终的评分为
$$Meteor=(1-Penalty)\cdot F$$
用于机器翻译评测时,一般取 $\alpha=3$ 、$\gamma=0.5$ 和 $\theta=3$ 。
4. CIDEr(Consensus-based image description evaluation)
这个指标将每一个句子都看做“文档”,将其表示成 tf-idf 向量的形式,而后计算参考caption与模型生成的caption的余弦类似度,做为打分。换句话讲,就是向量空间模型。考虑一张图片 $I_i\in I$( $I$ 是所有测试集图片的集合):
对于一个 n-gram $\omega_k$ 和参考caption $s_{ij}$ ,tf-idf 计算方式为
$$g_k(s_{ij})=\frac{h_k(s_{ij})}{\displaystyle\sum_{\omega_l\in\Omega} h_l(s_{ij})}\log\biggl(\frac{|I|}{\displaystyle\sum_{I_p\in I}\min\{1,\sum_qh_k(s_{pq})\}}\biggr)$$
式中的 $\Omega$ 是所有 n-gram 构成的词表。能够看出 idf 的分母部分表明的是 $\omega_k$ 出现于参考caption的图片个数。
那么,CIDEr的值能够用余弦类似度的平均值来计算:
$$CIDEr_n(c_i,S_i)=\frac1m\sum_j\frac{\boldsymbol{g^n}(c_i)^{\top}\boldsymbol{g^n}(s_{ij})}{||\boldsymbol{g^n}(c_i)||\cdot ||\boldsymbol{g^n}(s_{ij})||}$$
相似于BLEU的作法:
$$CIDEr(c_i,S_i)=\sum_{n=1}^Nw_nCIDEr_n(c_i,S_i)$$
这个指标的motivation之一是刚才提到的BLEU的一个缺点,就是对全部匹配上的词都同等对待,而实际上有些词应该更加剧要。
泛读了几篇论文,这是第一篇,也是很简单的一篇:
[1] NICv2模型:Show and Tell: Lessons learned from the 2015 MSCOCO Image Captioning Challenge
这篇文章的原版是2015年CVPR的那篇show and tell,NIC模型。这篇增长了一些内容,讲了相比于原先的模型都作了哪些改进,进而取得了2015年COCO比赛的第一名。
0. 模型结构
NIC模型的结构很是“简单”:就是利用encoder-decoder框架,首先利用CNN(这里是GoogLeNet)做为encoder,将 Softmax 以前的那一层固定维数的向量做为图像特征;再使用LSTM做为decoder,其中图像特征输入decoder(图像特征仅在开始时刻输入,后面就没用了)。模型的训练就是和任务描述那里介绍的同样,使用最大化对数似然来训练,而后在测试阶段采用beam search来减少搜索空间。
须要注意的是,这个结构与传统的encoder-decoder有点区别。引用我在 seq2seq 作自动摘要的那篇博客的一张slides:
能够看出,NIC 模型仅在decoder的开始时刻输入了图像特征,而不是在每一个解码时刻都输入了图像特征。做者给出的理由是,若是在每一个时刻都输入图像特征,那么模型会把图像的噪声放大,而且容易过拟合。实际上,后面的一些文章在基于attention来作caption,那么就必然要每一个时刻都输入。所以本文的模型是很是简单的。
另外多提一点,文章中提到了一个baseline:Multimodal Recurrent Neural Networks (m-RNN),这个是 Baidu Research 在14年10月的一个工做(发表在NIPS的workshop,也就是 [2] ),后来还有一个版本(15年ICLR的版本,也就是 [3] ),是比较早期的用深度学习架构来作 Image Caption 任务的工做。
从这两大类序列to序列的任务上不难发现encoder-decoder的优势:很是灵活,不限制输入和输出的模态,也不限制两个网络的类型;encoder-decoder的缺点:当输入端是文本时,将变长序列表达为固定维数向量,存在信息损失,而且目前还不能处理太长的文本。
1. 训练细节
在训练过程当中,固定学习率且不加动量(momentum);词条化后去掉了词频小于5的词;在ImageNet上预训练GoogLeNet,而且在训练caption模型时这部分的参数保持不变;在大型新闻语料上预训练词向量,可是效果并无明显提高;使用dropout和模型ensemble,并权衡模型的容量:隐层单元个数与网络深度;512维词向量;使用困惑度(perplexity)来指导调参。
我的以为,这种简单粗暴的模型结构,参数的设置真的过重要了。
2. 自动评价与人工评价
做者在论文中屡次强调,须要更好的自动评价计算方式。由于以自动评价指标来评测的话,模型的评测结果在不少时候要比人写的caption的评测结果还要好,但人工评价的结果显示,实际上模型的caption相比于人写的caption还有很大差距。
3. 迁移学习与数据标注的质量
一个很容易想到的问题是,是否能够把在某个数据集下训练的模型迁移到另外一数据集?高质量的标注数据和更多的数据能够补偿多少领域错配问题?
首先来看迁移学习的问题,做者首先指出,在Flickr8k和Flick30k这两个数据集上,若是用Flickr30k来训练,效果会提高4个BLEU,更大量的数据带来了更好的效果,凸显data-driven的价值。可是若是用COCO作训练,尽管数据量五倍于Flickr30k,但因为收集过程不统一,带来了词表的差异以及较大的领域错配,效果降低了10个BLEU。PASCAL数据集没有提供训练集,使用COCO训练的效果要比使用Flickr30k的效果要好。
而后再看标注质量的问题。此前已经提到过,SBU数据集的噪声较大,因此能够看做是“弱标注”的(weak labeling),但尽管如此,若是使用COCO来训练,效果依旧会降低。
4. 生成的caption是否具有多样性
做者探讨了模型生成的描述是否有新颖性,是否同时具有多样性和高质量。
首先来看多样性(diversity)。做者挑了测试集里的三个图片的caption,每张图片都有模型生成的3-best描述(加粗的是没在训练集中出现过的),能够看出这些描述能够展示图像的不一样方面,所以做者认为该模型生成的caption具有多样性。
再来看质量。若是只考虑模型生成的最佳候选caption,那么它们中的80%在训练集中出现过;若是考虑top15,则有一半是彻底新的描述,但仍然具有类似的BLEU分,所以做者认为该模型生成的caption兼具了多样性和高质量。
5. NIC模型的改进:NICv2
做者列举了使他们成为2015COCO比赛第一名的几点重要改进。
(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在训练时会随机使用模型真实输出来做为下一个时刻的输入,而不像原先那样只会使用目标词来做为下一时刻的输入。做者认为,这种方式能够强迫模型在训练过程当中“学会”如何处理错误。
我认为这和 negative sampling 策略(如 word2vec 等模型所采用的加速训练策略,NCE 的简化版本)正好相反,由于在负采样中,训练过程当中构造的负样本的似然是要最小化的,而在这里却做为了强迫模型在训练过程当中学习到新知识的一种方式,可是从“错误”的样本里能学出来什么呢?
关于各类改进的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能够视做一种正则化。
6. 展望
做者提到,一个方向是但愿模型可以给出有针对性的描述,例如根据用户提问来给出caption,这就成了一种VQA任务;另一个就是须要更好的自动评价指标。
最后给出例子欣赏一下~~
参考:
[1] Show and Tell: Lessons learned from the 2015 MSCOCO Image Captioning Challenge(前一个版本在2015CVPR)
[2] Explain Images with Multimodal Recurrent Neural Networks
[3] Deep Captioning with Multimodal Recurrent Neural Networks (m-RNN)
[4] Deep Visual-Semantic Alignments for Generating Image Descriptions
[6] 统计天然语言处理