CLIP1¶
概述¶
当前SOTA的计算机视觉系统通常被训练来预测一组固定的, 预先设定的目标类别. 这种受限的监督方式限制了系统的通用性和可用性, 因为对于任何其他视觉目标, 需要额外的标注数据, 然后对模型进行再训练或者微调. 作者提出, 利用图像对应的文本信息来学习是一种具有前景的替代方法, 这是因为, 与传统的预测类别标签相比, 文本所包含的信息更加广泛, 丰富, 而且不局限于在少数预定义的类别范围内.
在这里, 作者的核心思想是一个简单却又有效的预训练任务: 从一大批(图片, 文本)对中, 学习如何匹配正确的图片和文本. 具体来说, 假设我们有4亿(图片, 文本)对, 这些对来自于互联网上的公开数据, 使用一个对比学习的框架进行训练, 模型输入一张图片和若干条文本, 模型被训练去区分正确的文本和错误的文本, 学习到在语义层面上可以和图片匹配的文本向量表示, 以及和文本匹配的图片向量表示.
当完成预训练后, 就可以用自然语言来"调用"模型学到的使用文本表示的视觉概念. 例如, 如果想让模型识别一张新的图片中是否存在某个类别, 我们可以直接使用文本描述这些类别, 让模型自己去判断图片和哪些文本描述最相似, 概率最高的就是对应的类别.
作者在超过30个现有的计算机视觉数据集上对该方法进行评测, 包括OCR, 视频中的动作识别, 地理位置定位以及许多细粒度对象分类等任务, 结果表明: 该模型在大多数任务上都能取得不错的表现, 且无需对每个数据集(下游任务)进行专门的监督训练. 例如, 作者提到在ImageNet上, 通过zero-shot的方式, 就取得了和ResNet-50相当的准确度. 提一嘴, CLIP在预训练阶段没有见过任何一张ImageNet中的图片, 而ResNet在预训练阶段则是在整个ImageNet数据上进行过专门的训练.
作者在GitHub上发布了他们的代码和预训练模型的权重: https://github.com/OpenAI/CLIP.
背景¶
文本领域的突破¶
近年来, 直接从原始文本自监督学习的预训练方法彻底改变了NLP领域. 和任务无关的任务, 即前置任务或优化目标, 如自回归和MLM, 已经在计算量, 模型容量和数据方面扩展了好多个数量级, 并且能力也在持续提升. 文本到文本范式作为标准的输入输出接口, 使得下游任务无关的预训练架构可以在零样本的情况下就直接迁移到下游数据集上, 不需要添加额外的输出头或者数据集相关的特别设计, 这里的zero-shot指的是面对一个没有见过的新任务或者新数据集, 只要依旧可以把任务需求/数据用文本形式描述出来, 模型就可以直接迁移过去. 像GPT-3这样的旗舰预训练模型可以在许多下游任务中都可以与定制的模型竞争, 同时几乎不需要下游的特定数据集的训练数据.
这些结果表明, 在网络规模的文本集合中使用现代预训练方法所能获得的整体自监督资源已经超过了高质量人工标注的NLP数据集. 然而, 在其他领域, 如计算机视觉中, 仍然才普遍采用人工标注的数据集, 例如ImageNet, 上对模型进行预训练. 那么, 是否也可以在计算机视觉领域使用类似NLP的方法带来突破? 前人的工作令人鼓舞.
前人的尝试: 弱监督学习¶
监督的各种种类, 比如什么是弱监督/什么是强监督, 请见这里. 弱监督学习是介于强监督学习和自监督学习之间的一种学习, 它无法生成自监督讯号, 但是也不需要像强监督学习那样需要精心标注的数据. 弱监督学习可以使得我们不需要像ImageNet这样的高质量数据集, 只需要从Ins上面的图片和tag就可以了. 下面的两种不同的方法对应着(1) 使用Ins的图片+Ins的tag; (2) 使用Ins的图片+Ins的tag中和ImageNet相关的tag.
发散/无针对性¶
在20多年前, Mori等人探讨了通过训练一个模型来预测与图像配对的文本文档中的名词和形容词, 从而改进基于内容的图像检索. Quattoni等人关注用于预测和图像相关的标题中的词的分类器的权重空间中, 通过流形学习(Manifold Learning)来提升图像表示的效率和数据利用效率. Srivastava和Salakhutdinov探索了通过多模态深度玻尔兹曼机(Deep Boltzmann Machines, DBMs)在图像和文本标签特征之上进行联合训练, 以提升图像表示的语义理解能力. Joulin等人致力于通过训练卷积神经网络预测图像标题中的词汇, 以学习有用的图像表示. 他们使用了YFCC100M数据集, 这个数据集包含了丰富的元数据, 如图片的标题, 描述和标签, 这些元数据形成了一个词汇表. 对于每张图片, 用AlexNet判断词汇表中的元数据是否位于当前图片的元数据中, 不是的为0, 是的为1. Li等人在2017年进一步扩展了之前的方法, 不仅预测单个词汇, 还预测短语(n-grams), 他们基于学习到的视觉n-grams词典, 为目标类别进行评分, 具体来说, 系统会根据图像中预测到的视觉n-grams, 计算每个目标类别的得分, 最终, 系统选择得分最高的类别作为图像的分类结果. 后续的工作诸如VirTex, ICMLM和ConVIRT分别结合了Transformer架构, 掩码语言建模, 对比学习目标, 进一步提升了以文本作为弱监督信号学习图像表示的效果.
收敛/有针对性¶
虽然这种概念非常令人振奋, 但是使用自然语言监督进行图像表示学习仍然很少见, 这可能是因为在常见benchmark上的表现远低于其他方法. Li等人的方法在zero-shot下, 在ImageNet上的准确率仅为11.5%, 这远远低于当前的SOTA, 88.4%的准确率, 甚至还低于经典的计算机视觉方法, 50%. 相反的, 更加收敛/有针对性的弱监督方法能够显著提高性能. Mahajan等人的研究表明, 在Instagram的图片上预测和ImageNet类别相关的针对性标签是一个有效的预训练任务, 它在精确标注的ImageNet上进行微调后, 这些预训练模型的精度比当时的SOTA提升了5%. Kolesnikov等人和Dosovitskiy等人也通过在规模极大的JFT-300M上预测带噪标签在许多的benchmark上都取得了不错的结果.
这个工作代表了一种居中的策略, 即不偏向完全的强监督学习, 也不偏向发散/无针对性的弱监督学习. 然而, 这并非没有妥协, 上述的两项研究谨慎地设计并限制了其监督范围, 分别为1000, 18291个类别. 自然语言凭借着其概括性, 能够表达更加广泛的视觉概念. 但是上述的做法需要事先限定可以预测的类别, 使用的都是静态的softmax, 只能预测定义好的1000或者18291个类别. 模型在面对未见过的视觉概念的时候, 就很难通过现存的自然语言来描述图片, 严重限制了它们的灵活性和zero-shot能力.
🌟所以, 我们就很纠结, 使用发散/无针对性的弱监督学习可以使用几乎无限的自然语言类别来描述视觉概念, 但是性能较差; 使用收敛/有针对性的弱监督学习性能较高, 但是只能使用有限的自然语言类别来描述视觉概念, 限制了zero-shot能力, 到底有什么方法能解决这两个问题呢?🌟
CLIP的提出¶
上述的这些弱监督学习语言模型和最近直接从自然语言学习到图片表示的探索之间的一个关键区别在于规模, 尽管Mahajan等人和Kolesnikov等人在数百万到数十亿张图像上进行了长达数个加速器年(Accelerator years, 这是什么鬼东西), VirTex, ICMLM和ConVIRT仅在一到二十万张图像上进行了长达数个加速器年的训练.
🌟CLIP选择了在发散/无针对性的弱监督学习上进一步做文章, 主要做了两点非常重要的改进: 一个是大规模的训练数据; 另一个是对比学习的范式, 这一点是从ConVIRT那里继承过来的.🌟
在这项工作中, 他们缩小了这个差距, 研究了使用大规模自然语言监督训练的图像分类器的表现. 得益于互联网上大量公开可用的数据, 他们创建了一个包含4亿对(图像, 文本)的新数据集, 并证明了一种从头开始训练的简化版ConVIRT, 叫做CLIP, 这是一种高效地从自然语言监督中学习图像表示的方法. 他们训练了一系列8个不同规模的CLIP模型, 这些模型所需要的计算资源跨越了接近两个数量级. 他们观察到, 这些模型在迁移学习任务中的性能表现和所使用的计算资源之间存在一种平滑且可以预测的关系, 这一发现参考了Hestness等人和Kaplan等人的研究成果.
作者发现, CLIP和GPT家族类似, 它仅仅是在预训练阶段就学习了如何执行广泛的任务, 包括OCR, 地理定位, 动作识别和其他许多任务, 他们通过在超过30个现存的数据集上测试CLIP的零样本迁移性能发现了这一点, 甚至能和之前特定任务的监督模型相媲美. 他们还通过使用线性探测表示学习分析, 进一步验证了之前的发现. 他们展示了CLIP模型不仅仅在性能上优于现有的SOTA ImageNet模型, 而且在计算效率方面也更具有优势. 此外, 他们还发现, CLIP模型在零样本下的鲁棒性远超具有相同准确度的监督式ImageNet模型. 这表明, 对任务无关(task agnostic)模型进行零样本评估, 更能准确反映模型的整体能力.
方法论¶
自然语言监督¶
作者方法的核心是利用自然语言中的监督信息来学习感知. 正如在背景中讨论的, 这绝不是一个新的想法. 用于描述这一领域研究的属于既多样又矛盾. Zhang等人, Gomez等人, Joulin等人和Desai, Johnson介绍了从图像和文本配对中学习视觉表征的方法, 但是分别将个字的方法描述为无监督, 自监督, 弱监督和强监督学习.
这一领域的工作共同点并非所有方法中的特定细节, 而是对自然语言作为监督讯号的重视. 所有的这些额工作都从自然语言中进行监督学习. 早期的研究在使用主题模型和n-gram表示的时候, 需要应对自然语言的复杂性, 但是随着深度上下文表示学习的进步, 如McCann等人在2017年的工作, 我们现在已经拥有更加强大的工具来有效利用这类丰富的监督信号.
从自然语言中进行学习具备几大优势. 首先, 相比于图像分类常用的众包标注, 从自然语言中获取的监督信息的可扩展性更强, 因为不需要将标注数据统一成类似1-of-N金标准标签这样的机器学习经典格式. 其次. 这种方法可以从互联网的大量文本中被动学习其中所蕴含的监督信息, 而不必像传统强监督学习那样可以收集或者创建标注数据. 最后, 与大多数无监督或者自监督学习方法相比, 从自然语言中学习不仅能够学习到图像的深层表征, 还能把这些表征和语言本身关联起来, 从而实现灵活的zero-shot迁移.
创造足够大的数据集¶
现有的工作使用三个数据集, 即MS-COCO, Visual Genome和YFCC100M. 尽管MS-COCO和Visual Genome是高质量的人工标注数据集, 但是按照现代的标准来看, 它们的规模极小, 每个数据集的训练照片约为10万张. 相比之下, 其他计算机视觉系统则使用多达35亿张Instagram照片进行训练. YFCC100M, 包含1亿张照片, 是一个可能的替代方案, 但是每张图像的元数据都比较稀疏且质量参差不齐. 许多图像使用自动生成的文件名, 例如20160716 113957.JPG
作为"标题", 或包含相机曝光设置作为"descriptions". 在过滤后, 只保留包含英文自然语言标题和/或描述的图像, 数据集缩小了6倍, 仅剩下1500万张照片, 这大约和ImageNet的大小相同.
自然语言监督的主要动机是互联网上公开可用的大量此类数据. 由于现有的数据未能充分反映这种数据的多元性, 丰富性, 仅根据现有的数据集的结果将会低估该研究方向的潜力. 为此, 作者构建了一个新的数据集, 包含从互联网上各种公开来源收集的4亿对(图像, 文本)数据. 为了涵盖尽可能广的视觉概念, 他们在构建的过程中, 会在网上搜集(图像, 文本)对, 其文本是500,000个查询中的一个(见下方例子). 它们为每个查询(或者可以视为"类")最多收集20,000条图文配对数据, 用这种方式在不同查询之间保持"近似平衡", 避免某个查询下的图文配对过多或者过少. 通过这种方式构建出的数据集, 其总文本字数规模与用于训练GPT-2的WebText数据集相当. 他们将这个数据集命名为WIT(WebImageText).
如何构建4亿对(图像, 文本)数据集
假设研究人员手中有一个关键词列表, 其中包含"西红柿炒鸡蛋", "海边日落", "狗追球", "黄色跑车", "星空摄影"等500000个查询词或者短语. 在构建数据集的时候, 他们会在网上或者其他渠道搜索文本描述和图片, 并筛选出文本当中包含这些关键词的(image, text)对, 对于每个查询, 最多收集20000条图文配对数据. 例如:
- 文本: "我在海边拍到了非常美的海边日落照片", 且配套一张海边黄昏照片
- 文本: "这张照片是狗追球的瞬间, 很有趣", 且配套的一张狗追球的运动场景图片
选择高效的预训练方法¶
当前的难点¶
最新的计算机视觉系统需要大量的计算资源. Manhajan等人训练他们的ResNeXt1101-32x48d模型需要19个GPU年, 而Xie等人训练他们的Noisy Student EfficientNet-L2模型则需要33个TPUv3年. 考虑到这两个系统都只训练用于预测1000个ImageNet类别, 从自然语言学习开放式的视觉概念的任务似乎令人望而生畏. 在作者的努力过程中, 他们发现训练效率是扩展自然语言监督的关键, 基于这个指标他们选择了最终的预训练方法.
之前的工作: 预测目标¶
他们的初始方法, 类似于VirTex, 从头开始联合训练图像CNN和文本Transformer来预测图像的标题. 使用一个CNN(如ResNet-50)从输入图像中提取特征, 然后将提取到的特征输入到一个Transformer语言模型中, 根据输入的图像特征, 预测与图像对应的文本标题/描述. 然而, 这种方法在实际操作中很难高效地扩展规模. 在下图中, 他们展示了一个拥有6300万参数的Transformer语言模型, 这个大模型所使用的计算量已经是它搭档ResNet-50图像编码器的两倍. 与预测相同文本的词袋编码更简单的基线相比, 学习识别ImageNet类别慢了三倍.
BoW Prediction和VirTex的不同之处和相同之处
不同之处: BoW Prediction: 只要预测出图像对应标题/描述中所包含的词汇集合, 不关心词和词之间的顺序或者上下文关系, 换句话说, 它只要判断文本里面有没有cat, apple之类的词就可以. VirTex: 不仅要"知道"文本里面有什么词, 还需要按顺序将整个句子或者标题写出来, 即真正的序列预测任务, 该方法需要捕捉语义和语法之间的复杂关系.
相同之处: 它们都需要试图预测和每张图像相关的文本的 精确 词语. 即将预测作为目标.
CLIP: 对比目标¶
上述的两个方法有一个相同之处, 就是它们试图预测和每张图片相关的文本的精确词汇. 由于图像常常伴随着各种各样的描述, 评论和相关文字, 这是一项极其艰巨的任务. 最近的在对比表示学习领域的研究表示, 使用对比目标能够学习比等效的预测目标更好的表示. 其他的研究发现, 尽管图像生成模型能够学习到高质量的图像表示, 但是其所需的计算量比具有相同性能的对比模型高出一个数量级.
考虑到这些发现, 作者探索了训练一个系统来解决一个更容易的代理任务(proxy task): 即预测哪一段文字整体和哪张图像配对, 而不是预测这段文字的精确词语. 从相同的BOW Prediction基线开始, 他们将预测目标替换为了对比目标, 观察到从零样本迁移到ImageNet的速率进一步提高了4倍.
我们在一次训练中会取出一个批次的\(N\)个(图像, 文本)对. 换句话说, 这个批次中共有\(N\)幅图像和\(N\)条文本, 每条文本和一副图像是一一对应的正确配对. 然后, 我们会把这\(N\)幅图像和这\(N\)条文本做全排列, 得到总共\(N^2\)个(图像, 文本)组合, 其中只有\(N\)个是正确的原始配对, 其他的\(N^2-N\)个则是错误的配对. CLIP同时学习到一个图像编码器和一个文本编码器, 将图像和文本映射到同一个向量空间中, 这样, 每个图像和每个文本都会有一个对应的向量. 在这个嵌入空间中, CLIP要让正确的(图像, 文本)对之间的余弦相似度尽可能大, 同时要让错误(图像, 文本)对之间的相似度尽可能小. 具体的损失函数是一个对称的交叉熵形式(即我们从两个方向都计算一次交叉熵损失, 然后再将它们加在一起), 与对比学习中常用的InfoNCE或者N-pair loss十分相似, 它会同时考虑"从图像到文本"以及"从文本到图像"这两个方向的匹配, 将正确配对的相似度推高, 错误配对的相似度压低.
优于预训练数据集的规模比较大, 过拟合并不是主要问题, 因此, 和Zhan等人的实现相比, 作者对CLIP的训练细节进行了简化. 他们从头开始训练CLIP, 没有使用ImageNet的权重来初始化图像编码器, 也没有使用预训练权重来初始化文本编码器. 他们没有使用非线性投影层, 只是直接使用线性映射到多模态对比空间, 一方面是因为大规模数据本身的强表示能力使得更多的模型复杂化策略并不一定带来收益, 另一方面, 非线性投影层可能与当前一些仅针对图像的自监督学习方法中使用的特定策略紧密相关(如SimCLR在编码器的输出特征上方增加了一个包含一层或者多层全连接层的MLP, 并配合ReLU等激活函数, 这个非线性投影头专门用来优化对比损失, 如InfoNCE). 他们还移除了Zhang等人的研究中的文本转换函数\(t_u\), 因为在CLIP的预训练数据集中, 大多数(图像, 文本)对只包含一个句子, 而\(t_u\)用于从文本中均匀地采样单句内容. 他们也对图像转换函数\(t_v\)进行了简化, 训练的时候唯一使用的数据增强是从缩放后的图像中随机裁剪一个正方形. 最后, 用于控制softmax中logits范围的温度参数\(\tau\)在训练过程中被直接优化, 从而避免将其作为超参数进行调整.
下面是CLIP的伪代码.
# 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
# W_i[d_i, d_e] - learned projection of image to embed
# W_t[d_t, d_e] - learned projection of text to embed
# 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]
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 [n, n]
logits = np.dot(I_e, T_e.T) * np.exp(t)
# symmetric loss function
labels = np.arange(n)
loss_i = cross_entropy_loss(logits, labels, axis=0)
loss_t = cross_entropy_loss(logits, labels, axis=1)
loss = (loss_i + loss_t) / 2
选择和缩放模型¶
图像编码器¶
作者考虑了两种不同的图像编码器架构. 第一种, 他们使用了ResNet-50, 因为它被广泛采用而且性能得到证实. 他们使用He等人的ResNet-D增强版和Zhang的反锯齿矩形-2模糊池化对原始版本进行了一些修改. 他们还用注意力池化层替换了全局平均池化层. 注意力池化的具体做法是: 首先对图像的特征图做一个全局平均池化得到一个全局表示, 然后将该表示作为Attention机制中的Query, Key和Value则来自于原本的特征图. 通过QKV注意力, 网络可以"关注"特征图中的不同区域, 并加权得到最终的图像表示. 相比于简单的平均池化, 这种注意力机制更加灵活, 也能捕捉到更加丰富的语义信息. 对于第二种架构, 他们采用了最近提出的ViT, 作者没有做太多的修改, 只在transformer前面patch嵌入和位置嵌入合并之后加了一层LN并且用了一个稍微不一样的初始化方案.
文本编码器¶
文本编码器是一个Transformer. 作为基准大小, 他们使用了一个包含63M参数, 12层, 512维, 8个注意力头的模型. 使用Byte Pair Encoding(BPE)对文本进行分词, 词表大小为49152, 并将所有的文本转换为小写, 出于计算效率的考虑, 最大序列长度被限制在76. 文本序列用[SOS]
和[EOS]
标记开始和结束. 在Transformer的最高层, 取[EOS]
对应的激活输出作为文本的表示, 该表示经过LN, 再经过线性映射, 进入多模态的嵌入空间. 他们还是还用了掩码自注意力, 这是为了保留用一个大型预训练语言模型初始化的能力, 或者加入语言建模作为辅助训练目标, 他们还没有展开这方面的研究.
缩放模型¶
以往的计算机视觉研究通常通过单独增加模型的宽度或者深度来缩放模型, 对于ResNet图像编码器, 作者采用了Tan和Le提出的方法, 他们发现将额外的计算资源分配到宽度, 深度和分辨率这三个维度上优于仅将其分配到宽度或者深度上. 尽管Tan和Le为其EfficientNet架构调整了分配给每个维度的计算比例, 但是作者使用了一个简单的基线, 即平等地增加模型的宽度, 深度和分辨率. 对于文本编码器, 仅缩放模型的宽度使其和ResNet宽度增加成比例, 这是因为他们发现CLIP的性能对文本编码器的规模不太敏感.
训练¶
作者训练了一系列5个ResNet和3个ViT. 对于ResNet, 他们训练了ResNet-50, ResNet-101, 然后又基于EfficientNet的风格进行模型缩放, 得到3个计算量分别约为ResNet-50的4倍, 16倍和64倍的模型, 分别记为RN50x4, RN50x16和RN50x64. 对于ViT, 他们训练了ViT-B/32, ViT-B/16和ViT-L/14. 他们对所有模型都进行了32个epoch的训练.
他们使用Adam优化器, 对所有不包含gain后者bias的权重使用解耦的权重衰减. 学习率按照余弦退火的方式进行衰减. 初始超参数的设定是通过在ResNet-50基线模型上使用网格搜索, 随机搜索和手动调参的组合进行1个epoch训练得出的. 由于计算的限制, 对于更大的模型, 则通过启发式方法对超参数进行调整. 温度\(\tau\)初始化为Wu等人研究中的0.07等效值, 并进行裁剪以防止logits被放大超过100, 因为他们发现这样训练会不稳定.
他们使用了非常啊的mini-batch size: 32768. 为了加速训练并且节省显存, 他们使用了混合精度训练. 此外, 他们使用了梯度检查点, 半精度的Adam统计量, 以及对文本编码器权重进行半精度随机舍入来节省额外的显存. 在计算embedding相似度的时候, 他们将其分片, 由各个GPU分别计算其本地批量所需的那部分pairwise相似度. 最大的ResNet模型RN50x64在592块V100 GPU上训练了18天, 而最大的ViT在256块V100 GPU上训练了12天.
对于ViT-L/14, 他们在更高的336像素分辨率又预训练了一个额外的epoch以提升性能, 这和FixRes的思路相似, 他们将该模型标记为ViT-L/14@336px.
-
Radford, A., Kim, J. W., Hallacy, C., Ramesh, A., Goh, G., Agarwal, S., Sastry, G., Askell, A., Mishkin, P., Clark, J., Krueger, G., & Sutskever, I. (2021). Learning transferable visual models from natural language supervision (No. arXiv:2103.00020). arXiv. https://doi.org/10.48550/arXiv.2103.00020 ↩