[Image Caption系列(1)] Show attend and tell论文解读

最近在研究关于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任务提供了新的思路,并一直沿用至今。
好了废话不多说了,先看一下这篇论文提出的方法的整体架构:

[Image Caption系列(1)] Show attend and tell论文解读_第1张图片
可以看出整个Caption的生成流程主要分为两个步骤:(1)CNN提取特征;(2)带有Attention机制的RNN解码特征。这种流程又称为Encoder-Decoder模型,该模型最早用于NLP的机器翻译任务中,后面广泛的应用于机器翻译、语音识别以及我们这里的Image Caption任务中。其实总结的来看,这类任务都有一个共性,就是将一种信息的表达形式转换为另外一种信息的表达形式,比如机器翻译是将一种语言翻译(如中文)翻译成另外一种语言(如英文);语音识别则是将语音信息转换为文本信息;而Image Caption任务则是将图像信息转换为文本信息。因此Encoder-Decoder模型的思想在这些任务中都是通用的。 回到论文的内容中,这篇论文首创性的将带有Attention机制的Encoder-Decoder模型引入到Image Caption任务中,其主要部分也就分为编码器、Attention机制和解码器。下面我们来大略介绍一下这三个部分

编码器(Encoder)

说道跟图像或视频相关的深度神经网络大家肯定最先想到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},aiRD
其中 D D D维提取的特征图的维度, a i \bm{a_i} ai表示的是最终提取的特征图的一个像素点对应的 D D D维特征向量, L = H ∗ W L=H*W L=HW H H H W W W分别表示特征图的高度和宽度。

Attention机制

Attention机制跟人眼的注意力机制很像,当我们在观察一个东西的时候,是关注这个东西,视野中其他的部分就会忽略掉,Attention机制做的是生成一组权重,对需要关注的部分给予较高的权重,对不需要关注的部分给予较低的权重。

[Image Caption系列(1)] Show attend and tell论文解读_第2张图片
如图所示,当生成某个特定的单词时,Attention给出的权重较高的部分会在图像中该单词对应的特定区域,即该单词主要是由这片区域对应的特征生成的。 在Show,attend and tell一文中介绍了两种Attention方式:hard attention和soft attention。由于hard attention数学推导相对比较复杂而且根据我调研到的结果hard attention应用较少,这里只介绍soft 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,ht1) α 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}} ht1为上一时刻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(W1ht1+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=1Lαtiai值得注意的是,这个操作将不管多大的特征图全部转换为同一维度的向量(因为这里把一张特征图压缩为一个像素,但是维度即channels不变,即若得到的特征图大小为 H ∗ W ∗ C H*W*C HWC则得到的 c t c_t ct 1 ∗ C 1*C 1C C C C维向量),这样才能把Encoder和Decoder连接起来。

解码器(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(yt1,ht1,ct)=softmax(Wot)其中 o t o_{t} ot为LSTM或GRU在时刻 t t t的输出结果, y t − 1 \bm{y_{t-1}} yt1为上一时刻的识别结果(测试时)或上一时刻的ground-truth,注意这里 y t − 1 \bm{y_{t-1}} yt1不一定真的是单词的One-hot向量,有可能是经过词嵌入后的词向量。


  1. 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 ↩︎

你可能感兴趣的:(Image,Caption,Image,Caption,深度学习)