【CLIP】打破文本和图像的壁垒

CLIP是一种无需手动标注的预训练模型,通过大规模图像-文本对学习理解视觉概念和语言描述。它支持零样本学习,能理解和处理自然语言,广泛应用于视觉任务。文章讨论了模型结构、训练过程和其在零样本学习和数据泛化性方面的挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
论文地址:https://arxiv.org/abs/2103.00020

介绍

CLIP(Contrastive Language-Image Pre-training)是OpenAI提出的一种新颖的预训练模型,旨在通过对大规模图像-文本对的对比学习,使模型能够理解丰富的视觉概念和自然语言描述。这种方法的核心优势在于它不需要手动标注的数据,而是直接利用现有的文本和图像进行学习。

模块

CLIP由两个主要组件组成:一个视觉编码器和一个文本编码器。视觉编码器处理输入的图像,文本编码器处理相关的文本描述。这两个编码器在训练过程中共同学习,目标是使得相对应的图像和文本表示在向量空间中尽可能接近。这种训练策略被称为对比学习(Contrastive Learning)。

伪代码

# 使用图像编码器对输入图像I进行编码,得到图像特征表示I_f
I_f = image_encoder(I)  # [n, d_i] 图像编码,其中n是图像数量,d_i是图像特征的维度

# 使用文本编码器对输入文本T进行编码,得到文本特征表示T_f
T_f = text_encoder(T)  # [n, d_t] 文字编码,其中n是文本数量,d_t是文本特征的维度

# 通过点积和权重矩阵W_i将图像特征投影到多模态嵌入空间,并进行L2归一化
I_e = l2_normalize(np.dot(I_f, W_i), axis=1)  # [n, d_e],d_e是多模态嵌入空间的维度

# 通过点积和权重矩阵W_t将文本特征投影到多模态嵌入空间,并进行L2归一化
T_e = l2_normalize(np.dot(T_f, W_t), axis=1)  # [n, d_e]

# 计算图像特征和文本特征之间的点积,得到成对的余弦相似度,并乘以一个温度参数t以缩放相似度
logits = np.dot(I_e, T_e.T) * np.exp(t)  # [n, n],表示n个图像特征与n个文本特征之间的相似度

# 定义损失函数,这里使用的是交叉熵损失。对于每个图像特征,计算其与所有文本特征的交叉熵损失
labels = np.arange(n)  # 创建一个与图像数量相同的标签数组,用于损失计算, 主对角线上是正样本,其他位置都是负样本
loss_i = cross_entropy_loss(logits, labels, axis=0)  # [n]

# 对于每个文本特征,计算其与所有图像特征的交叉熵损失
loss_t = cross_entropy_loss(logits, labels, axis=1)  # [n]

# 计算最终的损失值,它是图像和文本损失的平均值
loss = (loss_i + loss_t)/2  # 计算平均损失

特点

零样本学习:CLIP的一个显著特点是它能进行所谓的“零样本学习”(Zero-Shot Learning),即在没有看过特定任务样本的情况下完成该任务。例如,即使CLIP在训练过程中从未接触过某个特定的图像分类任务,它也能根据任务描述理解并执行该任务。

自然语言理解:CLIP模型通过对大量的图片-文本对进行预训练,学会了将图像内容与自然语言描述联系起来。这意味着CLIP可以理解和处理各种形式的文本输入,如指令、问题或任何形式的描述。

广泛的应用:由于其通用性,CLIP可以被应用于各种视觉任务,包括但不限于图像分类、对象检测、图像生成和更多。它也被证明在多个公开数据集上超越了传统训练模型的性能。

细节

训练时间

CLIP 用了七个加速器年,TPU V3 /天,意思就是用一个TPU V3去训练CLIP,要跑七年。

对称式损失函数

两个loss
loss1:文本损失
loss2: 图像损失
total_loss: (loss1 + loss2)/ 2

线性投影和非线性投影

非线性的投射层只是用来适配单模态学习,当涉及多模态时,线性和非线性投影基本没有区别

混合精度训练

目前基于 Transformer 的模型基本用混合精度训练

如何用多GPU训练超大模型

推荐博文: https://lilianweng.github.io/posts/2021-09-25-train-large/

基于Prompt的学习方法

这是用在微调或者预推理的时候用的方法

如果只是一个单词去做提示词的话会有两个问题

  1. 单词的歧义性,例如图片中的遥控器叫remote,如果把remote直接给文本,文本就可能会理解成 遥远的
  2. 预训练的时候文本一般都是一个句子,而推理的时候文本却是一个单词,会产生distribution gap,所以要保证训练和推理的一致性,那就在推理的时候用一个模板句子,只改其中的提示词即可,从而使我们推理的时候得到的是一段话,而不是一个单词

prompt template

作者使用模板句子的方式来解决这个问题,也就是一句话只替换要表达的那个名词就可以了,例如"A photo of a remote ",这里 ‘remote’ 是一个名词,自然不会学到形容词“遥远的”那个意思,这样就巧妙的解决上面提到的那两个问题;
在这里插入图片描述

Linear prob

Linear prob 是一种使用线性分类头的方式,只有最后一层F是可以训练的,其他层都会冻住,这样能准确反映出预训练模型的好坏

作者用它的原因

1.为了研究和数据集无关的训练方式
2.基本不用调参

模型的局限性

数据泛化性:模型的性能依赖于数据集的泛化能力。由于CLIP的数据集主要来自互联网,可能包含社会偏见,这也可能反映在模型预测中。

数据局限性:尽管CLIP通过数据增强和自训练(伪标签)尝试减少数据需求,但其性能测试和参数调整依然基于特定数据集,存在局限性。

Zero-shot vs. Few-shot:在某些情况下,提供少量训练样本(如Few-shot learning)的效果不如不提供训练样本(Zero-shot learning)的效果好,这反映了CLIP在处理新任务时的灵活性。

只是单纯的觉得这张图很吊

在这里插入图片描述

总结

CLIP通过其创新的对比学习框架,实现了对图像和文本的深层次理解,并在多种视觉任务上展现了出色的迁移能力。它的出现打破了固定类别训练的传统范式,使得处理数据、训练模型和进行推理更为方便。CLIP特别适用于零样本学习场景,能够在没有特定训练样本的情况下进行多种分类任务。尽管存在数据泛化性和局限性的挑战,CLIP依然是深度学习和CV领域的一个里程碑式的进展。

### Stable Diffusion 中 CLIP 文本编码器的作用 在 Stable Diffusion 架构中,CLIP 文本编码器扮演着至关重要的角色。该组件负责将输入的自然语言描述转换成模型可以理解的向量表示形式[^1]。 通过这种方式,文本编码器能够捕捉到语义信息并将其映射至一个多维空间,在这个空间里不同词语之间的关系得以量化表达。这种机制使得生成过程可以根据给定提示词精准定位所需视觉特征。 ### 工作原理 具体来说,当用户提交一段文字作为创作指导时: - **Tokenization**: 首先会把这段话拆解成一个个离散单元(token),这些 token 可能对应单词、子字串或是特殊标记。 - **Embedding Lookup**: 接下来利用预训练好的嵌入矩阵查找每一个 token 对应的位置向量;这一步骤赋予了原始字符序列以数值意义,并初步建立起它们之间潜在联系的空间分布模式。 - **Transformer Layers Processing**: 经过上述处理后的数据会被送入多层 Transformer 结构内部进一步加工。每一层都由自注意力机制(self-attention mechanism)驱动完成上下文依赖建模以及跨位置交互学习的任务。最终输出固定长度但富含全局信息感知能力的新表征向量集合。 ```python import torch from transformers import CLIPTokenizer, CLIPTextModel tokenizer = CLIPTokenizer.from_pretrained('openai/clip-vit-base-patch32') model = CLIPTextModel.from_pretrained('openai/clip-vit-base-patch32') inputs = tokenizer(["a photo of a cat"], padding=True, truncation=True, return_tensors="pt") outputs = model(**inputs) last_hidden_state = outputs.last_hidden_state # shape (batch_size, sequence_length, hidden_dim) ``` 此代码片段展示了如何加载 CLIP文本部分并对简单句子进行编码操作。`last_hidden_state` 即包含了经过前述流程变换之后得到的结果张量。 ### 实现细节 为了实现高效而精确的文字转图像功能,Stable Diffusion 不仅采用了先进的架构设计还融入了许多优化措施来提升性能表现。例如采用更深层次的神经网络结构增加模型容量以便更好地拟合复杂函数关系;引入正则化技术防止过拟合并增强泛化性等。 此外值得注意的是,尽管这里主要讨论了基于 CLIP 的方案,实际上还有其他类似的框架如 BLIP 同样可用于改进或替代传统方法从而获得更加理想的效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值