初次接触Captioning的问题,第一印象就是Andrej Karpathy好聪明。主要从他的两篇文章开始入门,《Deep Fragment Embeddings for Bidirectional Image Sentence Mapping》和《Deep Visual-Semantic Alignments for Generating Image Descriptions》。基本上,第一篇文章看明白了,第二篇就容易了,研究思路实际上是同样的。但确实,第二个模型的功能更强大一些,由于能够生成description了。网络
Deep Fragment Embeddings for Bidirectional Image Sentence Mapping:app
这篇论文发表在14年的NIPS上,主要解决的问题集中在retrieval的问题,没有生成description。仍是先介绍一下模型吧,如下这张图其实能够彻底归纳了函数
输入的数据集每个样例由一张图片,五个manual句子描述。性能
对于句子的处理,主要是处理单词之间的关系。相似于上图右边,解析出单词之间的依赖关系,叫作triplet ,R就是关系,而w1,w2就是单词的representation,是1-of-k的,经过如下的关系把triplet映射到一个非线性的空间,学习
s是h维的向量特征向量,f是一个激活函数,是对应的关系的矩阵,但它是须要学习的参数。
是经过训练获得的固定的参数矩阵,至于怎么获得的,我没有看过索引的论文,而源代码读入的数据直接使用了
,我就没有仔细研究。激活函数论文里使用了ReLU,而公开的源代码里提供了不少其余类型的函数,然而并无试跑过。那为何须要激活函数呢?我猜测大概是(未探究过正确与否)非线性的特征会有更好的拟合效果吧,联想到了深度学习里的激活函数。优化
对于图片的处理。使用RCNN,提取top 19个Region和一张全图做为特征。这里主要是提取最后一层的4096维的向量做为特征表示,通过如下式子映射到h维的特征空间中。RCNN网络结构能够进行微调,也能够不微调。在这里,须要学习的参数是
。spa
计算Image Fragment 和 sentence Fragment的类似度主要对两个特征向量进行内积运算。这就很粗暴了。这样计算类似度,看起来彷佛不太稳当,由于每个图片Region的向量貌似并不能找到一个标准,至少类似度做为一种距离,这里好像并无单位吧。可是,假如认为v和s在同一个特征空间的话,那么,一切都很顺其天然了,由于内积不就是夹角吗?还记得怎么定义希尔伯特空间的吗?3d
恩,对于两个模态的学习,找到一种方法把他们映射到同一特征空间很是重要。orm
最后一步就是定义损失函数了,这里加了一个正则化项,我看了代码对正则化怎么搞的理解又加深了,。blog
如今,怎么使得语义上使对应的fragment的变得类似很重要,这天然是经过学习参数了。AK首先用一种简单的方法,定义alignment目标函数为
当两种fragment出如今同一image-sentence pair中时,注意是image-sentence pair,就把y置为1,不然为 -1。是一个normalize项,具体能够看代码怎么实现的。经过这样简单的设置,不就使得当两种fragment出如今同一image-sentence pair中时,类似度朝着大于1的方向发展,不然朝着小于-1的方向发展了吗?由于式子前面有1减去,并且是一个max和0比较的。
可是,两种fragment出如今同一image-sentence pair中不表明他们就是相对应啊。注意,如下至关于提高性能吧,由于即使没有如下的multiple instance learning也是能够有结果的。由于,AK想到了一种方法,经过有约束的不等式求解,目标函数天然仍是最小化了,获得
这称为mi-SVM。太厉害了,他是怎么知道有这种方法的呢?限制条件要求参数y至少有一个值为+1。论文中使用了一种启发式求解的方法,毕竟直接优化看起来仍是很难的,具体的求解过程是对于y的值设置为,若是没有+1,就把内积最大的对应的y设为+1。
另外定义了一个global目标函数。首先计算整张图片和sentence的类似度,n是一个平滑项
Global目标函数主要与image和sentence对应的类似度做为比较。经过与所在的行和列比较,使得目标函数朝着令匹配的
比不匹配的
大
的方向优化。
最后优化时,使用的求导的链式法则。整个优化的过程使用SGD的方法。总的来讲,是参数的学习使得两种模态的信息能够对应起来。
实验评估的方法,实验数据集是随机选出句子与对应的图片。经过计算,并在每个句子对
进行排序,看最匹配图片的
出如今序列的位置,定义一个R@K,K表明位置,即在位置K之前出现最匹配图片的百分比,经过对此比较评估Retrieval的性能。
做者Andrej Karpathy的代码,我看的时候本身加了注释,放在这里共享吧,但愿对你有点帮助吧。http://pan.baidu.com/s/1i5M8xk5
Deep Visual-Semantic Alignments for Generating Image Descriptions:
这篇论文相对于上一篇Deep Fragment Embeddings for Bidirectional Image Sentence Mapping,是能够生成description了,并且retrieval也获得了提高。这里,句子中提取的再也不是dependency,而是首先对于每个单词都生成一个特征向量,这是经过双向的RNN(BRNN)生成的,由于RNN它其实包含了上下文的信息,因此认为是与整个句子的语义相关。是1-of-k的向量。RNN的函数以下
对于图片,依然使用的是RCNN的模型。并且,对于image和sentence对应的类似度计算方法也有所改变,,整个模型变成以下
以上模型经过训练以后,学习到的只是word与image的region的对应关系,这可能会使得邻近的单词(它们可能相关)被对应到不一样的label中。这里做者经过使用马尔科夫随机场来输出最佳的每一个word对应的region的序列。马尔科夫随机场对应的势函数为。而
是能量函数,注意前面是负值,要使得最后序列的几率最大,则能量函数应该尽可能小。因此,这里定义的能量函数的条件为,使用的是链式条件随机场的形式
对于后面一项,当两个先后的word分配同一个标注的时候,但愿能量函数为0(即尽可能小),不然为。可是对于第一项……暂时还没想明白,可能认为是固有的属性,因此直接加入。当
越大,意味着若是但愿能量函数越小,分配到同一个box的连续的word会趋向于更多。
以上其实解决的是latent alignment的问题。
以后,经过使用generator的RNN的生成captioning,这个比较容易理解,模型为
具体的计算过程为
其中输入的单词是,而不是
。其实这里个人疑问是,不输入
第一部分生成correspondence的意义在哪里呢?仅仅是为了alignment?感受挺奇怪的……