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

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

在这里插入图片描述
论文地址: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领域的一个里程碑式的进展。

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值