一、背景
文章题目:《Stacked Attention Networks for Image Question Answering》
这是2015年的一篇文章,文章比较早,但是比较经典,后面做的很多文章都有过和这个模型的比较。
文章下载地址:https://arxiv.org/pdf/1511.02274.pdf
文章引用格式:Z. Yang, X. He, J. Gao, L. Deng, A. Smola. "Stacked Attention Networks for Image Question Answering
." arXiv, 2015
项目地址:https://github.com/TingAnChien/san-vqa-tensorflow (tensorflow写的)
二、文章导读
文章的摘要部分:
This paper presents stacked attention networks (SANs) that learn to answer natural language questions from images. SANs use semantic representation of a question as query to search for the regions in an image that are related to the answer. We argue that image question answering (QA) often requires multiple steps of reasoning. Thus, we develop a multiple-layer SAN in which we query an image multiple times to infer the answer progressively.Experiments conducted on four image QA data sets demonstrate that the proposed SANs significantly outperform previous state-of-the-art approaches. The visualization of the attention layers illustrates the progress that the SAN locates the relevant visual clues that lead to the answer of the question layer-by-layer.
本文提出了一种SAN网络,以学习如何从图像中回答自然问题。SAN使用问题的语义表示,将其作为一个query,查找图像中和答案相关的区域。作者指出QA一般需要多层推理。因此,作者采用多层SAN来多次query一张图像,以推断最有可能的答案。实验在4个数据集上进行,结果表明SAN的表现明显比之前的方法要好。注意力层的可视化表明,进步之处在于SAN能够定位到视觉线索,从而指向问题的答案。
三、文章详细介绍
目前大多数的VQA都基于神经网络来做。用CNN提取图像特征,用LSTM编码问题特征,然后结合两种特征来推断答案。但是通过对数据集的研究,作者发现,根据图像来回答一个问题往往需要多步推理,比如下图所显示的,图像中的目标包含自行车,窗户,街道,篮子和狗,为了回答问题“什么坐在自行车的篮子里?”,我们首先需要定位出这些目标,和问题中的关键概念(坐在),然后排除掉(rule out)不相关的物体,最后再指出最有可能是答案的区域:
这篇文章中作者提出SAN网络,以进行多步推理过程,SAN网络可以视为是注意力机制的拓展,它的网络结构如下所示:
SAN网络结构主要由3部分构成:(1)图像模型,采用CNN来提取高级图像特征表示(2)问题模型,使用CNN或者LSTM来提取问题的语义向量(3)堆叠注意力模型(stacked attention model),通过多步推理来获得最终答案。
正如上图的结构所示,在第一个注意力层中,先用问题向量来query视觉向量,然后在第二个注意力层中,将结果结合问题向量,再查询一次视觉向量,以获得更精准的query向量,高级注意力层会给出更尖锐的注意力分布,以聚焦于和答案有关的区域,最后我们将最高级注意力层中的图像特征和query向量结合,来预测正确答案。
这篇文章的主要贡献有3部分,包括:
(1)we propose a stacked attention network for image QA tasks. (提出了SAN网络)
(2)Second, we perform comprehensive evaluations on four image QA benchmarks, demonstrating that the proposed multiple-layer SAN outperforms previous state-of-the-art approaches by a substantial margin. (在4个数据集上进行了评估,结果表明SAN的结果更优)
(3)Third, we perform a detailed analysis where we visualize the outputs of different attention layers of the SAN and demonstrate the process that the SAN takes multiple steps to progressively focus the attention on the relevant visual clues that lead to the answer. (可视化SAN不同注意力层的输出结果)
1. 相关工作
2. SAN网络(Stacked Attention Networks (SANs))
重点来看一下模型部分,模型结构前面的图给出了,这里主要介绍一下模型中的三个模块。
(1)图像模型
前面说过,用CNN来提取图像特征,这里作者采用的是VGG模型,整个过程可以用下面的公式表示:
不同于其他模型采用最后几个层,这里作者采用了最后一个池化层,这样就能够保留原始图像的空间特征。先将图像resize成448*448的,然后通过VGG去除14*14*512的特征层,所以特征层的每一个像素,都代表了32*32的原图中的一个区域。因此图像的特征向量则有196个(14*14),记为fi,其中i介于[0,195]。
为了使得模型收敛,这里还采用了单层感知器,将特征向量转化成和问题向量具有相同维度的特征向量:
(2)问题模型
前面说到问题模型使用CNN或者LSTM都可以,所以这里会对两个模块都进行介绍。
首先是LSTM问题模型:
LSTM的本质就是一种能够记忆序列状态的记忆细胞,每一步的输入都是一个句子向量,LSTM中采用了门机制,包括输入门(控制有多少个当前输入来更新记忆细胞),遗忘门(控制有多少个状态信息保留),输出门(控制有多少信息输出到隐含状态)。用公式表示的结果如下:
我们给定一个问题向量q,q是one-hot格式表示,首先将q嵌入到向量空间中,然后我们再将嵌入的结果送入到LSTM当中:
其次是CNN模型:
用CNN于LSTM的思想类似,也是要先对问题做一个嵌入以得到问题的向量表示;然后使用卷积操作,这里的卷积器有三种,分别是unigram,bigram,trigram。第t次的卷积输出和最终得到的feature map则可表示为:
之后我们在得到的feature map上使用最大池化,并将三种不同尺寸的池化结果相连接,这一步可以表示为:
得到的这个h就是最终CNN提取的问题向量特征。整个过程用图表示如下:
(3)堆叠注意力网络
如果我们现在得到了图像特征Vi和问题特征Vq,那么就可以利用SAN进行多步的推理过程,很多情况下,答案只与图像中的很小一部分有关,因此使用全局图像特征来预测将会导致结果变差(这是由于其他不相关区域作为噪声对答案产生了影响)。因此设计了SAN,通过多步过滤噪声,使得答案更具有针对性。
具体操作就是先将这两个特征传到一个单层神经网络,然后再用一个softmax生成一个注意力分布:
基于注意力分布,我们可以重新计算图像向量的加权和,然后再将结果与问题向量相结合:
相较于直接结合问题特征和图像特征,注意力模型能够更准确的定位到与答案有关的区域,然而,对于复杂的问题,单层注意力层是不够的,因此采用多层注意力,第k层的注意力就可以表示为:
所以最终的向量就是与前一步的叠加:
重复上述步骤K次,那么最终用于推断答案的注意力则为:
3. 实验
(1)数据集
实验用到的数据集包括(这里就不对每个数据集详细介绍了):
DAQUAR-ALL
DAQUAR-REDUCED
COCO-QA
VQA
(2)流程和验证方法
这里参与比较的模型image QA,都是将问题的生成视为一个分类问题;评估采用Wu-Palmer similarity (WUPS) measure来测量单词之间(预测答案和真实答案)的相似性。
(3)模型配置和训练
提取图像特征作者使用的是VGG,提取最后一个池化层;词嵌入都用的500维的LSTM,对于CNN提取文本特征中的unigram, bigram and trigram三种size分别设置为128,256,256。
实验中的注意力层设置为2层,因为设置为3层或者更多层不会很明显的提高精度。
模型的训练使用随机梯度下降SGD,动量设置为0.9;batch size为100,;另外还使用了dropout。
(4)结果和分析
作者在4个数据集上的所有结果我就不全贴了,这里贴一个数据集的结果,其他三个和这个类似:
(5)注意力层的可视化
需要注意的是注意力的结果是14*14的,原图是448*448的,所以作者用了上采样,并结合了高斯滤波,是的注意力概率与原图大小一致而且比较平滑。这里作者给的样例很多,截取了几个:
(6)误差分析
作者随机采样了100张图片进行误差分析,发现误差可以分为以下几个方面:
①SAN的注意力定位到了错误的地方,22%
②SAN的注意力定位正确但是回答错误,42%
③答案不明确,但是注意力定位正确,给出的答案貌似正确,31%
④所有的都不对,5%
四、小结
这里给一个注意力的代码吧:
def compute_attention(self, image_tensor, question_tensor, out_dim, dropout=True):
img = tf.nn.tanh(tf.layers.dense(image_tensor, out_dim))
ques = tf.nn.tanh(tf.layers.dense(question_tensor, out_dim))
ques = tf.expand_dims(ques, axis=-2)
IQ = tf.nn.tanh(img + ques)
if dropout:
IQ = tf.nn.dropout(IQ, self.drop_out_rate)
temp = tf.layers.dense(IQ, 1)
temp = tf.reshape(temp, [-1, temp.shape[1]])
p = tf.nn.softmax(temp)
p_exp = tf.expand_dims(p, axis=-1)
att_layer = tf.reduce_sum(p_exp * image_tensor, axis=1)
final_out = att_layer + question_tensor
return p, final_out