CLIP详细介绍
感谢您的观看,希望能给您带来一点帮助。
😊😆
题目:利用自然语言这种监督信号去学习一个迁移性能好的视觉网络,有两个关键词,第一个是迁移性能好,第二个就是利用自然语言的监督信号。主要是想去学习一个泛化性非常好的特征,从而能够在各种数据集或者各种任务上,能够不需要训练,直接推理都能够获得不错的效果。
摘要
现在的最先进的视觉系统的训练都是先有一个固定的、一个提前已经定义好的物体类别的集合,然后模型通过去预测这些提前定义好的类别从而完成模型的训练,这个固定的,提前定义好的标签集合怎么理解呢?其实就是说ImageNet有固定的1000个类,CIFAR10有10个类,CIFAR100有100个类,目标检测那边的coco就是80个类等等。直接定义这么一个固定的提前定义好的标签集合会大大简化问题本身,但是也因为采用了这种有限制性的这种监督信号,从而也限制了模型本身的泛化能力,尤其是当你要去识别新物体类别的时候,该怎么办?作者就想到了直接从自然语言,从文本里得到一些监督信号,是一个看起来非常有前途的办法,因为他这个监督信号涵盖的范围就太广了,只要是你语言描述过的物体,你就有可能让你这个视觉模型去识别到这个物体,而不是你提前定义好的那1000个类别,作者也证实了用一个非常简单的预训练任务就可以非常高效的,可扩展的去学习一些最好的图像的表征,这个任务具体是什么呢,其实就是给定你一张图片,然后给定你一些句子,模型需要去判断哪一个句子跟图片是匹配的,既然要做这么一个配对的任务,当然就需要这么一个类似的数据集了,也就是训练样本必须是一个图片和文字的配对,所以文章的作者又去爬了一个超级大的,有4个亿的图片文本配对数据集。有了这么一个数据集以后,就可以选择自监督的训练方式去预训练一个大模型了。
引言
直接从原始的文本数据里去预训练一个模型已经在过去几年里在NLP领域取得了革命性的成功,无论你是使用自回归预测的方式,还是使用这种掩码完型填空的方式,他都是一种自监督的训练方式,所以他的目标函数是跟下游任务是无关的,他只是想通过预训练得到一个非常好的,非常能泛化的特征,随着计算资源的增多,模型的变大,数据的增多,模型的能力也会稳健的提升,这一套系统,其实就是文字进,文字出,并不是在做一个特殊的分类任务,模型架构也和下游任务无关,所以说当直接用在这种下游任务上的时候呢,我们就不需要费尽心思去研究一个针对那个任务的输出头,或者针对这个数据集的一些特殊处理,并不需要特定领域的数据,或者说只需要一点点数据去做一点微调,就可以和之前精心设计的网络取得差不多的结果。
这些结果证实了在这种文本进文本出,利用自监督的信号去训练整个模型的框架下,这种大规模的没有标注的数据,其实是要比那些手工标注的数据反而是更好。之前的工作的规模都不是很大,本文把模型的规模推到足够大。作者最后发现迁移学习的效果基本上是和模型的大小成正相关的。
方法
之前的方法用语都比较混淆,规模也没有做的很大。之前的工作没有大的区别,就是想用文本当作训练的信号。
使用自然语言的监督信号来训练一个视觉模型,可以不用去标注这些数据了,而CLIP做的只是去网上下载图片和文字的配对,别的标注数据的步骤都不需要去做了,那数据的规模很容易就变大了,而且因为监督信号是一个文本,而不是像文中这种n选1的标签了,模型的输入输出的自由度就大了很多,第二个非常重要的点呢,因为你现在训练的时候把图片和文字绑定到了一起,那你现在学到的这个特征呢,不再单单是一个视觉上的特征了,而是一个多模态的特征,当你和语言联系在一起以后,就很容易去做zero-shot的这种迁移学习了。但是如果你只是做单模态的自监督学习的话,无法和自然语言联系到一起,还是很难做zero-shot的迁移。所以总结下来就是用文本监督信号去帮助训练一个视觉模型是非常有潜力的,可惜的是呢,如果要去做这种图片和文本配对的学习,就需要有足够大的数据集,里面有很多这种图片文字对,而现有的这种数据集要么规模小,要么质量差,所以OpenAI自己收集的数据集里面有4个亿的图片文本对。
选择有效的预训练方法
作者是要从自然语言处理里直接去学开放世界里所有的视觉概念,所以训练效率是非常重要的。
刚开始:图像这边使用的是卷积神经网络,文本这边使用的是Transformer,都是从头开始训练的,任务是给定一张图片,要去预测这个图片所对应的文本。
如果你给定一张图片,你要去预测文本的话,你是需要逐字逐句去预测这个文本的,这个任务就太难了, 因为对于一张图片来说,可以有很多不同的描述,这样会比较困难,但是如果把训练的任务当成对比的任务,也就是只需要去判断这个图片和文本是不是配对,这个任务听起来就简单了很多,因为现在不需要去逐字逐句预测文本了,只要文本和图片是配对的就行。
伪代码
因为作者收集的数据集很大,所以不太可能会出现过拟合的现象,比如说他们在训练CLIP这个模型的时候呢,对应的文本编码器和图片编码器都是不需要提前进行预训练的。
实验
之前的自监督或无监督的方法,主要研究的是特征学习的能力,他们的目标就是去学一种泛化性比较好的特征,但即使学到了很好的特征,如果想应用到下游任务的时候,还是需要有标签的数据去做微调,比如下游任务不好去收集数据,比如说有distribution shift的问题,那我们如何能够训练一个模型,接下来就不再训练和微调呢,这就是作者做这种zero-shot迁移的动机。一旦借助文本训练好了一个又大又好的模型以后,你就可以用这个文本作为引导,去很灵活的做这种zero-shot的迁移学习。至少在分类上效果都非常好。
基于Prompt的学习
主要是在做微调或者直接做推理的时候用的一种方法,而不是在预训练阶段,不需要那么多的计算资源,因为效果很好,所以影响力还是非常大的,Prompt起到的是提示的作用,也就是文本的引导作用,为什么要做prompt engineering和prompt ensembling,作者举了两个比较常见的例子:
- 多义性,一个单词有多个含义,如果在做文本和图片的匹配的时候,每次只用一个单词,也就是标签对应的一个单词去做文本的特征提取,就会有这个问题,
- 另一个问题是我们在做预训练的时候,我们匹配的文本一般都是一个句子,很少是一个单词,如果在推理的时候每次进来都是一个单词的话,就会存在distribution gap的问题,抽出来的特征就不是很好
所以,基于上述两个问题,作者就想了一个非常简单的方式去做prompt template,就是有这么一个提示的模板,也就是把标签放到一句话里,变成一句话了。
Prompt不光提示了一个模板,他还可以做很多事情,作者就发现了,如果你提前发现了很多信息,这样对zero-shot的推理是非常有帮助的,比如说当你知道你现在做的就是Oxford-IIIT Pets这个数据集的时候呢,他里面的类别肯定都是动物。