论文链接: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部分为根据图片产生的单词,精确的将单词填入其中
本文贡献:
- 提出了Neural baby talk,一个以视觉为基础的图像理解模型,清晰的定位图片中物体的位置,产生自由格式的自然语言描述
- 提出了一个两阶段方法,第一阶段产生句子模板,并产生一些空位置,第二阶段:根据图片产生的visual word联系上下文语义填入句子当中。
- 提出了一个健壮的图像理解算法,在测试时,该模型会遇到包含已知物体的图像,但图像的组合方式很新奇(例如,该模型在训练时看到过狗躺在沙发上,人坐在桌子上,而在测试的时候会生成狗在桌子上),测试的时候并不会很死板的只生成训练数据对应的样式
1. 本文的方法
对于一幅图片 I,我们的目标是产生以视觉信息为基础的描述
y
=
y
1
,
y
2
,
.
.
.
,
y
t
y={y_1,y_2,...,y_t}
y=y1,y2,...,yt,用
R
I
=
r
1
,
.
.
.
r
N
R_I = {r_1,...r_N}
RI=r1,...rN为从图片I中提取的N个图片区域的特征,这是一个标准的有监督学习任务,如下公式也非常容易理解,就是在已知图片特征和句子描述的情况下,求下面这个极大似然概率的极大值。
将上面的公式展开
t时刻的单词都要由前面的t-1个时刻的单词生成,我们将图片的特征向量
r
t
r_t
rt作为一个隐变量,将上式子变成
这个式子明显有问题,将公式右端打开,变成
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(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:t−1,I)/p(rt,y1:t−1,I)∗p(rt,y1:t−1,I)/p(y1:t−1,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
)
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)
p(yt,rt,y1:t−1,I)/p(y1:t−1,I)=p(yt,rt∣y1:t−1,I)
明显与原来公式不等,但是在这里只能说不要在意这些细节,只要实验效果好就行。
y
t
y_t
yt分为两种,上文已经说过了,textual word和visual word分别用
y
t
x
t
,
y
v
i
s
y^{txt},y^{vis}
ytxt,yvis表示
下面讨论一下细节
2. “slotted”描述模板的产生
对于一张给定的图片I和对应的描述y,首先将图片放入faster rcnn进行特征提取,然后为例产生“句子模板”,我们使用循环神经网络,在生成句子的每一个时间t,要计算
h
t
h_{t}
ht需要利用
h
t
−
1
和
x
t
h_{t-1}和x_t
ht−1和xt,如公式
h
t
=
R
N
N
(
x
t
,
h
t
−
1
)
h_t=RNN(x_t,h_{t-1})
ht=RNN(xt,ht−1)。和常规的机器翻译一样,在训练的时候
x
t
x_t
xt是这一时刻句子的输入,而在测试的时候,t时刻的输入是t-1时刻的输出,
x
t
=
y
t
−
1
x_t=y_{t-1}
xt=yt−1,我们的decoder也利用了attention机制,但是这个attenion机制分为两部分,第一部分是针对图像特征区域的特征向量,这部分只用到了图像的特征向量对应于机器翻译的Encoder是我们利用faster rcnn的特征提取,因此需要attention的东西是
v
t
,
它
是
r
t
v_t,它是r_t
vt,它是rt的向量表示,利用特征向量计算当前RNN的
c
t
,
h
t
c_t,h_t
ct,ht,第二部分是将
v
1
,
,
,
v
N
,
s
t
v_1,,,v_N,s_t
v1,,,vN,st相结合起来,来计算是属于visual word还是context word。
这个公式就是
V
V
V的attention得到的一个分布,其实就是每个
v
i
v_i
vi的权重的向量表示。根据总体结构图,利用
P
r
I
t
P^t_{rI}
PrIt可以计算得到当前时刻的
h
t
,
c
t
h_t,c_t
ht,ct,同时我们还要根据图像得到
s
t
s_t
st,显然是用来和
y
t
x
t
y^{txt}
ytxt相对应的生成textual word,也就是下图的这一部分,我们称之为visual sentinel。
关于
s
t
s_t
st分为两部分来看
- 如何得到 s t s_t st
- 加入这部分后,如何计算attention
得到
s
t
s_t
st
如上公式所示,要利用当前的输入
x
t
x_t
xt和上一时刻的隐藏状态
h
t
−
1
h_{t-1}
ht−1计算得到
g
t
g_t
gt,然后利用当前时刻的rnn的长期状态
c
t
c_t
ct计算得到
s
t
s_t
st
加入这部分后计算attention
也就相当于在原来的图像特征attention
P
r
I
t
P^t_{rI}
PrIt后多加了一个维度
经过上述过程计算得到attention P r t P^t_r Prt,
- 然后根据 P r t P^t_r Prt的权重进行计算,是生成visual word还是textual word
- 然后结合RNN计算得到这一时刻的隐状态 h t h_t ht,并利用这个东西计算textual word
- 这个地方要注意,根据这张图,textual word一定是会产生的,但是visual word不一定会产生, 要根据
P
r
t
P^t_r
Prt的结果进行判定,如果需要生成visual word 那么需要结合
P
t
t
x
t
P^t_txt
Pttxt
对生产的visual word 有两种额外的操作: - 生成的visual 单词进行形式判定,比如说单复数形式
- 不同的称呼,比如说判定为“dog”,但在实际中称呼其为“puppy”
3. 损失函数
如下图,损失函数分为三部分,我们分开来说
- 上一部分是textual word的损失函数,作者的意思是,根据 y 1 : t − 1 ∗ y^*_{1:t-1} y1:t−1∗来计算出要选择的区域特征 r r^~ r 的可能性,然后根据这一部分预测出的 y t = y t ∗ y_t=y^*_t yt=yt∗的概率
- 第二部分是vitual word的损失函数,后半部分是计算目标区域的平均可能性
- 第三部分是根据所有特征区域和之前的所有上下文单词,计算t时刻找到合适单词单复数形式,符合语义词语的可能性
注意应该让所有的这三部分可能性越大越好 ,于是在最前面加了一个符号“-”,满足损失函数的形式