1. 内容简介

这篇文章算是我司今年发表的一篇颇有影响力的文章了,连不做cv的我都有所耳闻,毕竟刷指标刷的委实是有点厉害,简直堪比18年bert刚出来时候的状况,所以就来跟风看一下这篇文章,看看他到底是怎么做的,然后能不能在nlp还有推荐领域给一些参考思路。

具体而言,这篇文章提出了一个Beit3模型,其模型的本身其实本质上还是一个Transformer的架构,和近年来非常流行的将transformer引入到cv领域的思路是一脉相承的,倒是没啥特别创新的思路,所以一开始也没有非常的get这个Beit3模型怎么就突然获得了如此牛逼的结果。

不过事实证明还是跨领域对领域内技术背景的了解不够深,参考了下面的参考链接1之后才算是真的搞明白了文章中的优化思路的脉络。

具体而言,Beit3模型的核心点包括以下三点:

  1. 在transformer的基础上引入MLM预训练,这个思路似乎在前作Beit当中就已经有了,这里算是继承了前作的优化思路;
  2. 将图片信息视为文本,这种处理方式对于图片多少有些粗暴,但是好处在于说是统一了文本和图片的处理方式,从而避开了VLMO那种分阶段训练的方式,训练上更加优雅;
  3. 扩展了模型规模,这个主要好像是借鉴了我司之前在DeepNet当中的工作,使得模型可以更大,而众所周知,大模型如果可以得到充分的训练,往往就能够获得更好的效果表达。

我们给出文中给出的这张颇为震撼的结果图如下:

在这里插入图片描述

下面,我们来具体看看模型的结构细节以及其在实验上的效果。

2. 模型结构

首先,我们来看一下Beit模型的具体模型结构。

这部分事实上又主要包含以下几个部分:

  1. 图片信息作为类文本的处理方法;
  2. 一体化的模型结构设计;
  3. 模型预训练方法;

下面,我们分别来考察一下这些内容。

1. 数据处理

首先,我们来看一下输入数据的处理,其实主要就是图片信息的处理上面。

Beit3模型作为要给Multiway Transformer,一个重要的特征就在于说模型对于图片和文本信息的处理一致性,因此文本与图片的数据处理之后要求为相同的格式。

对于文本的处理,事实上就是常规的文本处理方法,用一个分词器(这里使用sentence piece)将文本分为tokens,然后用一个embedding layer映射为一个embedding的序列。

但是,对于图片的处理,这里多多少少会有一点区别,毕竟图片是一个二维的信息载体,要强硬的处理成一维数据多多少少会有一点问题,但是也不是完全不行,这里的处理方法还是基本的分块强行构成序列,将 224 × 224 224 \times 224 224×224清晰度的图片拆分为 14 × 14 14 \times 14 14×14的patch,然后通过patch的embedding映射构成sequence。

当然,这里的position embedding应该会需要多少变得特殊一些,这里得去看看Beit那篇文章或者直接考察一下源码,这里暂时还没有深入地去看,也只是个人的感觉而已。

不过言归正传,通过上述方式,我们就可以统一的将文本和图片处理为完全相同的数据输入格式,后面就可以对其使用相同的模型进行处理了。

2. 模型结构设计

然后,到了模型的细节处理上面,其实本质上还是transformer那一套,就是标准的self-attention加上ffn结构,不过不同的是,模型对于文本和图片,还是准备了不同的ffn层结构,具体可以参考下图:

在这里插入图片描述

可以看到,本质上模型的输入还是一个self-attention + ffn layer的设计,不同的是,ffn层的选择对于不同的层以及不同的输入会有所区分,V-FFN用于处理图片信息,L-FFN用于处理文本信息,而VL-FFN用于处理两者的联合信息。文中提到在最上方的三层会使用VL-FFN,而对于下方的网络,则会一起使用V-FFN和L-FFN,具体的网络设计可以参考下图:

在这里插入图片描述

对应的模型参数以及训练数据可以参考下表:

在这里插入图片描述

不过需要提一嘴的是,这里为了将模型做大,也就是文中提到的scale-up,Beit3优化了参数的初始化过程。具体而言,就是参考了DeepNet的参数初始化方法,这部分内容之前我们其实也写了篇博客(文献阅读:DeepNet: Scaling Transformers to 1,000 Layers)对其进行了整理,所以这里就不具体展开了。

3. 模型训练

最后,我们来看一下模型训练的细节。

其实这部分就是一个比较标准的MLM的模式,随机mask掉15%的文本token和40%的图片patch,然后让模型进行完形填空反向预测这部分内容即可。

看下述参考链接1中提到的,似乎在前作Beit当中就已经使用了,然后在VLMO系列模型当中也用到了,只不过他们更多的是分阶段的训练,所以感觉其实也不是什么新方法?

当然,这个因为我之前没怎么做过CV方向的东西,所以就真不太了解了,但是从NLP角度来说,MLM感觉近些年来实在谈不上是什么特别推成出新的方法了。

3. 实验结果

下面,在完成了模型的介绍之后,我们稍微show一下文中展示的Beit3模型在各个任务当中的效果。

1. 图文联合任务

1. Visual Question Answering (VQA)

这个任务是说给定一张图片和一个问题,然后按照图片信息回答问题。

不过问题对应的答案候选集somehow是有限的,因此论文中将其视为了一个多类别的分类问题。具体而言,论文中将图片与问题文本的embedding concat起来之后输入到一个多类别的预测层,然后输出最可能的回答。

论文是在VQAv2数据集上进行的这部分实验的考察,其给出的具体实验结果如下:

在这里插入图片描述

2. Visual Reasoning

这个任务同样是给定一张图片和一段文本,不过这里的文本是一段描述,然后要做的就是判断这段描述文本与图片是否相符,因此就是一个是非判断题。由是我们的处理就可以和上面一模一样。

文中采用了NLVR2这个数据集,其结果可以参考上述表4中的第二大列部分。

3. Image Captioning

Image Captioning任务较之上述两者多少显得要难一些,因为需要根据给定的图片生成一段文本,因此上述分类问题的处理方式并不适用,但也不是特别难以修改,只要将其修改为一个unilm,然后对文本进行逐字生成即可。

论文中在COCO数据集上进行了实验,实验结果同样展示在了上面的表4当中。具体就是上述表4中的第三大列。

可以看到,依然基本还是屠榜的效果。

4. Image-Text Retrieval

这个任务其实就是以图搜文或者反过来以文搜图,所以就像推荐任务差不多,用一个双塔分别对文本和图片进行编码,然后计算相似度即可。

文章中在COCO和Flickr数据集上进行了实验,具体结果如下:

在这里插入图片描述

更进一步的,文章中还直接在Flickr数据集上进行了zero-shot的考察,同样得到了非常理解的结果。

在这里插入图片描述

2. 纯图像任务

1. Object Dectection & Instance Segmentation

纯图像任务方面文中考察的第一个任务就是目标检测,文中在COCO数据集上进行了实验,得到结果如下:

在这里插入图片描述

2. Semantic Segmentation

Semantic Segmentation任务就是一个像素级别的实体识别任务,给定150种实体类别,然后对没一个像素识别是否属于某一个类别。

文中在ADE20K数据集上进行了实验,得到结果如下:

在这里插入图片描述

可以看到,也是SOTA的结果。

3. Image Classification

Image Classification任务就是对图片进行一下分类,原则上其实只要将其作为一个分类问题即可。

不过文中对于这个问题的处理多少特殊了一点,将其视为一个匹配检索问题,就是对每个类别也进行一个编码,然后计算图片和类别的相似度。

文章在ImageNet数据集下继续了考察,其实验结果如下:

在这里插入图片描述

4. 总结 & 思考

综上,这篇文章最核心的还是说对于CV领域内的模型预训练方式进行了优化,优化了图片的编码方式,然后引入了DeepNet的初始化方法从而增强了模型scale-up的能力。在此基础上文中训练得到的Beit3模型基本完成了在所有任务上的屠榜成就。

不过,again,由于我之前没做过CV相关的工作,所以对这个结果其实也就是看看过去,没啥实际的体感。但即便如此,考虑到后续我自己的工作可能会涉及到多模态,这篇文章的结果感觉还是很有必要了解一下的,至少要用的时候也得知道有这么个玩意不是……

5. 参考链接

  1. https://www.zhihu.com/question/549621097
  2. https://zhuanlan.zhihu.com/p/561301594
  3. https://www.mathworks.com/solutions/image-video-processing/semantic-segmentation.
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐