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

本文来着公众号“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.mzph.cn/news/141077.shtml

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

相关文章

零基础快速上手STM32开发(手把手保姆级教程)

零基础快速上手STM32开发(手把手保姆级教程) 1. 前言 作为一名嵌入式工程师,STM32 是必须要学习的一款单片机,同时这款单片机资料足够多,而且比较简单,非常适合初学者入门。 STM32 是一款由 STMicroelec…

双H桥直流马达步进电机驱动芯片SS8833E

由工采网代理的率能SS8833E是一款适用于有刷直流或双极步进电机的集成电机驱动芯片;采用eTSSOP16封装;该器件集成了两个PNMOS H桥和电流调节电路;电机输出电流可以由外部脉宽调制器(PWM)或内部PWM电流控制器控制。 工…

【Java 进阶篇】JQuery DOM操作:通用属性操作的绝妙魔法

在前端的舞台上,JQuery犹如一位魔法师,为我们展现了操纵HTML元素的奇妙技巧。而在这个技巧的精妙组成中,通用属性操作是一门绝妙的魔法。在本篇博客中,我们将深入研究JQuery DOM操作中的通用属性操作,揭示这段魔法的神…

11.13 牛客刷题8/10

11.13 信号完整性 指针地址 的加减,注意 最后转为16进制

leetCode 25.K 个一组翻转链表

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于 或 等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值&a…

【PIE-Engine 数据资源】全球250米LAI产品

文章目录 一、 简介二、描述三、波段四、示例代码参考资料 一、 简介 数据名称全球250米LAI产品时间范围2015年空间范围全球数据来源北京师范大学肖志强教授团队代码片段var images pie.ImageCollection(“BNU/LAI/GLOBAL-250”) 二、描述 全球 250 米叶面指数产品由北京师范…

本地PHP搭建简单Imagewheel私人云图床,在外远程访问——“cpolar内网穿透”

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道(云端设置)3.3.Cpolar稳定隧道(本地设置) 4.公网访问测…

产品化的GPT,能否为“百模大战”照亮未来?

这两天,AI圈都处在一种莫名的震撼感当中。 北京时间 11月7日,OpenAI 举办了首次DevDay开发者日活动。活动现场发布了非常多内容,其中有一些按部就班的,比如技术上更新了最新版本的GPT-4 Turbo。也有一些让从业者目瞪口呆&#xff…

高速高精运动控制,富唯智能AI边缘控制器助力自动化行业变革

随着工业大数据时代的到来,传统控制与决策方式无法满足现代数字化工厂对工业大数据分析与决策的需求,AI边缘控制器赋能现代化智慧工厂,实现工业智造与行业变革。 富唯智能AI边缘控制器,基于x86架构的IPC形态产品,通过…

python爬虫hook定位技巧、反调试技巧、常用辅助工具

一、浏览器调试面板介绍 二、hook定位、反调试 Hook 是一种钩子技术,在系统没有调用函数之前,钩子程序就先得到控制权,这时钩子函数既可以加工处理(改变)该函数的执行行为,也可以强制结束消息的传递。简单…

视觉大模型DINOv2:自我监督学习的新领域

1 DINOv2 1.1 DINOv2特点 前段时间,Meta AI 高调发布了 Segment Anything(SAM),SAM 以交互式方式快速生成 Mask,并可以对从未训练过的图片进行精准分割,可以根据文字提示或使用者点击进而圈出图像中的特定…

【Git】第四篇:基本操作(理解工作区、暂存区、版本库)

Git 工作区、暂存区和版本库 工作区:就是我们创建的本地仓库所在的目录暂存区: stage或index,一般放在.git(可隐藏文件)目录下的index文件(.git/index)中,所以我们把暂存区有时候也叫做索引(in…

JVM:如果是你,你如何解决跨代引用的问题?(记忆集和卡集)

这部分内容主要是为了稍后介绍各款垃圾收集器时做前置知识铺垫,如果对这部分内容感到枯燥或者疑惑,可以先放下看,等后续遇到要使用它们的实际场景、实际问题时再结合问题,再回来阅读和理解。 记忆集和卡集 前面在分代收集理论那…

【Java 进阶篇】JQuery DOM操作:舞动网页的属性魔法

在前端的舞台上,属性操作是我们与HTML元素进行互动的关键步骤之一。而JQuery,这位前端开发的巫师,通过简洁而强大的语法,为我们提供了便捷的属性操作工具。在这篇博客中,我们将深入研究JQuery DOM操作中的属性操作&…

FPGA与STM32_FSMC总线通信实验

FPGA与STM32_FSMC总线通信实验 内部存储器IP核的参数设置创建IP核FPGA代码STM32标准库的程序 STM32F407 上自带 FSMC 控制器,通过 FSMC 总线的地址复用模式实现STM32 与 FPGA 之间的通信,FPGA 内部建立 RAM 块,FPGA 桥接 STM32 和 RAM 块&…

【算法 | 模拟No.5】leetcode 74. 搜索二维矩阵

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…

抢抓泛娱乐社交出海新风口!Flat Ads深圳沙龙活动引爆海外市场

随着全球化进程的加速,中国的应用类APP不断走向国际市场。作为产品和服务的提供者,中国开发者围绕社交泛娱乐创新,开启直播出海、短视频出海、游戏社交出海、1V1 视频出海、音频社交出海等出海热潮。“社交、泛娱乐”融合成为行业主流发展趋势…

Go的优雅退出

Go优雅退出/停机以前主要通过signal来实现,当然现在也是通过signal来实现,只是从go 1.16开始,新增了更加友好的API: func NotifyContext(parent context.Context, signals ...os.Signal) (ctx context.Context, stop context.CancelFunc) 该…

DevChat:开发者专属的基于IDE插件化编程协助工具

DevChat:开发者专属的基于IDE插件化编程协助工具 一、DevChat 的介绍1.1 DevChat 简介1.2 DevChat 优势 二、DevChat 在 VSCode 上的使用2.1 安装 DevChat2.2 注册 DevChat2.3 使用 DevChat 三、DevChat 的实战四、总结 一、DevChat 的介绍 在AI浪潮的席卷下&#x…

Linux每日智囊

每日分享三个Linux命令,悄悄培养读者的Linux技能。 ls 作用 显示目录信息 语法 ls [选项] 文件 参数: -a:显示所有文件,包含以 . 开头的隐藏文件以及特殊目录-A:显示所有文件,包含以 . 开头的隐藏文件,但不显示特殊文件 . 和 …-l:使用长格式显示当前目录下文件的详…