深度学习(自监督:MoCo)——Momentum Contrast for Unsupervised Visual Representation Learning

前言

本篇文章是何凯明老师在CVPR 2020上的文章

文章地址:链接
代码地址:链接

本文前半部分将对自监督任务做一个简短介绍,包括自监督任务中常见的损失函数——InfoNCE、自监督的用途、自监督的评估方式,后半部分将对MoCo做一个介绍,具体的实验结果请自行查阅原论文。

如有错误,欢迎指正。


自监督简述

自监督无需人工标注标签,其让海量数据自身产生伪标签,将伪标签作为监督信号,训练特征提取器,训练得到的特征提取器将用于下游任务,例如图像分割、目标检测、图像分类等任务。

目前自监督领域有诸多流派,近年来的主流流派为对比学习(Contrastive Learning),一张图片经过不同的数据增强后产生的feature vector也应该是近似的,对比学习试图通过这种对应关系,让模型理解一张图片中的语义信息。

对比学习中,最常用的损失函数为InfoNCE,其数学形式为
在这里插入图片描述
其中, T T T为温度,是一个超参数, q q q表示样本的特征向量, k + k_{+} k+表示正例的特征向量。

每个训练样本,都有一个正例, K K K个负例,InfoNCE会计算样本与正负例之间的余弦相似度,通过softmax函数进行归一化,接着套入负对数函数中。

InfoNCE可以看成一个K+1类的分类问题(损失函数为交叉熵),我们希望样本能够被分为第 k + k_{+} k+类,即样本与正例的余弦相似度要高于与负例的余弦相似度。

自监督训练完一个特征提取器后,会将特征提取器冻结,接入一个线性分类器,依据线性分类器的性能好坏来判断特征空间的好坏,如果在分类问题中,特征提取器构建出的特征空间线性可分,则可认为该特征提取器性能优异,也可以将特征提取器用于其他下游任务中,依据下游任务的性能来判断特征提取器性能好坏。


MoCo简述

本论文提出的MoCo模型,是自监督算法的一种,本节将介绍MoCo是如何进行自监督训练的,并给出一些个人的思考

在这里插入图片描述
MoCo的网络结构如上,InfoNCE需要提供正、负例才可以计算,那么MoCo中正负例是如何产生的?


如何产生正例

在MoCo中,对一张图片进行不同的数据增强,得到 x q x^q xq x k x^k xk,两张图片分别输入到encoder和momentum encoder卷积神经网络中,momentum encoder的输出即为正例。背后的直觉为一张图片经过不同的数据增强后产生的feature vector也应该是近似的,对比学习试图通过这种对应关系,让模型理解一张图片中的语义信息。


如何产生负例

momentum encoder输出的feature vector会保存在一个queue中,queue的大小固定,当queue容量达到上限时,会抛弃队列头部的feature vector,存入新的feature vector。MoCo的负例来源于queue中保存的feature vector,应该是随机采样一部分feature vector作为负例。负例对不会产生更新梯度


如何更新momentum encoder

InfoNCE的梯度并不会回传至momentum encoder,momentum encoder采用动量方式进行更新,具体更新方式如下式
θ k = m θ k + ( 1 − m ) θ q (2.0) \theta_k=m\theta_k+(1-m)\theta_q \tag{2.0} θk=mθk+(1m)θq(2.0)
θ k \theta_k θk为momentum encoder的参数, θ q \theta_q θq为encoder的参数,m的取值通常近似于1。


算法伪代码

在这里插入图片描述

思考


为什么要存在负例

一张图片经过不同的数据增强后产生的feature vector也应该是近似的,对比学习试图通过这种对应关系,让模型理解一张图片中的语义信息。从对比学习的motivation出发,似乎不需要负例,但在实际训练中,对比学习可能出现奔溃解,即不论输入任何数据,网络的输出均为一个常数,如果仅使用正例,奔溃解会存在于网络的解空间中,负例的引入会消除解空间中的奔溃解。


MoCo的负例通过queue提供有什么好处

类似于simCLR,负例可以由一个batch中的其他数据组成,但此时负例对只能来源于同一个batch的数据。通过queue提供负例,负例的来源范围更广,可以来自于不同batch的数据,并且负例不会产生梯度,计算量可以得到下降,使用的显存量会下降,同时训练模型的难度也会下降。

一句话概括,相比于simCLR,通过queue提供负例,可以减少负例增多导致的计算量增多

对于使用负例的对比学习算法而言,负例越多通常性能会越好,因此对batch size大小较为敏感,如下图所示,K为负例的个数,三类算法都需要负例。

在这里插入图片描述

为什么需要momentum encoder

从对比学习的motivation出发,更本不需要momentum encoder,但实验表明momentum encoder可以提升自监督模型的性能,如下表所示:
在这里插入图片描述
当m=0时(m即式2.0中的超参数),即不存在momentum encoder,此时无法训练,作者猜测若不存在momentum encoder,在特征空间中,负例的分布非常离散,网络难以进行优化,momentum encoder的更新方式,使得特征空间中,负例的分布更为集中(consistency),网络更容易优化,个人不是很认可,下面通过一个问题,谈谈我对momentum encoder的理解。

momentum encoder与encoder为两个模型,两者映射的特征空间是不一样的,同时由于参数的不断更新,不同负例所处的特征空间是不一致的,为什么两者产生的feature vector可以直接比较?

从上表可以看出,当m越趋近于1,性能越好,此时momentum encoder参数更新缓慢,特征空间的变化速度非常缓慢,queue中的不同负例可以近似看成位于一个特征空间中(注意到queue会丢弃头部的feature vector)。encoder输出的feature vector会经过一个fc层处理,进行特征空间转换,将样本转换到momentum encoder所处的特征空间中,从而使得样本、正例、负例之间可以相互比较。

当m趋近于0,性能变差,此时momentum encoder的参数变化剧烈将导致特征空间变化速度很快,queue中不同负例存在于不同的特征空间中,导致负例、正例之间不可以进行比较,从而难以优化。

一句话概括,如果我们想使用queue中的负例,就需要momentum encoder。

  • 10
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
监督对比学习是一种用于训练深度神经网络的自监督学习方法,它在没有标签的大规模未标记数据上进行训练。该方法通过使模型学习将相似样本聚集在一起,将不相似样本分开来,从而学习到有用的特征表示。 以下是几种常见的无监督对比学习方法: 1. MoCoMomentum Contrast):MoCo是一种基于对比学习的方法,它使用了动量更新策略来增强对比学习的性能。它通过构建一个动态的字典来扩展正样本的数量,并使用动量更新策略来提高特征的一致性。 2. SimCLR(Simple Contrastive Learning):SimCLR是一种简单而有效的对比学习方法,它通过最大化正样本间的相似性并最小化负样本间的相似性来进行训练。SimCLR使用了数据增强和大批量训练等技术来提高性能。 3. SwAV(Swapping Assignments between Views):SwAV是一种基于视图交换的对比学习方法,它通过交换不同视图下的样本分配来增强对比学习过程。SwAV还使用了聚类损失来进一步优化特征表示。 4. BYOL(Bootstrap Your Own Latent):BYOL是一种基于自举的对比学习方法,它通过预测一个网络的自我编码器输出来进行训练。BYOL使用了移动平均权重和在线网络更新等技术来提高性能。 5. SimSiam(Simplified Siamese):SimSiam是一种简化的孪生网络对比学习方法,它通过最大化网络预测的一致性来进行训练。相比于传统的对比学习方法,SimSiam省略了负样本的构造过程,简化了训练过程。 这些无监督对比学习方法在图像和自然语言处理等领域都取得了很好的效果,并且被广泛应用于预训练模型的训练中。每种方法都有其独特的特点和优势,可以根据具体任务和数据集选择适合的方法进行使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值