CLIP:万物分类(视觉语言大模型)

news2024/11/20 6:35:40

本文来着公众号“AI大道理”

论文地址:https://arxiv.org/abs/2103.00020

传统的分类模型需要先验的定义固定的类别,然后经过CNN提取特征,经过softmax进行分类。然而这种模式有个致命的缺点,那就是想加入新的一类就得重新定义这个类别的标签,并重新训练模型,这样非常不方便。

CLIP打破了这个桎梏。

CLIP能做到在一定标签内进行训练,标签外的也能进行分类。

那么CLIP到底是如何认识未知的事物的呢?

1、从人脸识别开始说起

最早的打破固定标签的方法和应用就是人脸识别了。

早期的人脸识别,我们完全可以当做一个分类任务来做。

比如一个教室或者一个公司,当做固定的人,我们就做一个N类的分类即可。

然而我们知道,公司的人是变动的,新来一个同事由于事先没有训练过,导致分类不出来,所以就得重新训练这个分类模型,把新来的同事的人脸加入数据集中进行重新然后才能再次work。

为了解决这个问题,对比学习、相似度训练派上了用场。

我们完全可以训练一个人脸相似度的模型,这个模型的数据集是这样的,一对一对同样的人的两张人脸一起训练,提取特征之后计算特征向量之间的余弦相似度,相似度高的认为是同一张人脸,从而达到人脸识别的效果。当然,也可以三张图片一起训练,即两张一样的人脸外加一张其他人脸,使得一样的人脸相似度高,不一样的人脸相似度低。不管如何,这样训练出来的模型可以看做一个相似度模型。

那么新来一个员工怎么办呢?

很简单,只需要把它的人脸采集一张放入库中就行,而无需重新训练模型。当推理的时候,拍摄一张它的人脸,这个人脸进入相似度模型,和人脸库中的所有人脸进行计算相似度,那么之前放入的那张它的人脸就可以和当前拍摄到的人脸得出相似度最高的分数。

这就有效解决了新来人脸要重新训练的问题。

这个思想和CLIP是非常相似的,只不过CLIP的库是文字,而人脸识别系统的库是图片。

这个库可以训练完成之后随时加入没有见过的。

不管是文字,还是图片,本质都是一样的,在特征提取后或者说编码之后都是数字,都是向量。

2、CLIP简介

CLIP,Contrastive Language–Image Pre-training,是2021年openAI推出的一个基于对比学习的模型,利用文本信息训练一个可以实现zero-shot的视觉模型,迁移能力很强。

CLIP也可以称为多模态大模型,零样本学习方法。

CLIP最大的贡献在于打破了固定类别标签范式。

CLIP模型不一样,CLIP在训练的过程中,是将句子和图片匹配,然后在推理过程中找到与之最接近的模板句子。CLIP模型在训练过程中,用到了4亿组图像文本对,可以说是涵盖了自然界中的大部分场景。

3、网络结构

CLIP的网络结构主要包含Text Encoder和Image Encoder两个模块,分别提取文本和图像特征,然后基于比对学习让模型学习到文本-图像的匹配关系。

CLIP使用大规模数据(4亿文本-图像对)进行训练,基于海量数据,CLIP模型可以学习到更多通用的视觉语义信息,给下游任务提高帮助。

具体步骤如下:

1)输入的文本和图像分别经过各自的Encoder处理成特征向量;

2)构建关系矩阵。形如图1右边的矩阵,图1右边的矩阵中的每一个元素都是每一个图像特征向量和其他文本特征向量的余弦相似度。该矩阵中主对角线的元素都是匹配的(图像和文本特征完全对应),其他地方的元素并不匹配。

3)主对角线的余弦相似度尽可能的最大,其他地方的余弦相似度尽可能的最小。

4、CLIP的学习方法

CLIP采用对比学习。

对比学习是一种学习相似性度量的方法,它的核心思想是通过将同一组数据中的不同样本对进行比较,来学习它们之间的相似度或差异度。

在CLIP模型中,对比学习被用来训练模型学习视觉和语言的相互关系。

具体来说,CLIP模型将图像和文本映射到同一表示空间,并通过对比不同图像和文本对之间的相似性和差异性进行训练,从而学习到具有良好泛化能力的特征表示。

如果是预测一个图像所对应的文本,需要逐字逐句的去预测,非常复杂,效率较低,因为一张图像可能有多种文本描述,如果是使用对比学习的方法,预测一个图像和一个文本是否配对,那任务就简单很多。

将预测性目标函数换成对比性目标函数,训练效率提高了四倍。

5、CLIP的训练

CLIP在训练过程中,取一个batch_size的图像文本对,图像经过Image Encode, 文本经过Text Encoder,然后在向量之间计算余弦相似度,结果就如图像所示,对象线上的元素分别是一一对应的。

那么文本编码和图像编码之间的相似度的也该是最高的,即在对比学习中,对角线上的元素即为正样本,其余非对角线元素为负样本。

因此这个模型经过训练后,能实现的最终理想目标就是一组图像文本对,图像经过Image Encoder编码和文本经过Text Encoder的编码应该是一摸一样的。

其实,预训练网络的输入是文字与图片的配对,每一张图片都配有一小句解释性的文字。将文字和图片分别通过一个编码器,得到向量表示。这里的文本编码器就是 Transformer;而图片编码器既可以是 Resnet,也可以是 Vision transformer,作者对这两种结构都进行了考察。

这里细微的区别就是,普通有分类头的监督学习的模型,输入的是已知的图片,不用再输入标签,自行分类,其实标签是已经在了,这是全包围的。

CLIP输入的可以是外来没有训练过的图片,输入这个图片对应的文字到文字库里面,然后也可以正确分类。

为了训练CLIP,OpenAI从互联网收集了共4个亿的文本-图像对,论文称之为WebImageText,如果按照文本的单词量,它和训练GPT-2的WebText规模类似,如果从数量上对比的话,它还比谷歌的JFT-300M数据集多一个亿,所以说这是一个很大规模的数据集。

CLIP虽然是多模态模型,但它主要是用来训练可迁移的视觉模型。所有的模型都训练32个epochs,采用AdamW优化器,而且训练过程采用了一个较大的batch size:32768。由于数据量较大,最大的ResNet模型RN50x64需要在592个V100卡上训练18天,而最大ViT模型ViT-L/14需要在256张V100卡上训练12天,可见要训练CLIP需要耗费多大的资源。

6、CLIP的推理

接下来是 zero-shot 的推理过程。给定一张图片,如何利用预训练好的网络去做分类呢?这里作者很巧妙地设置了一道“多项选择”。具体来说,我给网络一堆分类标签,比如cat, dog, bird,利用文本编码器得到向量表示。然后分别计算这些标签与图片的余弦相似度;最终相似度最高的标签即是预测的分类结果。

作者提到,相比于单纯地给定分类标签,给定一个句子的分类效果更好。比如一种句子模板 A photo of a ...,后面填入分类标签。这种句子模板叫做 prompt(提示)。这也很好理解:预训练时模型看到的大多是句子,如果在推理时突然变成单词,效果肯定会下降。作者还说,句子模板的选择很有讲究,还专门讨论了prompt engineering,测试了好多种类的句子模板。

提示信息有多种,从图2中可以看到它用不同的类别替换一句话中不同的词,形成不同的标签。

推理过程中最关键的一点,在于我们有很高的自由度去设置“多项选择题”。从前的分类网络的类别数量是固定的,一般最后一层是跟着 softmax 的全连接层;如果要更改类别数量,就要更换最后一层;并且预测的内容是固定的,不能超过训练集的类别范围。

但对于 CLIP 来说,提供给网络的分类标签不仅数量不固定,内容也是自由的。如果提供两个标签,那就是一个二分类问题;如果提供1000个标签,那就是1000分类问题。标签内容可以是常规的分类标签,也可以是一些冷门的分类标签。我认为这是 CLIP 的一大主要贡献——摆脱了事先定好的分类标签。

7、CLIP的损失函数

首先是图像文本编码器,编码结果维度并不一致,无法计算相似度,因此一个learn prob将维度统一。

对编码结果进行归一化,对编码计算相似度矩阵,然后计算对比损失。

损失函数:

其中, 温度系数τ是设定的超参数,q和k可以表示相似度度量,分子部分表示正例之间的相似度,分母表示正例与负例之间的相似度。因此看出,相同类别相似度越大,不同类别相似度越小,损失就会越小。这一步得到的Encoder和Decoder用于下面的步骤。

8、CLIP的应用

StyleCLIP:变脸

CLIPDraw:画画

CLIP + NeRF:

CLIPasso:提炼语义概念,生成图片目标的高度抽象线条画

9、总结

CLIP在图像文本匹配或者图像文本检索任务上,速度很快。因为这两个任务通常有一个很大的已有的数据库,CLIP可以提前把数据库里所有的图像文本的特征提前抽取好,当给定新的一张图片或者一个文本,将其与已有的数据库做匹配,直接计算一个点乘,矩阵乘法是比较快的。

局限性:

  • CLIP的zero-shot性能虽然和有监督的ResNet50相当,但是还不是SOTA,作者估计要达到SOTA的效果,CLIP还需要增加1000x的计算量,这是难以想象的;

  • CLIP的zero-shot在某些数据集上表现较差,如细粒度分类,抽象任务等;

  • CLIP在自然分布漂移上表现鲁棒,但是依然存在域外泛化问题,即如果测试数据集的分布和训练集相差较大,CLIP会表现较差;

  • CLIP并没有解决深度学习的数据效率低下难题,训练CLIP需要大量的数据;

 ——————

浅谈则止,细致入微AI大道理

扫描下方“AI大道理”,选择“关注”公众号

—————————————————————

—————————————————————

投稿吧   | 留言吧

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

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

相关文章

Lasso回归和岭回归详解

当数据特征存在多重共线性,特征矩阵不满秩,或者用普通线性回归过拟合的状况时,我们需要用lasso回归或岭回归来构建模型。 左边是lasso回归,右边是岭回归。 Lasso使用的是系数 的L1范式(L1范式则是系数 的绝对值&#…

PCL安装与使用

1 apt安装 ubuntu20.04及以上版本下可以直接通过apt方式安装pcl编译好的二进制文件,二进制安装的版本为1.10。 sudo apt update sudo apt install libpcl-dev 2 源码安装 在pcl的github上下载对应的版本进行安装: https://github.com/PointCloudLibrary/pcl/rel…

分组取每组数据的最大值和最小值的方法思路,为类似场景的数据分析提取提供思路,例如提取宗地内建筑的最高层数等可参考此方法思路

目录 一、实现效果 二、实现过程 1.读取并剔除无效数据 2.数据分组 3.提取最大值 4.提取最小值 三、总结 使用FME实现批量分组取每组数据的最大值和最小值,为类似场景的数据分析提取提供思路,例如提取宗地内建筑的最高层数等可参考此方法思路。关…

【数据结构】非递归实现二叉树的前 + 中 + 后 + 层序遍历(听说面试会考?)

👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:数据结构 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&…

mysql之正则表达式匹配

题目: 今天在牛客网看到一道关于数据库正则表达式匹配的问题,发现自己一点不会做。 正则表达式: 一、正则表达式 MySQL 正则表达式通常是在检索数据库记录的时候,根据指定的匹配模式匹配记录中 符合要求的特殊字符串。MySQL 的…

利用角色roles上线wordpress项目

角色订制:roles ① 简介 对于以上所有的方式有个弊端就是无法实现复用假设在同时部署Web、db、ha 时或不同服务器组合不同的应用就需要写多个yml文件。很难实现灵活的调用。   roles 用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文…

linux下使用Docker Compose部署Spug实现公网远程访问

📑前言 本文主要是linux下使用Docker Compose部署Spug实现公网远程访问的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页放风讲故事 &am…

openlayers 注册投影

注册投影 openlayers 默认支持的坐标系有4326(基于美国wgs84坐标系)和3857(墨卡托投影)两种。 所以如果我们想要使用比如4490坐标系,或者4547坐标系,就需要先注册, 注册4490示例代码如下 如…

【Linux进程】进程控制

目录 一、进程创建 1.2 fork函数初识 1.2 fork函数返回值 1.3 写时拷贝 1.4 fork常规用法 1.5 fork调用失败的原因 二、进程终止 2.1 进程退出场景 2.2 进程退出码 2.2.1 用strerror打印错误信息 2.2.2 errno全局变量 2.3 进程常见退出方法 2.3.1 进程正常退出 2…

力扣刷题-二叉树-对称二叉树

101 对称二叉树 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false 思路 我的思路…

RK3568笔记五:基于Yolov5的训练及部署

若该文为原创文章,转载请注明原文出处。 一. 部署概述 环境:Ubuntu20.04、python3.8 芯片:RK3568 芯片系统:buildroot 开发板:ATK-DLRK3568 开发主要参考文档:《Rockchip_Quick_Start_RKNN_Toolkit2_C…

2023测试工程师必看系列:用JMeter+ANT进行接口自动化测试,并生成HTML测试报告

【文章末尾给大家留下了大量的福利】 小伙伴们,用python做接口自动化是不是写代码比较繁琐,而且没有python代码基础的小伙伴根本无从下手对吧!今天我们来学习一下如何使用JMeter工具实现接口自动化测试。 01 安装 1、安装JDK,…

weblogic集群配置信息,IIOP问题解决,节点配置管理

第一、创建域的时候,管理服务器,受管服务器,选择管理服务器,设置端口9001,其他默认下一步即可。 第二、启动管理服务器,打开控制台,增加服务器,集群如图,如果这两部有问…

【NLP】理解 Llama2:KV 缓存、分组查询注意力、旋转嵌入等

LLaMA 2.0是 Meta AI 的开创性作品,作为首批高性能开源预训练语言模型之一闯入了 AI 场景。值得注意的是,LLaMA-13B 的性能优于巨大的 GPT-3(175B),尽管其尺寸只是其一小部分。您无疑听说过 LLaMA 令人印象深刻的性能,但您是否想知…

计算机基础知识50

数据的增删改查(insert update delete select) # 用户列表的展示: # 把数据表中得用户数据都给查询出来展示在页面上 1. 查询 from app01 import models models.UserInfo.objects.all() # 查询所有的字段信息和数据 resmodels.UserInfo.objects.first() # 查询…

SM8081是一个高效率的1.5MHz同步步进降压DC/DC调节器,可提供高达1A的电压输出电流。

SM8081 高效率,1.5MHZ,1A 同步降压调节器 概述: SM8081是一个高效率的1.5MHz同步步进降压DC/DC调节器,可提供高达1A的电压输出电流。它可以在宽输入电压下工作范围从2.5V到5.5V,集成主开关以及具有非常低Rps&#x…

【OpenCV实现图像:用OpenCV图像处理技巧之巧用直方图】

文章目录 概要前置条件统计数据分析直方图均衡化原理小结 概要 图像处理是计算机视觉领域中的重要组成部分,而直方图在图像处理中扮演着关键的角色。如何巧妙地运用OpenCV库中的图像处理技巧,特别是直方图相关的方法,来提高图像质量、改善细…

threejs (三) 几何体

定义:用来表示物体的形状,可以定义物体的大小,可以被缩放、旋转和平移 内置几何体: 二维几何体:PlaneGeometry矩形平面、CircleGeometry圆形平面、RingGeometry环形平面、ShapeGeometry二维图形三维几何体&#xff1a…

UI和UX设计师实用高效的设计工具大全

真正专业和优秀的UX设计师不会介意使用哪个工具。因为,只要能力足够,即使条件不同,工具不同,也可以设计出让人眼前一亮的作品。也许,这种理解本身并没有什么大问题。然而,如今,设计师显然有如此…

【汇编语言基础入门】—— 汇编的基础介绍

文章目录 一、机器语言二、汇编语言三、CPU 与 CPU 内存1、CPU 对存储器的读写 四、CPU 的典型构成1、寄存器2、通用寄存器3、物理地址的计算方法4、CS5、DS6、SS SP 一、机器语言 在学习汇编语言之前,我们应该先了解一下什么是机器语言。机器语言是机器指令的集合&…