CLIP 论文逐段精读【论文精读】
这一次朱毅博士给大家精读的论文是 CLIP
,来自于 OpenAI
,是图像文本多模态领域一个里程碑式的工作。 CLIP
的影响力可见一斑,如果按照沐神之前讲的如何判断一个工作的价值来说,CLIP
应该就是 100×100×100100\times100\times100100×100×100 :
- 从新意度的角度来说,
CLIP
打破了固定类别标签的做法,彻底放飞了视觉模型的训练过程,引发了一大批后续的工作,所以新意度无疑是很高的。 - 从有效性上来说,在许多数据集上泛化性能都很好,甚至在某些情况下比人的
Zero-Shot
的性能还好。 - 从问题大小来说,
CLIP
用一个模型就能解决大部分的分类任务,而且是zero-shot
解决,这个问题本身就已经很大了。更何况只要利用CLIP
训练好的模型再在其他领域里稍微适配一下,就能把别的领域的任务也全都做掉。
项目链接为:https://openai.com/blog/clip/
文章目录
- 0. 前言
- 1. 题目和作者
- 2. 摘要
- 3. 引言
- 4. 模型
0. 前言
CLIP
自从去年2月底提出就立马火爆全场,它的方法出奇的简单、但是效果又出奇的好,很多结果和结论都让人瞠目结舌。比如作者说 CLIP
的迁移学习能力是非常强的,预训练好的这个模型能够在任意一个视觉分类的数据集上取得不错的效果;而且最重要的是它是 zero-shot
的,意思就是说它完全没有在这些数据集上去做训练
,就能得到这么好的效果。论文里做了非常多的实验,在超过30个数据集上去做了测试,涵盖的面非常广,包括了 OCR
、视频动作检测、还有坐标定位和许多细分类任务。在所有这些结果之中,其中最炸裂的一条就是在 ImageNet
上的结果了,CLIP
在不使用 ImageNet
的训练集的情况下,也就是不使用128万张图片中任何一张的情况下直接 zero-shot
做推理,就能获得和之前有监督训练好的 Res50
同样的效果,在 CLIP
这篇工作出来之前,很多人都认为这是不可能的事情。
下面就先来看文章的图一,也就是 CLIP
的模型总览图。这里先大概说一下它的流程,具体的细节后面还会讲到。
首先 CLIP
是如何进行预训练的呢? 通过论文题目就可以大概猜到一二,题目的意思是说:通过自然语言处理 的监督信号可以去训练一个迁移效果很好的视觉模型
,所以很自然的这是一个涉及文字 、图片的一个多模态的工作
。那它是怎么去利用自然语言处理来的监督信号呢?其实在训练的过程中,模型的输入是一个图片和文字的配对
,比如这里图片里画的是一只狗,配对的文字是 pepper
,是一只小狗;然后图片通过一个图片的编码器从而得到一些特征,这里的编码器既可以是 ResNet
,也可以是 Vision Transformer
,对于这个句子来说,它也会通过一个文本的编码器从而得到文本的特征。假设说现在每个 training batch
都有 nnn 个图片文本对,也就是这里有 nnn 张图片,有 nnn 个句子,那我们就会得到 nnn 个图片的特征,还有 nnn 个文本的特征。然后 CLIP
就是在这些特征上去做对比学习
,之前也提过对比学习非常的灵活,只需要一个正样本和负样本的定义,其他都是正常套路。那这里什么是正样本什么是负样本?其实再明确不过了,这里配对的一个图片文本对就是一个正样本
,因此特征矩阵里沿着对角线方向上都是正样本
。因为 I1T1,I2T2I_1T_1 ,I_2 T_2I1T1,I2T2 这些本身就都是配对的,剩下矩阵里所有不是对角线上的元素就都是负样本了。就是说这里我们是有 nnn 个正样本,然后有 n2−nn^2 - nn2−n 个负样本。
一旦有了正负样本,模型就可以通过对比学习的方式去训练起来了,完全不需要任何手工的标注。当然,对于这种无监督的预训练方式,是需要大量的数据的。OpenAI
还专门去收集了一个数据集,里面有4亿个图片和文本对,而且这个数据应该是清理的非常好的,质量应该非常高。这也是 CLIP
预训练模型为什么能这么强大的主要原因之一。
那接下来就是 CLIP
如何去做 zero-shot
的推理了? 这部分是非常有意思的。因为 CLIP
的这个模型经过预训练之后,其实只能去得到一些视觉上和文本上的特征,并没有在任何分类的任务上去做继续的训练或者微调,是没有这么一个分类头的。那如果没有分类头怎么去做推理呢? 作者这里就想出来一个巧妙的利用自然语言的一种方法 prompt template
,这里拿 ImageNet
做个例子。CLIP
先把 ImageNet
里这1000个类,比如说图一中的飞机、汽车、狗变成一个句子,用这些物体去替代这里的 object
,就是把一个单词变成了这么一个句子。ImageNet
有1000个类,这里就会生成1000个句子,然后这1000个句子通过我们之前预训练好的文本编码器就会得到1000个文本的特征。那我们为什么要做 prompt template
呢?其实直接用这些单词去抽取这种文本的特征也是可以的,但是因为在模型预训练的时候,图片每次看到的基本都是一个句子,如果在推理的时候突然把所有的文本都变成一个单词,就跟在训练的时候看到的这个文本不太一样了,效果就会稍有下降。而且怎么变成句子也是很有讲究的, CLIP
这篇论文后面还提出了 prompt engineering
和 prompt ensemble
这两种方式去进一步的提高模型的准确率,而不需要重新训练模型。在推理的时候,不论输入任何一张照片,只要把这张照片扔给图片的编码器,得到了图片特征之后,就去拿这个图片的特征去跟所有的文本特征去做 cosine similarity
计算。图像的特征跟哪个文本特征最相似,就把这个文本特征所对应的那个句子挑出来,从而完成了分类任务。
是不是非常的巧妙,其实当 CLIP
真正使用的时候,这里的标签也是可以改的,不光是 ImageNet
这1000个类,可以换成任何的单词。这里的图片也不需要是 ImageNet
的图片,也可以是任何的图片。依旧可以通过这种算相似度的方式去判断出这张图片里到底有哪些物体。比如说这里给一张三轮车的照片,然后在上面的类别里也加上三轮车类别,通过 CLIP
的这种 zero-shot
的推理的方式很有可能这张图片就能正确的被分类成三轮车。但如果像之前那种严格按照1000类去训练的分类头来说的话,模型永远都不会判断出这张图片是三轮车,最多也就是把它判断成是车或者是自行车。
这个性质才是 CLIP
的强大之处,也是 CLIP
这个模型最吸引人的地方。因为它彻底摆脱了 categorical label
的限制,也就是说不论是在训练的时候还是在推理的时候,都不需要有这么一个提前定以好的标签列表了,任意给一张照片,都可以通过给模型去喂不同的文本句子从而知道这张图片里到底有没有感兴趣的物体。
而且 CLIP
不光是能识别新的物体,由于它真的把视觉的语义和文字的语义联系到了一起,所以它学到的特征语义性非常强,迁移的效果也非常的好。在 OpenAI
的官网上,也就是 CLIP
的官方博客上作者还举了这么个例子。在 ImageNet
数据集上之前训练的 ResNet101
是76.2的准确率,然后对于 CLIP
训练出来的 VIT-Large
也是76.2的准确率,这两个的准确率是一样的。但是当我们换个数据集,比如说换到 ImageNetV2
或者 ImageNet rendition、ObjectNet、ImageNet sketch
或者 ImageNet Adversarial
之后,就会发现之前这种严格按照1000类分类头训练出来的模型,准确率下降的非常快。在换到素描画的时候或者对抗性样本的时候,准确率直接从70多掉到20多,甚至到对抗性的这种 2.7,基本上就已经是在随机猜了。迁移的效果是惨不忍睹,但是对于 CLIP
训练出来的模型来说,效果始终都非常的高,没有什么下降。这也就从侧面说明了因为和自然语言处理的结合,导致 CLIP
学出来的视觉特征和我们用语言所描述的某个物体已经产生了强烈的联系。比如说这里的香蕉不论是在自然图像里出现的香蕉、还是动漫里的香蕉、还是说素描的香蕉或者是加过对抗性样本的香蕉,CLIP
训练出来的模型都知道它对应的是香蕉这个单词。所以他能在 domain
变化剧烈的情况下,依旧能识别出这张图片里画的是香蕉,准确的完成这个分类任务。
这里再介绍一个基于 CLIP
的有趣的应用(ViLD),目标检测。在 CLIP
出来之后,很快也就是一个半月左右,Google
就出了一篇利用 CLIP
去做物体检测的工作。可以来看一下效果怎么样,作者这里说如果你是用传统的目标检测的方法去做预测的话,模型可能只能告诉你这些都是玩具,也就是这里的蓝色的这种基础类,但是当你利用了自然语言之后,就摆脱了基础类的限制,就可以随意发挥了。也就是这里说的 open vocabulary detector
,训练出来的模型就可以检测出这些新的类,也就是红色的这些类,比如说不光可以知道这些玩具的颜色,同时还知道这些玩具具体所代表的物体类别,比如这是一个玩具大象、一个玩具鳄鱼、一个玩具鸭子,输出一下就丰富了不少。
1. 题目和作者
首先我们来看一下 CLIP
这篇论文的整体架构。CLIP
这篇论文有48页,就算是把补充材料的10页去掉,CLIP
的正文也有30多页。其中大部分的篇幅都是留给了实验和相应的一些分析。从头开始这里面这一块是摘要,然后接下来一页多的内容主要是在讲引言,然后接下来的两页就是讲了一下方法,主要说的是怎么做预训练;然后接下来从第6页一直到第18页全都是说的实验,当然这里面也包括了怎么去做这种 zero-shot
的推理、还有包括这种 prompt engineering,prompt ensemble
,算是方法和实验的一个合体;然后讲完了实验,作者大概花了一页的篇幅去讨论了一下 CLIP
这个工作的一些局限性;然后接下来的五页作者主要就是讨论了一下 CLIP
这篇工作有可能能带来的巨大的影响力,在这个部分作者首先讨论的是 bias
,就是一些模型的偏见,然后讨论了 CLIP
有可能在监控视频里的一些应用;然后最后作者展望了一下 CLIP
还有哪些可以做的这个未来工作;然后作者用了一页的篇幅说了一下相关工作,最后因为该讨论的都讨论了,该说的都说完了,结论其实非常短,就这么一小段,写的 还没有后面的致谢多。然后因为 CLIP
做的这个数据集比较多,比的方法也比较多,牵扯到的工作也比较多,因为是视觉、 nlp
、多模态、包括有监督学习、无监督学习、自监督学习,很多领域里的工作都要提到,所以说可以看到引用文献在这种双栏的情况下就写了整整八页还多,跟一篇顶会投稿是一个长度。
先看论文题目
,题目意思是:利用自然语言的监督信号去学习一个可迁移的视觉网络。
这里有两个关键词,一个是可迁移
,另一个就是利用自然语言的监督信号
,所以怎么利用自然语言的监督信号就是这篇论文的贡献所在;至于想达到的目的主要就是迁移性
,就是想去学一个泛化性非常好的特征,从而能在各种数据集或者各种任务上能够不需要训练,直接推理都能获得不错的效果。
作者团队全部来自 OpenAI
,有12个作者,但其实对于 CLIP
这种工作,做了这么多实验、刷了这么多数据集,光论文就写了48页,12个人其实并不多,论文后面还致谢了很多很多人。
2. 摘要
下面是论文摘要
,摘要总共有9句话。
- 第1句话说现在最先进的计算机视觉系统是怎么训练的? 都是先有一个固定的已经提前定义好的物体类别集合,然后模型通过去预测这些提前定义好的类别从而完成模型的训练。这个固定的提前定义好的标签集合怎么理解呢?就好比
ImageNet
它有固定的1000个类、CIFAR10
就有10个类、CIFAR100
就是100个类、目标检测COCO
就是80个类、语义分割Cityscapes
就有19个类、视频分类Kinetics
数据集就有400个类。总之为了简单起见,不光是收集数据集的简单性还是说从模型训练的简单性来说,直接定义这么一个固定的提前定义好的标签集合会大大的简化问题本身。 - 第2句话说因为采用了这种有限制性的监督信号,
从而也限制了模型本身的泛化性
,尤其是当你需要去识别新物体类别的时候。对于这些新的类别难道每次都要去收集新的数据,然后重头训练一个新的模型吗?这样就很有局限性,就不好scale
了。 - 第3句话说作者想到了另外一种方式,
直接从关于图像的文本里去学习监督信号是一个看起来非常有前途的办法
,因为它的监督信号涵盖的范围就太广了。只要是你语言描述过的物体就有可能让视觉模型去识别到这个物体,而不仅仅是提前定义好的那1000个类。 - 然后作者接下来说他们已经证实了,用一个非常简单的一个预训练的任务,就可以非常高效的且可扩展的去学习一些最好的这个图像的表征。那这个任务具体是什么呢?其实是给定一些图片,然后又给定一些句子,
模型需要去判断哪一个句子跟图片是配对的
。既然要做这么一个配对任务,当然就需要一个类似的数据集了,也就是说训练样本必须是一个图片和文字的配对。文章作者又去爬了一个超级大的有4个亿的图片文本配对的数据集。有了这么大的一个数据集之后,就可以选择一种自监督的训练方式去预训练一个大模型出来了。 - 在预训练完成之后,自然语言就被用来去引导视觉模型去做物体的分类,也就是之前说的
prompt
,然后分类也不光局限于已经学到的视觉概念,还能扩展到新的类别。现在学到的模型是能够直接在下游任务上去做zero-shot
的推理的。 - 第6-9句作者介绍了模型效果。为了验证模型的有效性,作者接下来在超过30个不同的视觉任务和数据集上做了测试。然后作者发现模型的迁移学习效果对大多数任务来说效果都是非常好的。
CLIP
模型在不需要任何数据集专门训练的情况下,能和之前一个完全用有监督方式训练出来的模型打平手、甚至还会更高。作者在这里取了一个ImageNet
的效果,CLIP
模型在不使用任何一张128万个训练集图片的情况下,能跟之前一个有监督训练好的ResNet-50
打成平手,这个结果在当时读起来是非常震惊的。作者说他们预训练好的模型和他们的代码都放到了这个链接里,但其实这里的代码只是可以用来做推理,OpenAI
并没有开源他真正的预训练的代码。
3. 引言
下面是论文引言
部分,先看前2段。
文章一开始说直接从原始的文本数据里去预训练一个模型已经在过去几年里,在 NLP
领域取得了革命性的成功,比如说 BERT, GPT
这些模型。不论是使用自回归预测的方式还是使用掩码完形填空的方式,都是一种自监督的训练方式,目标函数是跟下游任务无关的,只是想通过预训练得到一个非常好的能泛化的特征,随着计算资源的增多、模型的变大还有数据变得更多,模型的能力也会稳健的提升。那这一套系统说白了其实就是文字进文字出,并不是在做一个什么特殊的分类任务,模型架构也是跟下游任务无关的。当直接用在下游任务上的时候,就不需要费尽心思去研究一个针对下游任务的输出头或者说针对那个数据集的特殊的一些处理了。这里面最厉害的最耳熟能详的模型就是 OpenAI
自己的 GPT-3
,能够做分类、做翻译、还能写邮件、写小说、写新闻。而且在大多数任务上并不需要特定领域的数据或者说只需要一点点的数据去做一点微调,就可以和之前精心设计过的那些网络取得差不多的结果。
作者接下来说这些鼓舞人心的结果证实了,在这种文本进文本出,利用自监督的信号去训练整个模型的框架下。这种大规模的没有标注的数据其实是要比那些手工标注的质量非常高的数据集反而是要更好使的。但是在视觉领域大家一般的做法还是在 ImageNet
这种数据集上去训练一个模型,这会让模型有诸多的限制,NLP
里的这套框架到底能不能用在视觉里呢?作者说从之前的工作看起来应该是没问题。
然后接下来作者就讨论了一下之前的工作,作者列了三个工作 VirTex, ICMLM , ConVIRT
。这三个工作都是基于 Transformer
去做的,跟 CLIP
已经非常非常像了,但具体的做法还是有一些区别。比如 VirTex
用的是自回归的预测方式去做模型的预训练,ICMLM
是用完形填空的方式去做预训练,ConVIRT
就跟 CLIP
已经非常类似了,但是只在医疗图像上做了实验。总之这三种方法都没有在模型或者数据上取得一个很大的规模,所以说就没有像 CLIP
模型一样一战成名。
然后作者反思了一下说,既然利用自然语言的监督信号是一个很有前途的方向,那为什么在视觉里这一系列的工作就这么少呢?这是因为之前的那些方法没有这么大的数据集、没有这么多的算力、没有这么大的模型、没有这么好的自监督训练的方式。在标准的测试数据集上,比如说 ImageNet
上的效果就非常的差,比如我们刚才说的这个工作在 zero-shot
的设定下就只有11.5的这个准确率,但是在 ImageNet
上之前最好的表现方法都已经有88.4了,而且就算是不用 Deep Learning
,就用传统的视觉方法准确度也有50。因为效果实在太低,所以说没有实用的价值,大家去钻研这个方向的热情就会小很多。取而代之呢,另一系列的工作就非常受人关注,就是说怎么去利用更弱的监督信号。之前一个工作就提出了一个新的预训练的任务,收集了一个 instagram
的数据集,去预测图片自身带的 Hash Tag
,通过这种方法呢,数据集就可以变得非常大,因为每张图片都会自带一些 Hash Tag
,不用去人工的标注。同时这些 Hash Tag
也就可以想象成是一种自然语言的监督信号,是一个或者几个单词,有明确的语义含义。然后另外还有一些工作,比如说这两篇工作就是去训练一个模型,然后去预测 JFT-300 Million
这个数据集上所有的这个类别。因为 JFT-300 Million
数据集非常大,类别数好像有18000,因为有这么多的类别,他的标注其实是比较 noisy
的,也算是一种弱的监督信号。总之作者想说的是,这一系列的工作之所以更火爆,就是因为他们的性能会更好。
这一系列的工作其实也就代表了一个实用主义的中间地带,那些作者也知道使用这种有限的、固定的特别好的标注数据是不好的,是有很大的局限性的。他们是非常想用取之不尽、用之不竭的原始文字的,但是因为后一种方向目前的效果还太低,没办法他们就走了这种中间的地带,就是用文本带来的弱监督信号去帮助有监督的模型取得更好的效果。但是有得必有失,作者就指出虽然取得了更好的结果,但是还是有很大的局限性,之前的这些工作需要精心的设计,而且他们的监督信号还是1000个类或者18000个类,并不能真的做到随心所欲,去检测任何想检测的类。而且这两种方式,都是会用一个固定的 softmax
分类头去做分类的,输出都是固定的,如果再有新的类别就无能为力了,没有灵活的做 zero-shot
的能力。
接下来作者说之前这些弱监督的方法和最近的借助于自然语言处理去学习图像表征的方法最大的区别是在规模上
,从方法上来说不论是从 instagram
的 hashtag
上去学习还是从 JFT-300 Million
数据集上标签这一两个单词上去学习,其实都算是一种从自然语言处理学习图像特征的方法。他们之间的区别并不是很大,关键就是在规模上,规模其实就是说数据的规模
和模型的规模
,像之前弱监督学习的方法是在亿级规模的数据集上去训练的模型,而且训练了加速器年,这里为什么用加速器呢?是因为大家用来训练的硬件是不一样的,大多数人可能还是用 gpu
,google
就是用 tpu
,当然还有很多别的训练硬件,所以作者这里把所有的这些硬件都统称为加速器,反正都比 cpu
快。
之前在讲 vit
那篇论文的时候也提到过,当时作者说他们训练 vit
模型用了2500个 TPU V3/天
,也就是说如果用一个 TPU V3
核的话,训练这个模型需要训练 2500天。那换算过来的话大概就是7年,他们当时也是在 JFT-300 Million
这个数据集上去训练的。但最近的方法,比如说跟 CLIP
最相似的三种方法,他们其实只是在几十万张图片上去做了训练,而且就训练了几天,跟之前那种亿级规模的数据集而且还训练了几年的规模比起来,效果肯定是不太行的。CLIP 这篇论文的作者就是想告诉大家,这些方法效果不行,不是因为方法不行,主要是因为规模没上去,只要规模上去了效果好到你怀疑人生
。所以作者接下来就说在这篇论文里我们就是 close
了这个 gap
,什么 gap
呢?就是之前这几个工作训练规模不够大,我们这里就是把规模推到够大。具体来说:
- 首先
CLIP
作者团队就从数据出手,他们先去收集了一个超级大的图像文本配对的数据集,里面有400 Million
个图片文本的配对,跟JFT-300 Million
数据集是一个水平上的。就是说跟之前这些工作,这些弱监督学习的方式他们在数据上打成平手了。 - 那至于模型上,作者尝试了从
ResNet
到EfficientNet
到Vision Transformer
,最大的他们用了VIT-Large
这个模型,所以说模型的规模也提上去了。 - 那在大数据加大模型双重的加持之下,作者说我们就提出来一个非常简单的方法叫
CLIP
,也就是Contrastive Language Image Pre-training
,其实ConVIRT
的一个简化版本。但是效果非常的好,在模型方面作者在视觉这边一共尝试了8个模型,最小的模型和最大的模型之间的计算量差了大概有100倍,然后作者最后发现迁移学习的效果 是跟模型的大小基本上是称正相关的
,就是说小的模型的效果就差一些,大的模型效果就好一些,模型逐步增大迁移学习的效果也逐步增高。是一个非常平滑的过程。也是可以预测的,如果在接下来真实的应用中采取了更大的模型或者更小的模型,可以大概估算出来迁移学习的效果会是多少,这个性质是非常实用的。
引言的最后自然又是老套路,作者得开始卖结果了。CLIP
这篇论文的结果非常非常的多,而且效果都非常非常的好,这里就把最重要的几个点罗列了出来。
- 首先
CLIP
模型做的是迁移学习,所以说你能迁移的任务越多、榜刷的越多,自然就可以证明模型更有用,所以作者这里就怒刷 30 个数据集,然后在这些数据集上CLIP 一般都能和之前精心设计的有监督训练好的模型打成平手或者甚至比他们效果还好
。 - 然后作者为了进一步验证
CLIP
学到的模型特征的有效性,暂时先不做这种zero-shot
而是去做之前我们在对比学习里讲过的linear-probe
。这种设置就是说一旦预训练的模型训练好之后,我们把它冻住,整个backbone
骨干网络就不改变了,我们只是从这个模型里去抽特征然后训练最后一层分类头去做这个分类任务。在这种情况下作者发现CLIP
也比之前最好的ImageNet
上有训练出来的模型效果要好,而且计算上也更加高效。 - 作者最后又发现
zero-shot CLIP
模型还更加的稳健,就是说当他的这个效果和之前有监督的ImageNet
训练好的模型效果持平的时候,泛化性能是远比ImageNet
有监督训练出来的模型要好很多的,也就是我们刚才刚刚讲过的例香蕉例子。在这种素描或者对抗性样本的情况下,有监督训练的模型基本上就是在瞎猜了,可是CLIP
模型照样表现的很好,基本没有掉点。 - 所以说
CLIP
模型真的是想法又简单、实现又高效、性能在各个数据集上又非常的好、而且泛化性稳健性都不错,全方面碾压之前的方法,效果好的真是让人不敢相信。所以说作者都不得不专门写了一个section
去讨论了一下CLIP
工作的广泛影响力以及有可能带来的政策上或者伦理上的影响。
4. 模型
接下来看看 CLIP
是怎么进行预训练的?作者上来先说方法核心就是利用自然语言的监督信号来训练一个比较好的视觉模型
。
作者想强调的是之前的这些工作其实没有什么大的区别,都是想用文本当做一个训练的信号,但这条路走的不是很顺的一个原因是 nlp
模型不是很好学。比如说之前 nlp
用的是 topic model
或者 n-gram
的形式都还是非常复杂的,不太好做跨模态的训练。但是随着 transformer
和自监督训练方式的兴起,nlp
发生了彻底革命,即 deep contextual representation learning
,就是具有上下文语义环境的学习方式,比如说 bert
用的完形填空。然后在这种自监督学习的范式之下,现在 nlp
模型终于可以利用这种取之不尽、用之不竭的文本监督信号了,所以说训练出来的模型又大又好,而且还简单,泛化的也好,为多模态的训练铺平了道路。
然后接下来作者又说了说为什么非要用自然语言的监督信号来训练一个视觉模型,因为好处实在是太多了,作者这里列举了两个最重要的原因:
- 第一个就是
不需要再去标注数据了
,像ImageNet
的话需要你先定好1000个类,然后再根据这些类去下载照片,然后再去清理数据集,然后再去标注,这是非常复杂的过程。那现在要做的只是去网上下载这些图片文字的配对,别的这些标注的步骤都不用做了,数据的规模很容易就变大了
。而且因为现在的监督信号是一个文本,而不是像文中说的 n 选 1 的标签,模型的输入、输出自由度就大了很多。 - 第二个是说正是因为现在训练的时候把图片和文字绑定到了一起,现在学到的特征不再单单的是一个视觉特征了,而是一个
多模态的特征
,当和语言联系在一起以后呢就很容易去做zero-shot
迁移学习了。如果只是做一种单模态的自监督学习的话,无论是用单模态的对比学习、比如说MoCo
,还是说单模态中掩码学习就是mae
,都只能学到视觉的这个特征,无法和自然语言联系到一起。那这样还是很难去做zero-shot
的迁移。
可惜的是如果要去做这种文本和图片配对的学习,就需要有一个足够大的数据集,里面要有很多很多图片文字对。作者这里说已有的常见的几个数据集,像 MS-COCO
、Visual Genome
和 YFCC100 Million
。虽然前两个数据集的标注质量非常的高,但是数据量太少了,只有大概10万个训练样本,跟现在大家对大数据集的期待相比而言就小太多了。对于 YFCC100 Million
数据集来说乍一看有一个亿,好像很多,但是标注质量实在是太差了,里面很多照片配对的文本信息都是自动生成的,比如说很多时候配对的文本信息就是照片的名字,或者是相机的一些参数,比如焦距、曝光度,完全跟图片是对不上号的。如果用这样的配对去训练模型的话肯定效果就不是很好,然后就有人去把这个数据集清理了一下,发现经过清洗以后数据集一下就缩小了6倍,最后就大概只有1500万张图片了,作者说这个规模其实就跟 ImageNet
差不多。
总之作者就是觉得即使是这个规模也是不够大,应该达不到想要的一鸣惊人的效果,所以说不如自己动手自己造一个大数据集,确实造这个数据集也是物有所值,不光是孕育了像 CLIP
这篇工作,而且还孕育了 OpenAI
另外一篇 DALL·E
的图像生成的工作。
最后 OpenAI
收集的数据集里面有 400 Million
,也就是4亿个图片文本对。这个是什么概念呢?如果跟之前图像最大的数据集 JFT-300 Million
数据集比的话,还多一个亿的训练样本。如果跟 nlp
那边比的话,作者这里说按照单词的数量来看的话,他们新收集的数据集大概跟训练 GPT-2
用的 WebText
数据集差不多接近,所以应该是够大够用了。
视觉现在的模型都是非常大,训练起来都非常贵。比如之前的工作在 instagram
数据集上去做预训练的,训练了一个 ResNeXt101-32x48d
网络需要19个 gpu 年
,就是说如果用一块 gpu
的话要训练19年;然后另外一个工作 noisy student
需要33个 TPUv3/年
,也就是说用一个 TPUv3
核的话需要训练33年,总之就是训练起来非常贵。然后作者又补充了一点,这两个模型还都是在预测只有1000类就已经这么耗费资源了,那现在不仅数据集更大而且任务也更难,是要从自然语言处理里直接去学 open set of Visual concept
,就是直接去学开放世界里所有的视觉概念。那就连 OpenAI
这种每次出手都是大手笔,感觉从来不愁计算资源的公司都觉得训练这个系统太吓人了。最后他们说经过他们一系列的努力,他们发现训练效率
对于多模态预训练的成功是至关重要。
作者他们做了哪些尝试呢? 首先他们试了一个跟 VirTex
工作非常相似的方法,就是说图像那边他们用了个卷积神经网络,然后文本这边用了个 Transformer
,然后都是从头开始训练的。那任务是什么呢?就是说给定一张图片,要去预测这个图片所对应的那个文本,其实这个就是预测型的任务,但是效率很慢。
作者接下来就解释一下为什么要用对比学习
。因为如果你是给定一张图片,然后要去预测对应的文本的话,是要逐字逐句去预测这个文本的,这个任务就太难了。因为对于一张图片来说可以有很多很多不同的描述,那比如说我们现在大家看到的这个画面让不同的人去添加字幕的话,那有的人可能就会说这里是有一个人在讲论文,也有人可能说这个人穿的衣服是蓝色的,所以说文本之间的差距是非常巨大的
,如果用这种预测型的任务去预训练这个模型的话
就有太多太多的可能性了,模型训练的就非常慢。所以作者接下来就说了一大堆对比学习的好处,作者发现如果把训练任务变成一个对比的任务,也就是说只需要去判断图片和文本是不是一个配对
,这个任务听起来是不是就简单了很多呢。因为现在不再需要去逐字逐句的去预测文本了,这个时候只要你文本和图片是配对的就行,这个约束一下就放宽了很多,其实这个监督信号想起来也更合理。
然后作者把这个对比放到了图2里,发现仅仅把预测型的目标函数换成一个对比型的目标函数,训练效率一下就提高了4倍
,在图案里就是这条蓝线,就是 OpenAI gpt
的模型,基于 Transformer
去做预测型的任务,中间这条橘黄色的线指的是一种 bag of words
的方式,简单来说就是不用去逐字逐句的去预测文本了,文本已经全局化的抽成了一些特征,相应的约束被放宽了。可以看到一旦约束放宽以后训练效率就提高了三倍,如果进一步放宽约束,只需要判断是不是图片文本对,也就是最后这里画的绿线,会发现训练效率又进一步的提高了四倍,也就说明了基于对比学习的方法的训练是非常高效的
。
接下来呢作者就具体讲了一下 CLIP
所用的方法,之前在前言的时候也大概讲了一下图1里 CLIP
模型的总览图。这里我们直接过一遍伪代码。
- 首先有两个输入,一个是图片的输入,一个是文本的输入。图片的输入维度也已经都说明了它是 nnn,也就是
batch size
和h w c
,分别对应的比如说 2242243。文本输入 tttbatch size
也是 nnn,因为跟Image
是配对的。lll 是序列长度,那一旦有了这两个输入就需要去通过编码器去得到对应的特征。编码器既可以是一个ResNet
也可以是一个Vision Transformer
,对于文本来说既可以是一个CBOW
也可以是一个Text Transformer
。 - 然后在得到对应的图像特征和文本特征之后,一般后面会有归一化的操作,这里还牵扯到一个投射层,这个投射层的意义主要就是去来学习一下如何从单模态变到多模态,所以作者这里说这是一个合并的一个多模态的特征,当投射完之后再做一次 L2L2L2 归一化,就得到了最终的用来对比的这个特征 IeI_eIe 和 TeT_eTe。
- 一旦有了这两个特征,接下来要做的就是算一下
consine similarity
,算得的相似度其实也就是最后要用来做分类的logits
,一旦有了预测的logits
,接下来就需要一个ground truth
,logits
就去跟ground truth
做交叉熵目标函数,从而算得最后的loss
。这里可以看到算ground truth
用的是arrange function
,得到值就是从1开始1234567一直到 n,跟之前讲过的MoCo
创建ground truth
方式是不一样的。但是对于CLIP
来说正样本全都是在对角线上的,所以就用这种形式去创建ground truth
,然后接下来是很中规中矩的算两个loss
,一个是Image
,一个是text
,最后把两个loss
加起来求个平均。
接下来作者还讲了一些很有意思的细节:
- 因为收集的数据集实在是太大了,模型的训练不太会有
overfitting
的问题,实现就比之前的工作要简单很多。比如说在训练CLIP
的时候对应的文本编码器和图片编码器都是不需要提前进行预训练的。 - 第二个有趣的点就是最后做投射的时候并没有用非线性的投射层,而是用了一个线型的投射层。线性、非线性投射层之前在讲对比学习,讲过用非线性的投射层会比用线性的投射层带来将近10个点的性能提升,是非常巨大的。但是作者这里说在多模态的预训练过程发现线性、非线性没什么大关系,怀疑非线性的投射层应该只是用来适配纯图片的单模态学习的。
- 然后也因为
OpenAI
的数据集实在是太大了,所以也不需要做太多的这个数据增强。作者这里说唯一用的数据增强就是一个随机的裁剪,所有那些fancy
的数据增强都没有使用。 - 然后最后因为这个模型实在是太大了,数据集也实在是太大了,训练起来太耗时。不太好去做调参的工作,所以在算对比学习的目标函数的时候,之前在讲对比学习那些工作的时候
temperature
这个超参数是个非常重要的参数,稍微调一调最后的性能就会有很大的改变。但作者这里实在是不想调,所以就把它设置成了一个可以学习的标量,参数直接在模型训练过程中就被优化了,而不需要当成一个超参数最后再去调参。
接下来看文章的 2.5 节怎么训练模型。
- 作者说对于视觉模型一共训练了8个模型,有5个
ResNet
, 有3个Vision Transformer
。五个ResNet
里面有标准的Res-50
和Res-101
还有三个残差网络根据EfficientNet
的方式去把模型里Channel
的宽度还有模型的深度以及输入的大小都做了调整。从而得到了几个残差网络的变体,也就是这里说的ResNet 50x4、ResNet 50x16、ResNet 50x64
,分别对应的就是原始的ResNet-50
的4倍、16倍和64倍的计算量。对Vision Transformer
来说作者这里就选择了ViTBase/32、ViTBase/16、 ViTLarge/14
,这里的32、16、14分别指的是这个patch
的大小。 - 然后作者说所有的这些模型都训练了32个
Epoch
,是用Adam
优化器去训练,然后对于所有的超参数作者也简单的做了一些grid search
或者说random search
, 手动的调整是为了让调参调的快一点。在做超参搜索的时候都是用的最小的Res-50
去做的,而且都只训练了一个Epoch
,对于更大的模型来说作者这里就没有再去调参了。 - 然后在训练的时候呢作者选用的
Batch Size
是3万多,非常的大,很显然模型肯定是在很多很多的机器上去做这种分布式训练,而且混精度训练也是用到的,不仅能加速训练、而且还能省内存。混精度训练其实是现在一个常见的操作了,基本上涉及Transformer
的论文都会用,对于大部分任务来说用混精度也不会掉点,有时候甚至还能涨点,然后凭空又能省一半内存,训练速度也能大幅度增加。经过这么多工程上的优化CLIP
模型才能被训练起来,如果大家对这些工程上的细节感兴趣的话,我推荐给大家一篇很有用的博文 (https://lilianweng.github.io/lil-log/2021/09/24/train-large-neural-networks.html),这篇博文的题目就是如何在很多很多的gpu
上去训练超级大的模型。 - 最后作者说对于最大的残差网络来说,
Res 50x64
在592个v100
的gpu
上训练了18天,而最大的Vision Transformer
在256个V100 gpu
上只花了12天,所以确实是像Vision Transformer
那篇论文里说了一样,训练一个Vision Transformer
是比训练一个残差网络要高效的。然后因为ViT Large14
表现最好,所以作者又拿预训练好的模型再在这个数据集上又Fine-tune
了一个epoch
,而且用的是更大尺寸的图片,就是336x336的图片。然后作者接下来说如果没有特殊指明的话,接下来整篇文章剩下的二三十页只要说到CLIP
其实都指的是这个最大最好的模型。