论文地址:https://arxiv.org/abs/2103.00020
博客:https://openai.com/blog/clip/
代码:https://github.com/OpenAI/CLIP
论文精读:https://www.bilibili.com/video/BV1SL4y1s7LQ?share_source=copy_web
OpenAI 提出的 CLIP 方法很简单,效果却很好,预训练的模型可以在分类等视觉任务上可以在不同数据集上 zero-shot 取得很好的结果,例如,CLIP 在ImageNet 上 Zero-shot 达到了原始 ResNet-50 的精确度,而不需要使用128万个训练实例中的任何一个。
1. 引言
许多计算机视觉的任务都是基于类别的,固定的类别限制了模型的通用性和可用性,而文本可以提供更加丰富的监督信息。
从文本中直接预训练的方法在 NLP 上取得了很大的成功,这些预训练模型的目标与任务无关,因此在结构上不需要与下游数据集相关的输出头。但是在视觉中,预训练模型通常还是在像 ImageNet 这样有很多标签的数据集上做的。那么能用纯的文本来引导视觉方面的学习吗?
一些工作曾经尝试过直接从自然语言学习图像表征,但是效果不太好,而作者认为,这些方法效果不好的原因是训练规模太小了(有钱人的思考方式)。
于是本文作者创建了一个4亿(包括图像-文本对)的新数据集,并证明了从零开始训练的 ConVIRT 的简化版本,可以训练出一个效果惊人的预训练模型,在30个数据集上 zero shot 的表现不输于一些专门设计的网络,并且更加健壮。
2. 方法
CLIP 的核心思想就是用自然语言来训练一个比较好的视觉模型。
利用自然语言来训练视觉模型,一方面可以避免使用大规模的标注数据,数据来更容易获取;另一方面,训练学到的特征并不只是视觉表征,还有和文本语义的结合。
在训练之前,作者发现现有的数据集都不够大,于是先自己搞了个数据集,包含4亿对(图像、文本)的新数据集,叫做 WIT( Web ImageText)。
在训练过程中,作者发现训练效率是自然语言监督成功扩展的关键,并根据这一度量选择了最终的预训练方法。
在实验中作者发现,如果用图像CNN与文本transformer结合起直接预测图片的标题,这样的训练效率会低很多,因为它们需要学习每张图对应的文本中“多余”的文字。图像对比表征学习的最新研究发现,对比目标比相应的预测目标能更好地学习表征。于是作者把任务改成了寻找文本中与图片最匹配的文本,把预测目标改成了对比目标,发现效率提高了四倍。
给定一个 batch 包括 个(图像-文本)对,CLIP 的训练目标是判断在一个 batch 中 个图像文本配对中的哪一对是匹配的。为此,CLIP 学习多模态嵌入空间,通过联合训练图像编码器和文本编码器来最大化 batch 中 对匹配的图文特征的余弦相似度,同时最小化 个错误对的余弦相似度。作者在这些相似度上用对称的交叉熵损失进行优化。
因为数据集太大了,所以作者并不担心过拟合,也不需要用预训练的权重初始化编码器。作者用线性投影来将每个编码器的表示映射到多模式嵌入空间。数据集的数据增强只是用了随即裁剪。在训练过程中,控制softmax中逻辑数范围的温度参数被直接优化为对数参数化乘法标量,以避免转变为超参数。
作者考虑了两种不同的图像编码器结构。第一个是ResNet-50 作为图像编码器的基础架构,用 ResNet-D 和 antialiased rect-2 blur pooling 对原始版本进行了几个修改,还用注意力汇集机制取代了全局平均汇集层。第二个是ViT略微做了一些修改。
文本编码器是一个修改过的 Transformer。作者使用了一个63M参数的宽度512的8头模型,在文本编码器中使用了 masked self-attention,以保持使用预先训练的语言模型初始化或添加语言建模作为辅助目标的能力。
作者同样地分配额外的计算来增加模型的宽度、深度和分辨率。对于文本编码器,只缩放模型的宽度,使其与 ResNet 宽度的计算增量成正比,而不缩放深度,因为作者发现 CLIP 的性能对文本编码器的容量不那么敏感。
训练部分的参数设置:
- 5 个 ResNet: ResNet-50,ResNet-101,4xResNet-50, 16xResNet-50, 64xResNet-50
- 3 个 ViT: ViT-B/32, ViT-B/16, ViT-L/14
- epochs: 32
- optimizer: Adam with decoupled weight decay regularization
- scheduler: cosine schedule
- 初始超参数:grid search
- 其他: 半精度,训练好后再在略大一些的336分辨率多训练一个epoch
最终选择效果最好的 ViT-L/14@336px,作为后文 CLIP 所指的模型。
3. 实验
3.1 Zero-Shot Transfer
在计算机视觉中,Zero-Shot 学习通常指的是在图像分类中对没见过的对象类别进行泛化的研究。而这里作者指的是更广义的在没见过的数据集上的泛化研究。
与Visual N-gram的对比
Visual N-gram首先研究了现有图像分类数据集的 zero-shot transfe,它使用了一种通用的预训练模型,用 zero-shot transfer 到标准图像分类数据集的方法。这也是作者所知的唯一一项研究 zero-shot transfer 到标准图像分类数据集的工作,并且是对CLIP 的最佳参照。他们的方法学习了 142,806 个视觉 n-grams (跨度为1-5-gram)的字典的参数,并使用 Jelinek-Mercer 平滑的差分版本来优化这些n-gram,以最大化给定图像的所有文本 n-gram 的概率。为了实现 zero-shot transfer,他们首先将数据集的每个类名的文本转换成其n-gram表示,然后根据他们的模型计算其概率,预测得分最高的那个。
CLIP 的预训练方式是预测一张图片和一段文本在其数据集中是否匹配。为了实现 zero-shot transfer, 对于每个数据集,作者使用数据集中所有类的名称作为潜在文本配对的集合,并用 CLIP 预测最可能的(图像-文本)配对。
具体可以看上面的图2的(2)和(3),首先计算图像的特征嵌入和可能文本集合的特征嵌入,然后计算这些嵌入的余弦相似度,用温度参数进行缩放,并通过Softmax将其归一化为概率分布。
预测层是具有L2归一化输入、L2归一化权重、无偏差和温度缩放的多项式 Logistic回归分类器。图像编码器计算图像的特征表示,而文本编码器基于视觉类别的文本来生成线性分类器的权重。对于ImageNet上的 zero-shot迁移,文本编码器需要生成 1000 个类别的表示,对于每张图片,都会用图片的特征表示和这 1000 个文本表示进行匹配,最接近的文本特征对应的类别就是图像属于的类别。
与 Visual N-Grams 的比较可以看出 CLIP 有很大的提升。 Visual N-Grams 在ImageNet上zero-shot迁移的准确率是 11.5%,而 CLIP 是76.2% 吗,相当于原始ResNet-50的性能。但是这不是一个公平的对比,因为CLIP的数据集和模型更大,计算量更多。
Prompt Engineering 和 Ensembling
对于一些数据集,单独的一个标签也许并不能很好的描述图片的内容,比如多义词的问题,在 Oxford-IIIT Pet 数据集里,boxer指的是一种狗,而不是拳击运动员。
另一方面,作者的数据集中用来描述图片内容的文本通常是一个句子,而不是一个单词,因此作者使用了 “A photo of a {label}.” 的模板来生成文本。这个方法比只使用标签文本的baseline 性能有所提高,在ImageNet上的准确率提高了1.3%。此外,如果在文本模板里在多加点信息,例如“A photo of a {label}, a type of pet.”,会很好的提高效果。
zero-shot CLIP 的表现
在 27 个数据集上与一个linear probe的ResNet50的对比,可以看出在一些比较日常场景的任务上 CLIP 的表现的更好,在一些更加专业的、复杂的数据集上,比如德国交通标志识别(GTSRB),CLIP 表现得不如 ResNet。
3.2 特征学习
Fine-tuning 与 linear probe
- Linear probe:把一个训练好的模型冻结住,只训练最后一层的分类头去做分类任务。
- Fine tune:对整个模型参数进行端到端的训练
CLIP 的作者选择了linear probe的方法进行预训练模型在其他数据集上表现的对比。
6. 局限性
- CLIP zero-shot迁移的效果并不比SOTA的模型更好,并且不能用增大规模的方式进一步提高效果
- CLIP 在一些数据集上效果不好
- CLIP 在超出数据集分布的数据上表现也不好,比如MNIST
- CLIP 需要很大量的数据
- 虽然CLIP是用来zero-shot迁移学习的,其实无形中利用到了验证集的信息。
- 数据集本身可能存在社会偏见等
总结一下,这是一个用大模型和大数据做了大量实验的工作,最值得注意的应该是CLIP摆脱了对于有标签的数据的依赖,对于训练和迁移学习更加方便。
后续工作:
StyleCLIP: Text-Driven Manipulation of StyleGAN Imagery,CLIP+StyleGAN文字引导图像改变
CLIPDraw: Exploring Text-to-Drawing Synthesis through Language-Image Encoders,文字生成简笔画