# 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 Imagedevice = "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.mzph.cn/news/812117.shtml

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

相关文章

Harmony鸿蒙南向外设驱动开发-Camera

功能简介 OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Device Interface)接口,对下实现相机Pipeline模型,管理相机各个硬件设备。 该驱动框架模型内部分为三层,依次为HDI实现层、框架层和设备适配层。各层基…

Mouse IFN-α ELISA kit (Quick Test)

干扰素α(IFN-α)是一类由免疫细胞分泌的内源性调节因子,也被称为白细胞干扰素,主要参与响应病毒感染的先天性免疫。 基于结构特征、受体、细胞来源和生物活性的不同,干扰素可被分为Ⅰ、Ⅱ、Ⅲ三种类型,其中…

一起学习python——基础篇(17)

今天我说一下python中有关文件的操作。 1、检测一个目录里面有无这个文件夹、有无txt文件,代码如下: import os #文件的路径 testPath"D:/pythonFile" testPath2"D:/pythonFile/test.txt" #使用exists()方法检查是否存在文件…

RREA论文阅读

Relational Reflection Entity Alignment 关系反射实体对齐 ABSTRACT 实体对齐旨在识别来自不同知识图谱(KG)的等效实体对,这对于集成多源知识图谱至关重要。最近,随着 GNN 在实体对齐中的引入,近期模型的架构变得越来越复杂。我们甚至在这…

Power BI报告在PPT中实时刷新的实现技巧分享

前面我们刚介绍了如何在PPT中展示Power BI报告? 很巧的是,在刚刚的Power BI 2024年4月更新的诸多新特性中,PPT中使用的Power BI插件又有新特性的更新,数据自动刷新功能(新特性仅限国际版使用),这个新特性支持最低15秒…

软件定义车队面临网络安全的曲折之路

当以色列 REE Automotive 设计其 P7 电动汽车底盘时,它是从软件开始工作的:扁平的车辆底盘完全可配置,每个轮胎附近有四个独立的模块,用于转向、制动、悬架和动力传动系统,每个模块均由电子驱动控制单元(EC…

网络协议——OSPF(开放式最短路径优先)详解

1.什么是OSPF 开放式最短路径优先OSPF 是一种动态的高度可靠和高度可扩展的路由协议,用于构建大型网络中的动态路由系统 2. OSPF的协议号为:89 3. OSPF的特点: OSPF是链路状态协议使用了区域概念:减少路由选择协议对路由器CPU,…

【LeetCode】二叉树类题目详解

二叉树 二叉树的理论基础 二叉树是结点的度数之和不超过2的树,二叉树总共有五种基本形态 二叉树的种类主要有: 满二叉树完全二叉树 二叉树的存储方式 顺序存储链式存储 二叉树的遍历方式 先序遍历(深度优先搜索)中序遍历&…

蓝桥杯-STL-string

目录 字符串定义 字符串初始化 字符串输入输出 字符串输出 字符串输入 字符串访问 字符串拷贝 字符串拼接 直接相加 append(const char*str,int n) 字符串比较 ​编辑字符串长度length()/size() 字符串查找find(string str) 查找子串substr(int a,int b) 字符串的…

秋招数据库学习2(20240408-20240412共10道)

由于感觉数据库难度可能暂时面试用不到,就先不刷啦 20240408 1.从不订购的客户 SELECT Name AS Customers FROM Customers C LEFT JOIN Orders O ON C.Id O.CustomerId WHERE CustomerId is nullselect customers.name as Customers from Customers wher…

手写ArrrayList

需求 自定义的MyArrayList import java.util.Arrays; import java.util.Objects;public class MyArrayList<E> {private Object[] elementData ; // 存储元素的数组private int size; // 记录 的元素个数private static final int DEFAULT_CAPACITY 10; // 默认容量// …

Eigen笔记2:矩阵拼接

直接贴代码吧&#xff0c;使用的MatrixXd 和<<运算符&#xff1a; int main(int argc, char *argv[]) {Eigen::MatrixXd B(2, 2);B << 1, 2,3, 4;Eigen::MatrixXd C(2, 2);C << 5, 6,7, 8;Eigen::MatrixXd D(2, 2);D << 9, 10,11, 12;Eigen::MatrixXd…

基于React封装Handsontable并兼容antd

背景 其实Handsontable官方也提供了React的版本&#xff0c;但是官方的版本再编辑和渲染的时候并不能够很好的嵌入第三方的组件库。这就导致了&#xff0c;使用了Handsontable就没有办和普通的react项目一样轻松引用其他第三方组件。因此对其react的版本进行了二次的封装&#…

Django中间件路由映射自动加/斜杠问题原因及分析

输入 http://127.0.0.1:8000/main/index/ 输入 http://127.0.0.1:8000/main/index 路由定义情况 urlpatterns [path("index/", views.index) ]可以发现我在输入URL的index路由时&#xff0c;如果没有和Django定义的路由匹配规则一样的话&#xff0c;浏览器自…

Vim:强大的文本编辑器

文章目录 Vim&#xff1a;强大的文本编辑器Vim的模式命令模式常用操作光标移动文本编辑查找和替换 底行命令模式常用操作Vim的多窗口操作批量注释与去注释Vim插件推荐&#xff1a;vimforcpp结论 Vim&#xff1a;强大的文本编辑器 Vim&#xff0c;代表 Vi IMproved&#xff0c;…

如何确保软件通过SmartScreen验证,消除用户下载时的警告提示?

在当前的网络时代&#xff0c;各种软件应用程序深深渗透到人们的日常生活和工作中&#xff0c;许多企业选择自行开发应用程序以推进其业务发展。但在发布应用程序后&#xff0c;软件所有者经常会遇到一个挑战&#xff0c;即用户在下载时可能会遇到微软SmartScreen提示“此应用程…

探索HTTP协议的世界 | 从基础到高级应用,原理与实践相结合(请求篇)

从基础到高级应用&#xff0c;原理与实践相结合 什么是Http历代Http协议主要特点格式和URL协议内容请求行格式如下请求方法简单案例 消息报头报头域的格式HTTP消息报头类型普通报头优化方向报头&#xff08;缓存&#xff09;Cache-Control的选项其他相关的缓存报头 请求报头Acc…

Unity TMP Inputfield 输入框 框选 富文本 获取真实定位

一、带富文本标签的框选是什么 UGUI的InputField提供了selectionAnchorPosition和selectionFocusPosition&#xff0c;开始选择时的光标下标和当前光标下标 对于未添加富文本标签时&#xff0c;直接通过以上两个值&#xff0c;判断一下框选方向&#xff08;前向后/后向前&…

C#Winform使用扩展方法自定义富文本框(RichTextBox)字体颜色

实现效果 调用方法 rtxtLog.AppendTextColorful(richTextBox1,DateTime.Now.ToString(), Color.Red); 完整代码如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using Sys…

【U8+】用友固定资产卡片拆分提示:未设置对象变量或With block变量。

【问题描述】 用友U8软件中&#xff0c; 操作固定资产模块&#xff0c;针对资产进行卡片拆分的时候&#xff0c; 提示&#xff1a;未设置对象变量或With block变量。 确定后仍然能打开卡片拆分界面&#xff0c;但是界面显示异常看不到拆分明细信息&#xff0c;并且保存后拆分结…