本文作者郑哲东,原载于知乎专栏(http://suo.im/1cHlTJ )。
[Title]:Dual-Path Convolutional Image-Text Embedding
[arXiv]:http://cn.arxiv.org/abs/1711.05535
[Code]:layumi/Image-Text-Embedding(http://suo.im/uGOPg )
Motivation
在这篇文章中我们尝试了 用 CNN 分类 113,287 类图像 (MSCOCO)。
Method
1. 对于自然语言描述,我们采用了相对不那么常用的 CNN 结构,而不是 LSTM 结构。
来并行训练,finetune 整个网络。结构如图。结构其实很简单。
对于 TextCNN,我们是用了类似 ResNet 的 block。注意到句子是一维的,在实际使用中,我们用的是 1X2 的 conv。
2. Instance loss。
我们注意到,最终的目的是让每一个图像都有区分 (discriminative) 的特征,自然语言描述也是。所以,为什么不尝试把每一张图像看成一类呢。(注意这个假设是无监督的,不需要任何标注。)
这种少样本的分类其实在之前做行人重识别就常用,但行人重识别(1467 类,每类 9.6 张图像,有人为 ID 的标注。)没有像我们这么极端。
Flickr30k:31,783 类 (1 图像 + 5 描述), 其中训练图像为 29,783 类
MSCOCO:123,287 类 (1 图像 + ~5 描述), 其中训练图像为 113,287 类
注意到 Flickr30k 中其实有挺多挺像的狗的图像。
不过我们仍旧将他们处理为不同的类,希望也能学到细粒度的差别。
(而对于 CUHK-PEDES,因为同一个人的描述都差不多。我们用的是同一个人看作一个类,所以每一类训练图片多一些。CUHK-PEDES 用了 ID annotation,而 MSCOCO 和 Flickr30k 我们是没有用的。)
3. 如何结合 文本和图像一起训练?
其实,文本和图像很容易各学各的,来做分类。所以我们需要一个限制,让他们映射到同一个高层语义空间。
我们采用了一个简单的方法:在最后分类 fc 前,让文本和图像使用一个 W,那么在 update 过程中会用一个软的约束,这就完成了(详见论文 4.2)。 在实验中我们发现光用这个 W 软约束,结果就很好了。(见论文中 StageI 的结果)
4. 训练收敛么?
收敛的。欢迎大家看代码。就是直接 softmax loss,没有 trick。
图像分类收敛的快一些。文本慢一些。在 Flickr30k 上,ImageCNN 收敛的快,
TextCNN 是重新开始学的,同时是 5 个训练样本,所以相对慢一些。
5. instance loss 是无监督的么?
instance loss 的假设是无监督的,因为我们没有用到额外的信息 (类别标注等等)。而是用了 “每张图就是一类” 这种信息。
6. 使用其他无监督方法,比如 kmeans 先聚类,能不能达到类似 instance loss 的结果?
我们尝试使用预训练 ResNet50 提取 pool5 特征,分别聚了 3000 和 10000 个类。
(聚类很慢,虽然开了多线程,聚 10000 个类花了 1 个多小时,当中还怕内存不足,死机。大家请慎重。)
在 MSCOCO 采用 instance loss 的结果更好一些。我们认为聚类其实没有解决,黑狗 / 灰狗 / 两条狗都是 狗,可能会忽略图像细节的问题。
7. 比结果的时候比较难。
因为大家的网络都不太相同(不公平),甚至 train/test 划分也不同(很多之前的论文都不注明,直接拿来比)。
所以在做表格的时候,我们尽量将所有方法都列了出来。注明不同 split。
尽量 VGG-19 和 VGG-19 来比, ResNet-152 和 ResNet-152 比。欢迎大家详见论文。
和我们这篇论文相关的,很多是鲁老师的工作,真的推荐大家去看。
8. 更深的 TextCNN 一定更好么?
这个问题是 Reviewer 提出的。
相关论文是 Do Convolutional Networks need to be Deep for Text Classification ?
确实,在我们额外的实验中也发现了这一点。在两个较大的数据集上,将文本那一路的 Res50 提升到 Res152 并没有显著提升。
9. 一些 trick(在其他任务可能不 work)
Results
我们尝试了从句子中移除一些词,看移除哪些对匹配 score 影响最大。
论文中可能细节说得还不是很清楚,欢迎看代码 / 交流。