大模型理解之CLIP

news2024/10/7 10:13:57

前言

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 features

image_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 logits

logit_scale = self.logit_scale.exp()

logits_per_text = torch.matmul(text_embeds, image_embeds.t()) * logit_scale

logits_per_image = logits_per_text.t()

loss = None

if 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.html

def 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.coloradmin.cn/o/941605.html

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

相关文章

【HCIP】17.MPLS VPN

MPLS VPN 不是一个技术,是一堆技术的集合,是一种解决方案 什么是VPN?虚拟专用网络 能够解决公司之间互联的一种技术,在原始的报文上面再重新封装一个或者多个全新的头部,完成在公共网络上的传递 裸纤(每…

【VScode推理模型部署】ONNX runtime

推理模型部署(一):ONNX runtime 实践 VSCode配置之OnnxRuntime(CPU) && YOLOv7验证 简单来说,对于机器学习模型过程可分为训练迭代和部署上线两个方面: 训练迭代,即通过特定的数据集、模型结构、损失函数和评价指标的确…

新生应如何在线确认录取结果和提交入学资料?

马上就要开学啦,学生还没到校的时候,老师如何让学生查询完录取结果,并且向老师确认自己已经查看过呢?最好还能直接提交入学资料,这样就不用开了学现场一个一个写,费时又费力。 老师们可以使用易查分制作一…

为你解决在Mybatis中的疑惑?Mybatis中【关联关系映射】

一.介绍Mybatis中【关联关系映射】 1.什么是Mybatis中【关联关系映射】? 可以实现不同实体之间的关联查询和映射。关联关系映射可以将多个实体对象之间的关联关系通过数据库查询进行映射,实现对象之间的关联操作。 2.常见的Mybatis【关联关系映射】 2.…

(1)进程间常见的几种通信方式

文章目录 进程间的通行方式一、管道模型二、消息队列模型三、共享内存四 信号量机制五、socket 进程间的通行方式 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内…

Python“牵手”淘宝商品列表数据,关键词搜索淘宝API接口数据,淘宝API接口申请指南

淘宝平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范,淘宝API接口是指通过编程的方式,让开发者能够通过HTTP协议直接访问淘宝平台的数据,包括商品信息、店铺信息、物流信息等,从而实现淘宝平台…

大数据-玩转数据-Flink 水印

一、Flink 中的水印 在Flink的流式操作中, 会涉及不同的时间概念: 1.1 处理时间 是指的执行操作的各个设备的时间,对于运行在处理时间上的流程序, 所有的基于时间的操作(比如时间窗口)都是使用的设备时钟。比如, 一个长度为1个小时的窗口将会包含设备…

去掉vue项目运行时中出现的黄色警告

最近在写vue项目时发现想测试一个接口行不行的时候,在控制台输出的时候发现会有很多黄色警告,每次都要找很久才能找到自己想输出的内容,如下图: 去掉这些只需要一句话: const app createApp(App) app.config.warnHa…

数据库管理-第九十九期 OCM之路(20230828)

数据库管理-第九十九期 OCM之路(20230828) 本周五,我就要在上海Oracle University的考场进行19c OCM的升级考试了。关于之前版本的OCM,11g OCM我是在2016年9月拿下的,在一年后的即2017年的9月拿下了12c OCM。所以对于我…

Spring Cloud Alibaba-Sentinel规则

1 流控规则 流量控制,其原理是监控应用流量的QPS(每秒查询率) 或并发线程数等指标,当达到指定的阈值时 对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。 第1步: 点击簇点链路,我们就可以看到访…

QML Book 学习基础2(基本元素控件)

目录 矩形(Rectangle) 文本元素 鼠标键盘交互 布局元素 矩形(Rectangle) 矩形项用于用纯色或渐变填充区域,和/或提供矩形边框。需要注意如果长宽没有设置,是无法看到矩形的 Rectangle {id: rect1x: 12; …

上位机采集8通道模拟量模块数据

模拟量模块和上位机的配合使用可以实现对模拟量数据的采集、传输和处理。下面是它们配合使用的一般步骤:1. 连接模拟量模块:将模拟量模块与上位机进行连接。这通常涉及将模拟量模块的输入通道与被监测的模拟信号源连接起来,如传感器、变送器等…

css元素定位:通过元素的标签或者元素的id、class属性定位,还不明白的伙计,看这个就行了!

前言 大部分人在使用selenium定位元素时,用的是xpath元素定位方式,因为xpath元素定位方式基本能解决定位的需求。xpath元素定位方式更直观,更好理解一些。 css元素定位方式往往被忽略掉了,其实css元素定位方式也有它的价值&…

设计模式入门笔记

1 设计模式简介 在IT这个行业,技术日新月异,可能你今年刚弄懂一个编程框架,明年它就不流行了。 然而即使在易变的IT世界也有很多几乎不变的知识,他们晦涩而重要,默默的将程序员划分为卓越与平庸两类。比如说&#xff…

游戏测试工程师的职业发展前景怎么样?

软件测试是一个看似入门简单,门槛极低,薪资也还不错的的行业,但如果你开始向这个方向发展,你就发现并非如此。实际情况是初级功能岗位薪资偏低,而且以外包公司居多,高级岗位薪资非常可观,但对技…

震动分析国标GB/T 19873.3-2019/ISO 13373-3:2015笔记

1.国家标准 1.1震动测量 现行国家标准是:GB/T 19873.2-2009 机器状态监测与诊断 振动状态监测 第2部分:振动数据处理、分析与描述 它的起草人: 郑州机械研究所。西安热工研究院有限公司。东南大学。 主要起草人 韩国明 、张学延 、傅行…

2023-08-28 C语言函数一定要在.h文件中声明吗

老林的C语言新课, 想快速入门点此 <C 语言编程核心突破> C语言函数一定要在.h文件中声明吗 前言一、三种情况下的函数声明与定义策略单文件小练习多文件工程需要在多个文件调用的函数不需要跨文件调用的函数 二、示例需要在多个文件调用的函数:不需要跨文件调用的函数: …

一起参与开源,志愿者招募中!IT、翻译、新媒体、设计等

Hi 同学&#xff0c;你是不是专注某个领域&#xff0c;想找机会&#xff0c;积累开源软件方面的早期经验&#xff1f;你来对地方啦。请阅读本文&#xff0c;了解为什么要加入 ONLYOFFICE&#xff0c;做出贡献&#xff0c;以及如何做到。 贡献开源&#xff0c;福利多多 为开源项…

2023全国大学生数学建模竞赛B题思路模型代码

目录 一.思路模型见文末名片&#xff0c;比赛开始9.7晚上第一时间更新 二.国赛常用算法之随机森林 3.思路获取见此 一.思路模型见文末名片&#xff0c;比赛开始9.7晚上第一时间更新 二.国赛常用算法之随机森林 # -*- coding: utf-8 -*- """ author: Administ…

自动化运维工具-----Ansible入门详解

目录 一.Ansible简介 什么是Ansible&#xff1f; Ansible的特点 Ansible的架构 二.Ansible任务执行解析 ansible任务执行模式 ansible执行流程 ansible命令执行过程 三.Ansible配置解析 ansible的安装方式 ansible的程序结构&#xff08;yum安装为例&#xff09; ansibl…