当前位置: 首页 > news >正文

论文笔记与实战:对比学习方法MOCO

目录

  • 1. 什么是MOCO
  • 2. MOCO是干吗用的
  • 3. MOCO的工作原理
    • 3.1 一些概念
      • 1. 无监督与有监督的区别
      • 2. 什么是对比学习
      • 3. 动量是什么
    • 3.2 MOCO工作原理
      • 1. 字典查找
      • 2. 如何构建一个好的字典
      • 3. 工作流程
    • 3.3 (伪)代码分析
  • 4. 其他一些问题
  • 5. MOCO v2和MOCO v3
    • 5.1 MOCO v2
    • 5.2 MOCO v3
  • 6. 实战部分
    • 6.1 数据
    • 6.2 模型与参数设置
    • 6.3 实验结果

(好久没更新了~~~准备分享一些paper笔记以及在公司分享的内容)
(还是要记录呀,很多东西过段时间再看都有点想不起来了)

1. 什么是MOCO

MOCO: Momentum Contrast for Unsupervised Visual Representation Learning
MOCO是标题前两个单词的首两个字符缩写组成,翻译过来就是动量对比,是一种无监督(或者说是自监督)的方法。
在这里插入图片描述

2. MOCO是干吗用的

从标题也可以看出是为了Unsupervised Visual Representation Learning,为了无监督视觉表征学习。即通过MOCO这种方法,学到有用的特征,可用于下游任务的使用。

3. MOCO的工作原理

3.1 一些概念

1. 无监督与有监督的区别

简单来说,有监督就是有标注信息,有X,有Y;对于无监督来说,只有X,没有Y。

2. 什么是对比学习

假设现在有两张dog的图片,一张cat的图片,首先提取图片的特征,利用提取的特征通过对比学习两张dog图片是同一类别,dog和cat的不同类别。
在这里插入图片描述
对比学习可以是有label的,如上述我们举的例子;也可以是无label的,如MOCO这篇文章所介绍的方法。

3. 动量是什么

在这里插入图片描述
当前时刻的状态,是由上一时刻的状态和当前时刻的更新状态共同得来的。其中α的取值范围是0~1,表示上一时刻的状态和当前时刻的更新状态对当前时刻状态影响的权重。

3.2 MOCO工作原理

1. 字典查找

在这里插入图片描述
无监督对比学习可以看成是一种字典查找的方法,通过构建一个字典,当有一个样本query来了,需要到字典里去匹配查找,query应该与匹配到的key相似,与不匹配的key不相似,通过这种对比的学习去最小化损失。

2. 如何构建一个好的字典

在这里插入图片描述

  • 学习的关键需要构建一个好的字典,好的字典包括两方面特点:
    (1)字典足够大
    学习到足够的差异性。
    (2)保持一致性
    字典里的keys(负样本的fetures)应该来自同一个或者相似的编码器。

  • 三种方法比较
    在这里插入图片描述
    (a)end-to-end
    batch_size和字典的大小一样,但是受显存影响,batch_size一般不会设置太大(通常设置为128或256),字典不够大
    (b)memory bank
    将所有的负样本存储在一个memory bank里,字典够大,但是无法保证特征的一致性
    (c)moco
    利用队列来充当字典,可以保证字典够大;同时利用momentum encoder,保证了特征的一致性

3. 工作流程

在这里插入图片描述

  1. 首先用encoder-q初始化encoder-k
  2. 输入图片x,x经过augmentation生成k+,x通过encoder-q生成特征向量query,k+通过encoder-k生成特征向量k0,query和k0构成一个正样本对,query和dictionary里的其他key都是负样本对
  3. 引入InfoNCE,计算loss,这里相当于对query作n+1分类,n为字典的大小,现在要做的就是把query分为第0类
  4. 计算梯度去更新encoder-q,用动量更新的方法去更新encoder-k;同时用最新的k0去更新dictionary
    在这里插入图片描述

3.3 (伪)代码分析

在这里插入图片描述

4. 其他一些问题

  1. 对于negative样本,应该使用哪个编码器?
    应该使用和positive一样的编码器,因为positive和negative样本都是相对于anchor而言,为了保持特征的一致性,应该让negative和positive样本使用同一个(或者相似的)编码器
  2. 为什么要使用队列当作字典?
    字典的作用是用来存储负样本,且要求字典要足够大,如果将这么多的负样本都导入计算机中,显存是吃不消的。使用队列当作字典的好处是,可以让字典足够大,且让字典的size和batch_size剥离开。
  3. 什么是代理任务pretext tasks?
    定义规则,规定什么是正样本、负样本。代理任务的作用就是去生成一个自监督的信号,从而去充当ground_truth这个标签信息。
  4. 选择的损失函数应该满足什么条件?
    (1)当选择的q和positive k+相似的时候,loss应该尽可能小
    (2)当选择的q和negative k不相似的时候,loss也应该尽可能小
  5. 什么是noise contrastive estimation
    对于对比学习来说,一张图片就是一个类别,当类别很多的时候,没法算softmax(没法算loss),NCE把问题简化为二分类问题,一个是数据类别,一个是噪声类别,每次拿两者做对比就行。estimation的意思是,从负样本中抽样一些数据去做计算(估计),而不是用所有的负样本。抽样的样本越多,与使用整个数据集的结果更相似,所以MOCO强调这个字典要够大。
    NCE loss就是把多分类问题变成二分类的问题,这样就可以继续使用softmax去计算。
  6. 什么是InfoNCE?
    在这里插入图片描述
  • InfoNCE是NCE的一种变体,InfoNCE还是把问题看成是多分类问题。(实际做的是K+1分类任务)
  • 从公式可以看出,InfoNCE loss实际上就是cross entropy loss,不同的是InfoNCE loss中的K是负样本的个数,而cross entropy loss中的K是分类的类别数。
  • 公式中的q·k就是logit,公式中的t是一个温度超参数,一般用来控制分布的形状。
    • t越大,分布里的值变小,整个分布曲线更加扁平;
    • t越小,分布里的值变大,整个分布曲线更加peak;

5. MOCO v2和MOCO v3

5.1 MOCO v2

  • MOCO v2在v1的基础上,增加了以下几个措施:在这里插入图片描述
    (1)在训练阶段,增加了MLP head;推理阶段去掉。
    在这里插入图片描述
    (2) Augmentation
    在这里插入图片描述
    (3)Cosine learning rate schedule
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

5.2 MOCO v3

  • MOCO v3引入了ViT(Vision Transformer)
  • (伪)代码分析
    在这里插入图片描述
  • 计算过程参考CLIP论文所示:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

6. 实战部分

  • 为了验证使用MOCO学习得来的特征是否更好,设计了一个4分类的图像分类实验(不是那么严谨),具体实验设置与结果如下所示:

6.1 数据

在这里插入图片描述

6.2 模型与参数设置

设置了4个模型,分别为resent、moco_resnet、vit、moco_vit,训练50个epochs

6.3 实验结果

  • resnet和moco_resnet
    在这里插入图片描述

在这里插入图片描述

  • vit和moco_vit
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 实验小结
    • 准确率:resnet > moco_resnet50; vit < moco_vit
    • resnet和vit训练曲线振荡的比较厉害;而基于moco的预训练模型,训练曲线更加平滑
    • 该实验只是个初步实验,所用数据较少,且训练的epochs较少,只能用于简单参考
    • 可以看到,基于MOCO对比学习得到预训练模型,在下游分类任务中有一定优势

结束。

相关文章:

论文笔记与实战:对比学习方法MOCO

目录 1. 什么是MOCO2. MOCO是干吗用的3. MOCO的工作原理3.1 一些概念1. 无监督与有监督的区别2. 什么是对比学习3. 动量是什么 3.2 MOCO工作原理1. 字典查找2. 如何构建一个好的字典3. 工作流程 3.3 &#xff08;伪&#xff09;代码分析 4. 其他一些问题5. MOCO v2和MOCO v35.1…...

大数据Doris(三十八):Spark Load 导入Hive数据

文章目录 Spark Load 导入Hive数据 一、Spark Load导入Hive非分区表数据 1、在node3hive客户端&#xff0c;准备向Hive表加载的数据 2、启动Hive&#xff0c;在Hive客户端创建Hive表并加载数据 3、在Doris中创建Hive外部表 4、创建Doris表 5、创建Spark Load导入任务 6…...

【Prometheus】mysqld_exporter采集+Grafana出图+AlertManager预警

前提环境&#xff1a;已经安装和配置好prometheus server 所有组件对应的版本&#xff1a; prometheus-2.44.0 mysqld_exporter-0.14.0 grafana-enterprise-9.1.2-1.x86_64.rpm alertmanager-0.25.0 prometheus-webhook-dingtalk-2.1.0 简介 mysql_exporter是用来收集MysQL或…...

softmax 函数

https://blog.csdn.net/m0_37769093/article/details/107732606 softmax 函数如下所示&#xff1a; y i exp ⁡ ( x i ) ∑ j 1 n exp ⁡ ( x j ) y_{i} \frac{\exp(x_{i})}{\sum_{j1}^{n}{\exp(x_j)}} yi​∑j1n​exp(xj​)exp(xi​)​ softmax求导如下&#xff1a; i j…...

【SpringMVC】拦截器和过滤器之间的区别

过滤器 拦截器 调用机制 基于函数的回调 基于反射机制(动态代理) 依赖关系 依赖Servlet容器 不依赖Servlet容器 作用范围 对几乎所有的请求起作用 只对action请求起作用 访问范围 不能访问action上下文、栈 可以访问action上下文、栈 action生命周期 中的调用次数…...

springboot第25集:实体类定义规则

PO&#xff1a;持久化对象&#xff0c;一个PO对象对应一张表里面的一条记录。全部对应 VO&#xff1a;View视图对象&#xff0c;用来在页面中展示数据的&#xff0c;页面需要哪些字段属性就添加哪些&#xff0c;查询出来之后赋值操作比PO对象要简单。所以提高性能。 DTO&#x…...

【python】—— python的基本介绍并附安装教程

前言&#xff1a; 今天&#xff0c;我将给大家讲解关于python的基本知识&#xff0c;让大家对其有个基本的认识并且附上相应的安装教程以供大家参考。接下来&#xff0c;我们正式进入今天的文章&#xff01;&#xff01;&#xff01; 目录 前言 &#xff08;一&#xff09;P…...

浏览器跨域请求

跨域是浏览器的一种同源策略&#xff0c;所以该概念只存在于通过浏览器访问服务里。 如果缺少了同源策略&#xff0c;则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的&#xff0c;浏览器只是针对同源策略的一种实现 请求的url地址,必须与浏览器上的…...

什么,你还在用 momentJs 处理相对时间

我想&#xff0c;下面这段代码&#xff0c;你是不是在开发中常常这样使用来计算距离现在过去了多长时间&#xff1a; import moment from moment // 61k (gzipped:19.k) function Relative(props) {const timeString moment(props.date).fromNow()return <>{timeString…...

三维模型 工程图

飞机 Crankshaft飞机发动机手动冲压机包装成型机械-充填机械设备10数控等离子切割机床铜线缠绕机机床-磨床08机床-磨床04(附工程图)机床-车床数字纤维缠绕机机械臂液压钳机床-车床06挤出机机械手-09机械手模型库六柴油发动机中央空调机柜空调机机床-钻床三维设计电脑服务器机箱…...

我用ChatGPT写2023高考语文作文(二):全国乙卷

2023年 全国乙卷 适用地区&#xff1a;河南、江西、甘肃、青海、内蒙古、宁夏、新疆、陕西 吹灭别人的灯&#xff0c;并不会让自己更加光明&#xff1b;阻挡别人的路&#xff0c;也不会让自己行得更远。 “一花独放不是春&#xff0c;百花齐放春满园。”如果世界上只有一种花朵…...

java版本工程项目管理系统平台源码,助力工程企业实现数字化管理

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…...

代码随想录第55天

1.判断子序列&#xff1a; 动态规划五部曲分析如下&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j] 表示以下标i-1为结尾的字符串s&#xff0c;和以下标j-1为结尾的字符串t&#xff0c;相同子序列的长度为dp[i][j]。 注意这里是判断s是否…...

算法设计与分析(填空专题)

文章目录 填空题填空题 设有一稀疏图 G,则 G 采用 邻接表 存储较省空间。 算法的时间复杂性是指算法中 元运算 执行次数。 分治法的基本思想是将一个规模为 n 的问题分解为与原问题 相同 的 k 个规模较小且互相独立的子问题。 贪心算法中每次做出的贪心选择都是 当前的 最优选…...

Ubuntu22.04 K8s1.27.2

Ubuntu22.04 && K8s1.27.2 1. 服务器配置 IpServerMEM192.168.56.11k8smaster6G192.168.56.16k8snode14G192.168.56.17k8snode24G 2. 获取源 $ sudo apt-get update $ sudo apt-get install -y apt-transport-https ca-certificates curl# packages.cloud.google.c…...

卡尔曼滤波与组合导航原理(十二)扩展卡尔曼滤波:EKF、二阶EKF、迭代EKF

文章目录 一、多元向量的泰勒级数展开二、扩展Kalman滤波三、二阶滤波四、迭代EKF滤波 一、多元向量的泰勒级数展开 { y 1 f 1 ( X ) f 1 ( x 1 , x 2 , ⋯ x n ) y 2 f 2 ( X ) f 2 ( x 1 , x 2 , ⋯ x n ) ⋮ y m f m ( X ) f m ( x 1 , x 2 , ⋯ x n ) \left\{\begin{…...

基于蒙特卡洛模拟法的电动汽车充电负荷研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

自学黑客【网络安全】,一般人我劝你还是算了吧

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习 我在之前的回答中&#xff0c;我都一再强调不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而…...

编程中的心理策略:如何从错误中学习并实现自我成长

在日复一日的工作中&#xff0c;我们免不了会产生一些失误&#xff0c;会因此感到沮丧和失望。但如何正确地对待和处理这些失误才是最重要的&#xff0c;它直接影响到我们的工作表现和个人成长。 一、面对失误而带来的指责和沮丧的策略 在程序设计领域&#xff0c;我们经常面临…...

Rocket面试(五)Rocketmq发生流量控制的情况有哪些?

在使用rocketmq过程中总能看见一下异常 [TIMEOUT_CLEAN_QUEUE]broker busy, start flow control for a while, period in queue: 206ms, size of queue: 5这是因为Rocketmq出发了流量控制。 触发流量控制就是为了防止Broker压力过大挂掉。主要分为Broker流控&#xff0c;Consu…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...