最近在研究关于Image Caption相关的东西,我打算把我看到的关于Image Caption的论文用一个系列介绍一下,本篇是第一篇。
说到近几年深度学习在Image Caption的应用,最经典的也是开山之作的就是Bengio团队在15年发表的Show, Attend and Tell: Neural Image Caption Generation with Visual Attention一文了,本篇介绍的就是这篇论文。
首先介绍一下Image Caption的任务,从任务标题可以看出这个任务是给图像加“字幕”,即描述图像中的内容,这与计算机视觉领域中的核心问题之一——场景理解非常相近,因此对Image Caption的研究比较有价值。早在深度学习兴起以前人们对Image Caption任务就已经开始了探索,以前人们的做法通常是先对图像中的物体进行定位和识别,然后根据语言模型生成句子(具体怎么做的我也不了解,因为现在这种做法已经被抛弃了,所以没有调研过),即使深度学习发展起来后人们还是简单的利用深度神经网络进行定位和识别(文中的Related Works),并没有在方法的架构上进行改进。Show attend and tell一文使用深度神经网络端到端的完成了Image Caption任务,给解决Image Caption任务提供了新的思路,并一直沿用至今。
好了废话不多说了,先看一下这篇论文提出的方法的整体架构:
说道跟图像或视频相关的深度神经网络大家肯定最先想到CNN,在Image Caption任务中也通常使用CNN作为编码器对图像进行特征提取(即编码为特征)。在Show attend and tell一文中使用的是经过预训练的VGGNet作为编码器提取图像的特征,可以得到一系列的特征向量 a a a如下所示:
a = { a 1 , . . . , a L } , a i ∈ R D a=\{\bm{a_1,...,a_L}\} , \bm{a_i} \in \mathbb{R}^D a={a1,...,aL},ai∈RD
其中 D D D维提取的特征图的维度, a i \bm{a_i} ai表示的是最终提取的特征图的一个像素点对应的 D D D维特征向量, L = H ∗ W L=H*W L=H∗W, H H H和 W W W分别表示特征图的高度和宽度。
Attention机制跟人眼的注意力机制很像,当我们在观察一个东西的时候,是关注这个东西,视野中其他的部分就会忽略掉,Attention机制做的是生成一组权重,对需要关注的部分给予较高的权重,对不需要关注的部分给予较低的权重。
根据前面的介绍Attention机制的作用就是生成一组权重,这里用 α t = { α t 0 , . . . , α t i , . . . , α t L } \alpha_t = \{\alpha_{t0},...,\alpha_{ti},...,\alpha_{tL}\} αt={αt0,...,αti,...,αtL}表示,其中 t t t表示时刻 t t t, i i i则表示 a i \bm{a_i} ai对应的权重,其生成过程如下:
e t i = f a t t ( a i , h t − 1 ) e_{ti}=f_{att}(\bm{a_i}, \bm{h_{t-1}}) eti=fatt(ai,ht−1) α t i = e x p ( e t i ) ∑ k = 1 L e x p ( e t k ) \alpha_{ti}=\frac{exp(e_{ti})}{\sum_{k=1}^{L}exp(e_{tk})} αti=∑k=1Lexp(etk)exp(eti)其中 h t − 1 \bm{h_{t-1}} ht−1为上一时刻Decoder得到的隐含向量; f a t t f_{att} fatt通常为一层神经网络,常用的一种映射关系为1 f a t t = β T t a n h ( W 1 h t − 1 + W 2 a i ) f_{att}=\beta^Ttanh(\bm{W_1h_{t-1}}+\bm{W_2a_i}) fatt=βTtanh(W1ht−1+W2ai)在得到 α t \alpha_{t} αt后即可得到一个上下文向量(一般称为contex vector,这里翻译成上下文向量) c t c_t ct: c t = ∑ i = 1 L α t i a i c_t = \sum_{i=1}^{L}\alpha_{ti}\bm{a_i} ct=i=1∑Lαtiai值得注意的是,这个操作将不管多大的特征图全部转换为同一维度的向量(因为这里把一张特征图压缩为一个像素,但是维度即channels不变,即若得到的特征图大小为 H ∗ W ∗ C H*W*C H∗W∗C则得到的 c t c_t ct为 1 ∗ C 1*C 1∗C即 C C C维向量),这样才能把Encoder和Decoder连接起来。
解码器一般常用的是LSTM或GRU,这里关于LSTM和GRU的内容就不详细介绍了,对于 t t t时刻的解码过程如下: f ( y t − 1 , h t − 1 , c t ) = s o f t m a x ( W o t ) f(y_{t-1},h_{t-1},c_{t}) = softmax(Wo_{t}) f(yt−1,ht−1,ct)=softmax(Wot)其中 o t o_{t} ot为LSTM或GRU在时刻 t t t的输出结果, y t − 1 \bm{y_{t-1}} yt−1为上一时刻的识别结果(测试时)或上一时刻的ground-truth,注意这里 y t − 1 \bm{y_{t-1}} yt−1不一定真的是单词的One-hot向量,有可能是经过词嵌入后的词向量。
LUONG M T, PHAM H, MANNING C D. Effective approaches to attention-based neural machine translation[C]// Proceedings of the Conference on Empirical Methods in Natural Language. 2015: 1412-1421 ↩︎