Advertisement

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

阅读量:

参考链接

Introduction

对于预训练(表示学习)与词典的关系,可以通过原论文进行更深入的思考

  • 非监督的学习方法已经在NLP领域取得了显著的效果,并且以BERT等预训练模型为例进行了验证;然而,在计算机视觉领域(CV),有监督的学习效果仍然优于无监督的方法。

  • NLP基于一个离散且不连续的信息空间,在这种情况下可实现有效的非监督表示学习。

  • 相反,在CV中信息空间具有连续性、高维性和缺乏结构的特点,在这种情况下研究者们一直致力于构建有效的表示方法。

  • 【关于预训练(即表示学习)与其与词表之间的关系,请通过原文进一步思考

  • 近期对比学习为计算机视觉领域的特征表示学习提供了新的希望。该论文认为:对比学习相当于构建一个动态的字典 。这个动态字典的键值来源于数据中采样的图像或片段【这些键值类似于NLP领域词典中的词汇

Method

**Pretext Task(预训练任务) **

为了更深入地了解这篇论文的方法,我们先介绍一下论文所采用的预设学习任务;

MoCo模型广泛应用于多种预训练任务(pretext tasks),然而,在论文研究中采用了**实例消歧任务(instance discrimination task)**这一技术来进行实验验证:判断查询项与关键项是否来自同一图像的不同视角(view)。

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

通过这张图可以直观地展示论文所采用的对比损失函数(即contrastive loss)。

在其中情况下, 假设变量T代表温度参数, 并将k_+定义为唯一的一个正样本实例. 在计算分子部分时涉及了总共K个负样本数据点以及一个正样本数据点. 经过观察分析后可以明确识别出该损失函数本质上属于交叉熵损失类型.

在探讨NLP领域时我们可以采用对比的方法来分析语言模型的工作原理。具体而言我们可以将变量q定义为当前词而将K+1个k_i视为一个完整的词汇表或其采样过程;从而推导出唯一正确的k_+即q后续词的存在关系;这种视角下可以看出预训练语言模型实际上是一种对比学习机制。

对比学习的核心思想体现在通过一对正例与大量负例的对比能够生成高精度且具鉴别力的表现。

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

需要注意的是,在当前mini-batch(x)中仅包含了用于训练的正样本对(q,k_+);而所有的负样本则均来自预先建立的队列或字典(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(query的编码器)拷贝为f_k(key的编码器),丢弃之前的f_k;这就相当于不让字典中存的key进行梯度回传。但实验的结果不好。
  • 论文认为,上面这种做法之所以效果不好是由于:key编码器变化太快,每次都之间武断的将f_qcopy给f_k,这降低了队列中key的编码表示的一致性。于是论文提出了使用动量更新的方法来更新key的编码器,以解决这个问题,具体公式如下:

θ_k是key编码器的参数,θ_q时query编码器的参数,m是动量系数;

在这种做法下,在未经过反向传播的情况下进行θ_k的更新,在运用这一动量公式的情况下完成θ_q的更新
字典队列中的key编码可能源自不同的key编码器,在这种基于动量设计出更为平滑的更新机制下使得这些key的表示尽量保持一致
在实验中:较大的m值(如0.999)在实验中展现出比较小的m值(如0.9)更好的效果

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

  • 整体对比图:
  • 端到端的方式:这种思路可能是非常自然的想法,在显存资源充足的条件下这种方法应该是最优的选择。它避免了任何可能存在的不一致性问题。
    在这里面的小批量数据其实就是整个词典的内容。由此可以看出小批量数据的大小实际上等于词典的大小。因此词典的大小会受到GPU内存空间的限制,在这种情况下无法通过使用更大的词典来提升模型性能。
    即使内存资源允许的情况下超大 mini-batch 的优化问题仍然存在较大的挑战。

这类似于NLP中应对词典太大的负采样方法

这个观点应该是经验之谈感觉不一定一致性会很差

  • 记忆库体系:这种方法应该是本文论文中最大的借鉴方法。
    该方法基于记忆库体系存储数据集中的全部样本信息;针对当前的小批量数据(mini-batch),从这个巨大的数据库中抽取一小部分样本用于损失计算【这类似于自然语言处理领域中采用的负采样策略

Experiments

  • 使用的编码器:ResNet-50

全部评论 (0)

还没有任何评论哟~