对比学习: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 的相关文章

  • 如何使用CNN来训练不同大小的输入数据?

    CNN 似乎主要针对固定大小的输入来实现 现在我想用CNN来训练一些不同大小的句子 有哪些常用的方法 以下建议主要与用于计算机视觉任务 特别是识别 的 CNN 相关 但也可能对您的领域有所帮助 我会看看He 等人的 用于视觉识别的深度卷积网
  • 如何找到句子的主语? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我是 NLP 新手 正在研究应该使用哪种语言工具包来执行以下操作 我想做两件事之一来完成同样的事情 我基本上想对文本进行分类 通常是一个包
  • browserify :- 未捕获类型错误:fs.readFileSync 不是函数

    我试图在我的代码中使用natural js 在客户端使用它 我使用browserify 但它给出了一个错误 Uncaught TypeError fs readFileSync is not a function at loadDictio
  • 日期自然语言解析器(.NET)?

    我希望能够让用户使用自然语言 例如 下周五 每个工作日 输入日期 包括重复日期 很像以下的例子http todoist com Help timeInsert http todoist com Help timeInsert I found
  • 从动词列表中检索动词

    我有一个全是动词的字符串列表 我需要获取每个动词的词频 但我想将 想要 想要 想要 和 想要 等动词计为一个动词 形式上 动词 被定义为 4 个单词的集合 其形式为 X Xs Xed Xing 或形式为 X Xes Xed Xing 其中
  • Keras 文本预处理 - 将 Tokenizer 对象保存到文件中以进行评分

    我按照以下步骤 大致 使用 Keras 库训练了一个情感分类器模型 使用 Tokenizer 对象 类将文本语料库转换为序列 使用 model fit 方法构建模型 评估这个模型 现在 为了使用此模型进行评分 我可以将模型保存到文件中并从文
  • 如何将地名词典或词典表示为 crf++ 中的特征?

    如何使用地名词典或词典作为功能CRF https taku910 github io crfpp 详细说明 假设我想对人名进行 NER 并且我有一个包含常见人名的地名词典 或字典 我想使用这个地名词典作为 crf 的输入 我该怎么做 我正在
  • 在Python或Sklearn中用整数值对具有字符串值的列变量进行编码

    如何用整数值对数据表中字符串类型的列值进行编码 例如 我有两个特征变量 颜色 可能的字符串值 R G 和 B 和技能 可能的字符串值 C Java SQL 和 Python 给定数据表有两列 Color gt R G B B G R B G
  • 比较文本文档含义的最佳方法?

    我正在尝试找到使用人工智能和机器学习方法来比较两个文本文档的最佳方法 我使用了 TF IDF Cosine 相似度和其他相似度度量 但这会在单词 或 n gram 级别上比较文档 我正在寻找一种方法来比较meaning的文件 最好的方法是什
  • Blenderbot 微调

    我一直在尝试微调 HuggingFace 的对话模型 Blendebot 我已经尝试过官方拥抱脸网站上给出的传统方法 该方法要求我们使用 trainer train 方法来完成此操作 我使用 compile 方法尝试了它 我尝试过使用 Py
  • Spacy 中的自定义句子分割

    I want spaCy使用我提供的句子分割边界而不是它自己的处理 例如 get sentences Bob meets Alice SentBoundary They play together gt Bob meets Alice Th
  • 语音识别中如何处理同音词?

    对于那些不熟悉什么是同音字 https en wikipedia org wiki Homophone是的 我提供以下示例 我们的 是 嗨和高 到 太 二 在使用时语音API https developer apple com docume
  • 实时跟踪每分钟/小时/天的前 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 分李克特量表在四个类别上进行评分 这提
  • gensim如何计算doc2vec段落向量

    我正在看这篇论文http cs stanford edu quocle paragraph vector pdf http cs stanford edu quocle paragraph vector pdf 它指出 段落向量和词向量被平
  • openNLP 与 Solr 集成时出现异常

    我正在尝试将 openNLP 与 Solr 6 1 0 集成 我配置了架构和 solrconfig 文件 详细信息请参见 wiki 链接 https wiki apache org solr OpenNLP https wiki apach
  • 如何检测文本是否可读?

    我想知道是否有一种方法可以告诉给定的文本是人类可读的 我所说的人类可读的意思是 它有一些含义 格式就像某人写的文章 或者至少是由软件翻译器生成的供人类阅读的文章 这是背景故事 最近我正在制作一个应用程序 允许用户将短文本上传到数据库 在部署
  • AttributeError:类型对象“Word2Vec”没有属性“load_word2vec_format”

    我正在尝试实现 word2vec 模型并收到属性错误 AttributeError 类型对象 Word2Vec 没有属性 load word2vec format 下面是代码 wv Word2Vec load word2vec format
  • 如何在Python中使用多处理来加速循环执行

    我有两个清单 列表 A 包含 500 个单词 列表 B 包含 10000 个单词 我正在尝试为列表 A 找到与 B 相关的相似单词 我正在使用 Spacy 的相似函数 我面临的问题是计算需要很长时间 我是多处理使用的新手 因此请求帮助 如何
  • 缩短文本并仅保留重要句子

    德国网站 nandoo net 提供了缩短新闻文章的可能性 如果使用滑块更改百分比值 文本会发生变化并且某些句子会被遗漏 您可以在这里看到它的实际效果 http www nandoo net read article 299925 http

随机推荐

  • 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