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

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)),而且思考了很多模型之外的问题,比如安全问题和数据没有经过笔记完善的清洗会导致的一些偏见问题,而且作者将自己工作的不足之处一一指了出来,为后人的研究指明了很多方向。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通俗易懂HTTP和HTTPS区别

HTTP:超文本传输协议,它是使用一种明文的方式发送我们的内容,没有任何的加密,例如我们要在网页上输入账号密码,如果使用HTTP协议,账号密码就可能会被暴露,默认端口是80. HTTPS:是HT…

【hive】远程remote debug hive的方法,用于hive监听器/钩子编写

背景 写hive监听器时候需要拿到hive对象但hive是在集群linux主机上运行的。通过jdbc提交的sql具体执行过程不会再idea中运行。所以如果需要拿到hive对象有可能存在两个思路: (1)想办法写个钩子或者监听器,将需要的内容写成json字…

AIX7.2下安装xlc编译器

AIX镜像中对于xlc的支持仅为提供了runtime,而没有对应的xlc编译器。 IBM的xlc编译器需要单独购买,如果不想购买可以注册IBM的账号下载一个60天的试用版。 下载地址: IBM 中国官方网站 (AIX各个版本和xlc编译器版本的兼容性可以…

php未能在vscode识别?

在设置里搜php,找到settings.json,设置你的安装路径即可。 成功

Qt Creator 12.0.2 debug 无法查看变量的值 Expression too Complex

鼠标放在局部变量上提示“expression too complex”。 在调试窗口也看不到局部变量的值。 这应该是qt的一个bug,https://bugreports.qt.io/browse/QTCREATORBUG-24180 暂时解决方法: 如下图,需要右键项目然后执行"Clean"和&quo…

2022年全国青少年信息素养大赛Python国赛第1-10题,含解析答案

01-分苹果 把一堆苹果分给n个小朋友,每个人拿到的苹果数量不同,并且每个人至少有一个。任意输入小朋友的数量n,问这堆苹果至少应该有多少个。输入描述:任意输入小朋友的数量n输出描述:输出这堆苹果至少应该有多少个 样例输入: 3 样例输出: 6 注意: input()内不添…

李彦宏放话:百度AI大模型绝不抢开发者饭碗

关注卢松松,会经常给你分享一些我的经验和观点。 昨晚,李彦宏内部讲话称:AI大模型开源意义不大,百度绝不抢开发者饭碗。 但你一定要说话算话哦,可千万别说:“我永远不做手机,谁再敢提做手机就给…

#esp8266模块通过AT指令获取网络时间(苏宁时间)

一、IDE:keil、cubemx、Arduino......... 二、记录: 1.依次发送以下指令(发送新行) AT ATCWMODE1 ATCWDHCP1,1 ATCWJAP"Redmi K40 Gaming","87654321" ATCIPSTART"TCP","quan.suning.com&quo…

1分钟以上情感短视频素材去哪里找?推荐五个素材网站

在这个充斥着各种短视频的世界里,我就像是一名寻宝的冒险家,不断在素材的海洋中潜水,寻找那些能让我的视频金光闪闪的珍珠。让我告诉你,这不仅仅是一场寻宝,这简直是一场奇妙的冒险。九才素材网: 我的创作…

万字长文|Sam Altman创业手册(中)

Sam Altman,现任Open AI CEO,曾任美国著名创业孵化器Y Combinator最年轻的总裁(不到30岁),被《福布斯》等媒体誉为“ChatGPT之父”,被《商业周刊》评为"技术领域最优秀的年轻企业家",…

车载网关设计方案,开发无线车载网关需要考虑哪些因素?

随着智能车企之间的竞争日益加剧,各车企竞相推出新款智能汽车,并不断拓展车联网生态,以更加优质的用车体验来增强产品竞争力,进而深化用户忠诚度。这一举措不仅提升了车辆的功能性和智能化水平,更在激烈的市场竞争中为…

C/C++进阶/架构师(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)开发学习路线、系统性学习教程

C学习可以划分为几个主要阶段,每个阶段的学习目标和推荐资源都有所不同。下面是一个详细的分阶段学习指南: 入门阶段 学习目标 理解C的基本语法和结构。学习基本数据类型,条件判断,循环等控制结构。掌握函数的使用方法。初步了…

精确计量,中央空调计费系统

在传统的中央空调系统中,由于缺乏精确的计量手段,用户往往面临着电费分摊的不公平问题。为了解决这一难题,出现了一种智能电费分摊技术,它能够对中央空调的使用情况进行精确计量,从而实现公平合理的电费分配。 空调分户…

解决PyCharm更新到2024.1版本后不能运行项目的问题

先来看看这个问题的表现吧。 1、运行和调试按钮是灰色的,并且显示编辑器中的文件不可运行,代码也是灰色的,还有我们的python文件的图标和文本文件的图标一样。 当然右键也是没有运行、调试选项。 2、无法创建新的项目和py文件,能…

44.基于SpringBoot + Vue实现的前后端分离-汽车租赁管理系统(项目 + 论文PPT)

项目介绍 本站是一个B/S模式系统,采用SpringBoot Vue框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得基于SpringBoot Vue技术的汽车租赁管理系统设计与实现管理工作…

两台群晖之间如何进行文件传递

前言:应用场景 我有台6版本的黑群晖,上面有很多共享文件,文件大小不一,有的就是几十KB的文档,有些又是上G的视频文件,存放的目录也没有什么规律可言。最近上线了一台硬件的正版群晖,7的版本&…

基于变量间注意机制的Transformer多元时间序列异常检测

论文地址:https://www.sciencedirect.com/science/article/abs/pii/S0950705124001424 论文源码:无 期刊:Knowledge-Based Systems 多变量时间序列异常检测的主要目标是在不同传感器和系统同时编译的时间序列数据中发现与规则模式的偏差。这…

学习数通HCIE选择誉天有什么优势?

誉天数通课程亮点 课程内容详实,千万级实训环境 涵盖数通技术全场景热门技术,涉及传统园区网,虚拟化园区网,广域互联技术,数据中心网络,网络自动化运维 专业机房环境,全真机教学演示&#xf…

机器学习和深度学习-- 李宏毅(笔记与个人理解)Day 14

Day 14 Classfication (short version) 二分类的时候 用sigmoid 那不就是 logistic 回归嘛(softmax 的二分类等价) Loss 哦 今天刚学的 ,KL散度 ,看来cross-entropy 和KL散度是等价的咯~ 我感觉我的直觉没错 这里MSE离得很远的时候…

qt调试日志文件生成

系列文章目录 第一章 qt日志文件生成功能 文章目录 系列文章目录前言一、qt日志文件生成功能二、使用步骤1.代码示例2.运行截图 前言 qt有固定的调试日志接口,可以通过终端去打印,但是仅适用在本地去调试,例如想长期放到测试台去检测&#…