参考博客:
CLIP论文阅读【Learning Transferable Visual Models From Natural Language Supervision】
CLIP: Connecting Text and Images
引言
在NLP领域的利用自监督信号训练的预训练模型中,大规模的没有标注的数据,反而是比高质量经过手工标注的数据更有效。但是在视觉领域中大家的做法还是在像ImageNet这样的高质量手工标注的数据集中预训练,这样就会使视觉模型具有很多的限制。
NLP的这套框架是否可以用到视觉领域中?在17年的时候其实就有一篇文章与CLIP的思路非常相似,但是那时没有Transformer,没有对比学习、完形填空(掩码语言建模)以及大规模的数据集,它的结果并不是很好。此后也有一些工作使用自回归、掩码语言建模的方式做了一些工作,但是由于模型和数据都没有CLIP这么好,所以结果不亮眼。目前虽然已经有人使用Transformer+自监督来对图像文本对进行尝试,但效果却不好,归根结底是由于数据规模的有限,甚至导致zero-shot的性能不如传统的机器学习,因此这方向探索的热情也就没那么高了。因此有些工作尝试从另一个方向来开展,就是使用更弱的一些监督信号来进行视觉模型的学习,比如有些工作尝试在Instgram上爬取带有hashtag的图像,hashtag其实就相当于文本信号(充当弱监督),这样就可以做一个很大的数据集。以及有人在JFT-300M这样的大数据集上进行训练,该数据集上的文本标注很粗糙,也算相当于一种弱监督。
其实之前这一系列工作的作者都知道使用有限的经过精心设计的标注数据是有很大的局限性的,也都想用这种无尽的原始文本数据。但是因为后一种方法现在效果很低,所以没办法,他们就走了这种实用主义的中间地带,用文本带来的弱监督信号去帮助有监督模型取得更好的效果。虽然后者取得了很好的效果,思路也与CLIP很相似,但是这些工作也还是有局限的,他们这些数据也是经过精心设计的,类别也是从1000到18392个这样的有限类别,并不能真正做到随心所欲zero-shot,并且他们的工作最后都是使用Softmax做一个分类头,所以他们的工作都是固定的,从指定好的类别中选出一个。
其实不论是在大规模数据集中使用文本弱监督信号的方法,还是在有限数据集下借助文本监督信号来进行监督视觉模型学习表征的方法,区别并不是很大,关键其实就在规模上(模型+数据集)。上面的这些弱监督学习方法是在亿级规模的数据集上进行训练。最近的这些方法(VirTex,ICMLM, ConVIRT,思路其实与CLIP很相似)在有限数据集上进行图文对学习的方法,只是在几十万张图片上训练了几天,自然无法跟之前的那些方法相比。其实之前这些方法不行,并不是方法不行,而是因为规模不行,只要规模上去了,效果自然会非常好。因此CLIP这篇工作要做的就是,把规模做大,作者首先做的是收集了一个4亿个图像文本对(与JFT-300M一个量级)数据集,然后在模型上使用了不同尺寸的基于ResNet、Transformer等的大模型,方法上其实就是ConVIRT方法的简化版。
方法
CLIP是一种基于对比学习的多模态模型,CLIP的训练数据是文本-图像对:一张图像和它对应的文本描述,这里希望通过对比学习,模型能够学习到文本-图像对的匹配关系。如下图1所示,CLIP包括两个模型:Text Encoder和Image Encoder,其中Text Encoder用来提取文本的特征,可以采用NLP中常用的text transformer模型;而Image Encoder用来提取图像的特征,可以采用常用CNN模型或者vision transformer。
对提取的文本特征和图像特征进行对比学习。对于一个包含 N N N个文本-图像对的训练batch,将 N N N个文本特征和 N N N个图像特征两两组合,CLIP模型会预测出 N ∗ N N*N N∗N个可能的文本-图像对的相似度,这里的相似度直接计算文本特征和图像特征的余弦相似性(cosine similarity),即图1所示的矩阵。
与CV中常用的先预训练然后微调不同,CLIP可以直接实现zero-shot的图像分类,即不需要任何训练数据,就能在某个具体下游任务上实现分类,这也是CLIP亮点和强大之处。用CLIP实现zero-shot分类很简单,只需要简单的两步:
- 根据任务的分类标签构建每个类别的描述文本:
A photo of {label}
,然后将这些文本送入Text Encoder得到对应的文本特征,如果类别数目为 N N N,那么将得到 N N N个文本特征; - 将要预测的图像送入Image Encoder得到图像特征,然后与 N N N个文本特征计算缩放的余弦相似度(和训练过程一致),然后选择相似度最大的文本对应的类别作为图像分类预测结果,进一步地,可以将这些相似度看成logits,送入softmax后可以到每个类别的预测概率。(体现出了预训练-提示范式)
关于训练效率,对于多模态预训练这样的任务,训练效率是决定训练效果的关键。因此CLIP选择了基于对比学习而非GPT那样的语言生成。如果要从一个图片逐字逐句的预测一段文本的话,这样计算量太大,训练效率太低。但是如果把这个预测任务变成一个对比任务,就是只是输入一张图片,来预测是否与这个文本是否配对,那这样训练难度就会简单很多。前者属于在原始信号空间做预测,后者属于在表示空间做对比。将GPT这种预测性的目标函数换成对比性的目标函数后,训练效率提升了4倍: