CLIP论文详解

news2024/11/13 14:44:05

文章目录

  • 前言
  • 一、CLIP理论
    • 1.CLIP思想
    • 2.模型结构
  • 二、CLIP预训练
    • 1.数据集
    • 2.训练策略
    • 3.模型选择
  • 三、Zero-Shot推理
  • 四、CLIP伪代码实现
  • 五、CLIP局限性
  • 总结


前言

 CLIP这篇论文是OpenAI团队在2021年2月底提出的一篇论文,名字叫做《Learning Transferable Visual Models From Natural Language Supervision》,从自然语言的监督中学习可迁移视觉表征,CLIP是Contrastive Language-Image Pre-training的缩写,是一种多模态模型。这篇论文从名字可以看出,是通过自然语言作为监督信号进行CV领域的大规模预训练然后迁移到下游任务。接下来进行CLIP这篇论文的介绍。

一、CLIP理论

1.CLIP思想

 在CV领域,基于监督学习的分类模型在推理时最终的输出结果只能是在训练时提前定义好的那些种类,受到分类头的限制。而在NLP领域,文本进文本出的大模型例如GPT3却突破了这种限制并且能够很好的在下游任务上进行Zero-Shot推理而不在需要专门的分类头。这说明在大规模的文本数据上进行训练的模型可以获得聚合监督的效果。因为文本数据中的冗余信息远比图片要少,因此在CV领域以文本作为监督信号或许可以获得像NLP领域那样的Zero-Shot迁移效果。

2.模型结构

 CLIP的输入是文本-图像对,文本内容是对于图片的描述,使用Transformer作为文本特征提取器,使用Resnet或者Vision Transformer作为图片特征提取器,然后将提取到的特征通过对比学习的方式算Loss进行参数更新。如下图所示:

在这里插入图片描述

二、CLIP预训练

1.数据集

 在CV领域以自然语言作为监督信号的方法之前就有过,但是那些方法大都受限于数据集的规模,并且那时候Transformer还没有出现,对于文本的上下文特征提取做的还没有那么好。因此,为了尝试覆盖尽可能多的视觉概念,OpenAI团队做了一个很大的文本图片配对数据集,大概有4亿文本-图像对,相当于训练GPT2数据集的大小。

2.训练策略

 训练时只使用了随机剪裁进行图像增强,并且使用线性层将每个编码器的输出映射到多模态空间。在进行训练目标的选择时,CLIP选用的是对比学习的方法,如下图所示:
在这里插入图片描述

例如输入的Batchsize为N,那么就会有N个文本特征和N个图像特征,这些特征可以组合成一个NXN的特征图,特征图中的对角线元素的文本和图像特征是配对的,为正样本对( N N N个),其他都是负样本对( N 2 − N N^2-N N2N个)。训练时通过最大化N个正样本对的图像和文本嵌入的余弦相似度,最小化负样本对的图像和文本嵌入的余弦相似度来更新参数。

之所以选择使用对比学习的方式,而不用NLP领域那边的预测文本输出的自监督方式,是因为对于一张图片来说,关注点不同那么对于这张图片的描述也就不同,通过图片特征去预测这张图片对应的文本标签是一件比较困难的事情。而使用对比学习相当于放宽了约束条件,只要训练模型知道图片和哪个文本是对应的就可以。(相当于选择题比填空题要容易一些)

3.模型选择

文本编码器
 对于文本编码器,CLIP选择的Transformer的解码器,8个注意力头,宽为512,共堆叠了12个解码器,参数为63M。对于输入的文本token,在第一个位置前加入’BOS’,在最后的位置加入’EOS’,由于Transformer解码器自注意力的特性,把’EOS‘作为整个文本输入的特征代表,将’EOS’的编码后的文本特征进行归一化然后通过线性层映射到多模态空间中。

图像编码器
 CLIP的图像编码器有两个版本,分别是使用Resnet和使用Vision Transformer。并分别对其进行了修改使其能够更加适应任务。

三、Zero-Shot推理

 在进行下游任务的推理时,例如图片分类,图片编码器的输入是一张图片,而文本编码器的输出是你自己定义的分类文本。例如:

现在有一张图片要进行分类,我们可以自己定义一些分类种类文本[‘猫’,‘狗’,‘鱼’,‘鸟’,‘汽车’],然后进行prompt,把五个单词变成5句话,[‘这是一只猫的图片’,’这是一只够的图片‘,’这是一只鱼的图片‘,‘这是一只鸟的图片’,‘这是一只汽车的图片’]送入到文本编码器中,然后将图片送入图像编码器中,模型会根据输入的文本选择与图片内容最为相近的种类从而完成分类。如下图所示:
在这里插入图片描述

 之所以进行prompt engineering有两个原因:1.一词多义,一个单词可能存在好几种意思,需要上下文信息来猜测这个单词的具体含义。2.与预训练时的文本输入保持一致。因为在预训练时的输入大多是一句话,为了减小预训练和推理时的输入gap,在预测时输入也是一句话。

实验表明,为每个任务定制prompt提示文本可以提高Zero-Shot的性能。例如在Oxford-IIIT Pets数据集上进行宠物的分类时,prompt文本可以写成“A photo of a {label}, a type of pet.”。是不是和GPT那边的prompt engineering很像?

 与传统的有监督的模型不同的是,有监督10分类模型在推理时只能是10选1,输出只能是你提前定义好的10个种类中的一个。而CLIP可以随意定义自己的分类文本内容,可以是5选1,也可以是6选1,CLIP会根据你输入的文本内容选择与图片最相似的种类。
 CLIP可以随意进行Zero-Shot推理的一部分原因是因为训练的数据集很大,覆盖了绝大部分的视觉概念,并且文本的冗余信息较少,模型可以较准确的找出与视觉特征相似度较高的文本种类特征从而完成分类。

四、CLIP伪代码实现

import torch
import numpy as np
# image_encoder - ResNet or Vision Transformer
# text_encoder - Transformer
# I [n, h, w, c] - n为batchsize大小
# T [n, l] - l为输入文本token长度
# Linear_i[d_i, d_e] - 将图片特征映射到多模态空间
# Linear_t[d_t, d_e] - 将文本特征映射到多模态空间
# t 可学习的温度系数
I_f = image_encoder(I) #[n, d_i]
T_f = text_encoder(T) #[n, d_t]
I_e = Linear_i(I_f) # [n,d_e]
T_e = Linear_i(T_f) # [n,d_e]

# 并行计算文本特征和图像特征的余弦相似度
logits = np.dot(I_e, T_e.T) * np.exp(t) # [n,n]

#正样本对都是在对角线上,对应的标签为0到n-1
labels = np.arange(n)

#从图片和文本两个维度进行特征匹配损失
loss_i = cross_entropy_loss(logits, labels, axis=0)
loss_t = cross_entropy_loss(logits, labels, axis=1)
loss = (loss_i + loss_t)/2
optimer.zero_grad()
loss.backward()
update()

五、CLIP局限性

 CLIP还存在着一些局限性,例如虽然能取得和有监督的基线模型差不多的效果,但是距离SOTA的模型差距还很大;其Zero-Shot的推理也很受限于训练数据的分布,对于训练数据中没有出现过的物体,CLIP也很难做的好;CLIP是根据文本中给定的种类去做分类,不能像GPT那种直接根据图片输出种类,并且有时在下游任务的推理时Few-Shot效果比Zero-Shot效果还要差等等。

总结

 CLIP是一种利用自然语言作为监督信号的多模态模型,打破了传统的监督学习的固定标签的范式。其使用对比学习的方法进行预训练,并且可以在下游任务上通过文本Prompt进行Zero-Shot推理,在足够的规模性,CLIP可以与特定任务的监督模型相竞争,同时其还有很大的提升空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1973310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Markdown与数学公式

在写偏理科的文章的时候,多多少少会涉及到一些公式、函数的输入,本篇就来讲讲如何在 Markdown 中书写数学公式。 在此之前,我们先介绍下 LaTex 和 MashJax,Markdown 就是基于它们来实现数学公式的输入。 LaTex 简介 LaTex &…

JDK-java.nio包详解

JDK-java.nio包详解 概述 一直以来Java三件套(集合、io、多线程)都是最热门的Java基础技术点,我们要深入掌握好这三件套才能在日常开发中得心应手,之前有编写集合相关的文章,这里出一篇文章来梳理一下io相关的知识点。…

MyBatis 源码学习 | Day 1 | 了解 MyBatis

什么是 MyBatis 在对一项技术进行深入学习前,我们应该先对它有个初步的认识。MyBatis 是一个 Java 持久层框架,用于简化数据库的操作。它通过 XML 或注解的方式配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通…

跑深度学习模型I:一文正确使用CUDA

1. 安装显卡驱动NVIDIA 如果出现这个问题,是NVIDIA环境配置原因。一定要注意配置系统环境变量正确。 C:\Users\2605304845>nvcc --version nvcc 不是内部或外部命令,也不是可运行的程序 或批处理文件。 - CSDN文库 2. 安装CUDA 安装时注意版本对应…

C语言--函数

1. 函数定义 语法: 类型标识符 函数名(形式参数) {函数体代码 } (1)类型标识符 --- 数据类型(函数要带出的结果的类型) 注:数组类型不能做函数返回结果的类型,如果函…

pt模型转onnx模型,onnx模型转engine模型,pt模型转engine模型详细教程(TensorRT,jetpack)

背景 背景是需要在nvidia jetpack4.5.1的arm64设备上跑yolov8,用TensorRT加速,需要用*.engine格式的模型,但是手头上的是pt格式模型,众所周知小板子的内存都很小,连安装ultralytics依赖库的容量都没有,所以我想到在wi…

【开源】嵌入式Linux(IMX6U)应用层综合项目(1)--云平台调试APP

目录 1.简介 1.1功能介绍 1.2技术栈介绍 1.3演示视频 1.4硬件介绍 2.软件设计 2.1连接阿里云 2.2云平台调试UI 2.3Ui_main.c界面切换处理文件 2.4.main函数 3.结尾(附网盘链接) 1.简介 此文章并不是教程,只能当作笔者的学习分享&…

go中的值传递和指针传递

文章目录 1、& 和 *2、空指针3、nil4、用值传递还是指针传递?5、补充 1、& 和 * &后跟一个变量名,得到的是这个变量的内存地址*int类型的变量,代表这个变量里存的值是int类型的变量的内存地址数据类型的指针类型,即在…

顺序表的实现【数据结构】

1.线性表 线性表(linear list)是n个具有相同特性的数据元素的有线序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表有:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就是说是连续的一条线…

医院设置(洛谷)

设有一棵二叉树,如图: 其中,圈中的数字表示结点中居民的人口。圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接点之间的距离为 11。…

C语言实现 -- 单链表

C语言实现 -- 单链表 1.顺序表经典算法1.1 移除元素1.2 合并两个有序数组 2.顺序表的问题及思考3.链表3.1 链表的概念及结构3.2 单链表的实现 4.链表的分类 讲链表之前,我们先看两个顺序表经典算法。 1.顺序表经典算法 1.1 移除元素 经典算法OJ题1:移除…

在服务器上使用Dockerfile创建springboot项目的镜像和踩坑避雷

1. 准备个文件夹 这是我的路径 /usr/local/springboot/docker-daka/docker_files2. 将jar包上传 springboot项目打包——maven的package 这是整个项目打包的模式,也可以分离依赖、配置和程序进行打包,详情看我这篇文章: springboot依赖 配…

java基础 之 集合与栈的使用(四)

文章目录 Queue栈Stack队列和栈的区别小扩展自己写个简单的队列自己写个简单的栈使用栈来实现个队列使用队列来实现个栈写在最后 前文回顾: 戳这里 → java基础 之 集合与栈的使用(一) 戳这里 → java基础 之 集合与栈的使用(二&a…

windows中node版本的切换(nvm管理工具),解决项目兼容问题 node版本管理、国内npm源镜像切换(保姆级教程,值得收藏)

前言 在工作中,我们可能同时在进行2个或者多个不同的项目开发,每个项目的需求不同,进而不同项目必须依赖不同版本的NodeJS运行环境,这种情况下,对于维护多个版本的node将会是一件非常麻烦的事情,nvm就是为…

【Git】git 从入门到实战系列(二)—— git 介绍以及安装方法 (文末附带视频录制操作步骤)

文章目录 一、前言二、git 是什么三、版本控制系统是什么四、本地 vs 集中式 vs 分布式本地版本控制系统集中式版本控制系统分布式版本控制系统 五、安装 git 一、前言 本系列上一篇文章【Git】git 从入门到实战系列(一)—— Git 的诞生,Lin…

Linux系统编程 --- 基础IO

形成共识原理: 1、文件 内容 属性 2、文件分为打开的文件和没打开的文件 3、打开的文件:谁打开?进程!--- 本质是研究进程和文件的关系! 文件被打开,必须先被加载到内存! 一个进程可以打开…

PyTorch 训练自定义功能齐全的神经网络模型的详细教程

在前面的文章中,老牛同学介绍了不少大语言模型的部署、推理和微调,也通过大模型演示了我们的日常的工作需求场景。我们通过大语言模型,实实在在的感受到了它强大的功能,同时也从中受益颇多。 今天,老牛同学想和大家一…

【Android Studiio】default activity 原生安卓和uniapp默认启动分析

文章目录 思路: 一、原生安卓二、uniapp 探究方向:找到Default Activity 思路: 在Android开发中,"default activity"这个概念通常指的是应用启动时默认会加载和显示的那个Activity。AndroidManifest.xml文件是Android…

基于Selenium实现操作网页及操作windows桌面应用

Selenium操作Web页面 Why? 通常情况下,网络安全相关领域,更多是偏重于协议和通信。但是,如果协议通信过程被加密或者无法了解其协议构成,是无法直接通过协议进行处理。此时,可以考虑模拟UI操作,进而实现相…

声音和数据之间的调制解调 —— 电报机和电传打字机如何影响计算机的演变

注:机翻,未校对。 The Squeal of Data The through line between the telegraph and the computer is more direct than you might realize. Its influence can be seen in common technologies, like the modem. 电报和计算机之间的直通线比你想象的要…