大模型理解之CLIP

前言

2021年2月份,CLIP模型被提出,想法很简单,性能高效,而且具备很好的泛化性。我在这里简单谈论下我对CLIP模型的理解,以及发现的一些问题。

我是在沐神的视频中了解的CLIP, 里面提到CLIP最大的贡献在于打破了固定类别标签范式。我对这句话是这样理解的:就拿一般的分类任务来说,每一张图片对应一个类别,类别数量都是固定的,当模型训练好后,在实际使用过程中,一但出现一个从未出现的类别,模型是无法识别出来的。但是CLIP模型不一样,CLIP在训练的过程中,是将句子和图片匹配,然后在推理过程中找到与之最接近的模板句子。举个例子:CLIP模型在训练过程中,用到了4亿组图像文本对,可以说是涵盖了自然界中的大部分场景,在迁移学习时,即使从未见过三轮车这个类别,但一定见过与三轮车描述相关的图像文本对,从而在推理过程中将其识别为三轮车类。

CLIP模型的训练以及推理过程

数据集是若干的图像文本对,CLIP用了近4亿组。在训练过程中,取一个batch_size的图像文本对,图像经过Image Encode, 文本经过Text Encoder,然后在向量之间计算余弦相似度,结果就如图像所示,对象线上的元素分别是一一对应的,那么文本编码和图像编码之间的相似度的也该是最高的,即在对比学习中,对角线上的元素即为正样本,其余非对角线元素为负样本。因此这个模型经过训练后,能实现的最终理想目标就是一组图像文本对,图像经过Image Encoder编码和文本经过Text Encoder的编码应该是一摸一样的(显然,并不可能,但是可以保证两个编码的相似度尽可能的高)。

接下来就是推理过程了,可以看出,CLIP训练好的模型并不具备分类头,得到的最终结果就是两个Encoder,同一组图像文本对经这两个Encoder的编码相似度会很高。 推理过,我们需要先给出类别模型,即将一个类别标签变成一个句子

这些类别标签的句子讲过Text Encoder后会生成对应的文本编码,在推理过程中,给出一张图片,经过Image Encoder后得到图像编码,我们只需要比较图像编码和哪个类别文本编码的相似度最高,图像即为对应类别。

CLIP模型伪代码

CLIP论文中并未给出训练过程,仅给出了伪代码,将在下面展示,以及较为权威的huggingface团队实现的CLIP源码。

然后是huggingface团队在CLIPModel中的损失函数实现:

​
image_embeds = vision_outputs[1]image_embeds = self.visual_projection(image_embeds)text_embeds = text_outputs[1]text_embeds = self.text_projection(text_embeds)# normalized featuresimage_embeds = image_embeds / image_embeds.norm(p=2, dim=-1, keepdim=True)text_embeds = text_embeds / text_embeds.norm(p=2, dim=-1, keepdim=True)# cosine similarity as logitslogit_scale = self.logit_scale.exp()logits_per_text = torch.matmul(text_embeds, image_embeds.t()) * logit_scalelogits_per_image = logits_per_text.t()loss = Noneif return_loss:loss = clip_loss(logits_per_text)# contrastive loss function, adapted from# https://sachinruk.github.io/blog/pytorch/pytorch%20lightning/loss%20function/gpu/2021/03/07/CLIP.htmldef contrastive_loss(logits: torch.Tensor) -> torch.Tensor:return nn.functional.cross_entropy(logits, torch.arange(len(logits), device=logits.device))def clip_loss(similarity: torch.Tensor) -> torch.Tensor:caption_loss = contrastive_loss(similarity)image_loss = contrastive_loss(similarity.t())return (caption_loss + image_loss) / 2.0​

下面是自己的理解:

  • 首先是图像文本编码器,编码结果维度并不一致,无法计算相似度,因此一个learn prob将维度统一
  • 编码结果归一化
  • 对编码计算相似度矩阵
  • 计算对比损失

对我来说这个对比损失是最难理解的部分,为什么通过交叉熵损失即实现了对角线全为正样本,其余均为负样本的效果。下面来看交叉熵损失的原理。

从伪代码可以看出,对于相似度矩阵,沿行这个维度来看,可以看成是每张图片与各个文本的相似度,这个一个多分类问题,与之对应的label恰好是第i行这个数字i。

这里可以看出CLIP模型所用的对比损失函数,只考虑了如何拉近正样本对之间的距离,并未考虑负样本之间的关系。即它只关心对于正样本对之间相似性,忽略了负样本至之间的差异性。这在CLIP模型中并无太大影响,因为CLIP模型的训练数据太多,同一个Batch Size中很难出现重复数据,自然所有负样本的差异性没有区别。但是我自己在训练过程中涉及到的负样本十分接近,这时候如果不考虑负样本之间的差异性,模型很难拟合。

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

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

相关文章

四轴飞行器的电池研究(MatlabSimulink仿真)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

全球免费编程教育网站:Code.org

全球免费编程教育网站:Code.org 官网地址注册使用 你还在为小朋友的编程教育而发愁吗? 你还在为小朋友放假无聊而头疼吗? 他来了他来了,全球免费编程教育网站来了。 2013年成立的Code.org是一个非营利组织。 它致力于为年轻女子、…

Xilinx UltraScale架构之可配置逻辑块CLB

目录 一、概览 二、UltraScale架构 2.1 UltraScale/UltraScale特点 2.2 与7系列CLB差异 三、 CLB结构 3.1 LUT 3.2 FF 3.3 多路选择器Multiplexers 3.4 进位链Carry Chain 四、应用 4.1 分布式RAM 4.2 移位寄存器 4.3 进位链Carry Chain 五、参考资料 一、概览 二…

专门针对开发人员,攻击者利用Rust获取操作系统信息

近日,研究人员在 Rust 编程语言的 crate 注册表中发现了一些恶意软件包,专门针对开发人员。 Phylum 在上周发布的一份报告中称,这些库是由一个名为 "amaperf "的用户在 2023 年 8 月 14 日至 16 日之间上传的。现已删除的软件包名…

【LeetCode-中等题】114. 二叉树展开为链表

文章目录 题目方法一:前序遍历(构造集合) 集合(构造新树)方法二:原地构建方法三:前序遍历--迭代(构造集合) 集合(构造新树) 题目 方法一&#x…

el-select 选择一条数据后,把其余数据带过来

1. 案例&#xff1a; ps: 票号是下拉框选择&#xff0c;风险分类、场站名称以及开始时间是选择【票号】后带过来的。 2. 思路: 使用官网上给的方法&#xff0c;选择之后&#xff0c;触发change方法从而给其余字段赋值 3. 代码 <el-form-itemlabel"票号&#xff1a;&…

buildAdmin的使用笔记

安装buildAdmin 下载完整包&#xff0c;解压进入 buildadmin 的文件夹&#xff0c; 输入命令 composer install 启动的时候使用&#xff0c; php think run 就可以了 为什么启动只需要&#xff0c; php think run 这种启动方式&#xff0c; 我是头一回看见 &#xff0c;后来才…

如何在IT技术面试中脱颖而出?

前序 在竞争激烈的IT领域&#xff0c;技术面试是进入理想工作的关键一步。然而&#xff0c;要在面试中脱颖而出&#xff0c;您需要更多的准备和策略。以下是一些实际且深入的方法&#xff0c;可以帮助您在IT技术面试中脱颖而出。 准备和策略 确保深入了解公司和职位 在面试前…

Android 手游聚合SDK小知识(一)

Android 手游聚合SDK小知识(一) Android 手游聚合SDK小知识(二) 聚合分包 前言 回头想想&#xff0c;在安卓游戏SDK这个领域&#xff0c;我也呆了4年了&#xff0c;从啥都不懂的小菜鸟&#xff0c;逐渐靠自己不断学习&#xff0c;对这个行业也算有了一些理解&#xff0c;趁着…

如何击败那个令程序员绝望的Bug

灵异事件&#xff01;程序里发现了新Bug但是它正常运行啦&#xff01;人生处处有Bug&#xff0c;但有些Bug实在令人目瞪口呆&#xff0c;久久不能忘怀。 有一天&#xff0c;我正忙着维护一个庞大的软件项目&#xff0c;数以百万计的行代码交织成复杂的网络。项目中的一个模块引…

[贪心] 拼接最小数

这道题思路并不难&#xff0c;我主要想学习其一些对于字符串的处理。 代码如下&#xff1a; #include <iostream> #include <string> #include <algorithm> using namespace std;const int MAXN 10000; string nums[MAXN];bool cmp(string a, string b) {…

柯桥外贸英语培训哪家表专业,零基础可以学吗

“我也是”一出口&#xff0c;紧跟着就是 “Me too! / I think so. / I agree with you. 等等”。 今天&#xff0c;咱们换个说法&#xff0c;来表达一下两个人不谋而合、意见一致吧~~ 01 影视对接 02 Subtitle WA: And these are her puppies. Come here, come here, littl…

useEffect 不可忽视的 cleanup 函数

在 react 开发中&#xff0c; useEffect 是我们经常会使用到的钩子&#xff0c;一个基础的例子如下&#xff1a; useEffect(() > {// some code here// cleanup 函数return () > {doSomething()} }, [dependencies])上述代码中&#xff0c; cleanup 函数的执行时机有如下…

js 获得元素的offsetLeft

要获得元素相对于其offsetParent元素左侧边缘的距离&#xff08;即offsetLeft&#xff09;&#xff0c;可以使用如下代码&#xff1a; var el document.getElementById(your-element-id); var offsetLeft el.offsetLeft;其中&#xff0c;el为要获取offsetLeft的元素对象&…

【4】索引缓冲区的使用为什么使用

glDrawArrays(GL_TRIANGLES, 0, 6); 这个函数绘制三角形是按照顶点的顺序来的&#xff0c;那么绘制一个矩形就需要绘制两个三角形&#xff0c;每个三角形需要提供三个顶点&#xff0c;那么在positon数组里就有6个顶点的数据&#xff0c;每个顶点占两个float数&#xff08;假如是…

设计模式第九讲:常见重构技巧 - 去除不必要的!=

设计模式第九讲&#xff1a;常见重构技巧 - 去除不必要的! 项目中会存在大量判空代码&#xff0c;多么丑陋繁冗&#xff01;如何避免这种情况&#xff1f;我们是否滥用了判空呢&#xff1f;本文是设计模式第九讲&#xff0c;讲解常见重构技巧&#xff1a;去除不必要的! 文章目录…

Kubernetes技术--k8s核心技术 ingress

1.引入 我们之前在部署应用(如nginx)的时候,如果你需要外部进行访问,使用的是service中的nodePort方式进行对外的暴露。然后外部就可以使用ip + 端口号来进行访问部署应用。 其实这一种方式是存在着较为明显的缺陷,每一个端口你只能够使用一次,一个端口对应一个应用,而且访…

数学建模大师手册:全国大学生数学建模竞赛模板(附Word模版)

基于____模型的____研究与分析 文章目录 基于____模型的____研究与分析摘要一、问题重述二、问题分析三、假设合理性分析及说明四、符号约定五、模型的建立与求解5.1 问题15.1.1 问题1的前期准备5.1.2 问题1的模型建立与求解 六、模型的评价、改进与推广6.1 模型的优缺点6.1.1 …

Swift 中的动态成员查找

文章目录 前言基础介绍基础示例1. 定义一个动态成员访问类&#xff1a;2. 访问嵌套动态成员&#xff1a; 使用 KeyPath 的编译时安全性KeyPath 用法示例KeyPath 进阶使用示例1. 动态访问属性&#xff1a;2. 结合可选属性和 KeyPath&#xff1a;3. 动态 KeyPath 和字典&#xff…

MySQL8.0.22安装过程记录(个人笔记)

1.点击下载MySQL 2.解压到本地磁盘&#xff08;注意路径中不要有中文&#xff09; 3.在解压目录创建my.ini文件 文件内容为 [mysql] # 设置mysql客户端默认字符集 default-character-setutf8[mysqld] # 设置端口 port 3306 # 设计mysql的安装路径 basedirE:\01.app\05.Tool…