【论文阅读】多模态——CLIP

文献基本信息

  • 标题:Learning Transferable Visual Models From Natural Language Supervision
  • 作者:Alec Radford、Jong Wook Kim、Chris Hallacy、Aditya Ramesh、Gabriel Goh、Sandhini Agarwal、Girish Sastry、Amanda Askell、Pamela Mishkin、Jack Clark、Gretchen Krueger、Ilya Sutskever
  • 单位:OpenAI
  • 会议/期刊:ICML
  • 发表时间:2021年2月26日
  • 代码:https://github.com/OpenAI/CLIP

背景与意义

相关研究

  • 直接从原始文本中预训练模型在过去几年的NLP领域取得了革命性成功,既然利用NLP的自监督信号是一个有前途的方向,那么在CV领域也可以尝试使用。
  • 目前,从有限数量的监督“gold-label”中学习具有一定局限性,而从无限数量的原始文本中学习的目前效果还不大好,所以目前大部分走的是“中间地带”,即用文本带来的弱监督信号帮助有监督模型取得更好的效果
  • 其也有局限性,两种方法都使用静态softmax分类器进行预测,且缺乏动态输出的机制,这严重限制了其灵活性,限制了其“zero-shot”能力。
  • 和CLIP最相似的三种方法(VirTexICMLMConVIRT)只是在几十万张图像上进行训练,和那些用几亿图像的方法相比规模没上去。

解决方案

  • 收集了大数据集:一个超级大的图像文本配对的数据集,有4亿个图像文本的配对。
  • 扩大了模型规模:最大用了ViT-large,一共尝试了8个模型,从ResNet到ViT,最小模型和最大模型之间的计算量相差约100倍。
  • 提出了CLIP:ConVIRT的简化版本。

研究方法与创新点

  • 方法核心:利用自然语言的监督信号,来训练一个比较好的视觉模型。
  • 用自然语言的监督信号训练视觉模型的原因:
    • 不需要再标注这些数据。
    • 因为训练的时候把图像和文本绑定在一起,所以训练的不再只是视觉特征,而是多模态特征,更容易进行zero-shot

创建足够大的数据集

  • 已有的数据集:
  1. MS-COCOVisual Genome:是高质量的人群标记数据集,但很小,只有10万张训练图像。
  2. YFCC100M:包含1亿张图像,但每张图像质量太差了,过滤之后数据集缩小了600万张图像,仅为1500万张图像。
  • 因此,本文构建了一个新的数据集WIT(WebImageText),包含4亿(图像,文本),从互联网上的各种公开来源收集。

选择一种有效的预训练方法

  • 最初的尝试:VitTex的相似工作,图像CNN+文本Transformer,从头开始训练,预测图像的caption,这是一个预测型任务
    • 问题:实验发现一个具有6300万参数的Transformer语言模型,已经使用了ResNet-50图像编码器两倍的算力
    • 启发:试图预测每张图像所附文本的确切单词(给定一张图像,去预测对应文本,对一个图像可以有很多不同的描述,预测型任务有太多的可能性)是个困难的任务,因为与图像同时出现的描述、评论和相关文本种类繁多。
    • 解决:探索训练了一个系统来解决可能更容易的任务,即只预测哪个文本作为一个整体和哪个图像配对,而不是预测该文本的确切单词
  • 用对比学习的原因:对一个图像可以有很多不同的描述,预测型任务有太多的可能性,对比任务只需要去判断图像和文本是不是一个配对,简单很多,如下图所示,训练效率一下提高了4倍。

CLIP核心实现的伪代码

  • 分别输入图像([n,h,w,c])和文本([n,l],l是指序列长度),然后送入到各自的编码器提取特征,图像编码器可以是ResNet也可以是Vision Transformer文本编码器可以是Text Transformer
  • 得到对应的特征之后,再经过一个投射层(即W_i和W_t),投射层的意义是学习如何从单模态变成多模态,投射完之后再做l2 norm,就得到了最终用来对比的特征I_e和T_e,现在有n个图像的特征和n个文本的特征。
  • 计算余弦相似度,算的相似度就是最后要分类的logits。
  • logits和ground truth做交叉熵损失正样本是对角线上的元素,logits的维度是[n,n],ground truth标签是np.arange(n),算两个损失,一个是图像的,一个是文本的,最后把两个损失加起来平均,这个操作在对比学习中是很常见的,都是用的这种对称式的目标函数。

CLIP网络结构

1. 预训练

  • 模型输入:图像($n$)和文本($n$)的配对,分别映射到$n$个特征上,CLIP就是在这$n \times n$个特征上做对比学习
  • 正样本:配对的图像文本对(对角线),$n$个。
  • 负样本:$n^2-n$个(矩阵里除了对角线的部分)。
  • 有了正负样本,模型就可以通过对比学习的方式去训练了,不需要任何手工标注,这种无监督的训练方式,是需要大量的训练数据的。

2. 从标签文本创建数据集分类器

  • 预训练之后只能得到文本和图像的特征,没有分类头,没有分类头怎么推理?$\rightarrow$prompt template
  • 比如对于ImageNet的1000个类,变成“A photo of a {object}.”的1000个句子,这1000个句子通过之前预训练好的文本编码器,得到1000个文本的特征。
  • 直接用类别单词去抽取文本特征也可以,但是这么操作是因为模型预训练图像看到的是句子,在推理时如果突然把所有文本变成单词,跟训练时不太一样,会影响效果。

3. 推理:用于zero-shot分类

  • 推理的时候,对于任何一张图像,传给图像编码器,拿到图像特征之后,和所有的文本特征做余弦相似度,最后哪个最相似,就把这个文本特征对应的句子挑出来。

选择和缩放模型

  • 图像编码器:既可以选择ResNet,也可以选择Vision Transformer
  • 文本编码器:选择Transformer

训练

  • 视觉训练了8个模型:
  1. 5个ResNets:ResNet-50ResNet-101,还有根据EfficientNet的方式对ResNet-50的宽度、深度和输入大小进行scale的3个模型,分别对应原始ResNet50的4倍16倍64倍的计算量。
  2. 3个Vision Transformer:ViT-B/32ViT-B/16ViT-L/14
  • 所有的模型都训练了32个epoch,用的是Adam优化器,batch size=32768。

研究结论

zero-shot迁移

什么是zero-shot

  • zero-shot学习通常指的是对图像分类中未见过的物体类别进行泛化的研究,可以看作是在进行表征学习和度量学习的基础上,通过借助辅助信息(属性或文本)实现跨模态知识的迁移,从而完成可见类信息到未见类信息推断的迁移学习过程
  • 虽然物体的类别不同,但是物体间存在相同的属性,提炼出每一类别对应的属性并利用若干个学习器学习。在测试时对测试数据的属性预测,再将预测出的属性组合,对应到类别,实现对测试数据的类别预测。

对比实验(和最相似工作)

  • Visual N-Grams与CLIP进行了比较。
  • 最好的CLIP模型将ImageNet上的准确率从11.5%提高到76.2%。
  • CLIP在完全没用128万张训练图像的情况下直接zero-shot,与原始的ResNet50打成平手。

prompt engineering and ensembling

  • 问题:
  1. 一个单词具有多义性,缺乏上下文信息,图像和文本匹配容易出错,所以将单词放在语境中,来提高匹配度。
  2. 在预训练的时候,匹配的文本一般都是一个句子,很少出现一个单词的情况,如果推理的时候,每次进来的是一个单词,可能就存在distribution gap的问题。
  • 为了解决这两个问题,本文提出了prompt template,利用模板“A photo of a {label}.” ,把单词变成一个句子,其意思是“这是一张xxx的图像”,这个标签一般代表的都是名词,能一定程度上解决歧义性的问题。
  • 加入prompt engineering and ensembling后,准确度上升了1.3%。

性能分析

CLIP做zero-shot迁移的效果
  • 在27个数据集上衡量了CLIP做zero-shot迁移的效果,用zero-shot的CLIP和linear probe的ResNet-50对比。
  • linear probe:把预训练好的模型中的参数冻结,只从里面去提取特征,然后只训练最后一层,即FC分类头层。
  • 如下图所示,zero-shot CLIP在16个数据集上(绿色)都取得不错的效果,但对于一些难的数据集,CLIP表现得不好。
  • 特别难的任务更适合去做few-shot迁移,对于这种需要特定领域知识的任务(如肿瘤分类等),即使对于人类来说没有先验知识也很难。

对比zero-shot CLIP和few-shot
  • 对比zero-shot CLIP、few-shot CLIP和之前few-shot的一些方法,这里CLIP的few-shot是将图像编码器的参数冻结,然后做 linear probe。
  • 下图横坐标是数据集中每一个类别里用了多少训练样本(其他方法因为没有和自然语言的结合,没有zero-shot),纵坐标是平均准确度,是在20个数据集上取的平均。
  • 观察紫色曲线,当每个类别仅用1、2或4个训练样本时还不如zero-shot的效果,证明了用文本引导的强大

在单个数据集上的性能
  • 如下图所示。

比较CLIP zero-shot与全监督线性分类器在数据集上的性能
  • 这里不再是few-shot linear probing,而是全量数据的linear probing
  • 对于大多数数据集,zero-shot分类器的性能仍然比全监督分类器低10%到25%,这表明仍然有很大的空间来提高CLIP的任务学习和zero-shot迁移能力

  • 在过去几年中,深度学习的性能与训练计算量数据集大小等有关。
  • 到目前为止,GPT模型家族已经证明:在训练计算增加1000倍的情况下,zero-shot性能得到了一致的提高
  • 在下图中验证了CLIP的zero-shor性能是否遵循类似模式,绘制了5个ResNet CLIP模型在36个不同数据集的39次评估中的平均错误率。
  • 发现在模型计算增加44倍的情况下,CLIP具有类似的对数-对数线性缩放趋势。
  • 在36个不同的数据集上的39个评估中,平均zero-shot误差通过5个不同CLIP模型的44x计算范围内的对数-对数线性趋势很好地建模。
  • 浅阴影线表示单个评估的性能,表明尽管总体趋势平滑,但性能的变化要大得多。

表示学习

  • 如下图右图所示,在先前提到的27个数据集上进行比较,CLIP(实心、空心红色五角星)比所有的其他模型都要好,不只是zero-shot和few-shot,用全部的数据去做训练时CLIP依然比其他模型强得多。
  • 如下图左图所示,在12个数据集的集合上进行实验,CLIP-ViT的效果是很好的,但是CLIP-ResNet就要比别的方法差了,这12个数据集的集合和ImageNet的关系很大,如果模型之前在ImageNet做过有监督的预训练,那么效果肯定会更好。

  • 和之前在ImageNet上表现最好的模型EfficientNet L2 NS对比实验。
  • 如下图所示,在27个数据集中,21个超过了EfficientNet。

  • 与在ImageNet上预训练的模型相比,CLIP的特征对任务偏移更具有鲁棒性。

对自然分布偏移的鲁棒性

下图是当数据有分布偏移时模型的表现如何。

  • 下图可视化了zero-shot分类器的性能变化。
  • 尽管使CLIP适应ImageNet分布使其ImageNet的精度总体提高了9.2%至85.4%,并与Mahajan等(2018)的SOTA的精度保持一致,但分布偏移下的平均精度略有下降。

  • 下图可视化了zero-shot、1-shot、2-shot、4-shot、……、128-shot和全监督逻辑回归分类器在最佳CLIP模型特征上的性能。
  • 虽然few-shot模型也比现有模型显示出更高的有效鲁棒性,但随着训练数据的增加,这种优势会随着性能的增加而逐渐消失。

与人的性能的比较

  • 将CLIP与人进行zero-shot、one-shot和two-shot的对比。
  • 让5名不同的人查看牛津IIT宠物数据集的3669张图像中的每张,并分类37个猫或狗品种的图像。
  • 在zero-shot的情况下,人类在没有任何例子的前提下要求给这些图像贴上标签。
  • 在one-shot实验中,每个品种给1张样本图像。
  • 在two-shot实验中,每个品种给2张样本图像。

  • 下图是人的分类准确率与CLIP zero-shot的分类准确率的对比。
  • 在人判断准确率较高的类别上,机器的准确率也高;在人判断不准的类别上,机器判断也不准。

存在的问题

1. 需要进一步研究提高CLIP的计算和数据效率。

  • 在具有训练划分的数据集上,zero-shot CLIP的性能和ResNet-50相持平,但在大多数数据集上,该基线的性能现在远低于总体水平。
  • 在提高CLIP的任务学习和迁移能力方面还需要做大量的工作,估计zero-shot CLIP需要大约1000倍的计算能力才能达到最先进的整体性能。

2. CLIP的zero-shot性能在几种任务上仍然很弱。

  • 细粒度分类(如区分汽车模型、花卉种类和飞机变体)上的性能较差。
  • CLIP无法处理抽象概念,如数数任务、计算图像中对象的数量。
  • 对于不太可能包含在CLIP预训练数据集中的新任务,例如对图像中最近的汽车的距离进行分类,CLIP准确性接近随机。

3. zero-shot CLIP对真正不在其分布范围内的数据的泛化效果仍然很差。

  • CLIP在MNIST的手写数字上只能达到88%的准确率。

4. CLIP仍然仅限于从给定zero-shot分类器中的既定概念中进行选择,与像图像描述这样可以生成新输出的真正灵活的方法相比,这是一个重大限制。

5. CLIP没有解决深度学习的数据效率差的问题。

  • 训练了32个epoch,每个epoch过4亿个图像,跑128亿张图像,如果一秒一张需要405年。

6. 尽管关注的是zero-shot转移,但用所有数据进行训练,调整很多次模型结构和超参数,以指导CLIP的开发,这些验证集通常有数千个示例,这对于真正的zero-shot场景来说是不现实的;另一个潜在的问题是评估数据集的选择,用ImageNet数据集作为指导,并非是做出了真正的zero-shot工作。

7. 偏见问题。

  • CLIP是通过与互联网上的图像配对的文本进行训练的,这些图像-文本对未经过滤和管理,导致CLIP模型学习了许多社会偏见。

启发与思考

  1. CLIP工作最大的贡献,在于打破了固定种类标签的范式,把NLP方面的成功复制到其他领域内,比如CV领域。
  2. 可以利用CLIP预训练好的图像/文本编码器(具有鲁棒的多模态特征提取能力),应用在多模态下游任务上。
  3. CLIP的双流模型,单独提取图像和文本特征,即不同模态分别过一个编码器,再通过求相似度(如求点积)来实现无监督学习,是后续工作的主要方向。
  4. 写作:“Limitations”逐渐成为正文中不可或缺的一部分。
### 关于多模态文本和图像处理的学术论文 多模态文本和图像处理的研究领域近年来发展迅速,得益于深度学习技术尤其是Transformer架构的应用。以下是几个重要的方向及相关研究成果: #### 1. **Vision Transformer (ViT)** 和 CLIP 的贡献 Vision Transformer (ViT)[^1] 是一种基于自注意力机制的模型,能够有效提取图像中的特征并与文本数据进行联合建模。CLIP(Contrastive Language–Image Pre-training)则进一步扩展了这一思路,通过对比学习的方式实现了大规模文本-图像对齐任务的学习。这些方法不仅提高了图像分类、对象检测等传统计算机视觉任务的表现,还在跨模态检索、图像描述生成等方面表现出色。 #### 2. **GILL 方法** 一篇近期发表的论文介绍了 GILL(Generative Image and Language Learning),这是一种创新的多模态语言模型[^2]。该模型的核心在于构建了一个映射网络,用于连接冻结的大规模纯文本语言模型(LLMs)与预训练好的图像编码器/解码器嵌入空间。这种方法使得 LLMs 能够直接参与图像生成过程,并具备以下特点: - 支持从交错排列的文本和图像序列中生成一致的内容; - 提供图像检索功能以及动态决策模块,在推理阶段自动选择是生成新图像还是从数据库中检索已有图片; - 显著优于仅依赖非大语言模型的传统生成框架。 #### 3. **Emu-3 统一模型** 另一个值得关注的工作来自 Emu-3 模型的设计者们[^3]。他们开发出了一个可以同时执行多模态理解和生成任务的高度灵活系统。特别之处在于其支持长时间跨度内的上下文记忆管理,这对于涉及连续帧变化或者复杂叙事结构的任务尤为重要。此外,为了优化效率并减少硬件需求压力,研究人员引入了三种形式的技术手段——即张量并行(TP)、上下文并行(CP),还有常规意义上的数据并行(DP)—从而让整个流程更加高效稳定运行起来。 --- ### 示例代码片段:如何加载预训练 ViT 或 CLIP 模型 如果您希望快速测试某些现有工具包的功能,则可以通过如下方式安装 PyTorch 版本的相关库,并尝试调用其中已有的实现方案之一作为起点。 ```python import torch from transformers import AutoProcessor, CLIPModel model_name = "openai/clip-vit-base-patch32" processor = AutoProcessor.from_pretrained(model_name) model = CLIPModel.from_pretrained(model_name) url = "http://images.cocodataset.org/val2017/000000039769.jpg" image = processor.image_processor(url, return_tensors="pt")["pixel_values"] text_inputs = processor(text=["a photo of a cat"], padding=True, truncation=True, max_length=77, return_tensors="pt") outputs = model(**{"input_ids": text_inputs.input_ids, "attention_mask": text_inputs.attention_mask, "pixel_values": image}) logits_per_image = outputs.logits_per_image # this is the image-text similarity score probs = logits_per_image.softmax(dim=-1).detach().cpu().numpy() # we can take the softmax to get probability print(probs) # prints: [[0.9855]] ``` 此段脚本展示了怎样利用 Hugging Face Transformers 库轻松获取经过微调后的 CLIP 实例化版本来进行简单的相似度评估操作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值