Image Caption:neural baby talk

论文链接:Neural baby talk https://arxiv.org/abs/1803.09845

Introduction

本文提出了一种方法,人文对图片产生的描述分为两种,一种是句子本身的模型,一种是根据图像得到的信息,比如说
A man sits on the chair
‘A’,’on‘,’sits‘,’the‘这种词作者认为是根据句子模型产生的,称为textual word,而加粗的部分作者认为是根据图片对应区域产生的,称为visual word。,于是在产生句子的时候作者会进行判断,当前单词是textual word还是visual word。然后将textual word放入句子中,而visual word要等全部找出后决定放入的位置,以上句子为例:
“A <region−17> is sitting the <region−3>.
先将句子模板产生,region部分为根据图片产生的单词,精确的将单词填入其中
本文贡献:

  1. 提出了Neural baby talk,一个以视觉为基础的图像理解模型,清晰的定位图片中物体的位置,产生*格式的自然语言描述
  2. 提出了一个两阶段方法,第一阶段产生句子模板,并产生一些空位置,第二阶段:根据图片产生的visual word联系上下文语义填入句子当中。
  3. 提出了一个健壮的图像理解算法,在测试时,该模型会遇到包含已知物体的图像,但图像的组合方式很新奇(例如,该模型在训练时看到过狗躺在沙发上,人坐在桌子上,而在测试的时候会生成狗在桌子上),测试的时候并不会很死板的只生成训练数据对应的样式

1. 本文的方法

对于一幅图片 I,我们的目标是产生以视觉信息为基础的描述y=y1,y2,...,yty={y_1,y_2,...,y_t},用RI=r1,...rNR_I = {r_1,...r_N}为从图片I中提取的N个图片区域的特征,这是一个标准的有监督学习任务,如下公式也非常容易理解,就是在已知图片特征和句子描述的情况下,求下面这个极大似然概率的极大值。
Image Caption:neural baby talk
将上面的公式展开
Image Caption:neural baby talk
t时刻的单词都要由前面的t-1个时刻的单词生成,我们将图片的特征向量rtr_t作为一个隐变量,将上式子变成
Image Caption:neural baby talk
这个式子明显有问题,将公式右端打开,变成
p(yt,rt,y1:t1,I)/p(rt,y1:t1,I)p(rt,y1:t1,I)/p(y1:t1,I)p(y_t,r_t, y_{1:t-1}, I)/p(r_t,y_{1:t-1},I)*p(r_t,y_{1:t-1},I)/p(y_{1:t-1},I)
很显然,式子约掉后变成
p(yt,rt,y1:t1,I)/p(y1:t1,I)=p(yt,rty1:t1,I)p(y_t,r_t, y_{1:t-1}, I)/p(y_{1:t-1},I)=p(y_t,r_t|y_{1:t-1},I)
明显与原来公式不等,但是在这里只能说不要在意这些细节,只要实验效果好就行。
yty_t分为两种,上文已经说过了,textual word和visual word分别用ytxt,yvisy^{txt},y^{vis}表示
下面讨论一下细节

2. “slotted”描述模板的产生

Image Caption:neural baby talk
对于一张给定的图片I和对应的描述y,首先将图片放入faster rcnn进行特征提取,然后为例产生“句子模板”,我们使用循环神经网络,在生成句子的每一个时间t,要计算hth_{t}需要利用ht1xth_{t-1}和x_t,如公式ht=RNN(xt,ht1)h_t=RNN(x_t,h_{t-1})。和常规的机器翻译一样,在训练的时候xtx_t是这一时刻句子的输入,而在测试的时候,t时刻的输入是t-1时刻的输出,xt=yt1x_t=y_{t-1},我们的decoder也利用了attention机制,但是这个attenion机制分为两部分,第一部分是针对图像特征区域的特征向量,这部分只用到了图像的特征向量对应于机器翻译的Encoder是我们利用faster rcnn的特征提取,因此需要attention的东西是vtrtv_t,它是r_t的向量表示,利用特征向量计算当前RNN的ct,htc_t,h_t,第二部分是将v1,,,vN,stv_1,,,v_N,s_t相结合起来,来计算是属于visual word还是context word。
Image Caption:neural baby talk
Image Caption:neural baby talk
这个公式就是VV的attention得到的一个分布,其实就是每个viv_i的权重的向量表示。根据总体结构图,利用PrItP^t_{rI}可以计算得到当前时刻的ht,cth_t,c_t,同时我们还要根据图像得到sts_t,显然是用来和ytxty^{txt}相对应的生成textual word,也就是下图的这一部分,我们称之为visual sentinel。
Image Caption:neural baby talk
关于sts_t分为两部分来看

  1. 如何得到sts_t
  2. 加入这部分后,如何计算attention

得到sts_t
Image Caption:neural baby talk
如上公式所示,要利用当前的输入xtx_t和上一时刻的隐藏状态ht1h_{t-1}计算得到gtg_t,然后利用当前时刻的rnn的长期状态ctc_t计算得到sts_t

加入这部分后计算attention
Image Caption:neural baby talk
也就相当于在原来的图像特征attentionPrItP^t_{rI}后多加了一个维度

经过上述过程计算得到attentionPrtP^t_r

  1. 然后根据PrtP^t_r的权重进行计算,是生成visual word还是textual word
  2. 然后结合RNN计算得到这一时刻的隐状态hth_t,并利用这个东西计算textual word
  3. 这个地方要注意,根据这张图,textual word一定是会产生的,但是visual word不一定会产生, 要根据PrtP^t_r的结果进行判定,如果需要生成visual word 那么需要结合PttxtP^t_txt
    对生产的visual word 有两种额外的操作:
  4. 生成的visual 单词进行形式判定,比如说单复数形式
  5. 不同的称呼,比如说判定为“dog”,但在实际中称呼其为“puppy”

3. 损失函数

如下图,损失函数分为三部分,我们分开来说

  1. 上一部分是textual word的损失函数,作者的意思是,根据y1:t1y^*_{1:t-1}来计算出要选择的区域特征r r^~的可能性,然后根据这一部分预测出的yt=yty_t=y^*_t的概率
  2. 第二部分是vitual word的损失函数,后半部分是计算目标区域的平均可能性
  3. 第三部分是根据所有特征区域和之前的所有上下文单词,计算t时刻找到合适单词单复数形式,符合语义词语的可能性
    注意应该让所有的这三部分可能性越大越好 ,于是在最前面加了一个符号“-”,满足损失函数的形式
    Image Caption:neural baby talk