《用于生成图像描述的深度视觉语义对齐》
年份:2015
作者:Andrej Karpathy & Li Fei-Fei
文章目录
一、概览
本文工作
1. 解决什么问题?
给定一张图片,为图片生成相应的描述语句。
2. 如何解决?
提出了两个模型:
1)Alignment model(为第二个模型做准备工作)
2)Multimodal Recurrent Neural Network model
Alignment model 用于寻找训练集图片中的图像区域和其描述语句的语句片段之间的潜在对应关系,该模型包含两个模块:
1)CNN 负责处理图像
2)RNN 负责建立序列模型
Multimodal Recurrent Neural Network model 用于实现最终目标,即输入整幅图片并为其生成描述(该模型在第一个模型推测出的对应关系上进行训练)。
二、基本思想
在 Introduction 中作者提到,在 image caption 任务上有一些先驱方法,但是他们依赖的是 硬编码视觉概念(hard-coded visual concepts)
和 语言模板(sentence templates)
,导致生成 caption 有多样性上的限制。而且这些先驱工作的重点放在 如何将复杂的视觉场景缩减到一个语句中
,在作者看来是没必要的。
所以本文的目的就在于 生成稠密(dense descriptions)的图片描述
。比如说下图中,对图片生成了许多 label ,同时生成了图像中各个子区域的语言描述,这就是稠密的图片描述。
由于图片的描述语句通常仅提到“有什么”,而不知道“在哪里”,所以作者提出将 imgae caption 数据集的描述语句看作 弱标签(weak labels)
,这些语句中有一些单词,对应了图片中一些特殊但位置未知的物体,那么我们就想如何 “对齐” 这些单词和物体(就像做连线题一样),然后再学习如何生成描述。
- 图像数据和其对应的语句描述作为模型的输入(左图)
- 模型学习推理子图像区域和其对应的语句片段(中图)
- 最后模型学习为图像生成一些描述语句(右图)
本文跟随R-CNN的方法进行region proposal和feature extraction,使用的是VGGNet,找出概率最大的19个Bounding Box,再加上原图一共20个regions,然后对于每一个标注中的单词寻找最匹配的region。
将每个region放进CNN并经将flattend feature maps过仿射变换得到固定的h-D vector;再将每个单词embedding后经过Bidirectional-RNN联系上下文得到h-D vector。然后一一遍历配对每个单词和region进行评分,评分函数如下图(表示看到region和word vector可以直接这么操作结合的时候惊呆了):
因为一个region对应一个word当然不行啊,而且word会毫无规律地分给region们,这样跑出来看不懂啊。于是又使用了MRF进行进一步的修正,使得每一个region可以对应一小句解释。
Loss function都有了,当然就可以进行训练啦,非常简单易懂的RNN,不多解释啦,值得注意的是,这里将图片输入RNN的时候是在公式中作为一个Bias项输入进去的,和其他模型有点不同。具体细节看图看公式看文章吧~
在最后,文章终于说了一幅图片出一句标注的方式,最普通的CNN+RNN,称之为full image experiments…好吧竟然是为了证明这个模型也可以生成一句完整的标注并且效果还不错哦。但是后面了,对全图进行标注会出现很多训练集中已经出现的词组,又是开头提到的多样化描述的问题。但是呢,如果按照前面说的步骤,对region进行提取和评分,那BLEU等score都会好得多。
在结尾部分,文章还提出了自己模型的局限性:
1、输入RNN的input demention固定了,可能会损失一些信息。
2、通过bias输入图像可能太简单了。
3、模型不是end-to-end的,操作起来太复杂。
1. 学习对齐图像和文本
由于最终的目标是看着图片生成描述语句,所以我们可以先学习图片和语句的一种潜在对应关系。
对齐图像和文本直观上就是在做连线题
输入:图片
和图片对应描述
的数据集
目标:找到图片区域的语句片段和物体间的潜在对应关系
举例:“Tabby cat is leaning” 对应 cat,“wooden table” 对应 table
(1)Representing images 表示图片
根据 AK 之前的工作,认为图像的描述语句通常与图片中的物体和物体的属性有关,所以仍然采用 RCNN 来检测图像中的物体,挑出 top 19 的 region 外加整幅图片来计算图像表示。
计算方法:根据每个 bounding box 的像素
I
b
I_b
Ib 将图像映射为向量
v
v
v:
v
=
W
m
[
C
N
N
θ
c
(
I
b
)
]
+
b
m
v=W_m[CNN_{\theta_c}(I_b)] + b_m
v=Wm[CNNθc(Ib)]+bm
- W m W_m Wm 是 ( h ∗ 4096 ) (h * 4096) (h∗4096) 维的矩阵, h h h 是多模编码空间的大小,其实就是隐藏层神经元的个数,在实验中尝试了 1000 ~ 1600 这个范围的值
- C N N ( I b ) CNN(I_b) CNN(Ib) 将 bounding box 内的像素 I b I_b Ib 转换为分类前的全连接层的 ( 4096 ∗ 1 ) (4096 * 1) (4096∗1) 维 activations
- 所以每张图片就可以被表示为 h h h 维向量的集合 { v i ∣ i = 1 , . . , 20 } \{v_i|i=1,..,20\} {vi∣i=1,..,20}
- CNN 在 ImageNet 上进行了预训练,并在 200 类的 ImageNet Detection Challenge 上进行 fine-tuning
(2)Representing sentences 表示语句
为了建立两种模式间的内在对应关系,就希望将语句中的词也编码到图片区域所表示的
h
h
h 维空间中。
本文使用 双向循环神经网络 (Bidirectional Recurrent Neural Network,BRNN) [46]
来计算词的表示。
BRNN 输入 N 个词的序列(采用 one-hot 编码),将每个词转换成一个 h h h 维的向量。因为使用了词周围长度多变的上下文,所以词的表示得到了丰富。
用 t = 1... N t = 1...N t=1...N 表示词在语句中的位置,准确的 BRNN 公式如下:
x
t
=
W
w
I
t
x_t=W_w\ \mathbb I_t
xt=Ww It
e
t
=
f
(
W
e
x
t
+
b
e
)
e_t=f(W_e\ x_t+b_e)
et=f(We xt+be)
h
t
f
=
f
(
e
t
+
W
f
h
t
−
1
f
+
b
f
)
h^f_t=f(e_t+W_f\ h^f_{t-1}+b_f)
htf=f(et+Wf ht−1f+bf)
h
t
b
=
f
(
e
t
+
W
b
h
t
+
1
b
+
b
b
)
h^b_t=f(e_t+W_b\ h^b_{t+1}+b_b)
htb=f(et+Wb ht+1b+bb)
s
t
=
f
(
W
d
(
h
t
f
+
h
t
b
)
+
b
d
)
s_t=f(W_d(h^f_t+h^b_t)+b_d)
st=f(Wd(htf+htb)+bd)
- I t \mathbb I_t It 是单词的 one-hot 向量
- W w W_w Ww 是单词的编码矩阵
BRNN 包含两个独立的处理过程:
一个从左到右
h
t
f
h^f_t
htf
一个从右到左
h
t
b
h^b_t
htb
最终的
h
h
h 维表示
s
t
s_t
st 是一个关于位置 t 处的单词以及它周围的上下文的函数
3)Alignment objective 对齐目标
通过前两步,已经可以将每张图片和每条语句转化成一个公共的 h 维向量集合。
本文将 image-sentence 得分看成是独立的 region-word 得分的函数。
直观上看,如果一个单词对一个图片区域有较高的置信度,那么包含这个单词的 sentence-image 应该也有较高的匹配得分。
[24] 的模型将第
i
i
i 个图片区域和第
t
t
t 个单词的点积(dot product)
v
i
T
s
t
v_i^T s_t
viTst 看作相似度的度量,并使用它来进一步定义第
k
k
k 张图片和第
l
l
l 个句子之间的得分:
S
k
l
=
∑
t
∈
g
l
∑
i
∈
g
k
m
a
x
(
0
,
v
i
T
s
t
)
S_{kl}=\sum_{t \in g_l}\sum_{i \in g_k}max(0,v_i^Ts_t)
Skl=t∈gl∑i∈gk∑max(0,viTst)
- g k g_k gk 是第 k k k 张图片中的区域的集合
- g l g_l gl 是第 l l l 个语句中的语句片段的集合
- 下标 k k k, l l l 遍历训练集中的图像区域和语句片段
当得分
S
k
l
S_{kl}
Skl 为正时,表明语句片段和图像区域是对齐的。
将公式做简化,可以降低对额外目标及超参数的依赖,简化后的计算公式如下:
S
k
l
=
∑
t
∈
g
l
m
a
x
i
∈
g
k
v
i
T
s
t
S_{kl}=\sum_{t \in g_l}max_{i \in g_k}\ v_i^Ts_t
Skl=t∈gl∑maxi∈gk viTst
这里每一个单词
s
t
s_t
st 对其到唯一一个最佳的图像区域。假设
k
=
l
k=l
k=l 表示一对儿相对应的图像和句子,那么最终的 max-margin,结构化损失函数如下:
这个损失函数(目标函数)使对齐的 image-sentence pair,比非对齐的 pair 有更高的得分。
4)Decoding text segment alignments to images 解码文本片段对齐图像
可以将
v
i
T
s
t
v_i^Ts_t
viTst 看作是第
t
t
t 个单词描述图像中任何一个 bounding box 时未经正则化的
l
o
g
log
log 概率,但是我们感兴趣的是为图像生成一些文本片段,而非单个词汇,希望将连续的单词序列对齐到一个边框中。
注意:仅仅将每个单词独立地与它匹配得分最高的区域进行对齐是不够的,因为这会导致一个单词被分配到多个区域
为了解决这个问题,我们将真正的对齐看成 MRF(Markov Random Field)
里的隐变量(latent variables),其中相邻单词间的双向链接(binary interactions)表示对齐到同一个图像区域。
具体地,给定有 N 个单词的句子和有 M 个边界框的图像,针对 N 个单词 (
j
=
1...
N
j=1...N
j=1...N) 可以引入 M 个隐对齐变量(latent alignment variables)
:
a
j
∈
{
1...
M
}
a_j \in \{1...M\}
aj∈{1...M},沿着句子的顺序形成一个链式结构的 MRF:
E
(
a
)
=
∑
j
=
1...
N
ψ
j
U
(
a
j
)
+
∑
j
=
1...
N
−
1
ψ
j
B
(
a
j
,
a
j
+
1
)
(10)
E(a)=\sum_{j=1...N}\psi^U_j(a_j)+\sum_{j=1...N-1}\psi^B_j(a_j,a_{j+1}) \tag{10}
E(a)=j=1...N∑ψjU(aj)+j=1...N−1∑ψjB(aj,aj+1)(10)
ψ j U ( a j = t ) = v i T s t (11) \psi^U_j(a_j=t)=v_i^Ts_t \tag{11} ψjU(aj=t)=viTst(11)
ψ j B ( a j , a j + 1 ) = β I [ a j = a j + 1 ] (12) \psi^B_j(a_j,a_j+1)=\beta\mathbb I[a_j=a_{j+1}] \tag{12} ψjB(aj,aj+1)=βI[aj=aj+1](12)
- β \beta β是超参数
模型的输出是一个图片区域集合,每个用文本片段(text segments)标注。
2.2 多模 RNN 生成图片描述
问题在于:如何设计一个模型,使其能够为一张图片生成一个长度可变的语言序列。
RNN获取前一个 time step 中的单词,并定义句子中下一个单词的分布。RNN以图像信息为条件,START 和 END 是特殊的标记。
本文提出一种简单但高效的方法,将生成过程限定在输入图像的内容上。在训练过程中,多模 RNN 获取图像像素
i
i
i 和输入向量序列
(
x
1
,
.
.
.
,
x
t
)
(x_1,...,x_t)
(x1,...,xt),然后通过迭代
t
=
1
t=1
t=1 到
T
T
T 的递归关系来计算隐藏状态序列
(
h
1
,
.
.
.
,
h
t
)
(h_1,...,h_t)
(h1,...,ht) 和输出序列
(
y
1
,
.
.
.
,
y
t
)
(y_1,...,y_t)
(y1,...,yt)。递归关系如下:
b
v
=
W
h
i
[
C
N
N
θ
c
(
I
)
]
(13)
b_v=W_{hi}[CNN_{\theta_c}(I)] \tag{13}
bv=Whi[CNNθc(I)](13)
h t = f ( W h x x t + W t t h t − 1 + b h + I ( t = 1 ) ⨀ b v ) (14) h_t=f(W_{hx}x_t+W_{tt}h_{t-1}+b_h+\mathbb I(t=1)\bigodot b_v) \tag{14} ht=f(Whxxt+Wttht−1+bh+I(t=1)⨀bv)(14)
y t = s o f t m a x ( W o h h t + b o ) (15) y_t=softmax(W_{oh}h_t+b_o) \tag{15} yt=softmax(Wohht+bo)(15)
学习的参数包括:
W
h
i
,
W
h
x
,
W
h
h
,
W
o
h
,
x
i
,
b
h
,
b
o
W_{hi},W_{hx},W_{hh},W_{oh},x_i,b_h,b_o
Whi,Whx,Whh,Woh,xi,bh,bo
C
N
N
θ
c
CNN_{\theta_c}
CNNθc 是 CNN 的最后一层
输出向量
y
t
y_t
yt 代表了词典中单词的未经正则化的分布 log 概率,词典中包含了一个特殊的 END 词
仅仅只在 RNN 的第一次迭代中输入了图像的上下文向量
b
v
b_v
bv,因为经过实验发现,这样要比每次迭代都输入一次效果要好。
通过观察发现人们在写字的时候会频繁的涉及到图像中那些特殊的但是不知道具体位置的目标,我们希望找出这种潜在的关系,该部分分为四个阶段:1.图像表示。2.文本表示。3.图文对应(单词)。4.短语与图片对应。
与最早期的m-RNN等模型相比,本文要 leverage 每张训练图片和对应的标注,并找出它们的对应关系。
我们以前看到的标注都是简短的句子直接描述了一整幅图片的大体信息,对图片中的细节信息,比如包含的物体、动作等都基本上直接忽略,是直接从图像层面进行caption。但是这和我们理解图像时候的直观感受不一样啊,我们都是要先看图像中有什么,在做什么,才最终搞懂了他们在干什么。
Introduction部分有提到现在的模型对于标注数据依赖的太厉害了,生成多样化描述的语句是十分困难啊,那我们就要解决这个问题。先是将标注数据中的单词和图片中的具体物品相对应,把粒度做的更细;然后提出multi-model RNN来进行图片标注。
2.2.1 前向传播过程
(1)首先我们拿到一张测试图片
(2)将测试图片输入到 CNN 中
这里用的网络是 VGG,VGG 在最后一般会有 softmax 层给出可能性的分布,但是在这里不需要输出概率,所以删掉 softmax 层。
(3)将 CNN 网络与 RNN 网络进行连接,使得 RNN 网络有一个特殊的起始向量
图片输入 CNN 以后,CNN 认为它是类似于“稻草”的东西,这样 CNN 的输出通过与
W
i
h
W_{ih}
Wih 进行交互,使 RNN 的隐藏状态
h
0
h_0
h0 进入一个特殊状态,这种特殊状态中“稻草”一词的概率会有所上升,也就是说,稻草的纹理可以影响关于稻草的数值,结果就是 RNN 第一步的输出
y
0
y_0
y0 中关于稻草的数值会有所提高。
(4)
(5)
(6)
(7)
(8)
3. RCNN + BRNN
图像区域的卷积神经网络 + 句子的双向递归神经网络
图片表示:对19个检测出的候选框(物体)外加整张图片进行卷积操作:
v = W_m[CNN_{\theta_c}(I_b)]+b_m
CNN(I_b) 将 I_b 转变成4096维的向量,\theta_c 大概用6000万个参数,W_m 的维度是 h*4096 (h 在 1000-1600维之间),所以每张图片用20个 h 维的向量描述。
句子表示:将句子中的每个单词输入到BRNN中转成h维的向量:
首先用 word2vec 将单词转为300维的向量表示(实验中发现改动词向量会对在最终结果产生轻微影响)
然后将词向量输入BRNN中训练,实验中采用的隐藏层维度为 300 - 600 ,采用ReLU激活函数。如图3所示:
4. RNN 训练
RNN的训练是将当前word(xt)和之前的上下文(ht-1)结合在一起,去预测下一个word(yt)。
首先,设置h0=0’,x1设置为一个特殊的START向量,之后希望label Y1是序列中的第一个word。类似的,x2设置为第一个word的向量,希望输出label是第二个word。最终,在最后一步xt是最后一个word的时候,目标label希望是一个特殊的END词。代价函数是最大化Log概率。
5. RNN 预测
为了预测一个句子sentence,我们首先计算输入image的bv,设置h0=0’,x1为START向量,之后计算第一个词y1的概率分布,我们从分布中采样一个word(或者选择最大值),把第一个词的编码向量输入给x2,重复这个过程直到END词被采样到。在实验中我们发现beam search可以得到较好的效果。
三、优化
我们使用mini-batch SGD,batch大小是100(100个image-sentence对),momentum系数是0.9。交叉验证学习率和weight decay。我们同样在除了recurrent层之外的其他层使用了dropout归一化,clip gradients element wise at 5(important)(这句没有太理解就不写了)。由于在稀有词和常见词(如’a’和END词)之间的词频存在差距,生成式RNN模型调优的难度比较大。我们通过RMSprop[52]获得了最好的结果,它是一种自适应step大小的方法,采用梯度norm后的平均值来更新每个weight。