【无监督学习】1、MOCOv1 | 用于提升无监督学习效果的动量对比学习

news2024/9/22 11:39:27

在这里插入图片描述

文章目录

    • 一、背景
    • 二、方法
      • 2.1 对比学习(字典查表)
      • 2.2 动量对比函数
      • 2.3 Pretext Task
    • 三、效果
      • 3.1 数据集
      • 3.2 训练细节
      • 3.3 实验

论文:Momentum Contrast for Unsupervised Visual Representation Learning

代码:https://github.com/facebookresearch/moco

出处:FAIR | 何凯明 | CVPR2020

时间:2020.03

一、背景

无监督表达学习在自然语言处理方面已经有了很成功的应用,如 GPT 和 BERT,但当时(2020年左右)在计算机视觉中还是监督学习占主流。其主要原因在于两者的特征信号不同,语言任务的数据是在离散数字空间(如单词),但视觉任务的数据是在连续的高维空间。

当时的主流方法是怎么做的:

  • 很多方法使用对比学习 loss 来解决,也就是最小化 contrastive loss
  • 相当于构建一个动态字典,key(token)是从数据(image/patch)中采样的,使用 encoder 提取特征
  • 目标是让编码后的 query 和与其匹配的 key 最为相近,和其他没匹配的 key 都距离很远

作者提出了 MoCo(Momentum Contrast),来构建一个大且连续的字典,用于支持使用 contrastive loss 训练的无监督学习,如图 1 所示

如何建立字典:

  • 将字典看做数据样本的队列
  • 当前 batch 的编码特征入队
  • 最老的 batch 的编码特征出队
  • 这样就将字典的大小和 batch size 的大小解耦了,可以扩大字典的大小

为什么是 momentum contrast:

  • 因为字典的 key 是从前面的 batch 得到的,而非只有当前的 batch 的信息
  • 能够使用对 query emcoder 进行动量移动平均来得到(momentum-based moving average),能够保持连贯性

MOCO 的主要特点:

  • 能够为对比学习建立动态的字典

在这里插入图片描述

二、方法

2.1 对比学习(字典查表)

什么是对比学习:

  • 对比学习的输入是对每张图进行两种不同的变换,即经过不同的数据增强,会得到两种不同的数据 q 和 k,k 不需要使用梯度反传更新参数(是使用 q encoder 参数和历史的 k encoder 参数的加权和来更新的),q 需要使用梯度反传更新参数
  • 对特征 q 来说,总有一个特征 k + k_+ k+ 是其正样本,这个两个特征就是同一张原始图像的两种不同特征而已
  • 对特征 q 来说,同一个 batch 中的其他图像提取到的特征就是负样本
  • 从原理上说,提高对比学习的效果就是提供足够大的 batch 、研究更加有效的预处理方式,使得变换后的两个图像既能保留本质信息,又能尽可能的不一致、增加模型 encoder 的能力

对比学习可以被看做为了字典查表任务训练一个 encoder 的任务:

  • 假设一个 encoded query q q q 和一系列 encoded samples { k 0 , k 1 , k 2 , . . . } \{k_0, k_1, k_2, ...\} {k0,k1,k2,...}(即字典的 key)

  • 假设字典中只有一个 key k + k_+ k+ 是和 q q q 匹配的

  • q q q k + k_+ k+ 非常近似且和其他 key (即 negative key)远离时,contrastive loss 就会很小。

当使用内积来衡量相似程度时,contrastive loss 函数的形式如下,也叫 InfoNCE[46]:

在这里插入图片描述

  • τ \tau τ:温度超参
  • K K K:negative samples 的数量
  • 1 1 1:positive samples 的数量
  • 该函数是一个 log loss

2.2 动量对比函数

作者之所以提出动量对比是因为作者认为使用大的字典能够引入更丰富的负样本,但大的字典中不同 batch 提取特征的模型参数是一直在更新的,这样就难以使用梯度反传的方式来更新 key encoder,之前有些方法使用 query encoder 的参数来当做 key encoder 的参数,但这样就会导致特征不连续。

1、Dictionary as a queue

本文思想的核心在于将字典当做数据的队列,这样就能够对前面 batch 的编码特征进行重复使用,可以将字典大小和 batch 大小解耦开来,字典的大小可以远远大于 batch 的大小,且大小可以设置为可调节的超参数。

字典中的样本可以被逐步的替代,当前 batch 的特征入队,最老的 batch 的特征出队

2、momentum update

使用队列可以使得字典变大,但不同 batch 提取特征的模型参数是一直在更新的,这样就难以使用梯度反传的方式来更新 key encoder,因为需要给队列中的所有 samples 传递梯度。

一个简单的做法是直接从 query encoder 来复制得到 key encoder,但效果不好

作者猜测这不好的效果来源于 encoder 剧烈的变化会降低 key 表达特征的连续性,所以提出了动量更新的方法。

所以,动量 encoder 更新 θ k \theta_k θk 的公式如下:

在这里插入图片描述

  • f k f_k fk:key encoder,参数为 θ k \theta_k θk
  • f q f_q fq:query encoder,参数为 θ q \theta_q θq
  • m ∈ [ 0 , 1 ) m \in [0, 1) m[0,1) 是动量系数
  • 只对 θ q \theta_q θq 使用梯度反传来更新参数
  • θ k \theta_k θk 使用公式 2 进行更新,会使得其更新的更加平滑,尽管 queue 中的 key 是使用不同的 encoder 来编码的(因为是在不同的 batch 中得到的),这些 encoder 的差异也可以变得很小
  • 在实验中,作者使用大的动量(m=0.999)就比小的动量(m=0.9)表现更好,这也说明使用好 queue 的核心就在于 encoder 的变化要缓慢

3、Relations to previous mechanisms

MoCo 和之前两种方法的对比见图 2,主要的差别就在于字典的尺寸和参数更新的一致性。

在这里插入图片描述

  • 图 2a 是端到端的梯度反传方法,使用当前 batch 的特征作为字典的内容,则字典的大小和 batch 的大小是耦合的,会被 GPU 显存限制
  • 图 2b 是 memory bank 方法,memory bank 包括所有 数据集中 sample 的特征表达,每个 batch 的字典是随机采样的,且没有梯度反传,故能支持很大的字典尺寸。但 memory bank 中的样本特征会被更新,也会缺少平稳性

2.3 Pretext Task

pretext task 也叫前置任务或代理任务,也就是该任务不是目标任务,但执行该目标可以更好的执行目标任务,本质就是迁移学习。

参考论文 [61],作者也将来源于同一张图像的 query 和 key 当做一组 positive pair,其他都是 negative pair

query 和 key 都被其各自的 encoder 进行编码 f q f_q fq f k f_k fk,编码器可以是卷积神经网络。

Algorithm 1 展示了 MoCo 的伪代码

在这里插入图片描述

三、效果

3.1 数据集

1、ImageNet-1M(IN-1M)

约有 1.28 million 数据,共 1000 个类别

2、Instagram-1B (IG-1B)

约有 1 billion 数据,来源于 Instagram

3.2 训练细节

优化器:SGD

  • weight decay:0.0001
  • momentum:0.9

IN-1M :

  • batch: IN-1M 使用 256(8 卡训练)
  • 初始学习率:0.03
  • epoch:200,在 120 和 160 时分别乘以 0.1
  • 训练时间:ResNet50 训练时间大约为 53 小时

IG-1B:

  • batch:1024(64卡训练)
  • 学习率:0.12(每 62.5k iter 时降低到 0.9)
  • iter:1.25M
  • 训练时间:ResNet50 训练时间约为 6天

3.3 实验

1、不同 loss 的对比

作者冻结训练好的特征(在 IN-1M 上无监督预训练),在后面接了一个 linear classification,只训练这个分类器,也表现的较好。表明 MOCO 可以很好的迁移到下游任务,有效的弥补了有监督和无监督的鸿沟。

对比不同对比学习 loss 的结果见图 3,这三个 loss 都得益于大的 K

在这里插入图片描述

2、Momentum 的效果

K=4096

在这里插入图片描述
3、在 PASCAL VOC 上的目标检测效果

检测器:Faster RCNN

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4、在 COCO 上的检测和分割

模型:Mask RCNN(with FPN)

在这里插入图片描述

下游任务:

在这里插入图片描述

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

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

相关文章

【Java|多线程与高并发】wait和notify方法详解

文章目录 1.前言2.wait和notify的基本使用3. notifyAll方法4. wait和sleep方法的对比5. 总结 1.前言 在Java多线程环境中,线程之间是抢占式执行的,线程的调度是随机的.这就很难受了. 在很多情况下我们希望线程以我们想要的顺序来执行. 这就需要wait和notify这两个方法 2.wait和…

Java——《面试题——MySQL篇》

前文 java——《面试题——基础篇》 Java——《面试题——JVM篇》 Java——《面试题——多线程&并发篇》 Java——《面试题——Spring篇》 Java——《面试题——SpringBoot篇》 目录 前文 1、数据库的三范式是什么? 2、MySQL数据库引擎有哪些 3、说说…

【五子棋实战】第2章 博弈树负值极大alpha-beta剪枝算法

【五子棋实战】第2章 博弈树极大极小值alpha-beta剪枝算法 博弈树 极大极小值搜索Minimax 负值极大法Negamax alpha-beta剪枝 博弈树负值极大alpha-beta剪枝算法代码实现 ## 初始化输入、确定输出 ## 开始回溯 ## 判赢 ## 评估-计算分数 总结 继续学习下一篇实战&…

注解和异常的详细笔记

注解的理解 注解(Annotation)也被称为元数据(Metadata),用于修饰解释 包、类、方法、属性、构造器、局部变量等数据信息。和注释一样,注解不影响程序逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息。在 JavaSE 中&am…

OpenMMLab-AI实战营第二期——相关1. COCO数据集格式和pycocotools使用(目标检测方向)

文章目录 1. COCO数据集1.1 COCO数据集介绍1.2 COCO数据集格式1.2.1 常见目标检测数据格式1.2.2 COCO数据集文件结构及标注文件说明1.2.3 COCO的evaluation指标 1.3 其他 2. pycocotools2.1 pycocotools简介和安装2.2 基本使用 3. 图像的EXIF使用3.1 图像的EXIF3.1.1 基本介绍3…

车载以太网MACsec

车载以太网MACsec 1.概述 MACsec(Media Access Control Security)定义了基于 IEEE 802 局域网络的数据安全通信的方法。MACsec 可为用户提供安全的 MAC 层数据发送和接收服务,包括用户数据加密(Confidentiality)、数…

新浪股票接口获取历史数据

这两天做了一个调用新浪股票接口获取实时以及历史股票数据的应用,因为新浪没有公开关于其接口的官方文档,所以通过各种百度差了很多关于新浪股票接口的使用,不过大家基本都是转载或者直接复制,对于实时数据的获取讲的很详细&#…

Linux【系统学习】(shell篇)

第 1 章 Shell 概述 1)Linux 提供的 Shell 解析器有 Ubuntu 使用的是dash 2)bash 和 sh 的关系 3)Centos 默认的解析器是 bash 第 2 章 Shell 脚本入门 1)脚本格式 (结尾不是必须以 .sh 结尾,只是为了区…

《网络安全0-100》VPN 讲解

1、前言 VPN虽好可不要贪玩哦 2、VPN的概念和结构 VPN:虚拟专用网(virtual personal network)是利用internet等公共网络的基础设施,通过隧道技术,为用户提供的专用网络具有相同通信功能的安全数据通道。 ‘虚拟’是指用户无需建立各逻辑上的专用物理线…

​AVS3支持下的8K内容生产和传输应用实践

AVS标准经过20年发展,到AVS3这一代实现了国产标准从跟跑到领跑的突破。博雅睿视团队深度参与AVS3标准制定,开发的8K AVS3实时、离线编解码设备有力支持了我国8K超高清视频产业的落地和推广。 本次分享将会分为三个部分,第一部分重点介绍AVS标…

MusicGen配乐工具开源,教你怎么给抖音短视频配乐,助你涨粉1000!

大家好,我是千与千寻,好久不见了,很多粉丝私信我说,千寻哥这是去哪了?难道被野外捕捉了。 哈哈哈,当然不是了,千寻依然在学习ChatGPT的道路上和大家一起学习,一起搞钱! 但…

TC8:TCP_MSS_OPTIONS_05-09

TCP_MSS_OPTIONS_05: Illegal option length for MSS in a SYN-ACK segment 目的 TCP能够处理SYN+ACK报文段中MSS选项的长度非法,而不会崩溃 可以正常地响应,就是不崩溃,这里指的应该是DUT发送ACK 测试步骤 Tester:让DUT侧的应用程序发起主动open调用DUT:发送SYNTester:…

C++类和对象--构造函数和析构函数

0.前言 在我们写某些需要动态开辟内存空间的函数时候,会经常忘记初始化、销毁,而且有时候程序返回的情况很多,那么销毁函数写起来就会很繁琐,那么有没有什么办法解决这个问题呢?答案是:当然有!在…

Java类 继承

Java是一种面向对象的编程语言,类是Java中最基本的编程单元。一个类可以包含变量、方法和构造函数等。类的定义需要使用关键字class,例如: public class Person { private String name; private int age; public Person(St…

文心一言 VS 讯飞星火 VS chatgpt (44)-- 算法导论6.1 1题

一、在高度为h的堆中,元素个数最多和最少分别是多少? 文心一言: 在高度为 h 的二叉搜索树(BST)中,元素个数最多和最少的情况分别如下: 1.最多情况:当每个节点都包含两个子节点时&#xff0c…

CSS3-盒子模型-边距问题

1 清除默认内外边距 场景:浏览器会默认给部分标签设置默认的margin和padding,但一般在项目开始前需要先清除这些标签默认的margin和padding,后续自己设置 比如:body标签默认有margin:8px、p标签默…

一句提示词生成整个代码库——Gpt Engineer神级项目开源(附演示视频)

近日,一个名为Gpt Engineer神级项目开源,并迅速火爆全网。 短短几天内,该项目已经得到了25K的星星。 使用GPT-engineer进行人工智能软件开发,可以改变软件开发的未来。 在软件开发领域,一场巨大的革命正在开始。这一转…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(6月 22 日论文合集)

文章目录 一、检测相关(9篇)1.1 Wildfire Detection Via Transfer Learning: A Survey1.2 Polygon Detection for Room Layout Estimation using Heterogeneous Graphs and Wireframes1.3 Exploiting Multimodal Synthetic Data for Egocentric Human-Object Interaction Detec…

前端中的相关概念

谁道人生无再少, 门前流水尚能西。 桃花落尽胭脂透, 庭院无声五更鸡。 —— 杜甫《端午节》 HTML中class属性 HTML中class属性是一种用于为元素定义样式和标识的属性,以下是class属性的几种常见用法实例,包括标识元素、定义样…

利用OpenCV计算条形物体的长度

0、前言 在图像处理中,我们可能会遇到求一个线条长度的场景,比如,现在有一条裂缝,需要求其长度,或者有一个长条形的零件需要知道其长度。 本文利用OpenCV和skimage两个库,提供了一个解决方案。 1、解决步…