Learning Transferable Visual Models From Natural Language Supervision
简介
在过去的几年里,直接从原始文本中学习的预训练方法已经彻底改变了NLP。任务未知的目标(Task-agnostic objectives ),如自回归和掩码语言模型,已经在计算、模型容量和数据的多个层次上扩展,稳步提高了性能。text-to-text作为一个标准化输入输出接口的发展让任务未知架构能够zero-shot转换到下游数据集,从而消除了特殊输出头或数据集特殊定制的的需求。
在网络规模的文本集合中,aggregate supervision 能够适应现代的预训练方法,且优于高质量的群体标记NLP数据集。然而,在其他领域如计算机视觉,依旧是标准的做法,在人群标记数据集(如ImageNet)上预训练模型。直接从网络文本中学习的可扩展预训练方法是否能够在计算机视觉领域取得类似的突破?之前的一些工作令人鼓舞:
20多年前,Mori等人通过训练一个模型来预测与图像配对的文本文档中的名词和形容词,从而探索改进基于内容的图像检索。Quattoni等人证明通过流形学习,在分类器的权重空间训练预测字幕与图像相关的字符,学习更多的数据有效的图像表示是可能的。Srivastava和Salakhutdinov在底层图像和文本标记特征的基础上训练多模态 Deep Boltzmann Machines,探索了深层表征学习…………
虽然理论证明是令人兴奋的,但是用自然语言监督图像表示学习还是很少见的。这可能是因为在通用基准测试上显示的性能远远低于其他方法,例如Li等人在ImageNet上一个zero-shot设置测试的成功了只有11.5%,远低于当前技术水平88.4% 的准确率,甚至低于经典计算机视觉方法50%的准确率。
通过互联网上大量公开的数据,文章创建了一个4亿对(即图像、文本)的新数据集,并证明了一个简化版本的 ConVIRT,称之为 CLIP(Contrastive Language-Image Pre-training),这是一种从自然语言监督中学习的有效方法,研究了 CLIP 的可扩展性,通过训练一系列的8个模型,这些模型涵盖了将近2个数量级的计算和数据服务,即传输性能是平滑可预测的计算函数。在30多个现有数据集上对 CLIP 的zero-shot转换性能进行基准测试,发现其性能可以与先前的任务特定监督模型相比。
本文方法总览如图1所示:
方法
自然语言监督
该方法的思想是从包含监督的自然语言中学习到感知,与其他训练方法相比,从自然语言中学习有一些潜在的优势。与图像分类的标准群源标签相比,规模化自然语言监督要容易得多,因为它不要求注释采用经典的“机器学习兼容格式”,如 canonical 1-of-N majority
vote “gold label”。而作为自然语言工作的方法可以被动地从网络上的大量文本中学习。与大多数无监督或自我监督的学习方法相比,从自然语言中学习也有一个重要的优势,因为它不仅仅“只”学习一种表征,而且还将这种表征与语言联系起来,从而实现灵活的zero-shot
transfer。
创建一个足够大的数据集
自然语言监督的一个主要动机是这种形式的大量数据可以在互联网上公开。由于现有的数据集不能充分反映这种可能性,只考虑它们的结果将不能估计这一研究方向的潜力。为了解决这个问题,我们构建了一个新的数据集,包括从互联网上各种公开资源中收集的4亿对(图像、文本)数据,称为 WIT(WebImageText)。
选择一种有效的预训练方法
最先进的计算机视觉系统需要非常大的计算量,从自然语言中学习一组开放的视觉概念的任务似乎很艰巨。在实验过程中,我们发现训练效率是成功扩展自然语言监控的关键,并在此基础上选择了最终的预训练方法。最初的方法,类似于 VirTex,联合训练一个图像 CNN 和文本转换器从头开始预测图像的标题。
然而,在有效地缩放这种方法处遇到了困难。如图2所示,展示了一个6300万参数transformer 语言模型,它已经使用了两倍于它的 resnet-50图像编码器的计算能力,学会识别 ImageNet 类的速度比预测同一文本的单词包编码的更简单的基准慢三倍。
文章提出了一个训练系统来解决潜在更简单的代理任务,将文本作为一个整体来配对图像,而不是文本的确切字词。从相同的单词包编码基线开始,在图2中将预测目标(prediction)换成对比目标(contrastive),并且观察到zero-shot转换到 ImageNet 的速率进一步提高了4倍。
给定一批(image,text)对样本,CLIP被训练用于预测种可能的样本对在一批中哪个可能实际发生。为实现这点,CLIP通过联合训练一个图像encoder和文本encoder来学习一个多模态嵌入空间,实现一个批次中个真实样本对中最大化图像和文本嵌入的余弦相似度最小化不正确配对的余弦相似度。
CLIP 实现的核心的伪码如图3所示,这种批量结构技术和目标首次被引入到深度测量学习领域。
选择并扩展模型
考虑了两种不同的图像编码器体系结构:首先,使用 ResNet-50作为图像编码器的基本架构,因为它被广泛采用,并且性能得到过验证。对于第二种架构,使用最近推出的 Vision Transformer (ViT)进行实验。
文本编码器是一个Transformer,其基本结构使用了63M-参数 12-层 512-宽 模型并有8个注意力头。
源码分析
使用方法
首先安装PyTorch 1.7.1
和torchvision
,以及一些额外的依赖。在一个CUDA GPU 机器上,如下所示:
$ conda install --yes -c pytorch pytorch=1.7.1 torchvision cudatoolkit=11.0
$ pip install ftfy regex tqdm
$ pip install git+https://github.com/openai/CLIP.git
复制代码
在机器上没有GPU时,将cudatoolkit=11.0
替换为appropriate CUDA版本或cpuonly
。
import torch
import clip
from PIL import Image
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)
image = preprocess(Image.open("CLIP.png")).unsqueeze(0).to(device)
text = clip.tokenize(["a diagram", "a dog", "a cat"]).to(device)
with torch.no_grad():
image_features = model.encode_image(image)
text_features = model.encode_text(text)
logits_per_image, logits_per_text = model(image, text)
probs = logits_per_image.softmax(dim=-1).cpu().numpy()
print("Label probs:", probs) # prints: [[0.9927937 0.00421068 0.00299572]]
复制代码