Learning Transferable Visual Models From Natural Language Supervision

CLIP
一个简单的Idea,使用互联网上的图片,进行pre-training(具体的讲,就是使用caption去匹配图片这个task)。在训练结束后,自然语言用来参照学习到的视觉概念。然后进行zero-shot transfer learning。

首先是制作一个足够大的图片与文本的集合:

现有的数据集都不能满足要求。所以作者制作了一个大致4亿个图片与文本对。对于文本来说,包含一个query集合中的一个。制作query的时候,选取了50,0000个query(基础query集合,选择的标准是在英文的维基百科上起码出现了100次的词。还通过一些方式进行了扩充,原文的说法是有较高的点互信息的词。一些搜索量大于某一特定值的文章标题,还有WordNet中那些没有被放进query list中的同义词也被扩充了)。但是平衡了每一个query对应的图片等个数。

整体的approach:

关于模型的efficiency的问题:

如果采用了一个ConvNet和一个transformer-based text encoder的话,后者的这样一个transformer是2x的大于CNN的模型。这比中间那个橙色的线,bag of words的baseline还要拉跨,主要表现就是不efficient。

不同与普通的language model需要输出完全相同的标注,作者发现这样不是很effificient,所以直接采用了caption和图片匹配的方式。采用了对比学习的方式来学习。在bags of words的基础上进行改动,将学习目标换成了contrastive learning之后,efficiency就提高了。具体的来讲就是,学习了一个多模态的嵌入空间。在一个batch有N个样本的情况下,在image encoder和text encoder输出之后,最大化正确的N对cosine similarity。

最小(N^2 - N)对样本之间的cosine similarity。

作者没有采用的方法包括了self-supervised中的non-linear projection,用了一个linear projection。

没有用其他的初始化策略,去除了text transformation methods(感觉像是text的aug)。图片的aug也只有crop。再加上一个温度系数( au)

选择和放缩模型:

作者选择了两种模型,一个是ResNet-D,平滑了rect-2 blur pooling。将global average pooling用一个attention pooling来改进。其中这个transformer类型的层,是以global average-pooled representation作为query。第二个vision的结构是ViT,改动比较少:在patch embbeding和position embedding结合之后,加了一个layer normalization。然后实现的时候,使用了一点不一样的初始化策略。

text encoder的结构就是普通的transformer,63-M的大小,12层、512宽,8个attention head。最大的vocab size 49512。最长的sequence length是76。在scale的时候,只放缩宽度,不考虑深度。作者发现这个模型的影线很小。

CLIP的核心实现:

训练的scale策略,5个ResNet,3个vit。ResNet-50, a ResNet-101, RN50x4, RN50x16, and RN50x64。 ViT-B/32, a ViT-B/16, and a ViT-L/14。最后使用的 32,768的batch size。使用了gradient checkpoint。半精度。The largest ResNet model, RN50x64, took 18 days to train on 592 V100 GPUs while the largest Vision . Transformer took 12 days on 256 V100 GPUs。还有一个vit使用336的pixel resolution。

Zero-Shot transfer:

Visual N-grams首先研究了zero-shot的transfer。他们的approach学习了一个大小为142806的视觉n-grams的词典参数。优化n-grams的方法是用一个可以微分的Jelinek-Mercer smoothing 来最大化所有的text n-grams对于一张图片的概率。为了实现zero-shot transfer,他们将每一类的名字转化为n-gram的表示,然后根据模型区计算它的概率,预测给出最大概率的那一个。

为了实现zero-shot的transfer,我们需要做的事情是:

直接将文本扔进text encoder里面得到分类器的weights,然后把图片扔进image encoder里面,得到embeddings,计算余弦相似度就可以。与普通的softmax相比,主要区别就是,weights和inputs都是normalize过的,没有bias,加上了temperature scaling。

这里给了个表格,说明了与visual n-grams的性能差异。

prompt engineering and emsemble:

主要就是说,如果一个text有context的话,会涨点。在image net上,仅仅使用A photo of a {label}的方式就可以涨1.3个点。

还有一些customized prompt会帮组zero-shot learning。尤其是在一些fine-grained的数据集上。Oxford-IIIT Pets:A photo of a {label}, a type of pet.对于OCR数据集来说,在文本或者数字旁边使用quotes会提升性能。

在卫星图上,a satellite photo of a {label}会work。

ensemble就是使用A photo of a big {label} 和A photo of a small {label}这种东西,然后把他们在embedding space里面进行融合。在imagenet上涨点超过3.5个点。加在一起,他们一共涨点5个。一个比较直观的图如下:

对于模型的表现,作者在27个数据集上进行了实验。发现在16个数据集上表现的更好:

对比的对象是一个res50,后面加了一个logistic classfier。Stanford Cars and Food101上领先了28.9和21.1个点。但是在Flowers102 and FGVCAircraft,CLIP就拉了。作者推测的主要原因是,由于CLIP的pretrain里面,确实没有这些类别的图片,所以导致比较差。在一些general的分类上,CLIP和r50势均力敌,稍微优于r50。在一些动作识别的数据集上会好一些,作者认为是因为文本的编码器有更多动词的监督信号。

作者的分析是CLIP is quite weak on several specialized, complex, or abstract tasks (在一些高度特殊化的,复杂且抽象的图像上,就不会work)。such as satellite image classifification,lymph node tumor detection (PatchCamelyon), counting objects in synthetic scenes (CLEVRCounts), self-driving related tasks such as

German traffific sign recognition (GTSRB), recognizing distance to the nearest car (KITTI Distance).

论文之后的内容主要在聊与few-shot的关系,以及怎么把few-shot与zero-shot联系起来。CLIP与模型容量,错误率之间的关系。

CLIP在representation learning上的表现。不使用fine-tune,而是采用linear evaluation。

接下里讨论,Natural distribution shift。

CLIP在这个领域也是降维打击:

但是在一些真的out of distribution的数据集上,CLIP还是有一些问题。

将他和人类对性能相比,CLIP觉得难的,人也觉得难:

之后是对数据集本身进行了一些分析。主要是Data的overlap问题。

关于CLIP的一些局限性:

  1. 作者认为,仅仅与baseline打平不是最终目标。因为与这些数据集完全监督的SOTA比起来,CLIP还打不过他们。需要将当前的计算量放大到1000x才能达到现在的SOTA,这在当前的硬件条件下是做不到的。

  2. 作者认为,CLIP在某些专用型特别强的task上不太work。比如,在一些细粒度的数据集上,或者一些比较抽象、对称的task。这些task的图片,在CLIP的pre-train的数据集上出现的比较少。作者认为,还有很多task上,CLIP是在瞎猜。

  3. CLIP在很多自然的图片分布上效果不错,但是在一些真的out-of-distributiob的数据集上还是不太行,比如在OCR上。在rendered text上表现相当不错,因为这在CLIP的pre-training上十分常见。但是在手写数字体识别上就拉垮了,只有88%的准确率。因为从semantic和near-duplicate nearest-neighbor retrieval上没找到。

原文地址:https://www.cnblogs.com/JohnRan/p/15382948.html