《Multi-modal Factorized Bilinear Pooling with Co-Attention Learning for Visual Question Answering》笔记

版权声明:本文为博主原创文章,如未特别声明,均默认使用CC BY-SA 3.0许可。 https://blog.csdn.net/Geek_of_CSDN/article/details/81328487

专业调参20年。。。

这是ICCV2017上的一篇文章(文章链接),代码在github上的地址:链接,pytorch版本在这里

文章里面实现的模型结构示意图:

这里写图片描述

项目页的笔记:

要使用他们给出的代码的话就要先看下vqa-mcb项目里面的要求,因为代码是基于这个项目开发的。注意因为代码里面的MFB和MCB有点不同,所以caffe版本要用这里给出的,并且要在使用代码的时候禁用掉CuDNN(因为CuDNN还不支持sum pooling)。

重新训练模型

在官方给出的mfb-baselinemfb-coatt-glove文件夹里面就已经给出了所有训练会用到的脚本,只需要跑对应文件夹下面的train_*.py来训练就可以了。大部分超参数被定义在了config.py文件里面,solver配置被定义在了train_*.py脚本里面的get_solver函数里,预先训练好了的GloVe word embedding模型(spacy库,就是一个python的自然语言处理工具包)要用到mfb-coatt-glove模型,所以要训练这个模型后才可以使用(spacy和GloVe模型的安装方法可以在这里找到)。


论文里面的内容笔记:

简单翻译一下摘要:

摘要

VQA(visual question answering 图像问答)因为需要同时对图像信息和问题的信息进行理解而比较难解决。建立的模型的性能在很大程度上取决于怎么从问题中提取特征,怎么图像中进行细粒度信息提取需要的特征,以及怎么对这两种提取出来的特征进行整合。尽管各类基于双线性池化的模型在VQA问题上的表现优于传统的线性模型,但是由于这类模型的高维度特征(but their high-dimensional representations)及需要高复杂度的计算量,限制了这类模型的适用范围。作者设计出了Multi-modal Factorized Bilinear (MFB) 多模态分解双线性池化模型来高效地融合多模态的特征。作者设计的模型在VQA问题上相比于其他双线性池化模型有更加好的表现。在细粒度图像和问题特征上,作者用一种端对端你深度学习网络设计了一种“co-attention”(双重注意)机制,来实现同时在图像和问题上学习。最后,作者将MFB模型和双重注意学习结合成一个专门针对VQA开发的网络模型。作者的实验数据表明这种新的模型能够在现有的VQA数据集上拥有目前最优异的表现。


总结:团队设计的将MFB模型和co-attention机制结合后产生的新模型,在现有VQA上获得了目前最好的成绩。

扫描二维码关注公众号,回复: 3074436 查看本文章

引言

(下面只记录与团队工作有关的东西)

现有VQA解决步骤大概可以分成三步:

  1. 分别从图像和问题提取特征
  2. 将特征融合形成图像-问题特征
  3. 在融合的特征上训练分类器并以此预测出答案

绝大多数团队在多模态的特征融合上使用了线性模型,但是因为多模态不同特征之间的分布差异特别大,直接线性叠加或使用线性模型融合的话效果不会很好,融合出来的新特征也就没有办法找到图片和问题之间的联系。(这里就引出bilinear了)bilinear pooling现在被用在整合不同CNN网络生成的特征上,用来实现细粒度图像识别。但是这种方法会产生高维度特征,而且模型的参数很多,所以严重限制了它的适用范围。

Multi-modal Compact Bilinear (MCB)模型可以通过Tensor Sketch算法来有效减少模型的参数数量和计算时间。但是MCB模型需要输出高维度特征来保证鲁棒性,所以需要大量的内存空间,这样就限制了适用范围。

Multi-modal Low-rank Bilinear (MLB)模型是基于Hadamard product来融合两种特征的。MLB的输出具有相对低的维度,模型参数又少,简直不能再好(这句是贫僧加的,原文没有)。但是(反正有了这句“但是”前面再怎么吹都没用),对超参数敏感,收敛速度又慢,简直不能再烂(这句原文没有!)。

于是为了用1个模型实现2个愿望(MLB的低维度特征输出,MCB的输出鲁棒性),团队设计了Multi-model Factorized Bilinear pooling (MFB)。

特征提取上不会使用所有从图片里面得到的特征(因为可能会引入与问题不相关的信息),而是用了visual attention方法来选择与问题最相关的信息。同时与现在的大部分模型不同,作者的模型还考虑了对问题进行特征处理(因为问题本身可能含有方言/偏僻词这类可以当作噪音的信息)。最后作者在MFB基础上设计了co-attention learning模块(一种深度神经网络)来同时提取图像和文本的attention。


文章的贡献:

  1. 提出了MFB
  2. 在MFB基础上发展了co-attention
  3. 通过实验证明了normalization在bilinear模型起到了非常重要的作用

Multi-modal Factorized Bilinear Pooling

公式是这样的,假设 x R m ,就是假设 x 是图片的特征向量,而 y R n ,y属于问题的特征向量。那么bilinear pooling就可以定义为:

z i = x T W i y

上面出现的 W i R m × n 就是一个投影矩阵, z i R 是bilinear模型的输出。上面公式里面的 W 里面包含了偏置项,所以没有单独写出偏置项。需要通过训练 W = [ W i , , W o ] R m × n × o 来获得相应的 o 维的输出 z 。但是bilinear pooling有个问题就是因为引入了太多参数,可能会导致运算量过大或过拟合。

于是作者用了本来用在uni-modal data上的矩阵分解(matrix factorization)方法将上面的公式变成了这样(就是将投影矩阵分解成了2个低rank的矩阵):

z i = x T U i V i T y = d = 1 k x T u d v d T y = 1 T ( U i T x V i T y )

k 就是 U i = [ u 1 , , u k ] R m × k V i = [ v 1 , , v k ] R n × k 的维度, 就是Hadmard积,或者另个向量在元素层面上一一对应的乘积。 1 R k 就是全1向量。

为了得到上面这条公式的输出向量 z R o ,要学习的是两个3阶的向量 U = [ U 1 , , U o ] R m × k × o V = [ V 1 , , V d ] R n × k × o 对应的权重。可以在不影响鲁棒性的前提下将 U V 通过简单的reshape直接变形成2维的矩阵 U ~ R m × k o V ~ R n × k o 。这样上一条公式就可以重新写成:

z = S u m P o o l i n g ( U ~ T x V ~ T y , k )

上面这条公式里面的 S u m P o o l i n g ( x , k ) 表示用一个一维大小是k的没有重叠的窗口在输入的 x 上面进行sum pooling。这个模型被作者称为MFB。

上面的内容基本上可以用下面这个图片来代表一波:

这里写图片描述

上图就是MFB做的事情了,这种网络可以用常用的layer来实现,例如全连接、元素一一对应的积、和pooling层。上面的dropout曾是为了避免过拟合的,加载了元素积层后面。因为增加了元素积层,所以最后输出的神经元那里的值可能会有特别大的差异,这样就可能陷入到局部最优(具体的可以看看之前的CS231n笔记,里面提到过这种情况,通常为了避免这种情况都会引入正则化,避免某一个神经元对输出结果的影响太大)。所以添加了power normalization( z s i g n ( z ) | z | 0.5 )和L2正则层( z z z )在MFB的输出层后面。最后的结果可以看下图。

这里写图片描述

论文里面还提到了和MLB的关系,因为贫僧觉得不是很重要(不直接影响对项目代码的理解)所以就放在后面的补充环节了。

针对VQA设计的神经网络结构

VQA任务就是要回答一个关于一张图片的问题。神经网络会接受一张图片和一个关于这张图片的问题。作者设计的神经网络会从图片和问题中提取特征并通过MFB来整合这些含有多模态的特征,并将每一个潜在的回答作为一个class并通过multi-class分类里预测出最佳答案。后面会讲到两种神经网络结构,一种是MFB作为基础结构(baseline)并加上了MFB模块,用来进行ablation analysis,并通过输入不同的超参数来和其他基础结构进行比较;另一种在前一种的基础上加上了co-attention learning来同时学习图像和question attentions,目的是在细粒度层面上找到图像和问题之间的关联,以此达到更好的表述能力(representation capability)。

这里写图片描述

上图是以MFB为基础结构的神经网络结构。

MFB基础结构

作者先用152层的ResNet模型来提取图像特征,这个模型是在ImageNet数据库上预训练的。输入图片被重新变形成了 448 × 448 的大小。2084维的pool5特征(已经经过了L2正则化)被用作图片表述(image representation)。问题首先被tokenized(标记解释化)成词,然后被转成one-hot(贫僧的理解是这是一种编码)特征向量(网上的翻译是“实数向量”),这个向量的最大长度定义为 T 。这些one-hot vectors会先通过一个embedding层,然后喂到含有1024个隐藏神经元的两层结构的LSTM网络。LSTM的每层会针对每个单词输出一个1024维的特征。作者将每个LSTM神经网络的最后一个词的特征向量单独提取出,并将这两个特征向量连接起来,形成一个2048维的特征向量作为对问题的表述。预测答案的部分作者直接用了top- N 个最经常出现的答案作为 N 个类别,“因为他们符合长尾(long-tail)分布”。

提取出来的图片和问题特征会被喂入到MFB模块来生成融合后的特征 z 。最后 z 会被未入到一个用KL散度(KL-divergence)作为损失函数的 N 路分类器。这样,所有除了ResNet相关的权重以外的其他权重都会同时在端对端层面上同时被优化(因为受GPU显存限制所以ResNet相关权重除外)。整个网络结构可以表示成下图。

这里写图片描述

加上co-attention的MFB网络

为了解决同一张图片在不同问题下可能产生不同回答的问题,作者引入了image attention模型(图像注意力模型?),用来预测某一片图像中的spatial grid和问题的相关性。 14 × 14 (196)的image spatial grid(ResNet里的res5c feature maps)被用在了表述输入的图像上。然后用MCB来融合特征,196个图像特征中的每一个特征都要和对应的问题特征进行融合。融合之后就会进行特征transform(例如用 1 × 1 R e L U )和softmax正则化,来预测每个grid位置对应的attention权重。在得出的attention地图基础上,还要通过将spatial grid向量加权求和之后得到额外的attentional image features。同时要生成多个attention map来完善已经学习到乐的attention map,这些attention map会被连接在一起来输出多个attentional image feature。最后所有的attentional image feature会和问题特征通过MCB融合在一起,并预测出要输出的答案。

其实增加这个image attention模型的时候,作者是借鉴了别人的论文的(references中标号是6的那片论文)。那篇论文的说法是在模型中增加一个attention机制可以让模型更加有效地学习到与问题相关的图像区域,能够提升模型的回答准确率。而引用的这篇文章里面只注重图片attention,却忽略了问题的attention。所以作者设计出了co-attention学习方法,能够同时在问题和图像上训练attention。

所以作者这里的网络结构和引用的那篇文章里面的结构的区别就是在LSTM网络后面多添加了个问题attention模块来学习问题中每个单词的word的attention权重。作者这里的结构和别的针对VQA问题设计的co-attention结构不同的地方就是只是将图像模块和问题模块组合在了一起,并没有用图像特征来训练问题attention模块。这么设计是因为作者假设网络可以直接推测出问题的attention(就是问题的关键词),而不需要去看对应的图片(就像人一样,直接看问题就可以知道问题在问什么)。作者将这个网络命名为配有co-attention的MFB网络(MFB+CoAtt)。

补充

MFB和MLB的关系

最明显的关系就是名字不同(误)。其实就是MLB是MFB的特殊情况( k = 1 的时候),这个时候对应的是rank-1 factorization。MFB可以分成两个部分(如下图),第一个部分会把从不同模态提取的特征expand(展开?)到一个高维空间中并通过元素对应的积(就是元素一一对应地乘积,贫僧一下子不记得这个步骤叫什么了,原文是element-wise multiplication)来进行整合,之后再sum pooling,并进行正则化,将高维度特征挤压并输出挤压之后的特征。MLB直接将输入的特征投射到低维输出空间并进行element-wise multiplication。所以虽然输出的特征维度一样,但是MFB实际上比MLB更加鲁棒。

这里写图片描述

本博文的参考(不是论文的。。。)

机器学习、深度学习概念术语的理解
进一步接近人的智能:多模态机器学习
深度学习
什么是 ablation study?

猜你喜欢

转载自blog.csdn.net/Geek_of_CSDN/article/details/81328487