type
status
date
slug
summary
tags
category
icon
password
😃
CLIP是什么 CLIP是一种用于图像和文本联合表示学习的多模态预训练模型。其核心思想在于,通过对比学习的方式,在大规模图像-文本对数据集上进行预训练,使模型能够学习到图像和文本之间的深层语义关联。这种学习方式不仅突破了传统视觉模型在泛化性和迁移能力上的局限,还为实现真正的zero-shot学习提供了可能。
 
page icon
该工作个人主观打分:10.0。 打分理由:clip作为后续VLM和一系列多模态对齐的开山之作,对AI领域具有不可磨灭的贡献。其模型架构不复杂,训练目标简单有效,论文阐述清晰明了。
 

引言

什么是CLIP

CLIP (Contrastive Language-Image Pre-training) 模型由OpenAI在2021年提出,是一种用于图像和文本联合表示学习的多模态预训练模型。其核心思想在于,通过对比学习的方式,在大规模图像-文本对数据集上进行预训练,使模型能够学习到图像和文本之间的深层语义关联。这种学习方式不仅突破了传统视觉模型在泛化性和迁移能力上的局限,还为实现真正的zero-shot学习提供了可能。

为什么CLIP这么火?

CLIP模型的应用场景非常广泛。 在图像分类领域,CLIP可以实现零样本分类,即不需要任何训练数据即可对未知类别的图像进行分类。 在文本到图像检索领域,CLIP可以根据文本描述快速检索出与之匹配的图像。 此外,CLIP还可以应用于图像生成、视频理解等多个领域
 

CLIP (Contrastive Language–Image Pre-training)

学习资料【Videos】:

工作原理


图像编码器和文本编码器的设计。

notion image
 
将图像、文本配成 对正样本,则有对负样本。每一对的图片和文字输入 Image-EncoderText-Encoder,得到图像特征,和文本特征。两个模态的特征再分别通过 linear layer 线性转换层去映射到同一个 embedding 空间 , 然后基于 cosine similarity 来得到 logits,后通过 cross-entropy 得到 loss。
 
Bag of words Prediction
notion image
 
根据文章中说,在最开始实验的时候,选了一个 CNN 网络和 text Transformer 网络来组成CLIP的结构(Text Transformer 用来 predict Image caption。但后来发现 Transformer 很难去做 scaling,而且要求的计算量又大又低效。)
we show that a 63 million parameter transformer language model, which already uses twice the compute of its ResNet-50 image encoder, learns to recognize ImageNet classes three times slower than a much simpler baseline that predicts a bag-of-words encoding of the same text.
也就是说,按训练后模型的zero-shot能力进行评估时,按顺序精确地去预测caption的效果,不如一个 predict bag of words 的模型的效果,但不管是 Transformer 还是另外的 predict bag of words 这样的 baseline 都有一个问题是想去特别精确地输出图片对应的文字和对比模型比起来,要达到同样的表现水平的话,需要一个数量级的计算量。(也就是不同的任务目标需要匹配不同的训练目标)。
为了避开精确预测文字这种坑,CLIP 的训练目标变成了从大量<图像,文本> pairs中找出匹配的pair。基于此,所以把 bag-of-words 的 model 的训练loss从 predictive objective 换成了contrastive objective. 然后观察到了 4 倍的效果提升。这种loss也可以叫做 multiclass N-pair loss
图像和文本的 embedding 映射函数都采取的是简单的线性层,没有用非线性层,实验观察这两者没有什么太大区别。(但有一个 Normalization)。

模型的选择

对于图像这一块,用了 ResNet 的不同尺寸和 ViT(详见 open_clip)。
text-encoder 采用了 Transformer,选用了 63 Million 参数的一个 12 层 512 宽,8 个 attention-heads 的模型, 通过 BPEtokenvocab size49152 这么大。对于 Transformerscale up,只增加了宽度,没改变深度。
[SOS], [EOS] 两个特殊的 token, [EOS]被认为是整个句子的 representation (注意这里和别的都不太一样,大部分是用在头部的[CLS])
Transformer模块里采用了Masked self attention

对比学习 (Contrastive Learning) 目标函数及伪代码


训练细节

  • 从网上搜集的 400 million 个图像-文本对
  • 图片数据只用了 crop 这一种增强手段
  • softmax 中的温度是训练过程中可学习的
  • Adam Optimizer
  • 每个模型都训练了 32 个 epoch
  • 用了 weight decay optimization,用在所有层
  • 用 grid search 来找 hyper parameter(模型是用了一个参考模型 ResNet-50,训练 1 个 epoch)
    • 然后更大的模型是人工调了一下
  • batch-size 是 32768
  • 减少显存占用的方法:
    • 混合精度训练
    • gradient checkpointing
    • half-precision 模型和 adam statistics
最后论文里默认选用了 ViT-L/14@336px 这个模型
The largest ResNet model, RN50x64, took 18 days to train on 592 V100 GPUs while the largest Vision Transformer took 12 days on 256 V100 GPUs.
We train CLIP from scratch without initializing the image encoder with ImageNet weights or the text encoder with pre-trained weights.
 
 

优势

零样本学习能力(Zero-Shot Learning)。

notion image
可见在至少一半的任务上,零样本学习能力都超过监督学习的线性层分类器(线性层分类器的特征是从ResNet-50来的)这张图显示了这种CLIP的有效性。
 
做 zero-shot 的时候,增加了 prompt-engineering 的方法比起直接用类名,能够显著提升模型表现。
notion image
 
prompt engineering 样例:
  • 狗 可以被改写为 "一张狗的照片"
CLIP模型对用于图像描述的单词很敏感。文本“a photo of a bird”、“a photo of a bird siting near bird feeder”或“an image of a bird”与相同的图像匹配产生的概率是不同的。
notion image
 
 

可扩展性与迁移能力。

 
notion image
 
可见大部分基于 clip 特征的下游任务都表现不错
notion image
 

鲁棒性较强

notion image
为了证明他的 zero-shot 能力是真实的,文章做了Data Overlap Analysis 来证明他们用来测试 zero-shot 能力所用到的任务没有出现在他们的训练集中。
 

劣势(Limitations)

文章中自己提到的劣势有以下方面
  • 在各个任务上不够 sota -- 如果要达到各方面 sota,估计要当前的训练资源翻 1000 倍
  • zero-shot 能力在一些任务上仍然不够理想,例如一些细粒度的任务:汽车的型号分类,花卉分类等。一些抽象任务表现也不太行,例如在图像中对某一目标进行计数。还有的因为任务相对比较新,CLIP 也没有涉及,所以表现起来就跟乱猜没啥区别(比如 对离你最近的汽车有多少距离距离进行分类)
  • 对于图像类型是 ood 的,也不太理想

应用场景

在图像生成、图像问答等多模态应用中已经离不开 clip 的存在。

样例代码

实际上,后续工作中改进了其他的劣势,包括
  • 原本的 clip 只能支持 77 个词的输入,long-clip 这个工作 拓展了这个限制
  • BLIP 增加了任务的难度和多样性
  • CLIP 的训练形式是对整张图片的描述是否对齐,缺少了对图片中更细粒度的对齐。 GLIP 解决了这点
  • CLIP 针对特有领域的应用效果(泛化能力)相对较差(如文章中提到的平时生活中见得比较少的但其实较简单的 MNIST)。医疗领域内,一些专门针对性的 CLIP 被提出,如 BioMedCLIP, PubMedCLIP
 
 

模型代码细节精读

由于CLIP被后续太广泛的应用,其所用的TextEncoder、VisualEncoder都在后续许多工作中被重复使用,还是有必要精读一下如此经典文章的代码。
参考implementation:
modeling_clip.py
huggingface
 

CLIPModel

CLIPModel 中包含了主要模型的逻辑,forward方法如下:
 

CLIPTextTransformer, CLIPVisionTransformer

Vision model和text model在 embedding layerlayer-norm 的实现上有点区别
这俩都用了 CLIPEncoder 这个主要的transformer encoder模块,这个模块包含许多叫 CLIPEncoderLayer 的子模块.
 
CLIPVisionTransfomerpre_layernorm post_layernorm,但CLIPTextTransformer这里只有最后一层的layer_norm
 

CLIPEncoderLayer

每一个 CLIPEncoderLayer 包括注意力机制、两个标准化层和简单的线性层。这个层里,prenorm和postnorm都有用到。
 
CLIP中的Attention支持三种,
 
第一种eager就是正常的attention,注释如下
 
Relate Posts
MobileAgent系列学习 — Mobile Agent v2
Lazy loaded image
MobileAgent系列学习 — FERRET-UI 2
Lazy loaded image
CLIP系列学习(八) — CLIPSeg
Lazy loaded image
CLIP系列学习(七)— SigLIP
Lazy loaded image
CLIP系列学习(三) — LongCLIP
Lazy loaded image
CLIP系列学习(二) — BLIP & BLIP 2
Lazy loaded image
六个故事,两次总结和投资系统Yixin’s Test
Loading...
Yixin Huang
Yixin Huang
一个热爱生活的算法工程师
Latest posts
时间序列论文阅读 — TimeCMA(AAAI 2025)
2025-4-23
时间序列论文阅读-ChatTime: A Unified Multimodal Time Series Foundation Model Bridging
2025-4-23
VLM系列论文阅读-Mixed Preference Optimization (MPO)
2025-2-6
VLM系列论文阅读 — Flamingo
2025-2-6
认识你自己,才是这件事的最终乐趣 — 抄录
2025-2-5
用GPT4学量化投资 — Junior Level - Unit 1: Introduction to Stock Markets and Data Handling
2025-1-23
Announcement
🎉NotionNext 4.5已经上线🎉
-- 感谢您的支持 ---
👏欢迎更新体验👏