MOCO----Momentum Contrast

news2024/10/3 8:30:54

对比学习

这个博客写的很好,去看他的吧

对比学习是一种在高维(即指图片)的连续的输入信号上去构建字典的一种方式,这个字典是动态,因为这个字典里的key都是随机去取样的,而且用来给这些key做编码的也是在训练过程中不停地改变的。

如果要想学一个好的特征,这个字典必须有两个特性:1.字典要够大,因为大的字典能够包含很多语义丰富的负样本从而有助于学到那些更有判别性的特征,2.一致性:是为了模型的训练,能避免他学到一些trivial solution,就是一些捷径解。基于这些研究动机提出来momentum contrast

为什么要用queue来表示字典呢?

主要是受限于显卡的内存,把字典的大小和每次forward的batchSize大小剥离开。就是队列可以很大,队列可以很大,但是每次更新这个队列的时候是一点一点进行的;当我们用一个很小的batchSize的时候,现在这个batch抽得的特征进入队列,然后把最老的那个mini-batch移除队列,这样就把训练时用的Mini-batch的大小和队列的大小分开了。所以最后的队列的大小或字典的大小可以设置的非常大,因为它里面大部分的元素都不是每个iteration都需要更新的

如果只有一小部分,也就是说当前的batch是从当前的编码器得到的,而之前的key都是用不同时刻的编码器去抽取的特征,那就会产生编码不一致,可能是因为1个batch后会对编码器进行更新

改进:Momentum encoder

θ k θ_{k} θk 刚开始是由 θ q θ_{q} θq 初始化得来的,但是在模型训练的过程中,如果我们选择了一个很大的动量,那这个动量编码器 θ k θ_{k} θk 其实是更新的 非常缓慢的,它不会跟着这个 θ q θ_{q} θq 去快速的改变,从而保证这个字典里的所有的 k k k 都是由相似的编码器抽取得到的,尽最大可能的保持了他们之间的一致性,即编码器不能更新的太快,因为更新的太快的话,编码出来的相邻的 batch 之间的结果就很不一样。有点像模板变化太大不,那做出来的东西也不一样的,评判标准怎么定?

所以 MoCo 这个方法可以构建一个又大又一致的字典从而去无监督地学习视觉表征
在这里插入图片描述
设置 m=0.99

在这里插入图片描述
这一整个队列就是一个字典,里面的元素就是我们放进去的那些key,在模型训练的过程中,每一个mini-batch就会有新的一批key被送进来,同时也会有一批老的key移出去。所以作者说用队列的好处就是可以让我们重复用那些已经编码好的key,而这些key是从之前的mini-batch得到的。比如上图中的从左往右数的第2个batch里的key就是之前已经编码好送进来的,这样使用了字典后就可以把字典的大小和mini-batch的大小解耦,那我们在模型训练的过程中就可以使用一个标准的 mini-batchSize,一般就是128,256,而字典的大小就可以非常大,字典的大小非常灵活,字典的大小也可以当做一个超参数来单独设置,这个字典一直都是所有数据的一个子集,因为之前说到,想算对比学习的这个目标函数只是取一个近似,而不是在整个数据集上去算一个loss,而且使用队列这个数据结构可以让维护这个字典的计算开销非常小,字典的大小从几百到上万,整体的训练时间实际上是不变的,而且队列有先进先出的特性,这样每次移除队列的都是那些最老的batch,这样对于对比学习来说是很有利的,因为从一致性的角度来说,最早计算的那些batch的key是最早过时的,也就是说和最新算的batch的key是最不一致的。

在这里插入图片描述

因为队列太大了,所以无法给队列中的所有元素进行梯度回传,即key的编码器无法通过反向传播的方式去更新他的参数,那怎么办呢?总不能query编码器那边的那个fq一直在更新吧,但是你这边key的编码器就一直不动?作者提出了一个简单的方法,就是在每个iteration结束后,把更新好的编码器参数fq直接复制过来给这个key的编码器fk就行了,但是这样的效果并不好,作者认为可能是因为一个快速改变的编码器降低了这个队列里所有key的这个特征的一致性

假设batch=1,则k1,k2,k3,k4,k5这些key都是由不同的编码器产生的,那这样一个快速改变的编码器就会降低所有key之间的一致性,所以提出了一个动量更新的方式来解决这个问题
在这里插入图片描述

− l o g e x p ( Z x ) ∑ i = 1 K e x p ( Z i ) -log\frac{exp(Z_{x})}{\overset{K}{\underset{i=1}{\sum}} exp(Z_{i})} logi=1Kexp(Zi)exp(Zx)

上面为softmax loss,也就是交叉熵损失函数
但是这在对比学习中并不适用,因为对比学习中Queue中的每个单独的个体就是一个类,K会变得非常大,类别太多,无法计算softmax和 loss func.

所以就产生了NCE Loss, noise contrastive estimation

NCE

NCE是将Queue中的数据简化为两个类别:data sample, noise sample, 每次只拿数据样本和噪声样本做对比即可,就是说可以把Queue中所有的负样本都当做noise sample, 而Queue中唯一的正样本当做data sample, 那实际上noise constractive解决了类别多的问题,但是计算复杂度没有降下来。
所以可以取近似,与其在整个数据集上计算loss, 不如从这个数据集中选取一些负样本来计算loss即可,这也就是estimation的含义,它只是一个估计,一种近似。

要求: 选取的样本不能太少,不然的话会没有那么近似。所以选取的样本要比较大,这样采样才更贴合实际。这也就是MoCo希望字典能够足够大的原因,因为越大的字典就能提供一个越好的近似

NCE就是把一些超级多类的分类问题,变成一系列的二分类问题,从而还可以使用softmax

InfoNCE:

是NCE一个简单的变体,即如果只把问题看做一个二分类,就只有data sample和noise sample的话可能对模型的学习不那么友好,也就是说负样本里面很有可能是正样本,所以还是把它看做一个多分类问题比较合理

L q = − log ⁡ exp ⁡ ( q ⋅ k + τ ) ∑ i = 0 K exp ⁡ ( q ⋅ k i / τ ) \mathcal{L}_{q}=-\log \frac{\exp \left(\frac{q \cdot k_{+} }{\tau}\right)}{\sum_{i=0}^{K} \exp \left(q \cdot k_{i} / \tau\right)} Lq=logi=0Kexp(qki/τ)exp(τqk+)

其中: q q q k k k都是模型出来的 l o g i t logit logit

τ \tau τ 是一个温度的超参数,一般用来控制分布的形状,比如说:原来的 logit分布大概如Fig1所示:
在这里插入图片描述

这样, τ \tau τ 变大的话,也就是 1 τ \frac{1}{\tau} τ1 变小了,相当于把这个分布里的数值都变小了,加上exp后就变得更小了,最后就会使分布变得更平滑,如Fig2所示。

τ \tau τ 变小的话,也就是 1 τ \frac{1}{\tau} τ1 变大了,相当于把这个分布里的数值都变大了,加上exp后就变得更大了,最后就会使分布变得更集中,也就是更peak, 更瘦,即Fig1所示。

如果温度设的越大,那对比损失对所有的负样本都一视同仁,导致模型的学习没有轻重;如果温度的值设的过小,又会让模型只关注那些特别特别困难的样本,而那些负样本很有可能是潜在的正样本,如果过渡关注特别困难的负样本,会导致模型很难收敛或者学好的特征不容易泛化。

其实温度这个超参数就是一个标量,如果忽略不看的话,InfoNCE其实就是cross entropy,做的就是一个K+1类的分类任务。(因为K个负样本,1个正样本)

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

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

相关文章

程序环境和预处理

文章目录1.程序的翻译环境和执行环境2.详解编译 链接2.1 翻译环境2.3 运行环境3.预处理详解3.1 预定义符号3.2 #define3.3 宏和函数对比3.4 #undef3.5 条件编译1.程序的翻译环境和执行环境 在ANSI C的任何一种实现中,存在两个不同的环境。 第一种是翻译环境&#…

AlexNet网络详解

目录:AlexNet网络详解一、背景二、模型结构三、网络的参数配置四、每一层作详细的分析一、背景 2012年,Alex Krizhevsky等人在多伦多大学的实验室设计出了一个深层的卷积神经网络AlexNet,夺得了2012年ImageNet LSVRC的冠军,且准确…

Redis学习(1)—— 下载、安装、启动服务、连接redis服务

Redis是基于内存的数据结构存储系统,可以作为数据库、缓存、任务队列、消息队列、分布式锁 Redis是key-value数据库,非关系型数据库 一. Windows 1. 下载 下载地址:https://github.com/microsoftarchive/redis/releases 2. 安装 直接…

UNet - unet网络

目录 1. u-net介绍 2. u-net网络结构 3. u-net 网络搭建 3.1 DoubleConv 3.2 Down 下采样 3.3 Up 上采样 3.4 网络输出 3.5 UNet 网络 UNet 网络 forward 前向传播 3.6 网络的参数 4. 完整代码 1. u-net介绍 Unet网络是医学图像分割领域常用的分割网络&#xff0…

软件测试找bug小技巧总结,从初级跨入中级测试......

目录:导读前言一、必备知识二、定位技巧三、常用小技巧方法1、分析问题场景进行预判2、关注请求体的状态码3、关注请求的入参与响应数据4、查看日志5、经验法则四、总结前言 测试工作 测试的过程就是一个寻找影响产品功能和用户体验bug的过程,测试人员发…

C++之多态详解

文章目录前言一、多态的概念概念二、多态的定义及实现1.多态的构成条件2.虚函数3.虚函数的重写3.1多态条件探究(1)多态条件探究一:不符合重写 -- virtual函数(2)多态条件探究二:不符合重写 -- 不是父类的指针或者引用调用(3)多态条件探究三:不符合重写 -- 参数不同(4)多态条件探…

Vue3 - ref 基本类型(通俗易懂,详细教程)

简介 它是 Vue3 提供的一个用于创建基本数据类型的函数,能将普通的数据包装为响应式。 大白话说,就是咱们要创建一个响应式变量,需要通过这玩意才行! 回忆 Vue2 不理解没关系啊,我们先来回顾一下 Vue2 中是如何做到的…

MaxViT: Multi-Axis Vision Transformer

论文:https://arxiv.org/abs/2204.01697 代码地址:https://github.com/google-research/maxvit 在本文中,介绍了一种高效且可扩展的注意力模型,称之为多轴注意力,该模型由两个方面组成:分块的局部注意力和…

开源作品:引流宝!集活码、短网址等功能为一体的工具!致力于提高引流效率,减少资源流失!

前言 开发这款工具的初衷是为了辅助自己的工作,提供自己日常工作的效率,自己使用了一段时间下来觉得很有用,于是完善之后开源。如今已经开源近2年,第一个版本是在2020年9月份开源,收获了390个star,后来持续…

用ue4怎么制作一个物体故障闪烁的特效

这是一篇关于电子标牌出现故障时可以使用的毛刺效应的文章。本文将其分解为两个简单的效果,将使用 GIF 来解释它们。 噪音效果 第一个组合是噪音效果。 在 Component Mask 中指定 G 矢量并在 Sine 和 Ceil 中调整 G 值。要将线条更改为水平移动,请在 …

操作系统4小时速成:操作系统的基本概念,它是系统软件,管理处理机、存储器、io设备、文件,并发和共享是最基本特征,还有虚拟和异步

操作系统4小时速成:操作系统的基本概念,它是系统软件,管理处理机、存储器、io设备、文件,并发和共享是最基本特征,还有虚拟和异步 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招…

二叉树的存储结构

引言: 对于二叉树的存储,我们可以采取顺序存储和链式存储结构 顺序存储结构 ● 按编号次序存储节点 • 对树中每个节点进行编号 • 其编号从小到大的顺序就是节点在连续存储单元的先后次序。 我们是从编号为1开始,为了保持数组位序和编号保持…

EMS Advanced Data Import高级数据导入选项Crack版

EMS Advanced Data Import高级数据导入选项Crack版 EMS Advanced Data Import是Dolphi和CBuilder应用。允许您一次以著名的MS Excel、MS Access、DBF、XML、TXT、CSV、ODF和HTML格式输入数据文件。 EMS高级数据导入选项: 导入流行格式信息:S Excel 97-20…

什么是shuffle?shuffle的原理及过程

目录 一、什么是shuffle 二、为什么要引入shuffle,有哪些影响 三、shuffle的工作原理 1、shuffle的阶段 2、shuffle的中间文件 3、Shuffle Write 4、Shuffle Read 四、总结回顾 一、什么是shuffle 类比分公司的人与物和 Spark 的相关概念是这样对应的&#…

同时看过 unreal4 和 Unity 源代码的人觉得哪个引擎架构更好?

同时看过 unreal4 和 Unity 源代码的人觉得哪个引擎架构更好? UE VS U3D 技术策略上 U3D技术策略是很保守的,发出来的featurelist测试覆盖率无可非议,开发者无需多少新功能的熟悉测试成本。 UE4的技术策略是激进的,发出来的fea…

嵌入式开发学习之--点亮LED灯(上)

在嵌入式学习里,点亮LED灯的地位就如同编程语言学习里的“hello world”,是每个初学者都必须经历的一关,因为点亮了LED灯,至少可以说明几件事: 1.开发环境没问题,包括软件,硬件都没问题。 2.能…

电脑重装系统前怎么备份,重装系统怎么备份数据

有很多用户想把操作系统升级成为Win11的,但是又不知道怎么备份原来的数据,担心升级操作系统后,电脑中的重要数据全部丢失了。电脑重装系统前怎么备份?”这里小编就给我们详细介绍一下吧! 一、升级Windows 11系统要不要…

梯度多云管理技术架构的优势

随着云计算模式的日渐成熟,作为私有云和公有云的混合形态,混合云迎来了爆发期。在混合云的建设过程中,多云管理能力成为关键,梯度多云管理平台是多云时代下的服务管理利器。梯度多云管理平台是对多个公有云、私有云及各种异构资源…

视频声音怎么翻译?这几个办法教你实现视频声音翻译成中文

现如今刷视频已经成为我们的日常生活中不可缺少的一部分了,例如有时我们看到一些有用的教学视频,可能会想要把这些视频保存下来,但有些视频却都是英文的,有些小伙伴可能英语基础不好,查看起来不方便,这个时…

MySQL运算符

算术运算符 算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达式,对数值或表达式进行加()、减(-)、乘(*)、除(/)和取模(%&#…