对比学习)
目录
概念
数据增强
损失函数
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 还可以对数据进行清洗、加工和整理…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...