对比学习:MoCo :Momentum Contrast for Unsupervised Visual Representation Learning

2023-10-27

参考链接

Introduction

  • 无监督的表示学习在NLP领域已经取得了巨大的成功,比如:bert预训练模型;但是再CV领域,监督的表示学习还是比无监督的表示学习要好。这主要的原因是什么呢?论文认为:主要的原因是NLP和CV的信号空间不一样
    • NLP是基于字典的离散的信号空间,所以可以基于这个字典进行无监督的表示学习。
    • CV是信号空间是连续的,高维的和无结构的,所以该领域一直在关注构建字典进行无监督表示学习。
    • 【对于预训练(表示学习)与词典的关系,可以通过原论文进行更深入的思考】
  • 而最近的对比学习为CV的表示学习带来了希望,论文认为:对比学习相当于构建一个动态的字典。这个动态字典的key从数据中采样获得images 或者 patches【这些key就相当与NLP领域词典中的字】;key的表示通过一个编码网络产生【key的表示相当于词的embedding或者bert最后的隐藏层输出】,这个编码网络就是我们要学习的预训练模型。
  • 思考:这里可以将图像的信息空间视为一个无限大(连续)字典,而对比学习构建的这个动态字典就是这个无限大字典的一个采样。这些样本的表示(embedding)是编码器的输出,那么这个编码的过程可以理解为查字典过程。
  • 论文中提出了 Momentum Contrast(MoCo) 模型,用于构建一个大的一致性的字典。并且使用一个 队列 来存储这个字典(中间存储之前mini-batch中被编码样本的表示)。这种方法使得字典的大小不在依赖与mini-batch的大小,这就使得字典可以更大。

Method

Pretext Task(预训练任务)

  • 为了更好的理解这篇论文的方法,我们先介绍一下论文所使用的预训练任务;

  • MoCo模型适用许多的预训练任务(pretext tasks),但论文中使用实例消歧任务(instance discrimination task) 来进行实验:预测一个query和一个key是否是来自同一张图片的不同视角(view)

  • 了解的任务我们就可以看一下模型整体架构图:

  • 顺着这张图可以直观的介绍一下论文使用的对比损失函数(contrastive loss):

    其中 T T T是温度, k + k_+ k+表示唯一的正例。分子的求和是 K K K个负例和一个正例。很明显的可以看到这实质上就是一个交叉熵损失函数。

  • 这里我们也可以对比NLP的语言模型,把 q q q理解为前一个词,而 K + 1 K+1 K+1 k i k_i ki理解为一个词汇表(或者词汇表的一个采样),那个这个唯一的正例 k + k_+ k+就可以理解为 q q q的下一个词;所以从这个角度来讲NLP的预训练也是一种对比学习。

  • 对比学习的思想在于:用一对正例与很多对负例进行对比以此产生高质量表示(有区分度的表示)

  • 实例消歧任务(instance discrimination task)的伪代码如下:

    需要注意的是:每个当前mini-batch( x x x)中只包含正例对 ( q , k + ) (q,k_+) (q,k+)而负例都是从队列/字典( q u e u e queue queue)中取出来的。

Momentum Contrast(动量对比)

  • 这一步主要介绍:MoCo模型如何构建字典,如何更新字典,如何更新编码器。
  • 上面已经讲到,论文认为:最近的对比学习可以被认为就是构建一个动态字典,然后训练一个encoder来完成字典查询的任务(对字典中key的编码任务);并且论文还指出越大的词典可能对学习好的表示和特征是有利的。
  • 论文中将这个动态字典使用队列(queue)来实现,那么这个队列存的什么东西呢?如果更新这个队列中的东西呢?
  • 队列里面存的是之前的mini-batch中样本的编码表示,那么对于当前的mini-batch中的样本,之前mini-batch中样本必定视为负样本。所以上面的伪代码中所有的负样本都是从队列取出来的,而当前mini-batch只包含正样例对。
  • 队列的更新方式是:当当前步迭代完成后,将当前mini-batch中的样本进行编码替换队列中最老的mini-batch。是一个典型的先进先出的原则。
  • 使用队列的方式可以使得字典的大小不受mini-batch大小的影响,使得我们可以使用更大的字典,在每个对比损失中使用更多的负样本,以此来提升表示的质量。当然有利就有弊,这也为我们优化key的编码器带来了问题。主要的原因在于:key编码器是在不断优化改进的;而队列中样本的表示是由以前key编码器产生的,这个编码器参数与当前编码器参数上已经有了一些不同。而在当前步计算对比损失时队列中的样本表示会将他们的梯度(以前key编码器产生的梯度)回传给当前的key编码器,这就会导致模型优化(学习)出现问题。
  • 解决key编码器优化问题最简单的方法:每次将 f q f_q fq(query的编码器)拷贝为 f k f_k fk(key的编码器),丢弃之前的 f k f_k fk;这就相当于不让字典中存的key进行梯度回传。但实验的结果不好。
  • 论文认为,上面这种做法之所以效果不好是由于:key编码器变化太快,每次都之间武断的将 f q f_q fqcopy给 f k f_k fk,这降低了队列中key的编码表示的一致性。于是论文提出了使用动量更新的方法来更新key的编码器,以解决这个问题,具体公式如下: θ k θ_k θk是key编码器的参数, θ q θ_q θq时query编码器的参数, m m m是动量系数;
  • 在这种做法下, θ k θ_k θk已不经过反向传播进行更新,而是通过上面这个动量公式进行更新,只有 θ q θ_q θq进行方向传播进行更新
  • 然字典队列中的key的编码表示可能来自不同key编码器,但是通过这种基于动量的更加平滑的更新方式使得这些key的表示尽量保持一致。
  • 在实验中:大的 m = 0.999 m=0.999 m=0.999效果比更小的 m = 0.9 m=0.9 m=0.9更好。

Relations to previous mechanisms(与以前相关工作的对比)

  • 整体对比图:
  • end-to-end方式:这种方式可能是非常自然的想法,如果在显存足够的情况下这种方式应该是最好的,因为它没有如何不一致的情况。这里两个编码器同时通过反向传播去更新,这种方法有以下缺点:
    • 在这种情况下,当前的mini-batch就是字典;由此可以看出mini-batch的大小就是字典的大小,所以字典的大小受到了GPU现存的限制。无法使用更大字典来改善模型的性能
    • 即使有足够的现存,超大mini-batch的优化问题又是一个比较大的挑战。
  • memory bank方法:这个方法应该是本篇论文最大借鉴的方法
    • 这种方法使用一个memory bank存储数据集中的所有样本,这相当与一个超大的字典;对于当前的mini-batch,从这个超大字典中抽取一个小的字典进行对比损失的计算【这类似于NLP中应对词典太大的负采样方法】。
    • 需要注意的是这个框架是没有key编码器,memory bank中所用样本是通过query编码器进行编码的,每个样本在采样被采到后都会被query编码器重新编码再通过动量的方式去更新memory bank中样本的表示。这个动量方式是作用到样本表示上的,而不是编码器上,所以导致memory bank中的样本一致性比较差【这个观点应该是经验之谈,感觉不一定一致性会很差】。

Experiments

  • 使用的编码器:ResNet-50
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对比学习:MoCo :Momentum Contrast for Unsupervised Visual Representation Learning 的相关文章

  • 如何训练斯坦福 NLP 情感分析工具

    地狱大家 我正在使用斯坦福核心 NLP 包 我的目标是对推文直播进行情感分析 按原样使用情感分析工具对文本 态度 的分析非常差 许多积极因素被标记为中性 许多消极因素被评为积极 我已经在文本文件中获取了超过一百万条推文 但我不知道如何实际获
  • 用于估计(一元)困惑度的 NLTK 包

    我正在尝试计算我所拥有的数据的困惑度 我正在使用的代码是 import sys sys path append usr local anaconda lib python2 7 site packages nltk from nltk co
  • 实时跟踪每分钟/小时/天的前 100 个 Twitter 单词

    我最近遇到这样一个面试问题 Given a continuous twitter feed design an algorithm to return the 100 most frequent words used at this min
  • ANEW 字典可以用于 Quanteda 中的情感分析吗?

    我正在尝试找到一种方法来实施英语单词情感规范 荷兰语 以便使用 Quanteda 进行纵向情感分析 我最终想要的是每年的 平均情绪 以显示任何纵向趋势 在数据集中 所有单词均由 64 名编码员按照 7 分李克特量表在四个类别上进行评分 这提
  • 将复数名词转换为单数名词

    如何使用 R 将复数名词转换为单数名词 我使用 tagPOS 函数来标记每个文本 然后提取所有标记为 NNS 的复数名词 但是如果我想将这些复数名词转换为单数该怎么办 library openNLP library tm acq o lt
  • SpaCy 中的自定义句子边界检测

    我正在尝试在 spaCy 中编写一个自定义句子分段器 它将整个文档作为单个句子返回 我编写了一个自定义管道组件 它使用以下代码来执行此操作here https github com explosion spaCy issues 1850 但
  • 如何提取句子中的主语及其各自的从属短语?

    我正在尝试在句子中进行主题提取 以便我能够根据主题获得情感 我在用nltk在 python2 7 中用于此目的 以下面的句子为例 Donald Trump is the worst president of USA but Hillary
  • 如何将标记化中的多单词名称保留在一起?

    我想使用 TF IDF 特征对文档进行分类 一种方法是 from sklearn feature extraction text import TfidfVectorizer import string import re import n
  • 除非 POS 显式,否则 WordNetLemmatizer 不会返回正确的引理 - Python NLTK

    我正在对 Ted 数据集成绩单进行词形还原 我注意到一些奇怪的事情 并非所有单词都被词形还原 要说的是 selected gt select 哪个是对的 然而 involved gt involve and horsing gt horse
  • 使用“自然”语言编写代码更好吗?

    我最近看到一种编程语言叫做超新星 http supernova sourceforge net 他们在网页上说 超新星编程语言是 现代脚本语言和 第一个提出了概念 用直接虚构进行编程 描述使用 纯人类语言的清晰子集 你可以编写如下代码 i
  • Keras:嵌入/向量的附加层?

    我有 3 个词嵌入 嵌入 1 w11 w12 w13 w14 嵌入 2 w21 w22 w23 w24 嵌入 3 w31 w32 w33 w34 有没有办法通过添加所有三个向量来获得第四个嵌入 并使用所有向量的可训练权重 例如 嵌入 4 w
  • Python NLP 英式英语与美式英语

    我目前正在用Python 进行NLP 工作 然而 在我的语料库中 既有英式英语也有美式英语 实现 实现 我正在考虑将英式英语转换为美式英语 但是 我没有找到一个好的工具 包来做到这一点 有什么建议么 我也找不到包 但试试这个 请注意 我必须
  • R 中带有变音符号的字符列表

    我试图将字符串中的电话 字符 出现次数制成表格 但变音符号单独作为字符制成表格 理想情况下 我有一个国际音标的单词列表 其中包含大量变音符号以及它们与基本字符的几种组合 我在这里给出了仅包含一个单词的 MWE 但对于单词列表和更多类型的组合
  • 使用 NLP 进行句子压缩 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 使用机器翻译 我可以获得一个句子的非常压缩的版本 例如 我真的很想喝一杯美味可口的咖啡将被翻译为我想喝咖
  • 如何从Python中的阿拉伯字符串中删除英文文本?

    我有一个带有英文文本和标点符号的阿拉伯字符串 我需要过滤阿拉伯文本 我尝试使用 sting 删除标点符号和英语单词 但是 我失去了阿拉伯语单词之间的空格 我哪里错了 import string exclude set string punc
  • 使用印度名字训练 Spacy NER

    我正在尝试自定义 Spacy 的 NER 来识别印度名字 遵循本指南https spacy io usage training https spacy io usage training这是我正在使用的数据集https gist githu
  • Spacy提取特定名词短语

    我可以在 python 中使用 spacy 来查找具有特定邻居的 NP 吗 我想要文本中前后都有动词的名词短语 您可以合并名词短语 这样它们就不会单独标记化 分析依存解析树 查看相邻标记的 POS gt gt gt import spacy
  • 池化与随时间池化

    我从概念上理解最大 总和池中发生的情况作为 CNN 层操作 但我看到这个术语 随时间变化的最大池 或 随时间变化的总和池 例如 用于句子分类的卷积神经网络 https arxiv org pdf 1408 5882 pdfYoon Kim
  • 如何在 scikit-learn 的 SVM 中使用非整数字符串标签? Python

    Scikit learn 具有相当用户友好的用于机器学习的 python 模块 我正在尝试训练用于自然语言处理 NLP 的 SVM 标记器 其中我的标签和输入数据是单词和注释 例如 词性标记 而不是使用双精度 整数数据作为输入元组 1 2
  • NLTK:查找单词大小为 2k 的上下文

    我有一个语料库 我有一个词 对于语料库中该单词的每次出现 我想获取一个包含该单词之前的 k 个单词和该单词之后的 k 个单词的列表 我在算法上做得很好 见下文 但我想知道 NLTK 是否提供了一些我错过的功能来满足我的需求 def size

随机推荐

  • AOP切面的优先级Order属性

    如果有两个切面 那么谁先谁后怎么判断 那如果我们要指定切面的执行顺序呢 可以使用 Order注解指定切面的优先级 值越小优先级越高 举例 两个切面类 Order 2 Aspect Component public class MyAspec
  • jQuery VS AngularJS 你更钟爱哪个?

    在这一次的Web开发教程中 我会尽力解答有关于jQuery和AngularJS的两个非常常见的问题 即jQuery和AngularJS之间的区别是什么 也就是说jQuery VS AngularJS 今天我不会仅仅只是解释两者的差异和列举两
  • 最小二乘法拟合圆心与半径

    公众号 轻松玩转机器人 欢迎关注 1 算法介绍 最小二乘法的目的 通俗来说 就是拟合变量之间的关系 由于现实世界观测的变量存在噪声 找不到完美 不存在误差的关系 因此我们退而求其次 尽可能减小误差影响 误差有正有负 而我们希望消除正负方向的
  • FPGA实现数码管数字累加

    一 基本原理 FPGA数码管简单显示 简单数码管原理上文介绍过 本文主要介绍视觉在1ms内感知不到数码管数字来回切换的变动 1ms内数字跳变 眼睛感知是数字一直在显示 二 代码原理 1 显示模块 1 根据需要显示的数字 取出个 十 百 千位
  • 针对TextView更换字体颜色同时设置不同的点击事件的设计方案

    在需求中我们需要将下面的文字放到一起 并更改不同的颜色进行区分 还需要将用 用户协议 和 隐私政策 添加不同的点击事情 去跳转进行展示不同的说明 首先这是一个弹框 我们需要先去定义它的布局文件
  • 【科普贴】USB_ID介绍

    一 功能介绍 1 当前很多SOC 都支持OTG功能 所以mini micro USB的接口上通常会拓展一个USB ID引脚 如下图 2 USB ID pin 为低电平时 则设备为host模式 比如PC和支持OTG设备做主设备时 USB ID
  • platformio添加外部库文件方法

    方法1 在这里搜索所需要的库函数进行添加到工程里 方法2 常用 1 准备好所需要的库文件 2 打开工程文件夹 完成以上4步后 重启VScode 即可完成库文件添加 方法3 常用 当创建完工程后 在该工程中添加库 方法2是添加全局库的方法 添
  • QT中qrect的使用介绍,超级详细

    QT中qrect的使用 QT是跨平台的GUI应用程序开发框架 使用C 编写 其中 qrect是QT中一个常用的类 用于描述矩形 qrect的函数原型参数介绍 在使用qrect时 我们需要了解以下几个函数原型参数 QRect 构造函数 创建一
  • 基于Python和mysql开发的BBS问答社区管理系统(源码+数据库+程序配置说明书+程序使用说明书)

    一 项目简介 本项目是一套基于Python和mysql开发的BBS问答社区管理系统 主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Python学习者 包含 项目源码 项目文档 数据库脚本等 该项目附带全部源码可作为毕设使用 项
  • Spring、SpringMVC、Spring Boot、Spring Cloud 概念、关系及区别

    注 此文章转载于其他大神 一 正面解读 Spring主要是基于IOC反转Beans管理Bean类 主要依存于SSH框架 Struts Spring Hibernate 这个MVC框架 所以定位很明确 Struts主要负责表示层的显示 Spr
  • MFC扩展库BCGControlBar Pro v33.6亮点 - 流程图、Ribbon Bar功能升级

    BCGControlBar库拥有500多个经过全面设计 测试和充分记录的MFC扩展类 我们的组件可以轻松地集成到您的应用程序中 并为您节省数百个开发和调试时间 BCGControlBar专业版 v33 6已正式发布了 此版本包含了对图表组件
  • anaconda、cuda、pytorch相关

    文章目录 0 00写在最前面 0 Anaconda安装 配置 使用的详细教程 1 MobaXterma远程连接服务器 2 linux系统下配置cuda及pytorch 3 linux操作系统下在conda环境中配置cuda和pytorch
  • Powershell快速入门(三) 实战应用

    好像关于Powershell说的已经差不多了 所以最后一篇文章就来使用Powershell写一些脚本 帮助我们完成一些日常工作 文件管理 常用命令 先来看看常用的文件管理命令 Set Location命令用于切换工作目录 它的别名是cd G
  • 基于SSM+Vue的乐购游戏商城系统

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SSM 前端 采用Vue技术开发 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse 是否Mave
  • 解放生产力!chatGPT接入Excel与Word教程(需要魔法上网,不用的都是骗人的)

    解放生产力 chatGPT接入Excel与Word教程 需要魔法上网 不用的都是骗人的 默认你注册过openAI账号了并使用过chatGPT了 本文就不教如何注册GPT啦 网上全是教程 这里贴一条亲测可用的教程网址 一 创建你的chatGP
  • centos7安装killall命令

    centos7精简安装后 使用中发现没有killall命令 经查找 可以通过以下命令解决 yum install psmisc y 简单介绍一下 psmisc Psmisc软件包包含三个帮助管理 proc目录的程序 安装下列程序 fuser
  • 模拟ic设计和数字ic设计的区别,含薪资表

    前言 本文主讲 数字IC设计与模拟IC设计的区别 初衷在于希望对新入行或想入行的同学在方向选择时提供有效的参考 正文 IC设计是半导体集成电路产品设计的统称 又称芯片设计 按功能可分为 数字IC 模拟IC 微波IC 其他IC 本文主要介绍数
  • sql根据指定字段查找表中重复记录,并统计重复次数

    查找表中重复记录 重复记录是根据单个字段来判断 并统计重复次数 SELECT 重复字段 COUNT 0 AS num FROM 表名 GROUP BY 重复字段 HAVING COUNT 重复字段 gt 1
  • npm link 引发的 Invalid hook call 问题

    项目场景 开发React组件库 假设路径为 workspace ui 时 为了避免每次修改都发布到 npm 在本地的测试项目 假设路径为 tmp test 中使用 npm link 为组件库建立软连接 方便本地调试 问题描述 不幸的是 发生
  • 对比学习:MoCo :Momentum Contrast for Unsupervised Visual Representation Learning

    参考链接 论文链接 https link zhihu com target https 3A arxiv org abs 1911 05722 代码链接 https github com facebookresearch moco Intr