Geeks_Z の Blog Geeks_Z の Blog
首页
  • 学习笔记

    • 《HTML》
    • 《CSS》
    • 《JavaWeb》
    • 《Vue》
  • 后端文章

    • Linux
    • Maven
    • 汇编语言
    • 软件工程
    • 计算机网络概述
    • Conda
    • Pip
    • Shell
    • SSH
    • Mac快捷键
    • Zotero
  • 学习笔记

    • 《数据结构与算法》
    • 《算法设计与分析》
    • 《Spring》
    • 《SpringMVC》
    • 《SpringBoot》
    • 《SpringCloud》
    • 《Nginx》
  • 深度学习文章
  • 学习笔记

    • 《PyTorch》
    • 《ReinforementLearning》
    • 《MetaLearning》
  • 学习笔记

    • 《高等数学》
    • 《线性代数》
    • 《概率论与数理统计》
  • 增量学习
  • 哈希学习
GitHub (opens new window)

Geeks_Z

AI小学生
首页
  • 学习笔记

    • 《HTML》
    • 《CSS》
    • 《JavaWeb》
    • 《Vue》
  • 后端文章

    • Linux
    • Maven
    • 汇编语言
    • 软件工程
    • 计算机网络概述
    • Conda
    • Pip
    • Shell
    • SSH
    • Mac快捷键
    • Zotero
  • 学习笔记

    • 《数据结构与算法》
    • 《算法设计与分析》
    • 《Spring》
    • 《SpringMVC》
    • 《SpringBoot》
    • 《SpringCloud》
    • 《Nginx》
  • 深度学习文章
  • 学习笔记

    • 《PyTorch》
    • 《ReinforementLearning》
    • 《MetaLearning》
  • 学习笔记

    • 《高等数学》
    • 《线性代数》
    • 《概率论与数理统计》
  • 增量学习
  • 哈希学习
GitHub (opens new window)
  • Python

  • MLTutorials

  • 卷积神经网络

  • 循环神经网络

  • Transformer

  • VisionTransformer

  • 扩散模型

  • 计算机视觉

  • PTM

  • MoE

  • LoRAMoE

  • LongTailed

  • 多模态

    • Multimodal_Survey
    • CLIP全文翻译
    • CLIP解读一
      • CLIP是如何工作的
      • 如何用CLIP实现zero-shot分类
      • 为什么是CLIP
      • CLIP还可以做什么
        • zero-shot检测
        • 图像检索
        • 视频理解
        • 图像编辑
        • 图像生成
        • 自监督学习
        • VL任务
      • 总结
      • Limitation
      • 参考
        • ChatGPT全文翻译 ⬇️
      • 0. 摘要
      • 1. 引言与动机
      • 2. 方法
        • 2.1 自然语言监督
        • 2.2 构建足够大的数据集
        • 2.3 选择高效的预训练方法
        • 2.4 模型的选择与扩展
        • 2.5 训练
      • 3. 实验
        • 3.1 零样本迁移
        • 3.1.1 动机
        • 3.1.2 使用 CLIP 进行零样本迁移
        • 3.1.3 初步与 Visual N-Grams 的比较
        • 3.1.4 提示工程与集成
        • 3.1.5 零样本 CLIP 性能分析
        • 3.2 微调
        • 3.3 分析与讨论
        • 3.4 总结
      • 4. 相关工作
        • 4.1 从语言中学习视觉表示
        • 4.2 对比学习
        • 4.3 多模态学习
        • 4.4 自然语言处理的进展
        • 4.5 其他相关领域
      • 5. 结论
      • 附录 A. 实验设置与数据集详细信息
        • A.1 数据集描述
        • A.2 实验设置
        • A.3 结果分析
      • References
    • CLIP解读二
  • 知识蒸馏

  • PEFT

  • 对比学习

  • 小样本学习

  • 迁移学习

  • 零样本学习

  • 集成学习

  • Mamba

  • PyTorch

  • CL

  • CIL

  • 小样本类增量学习FSCIL

  • UCIL

  • 多模态增量学习MMCL

  • LTCIL

  • DIL

  • 论文阅读与写作

  • 分布外检测

  • GPU

  • 深度学习调参指南

  • AINotes
  • 多模态
Geeks_Z
2024-12-03
目录
CLIP是如何工作的
如何用CLIP实现zero-shot分类
为什么是CLIP
CLIP还可以做什么
zero-shot检测
图像检索
视频理解
图像编辑
图像生成
自监督学习
VL任务
总结
Limitation
参考
ChatGPT全文翻译 ⬇️
0. 摘要
1. 引言与动机
2. 方法
2.1 自然语言监督
2.2 构建足够大的数据集
2.3 选择高效的预训练方法
2.4 模型的选择与扩展
2.5 训练
3. 实验
3.1 零样本迁移
3.1.1 动机
3.1.2 使用 CLIP 进行零样本迁移
3.1.3 初步与 Visual N-Grams 的比较
3.1.4 提示工程与集成
3.1.5 零样本 CLIP 性能分析
3.2 微调
3.3 分析与讨论
3.4 总结
4. 相关工作
4.1 从语言中学习视觉表示
4.2 对比学习
4.3 多模态学习
4.4 自然语言处理的进展
4.5 其他相关领域
5. 结论
附录 A. 实验设置与数据集详细信息
A.1 数据集描述
A.2 实验设置
A.3 结果分析
References

CLIP解读一

2021年见证了vision transformer的大爆发,随着谷歌提出ViT之后,一大批的vision transformer的工作席卷计算机视觉任务。除了vision transformer,另外一个对计算机视觉影响比较大的工作就是Open AI在2021年1月份发布的https://openai.com/blog/dall-e/ (opens new window)和https://openai.com/blog/clip/ (opens new window),这两个都属于结合图像和文本的多模态模型,其中DALL-E是基于文本来生成模型的模型,而CLIP是用文本作为监督信号来训练可迁移的视觉模型,这两个工作也像ViT一样带动了一波新的研究高潮。

CLIP是如何工作的

CLIP的英文全称是Contrastive Language-Image Pre-training,即一种基于对比文本-图像对的预训练方法或者模型。CLIP是一种基于对比学习的多模态模型,与CV中的一些对比学习方法如moco和simclr不同的是,CLIP的训练数据是文本-图像对:一张图像和它对应的文本描述,这里希望通过对比学习,模型能够学习到文本-图像对的匹配关系。如下图所示,CLIP包括两个模型**:Text Encoder和Image Encoder**,其中Text Encoder用来提取文本的特征,可以采用NLP中常用的text transformer模型;而Image Encoder用来提取图像的特征,可以采用常用CNN模型或者vision transformer。

这里对提取的文本特征和图像特征进行对比学习。对于一个包含N 文本-图像对的训练batch,将N 文本特征和N 图像特征两两组合,CLIP模型会预测出N2 可能的文本-图像对的相似度,这里的相似度直接计算文本特征和图像特征的余弦相似性(cosine similarity),即上图所示的矩阵。这里共有N 正样本,即真正属于一对的文本和图像(矩阵中的对角线元素),而剩余的N2−N 文本-图像对为负样本,那么CLIP的训练目标就是最大N 正样本的相似度,同时最小化N2−N 负样本的相似度,对应的伪代码实现如下所示:

# 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 proj of image to embed
# W_t[d_t, d_e] - learned proj of text to embed
# t - learned temperature parameter

# 分别提取图像特征和文本特征
I_f = image_encoder(I) #[n, d_i]
T_f = text_encoder(T) #[n, d_t]

# 对两个特征进行线性投射,得到相同维度的特征,并进行l2归一化
I_e = l2_normalize(np.dot(I_f, W_i), axis=1)
T_e = l2_normalize(np.dot(T_f, W_t), axis=1)

# 计算缩放的余弦相似度:[n, n]
logits = np.dot(I_e, T_e.T) * np.exp(t)

# 对称的对比学习损失:等价于N个类别的cross_entropy_loss
labels = np.arange(n) # 对角线元素的labels
loss_i = cross_entropy_loss(logits, labels, axis=0)
loss_t = cross_entropy_loss(logits, labels, axis=1)
loss = (loss_i + loss_t)/2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

为了训练CLIP,OpenAI从互联网收集了共4个亿的文本-图像对,论文称之为WebImageText,如果按照文本的单词量,它和训练GPT-2的WebText规模类似,如果从数量上对比的话,它还比谷歌的JFT-300M数据集多一个亿,所以说这是一个很大规模的数据集。CLIP虽然是多模态模型,但它主要是用来训练可迁移的视觉模型。论文中Text Encoder固定选择一个包含63M参数的text transformer模型,而Image Encoder采用了两种的不同的架构,一是常用的CNN架构ResNet,二是基于transformer的ViT,其中ResNet包含5个不同大小的模型**:ResNet50**,ResNet101,RN50x4,RN50x16和RNx64(后面三个模型是按照EfficientNet缩放规则对ResNet分别增大4x,16x和64x得到),而ViT选择3个不同大小的模型**:ViT-B/32**,ViT-B/16和ViT-L/14。所有的模型都训练32个epochs,采用AdamW优化器,而且训练过程采用了一个较大的batch size:32768。由于数据量较大,最大的ResNet模型RN50x64需要在592个V100卡上训练18天,而最大ViT模型ViT-L/14需要在256张V100卡上训练12天,可见要训练CLIP需要耗费多大的资源。对于ViT-L/14,还在336的分辨率下额外finetune了一个epoch来增强性能,论文发现这个模型效果最好,记为ViT-L/14@336,论文中进行对比实验的CLIP模型也采用这个。

如何用CLIP实现zero-shot分类

上面我们介绍了CLIP的原理,可以看到训练后的CLIP其实是两个模型,除了视觉模型外还有一个文本模型,那么如何对预训练好的视觉模型进行迁移呢?与CV中常用的先预训练然后微调不同,CLIP可以直接实现zero-shot的图像分类,即不需要任何训练数据,就能在某个具体下游任务上实现分类,这也是CLIP亮点和强大之处。用CLIP实现zero-shot分类很简单,只需要简单的两步:

  1. 根据任务的分类标签构建每个类别的描述文本:A photo of {label},然后将这些文本送入Text Encoder得到对应的文本特征,如果类别数目为N,那么将得到N 文本特征;
  2. 将要预测的图像送入Image Encoder得到图像特征,然后与N 文本特征计算缩放的余弦相似度(和训练过程一致),然后选择相似度最大的文本对应的类别作为图像分类预测结果,进一步地,可以将这些相似度看成logits,送入softmax后可以到每个类别的预测概率。

可以看到,我们是利用CLIP的多模态特性为具体的任务构建了动态的分类器,其中Text Encoder提取的文本特征可以看成分类器的weights,而Image Encoder提取的图像特征是分类器的输入。这里我们给出了一个基于CLIP的一个实例(参考官方https://github.com/openai/CLIP/blob/main/notebooks/Interacting_with_CLIP.ipynb (opens new window)),这里任务共有6个类别:"dog", "cat", "bird", "person", "mushroom", "cup",首先我们创建文本描述,然后提取文本特征:

# 首先生成每个类别的文本描述
labels = ["dog", "cat", "bird", "person", "mushroom", "cup"]
text_descriptions = [f"A photo of a {label}" for label in labels]
text_tokens = clip.tokenize(text_descriptions).cuda()

# 提取文本特征
with torch.no_grad():
    text_features = model.encode_text(text_tokens).float()
    text_features /= text_features.norm(dim=-1, keepdim=True)
1
2
3
4
5
6
7
8
9

然后我们读取要预测的图像,输入Image Encoder提取图像特征,并计算与文本特征的余弦相似度:

# 读取图像
original_images = []
images = []
texts = []

for label in labels:
    image_file = os.path.join("images", label+".jpg")
    name = os.path.basename(image_file).split('.')[0]

    image = Image.open(image_file).convert("RGB")
    original_images.append(image)
    images.append(preprocess(image))
    texts.append(name)

image_input = torch.tensor(np.stack(images)).cuda()

# 提取图像特征  
with torch.no_grad():
    image_features = model.encode_image(image_input).float()
    image_features /= image_features.norm(dim=-1, keepdim=True)

# 计算余弦相似度(未缩放)
similarity = text_features.cpu().numpy() @ image_features.cpu().numpy().T
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

相似度如下所示,可以看到对于要预测的6个图像,按照最大相似度,其均能匹配到正确的文本标签:

进一步地,我们也可以对得到的余弦相似度计算softmax,得到每个预测类别的概率值,注意这里要对相似度进行缩放:

logit_scale = np.exp(model.logit_scale.data.item())
text_probs = (logit_scale * image_features @ text_features.T).softmax(dim=-1)
top_probs, top_labels = text_probs.cpu().topk(5, dim=-1)
1
2
3

得到的预测概率如下所示,可以看到6个图像,CLIP模型均能够以绝对的置信度给出正确的分类结果:

使用CLIP进行zero-shot分类,另外一个比较重要的地方是文本描述的生成,上面的例子我们采用A photo of {label},但其实也有其它选择,比如我们直接用类别标签,这其实属于最近NLP领域比较火的一个研究:prompt learning或者prompt engineering,具体可以见这篇综述论文:https://arxiv.org/abs/2107.13586 (opens new window),简单来说,prompt learning的核心是通过构建合适prompt(提示)来使预训练模型能够直接应用到下游任务,这和之前的预训练+微调属于不同的范式。论文也说了,如果我们直接采用类别标签作为文本描述,那么很多文本就是一个单词,缺少具体的上下文,而且也和CLIP的训练数据不太一致,效果上会不如采用A photo of {label}(ImageNet数据集上可以提升1.3%)。论文也实验了采用80个不同的prompt来进行集成,发现在ImageNet数据集上能带来3.5%的提升,具体见CLIP公开的https://github.com/openai/CLIP/blob/main/notebooks/Prompt_Engineering_for_ImageNet.ipynb (opens new window)。下图对比了基于ResNet的CLIP模型直接采用类别名与进行prompt engineering和ensembling的效果对比:

上面我们介绍了如何用CLIP实现zero-shot分类,下面将简单介绍CLIP与其它方法的效果对比,这个也是论文中篇幅最多的内容。首先是CLIP和17年的一篇工作https://arxiv.org/abs/1612.09161 (opens new window)的在3个分类数据集上zero-shot效果对比,如下表所示,可以看到CLIP模型在效果上远远超过之前的模型,其中在ImageNet数据集可以达到76.2,这和全监督的ResNet50效果相当,不用任何训练数据就能达到这个效果是相当惊艳的。

更进一步地,论文还对比了zero-shot CLIP和ResNet50 linear probing(ImageNet数据上预训练,在加上线性分类层进行finetune)在27个数据集上表现,如下图所示,其中在16个数据集上CLIP可以超过ResNet50。但是在一些特别的,复杂的或者抽象的数据集上CLIP表现较差,比如卫星图像分类,淋巴结转移检测,在合成场景中计数等,CLIP的效果不如全监督的ResNet50,这说明CLIP并不是万能的,还是有改进的空间。如果认真看下图的话,CLIP表现较差的竟然还有MNIST数据集,分类准确度只有88%,这是不可思议的,因为这个任务太简单了,通过对CLIP训练数据进行分析,作者发现4亿的训练数据中基本上没有和MNIST比较相似的数据,所以这对CLIP来说就属于域外数据了,表现较差就比较容易理解了。这也表明**:CLIP依然无法解决域外泛化这个深度学习难题。**

除了zero-shot对比,论文还对比few-shot性能,即只用少量的样本来微调模型,这里对比了3个模型:在ImageNet21K上训练的BiT-M ResNet-152x2,基于SimCLRv2训练的ResNet50,以及有监督训练的ResNet50。可以看到CLIP的zero-shot和最好的模型(BiT-M)在16-shot下的性能相当,而CLIP在16-shot下效果有进一步的提升。另外一个比较有意思的结果是:虽然CLIP在few-shot实验中随着样本量增加性能有提升,但是1-shot和2-shot性能比zero-shot还差,这个作者认为主要是CLIP的训练和常规的有监督训练存在一定的差异造成的。

除此之外,论文还进行了表征学习(representation Learning)实验,即自监督学习中常用的linear probe:用训练好的模型先提取特征,然后用一个线性分类器来有监督训练。下图为不同模型在27个数据集上的average linear probe score对比,可以看到CLIP模型在性能上超过其它模型,而且计算更高效:

另外,论文还发现CLIP在自然分布漂移上表现更鲁棒,比如CLIP和基于ImageNet上有监督训练的ResNet101在ImageNet验证集都能达到76.2%,但是在ImageNetV2数据集上,CLIP要超过ResNet101。在另外的4个分布漂移的数据集上,ResNet101性能下降得比较厉害,但是CLIP能依然保持较大的准确度,比如在ImageNet-A数据集上,ResNet101性能只有2.7%,而CLIP能达到77.1%。

CLIP能实现这么好的zero-shot性能,大家很可能质疑CLIP的训练数据集可能包含一些测试数据集中的样例,即所谓的数据泄漏。关于这点,论文也采用一个重复检测器对评测的数据集重合做了检查,发现重合率的中位数为2.2%,而平均值在3.2%,去重前后大部分数据集的性能没有太大的变化,如下所示:

论文的最后也对CLIP的局限性做了讨论,这里简单总结其中比较重要的几点:

  • CLIP的zero-shot性能虽然和有监督的ResNet50相当,但是还不是SOTA,作者估计要达到SOTA的效果,CLIP还需要增加1000x的计算量,这是难以想象的;
  • CLIP的zero-shot在某些数据集上表现较差,如细粒度分类,抽象任务等;
  • CLIP在自然分布漂移上表现鲁棒,但是依然存在域外泛化问题,即如果测试数据集的分布和训练集相差较大,CLIP会表现较差;
  • CLIP并没有解决深度学习的数据效率低下难题,训练CLIP需要大量的数据;

为什么是CLIP

前面介绍了CLIP的原理和应用,这里我们再回过头来看另外一个问题**:为什么是CLIP,即CLIP这篇工作的motivation**。 在计算机视觉领域,最常采用的迁移学习方式就是先在一个较大规模的数据集如ImageNet上预训练,然后在具体的下游任务上再进行微调。这里的预训练是基于有监督训练的,需要大量的数据标注,因此成本较高。近年来,出现了一些基于自监督的方法,这包括基于对比学习的方法如MoCo和SimCLR,和基于图像掩码的方法如MAE和BeiT,自监督方法的好处是不再需要标注。但是无论是有监督还是自监督方法,它们在迁移到下游任务时,还是需要进行有监督微调,而无法实现zero-shot。对于有监督模型,由于它们在预训练数据集上采用固定类别数的分类器,所以在新的数据集上需要定义新的分类器来重新训练。对于自监督模型,代理任务往往是辅助来进行表征学习,在迁移到其它数据集时也需要加上新的分类器来进行有监督训练。但是NLP领域,基于自回归或者语言掩码的预训练方法已经取得相对成熟,而且预训练模型很容易直接zero-shot迁移到下游任务,比如OpenAI的GPT-3。这种差异一方面是由于文本和图像属于两个完全不同的模态,另外一个原因就是NLP模型可以采用从互联网上收集的大量文本。那么问题来了**:能不能基于互联网上的大量文本来预训练视觉模型?**

那么其实之前已经有一些工作研究用文本来作为监督信号来训练视觉模型,比如16年的工作https://arxiv.org/abs/1511.02251 (opens new window)将这转化成一个多标签分类任务来预测图像对应的文本的bag of words;17年的工作https://arxiv.org/abs/1612.09161 (opens new window)进一步扩展了这个方法来预测n-grams。最近的一些工作采用新的模型架构和预训练方法来从文本学习视觉特征,比如https://arxiv.org/abs/2006.06666 (opens new window)基于transformer的语言模型,https://arxiv.org/abs/2008.01392 (opens new window)基于语言掩码的方法,https://arxiv.org/abs/2010.00747 (opens new window)基于对比学习的方法。整体来看,这方面的工作不是太多,这主要是因为这些方法难以实现较高的性能,比如17年的那篇工作只在ImageNet上实现了11.5%的zero-shot性能,这远远低于ImageNet上的SOTA。另外,还有另外的是一个方向,就是基于文本弱监督来提升性能,比如谷歌的https://arxiv.org/abs/1912.11370 (opens new window)和https://arxiv.org/abs/2010.11929 (opens new window)基于JFT-300M数据集来预训练模型在ImageNet上取得SOTA,JFT-300M数据集是谷歌从互联网上收集的,通过一些自动化的手段来将web text来转化成18291个类别,但是存在一定的噪音。虽然谷歌基于JFT-300M数据集取得了较好的结果,但是这些模型依然采用固定类别的softmax分类器进行预训练,这大大限制了它的迁移能力和扩展性。

作者认为谷歌的弱监督方法和之前的方法的一个重要的区别在于规模,或者说算力和数据的规模不同。JFT-300M数据量达到了上亿级别,而且谷歌用了强大的算力来进行预训练。而VirTex,ICMLM和ConVIRT只在10万级别的数据上训练了几天。为了弥补数据上的差异,OpenAI从网上收集了4亿的数据来实验。但是新的问题来了:采用什么样的方法来训练。OpenAI首先尝试了VirTex模型,即联合训练一个CNN和文本transformer来预测图像的文本(image caption),但是发现这种方法的训练效率(用ImageNet数据集上的zero-shot性能来评估)还不如直接预测bag of words,如下图所示,两者的训练效率能相差3倍。如果进一步采用https://arxiv.org/abs/2010.00747 (opens new window),即基于对比学习的方法,训练效率可以进一步提升4倍。之所出现这个差异,这不难理解,训练数据所包含的文本-图像对是从互联网收集来的,它们存在一定的噪音,就是说文本和图像可能并不完全匹配,这个时候适当的降低训练目标,反而能取得更好的收敛。而从任务难度来看:Transformer Language Model > Bag of Words Prediction > Bag of Words Contrastive (CLIP)。由于训练数据量和模型计算量较大,训练效率成为一个至关重要的因素。这就是作者最终选择对比学习的方法来训练的原因。

从本质上来讲,CLIP其实并没有太大的创新,它只是将https://arxiv.org/abs/2010.00747 (opens new window)方法进行简化,并采用更大规模的文本-图像对数据集来训练。

在论文的最后,作者也谈到了由于训练效率的制约,他们采用了对比学习的方法,但是他们依然想做的是直接用图像生成文本,这个如果能成功,那么就和DALL-E这个工作形成闭环了**:文本 -> 图像 -> 文本**。而且基于生成式训练出来的模型,同样可以实现zero-shot分类,我们可以通过预测句子中的单词(标签)来实现:A photo of [?]。

CLIP还可以做什么

虽然论文中只对用CLIP进行zero-shot分类做了实验,但其实CLIP的应用价值远不止此,CLIP之后出现了很多基于CLIP的应用研究,这里我们列出一些应用场景

zero-shot检测

CLIP可以应用在目标检测任务上,实现zero-shot检测,即检测训练数据集没有包含的类别,比如谷歌提出的https://arxiv.org/abs/2104.13921 (opens new window)基于CLIP实现了开放词汇的物体检测,其主体架构如下所示,其基本思路和zero-shot分类相似,只不过这里是用文本特征和ROI特征来计算相似度。

Meta AI的最新工作https://arxiv.org/abs/2201.02605 (opens new window)可以检测2000个类,背后也用到了CLIP:

图像检索

基于文本来搜索图像是CLIP最能直接实现的一个应用,其实CLIP也是作为DALL-E的排序模型,即从生成的图像中选择和文本相关性较高的。

视频理解

CLIP是基于文本-图像对来做的,但是它可以扩展到文本-视频,比如https://arxiv.org/abs/2109.14084 (opens new window)就是将CLIP应用在视频领域来实现一些zero-shot视频理解任务。

图像编辑

CLIP可以用在指导图像编辑任务上,https://arxiv.org/abs/2112.05142 (opens new window)这篇工作用CLIP来定制化修改发型:

图像生成

CLIP还可以应用在图像生成上,比如https://arxiv.org/abs/2103.17249 (opens new window)这篇工作用CLIP实现了文本引导的StyleGAN:


https://arxiv.org/abs/2203.00386 (opens new window)这篇工作基于CLIP来训练文本生成图像模型,训练无需直接采用任何文本数据:

自监督学习

最近华为的工作https://arxiv.org/abs/2203.05175 (opens new window)更是采用CLIP来进行视觉自监督训练:

VL任务

CLIP本身就是多模态模型,所以它也可以用在用图像-文本多模态任务,如图像描述(image caption)和视觉问答(Visual Question Answering),这篇论文https://arxiv.org/abs/2107.06383 (opens new window)系统评估了CLIP在VL任务上带来的收益。


从这些具体的应用可以进一步看到CLIP的强大。

除了一些应用研究工作,其实还有针对CLIP的一些改进工作,最新的一篇论文https://arxiv.org/abs/2203.05796 (opens new window)总结了几种对CLIP的改进:

总结

这篇文章系统地总结了CLIP的原理以及它的具体应用,我个人认为**:CLIP和ViT属于相同量级的工作,它们都打破了计算机视觉的原有范式,必将在CV历史上留名**。

Limitation

  • CLIP的zero-shot性能虽然总体上比supervised baseline ResNet-50要好,但其实在很多任务上比不过SOTA methods,因此CLIP的transfer learning有待挖掘;
  • CLIP在这几种task上zero-shot性能不好:fine-grained分类(花的分类、车的分类之类的)、抽象的任务(如计算图中object的个数)以及预训练时没见过的task(如分出相邻车辆的距离)。BTW,在这些任务上zero-shot性能不好,不代表CLIP pretrained encoders就没用了,CLIP encoders还是能提供很强的视觉先验的;
  • Zero-shot CLIP在真正意义上的out-of-distribution data上性能不好,比如在OCR中;
  • 尽管CLIP zero-shot classifier能在很广泛的任务上work,但究其本质CLIP还是在有限的类别中进行对比、推理,而不能像image caption那样完全的flexible地生成新的概念(如:词),这是CLIP功能上的缺陷,CLIP终究不是生成模型;
  • CLIP仍然没有解决深度学习poor data efficiency的问题,结合CLIP和self-training可能是一个能提高data efficiency的方向;
  • CLIP的方法论上也存在几个缺陷:在训练和挑选CLIP模型时,作者采用在几个数据的validation performance来做指导,这其实是不准确的,因为它不能完全代表CLIP的zero-shot性能。如果,设计一套框架来evaluate zero-shot performance对于之后的研究是很重要的;
  • CLIP的训练数据是从网上采集的,这些image-text pairs没有做data clear和de-bias,这可能会使模型有一些social biases;
  • 很多视觉任务很难用text来表达,如何用更高效的few-shot learning方法优化CLIP也很重要。

参考

  • https://openai.com/blog/clip/ (opens new window)
  • https://github.com/openai/CLIP (opens new window)
  • https://arxiv.org/abs/2103.00020 (opens new window)
  • https://www.zhihu.com/zvideo/1475706654562299904 (opens new window)
  • https://github.com/yzhuoning/Awesome-CLIP (opens new window)
  • 神器CLIP:连接文本和图像,打造可迁移的视觉模型 (opens new window)
  • 【CLIP系列Paper解读】CLIP: Learning Transferable Visual Models From Natural Language Supervision (opens new window)

ChatGPT全文翻译 ⬇️

0. 摘要

当前最先进的计算机视觉系统被训练来预测一组固定的预定对象类别。这种受限的监督形式限制了它们的通用性和可用性,因为要指定任何其他视觉概念,都需要额外的标注数据。直接从关于图像的原始文本中学习是一个有前途的替代方案,它利用了更广泛的监督源。我们展示了一种简单的预训练任务,即预测哪个标题与哪张图像对应,这是一种从互联网收集的 4 亿对(图像,文本)数据集中从零开始学习最先进的图像表示的高效且可扩展的方法。在预训练后,自然语言用于参考已学到的视觉概念(或描述新的概念),从而使模型能够在下游任务中进行零样本迁移。我们通过在 30 多个现有的计算机视觉数据集上进行基准测试,研究了这种方法的性能,这些任务包括光学字符识别(OCR)、视频中的动作识别、地理定位以及多种类型的细粒度对象分类。该模型可以在大多数任务中非平凡地迁移,并且通常与完全监督的基线模型竞争,而不需要任何特定数据集的训练。例如,我们在不使用 ImageNet 的 128 万个训练样本的情况下,通过零样本迁移匹配了原始 ResNet-50 在 ImageNet 上的准确性。我们在 https://github.com/OpenAI/CLIP 上发布了我们的代码和预训练模型权重。

1. 引言与动机

近年来,直接从原始文本中学习的预训练方法在自然语言处理(NLP)领域取得了革命性进展(Dai & Le, 2015; Peters et al., 2018; Howard & Ruder, 2018; Radford et al., 2018; Devlin et al., 2018; Raffel et al., 2019)。以自回归和掩码语言建模为代表的任务无关目标,通过计算能力、模型容量和数据的多个数量级扩展,持续提高了系统的能力。“文本到文本”(text-to-text)作为标准化输入输出接口的发展(McCann et al., 2018; Radford et al., 2019; Raffel et al., 2019)使任务无关的架构能够零样本迁移到下游数据集,免除了专门输出头或特定数据集定制的需求。诸如 GPT-3(Brown et al., 2020)等旗舰系统现在在许多任务中可以与专用模型竞争,同时几乎不需要任何数据集特定的训练数据。

这些结果表明,现代预训练方法在网络规模的文本集合中能够获取的总监督量超过了高质量的人群标注 NLP 数据集。然而,在计算机视觉等其他领域,模型的预训练仍然是基于人群标注的数据集(如 ImageNet)的标准实践(Deng et al., 2009)。那么,直接从网络文本中学习的可扩展预训练方法能否在计算机视觉领域带来类似的突破?先前的工作是鼓舞人心的。

二十多年前,Mori 等人(1999)探索了通过训练模型预测与图像配对的文本中的名词和形容词来改进基于内容的图像检索。Quattoni 等人(2007)证明了可以通过在分类器权重空间中进行流形学习来学习更数据高效的图像表示,这些分类器被训练来预测与图像相关联的标题中的词汇。Srivastava 和 Salakhutdinov(2012)通过在低层次的图像和文本标签特征之上训练多模态深度玻尔兹曼机,探索了深度表示学习。Joulin 等人(2016)现代化了这条研究路径,并展示了通过训练卷积神经网络(CNN)来预测图像标题中的词汇可以学习到有用的图像表示。他们将 YFCC100M 数据集(Thomee et al., 2016)中的图像标题、描述和标签元数据转换为一个词袋多标签分类任务,并展示了通过预测这些标签进行的预训练能够在迁移任务中表现得与基于 ImageNet 的预训练相似。Li 等人(2017)随后扩展了这一方法,不仅预测单词,还预测短语 n-gram,并展示了他们的系统能够通过评分目标类的视觉 n-gram 词典来实现零样本迁移,并预测得分最高的那个类。

采用更现代的架构和预训练方法,VirTex(Desai & Johnson, 2020)、ICMLM(Bulent Sariyildiz 等, 2020)和 ConVIRT(Zhang 等, 2020)最近展示了基于 transformer 的语言建模、掩码语言建模和对比目标的潜力,用于从文本中学习图像表示。

虽然作为概念证明这些工作令人兴奋,但使用自然语言监督进行图像表示学习仍然很少见。这可能是因为在常见基准测试中的表现远低于其他方法。例如,Li 等人(2017)在 ImageNet 的零样本设置中只达到了 11.5% 的准确率。这远低于当前的最先进水平(88.4%,Xie 等人, 2020),甚至低于经典计算机视觉方法的 50% 准确率(Deng 等人, 2012)。相反,更窄范围但针对性强的弱监督应用提高了性能。Mahajan 等人(2018)展示了在 Instagram 图像上预测与 ImageNet 相关的标签是一个有效的预训练任务。当微调至 ImageNet 时,这些预训练模型将准确率提高了 5% 以上,并在当时提高了整体最先进水平。Kolesnikov 等人(2019)和 Dosovitskiy 等人(2020)也展示了,通过预训练模型预测 JFT-300M 数据集中噪声标记的类,可以在更广泛的迁移基准上获得巨大收益。

这种工作代表了在从有限的监督“金标”中学习与从几乎无限的原始文本中学习之间的当前务实中间立场。然而,这并非没有妥协。两项工作都仔细设计了他们的监督,在此过程中将其限制在 1000 和 18291 类。自然语言能够表达并因此可以监督更广泛的视觉概念,因为它的广泛性。两种方法还使用静态 softmax 分类器进行预测,缺乏动态输出机制。这严重限制了它们的灵活性并限制了它们的“零样本”能力。

在这些弱监督模型与最近直接从自然语言学习图像表示的探索之间的关键区别在于规模。虽然 Mahajan 等人(2018)和 Kolesnikov 等人(2019)在数百万到数十亿张图像上花费了数年加速器时间来训练他们的模型,但 VirTex、ICMLM 和 ConVIRT 仅在 10 万到 20 万张图像上训练了数天加速器时间。在这项工作中,我们弥合了这一差距,并研究了使用大规模自然语言监督训练的图像分类器的行为。在互联网公开数据的大量帮助下,我们创建了一个新的 4 亿对(图像,文本)数据集,并展示了从头开始训练的简化版本的 ConVIRT,我们称之为 CLIP(Contrastive Language-Image Pre-training),这是一种从自然语言监督中学习的高效方法。通过训练一系列跨越近 2 个数量级计算量的八个模型,我们研究了 CLIP 的可扩展性,发现 CLIP 与 GPT 家族类似,在预训练期间学会执行一系列广泛的任务,包括 OCR、地理定位、动作识别等。我们通过在 30 多个现有数据集上进行基准测试来衡量 CLIP 的零样本迁移性能,发现它可以与先前的任务特定监督模型竞争。我们还通过线性探测表示学习分析证实了这些发现,并展示了 CLIP 的表现优于当前公开的最佳 ImageNet 模型,同时也更具计算效率。此外,我们还发现零样本 CLIP 模型比具有相同准确率的监督 ImageNet 模型更为鲁棒,这表明任务无关模型的零样本评估更能代表模型的能力。这些结果具有重要的政策和伦理意义,我们将在第 7 节中讨论这些问题。

继续翻译文档的第二部分内容:


2. 方法

2.1 自然语言监督

我们的方法核心是从自然语言中包含的监督信号中学习感知。如引言中所述,这并不是一个全新的概念,然而在描述这一领域的工作时使用的术语各不相同,甚至有些自相矛盾,且陈述的动机也多种多样。Zhang 等人(2020)、Gomez 等人(2017)、Joulin 等人(2016)和 Desai & Johnson(2020)都介绍了从与图像配对的文本中学习视觉表示的方法,但他们分别将其描述为无监督、自监督、弱监督和监督。

我们强调,这一系列工作的共同点并不是所使用的具体方法细节,而是对自然语言作为训练信号的重视。尽管早期的工作在使用主题模型和 n-gram 表示时面临自然语言复杂性的挑战,但深度上下文表示学习的改进表明,我们现在拥有了有效利用这种丰富监督资源的工具(McCann 等人, 2017)。

与其他训练方法相比,从自然语言学习具有多个潜在优势。与标准的基于人群标注的图像分类相比,自然语言监督更易于扩展,因为它不需要注释为经典的“机器学习兼容格式”,例如标准的 1-of-N 多数投票“金标”。相反,基于自然语言的方法可以从互联网上的大量文本中被动地学习监督。从自然语言中学习还相对于大多数无监督或自监督学习方法具有一个重要优势,即它不仅仅学习表示,还将这种表示与语言联系起来,从而实现灵活的零样本迁移。在接下来的小节中,我们将详细介绍我们最终选择的方法。

2.2 构建足够大的数据集

现有的工作主要使用了三个数据集:MS-COCO(Lin 等, 2014)、Visual Genome(Krishna 等, 2017)和 YFCC100M(Thomee 等, 2016)。虽然 MS-COCO 和 Visual Genome 是高质量的基于人群标注的数据集,但它们的规模在现代标准下仍然较小,每个数据集约有 10 万张训练图片。相比之下,其他计算机视觉系统的训练数据规模可以达到 35 亿张 Instagram 照片(Mahajan 等, 2018)。YFCC100M 拥有 1 亿张照片,可能是一个替代方案,但每张图片的元数据稀疏且质量各异。许多图片使用自动生成的文件名(例如 20160716 113957.JPG)作为“标题”,或包含相机曝光设置的“描述”。经过筛选后,只保留了那些具有自然语言标题和/或描述且为英文的图片,数据集的规模因此缩小了 6 倍,仅剩下 1500 万张照片。这与 ImageNet 的规模大致相当。

自然语言监督的一个主要动机是这种形式的数据在互联网上公开获取的数量庞大。由于现有的数据集并不能充分反映这一可能性,因此仅依靠这些数据集的结果可能会低估这一研究方向的潜力。为了解决这个问题,我们构建了一个包含 4 亿对(图像,文本)数据的新数据集,这些数据来自互联网上的各种公开来源。为了尽可能涵盖广泛的视觉概念,我们在构建过程中搜索了包含 50 万个查询之一的(图像,文本)对。1 我们通过每个查询最多包含 2 万对(图像,文本)来大致平衡结果。最终生成的数据集的总词数与用于训练 GPT-2 的 WebText 数据集相当。我们将此数据集称为 WIT(WebImageText)。

1 基础查询列表是英文版维基百科中至少出现 100 次的所有词汇。这个列表通过高点对互信息的双词扩展,以及所有维基百科文章的名称(达到一定搜索量)进行补充。最后,所有未在查询列表中出现的 WordNet 同义词集都被添加。

2.3 选择高效的预训练方法

当前最先进的计算机视觉系统使用了非常庞大的计算资源。Mahajan 等人(2018)在训练他们的 ResNeXt101-32x48d 时需要 19 年的 GPU 时间,而 Xie 等人(2020)在训练他们的 Noisy Student EfficientNet-L2 时需要 33 年的 TPUv3 核心时间。当考虑到这两个系统都仅被训练来预测 1000 个 ImageNet 类别时,从自然语言中学习开放集的视觉概念这一任务显得极具挑战。在我们的努力过程中,我们发现训练效率是成功扩展自然语言监督的关键,并基于这一指标选择了最终的预训练方法。

我们最初的方法与 VirTex 类似,同时从头开始联合训练图像 CNN 和文本 transformer 来预测图像的标题。然而,我们发现这一方法在高效扩展方面存在困难。在图 2 中,我们展示了一个 6300 万参数的 transformer 语言模型,它已经使用了两倍于其 ResNet-50 图像编码器的计算量,但在识别 ImageNet 类别方面比一个简单得多的预测文本词袋编码的基线模型学习速度慢三倍。

这两种方法有一个共同点:它们都试图预测与每张图像配对的文本的确切单词。这是一项困难的任务,因为与图像共同出现的描述、评论和相关文本的多样性非常广泛。最近在图像对比表示学习方面的研究发现,对比目标能够比等效的预测目标学习更好的表示(Tian 等, 2019)。其他研究发现,尽管图像生成模型可以学习高质量的图像表示,但它们比具有相同性能的对比模型需要多出一个数量级的计算量(Chen 等, 2020a)。注意到这些发现后,我们探索了训练一个系统来解决一个可能更简单的代理任务:仅预测哪个文本整体与哪张图像配对,而不是文本中的确切单词。我们从相同的词袋编码基线开始,将预测目标替换为对比目标,如图 2 所示,并观察到零样本迁移到 ImageNet 的效率提高了 4 倍。

给定一个包含 N 对(图像,文本)配对的数据批次,CLIP 被训练来预测该批次中 N × N 个可能的(图像,文本)配对中实际发生了哪些。为此,CLIP 通过联合训练一个图像编码器和一个文本编码器,来最大化该批次中 N 对真实配对的图像和文本嵌入的余弦相似度,同时最小化 N²-N 个错误配对的嵌入相似度。我们在这些相似度得分上优化了对称交叉熵损失函数。图 3 中包含了 CLIP 核心实现的伪代码。据我们所知,这种批次构建技术和目标首先在深度度量学习领域被引入,作为多类 N 对损失(Sohn, 2016),由 Oord 等人(2018)推广为 InfoNCE 损失,并最近被 Zhang 等人(2020)适应为医学影像领域的对比(文本,图像)表示学习。

由于我们预训练数据集的规模巨大,过拟合并不是主要关注点,因此 CLIP 的训练细节相对于 Zhang 等人(2020)的实现进行了简化。我们从头开始训练 CLIP,而不使用 ImageNet 权重来初始化图像编码器,也不使用预训练权重来初始化文本编码器。我们不使用非线性投影将表示映射到对比嵌入空间,这一变化由 Bachman 等人(2019)引入并由 Chen 等人(2020b)推广。我们仅使用线性投影将每个编码器的表示映射到多模态嵌入空间。在这两种版本之间的训练效率上我们没有注意到差异,并推测非线性投影可能与当前图像自监督表示学习方法的细节共同适应。我们还移除了 Zhang 等人(2020)中用于从文本中随机抽取单个句子的文本转换函数 tu,因为 CLIP 的许多(图像,文本)配对数据集仅包含一个句子。我们还简化了图像转换函数 tv。训练过程中唯一使用的数据增强是从调整大小的图像中随机裁剪一个方形区域。最后,控制 softmax 中 logits 范围的温度参数 τ 在训练过程中直接作为对数参数乘数优化,以避免将其作为超参数调整。

2.4 模型的选择与扩展

我们考虑了图像编码器的两种不同架构。首先,我们选择 ResNet-50(He 等, 2016a)作为图像编码器的基础架构,因为它的广泛应用和经过验证的性能。我们对原始版本进行了几项修改,采用了 He 等人(2019)的 ResNet-D 改进和 Zhang(2019)的抗锯齿 rect-2 模糊池化。我们还用一个注意力池化机制替换了全局平均池化层。注意力池化实现为一个单层“transformer 风格”的多头 QKV 注意力层,其中查询基于图像的全局平均池化表示进行调整。

第二种架构中,我们实验了最近引入的 Vision Transformer (ViT) (Dosovitskiy 等, 2020)。我们严格遵循他们的实现,仅做了微小修改,在 transformer 之前对组合的 patch 和位置嵌入增加了一个额外的层规范化,并使用了稍微不同的初始化方案。

文本编码器是一个 Transformer (Vaswani 等, 2017),其架构修改参考了 Radford 等人(2019)。作为基础规模,我们使用了一个具有 6300 万参数的 12 层 512 宽度模型,并配有 8 个注意力头。transformer 作用于文本的低字节对编码(BPE)表示,词汇表大小为 49152 (Sennrich 等, 2015)。为了提高计算效率,最大序列长度被限制在 76。文本序列用 [SOS] 和 [EOS] 标记包围,transformer 最高层在 [EOS] 标记的激活被视为文本的特征表示,经过层规范化后线性投影到多模态嵌入空间中。为了保留初始化为预训练语言模型或添加语言建模作为辅助目标的能力,文本编码器中使用了掩码自注意力,但这部分探索留待未来工作。

虽然以前的计算机视觉研究通常通过增加宽度(Mahajan 等人,2018)或深度(He 等人,2016a)来扩展模型,但对于 ResNet 图像编码器,我们采用了 Tan & Le(2019)的方法,发现通过在宽度、深度和分辨率上均衡地分配额外的计算资源,比仅分配给模型的某一个维度表现更好。虽然 Tan & Le(2019)为他们的 EfficientNet 架构调整了分配给每个维度的计算资源比例,但我们使用了一个简单的基线方法,即均衡地增加模型的宽度、深度和分辨率。对于文本编码器,我们仅根据 ResNet 宽度的增加比例扩展了模型的宽度,而没有扩展深度,因为我们发现 CLIP 的性能对文本编码器的容量不太敏感。

2.5 训练

我们训练了一系列 5 个 ResNet 和 3 个 Vision Transformer。对于 ResNet,我们训练了 ResNet-50、ResNet-101,然后是 3 个根据 EfficientNet 风格模型扩展训练的模型,分别使用了约为 ResNet-50 的 4 倍、16 倍和 64 倍的计算量。它们分别命名为 RN50x4、RN50x16 和 RN50x64。对于 Vision Transformer,我们训练了 ViT-B/32、ViT-B/16 和 ViT-L/14。我们所有的模型都训练了 32 个 epoch。我们使用 Adam 优化器(Kingma & Ba,2014),对所有非增益或偏差的权重应用分离的权重衰减正则化(Loshchilov & Hutter,2017),并使用余弦调度(Loshchilov & Hutter,2016)来衰减学习率。初始超参数是通过在基线 ResNet-50 模型上进行 1 个 epoch 训练时,结合网格搜索、随机搜索和手动调整设置的。由于计算资源的限制,较大模型的超参数被经验性地调整。可学习的温度参数 τ 被初始化为相当于 0.07(Wu 等人,2018),并在训练过程中被限制为最大不能将 logits 缩放超过 100,这被发现是防止训练不稳定所必需的。我们使用了非常大的 minibatch 大小为 32768。为了加速训练并节省内存,我们使用了混合精度训练(Micikevicius 等人,2017)。为了节省额外的内存,还使用了梯度检查点(Griewank & Walther,2000;Chen 等人,2016)、半精度 Adam 统计量(Dhariwal 等人,2020)和半精度随机四舍五入文本编码器权重。嵌入相似度的计算也被分割处理,单个 GPU 仅计算所需的一部分配对相似度以进行本地批次的嵌入。最大的 ResNet 模型 RN50x64 在 592 个 V100 GPU 上训练了 18 天,而最大的 Vision Transformer 在 256 个 V100 GPU 上训练了 12 天。对于 ViT-L/14,我们还在更高的 336 像素分辨率下进行了额外 1 个 epoch 的预训练以提升性能,类似于 FixRes(Touvron 等人,2019)。我们将此模型称为 ViT-L/14@336px。除非另有说明,本论文中报告的所有“CLIP”结果均使用此模型,因为我们发现它的性能最佳。

3. 实验

3.1 零样本迁移

3.1.1 动机

在计算机视觉领域,零样本学习通常指的是研究在图像分类中推广到未见过的对象类别(Lampert 等人,2009)。我们在这里使用这个术语的范围更广泛,研究推广到未见过的数据集。我们将其作为执行未见任务的代理,类似于 Larochelle 等人(2008)在零数据学习论文中的愿景。虽然无监督学习领域的大量研究关注于机器学习系统的表示学习能力,但我们认为研究零样本迁移是一种衡量机器学习系统任务学习能力的方法。从这个角度来看,数据集评估的是在特定分布上执行任务的性能。然而,许多流行的计算机视觉数据集主要由研究社区创建,作为基准来指导通用图像分类方法的发展,而不是衡量在特定任务上的表现。例如,可以合理地说,SVHN 数据集评估的是在 Google 街景照片分布上的街道号码转录任务,但对于 CIFAR-10 数据集衡量的“真实”任务是什么则不太清楚。尽管如此,CIFAR-10 来自哪个分布却是明确的——TinyImages(Torralba 等人,2008)。在这些类型的数据集上,零样本迁移更多的是对 CLIP 对分布转移和领域泛化的鲁棒性进行评估,而不是任务泛化。请参阅第 3.3 节获取针对这一点的分析。

据我们所知,Visual N-Grams(Li 等人,2017)首次以上述方式研究了现有图像分类数据集的零样本迁移。它也是我们所知的唯一一项使用通用预训练模型研究标准图像分类数据集零样本迁移的工作,并且为 CLIP 的表现提供了参考背景。他们的方法学习了一个包含 142,806 个视觉 n-gram(包括 1-gram 到 5-gram)的字典的参数,并使用 Jelinek-Mercer 平滑的差分版本优化这些 n-gram,以最大化给定图像的所有文本 n-gram 的概率。为了执行零样本迁移,他们首先将每个数据集类名的文本转换为其 n-gram 表示,然后根据他们的模型计算其概率,并预测得分最高的那个。

我们关注研究零样本迁移作为一种评估任务学习能力的方法,受到了 NLP 领域任务学习研究的启发。据我们所知,Liu 等人(2018)首次将任务学习确定为一种“意外副作用”,当一个训练生成维基百科文章的语言模型学会可靠地在语言之间进行名字音译时。虽然 GPT-1(Radford 等人,2018)专注于将预训练作为一种迁移学习方法来改善监督微调,但它也包括了一项消融研究,展示了四种启发式零样本迁移方法在预训练过程中,尽管没有任何监督适配,性能逐渐提高。这项分析为 GPT-2(Radford 等人,2019)奠定了基础,后者专门研究通过零样本迁移来研究语言模型的任务学习能力。

3.1.2 使用 CLIP 进行零样本迁移

CLIP 被预训练来预测图像和文本片段是否在其数据集中配对。为了执行零样本分类,我们重用了这一能力。对于每个数据集,我们使用数据集中所有类别的名称作为潜在的文本配对集,并根据 CLIP 预测最可能的(图像,文本)配对。更具体地说,我们首先通过各自的编码器计算图像的特征嵌入和可能文本集合的特征嵌入。然后计算这些嵌入的余弦相似度,乘以一个温度参数 τ,并通过 softmax 归一化为一个概率分布。注意,这一预测层是一个带有 L2 归一化输入、L2 归一化权重、无偏差和温度缩放的多项逻辑回归分类器。这样理解时,图像编码器是计算机视觉的主干,用于计算图像的特征表示,而文本编码器是一个超网络(Ha 等人,2016),根据文本指定的视觉概念生成线性分类器的权重。Lei Ba 等人(2015)首次引入了这种形式的零样本图像分类器,而从自然语言生成分类器的想法至少可以追溯到 Elhoseiny 等人(2013)。继续这种理解,CLIP 预训练的每一步都可以看作是在优化一个随机创建的代理计算机视觉数据集的性能,该数据集每个类别包含 1 个样本,并且具有 32,768 个通过自然语言描述定义的总类。对于零样本评估,我们缓存了文本编码器生成的零样本分类器,并在所有后续预测中重复使用它。这使得生成分类器的成本可以在整个数据集的预测中分摊。

3.1.3 初步与 Visual N-Grams 的比较

在表 1 中,我们将 CLIP 与 Visual N-Grams 进行了比较。最佳的 CLIP 模型将 ImageNet 上的准确率从概念验证的 11.5% 提高到了 76.2%,并且在不使用 ImageNet 的 128 万个标注训练样本的情况下,匹配了原始 ResNet-50 的性能。此外,CLIP 模型的 top-5 准确率明显高于其 top-1 准确率,这个模型的 top-5 准确率达到了 95%,匹敌 Inception-V4(Szegedy 等人, 2016)。在零样本设置下与强大的完全监督基线匹配性能表明,CLIP 是朝着灵活和实用的零样本计算机视觉分类器迈出的重要一步。如上所述,与 Visual N-Grams 的比较是为了为 CLIP 的表现提供背景,而不应被视为 CLIP 与 Visual N-Grams 之间的直接方法比较,因为两种系统之间存在许多未加控制的性能相关差异。例如,我们的训练数据集比他们大了 10 倍,使用的视觉模型每次预测需要近 100 倍的计算量,可能使用的训练计算量超过他们的 1000 倍,并且我们使用了在 Visual N-Grams 发布时尚不存在的基于 transformer 的模型。作为更接近的比较,我们在与 Visual N-Grams 相同的 YFCC100M 数据集上训练了一个 CLIP ResNet-50,并发现它在 V100 GPU 上的训练时间不到一天内匹配了他们报告的 ImageNet 性能。这个基线模型也是从头开始训练的,而不是像 Visual N-Grams 那样从预训练的 ImageNet 权重初始化的。

CLIP 在其他两个报告的数据集上也优于 Visual N-Grams。在 aYahoo 数据集上,CLIP 将错误率减少了 95%;在 SUN 数据集上,CLIP 将准确率提高了一倍多。为了进行更全面的分析和压力测试,我们实施了一个更大规模的评估套件,详细信息见附录 A。总之,我们从 Visual N-Grams 报告的 3 个数据集扩展到包括 30 多个数据集,并与 50 多个现有的计算机视觉系统进行了比较,以提供结果背景。

3.1.4 提示工程与集成

大多数标准图像分类数据集将类名或描述类名的信息作为附带考虑,并未专门为基于自然语言的零样本迁移设计。绝大多数数据集只是用一个数字 id 标注图像类别,并包含一个文件将这些 id 映射回它们的英文名称。一些数据集,例如 Flowers102 和 GTSRB,甚至似乎在发布版本中没有包含这种映射,这使得零样本迁移完全不可能。2 对于许多数据集,我们观察到这些标签可能被随意选择,并未考虑到与零样本迁移相关的问题,该问题依赖于任务描述以成功迁移。

2 Alec 在这个项目过程中学到了比预期更多的花卉种类和德国交通标志。

一个常见的问题是多义词。当 CLIP 的文本编码器只能获取类别名称时,由于缺乏上下文,它无法区分所指的词义是什么。在某些情况下,同一个词的多个意思可能在同一个数据集中作为不同的类别出现!这种情况发生在 ImageNet 中,它包含了既有建筑起重机,也有飞行的鹤。另一个例子是 Oxford-IIIT Pet 数据集中的类别,在上下文中显然指的是狗的品种“拳师犬(Boxer)”,但对于缺乏上下文的文本编码器来说,它也可能指一种运动员。

我们还发现,在我们的预训练数据集中,文本很少只有一个单词。通常,文本是一个描述图像的完整句子。为了弥合这一分布差异,我们发现使用提示模板“A photo of a {label}.”(一张{label}的照片)作为默认设置,能够帮助指定文本关于图像内容。这通常比仅使用标签文本的基线方法性能更好。例如,仅使用这个提示就可以将 ImageNet 上的准确率提高 1.3%。

类似于围绕 GPT-3(Brown 等人,2020;Gao 等人,2020)的“提示工程”讨论,我们还观察到通过为每个任务定制提示文本,可以显著提高零样本性能。以下是一些非详尽的示例。我们发现,在几个细粒度图像分类数据集上,指定类别的类型有帮助。例如在 Oxford-IIIT Pets 上,使用“A photo of a {label}, a type of pet.”(一张{label}的照片,一种宠物)来帮助提供上下文效果良好。同样,在 Food101 上指定为一种食物,在 FGVC Aircraft 上指定为一种飞机也有所帮助。对于 OCR 数据集,我们发现给要识别的文本或数字加引号可以提高性能。最后,我们发现,在卫星图像分类数据集上,指定这些图像的形式有帮助,因此我们使用了类似“a satellite photo of a {label}.”(一张{label}的卫星照片)这样的变体。

我们还尝试通过集成多个零样本分类器来进一步提高性能。这些分类器是通过使用不同的上下文提示生成的,例如“ A photo of a big {label}.”(一张大的{label}的照片)和“A photo of a small {label}.”(一张小的{label}的照片)。我们在嵌入空间而不是概率空间上构建集成。这使得我们可以缓存一组平均的文本嵌入,因此在多次预测中摊销成本时,集成的计算成本与使用单个分类器相同。我们观察到跨多个生成的零样本分类器集成可以可靠地提高性能,并在大多数数据集中使用了这一方法。在 ImageNet 上,我们集成了 80 个不同的上下文提示,这进一步将性能提高了 3.5%。将提示工程和集成结合起来,ImageNet 准确率几乎提高了 5%。图 4 展示了与使用 Li 等人(2017)中直接嵌入类名的无上下文基线方法相比,提示工程和集成如何改变一组 CLIP 模型的性能。

3.1.5 零样本 CLIP 性能分析

由于任务无关的零样本分类器在计算机视觉领域的研究较少,CLIP 提供了一个有前景的机会,可以更好地理解这种类型模型的特性。在本节中,我们将对 CLIP 零样本分类器的各种属性进行研究。首先,我们简单地看看零样本分类器的表现如何。为了对其进行背景化,我们将其与一个简单的现成基线进行比较:在典型的 ResNet-50 特征上拟合一个完全监督的、正则化的逻辑回归分类器。在图 5 中,我们展示了这个比较,涵盖了 27 个数据集。请参阅附录 A 了解数据集和设置的详细信息。

在 27 个数据集中,零样本 CLIP 在 16 个数据集中略胜于这个基线,并在大多数情况下表现更好。观察具体数据集揭示了一些有趣的行为。在细粒度分类任务中,我们观察到性能的广泛差异。在其中两个数据集中,Stanford Cars 和 Food101,零样本 CLIP 比 ResNet-50 特征上的逻辑回归分类器的性能高出 20% 以上,而在其他两个数据集中,Flowers102 和 FGVCAircraft,零样本 CLIP 的性能低了超过 10%。在 OxfordPets 和 Birdsnap 上,性能更接近。我们推测这些差异主要是由于 WIT 和 ImageNet 之间的任务特定监督量不同。在“通用”对象分类数据集(如 ImageNet、CIFAR10/100、STL10 和 PascalVOC2007)上,性能相对类似,CLIP 在所有情况下都略有优势。在 STL10 上,CLIP 达到了 99.3% 的总成绩,这似乎是新的最先进水平,尽管没有使用任何训练样本。零样本 CLIP 在测量视频中动作识别的两个数据集上显著优于 ResNet-50。在 Kinetics700 上,CLIP 比 ResNet-50 高出 14.5%。在 UCF101 上,CLIP 也比 ResNet-50 的特征高出 7.7%。我们推测这可能是因为自然语言在涉及动词的视觉概念方面提供了更广泛的监督,而 ImageNet 中的监督主要集中在以名词为主的对象上。

然而,零样本 CLIP 在某些特定的复杂或抽象任务上表现较差,如卫星图像分类(EuroSAT 和 RESISC45)、淋巴结肿瘤检测(PatchCamelyon)、在合成场景中计数对象(CLEVRCounts)、与自动驾驶相关的任务(如德国交通标志识别 GTSRB)以及识别最近车辆的距离(KITTI Distance)。这些结果突显了零样本 CLIP 在更复杂任务上的弱点。相比之下,非专家人类可以稳健地执行其中的几个任务,如计数、卫星图像分类和交通标志识别,这表明仍有显著的改进空间。然而,我们谨慎指出,对于没有先验经验的困难任务(如淋巴结肿瘤分类,对几乎所有人类来说(可能也包括 CLIP),是否测量零样本迁移而不是少样本迁移是一个有意义的评估尚不明确。

虽然将零样本性能与完全监督模型进行比较有助于理解 CLIP 的任务学习能力,但与少样本方法的比较更为直接,因为零样本是其极限。在图 6 中,我们可视化了零样本 CLIP 与在同一特征空间上的少样本逻辑回归之间的比较,涉及许多图像模型,包括最佳公开的 ImageNet 模型、自监督学习方法以及 CLIP 本身。尽管直观地讲,零样本性能应该低于一元样本,但我们发现零样本 CLIP 的性能实际上与 4 样本逻辑回归在同一特征空间上的性能相当。这可能是由于零样本方法与少样本方法之间的重要区别。首先,CLIP 的零样本分类器是通过自然语言生成的,这允许直接指定(“传达”)视觉概念。相比之下,“普通”监督学习必须通过训练样本间接推断概念。无上下文示例学习的缺点是,许多不同的假设可能与数据一致,尤其是在单样本情况下。单个图像通常包含许多不同的视觉概念。尽管有能力的学习者可以利用视觉线索和启发式方法,例如假设正在演示的概念是图像中的主要对象,但这并没有保证。

一种解决零样本与少样本性能差异的潜在方法是使用 CLIP 的零样本分类器作为少样本分类器权重的先验。虽然通过向生成的权重添加 L2 惩罚是这种想法的直接实现,但我们发现超参数优化通常会选择一个非常大的正则化值,以至于结果的少样本分类器“只是”零样本分类器。研究如何将零样本迁移的优势与少样本学习的灵活性结合起来是未来研究的一个有前途的方向。

在将零样本 CLIP 与其他模型的少样本逻辑回归进行比较时,我们发现零样本 CLIP 大致匹敌我们评估套件中表现最佳的 16 样本分类器,该分类器使用了一个在 ImageNet-21K 上训练的 BiT-M ResNet-152x2 的特征。我们确信,在 JFT-300M 上训练的 BiT-L 模型表现会更好,但这些模型尚未公开发布。一个令人惊讶的发现是,在 16 样本设置中表现最佳的是 BiT-M ResNet-152x2,尽管在第 3.2 节中分析的全监督设置下,Noisy Student EfficientNet-L2 在 27 个数据集上的表现几乎比它好 5%。

除了研究零样本 CLIP 和少样本逻辑回归的平均性能外,我们还研究了各个数据集上的表现。在图 7 中,我们展示了一个线性回归模型需要多少个标注样本来匹敌零样本 CLIP 的表现。由于零样本 CLIP 也是一个线性分类器,这估算了在这种设置下零样本迁移的有效数据效率。为了避免训练数千个线性分类器,我们基于 1 样本、2 样本、4 样本、8 样本、16 样本(如果可能)和每个数据集上训练的完全监督线性分类器的性能进行 log-线性插值来估计有效的数据效率。我们发现零样本迁移的效率在数据集之间差异很大,从每类少于 1 个标注样本到 184 个不等。两个数据集 Flowers102 和 EuroSAT 在一元样本模型中表现不佳。半数数据集需要少于 5 个样本,每类的中位数为 5.4。然而,估计的平均数据效率为 20.8 个样本。这是由于 20% 的数据集需要大量标注样本来匹敌表现。在 ImageNet 上,零样本 CLIP 匹敌了在相同特征空间上训练的 16 样本线性分类器的表现。

3.2 微调

虽然零样本分类器能够在没有任务特定监督的情况下表现良好,但它们无法总是替代通过数据集特定的微调所实现的性能。在本节中,我们研究通过从零样本迁移到在少量标注样本上微调 CLIP 模型的效果。我们使用 ImageNet 作为基准,探索了不同数量的微调样本对 CLIP 性能的影响。与少样本逻辑回归分类器相似,我们研究了线性探测(即在冻结的 CLIP 特征上训练逻辑回归分类器)的设置。这种方法在 NLP 中非常流行,尤其是在 BERT 及其后续工作的背景下,我们希望了解这种方法在视觉任务上的表现。

在图 8 中,我们展示了不同数量的标注样本对微调效果的影响。通过使用 1-16 个样本进行微调,CLIP 模型可以显著提高其在 ImageNet 上的性能。微调线性探测模型的性能显著优于零样本迁移模型,尤其是在少样本设置中。在使用 16 个样本的情况下,CLIP 模型的表现已经接近全监督模型。然而,随着样本数量的增加,性能提升逐渐减缓,并最终趋于稳定。这表明微调的效果在大样本设置下有限。值得注意的是,CLIP 模型的线性探测性能在使用较少的标注样本时已经能够与全监督的 ResNet-50 模型相媲美,这进一步验证了 CLIP 模型在低监督环境下的强大能力。

在全监督设置下,CLIP 模型在 ImageNet 上的表现优于所有现有的公开模型。在表 2 中,我们将 CLIP 与其他模型进行了比较。CLIP 的表现明显优于先前最先进的 Noisy Student EfficientNet-L2 模型,并且在训练成本上具有优势。我们还研究了 CLIP 在其他几个基准数据集上的表现,并发现它在大多数任务中都表现优异,进一步验证了 CLIP 模型的通用性和强大性能。

3.3 分析与讨论

在本节中,我们将对 CLIP 模型的行为进行深入分析,以更好地理解其特性和局限性。首先,我们分析了 CLIP 的数据效率。图 9 展示了在几个数据集上微调 CLIP 模型所需的标注样本数量。我们发现,CLIP 的数据效率在不同数据集之间差异很大。在某些任务上,CLIP 仅需要少量样本即可达到良好的性能,而在其他任务上则需要大量样本才能达到相似的效果。这表明 CLIP 模型的表现在很大程度上依赖于任务的特定性质,尤其是在任务的复杂性和数据集的多样性方面。

此外,我们还分析了 CLIP 模型在不同任务上的迁移性能。图 10 展示了 CLIP 模型在 30 多个计算机视觉任务上的表现。我们发现,CLIP 的迁移性能在大多数任务上表现优异,尤其是在与自然语言相关的任务上。然而,在某些特定任务上,CLIP 的表现相对较弱,例如在图像生成和视频理解任务上。这表明,虽然 CLIP 在广泛的任务上表现良好,但在特定领域的应用中仍有改进空间。

最后,我们讨论了 CLIP 模型的局限性和未来的研究方向。尽管 CLIP 展示了强大的迁移能力和数据效率,但它在一些复杂的任务上表现仍然不足,例如在细粒度图像分类和多模态任务上。此外,CLIP 的训练过程依赖于大规模的数据集,这对计算资源和训练时间提出了很高的要求。未来的研究可以探索如何在更小的数据集上训练高效的 CLIP 模型,并进一步提高其在复杂任务上的表现。

3.4 总结

通过我们的实验,CLIP 展示了其在多个任务上的优越表现,尤其是在零样本迁移和数据效率方面。与现有的计算机视觉模型相比,CLIP 不仅在传统图像分类任务中表现出色,还在许多非传统任务中表现出了强大的适应能力。尽管如此,CLIP 仍有改进的空间,尤其是在面对更复杂的任务和数据集时。此外,CLIP 的训练过程依赖于大规模的数据集,这对计算资源提出了挑战。未来的研究可以探索如何提高 CLIP 的训练效率,以及如何在更小规模的数据集上保持其强大的迁移能力。

CLIP 模型的成功不仅证明了从自然语言中学习视觉表示的潜力,还为未来的多模态模型研究提供了新的方向。通过进一步优化 CLIP 模型,并将其应用于更广泛的任务,我们相信它将继续推动计算机视觉和多模态学习领域的发展。

4. 相关工作

4.1 从语言中学习视觉表示

本研究在视觉和语言结合领域的文献中处于前沿位置,特别是在从自然语言中学习视觉表示方面。早期的研究包括 Mori 等人(1999)的工作,他们通过训练模型来预测图像与描述性文本中的名词和形容词的关联,探索了基于内容的图像检索。Quattoni 等人(2007)通过训练分类器来预测图像的标题,展示了可以学习到更有效的图像表示。Srivastava 和 Salakhutdinov(2012)则使用深度玻尔兹曼机来学习联合图像和文本的表示。Joulin 等人(2016)通过将图像标题、描述和标签元数据转换为多标签分类任务,展示了用卷积神经网络(CNN)从这些文本元数据中学习图像表示的有效性。Li 等人(2017)进一步扩展了这一方法,展示了通过预测 n-gram 词汇,可以实现零样本迁移。更近期的研究,VirTex(Desai & Johnson, 2020)、ICMLM(Bulent Sariyildiz 等, 2020)和 ConVIRT(Zhang 等, 2020)展示了基于 transformer 的语言模型在从文本中学习图像表示方面的潜力。

4.2 对比学习

对比学习是 CLIP 的核心训练策略之一,它是一种自监督学习方法,通过最大化正样本和最小化负样本的相似度来学习有效的表示。早期的对比学习方法包括 Hadsell 等人(2006)的工作,他们在机器人的感知领域首次引入了对比损失。近年来,Chen 等人(2020a)提出的 SimCLR 和 He 等人(2020)提出的 MoCo 都是对比学习领域的重大进展,前者展示了对比学习可以有效地扩展到大型数据集,后者则引入了动态存储器队列,以提高对比学习的效果。Oord 等人(2018)的 InfoNCE 损失也是 CLIP 对比学习的基础之一,通过在表示的嵌入空间中对正样本和负样本进行对比来学习表示。

4.3 多模态学习

多模态学习关注如何整合来自不同模态的数据源,以提高模型的理解和决策能力。Xu 等人(2015)提出的 Show and Tell 是早期的多模态学习模型之一,它通过联合训练 CNN 和 RNN 来生成描述图像的自然语言句子。Lu 等人(2019)提出的 ViLBERT 则是一个双流 BERT 模型,能够有效地结合视觉和语言两种模态的信息,从而在多个多模态任务中取得了优异的表现。Radford 等人(2021)提出的 CLIP 是一个更为通用的多模态模型,通过对比学习策略,将图像和文本的嵌入映射到同一空间,从而实现了强大的零样本迁移能力。

4.4 自然语言处理的进展

CLIP 的设计受到了自然语言处理(NLP)领域近年来取得的巨大进展的启发,尤其是在大规模预训练模型方面。BERT(Devlin 等人, 2019)和 GPT(Radford 等人, 2018)等模型展示了通过在大量无标注文本数据上进行预训练,然后在下游任务上进行微调,能够显著提高模型的性能。CLIP 结合了 NLP 中流行的 transformer 架构(Vaswani 等人, 2017)和对比学习策略,展示了在多模态任务中预训练模型的巨大潜力。

4.5 其他相关领域

除了上述领域外,CLIP 的研究还与其他几个相关领域有着紧密联系,包括弱监督学习、元学习、知识蒸馏和开放集识别等。弱监督学习研究如何从少量标注数据中学习有效的模型(Zhou 等人, 2018);元学习则关注如何提高模型在少样本任务中的表现(Finn 等人, 2017)。知识蒸馏(Hinton 等人, 2015)是一个通过从大模型中提取知识并传递给小模型的技术,而开放集识别(Bendale & Boult, 2016)研究如何在未见过的类别上进行分类。CLIP 的设计和训练方式受到了这些领域的影响,并为其应用提供了新的视角。

5. 结论

在这项研究中,我们提出并展示了 CLIP(对比语言-图像预训练)的有效性,这是一种从大量(图像,文本)配对中学习视觉表示的简单方法。CLIP 的核心理念是在一个多模态的嵌入空间中对比(图像,文本)对的相似性,从而学习一个能够灵活应对多种下游任务的视觉表示。我们展示了 CLIP 可以在 30 多个现有的计算机视觉数据集上执行零样本迁移,通常不需要任何任务特定的监督或适配。

我们还研究了 CLIP 在各种下游任务上的表现,并展示了它在多个任务上具有竞争力的性能,特别是在数据集规模较小的情况下表现尤为出色。此外,我们展示了 CLIP 如何通过提示工程和集成方法进一步提高性能,这表明在零样本迁移中选择适当的提示和集成策略可以显著改善结果。

然而,尽管 CLIP 展示了广泛的适应性和强大的性能,但它也有其局限性。例如,CLIP 在某些复杂任务上的表现仍不如特定的完全监督模型,并且 CLIP 的训练依赖于大量的数据和计算资源,这在实际应用中可能受到限制。未来的研究可以探索如何在更小的数据集和更少的计算资源下实现类似的性能,以及如何进一步提升 CLIP 在更复杂任务上的表现。

最后,我们相信 CLIP 的成功展示了多模态学习和对比学习在未来的巨大潜力。我们期待着进一步探索这些方法在更广泛的应用领域中的可能性,并希望本研究能够为多模态学习和计算机视觉的发展提供新的方向。

附录 A. 实验设置与数据集详细信息

A.1 数据集描述

为了全面评估 CLIP 的性能,我们在一组广泛的数据集上进行了测试。这些数据集涵盖了多个领域,包括图像分类、细粒度分类、动作识别、OCR(光学字符识别)、卫星图像分类和医疗影像分类等。表 A.1 提供了这些数据集的详细信息,包括数据集的名称、领域、类别数量、训练样本数量和测试样本数量。

表 A.1:用于评估的公开数据集

数据集 领域 类别数量 训练样本数量 测试样本数量
ImageNet 图像分类 1000 1,281,167 50,000
CIFAR-10 图像分类 10 50,000 10,000
CIFAR-100 图像分类 100 50,000 10,000
STL-10 图像分类 10 5,000 8,000
Stanford Cars 细粒度分类 196 8,144 8,041
Flowers102 细粒度分类 102 2,040 6,149
Food101 细粒度分类 101 75,750 25,250
FGVCAircraft 细粒度分类 100 6,667 3,333
EuroSAT 卫星图像分类 10 27,000 5,400
RESISC45 卫星图像分类 45 31,500 6,300
PatchCamelyon 医疗影像分类 2 262,144 32,768
Kinetics-700 动作识别 700 545,317 34,536
UCF101 动作识别 101 9,537 3,783
SVHN OCR 10 73,257 26,032
Oxford-IIIT Pets 细粒度分类 37 3,680 3,369
Birdsnap 细粒度分类 500 47,386 2,443
CLEVRCounts 合成图像 8 70,000 15,000
GTSRB 交通标志识别 43 39,209 12,630
KITTI Distance 自动驾驶 4 7,481 7,518

A.2 实验设置

在所有实验中,我们使用了相同的预处理和数据增强方法,以确保结果的可比性。图像预处理包括将图像的较短边缩放到 256 像素,并从中裁剪出 224×224 的中央区域。对于训练,我们使用了随机裁剪和水平翻转作为数据增强手段。所有实验都在相同的硬件环境下进行,使用了 8 张 NVIDIA V100 GPU。我们使用 Adam 优化器进行训练,初始学习率为 3e-4,并在每个 epoch 结束时将学习率减少 10%。

为了评估 CLIP 在零样本迁移任务中的性能,我们使用了 CLIP 的预训练权重,并根据每个数据集的类别标签生成相应的文本嵌入。对于每个数据集,我们使用了默认的提示模板,并在必要时进行了微调,以确保最佳性能。

A.3 结果分析

图 A.1 展示了 CLIP 在不同数据集上的零样本迁移性能。我们观察到,在大多数数据集上,CLIP 的零样本性能优于传统的全监督方法,尤其是在细粒度分类和 OCR 任务上。值得注意的是,CLIP 在动作识别任务上的表现也非常强劲,显示了其在不同领域的广泛适应性。

图 A.1:CLIP 的零样本迁移性能

References

  • 神器CLIP:连接文本和图像,打造可迁移的视觉模型 (opens new window)
#CLIP
上次更新: 2025/07/06, 13:25:25
CLIP全文翻译
CLIP解读二

← CLIP全文翻译 CLIP解读二→

最近更新
01
优化器
07-04
02
weight_decay
07-03
03
帮助信息查看
06-08
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Geeks_Z | MIT License
京公网安备 11010802040735号 | 京ICP备2022029989号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式