本文主要是介绍【文献阅读】VQA入门——Tips and Tricks for Visual Question Answering: Learnings from the 2017 Challenge,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本人在读研一,想要学习多模态这一块的工作。我在这里记录下我看的第一篇论文《Tips and Tricks for Visual Question Answering: Learnings from the 2017 Challenge》的看后总结。若有不当之处,请斧正!
论文地址:https://arxiv.org/abs/1708.02711
在介绍论文之前,先给大家讲一下什么叫做VQA
VQA
全称叫做Visual Question Answer,大家翻译过来应该是视觉-问题-答案。其实在我理解,VQA是个很大的范围,它的大体应该是:给一张图片和一个与该图片相关的文字问题,计算机能产生一个正确的回答。 显然,这是一个典型的多模态问题。
这里提一嘴什么叫做多模态。
可以把我们人能搜集到信息的一种方式,叫做一种模态。什么意思呢?比如说,我们人有视觉、味觉、听觉等等,那么它们每一种单拎出来都可以称叫一种模态,那啥叫多模态,就是好几种感觉嘛!
那我们对他们做一个融合,就叫做多模态融合。VQA任务其实就是把图片和文字进行了一个融合。
视觉问题回答(VQA)的任务包括一个图像和一个相关的文本问题,机器必须确定正确的答案。这个任务应该是属于cv领域、nlp领域和AI领域的交叉点。
拿作者论文里提的东西举栗子~
看上面的第一张图,你看这个咖啡桌上面有什么呀! 答:蜡烛
看上面的第二张图,你看那个消防栓啥颜色! 答:黄色+黑色
看上面的第三张图,你看床上有啥! 答:书
看上面的第四张图,那个长长的棍子是干嘛的! 答:用来打马的
所以啊,我们总结任务:
我们给计算机一张图片,然后对计算机提一个与给计算机的图片一个相关问题,需要计算机给我们一个correct answer!
首先,本篇论文是作者在2017年VQA挑战赛中获得了第一名后写下的。作者提出了一个相对简单的VQA模型,可获得最先进的结果。它基于深度神经网络(DNN),实现了众所周知的联合嵌入方法。作者在此模型的基础之上,对架构和超参数的细节都精心操作,以在VQA v2(一个数据集)基准测试上获得best performance。
那么作者写这篇论文的目的是分享一个成功的VQA模型的细节。
在论文的开头,作者先对自己的论文做了一个Summary of findings。这里避免翻译问题,我先拿原文复制啦!
1.Summary of findings
- Using a sigmoid output that allows multiple correct answers per question, instead of a common single-label softmax.
- Using soft scores as ground truth targets that cast the task as a
regression of scores for candidate answers, instead of a traditional classification. - Using gated tanh activations in all non-linear layers.
- Using image features from bottom-up attention that provide
region-specific features, instead of traditional grid-like feature
maps from a CNN. - Using pretrained representations of candidate answers to initialize the weights of the output layer.
- Using large mini-batches and smart shuffling of training data during stochastic gradient descent.
那么我是不建议大家直接看这个总结的,因为我也是VQA任务的初级学徒,初级学徒直接看这个总结是有点看不懂的。所以大家往👇看!
2.Background
那么在这个部分,作者说VQA现在有越来越多的人对它感兴趣。VQA这个任务的难度在哪。
尽管这项任务跨越了cv和nlp领域,但它主要是前者的焦点。深度视觉理解本身被认为是计算机视觉的首要目标。
在介绍完了一些基本信息后,作者开始讨论数据集了。我们知道,一个VQA模型,如果没有数据集,就是无稽之谈说训练什么模型啊啥的,你又不是做zero-shot或者few-shot啥的。
作者在论文中说:
The VQA-real dataset of Antol et al… has served as the de factobenchmark since its introduction in 2015.
也就是说,在本文发表之前,有个数据集叫做VQA-real的,是VQA领域数据集的一个benchmark。但是呢,随着现在硬件、互联网的飞速发展,就有个问题出现在我们的面前:我们做模型其实就是为了最后的结果服务,但是如果 我们让计算机背问题答案,这样性能不就能达到理论的100%?
当然不可以这么做!我们做VQA任务是希望计算机自己能够拥有推理的能力,如果说你死记硬背就能得到高分了,那你就不在我们的衡量范围之内。
举个栗子:
在期末考试前三天,我提前把考试题目和答案都告诉你了,你开心坏了,在那疯狂背诵,那你期末考试得分就会很高。作者想要训练的模型是: 期末考试的题是你之前复习过的题库中的变形 ,就好比咱们高考一样,在那疯狂刷卷子,脑袋瓜在悄悄训练“模型”,然后在高考的考场上,让这个“模型”能够“预测”出结果。
因此,作者提出了一个数据集,叫做VQA v2,论文里对数据集的描述是这样的:It associates two images to every question. Crucially, the two images are chosen so as to each lead to different answers.其实翻译过来的意思就是, 这个数据集里面的每一个问题,都适配两张不同的图,得出两张不一样的答案 。怕你们听不懂,下面附了一张图:
我给你一个问题哈~,Who is wearing white clothes?
那么这个问题对于第一张图来说,应该是woman;对于第二张图来说,就是man
这就是 这个数据集里面的每一个问题,都适配两张不同的图,得出两张不一样的答案. 这句话的意思~
用这个dataset后,这个模型训练出来就很明显,是不鼓励“瞎猜”这种办法的。那么这个dataset也是本文的一个非常重要的一个base。
此外,作者还引用了一个数据集Visual Genome,那么下面我就把他简称为VG。作者在这里是这么描述VG dataset的:
This multipurpose dataset contains annotations of images in the form of scene graphs. Those constitute fine-grained descriptions of the image contents. They provide a set of visual elements appearing in the scene (e.g. objects, persons), together with their attributes (e.g. color, appearance) and the relations between them. We do not use these annotations directly, but they serve in [3] to train a Faster R-CNN model
简单来说,这个数据集主要是用在Faster-RCNN这个模型上进行训练,这个数据集里有图片的展示,有图片所对应的文本的描述(包括颜色、外观、物体、人等等一些属性),这个数据集的作用就是:
直接使用VG dataset的注释(与图像相关的问题)。与VQA v2的问题相比,VG dataset 里的问题有更多样化的公式和更多样化的答案。但此数据集的答案一般来说也很长,即短语,而VQA v2这个数据集中的大多数答案通常只有1到3个单词长。我们在这里只使用答案与VQA v2中的答案重叠的问题子集。
作者提出:
The prevailing approach to VQA is based on three components:
- Posing question answering as a classification problem.
- a deep neural network that implements a joint embedding model,
- trained end-to-end with supervision of example questions/answers.
敲重点👇!!!
3.Architect Model
那么这是整个文章的一个骨架,我将把它们拆开来跟大家分享。
3.1Question Embedding
首先,每个实例的输入都是一个Question和一张image。它俩是一一对应的。在Question这里,问题要将其标记化。
举个栗子。What is your name?那么这里会把它拆成4个部分,即 What is your name 这里要注意,输入的Question是通过:使用空格和标点符号分成单词,然后对每个单词标记化,我们也将之称为一个个的token。这个token在nlp里面的意思就是可拆分的最小单元。作者在paper中提到:
- 任何数字或者以数字为基础的单词,比如说10000或2:15pm,也被认为是单词。
- 为了提高计算效率,对输入的问题长度进行限制,每个问题的最大长度为14个单词。超过14个单词的Question会把超过的部分直接丢弃。不足14个单词的Question会使用补0操作。
- 每个单词都会转换成一个带有查找表的向量表示。这个查找表的条目是在训练过程中根据其他参数学习到的300维向量。而这些向量是通过使用Glove词嵌入的方式进行初始化的。 这里看不懂Glove的,可以点此👈跳转到Glove相关知识。
然后作者把输入的Question通过词嵌入(Word Embedding)的方式进行保存后,把它放入到了GRU模型进行自然语言的文本特征提取。
笔者建议读者,如果看到这里,最好先看一下RNN和LSTM的一些相关知识。因为在论文读者发表论文的时候,Transformer是没有出来的,但是为何这个模型不使用RNN或是LSTM?GRU模型又解决了哪些新的东西呢?我觉得这个需要大家自行去学习。
通过GRU模型后得出的结果就是输入的Question做了文本特征提取后的一个结果,这个结果里包含了输入的Question的文本特征。
3.2 Image features
首先,作者输入了一张image,然后计算机通过一个CNN来获得大小为K × 2048的向量表示,这个K是图像位置的数量。每一个位置都是由一个2048维的向量做标示。
上面这句话这么理解。首先用一张图片,然后我们对这张图片要做特征提取的操作。那么这里要注意的是,作者使用到了Faster R-CNN模型,这个模型中有一个名字叫做RPN,也就是Region Proposal Network,即区域提取网络,用这个神经网络,可以将一张图片上需要标记的特征区域全部框选出来。那么框选多少个呢,作者说是K个。然后对每一个框设置一个假如是32 × 64的一个区域,这样每个框的维度给他拉成一维向量,就是2048了。
作者在Image feature这一块,使用了a standard pretrained CNN, or a better-performing option,这个better-performing就是based on a ResNet CNN within a Faster R-CNN framework。它把ResNet CNN网络融入到了Faster R-CNN里。如果你没看懂,那么你需要补充一下残差网络,也就是ResNet的概念。
说了这么多,总结这一块就是:输入一张image,然后通过一个network,把它变成所对应图片的一个image feature。
3.3 Image attention
在这个部分,作者我们的模型实现了一个经典的问题引导的注意力机制,这是大多数现代VQA模型常见的一种机制。作者将之称为top-bottom attention。
其实在图片和文本各自经过自己的embedding后,它们都会转化为各自的一种向量表示形式。然后在这里要做的事情就是把它们做融合。那么怎么融合呢?
其实在VQA里面最重要的事情就是让图片特征与文本特征对齐。在这里作者用top-bottom attention的主要原因就是希望图片和文本“融合”起来。
注意: 这里有个东西要注意,就是在前面有个bottom-up attention。我们可以理解成,使用 bottom-up attention 能够把一张图的特征进行抽取出来。而后面的top-down attention,要理解成:在预测图片的时候,输入一张image,然后把待预测的image features抽取出来,然后用这个待预测的Image features放到上图所框的部分里。top-down attention机制就是引导机制。让image features去找到其所对应的答案。
作者在此用了三个函数,来代表把图像和答案进行了融合。
先说一下变量的含义:
Vi代表图像中的特征向量
q:问题嵌入
fa:非线性层
αi与该位置相关的标量注意权重
wa是一个习得的参数向量
对于每个位置i = 1,2,3…的图像中特征向量vi与图像对应的问题嵌入q进行拼接。然后经过非线性层fa,以获得与该位置相关的标量注意权重αi。其中Wa为学习参数向量。使用softmax函数对所有位置的注意力权重进行归一化。然后,所有位置的图像特征通过归一化值进行加权并求和,以获得代表所关注图像的单个2048大小的矢量v-head。
3.4 Multimodal fusion
这个部分就是上面说的融合了。怎么把image-features和text-features融合在一起呢?
作者在这里使用的融合函数:
问题(q)和图像(v)的表示形式通过非线性层f()传递,然后把两个用点乘结合:h = fq(q)◦fv(v)
得到的向量h被称为问题和图像的联合嵌入,然后被馈送到输出分类器。
这里说一下哦:阿达玛乘积 = 元素乘法
3.5 output classifier
那么因为在 VQA-v2 数据集中,由于数据采集自不同的人,不同人对同一张图片有的时候意见也会不同的!所以同一张图片同一个问题可能会有多个答案。基于此事实,模型使用的是软分类的思路,并没有像以前做这种多选一的分类问题,而是转换成了 multi-label 分类问题。
候选答案由训练集中所有出现8次以上的正确答案而预先确定的,候选答案的个数为N=3129,数据集中每个训练问题都与一个或多个正确答案有联系,每个答案都被标签为一个标签类别,所有标签类别都被标注为0-1之间的一个概率值(soft score)。原本的 softmax 层被改为了 sigmoid 层。因此,最后的网络输出给了每个答案一个 0-1 的分数。每个答案的 accuracy 是 0-1,所以本文使用了 soft target score。这个概率值也将作为下面的ground-truth S。
这个多标签分类器和前面的嵌入h一起输入到非线性层中,最后再通过一个线性预测得到最终得分
h就是前面的multimodal的结果,W0是一个线性映射
Sigmoid输出允许对每个问题的多个正确答案进行优化。使用Soft score作为ground truth比二元目标提供更丰富的训练信号。经过sigmoid激活函数,得到预测分数S-hat。因为这里是二分类损失函数为二元交叉熵损失函数,具体公式如下:
这个其实还好理解,上图中h就是在3.4小节里最后融合的一个结果。
这里要提一嘴,在接下来的函数里,若没有特别声明,f()的形式,其作用都是进行映射转换。因为矩阵的乘法要满足规律的!n行m列的矩阵,要跟m行k列的矩阵才能相乘!
上面这个公式就是典型的二分类的交叉熵loss。这个不懂的话要去复习一下机器学习算法哦~~
好啦本篇重点都在上头!大家自行阅读啦~
感谢阅读!
这篇关于【文献阅读】VQA入门——Tips and Tricks for Visual Question Answering: Learnings from the 2017 Challenge的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!