论文笔记与实战:对比学习方法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. 工作流程
- 首先用encoder-q初始化encoder-k
- 输入图片x,x经过augmentation生成k+,x通过encoder-q生成特征向量query,k+通过encoder-k生成特征向量k0,query和k0构成一个正样本对,query和dictionary里的其他key都是负样本对
- 引入InfoNCE,计算loss,这里相当于对query作n+1分类,n为字典的大小,现在要做的就是把query分为第0类
- 计算梯度去更新encoder-q,用动量更新的方法去更新encoder-k;同时用最新的k0去更新dictionary
3.3 (伪)代码分析
4. 其他一些问题
- 对于negative样本,应该使用哪个编码器?
应该使用和positive一样的编码器,因为positive和negative样本都是相对于anchor而言,为了保持特征的一致性,应该让negative和positive样本使用同一个(或者相似的)编码器 - 为什么要使用队列当作字典?
字典的作用是用来存储负样本,且要求字典要足够大,如果将这么多的负样本都导入计算机中,显存是吃不消的。使用队列当作字典的好处是,可以让字典足够大,且让字典的size和batch_size剥离开。 - 什么是代理任务pretext tasks?
定义规则,规定什么是正样本、负样本。代理任务的作用就是去生成一个自监督的信号,从而去充当ground_truth这个标签信息。 - 选择的损失函数应该满足什么条件?
(1)当选择的q和positive k+相似的时候,loss应该尽可能小
(2)当选择的q和negative k不相似的时候,loss也应该尽可能小 - 什么是noise contrastive estimation
对于对比学习来说,一张图片就是一个类别,当类别很多的时候,没法算softmax(没法算loss),NCE把问题简化为二分类问题,一个是数据类别,一个是噪声类别,每次拿两者做对比就行。estimation的意思是,从负样本中抽样一些数据去做计算(估计),而不是用所有的负样本。抽样的样本越多,与使用整个数据集的结果更相似,所以MOCO强调这个字典要够大。
NCE loss就是把多分类问题变成二分类的问题,这样就可以继续使用softmax去计算。 - 什么是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 (伪)代码分析 4. 其他一些问题5. MOCO v2和MOCO v35.1…...

大数据Doris(三十八):Spark Load 导入Hive数据
文章目录 Spark Load 导入Hive数据 一、Spark Load导入Hive非分区表数据 1、在node3hive客户端,准备向Hive表加载的数据 2、启动Hive,在Hive客户端创建Hive表并加载数据 3、在Doris中创建Hive外部表 4、创建Doris表 5、创建Spark Load导入任务 6…...

【Prometheus】mysqld_exporter采集+Grafana出图+AlertManager预警
前提环境:已经安装和配置好prometheus server 所有组件对应的版本: 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 函数如下所示: y i exp ( x i ) ∑ j 1 n exp ( x j ) y_{i} \frac{\exp(x_{i})}{\sum_{j1}^{n}{\exp(x_j)}} yi∑j1nexp(xj)exp(xi) softmax求导如下: i j…...
【SpringMVC】拦截器和过滤器之间的区别
过滤器 拦截器 调用机制 基于函数的回调 基于反射机制(动态代理) 依赖关系 依赖Servlet容器 不依赖Servlet容器 作用范围 对几乎所有的请求起作用 只对action请求起作用 访问范围 不能访问action上下文、栈 可以访问action上下文、栈 action生命周期 中的调用次数…...

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

【python】—— python的基本介绍并附安装教程
前言: 今天,我将给大家讲解关于python的基本知识,让大家对其有个基本的认识并且附上相应的安装教程以供大家参考。接下来,我们正式进入今天的文章!!! 目录 前言 (一)P…...

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

什么,你还在用 momentJs 处理相对时间
我想,下面这段代码,你是不是在开发中常常这样使用来计算距离现在过去了多长时间: 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年 全国乙卷 适用地区:河南、江西、甘肃、青海、内蒙古、宁夏、新疆、陕西 吹灭别人的灯,并不会让自己更加光明;阻挡别人的路,也不会让自己行得更远。 “一花独放不是春,百花齐放春满园。”如果世界上只有一种花朵…...

java版本工程项目管理系统平台源码,助力工程企业实现数字化管理
鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展,企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性,公司对内部工程管…...

代码随想录第55天
1.判断子序列: 动态规划五部曲分析如下: 确定dp数组(dp table)以及下标的含义 dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为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代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

自学黑客【网络安全】,一般人我劝你还是算了吧
一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员(以编程为基础的学习)再开始学习 我在之前的回答中,我都一再强调不要以编程为基础再开始学习网络安全,一般来说,学习编程不但学习周期长,而…...
编程中的心理策略:如何从错误中学习并实现自我成长
在日复一日的工作中,我们免不了会产生一些失误,会因此感到沮丧和失望。但如何正确地对待和处理这些失误才是最重要的,它直接影响到我们的工作表现和个人成长。 一、面对失误而带来的指责和沮丧的策略 在程序设计领域,我们经常面临…...

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流控,Consu…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...

如何在Windows本机安装Python并确保与Python.NET兼容
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...