首页 > 其他分享 >CLIP模型

CLIP模型

时间:2023-10-11 11:44:53浏览次数:31  
标签:loss 编码器 CLIP 模型 文本 图片

CLIP模型(Contrastive Language-Image Pre-training)

Title: Learning transferable visual models from natural language supervision

发表单位:OpenAI, San Francisco

发表于:ICML 2021

关键词:clip、多模态

论文地址radford21a.pdf (mlr.press)

代码:https://github.com/OpenAI/CLIP

OpenAI官方博客CLIP: Connecting text and images (openai.com)

一句话总结:利用 text 信息监督视觉任务自训练,本质就是将图片分类任务化成了图文匹配任务,效果可与完全监督方法相当 。

模型的核心是从自然语言与图像配对的监督中学习感知。

image

模型总结

这篇文章采用了多模态的对比学习方法,即让模型学习区分正样本(正确匹配的文本-图像对)和负样本(不匹配的文本-图像对)。而对比学习需要大量的数据,因此 OpenAI 搜集了四亿对高质量的「文本-图片」对。

对于一个包含 N 个文本-图片对的训练batch,图片和文本分别输入到图片编码器和文本编码器之中(文本编码器可以是 Text Transformer,图片编码器可以是 ViT 或 ResNet ),再将提取到的文本特征和图像特征线性映射到同一空间中,之后将 N 个文本与 N 个图片进行匹配,计算文本特征和图像特征的余弦相似度,获得 \(N\times N\) 余弦相似度矩阵,如上图所示。由于对比学习需要确定正、负样本,而此时就可以将正确配对的 N 个样本看作正样本(矩阵中的对角线元素),其余 \(N^2-N\) 个样本可以看作负样本。CLIP的优化目标为最大化正样本的相似度、同时最小化负样本的相似度。对应的伪代码实现如下:

# image_encoder - ResNet or Vision Transformer
# text_encoder - CBOW or Text Transformer
# I[n, h, w, c] - minibatch of aligned images 一个batch图像的维度
# T[n, l] - minibatch of aligned texts		一个batch文本的维度
# 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

在上述这个预训练过程当中,并没有设置分类头,得到的只是两个编码器的文本表示,但这个过程却很好地利用了自然语言的语义特征,使得这个模型不需要微调就能在下游任务中表现地很棒,它的迁移能力和在小样本上的表现相比于其它经过预训练并在 ImageNet 数据集上微调的模型同样或更加出色。

进行zero-shot分类

另外,它在下游任务上的适用性很强。其它模型通常需要在特定领域或标签的数据上进行微调,才能具备识别这类图片的功能。而 CLIP 模型,由于其出色的语义表征能力,它只需要提供与图片上的物体相对应的文本描述,就可以进行零样本迁移,直接识别这类图片。具体来说,在进行下游任务时,比如我们想要识别 ImageNet 上的1000类物体,我们只需要向文本编码器中输入包含这1000类物体的 1000 个描述文本: A photo of a {object} ,经过文本编码器后它就能具备和图片大致对应的语义,之后再向图片编码器中输入我们想要识别的图片,经过编码后模型就会计算这张图片与之前输入的1000个文本向量的余弦相似度,进而选择出相似度最大的文本对应的类别作为图像分类的预测结果,输出图片的文本标签。同时,也可以将这些相似度看成 logits ,送入 softmax 后得到每个类别的预测概率。

为什么选择对比学习的方法?

训练效率高。用图片来预测文本的难度较大,因为一张图片的描述语言可以有很多,关注的点不同,描述性语言就不同。而如果把它看作一个图文配对的任务,就相对来说简单地多了。作者一开始尝试了联合训练一个 CNN 和文本 transformer 来预测图像的文本,但发现这种方法的训练效率不高,还不如直接预测 bag of words,而使用基于对比学习的方法可以使训练效率提高4倍,因此作者最终选择了对比学习的方法来训练 CLIP。

CLIP 属于大力出奇迹的模型,大数据+大模型,且迁移学习的效果与模型大小成正相关。CLIP的训练数据集 WebImageText 的文本量接近训练 GPT-2 的 WebText 数据集。

参考资料

CLIP 论文逐段精读【论文精读】_哔哩哔哩_bilibili

神器CLIP:连接文本和图像,打造可迁移的视觉模型 - 知乎 (zhihu.com)

【多模态】CLIP模型 - 知乎 (zhihu.com)

【CLIP系列Paper解读】CLIP: Learning Transferable Visual Models From Natural Language Supervision - 知乎 (zhihu.com)

标签:loss,编码器,CLIP,模型,文本,图片
From: https://www.cnblogs.com/hulei-cn/p/17756698.html

相关文章

  • R语言非线性动态回归模型ARIMAX、随机、确定性趋势时间序列预测个人消费和收入、用电
    全文链接:https://tecdat.cn/?p=33838原文出处:拓端数据部落公众号传统时间序列模型允许包含过去观察到的系列信息,但不允许客户包含其他可能相关的信息。例如,假期的影响、竞争对手的活动、法律变化、整体经济或其他外部变量可能解释了某些历史变动,并且可能导致更准确的预测。另一......
  • Python随机波动率(SV)模型对标普500指数时间序列波动性预测|附代码数据
    原文链接:http://tecdat.cn/?p=22546 原文出处:拓端数据部落公众号 最近我们被客户要求撰写关于随机波动率(SV)模型的研究报告,包括一些图形和统计输出。资产价格具有随时间变化的波动性(逐日收益率的方差)。在某些时期,收益率是高度变化的,而在其他时期则非常平稳。随机波动率模型......
  • R语言无套利区间模型期货期现研究:正向套利和反向套利次数、收益率分析华泰柏瑞300ETF
    全文链接:http://tecdat.cn/?p=31973最近我们被客户要求撰写关于无套利区间模型的研究报告,包括一些图形和统计输出。股指期货的套利交易有助于股指期货实现其价格发现以及风险规避的功能,因此提高套利交易的效率,对于发挥股指期货在经济发展中的作用有着重要的意义本文帮助客户对......
  • R语言门限误差修正模型(TVECM)参数估计沪深300指数和股指期货指数可视化|附代码数据
    全文链接:http://tecdat.cn/?p=32511原文出处:拓端数据部落公众号时间序列模型的理论已经非常丰富,模型的应用也相当广泛。但现实生活中,越来越多的时间序列模型呈现出了非线性的特点,因此,研究非线性时间序列模型的理论及对其参数进行估计有着极其重要的意义。门限模型作为非线性......
  • Generative AI 新世界 | 文生图领域动手实践:预训练模型的微调
    在上期文章,我们探讨了预训练模型的部署和推理,包括运行环境准备、角色权限配置、支持的主要推理参数、图像的压缩输出、提示工程(PromptEngineering)、反向提示(NegativePrompting)等内容。亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案......
  • c++对象模型学习笔记
    参照大佬的博客学习了一下c++的对象模型:https://www.cnblogs.com/skynet/p/3343726.html有些思考需要做下记录。对于有虚函数表的类的对象,它的起始地址处会存储vptr指向虚函数表,在这个虚函数表的前4或8字节中,会存储一个地址值,指向RTTI类型信息对于没有虚函数表的类的对象,也就......
  • 【Python&语义分割】语义分割的原理及常见模型的介绍
    1概述        语义分割是计算机视觉中的重要任务之一,其目的是将图像中的每个像素分配给特定的类别,从而实现对图像的精细分割。与目标检测不同,语义分割并不需要对物体进行位置和边界框的检测,而是更加注重对图像中每个像素的分类。随着深度学习的兴起,语义分割得到了广泛......
  • 【Python&目标识别】目标检测的原理及常见模型的介绍
    1概述        目标检测(ObjectDetection)是计算机视觉领域的一个重要研究方向,其目的是在图像或视频中定位并识别出特定的物体。目标检测模型通常需要同时确定物体的位置和类别。在深度学习之前,目标检测算法主要基于传统计算机视觉方法,如特征提取和分类器设计。然而,随着深......
  • 【Python&语义分割】Segment Anything(SAM)模型介绍&安装教程
    ​1SegmentAnything介绍1.1概况        MetaAI公司的SegmentAnything模型是一项革命性的技术,该模型能够根据文本指令或图像识别,实现对任意物体的识别和分割。这一模型的推出,将极大地推动计算机视觉领域的发展,并使得图像分割技术进一步普及化。    论......
  • 模型视图简介、QListWidget、QTreeWidget、QTableWidget、QStringListModel、QFileSys
    一、模型视图简介   有时,我们的系统需要显示大量数据,比如从数据库中读取数据,以自己的方式显示在自己的应用程序的界面中。早期的Qt要实现这个功能,需要定义一个组件,在这个组件中保存一个数据对象,比如一个列表。我们对这个列表进行查找、插入等的操作,或者把修改的地方写回,然后......