当前位置: 首页 > 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…...

ChatTTS 入门指南:从零开始构建你的第一个语音对话应用

最近在做一个需要语音交互的小项目&#xff0c;选型时发现了 ChatTTS 这个工具&#xff0c;感觉挺有意思的。它不像一些大厂的 TTS 服务那么“重”&#xff0c;更像是一个专为对话场景优化的语音合成工具。如果你是第一次接触&#xff0c;可能会觉得有点无从下手&#xff0c;比…...

告别代码恐惧!用KRobot图形化编程,10分钟搞定Arduino巡线小车(附完整接线图)

零代码玩转Arduino巡线小车&#xff1a;KRobot图形化编程全攻略 第一次接触Arduino时&#xff0c;看到满屏的C代码是不是头皮发麻&#xff1f;作为教育工作者或创客爱好者&#xff0c;你可能更希望把时间花在创意实现上&#xff0c;而不是纠结于语法错误。现在&#xff0c;通过…...

Mac环境OpenClaw排错大全:Qwen3.5-4B-Claude接口连接问题

Mac环境OpenClaw排错大全&#xff1a;Qwen3.5-4B-Claude接口连接问题 1. 开篇&#xff1a;为什么需要这份排错指南 上周我在自己的M1 MacBook Pro上部署OpenClaw时&#xff0c;遇到了至少五种不同的报错。从npm权限问题到模型响应超时&#xff0c;每个错误都让我花费数小时搜…...

N_m3u8DL-RE:现代流媒体下载的终极解决方案

N_m3u8DL-RE&#xff1a;现代流媒体下载的终极解决方案 【免费下载链接】N_m3u8DL-RE 跨平台、现代且功能强大的流媒体下载器&#xff0c;支持MPD/M3U8/ISM格式。支持英语、简体中文和繁体中文。 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE 在当今…...

UVM避坑指南:为什么你的sequence卡住了?item_done没调用的常见问题排查

UVM验证中的sequence卡死问题&#xff1a;item_done未调用的深度排查手册 在芯片验证领域&#xff0c;UVM框架的sequence机制堪称验证工程师的"瑞士军刀"&#xff0c;但这把利器偶尔也会出现卡壳的情况。想象一下这样的场景&#xff1a;你的验证环境已经运行了数百个…...

告别.crx文件!手把手教你用crx2rnx工具转换GNSS观测值为RINEX格式(附武汉大学IGS数据下载指南)

从CRX到RINEX&#xff1a;GNSS观测数据转换实战指南 在卫星导航定位领域&#xff0c;RINEX&#xff08;Receiver Independent Exchange Format&#xff09;作为国际通用的标准数据格式&#xff0c;几乎成为所有GNSS数据处理软件的"通用语言"。然而&#xff0c;许多初…...

RWKV7-1.5B-g1a参数避坑:top_p=0.9在中文任务中易引发事实性错误实测

RWKV7-1.5B-g1a参数避坑&#xff1a;top_p0.9在中文任务中易引发事实性错误实测 1. 模型简介与测试背景 rwkv7-1.5B-g1a是基于RWKV-7架构的多语言文本生成模型&#xff0c;特别适合中文场景下的基础问答、文案续写和简短总结任务。作为一款轻量级模型&#xff0c;它能在单卡2…...

LaTeX参考文献报错全解析:从\citation到\bibdata的避坑指南

LaTeX参考文献报错全解析&#xff1a;从\citation到\bibdata的避坑指南 当你熬夜赶论文时&#xff0c;突然在编译LaTeX文档时看到一串红色报错&#xff1a;"I found no \bibstyle command"、"I found no \bibdata command"、"I found no \citation co…...

【OpenClaw从入门到精通】第46篇:企业“养虾”合规手册——审批备案+专网隔离+全流程管控(2026企业版)

摘要:着OpenClaw在企业场景的广泛应用,合规风险与安全事件频发,启明星辰报告显示60%的安全事件源于缺乏规范管理。本文基于《OpenClaw类智能应用安全指引V0.1》及金融、能源行业头部企业实践,构建“审批-备案-部署-审计”全流程合规框架。核心内容包括四步审批备案流程、专…...

解决MathType在Word中加载失败的终极指南:从运行时错误53到MathPage.WLL缺失

1. 遇到MathType加载失败时先别慌 最近有不少朋友在系统升级后遇到了MathType无法正常加载的问题。作为一个经常和公式打交道的科研狗&#xff0c;我完全理解这种崩溃感——论文deadline近在眼前&#xff0c;公式编辑器却罢工了。最常见的两种报错是&#xff1a;"Please r…...