论文地址:https://arxiv.org/pdf/1908.02265.pdf
相关源码:https://github.com/facebookresearch/vilbert-multi-task
ViLBERT是Vision-and-Language BERT的缩写,它源于2019年发表在NIPS(Advances in Neural Information Processing Systems)上的论文《ViLBERT: Pretraining Task-Agnostic Visiolinguistic Representations for Vision-and-Language Tasks》——预训练未知任务的视觉语言学表征。模型结合了图片和文本信息的特征,将BERT改造成双路结构,并通过co-attention方式交互。文中用大型的图像标题数据库训练通用模型,基于该模型进行少量调整即可实现按标题检索图片,视觉问答等具体任务。在2019年底,论文作者Jiasen Lu又发论文《12-in-1: Multi-Task Vision and Language Representation Learning》,展示了用十二个数据集训练更通用模型的情况。
文中借鉴了当前很多模型使用自监督的无标注数据学习的方法,尤其在自然语言中,抓取大量无标注数据,通过遮蔽其中部分信息,使模型实现自监督学习,使用该方法的BERT,GPT等模型都取得了很好的效果。作者也希望将该方法用到跨模态的模型之中,通过抓取网络上带有简单描述的图片进行训练,实现通用的高质量模型。
为了更好的使用文本、图片数据,并将二者相结合,作者设计了双路two-stream的模型,前期分别处理文字和图片,后期用co-attention将二者结合起来(实验部分对单/双路模型进行了对比)。
文中用两种任务训练模型:遮蔽部分图片区域和文中的词,根据上下文内容预测被遮蔽部分(BERT训练无标注数据的基本方法);以及预测文字与图片是否匹配。并在四个领域验证了模型,它们分别是:视觉问答、根据标题检索图片、看图识物、图片常识归因。
实现
BERT模型
BERT是基于Transformer的双向语言模型,它使用大量的无标注数据预训练,并在明显提高了多种自然语言处理任务的效果。
BERT的输入是token(简单理解为词),BERT网络由多个block块组成,每个block包括Attention模型,全连接层,和残差处理,其中每一块的内部结构如下图左侧所示:
最核心的模块是Multi-Head Attention模型,它根据上一个隐藏层h的输出计算V,K,Q,分别是queries, keys,和values,通过Q与K的关系,计算V的权重,由此实现了根据上下文信息给各个词加权。文中使用同样的原理,构建了右图中的结构,名为co-attention,即将图片中各区域的信息作为上下文给文本加权,或者根据文本上下文给图片区域加权。
BERT模型输入的文本由三部分构成:词嵌入(词义),位置(词在句中的位置),段信息(文本的功能)。BERT模型训练通常由两部分组成,遮蔽部分内容,并让模型计算遮蔽数据;以及具体的应用,比如判断前后两句的内容是否连续,句子的类别,两句描述的是否为同一内容等等。
ViLBERT
文中设计的ViLBERT模型与BERT模型类似,它的输入是图片和文字。
结合文字和图片最简单而直接的处理方式是将图片中的区域处理成类似词的形式,但是图像和文字之间存在一定差别,比如图中区域间的相关性小于词间的相关性,图片的输出一般已经经过了多层网络处理,最终大量网络权重的修改可能把预训练的网络带偏。于是文中将两个网络分开,只在小范围内结合二者的注意力交互。
如第一张结构图所示,双路结构的每个分支都由Transformer blocks(TRM)组成,并设计了一个结合两部分的Co-TRM,在两分支之间交换信息,图片的输入是v1…vt,文本的输入是w1…wt,输出是通过网络处理后的隐藏层hv1..hvt和hw1…hwt。从图中可以看到,图片特征直接送入Co-TRM,而文本特征多加了一层TRM,这是由于图片已经经过了深层网络的编码。
交互注意力层
Co-Attentional Transformer Layers的输入是图片隐藏层Hv和文本隐藏层Hw,与基础BERT模型不同的是其Key和Value交叉传递,用图片的上下文给文字加权,用文字的上下文给图片加权。
图像表示
模型先用Faster R-CNN模型从图像中提取多个目标区域的特征,由于图片特征不像文字特征一样含有位置信息,因此用5维数据给图片位置编码,它们分别是归一化之后左上角坐标,右下角坐标,以及面积。然后将其投影到匹配视觉特征的维度,并对其求和。
训练任务和目标
训练任务如上面所述包含遮蔽和匹配。
如图(a)中所示,遮蔽输入的15%,遮蔽的可能是图片,也可能是文字,用剩余部分对其进行预测,遮蔽图片时有90%的情况用0填充,10%的情况下该区域不变,模型根据语义预测图片区域的分布,使用最小化KL距离方法衡量预测的分布和真实分布的关系,这是由于语言常常能反应图片的高级语义,但无法描述精确的信息。
在匹配任务中,模型的输入是{IMG,v1, . . . , vT,CLS,w1, . . . , wT,SEP},当文字描述的是图片内容时,将hIMG和hCLS作为文字和图片的整体表示,计算hv与hw相乘的结果(点乘计算cosine距离)并学习一个线性层判断二者最终是否匹配,预训练的数据集中仅存在图片和标题对,因此将其它的标题与图片配对生成反例。
实验
训练模型
文使用Conceptual Captions数据集预训练模型,它从网上抓取了3.3 million的图片标题对,经过清洗处理后,使用了3.1 million个数据对。在文字处理方面使用预训练的BERT_base模型参数,在图像处理方面使用了以ResNet 101为backbone的Faster R-CNN识别目标区域并提取特征,用平均池化处理卷积层输出的数据。
具体应用
文中将预测训练的VILBert模型,用各个领域数据继续训练精调,应用于四个实际应用场景之中,训练成端到端的模型;并将预训练模型直接应用于Zero-shot问题之中。
视觉问答VQA (Visual Question Answering):根据图片内容回答用自然语言提出的问题,VQA 2.0数据集包含1.1million个关于COCO数据集的问题,可能的答案有3072个,把它看作一个多标签的分类任务,在图像和文本表示的基础上构建了两层MLP训练类别,使用交叉熵来衡量模型结果。
视觉常识推理VCR (Visual Commonsense Reasoning),给出一张图像,完成两个任务:问答(Q->A)和回答理由(Q->AR),答案都是多项选择。VCR数据集包括290k个QA问题,它们来自110k个电影场景。具体实现是将问题和每个可能的答案连接起来,形成四个不同的文本输入,并将每个文本输入和图像一起传入ViLBERT,在VILBERT基础上加入一个线性层在,给每组图文对打分。
框出图中物品(Grounding Referring Expressions),根据文字在图中框出对应物品,使用e RefCOCO+ 数据集训练。文中直接使用在COCO数据集上训练的Mask R-CNN模型识别出目标区域,并在最后的表征层h后面加入一个线性层,预测各个区域与文字匹配的得分,将最高分区域作为最终的预测结果。
基于标题的图片检索(Caption-Based Image Retrieval),根据文字描述在图片池中搜索图片,Flickr30k数据集包含31000张图片,这些图片和文字的对应关系优于自动抓取的图片。使用一对四的方式训练,对每个数据对随机抽取三个干扰项:一个随机的标题,一个随机图像以及一个从一百个最近邻中选取的难负例。计算每个文图对的匹配度;实际预测时计算文图匹配度并选择得分最高的图片作为预测结果。
基于标题的Zero-shot图片检索,Zero-shot指检索在训练集中未见过的数据,之前的几个任务都使用数据集精调模型,此任务中直接使用预训练的模型在Flickr30k数据集上检索。以评测预训练模型提取特征的能力。
结果与分析
下表展示了ViLBert与流行的其它模型对比,以及消融实验的效果,其中Single模型是与双路模型对应的单路模型,右上角的+表示模型未经过文中大规模的图像标题对数据预训练,但使用了预训练的图像模型和文本BERT参数。
软件安装
使用了mask R-CNN和pytorch-transformers作为基础库,安装起来有些难度。
$ git clone https://github.com/facebookresearch/vilbert-multi-task
$ apt-get install libcap-dev
$ pip install PyYAML==5.1.2
$ pip install pytorch-transformers==1.2.0
$ pip install -r requirements.txt