对比学习)
目录
概念
数据增强
损失函数
NCE(noise contrastive estimation)
Info NCE
CV上的发展
InstDisc
InvaSpread
CPC
CMC
MoCo
simCLR
MoCo v2
SimCLR v2
SwAV
BYOL
SimSiam
MoCo v3
DiNO
概念
通过利用样本之间的相似性和不相似性(正负样本),对比学习使模型能够在潜在空间中将相似的样本紧密联系在一起,不相似的样本分离开,从而获取数据的高阶信息。
举个例子,从imagenet中抽出猫、猫、狗、飞机四张图,那么猫和猫的图片肯定是相似的,和狗不相似。但是和飞机比起来,猫和狗是相似的。所以对比学习就是对比着差异去学习,模型并不需要真的知道图片中代表的是什么,而只需要知道哪些图片是类似的,哪些图片是不一样的就可以了。
训练目的:希望相似数据最终学到的特征是相似的,在特征空间(embedding space)中,特征向量尽量靠近;反之还希望不同的数据学到的特征向量尽量远离。
应用最广的代理任务:instance discrimination.
简单说就是,从一堆图片中调出任意一张图片,将其做一次转换(transformation ,比如随机裁剪等数据增广),得到新的图片
。那么样本
叫做基准点(锚点),
被认为是正样本(虽然看起来有差异,但语义信息不应该发生变化),数据集中其它所有图片都是负样本。
数据增强
往往进行对比学习都会进行数据增强。
1)提供正样本,多个不同版本的正样本可以增加模型的鲁棒性和泛化能力
2)增加负样本的数量。数据量越大,模型越复杂,模型能够吸收的知识越多,对下游任务效果来说越好。
数据增强(Data Augmentation) - 知乎(图像)
NLP中数据增强的综述,快速的生成大量的训练数据
损失函数
NCE(noise contrastive estimation)
(基于信息论)核心思想是将多分类问题转化成二分类问题,一个类是数据类别 data sample,另一个类是噪声类别 noisy sample,通过学习数据样本和噪声样本之间的区别,将数据样本去和噪声样本做对比,也就是噪声对比(noise contrastive),从而发现数据中的一些特性。
(交叉熵行不通:以ImageNet举例,在对比学习中,每个图片样本就是单独一类,那k就是128万类,使用softmax计算量非常大)
(一个正样本,k个负样本)
Info NCE
NCE的变体,其实就是一个cross-entropy loss。相较于NCE,还是将其看做是多分类的问题,只不过这里的K是从负样本中采样的数量,而不是全部的数量。

温度系数的作用:
1) 设的越大,logits分布里的数值都变小,且经过指数运算之后,就变得更小了,导致原来的logits分布变得更平滑。那么对比损失会对所有的负样本一视同仁,导致模型学习没有轻重。
2) 设的越小,所有的情况就会相反,logits分布的数值变大,使得这个分布变得更集中,更peak。模型会越关注特别困难的负样本(距离和正样本较近,但被模型误认为是负样本的样本。其实那些负样本很可能是潜在的正样本),这样会导致模型很难收敛或者泛化能力差。
CV上的发展
对比学习论文综述【论文精读】_哔哩哔哩_bilibili
InstDisc
判别式模型。受有监督学习的启发,比如给出一张豹子的图片,用一个训练好的分类器进行预测,会发现,预测分数前几的都是豹子的种类,而分数低的都是一些其他不相关的图片。因此,作者提出这些相似的图片被分到一起不是因为拥有相似的语义标签,而是这些图片长得非常的相似,所以被预测的豹子图片的预测结果中前几的都是豹子的种类,而不是其他什么图片。

因此作者提出了个体判别的任务,我们将每张图片实例都看做事一个类别,目标就是学习一种特征,能将每一张图片都区分开来。正样本就是样本本身,用一个memoryBank存储负样本,然后用NCE loss更新对比函数。然后将更新的特征替换到memoryBank中原来的样本特征。

InvaSpread
与InstDisc类似,不过不用memoryBank存储负样本,是端到端的学习。假设选取的batch中有N的样本,对batch中的每个样本进行数据增强后有2N个样本,对于其中某个样本而言,将数据增强的样本作为正样本,个数为1,batch中的其他图片作为负样本,个数是2×(N-1)。缺点:负样本不够多。

CPC
生成式模型,用预测的代理任务做对比学习。假设有一个连续的序列,将某段通过一个编码器获得一些特征,然后将这些特征送入自回归模型,最后获得context representation(上下文的一个特征表示)。如果这个上下文特征足够好,那么就应该可以做出一些预测,去预测未来时刻的一些...未来时刻的特征输出。
对比学习的体现:正样本:未来的输入通过编码器获得的未来时刻的特征输出...。可以理解为预测的Predictions只是一个query,真正的未来时刻的输出是由原本的输入决定的。因此,真正的
...是Predictions的正样本。负样本:定义很广泛,比如可以任意选取一段输入经过编码器得到一段输出,这段输出应该跟Predictions是不相似的。

CMC
摘要:人观察世界是通过多个传感器的,比如眼睛,耳朵等等,都充当着不同的传感器给大脑提供信号,但是每个视角都是有噪声的,并且可能是不完整的,但是这些不同传感器获取的最重要的那些信息是在这些视角中共享的。例如,一只狗,我们可以看到,也可以听到。因此作者提出:学习一种强大的特征,具有视角的不变形。意思就是不管从哪个视角去看,都能发现这只狗。所以CMC的目的就是增大不同视角相同内容之间的互信息。
正样本:来自不同视角的相同图片;负样本:其他的图片。这里来自不同视角可以转换为不同模态。

CMC是一个比较早的工作做多视角对比学习,证明了对比学习的灵活性,并且证明了多视角/多模态的可行性。所以接下来openai很快就提出了CLIP模型,有一个图片,和描述这个图片的文本,那么图像和文本就可以当做是一个正样本对,然后做多模态的对比学习。
CMC的原班人马用对比学习的思想做了一篇蒸馏的工作,不论用什么网络,如果输入是同一张图片,那么输出的特征就应该尽可能的类似。也就是说想让teacher模型的输出和student模型的输出更可能的相似,此时,这两个输出就可以作为一个正样本对,从而做对比学习。
局限性:处理不同模态可能就需要不同的编码器,计算代价可能就会很高。用transformer可以同时处理多个模态的数据(maclip:用一个transformer处理两个输入模态)。
MoCo
主要贡献:把之前的一些对比学习方法归纳总结为字典查询的问题。
提出两个东西:队列和动量编码器,从而形成一个又大又一致的字典,从而帮助更好的对比学习。
MoCo和InstDisc是非常的相似的,MoCo用队列取代了原来的MemoryBank,作为一个额外的数据结构存储负样本;用动量编码器取代了loss中的约束项,从而达到动量更新编码器的目的,而不是动量的更新特征,从而达到更好的结果。

损失:

simCLR
对一个图片做不同的数据增强,就会得到不同的图片。正样本:所有该样本数据增强后的样本。负样本:该batch中其他样本及其数据增强后的所有样本。和InvaSpread中是一样的。将样本通过编码器f,最重大的创新点是在编码后添加了project函数,其实就是一层MLP,但使结果提升了10%,然后就是对比学习。细节贡献:1)更多的数据增强更好,2)非线性变换MLP的提出,3)更大的batch-szie

MoCo v2
(技术报告)MoCo+SimCLR。MoCo v1 + MLP + 数据增强 + 训练的时候使用cosine Learning rate schedule + 更长的epoch。
SimCLR v2
大的自监督模型可以很好做半监督学习。SimCLR v2:在SimCLR的基础上+更大的ResNet模型 + 两层的MLP + 动量编码器。(重)如何做半监督:

SwAV
对比学习+聚类(无监督,相似的目标)。给定同一张图片,如果我们有多个视角的特征,我们可以用一个视角的特征去预测另一个视角得到的特征。swapped prediction。普通的对比学习如图左所示,而SwAV如右图所示,添加了一个C即Cluster,是一个D×K的矩阵,D是维度,和Z特征的维度是一样的,K是聚类中心的个数。然后将Z与C进行点乘,生成一个目标Q,可以将Q作为一个ground truth。对于来自同一张图片数据增强的样本,那么计算出来的Q应该也是相似的,因此,我们可以用Z1·C可以去预测Q2,反之亦然,此时Q1就可以作为ground truth。Q有什么意义
其实这里Q的作用和普通对比学习中的Z的作用是相同的,添加聚类的好处:1)一般情况下,进行对比学习,我们可能需要成千上万个负样本,但是添加了聚类之后,我们是对聚类中心做对比,最多用3000个聚类中心就可以表示了。2)用聚类中心去对比,是有具体含义的,之前只是随机抽样负样本,其中的负样本有可能还是正样的,类别可能也不均衡,不如使用聚类中心有效。
deep Cluster->deep cluster 2->SwAV
Multi-Crop:裁剪更多的图片(全局特征->局部的特征)

最小化互信息(合适的视角信息)
不用负样本:
BYOL
在对比学习中,负样本是一个约束。如果在算目标函数的时候,只有正样本,那么目的就是让所有相似的样本的特征更加的相似。ex:给一个模型同样的输入,那么模型给出同样的输出。
与普通的不同的是,在projection之后,原来的会直接利用两个样本特征,让他们尽可能的接近,达到maximum agreement。但BYOL对于zθ来说,继续经过了一个qθ,qθ的网络结构和gθ是一样的,然后获得了新的特征qθ(zθ),想要用这个预测跟Zξ更可能的一致,将匹配的问题转化为预测的问题,和SaWV的方式是类似的,但SaWV也是借用了一个预测中心做预测任务,BYOL直接利用自己预测自己(用一个视角的特征去预测另一个视角的特征)。上面紫色部分可以看做一个query编码器,下面部分看做key的编码器。key编码器都是query编码器的这个动量更新。loss直接用mean squared error计算。
MLP中的batch norm,如果不添加,可能会导致模型坍塌。batch norm计算了batch的均值和方差,然后再进行归一化,在算loss的时候其实不光是自己样本的特征,其实也学习到了其他样本的特征,所以其实是有信息泄露的,所以可以把batch中的其他样本想成一个隐式的负样本,这里正样本跟一个平均样本去比较,类似与SwAV,相当于是利用聚类中心。(作者解释了)
SimSiam
以前的工作看起来是一点一点堆叠起来的,比如project,数据增强,动量编码器等等,这样难以分析每个点到底带来了那些贡献。因此提出了SimSiam,不需要负样本,不需要大的batch size,不需要动量编码器。
孪生网络:encoder是一样的,并且共享参数。与BYOL不一样的唯一不一样的就是没有用动量编码器。作者提出:之所以SimSiam能够成功训练,没有模型坍塌,是因为有stop gradient这个操作存在。


transformer:
MoCo v3
如何提高自监督的vit(Vision Transformer)的稳定性。架构:MoCo v2+projection+prediction(Transformer+自监督)。将batch projection冻住

DiNO

相关文章:
对比学习)
目录 概念 数据增强 损失函数 NCE(noise contrastive estimation) Info NCE CV上的发展 InstDisc InvaSpread CPC CMC MoCo simCLR MoCo v2 SimCLR v2 SwAV BYOL SimSiam MoCo v3 DiNO 概念 通过利用样本之间的相似性和不相似性&…...
第十六届蓝桥杯嵌入式真题
蓝桥杯嵌入式第十二届省赛真题二 蓝桥杯嵌入式第十三届省赛真题一 蓝桥杯嵌入式第十三届省赛真题二 蓝桥杯嵌入式第十四届省赛真题 蓝桥杯嵌入式第十四届模拟考试一 蓝桥杯嵌入式第十四届模拟考试二 蓝桥杯嵌入式第十五届模拟考试一 蓝桥杯嵌入式第十五届模拟考试二 蓝…...
音频转码常用命令
1.转码为wav8k16bit -v提高音量 pitch调高音调 speed调整语速 sox -v 2.0 input.wav -r 8000 output.wav pitch 50 speed 1.05 sox input.wav -r 8000 output.wav 只是转码,不提高音调语速 压缩文件:zip -r filename.zip file1 file2 file3 2.批量转…...
INNER JOIN、LEFT JOIN 和 RIGHT JOIN有什么区别?什么是自连接?
INNER JOIN、LEFT JOIN 和 RIGHT JOIN 都是多表连接的不同方式,它们的主要区别在于它们如何处理表之间不匹配的数据。下面分别介绍它们的区别。 目录 一.多表连接查询 INNER JOIN(内连接) LEFT JOIN(左连接) RIGHT…...
原型模式具体和直接调用构造函数创建实例的区别
原型模式与直接调用构造函数创建实例的区别主要在于创建对象的方式和使用场景。让我们一步一步来理解。 直接调用构造函数创建实例 这是我们通常使用的创建对象的方法。通过调用类的构造函数,传入必要的参数来初始化对象。每次都要通过构造函数为对象设置所有初始值…...
MySQL 数据备份与恢复指南
本文将介绍如何通过命令行对 MySQL 数据库进行备份与恢复操作,适用于日常开发和生产环境中的数据管理需求。 1. MySQL 数据备份 MySQL 提供了 mysqldump 工具来执行数据库的备份操作,可以备份单个数据库、多个数据库或整个数据库实例。 1.1 备份单个数…...
NGINX 保护 Web 应用安全之基于 IP 地址的访问
根据客户端的 IP 地址控制访问 使用 HTTP 或 stream 访问模块控制对受保护资源的访问: location /admin/ { deny 10.0.0.1; allow 10.0.0.0/20; allow 2001:0db8::/32; deny all; } } 给定的 location 代码块允许来自 10.0.0.0/20 中的任何 IPv4 地址访问…...
数据结构——顺序表的基本操作
前言 介绍 🍃数据结构专区:数据结构 参考 该部分知识参考于《数据结构(C语言版 第2版)》24~28页 补充 此处的顺序表创建是课本中采用了定义方法为SqList Q来创建,并没有使用顺序表指针的方法,具体两个…...
智能去毛刺:2D视觉引导机器人如何重塑制造业未来
机器人技术已经深入到各个工业领域中,为制造业带来了前所未有的变革。其中,2D视觉引导机器人技术以其精准、高效的特点,在去毛刺工艺中发挥着越来越重要的作用。本文将为您介绍2D视觉引导机器人技术的基本原理及其在去毛刺工艺中的应用&#…...
计算机系统的层次
目录 计算机系统的层次ISA(指令集体系结构) 计算机系统的层次 计算机硬件是基础指令集体系结构:将硬件的功能封装从指令供软件使用操作系统:提供人机交互界面、提供服务功能的内核例程语言处理系统: 语言处理程序&…...
一起搭WPF架构之LiveCharts.Wpf的简单了解与安装
一起搭WPF架构之LiveCharts.Wpf的简单了解与安装 前言LiveCharts.Wpf介绍LiveCharts.Wpf的安装总结 前言 根据项目需求,我单独留了一个界面用于进行数据分析。数据分析的内容考虑是采用图表的形式将SQLite数据库中存储的数据进行绘制成图,以便数据分析。…...
深度学习杂乱知识
阿达玛乘积(Hadamard Product)详解 1. 定义: 阿达玛乘积(Hadamard Product),又称为元素乘积或逐元素乘积,是指对两个维度相同的矩阵进行逐元素相乘的操作。 假设我们有两个维度相同的矩阵 ( …...
本地编译运行Thingsboard-gateway之python版本——modbus数据采集
1、ideal 我用的是2020版本,这个关系不大,随便 Thingsboard-gateway之python版本源码拉取(老版本是java写的,新版都是python写的) 地址:git clone https://github.com/thingsboard/thingsboard-gateway.git…...
京东笔试题
和谐敏感词 🔗 题目地址 🎉 模拟 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();String s scanner.next();String[] words new String[…...
URP学习(一)
URP是unity出的比较简单的可供改造引擎渲染管线的流程。能实现用较低的代价消耗实现较好的效果。 现记录学习: 一.如何设置URP关键 这步结束后材质会被替换 加package Create/Rendering/URP Universal Rendering Setting设置为urp 材质也需要urp目录下的 几种…...
Linux中修改和查看Redis的内存大小
目录 一:修改redis内存大小1. 编辑配置文件2. 在命令行修改 二:查看redis内存大小1. get maxmemory2. info memory 一:修改redis内存大小 1. 编辑配置文件 sudo vim /etc/redis/redis.conf maxmemory 300MB1、Redis可用内存大小只能是整数&…...
uniapp中的页面跳转
1. uni.navigateTo用于跳转到应用内的某个非tabBar页面,并且会保留当前页面,将其推入页面栈中。 uni.navigateTo({url: path/to/page // 替换为你要跳转的页面路径 }); 2. uni.redirectTo 用于关闭当前页面,重定向到应用内的某个非tabBar页面…...
Redis|延迟双删策略的优点和缺点是什么?
延迟双删策略是什么? 延迟双删策略是一种保证缓存与数据库数据一致性的方法,特别适用于高并发场景下的缓存更新。其核心思想是:在更新数据库时,不仅删除一次缓存,还在短时间后再进行一次延迟删除,以避免并…...
【计算机网络 - 基础问题】每日 3 题(五十二)
✍个人博客:https://blog.csdn.net/Newin2020?typeblog 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞…...
LogStash架构分析
一、什么是LogStash LogStash 是一个类似实时流水线的开源数据传输引擎,它像一个两头连接不同数据源的数据传输管道,将数据实时地从一个数据源传输到另一个数据源中。在数据传输的过程中,LogStash 还可以对数据进行清洗、加工和整理…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
