大模型理解之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.rhkb.cn/news/109896.html

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

相关文章

ELK之LogStash介绍及安装配置

一、logstash简介 集中、转换和存储数据 Logstash 是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。 Logstash 能够动态地采集、转换和传输数据,不受格式或复杂度的…

10.Oracle中decode函数

【函数格式】: decode ( expression, condition_01, result_01, condition_02, result_02, ......, condition_n, result_n, result_default) 【函数说明】: 若表达式expression值与condition_01值匹配,则返回result_01,…

[ DPU / SmartNIC/ 网卡 ]系统级的测试验证

开局一张图,其他慢慢来编 信雅纳DPU测试解决方案荣获第三届DPU峰会的“匠芯技术奖” 看完这张,小编再送一张::: 网卡进化 更智能的加速卡SmartNIC/DPU 例如,将部分网络协议处理的功能卸载到 DPU 网卡&am…

初试Eureka注册中心

Eureka是spring cloud中的一个负责服务注册与发现的组件。遵循着CAP理论中的A(可用性)P(分区容错性)。一个Eureka中分为eureka server和eureka client。其中eureka server是作为服务的注册与发现中心。 搭建eureka服务 引入eureka依赖 引入SpringCloud为eureka提供的starter依…

Arcgis colorRmap

arcgis中colorRmap对应的名称: 信息来源:https://developers.arcgis.com/documentation/common-data-types/raster-function-objects.htm 在arcpy中使用方法: import arcpy cr arcpy.mp.ColorRamp("Yellow to Red")python中 ma…

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

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

【面试题】MVC、MVP与MVVM模式是什么?

MVC模式 MVC是应用最广泛的软件架构之一,一般MVC分为: Model( 模型 )、Controller( 控制器 )、View( 视图 )。 这主要是基于分层的目的,让彼此的职责分开。View 一般…

leetcode875. 爱吃香蕉的珂珂(java)

二分查找 爱吃香蕉的珂珂二分查找 上期经典 爱吃香蕉的珂珂 难度 - 中等 LC - 875.爱吃香蕉的珂珂 珂珂喜欢吃香蕉。这里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 h 小时后回来。 珂珂可以决定她吃香蕉的速度 k (单位&…

Apache StreamPark系列教程第一篇——安装和体验

一、StreamPark介绍 实时即未来,在实时处理流域 Apache Spark 和 Apache Flink 是一个伟大的进步,尤其是Apache Flink被普遍认为是下一代大数据流计算引擎, 我们在使用 Flink & Spark 时发现从编程模型, 启动配置到运维管理都有很多可以抽象共用的地方, 我们将一些好的经验…

Unity关键概念

Unity是一款跨平台的游戏引擎和开发工具,用于创建2D和3D游戏、交互式内容和应用程序。它提供了一个强大的开发环境,使开发者能够轻松地设计、开发和部署高质量的游戏和应用程序。 以下是Unity的几个关键概念: 游戏对象(Game Obj…

基于Visual studio创建API项目

API(英文全称:Application Programming Interface,中文:应用程序编程接口) 为什么要 通过API接口可以与其他软件实现数据相互通信,API这项技术能够提高开发效率。 本文是基于vs2017 .net平台搭建API。希望可以帮助到学…

法律小程序开发:让法律咨询更便捷

在现代社会,法律咨询服务越来越受到人们的重视和需求。为了方便用户预约法律咨询,很多律所都开始使用小程序来提供在线预约服务。那么,如何制作一款律所预约小程序呢? 首先,我们可以选择乔拓云网作为制作小程序的平台。…

鸿蒙是一个怎么样的操作系统,真的是安卓套壳吗?

从鸿蒙项目正式推出以来,就一直有各自声音,有看好的,认为鸿蒙的出现将会成为一个智能终端设备操作系统的框架和平台,促进万物互联产业的繁荣发展;也有的人在唱衰,觉得鸿蒙发展不起来,甚至认为鸿…

LLM预训练大型语言模型Pre-training large language models

在上一个视频中,您被介绍到了生成性AI项目的生命周期。 如您所见,在您开始启动您的生成性AI应用的有趣部分之前,有几个步骤需要完成。一旦您确定了您的用例范围,并确定了您需要LLM在您的应用程序中的工作方式,您的下…

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

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

关于disriminative 和 generative这两种模型

但是,其实,根据李宏毅老师讲到的,generative model是做了一些假设的,比如,如果使用Naive Bayes的话,不同特征x1,x2...之间相互独立的话,其实是很容易出现较大的偏差的,因为不同特征变…

持续集成与持续交付:现代软件测试的变革之路

引言 在数字化时代,软件开发的速度和复杂性都在不断增加。为了满足市场的需求,企业需要更快、更高效地交付高质量的软件产品。在这样的背景下,持续集成与持续交付(CI/CD)成为了软件开发和测试的核心实践。 软件开发的…

微信小程序 基于Android的美容理发师预约管理系统

,本系统主要根据管理员、用户及理发师的实际需要,方便用户利用互联网实现对商品信息进行立即订购,同时让管理者可以通过这个系统对用户实际需求以及各信息进行管理。设计该系统主要目的是为了方便用户、理发师可以有一个非常好的平台体验&…

美团面试拷打:ConcurrentHashMap 为何不能插入 null?HashMap 为何可以?

周末的时候,有一位小伙伴提了一些关于 ConcurrentHashMap 的问题,都是他最近面试遇到的。原提问如下(星球原贴地址:https://t.zsxq.com/11jcuezQs ): 整个提问看着非常复杂,其实归纳来说就是两个问题: ConcurrentHashMap 为什么 key 和 value 不能为 null?ConcurrentH…

LeetCode面试经典150题(day 1)

LeetCode是一个免费刷题的一个网站,想要通过笔试的小伙伴可以每天坚持刷两道算法题。 接下来,每天我将更新LeetCode面试经典150题的其中两道算法题,一边巩固自己,一遍希望能帮助到有需要的小伙伴。 88.合并两个有序数组 给你两个…