CLIP将计算机视觉与自然语言处理相结合,获得更加优秀的迁移性能与zero-shot效果。同时打破了固定标签的定式。

Abstract

针对目前已有的计算机视觉系统,大部分都是使用固定的标签集合,这限制了它的泛化性能和可用性。
于是作者选择通过图片的语言文本来进行图像识别。作者爬取了4亿张图片以进行模型的预训练。在预训练完成后,作者在30多个任务上进行了测试。
在ImageNet数据集内,CLIP模型在zero-shot的情况下便已经与训练完成的Resnet50打成平手。

Introduction

GPT作为一个”Text-in-text-out”的经典案例,反映了弱监督工作的可行性,于是作者决定提出使用图片与文字结合,进行CLIP模型的研究。
已有相关研究VirTex, ICMLM和ConVIRT方法虽然接近,但是数据集规模较少,而有些弱监督模型的准确率较高,其依赖的是极度大量数据集,所以作者考虑到是否能够同时满足以上条件,进而研究出新的方法。在预实验结果中,使用已有模型(ConVIRT)与新的数据,其模型在zero-shot上成功体现出极好的效果。同时模型效果与模型大小呈现正相关

Method

Dataset

作者发现目前已有数据集不能满足训练需求,所以选择自己开发数据集。

Pre-Training Method

作者针对该数据的标签,决定使用“图像-文本配对”的方法来进行训练,这是因为如果采用标签生成或者词袋模型,训练过程较慢。
同时作者也采用对比学习的方法进行训练。
作者在训练过程中其实是发现了两个重要的事情。

非线性映射

CLIP(Contrastive Language–Image Pre-training)在其两个编码器(图像编码器与文本编码器)末端各插入了一个 线性映射(linear projection)层,将各自的表示向量映射到同一多模态嵌入空间,以便计算余弦相似度并进行对比损失优化。在早期的对比或自监督学习框架(如 SimCLR、MoCo 等)中,人们常使用 非线性映射头(two-layer MLP + ReLU + BN)来获得更好的特征表示;而 CLIP 的作者发现,去掉这层非线性映射,仅保留简单的线性映射,训练效率与效果几乎无差异,因此选择了更为简洁的设计。

未出现过拟合

作者在训练过程中未出现过拟合。其实挺好理解的,这么大的数据集能过拟合也是神人了
作者对于数据的处理也仅仅只有裁剪,而并未采用更多的高级方法。作者对于温度系数 $t$ 也仅仅只是进行

Choosing and Scaling the Model

伪代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
image_encoder: Resnet or Vision Transformer
text_encoder: CBOW or Text Transformer
I: n * h * w * c, minibatch of aligned images
T: n * l, minibatch of aligned texts
t: learned temperature parameter

# extract feature representations of each modality
I_f = image_encoder(I) #[n, d_i]
T_f = text_encoder(T) #[n, d_t]

# joint multimodal embedding [n, d_e]
# linear projectin
# 这里是多模态常见的合成方法
I_e = l2_normalize(np.dot(I_f, W_i), axis = 1)
T_e = l2_normalize(np.dot(T_f, W_t), axis = 1)

# scaled pairwise cosine similarities
logits = np.dot(I_e, T_e.T) * np.exp(t)

# symmetric loss function
# 这里的正样本是对角线上的数据,也就是第一排第一个,第二排第二个。这里对比学习的思路。
labels = np.arrang(n)
loss_i = cross_entropy_loss(logits, labels, aixs = 0)
loss_t = cross_entropy_loss(logits, labels, aixs = 1)
loss = (loss_i + loss_t)/2

Training

作者训练了5个ResNets和3个Vision Transformers
ResNet: ResNet-50, ResNet-101, EfficientNet-style model 4x, 16x and 64x the compute of a ResNet-50
Vision Transformer: ViT-B/32 Vit-B/16 ViT-L/14
训练32个epoch,Adam优化器
作者对于ViT-L/14在336像素的图片上又额外训练了一个epoch,并将其标注为ViT-L/14@336px. 后面使用的模型均为ViT-L/14@336px

Experiments

Inference

CLIP_inference

  1. 通过Prompt Engineering构造选项(备选方案如plane, car, dog -> A photo of plane, car, dog)经过Text Encoder计算为向量。
  2. 将图片经过Encoder转化为图像,计算图像与词向量的余弦相似度

Prompt Engineering and Ensembling

作者在该段提出了:多义性(polysemy)和标签多为短句的问题。并对于这两种问题,其提出使用提示词模板来解决,例如模板”A photo of a {label}”. 该方法提升准确率1.3%
同时,对于特定数据集,可以将模型进一步扩充,如对于Oxford-IIIT Pets, 则可将模板改为”A photo of a {label}, a type of pets”.

效果分析

  1. CLIP(zero-shot) vs linear probe Resnet50: 对于有具体物体的模型CLIP表现更佳,而抽象概念的数据则相对较差(如数字、纹理)。
  2. CLIP vs previous few-shot method: 远超既往小样本学习结果。CLIP在zero-shot的情况下,准确率已经和BiT-M的16-shot的效果相近。但是在部分few-shot上CLIP反而不如自己的zero-shot。
  3. CLIP使用linear probe效果,全数据集训练效果依旧强劲。

Comparison to Human Performance

Comparison_to_human

Limitation

  1. 距离已有模型的SOTA有较大距离,只是优于ResNet50的Baseline.
  2. CLIP对于部分数据的效果不佳,比如细分类的数据集、抽象概念的数据(数字、异常提取)。
  3. 对于数据分布偏差极大的数据集,效果依旧较差。例如MNIST数据集效果较差,作者分析是因为400M图片中均无MNIST类似的图片。
  4. CLIP不是生成式模型,仍然需要提供一些选项。
  5. CLIP模型对于数据的应用并不高效。
  6. 希望能够产生一种新的,针对Zero-shot的数据集。
  7. 数据并无清洗,可能存在偏见。
  8. CLIP在few-shot的情况下并不如zero-shot优秀。

Cover image icon by Becris from Flaticon