# Contrastive Learning(对比学习)--CLIP笔记(一)

news2024/11/22 9:58:44

Contrastive Learning(对比学习)–CLIP笔记(一)

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

CLIP简介

CLIP是一种多模态预训练模型,由OpenAI在2021年提出,论文标题:Learning Transferable Visual Models From Natural Language Supervision ([2103.00020] Learning Transferable Visual Models From Natural Language Supervision (arxiv.org))

论文有四十多页,作者做了超级多的实验,看李沐老师和朱老师的视频讲解也算是一次知识蒸馏([1503.02531] Distilling the Knowledge in a Neural Network (arxiv.org) by Hinton)了

通过大量的图像-文本对进行训练,CLIP的核心思想是通过对比学习来训练模型。它将图像与文本配对,并尝试将它们映射到相同的特征空间中。在训练过程中,模型区分真实配对的图像和文本与错误配对的图像和文本。

clip涌现出的能力:很强的迁移能力,很强的zero shot能力,在不使用imagenet微调的情况下,和resnet50效果接近

在超过三十个数据集上测试,包括ocr,视频动作检测等任务

而且是一篇多模态的工作

如何训练

训练文本图像对的模型需要大数据集,所以OpenAI收集了很多数据,训练样本是图片文本对(4亿),如图所示,利用自然语言处理获得的监督信号进行训练
在这里插入图片描述
对角线是正样本(n个),负样本(n^2-n个)

用自然语言作为监督信号:(1)不需要再标注数据,只需要下载图片和文字的配对

(1,n)的标签->文本,模型的输入输出自由度变大很多

(2)图片文本绑定,学习到的不只是视觉特征,多模态特征容易去做zero shot 学习

对比任务:判断文本和图片是不是一个配对,而不是逐字逐句的去预测图像对应的文本,所消耗的计算资源大大减少,且更简单(生成式变为判别式)

生成型对比函数换成对比型函数,训练效率提升四倍

在这里插入图片描述
clip训练伪代码:

在这里插入图片描述
I[n,h,w,c]图片维度(batch_size,244,244,3)(例如)

T[n,l]文本维度(batch,length)

通过文本,图像编码器得到文本和图像特征,经过归一化(中间还要经过一个投射层,主要是为了从单模态转换到多模态)

有了n个图像的特征和n个文本的特征,计算图像特征和文本特征之间的余弦相似度

(logits):用于分类的logits

使用logits和ground truth做loss

创建ground truth的方式和moco不同,对角线上的元素才是正样本

大多数对比学习工作(-2022)用的都是这种对称式的目标函数

文中提到因为数据集很大,所以训练不太可能有过拟合的问题

投射层使用线性投射层,为什么不使用非线性的:在moco,simclr中使用非线性投射层带来的提升很大,但是在clip多模态的预训练中作者发现线性和非线性投射对性能影响不大

论文中只用了数据裁剪做数据增强

对于对比学习的temperature参数的调整会对性能带来很大改变,clip直接将T设置为了可以学习的标量,在模型训练过程中优化

使用Adam优化器训练

在这里插入图片描述

做了超参数搜索

混精度训练,分布式并行训练:节省内存

在这里插入图片描述

在这里插入图片描述

clip如何做zero shot推理:

clip预训练后只得到视觉和文本上的特征,没有在任何分类的任务上做训练和微调,没有分类头(详解深度学习图像分类中的分类头-CSDN博客)

使用prompt template方法:

例如imagenet,将1000个类,变成一个句子,比如plane变为A photo of a plane

1000个句子通过预训练好的文本编码器,得到1000个文本的特征

预训练时看到的基本上都是句子,推理时如果变为直接编码类别的那一个单词,效果会下降,句子的选取也很重要(prompt engineering和prompt ensemble)

推理时图片的特征和文本的特征做相似性(cosine similarity)

和哪个文本特征最相似,就将那个句子挑出来,完成分类任务

zero shot的推理方式任何图片+任何文本

几乎摆脱了categorical label的限制,而且clip将视觉和文本的语义联系到一起,所以学到的特征的语义性非常强,迁移性能也很强

prompt engineering and ensembling

主要是微调阶段/推理时使用的一种方法(不需要太多的计算资源)

prompt:提示作用(文本的引导作用)

(1)文本的多义性,歧义性:

在这里插入图片描述

只给一个单词而不加任何的上下文语义信息,文本编码器很容易理解错误

(2)预训练时用的是句子-图像,在推理时如果只给一个单词,没有上下文语义信息,会导致效果没有用句子好

在这里插入图片描述

作者使用了一个简单的prompt template,将所有类别都写成A photo of a {label}.的句子形式

当推理前知道在做什么任务,可以很好的帮助推理,比如知道要推理的图片是一种宠物,就可以:

在这里插入图片描述

clip做OCR:

在这里插入图片描述

多用几种模板做多次推理,综合结果

论文中使用了80个提示模板

在这里插入图片描述

实验

zero shot transfer

CLIP之前的自监督、无监督的方法主要是去学习比较好的泛化能力强的特征,应用到下游任务还是要微调

在这里插入图片描述

CLIP推理时encoder都是已经预训练好的,而且推理是并行的

在这里插入图片描述

在这里插入图片描述

在27个数据集上的效果:

在这里插入图片描述

对于难任务的few-shot迁移(比如带有特定领域知识的)

在这里插入图片描述

如果下游任务用全部的数据:

在这里插入图片描述

作者只训练linear probe(linear probe不太需要调参,简化方法之间的对比),不fine-tune的情况下,使用下游任务的全部数据和之前的工作做了对比,效果也很好(这里就不放图了,论文作者做的实验特别特别多,还做了人工和模型的对比实验(我爱发明人工VS机器🤦‍))

不足

有些数据集在zero shot不是很好,有些数据集没有和sota对比

在自然图像上好,在合成数据集,out of distribution的类别也不是特别好

没有全部自动化(自动生成类别)gpt化

结合对比学习和生成式的目标函数

需要新的零样本性能测试数据集

在这里插入图片描述

使用clip

# $ conda install --yes -c pytorch pytorch=1.7.1 torchvision cudatoolkit=11.0
!pip install ftfy regex tqdm
!pip install git+https://github.com/openai/CLIP.git
import torch
import clip
from PIL import Image

device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)

image = preprocess(Image.open("/content/test.png")).unsqueeze(0).to(device)
text = clip.tokenize(["a banana", "lyrics", "a song","a album cover"]).to(device)

with torch.no_grad():
    image_features = model.encode_image(image)
    text_features = model.encode_text(text)
    
    logits_per_image, logits_per_text = model(image, text)
    probs = logits_per_image.softmax(dim=-1).cpu().numpy()

print("Label probs:", probs)  # prints: [[0.9927937  0.00421068 0.00299572]]

在这里插入图片描述

我这里用的是一张地下丝绒(the velvet underground)的专辑封面和歌词:

在这里插入图片描述

运行代码后可以看到,CLIP对于a banana和lyrics的预测概率是比较高的,还是很准确的,这也对应了OpenAI展示的CLIP超强的泛化能力,不论是真实的水果图片还是抽象的水果图片,识别准确率都很高

相关工作(-2022年底)

styleclip(用于图像生成,用文本对图像进行修改和处理)

CLIPDraw生成简笔画

物体检测和分割:

在这里插入图片描述

open vocabulary detector,摆脱基础类的限制

在这里插入图片描述

视频检索:clifs,通过输入文本的来检索

后记

其实CLIP提出的方法在之前就有人提过类似的,只不过算力和数据量都没有到达一定的规模,CLIP也是OpenAI经典的大力出奇迹,简单有效的方法加上大规模的数据和算力得到了惊人的成果,作者文章写的十分全面,对前人的工作介绍也都很详细(十分谦逊的致敬了之前的那些工作(respect)),而且思考了很多模型之外的问题,比如安全问题和数据没有经过笔记完善的清洗会导致的一些偏见问题,而且作者将自己工作的不足之处一一指了出来,为后人的研究指明了很多方向。

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

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

相关文章

STM32 DCMI 的带宽与性能介绍

1. 引言 随着市场对更高图像质量的需求不断增加,成像技术持续发展,各种新兴技术(例如3D、计算、运动和红外线)的不断涌现。如今的成像应用对高质量、易用性、能耗效率、高集成度、快速上市和成本效益提出了全面要求。为了满足这些…

【自然语言】使用词袋模型,TF-IDF模型和Word2Vec模型进行文本向量化

一、任务目标 python代码写将 HarryPorter 电子书作为语料库,分别使用词袋模型,TF-IDF模型和Word2Vec模型进行文本向量化。 1. 首先将数据预处理,Word2Vec 训练时要求考虑每个单词前后的五个词汇,地址为 作为其上下文 &#xf…

数据结构的魅力

数据结构这块越学越敬佩 博大精深 统计大文件中相同年龄的人的个数 public static void main(String[] args) throws Exception {String str "";String fileName "";InputStreamReader isr new InputStreamReader(new FileInputStream(fileName), Stan…

OSCP靶场--Banzai

OSCP靶场–Banzai 考点(ftp爆破 webshell上传web1访问403web2可以访问webshell反弹mysql udf提权) 1.nmap扫描 ## nmap扫描一定要使用 -p- 否则容易扫不全端口 ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC 192.168.158.56 -Pn -p- --min-rate 2500Starting Nmap 7.…

ArcGIS Pro 3D建模简明教程

在本文中,我讲述了我最近一直在探索的在 ArcGIS Pro 中设计 3D 模型的过程。 我的目标是尽可能避免与其他软件交互(即使是专门用于 3D 建模的软件),并利用 Pro 可以提供的可能性。 这个短暂的旅程分为三个不同的阶段:…

AI绘本生成解决方案,快速生成高质量的AI绘本视频

美摄科技凭借其深厚的技术积累和前瞻性的市场洞察力,近日推出了一款面向企业的AI绘本生成解决方案,旨在通过智能化、自动化的方式,帮助企业快速将文字内容转化为生动有趣的绘本视频,从而提升内容传播效率,增强品牌影响…

迁移docker部署的GitLab

目录 1. 背景2. 参考3. 环境4. 过程4.1 查看原docker启动命令4.2 打包挂载目录传至新宿主机并创建对应目录4.3 保存镜像并传至新宿主机下4.4 新宿主机启动GitLab容器 5 故障5.1 容器不断重启5.2 权限拒绝5.3 容器内错误日志 6 重启容器服务正常7 总结 1. 背景 最近接到一个任务…

Python的标准输入输出及强制类型转换

Python标准输入 input()是Python提供的标准输入函数,括号内为显示在终端的提示信息,其返回结果为字符型(str)。 Python标准输出 print()是Python提供的标准输出函数,可以将括号中的内容输出到终端中。 print()函数中有…

五、书架开发--2.书架图书列表实现

组件涉及动态组件应用 下面我们先来继续编写书架列表吧即ShelfList.vue书架的数据我们之前就已经获取到了,通过引入mixin即可。 for循环书架数据展示一堆item(图书列表中的方框) 我们要实现图书列表的图书数据显然应该用v-for循环来循环每个方框的图书&#xff0…

实战解析:SpringBoot AOP与Redis结合实现延时双删功能

目录 一、业务场景 1、此时存在的问题 2、解决方案 3、为何要延时500毫秒? 4、为何要两次删除缓存? 二、代码实践 1、引入Redis和SpringBoot AOP依赖 2、编写自定义aop注解和切面 3、application.yml 4、user.sql脚本 5、UserController 6、U…

计算机网络——TCP和UDP协议

目录 前言 前篇 引言 TCP与UDP之间的区别 TCP 三次握手 为什么要三次握手而不是两次握手? 丢包问题与乱序问题的解决 四次挥手 为什么客户端需要等待超时时间? UDP协议 TCP和UDP的主要区别 前言 本博客是博主用于复习计算机网络的博客&…

【Jenkins】Jenkins自动化工具介绍

目录 技术背景常规的手动打包步骤 Jenkins简介起源与发展Jenkins的核心价值1.自动化1.1代码构建1.2测试自动化1.3自动部署 2.持续集成与持续部署CI/CD的概念如何减少集成问题更快速地发布软件版本 Jenkins优势Jenkins的主要竞争对手Travis CI:CircleCI:GitLab CI: Jenkins与其他…

阿里云9元服务器租用收费价格表_免费云服务器领取

2024年最新阿里云服务器租用费用优惠价格表,轻量2核2G3M带宽轻量服务器一年61元,折合5元1个月,新老用户同享99元一年服务器,2核4G5M服务器ECS优惠价199元一年,2核4G4M轻量服务器165元一年,2核4G服务器30元3…

出海企业如何从海外云手机中受益?

随着全球化的推进,越来越多的企业开始将目光投向海外市场。然而,不同国家和地区的网络环境、政策限制,以及语言文化的差异,给出海企业的市场拓展带来了诸多挑战。在这一背景下,海外云手机作为一种新兴解决方案&#xf…

等保测评2.0——网络安全等级保护测评的初步了解

一、什么是网络安全等级保护测评? 二、网络安全等级保护,保护的是什么? 等级保护对象:网络安全等级保护工作直接作用的对象。(注:主要包括信息系统、通信网络设施和数据资源等) 计算机信息系统…

设计模式代码实战-抽象工厂模式

1、问题描述 小明家新开了两个工厂用来生产家具,一个生产现代风格的沙发和椅子,一个生产古典风格的沙发和椅子,现在工厂收到了一笔订单,请你帮他设计一个系统,描述订单需要生产家具的信息。 输入试例: 3 …

【设计模式】六大设计原则

设计原则 研究 23 种设计模式是困难的,甚至是没必要的六大设计原则零、单一职责原则开闭原则里氏代换原则依赖倒置原则接口隔离原则迪米特法则合成复用原则 研究 23 种设计模式是困难的,甚至是没必要的 设计模式有23种,我认为对普通人来说想…

【Python】读取时间判定操作次数问题和一些解决办法

几种类 datetime.striptime() 计算两个字符串之间的时间差 datetime.striptime()计算两个字符串之间的时间差 datatime类提供函数处理日期和时间 Striptime()分析字符串值以固定格式表示时间然后存储为函数参数 输出就是: time.sleep() time模块打印时间按照对…

python--递归算法篇

1、给定一个包含n1个整数的数组nums,其数字在1到n之间(包含1和n), 可知至少存在一个重复的整数,假设只有一个重复的整数,请找出这个重复的数 def repeat(ls:list) -> list:#把个数超过1的数&#xff0c…

AutoCAD 2024 安装注册教程

前言 大家好,我是梁国庆。 本篇分享的安装包是 AutoCAD 的全新版本——AutoCAD 2024,下文安装教程中简称 AutoCAD。 时间:2024年4月8日。 获取 AutoCAD 安装包 我已将本篇所使用的安装包打包上传至百度云,扫描下方二维码关注…