论文阅读:《Momentum Contrast for Unsupervised Visual Representation Learning》
论文地址:https://arxiv.org/abs/1911.05722
MoCo v1
本文前半部分将对自监督任务做一个简短介绍,包括自监督任务中常见的损失函数——InfoNCE、自监督的用途、自监督的评估方式,后半部分将对MoCo做一个介绍。他的设计原理是从一张图片中进行采样(crop),如果当前采样图片与另外一张图片来源于同一张图片,那么该图片就被认为当前图片的一个正样本,否则则被认为是负样本。
MoCo是一种为对比学习构建动态词典的机制,可用于各种借口任务。无监督学习的主要目的是预先训练可以通过微调转移到下游任务的表示(即特征)。这些结果表明,MoCo在很大程度上缩小了在许多计算机视觉任务中无监督和有监督表示学习之间的差距,并且在一些应用中可以替代ImageNet监督的预训练。
MoCo focuses on the loss function aspect.
A common way of defining a loss function is to measure the difference between a model’s prediction and a fixed target, such as reconstructing the input pixels (e.g., auto-encoders) by L1 or L2 losses, or classifying the input into pre-defined categories (e.g., eight positions ,color bins) by cross-entropy or margin-based losses.
Contrastive losses measure the similarities of sample pairs in a representation space.
Adversarial losses measure the difference between probability distributions.
noise-contrastive estimation (NCE) contrastive predictive coding (CPC) contrastive multiview coding (CMC)
本文将对比学习比作训练一个能查字典(dictionary look-up)的编码器的任务:对比学习的目的是在一系列已编码样本(a set of encoded samples)中寻找与已编码查询(an encoded query)最匹配的样本。
自监督无需人工标注标签,其让海量数据自身产生伪标签,将伪标签作为监督信号,训练特征提取器,训练得到的特征提取器将用于下游任务,例如图像分割、目标检测、图像分类等任务。目前自监督领域有诸多流派,近年来的主流流派为对比学习(Contrastive Learning),一张图片经过不同的数据增强后产生的feature vector也应该是近似的,对比学习试图通过这种对应关系,让模型理解一张图片中的语义信息。对比学习中,最常用的损失函数为InfoNCE。
Contrastive learning 即对比学习,可以将其视为训练一个编码器进行字典查询的任务。Contrastive learning [29], and its recent developments,can be thought of as training an encoder for a dictionary look-up task.
With similarity measured by dot product, a form of a contrastive loss function, called InfoNCE
Consider an encoded query q and a set of encoded samples {k0; k1; k2; ...}that are the keys of a dictionary. Assume that there is a single key (denoted as k+) in the dictionary that q matches. A contrastive loss is a function whose value is low when q is similar to its positive key k+ and dissimilar to all other keys (considered negative keys for q). With similarity measured by dot product, a form of a contrastive loss function, called InfoNCE, where is a temperature hyper-parameter per . The sumis over one positive and K negative samples. Intuitively,this loss is the log loss of a (K+1)-way softmax-based classifierthat tries to classify q as k+. Contrastive loss functionscan also be based on other forms, such asmargin-based losses and variants of NCE losses.
从一张图片中进行采样(crop),如果当前采样图片与另外一张图片来源于同一张图片,那么该图片就被为当前图片的一个正样本,否则则认为是负样本。所以当前采样图片我们称之为query,同时我们会将一系列的图片保存起来,形成一个图片集,并集合成一个dictionary,这些图片的特征作为这个dictionary的key,损失函数如上。
该损失衡量的是一个(query) 与一个(positive key) 和个(negative keys)的差异。更直观地讲,InfoNCE是能够将从个类别分类为的损失。
其中,为温度,是一个超参数,q 表示样本的特征向量,表示正例的特征向量。每个训练样本,都有一个正例,K个负例,InfoNCE会计算样本与正负例之间的余弦相似度,通过softmax函数进行归一化,接着套入负对数函数中。InfoNCE 可以看成一个K+1类的分类问题(损失函数为交叉熵),我们希望样本能够被分为第类,即样本与正例的余弦相似度要高于与负例的余弦相似度。自监督训练完一个特征提取器后,会将特征提取器冻结,接入一个线性分类器,依据线性分类器的性能好坏来判断特征空间的好坏,如果在分类问题中,特征提取器构建出的特征空间线性可分,则可认为该特征提取器性能优异,也可以将特征提取器用于其他下游任务中,依据下游任务的性能来判断特征提取器性能好坏。
如何产生正例,在MoCo中,对一张图片进行不同的数据增强,得到和,两张图片分别输入到encoder和momentum encoder卷积神经网络中,momentum encoder的输出即为正例。背后的直觉为一张图片经过不同的数据增强后产生的feature vector也应该是近似的,对比学习试图通过这种对应关系,让模型理解一张图片中的语义信息。
如何产生负例,momentum encoder输出的feature vector会保存在一个queue中,queue的大小固定,当queue容量达到上限时,会抛弃队列头部的feature vector,存入新的feature vector。MoCo的负例来源于queue中保存的feature vector,应该是随机采样一部分feature vector作为负例。负例对不会产生更新梯度。
MoCo is a general mechanism for using contrastive losses.We compare it with two existing general mechanisms in Figure 2. They exhibit different properties on the dictionary size and consistency.
如何更新momentum encoder,InfoNCE的梯度并不会回传至momentum encoder,momentum encoder采用动量方式进行更新,Dictionary as a queue.At the core of our approach is maintaining the dictionary as a queue of data samples.具体更新方式如下
Only the parameters are updated by back-propagation. The momentum update in Eqn.(2) makes evolve more smoothly than。
实验发现,适当增加m会带来更好地效果,因此本文 m=0.999,也印证了缓慢更新key的encoder是使用队列dictionary的核心。
1. 记 为一个batch的原始数据,经过augmentation分别得到 2. 分别将增强后的数据输入两个encoder,得到表示和, 3. ,这一路删了梯度,不再反传,就是凯明在文章《Exploring Simple Siamese Representation Learning》中提出的stop-gradient,即在计算相似性时,其中一个样本的新表示作为叶子节点,不计算梯度。该方法避免了孪生网络在无监督学习中陷入崩溃解,使得孪生网络可以为无监督学习领域提供更简洁的方案。 4. 计算和的互信息作为正类logits,大小为 N 5. 计算 和队列即dictionary中的key的互信息作为负类logits,大小为
6. 将正类logits和负类logits拼接,大小为,然后依据公式计算损失
7. 损失反传,更新 的encoder
8. 根据动量公式,更新的encoder
9. 将当前batch得到的特征 入队,队头的batch出队,维持长度为K。
为什么要存在负例,一张图片经过不同的数据增强后产生的feature vector也应该是近似的,对比学习试图通过这种对应关系,让模型理解一张图片中的语义信息。从对比学习的motivation出发,似乎不需要负例,但在实际训练中,对比学习可能出现奔溃解,即不论输入任何数据,网络的输出均为一个常数,如果仅使用正例,奔溃解会存在于网络的解空间中,负例的引入会消除解空间中的奔溃解。
MoCo的负例通过queue提供有什么好处,类似于simCLR,负例可以由一个batch中的其他数据组成,但此时负例对只能来源于同一个batch的数据。通过queue提供负例,负例的来源范围更广,可以来自于不同batch的数据,并且负例不会产生梯度,计算量可以得到下降,使用的显存量会下降,同时训练模型的难度也会下降。一句话概括,相比于simCLR,通过queue提供负例,可以减少负例增多导致的计算量增多。对于使用负例的对比学习算法而言,负例越多通常性能会越好,因此对batch size大小较为敏感。
1.无论是end-to-end,memory bank, 还是MoCo都受益于大的负样本数量,这也是支持本文构建大字典的依据之一。使用 MoCo 进行无监督训练后,固定网络不变,在其后增加一个线性层+SoftMax进行分类。后面的线性层和 softmax 是需要进行训练的。Figure 3中,随着负样本采样个数的增大准确率不断提升,且MoCo明显优于 End-to-End 和 Memory Bank 的方法;
2. momentum越大效果越好(本文取0.99~0.999);
3. A main goal of unsupervised learning is to learn features that are transferrable;
4. MoCo IG-1B相比于MoCo IN-1M虽然数据量提升了很多但性能相对提升较小,说明MoCo无法充分利用大规模数据。
两大创新
其一:dictionary队列化,把dictionary整成长度为K的队列,每次计算loss时就用K个负样本,然后将当前batch得到的特征 k(瞅好了,是k,不是q,k配合着创新二可以让key保持一致性) 入队,队头的batch出队,维持长度为K。dictionary的大小不需要受batchsize的约束,可以设置成任意大小。
其二:Momentum update,因为dictionary的key来自于不同的mini-batch,通过这种方式缓慢更新(slowly progressing)key的encoder,使得key的特征保持一致性。好处在于:避免了因为encoder的剧烈变化导致特征丢失一致性,同时也保持encoder一直处于被更新的状态。
在优化的过程中,如果key的encoder剧烈变化,key的特征也随着发生较大变化。query的encoder也在训练初期是在剧烈变化,而query的特征在softmax的分子,key在分母,当softmax的分子和分母均有巨大变化的时候,对于无监督的优化可能不是那么友好。因此MoCo限制了key的encoder的剧烈变化,相当于分母项的扰动少了,有助于query的encoder的更新。
Shuffle BN
标准resnet中的BN由于batch内的通信缺少信息会造成模型找一个看似低的loss欺骗前置任务,难以学习到一种真正好的表示,所以本文采用shuffleBN来解决这个问题。
shuffle BN是指:
多个GPU训练,并在每个GPU的样本上独立执行BN;
对于每个key encoder,在分配到每个GPU之前,shuffle每个mini-batch中的样本顺序(在编码之后会还原);
query encoder中的样本顺序不变。
以上做法确保了用于计算query的批统计信息batch stastistic 与其positive key 来自两个不同的子集。
对比学习不需要高细粒度的还原,它所记住的事物特征,不一定是像素级别的,而是更高维度的,这样也就会丢失部分细节。既没有监督信息,又不需要重构数据,那如何学习呢?对比学习就是数据增强+互信息。
数据增强augmentation:
1.颜色数据增强,对图像亮度、饱和度、对比度进行调整,最常见的是对亮度进行调整。
2.裁剪(crop),对图像进行随机裁剪;也可以先进行缩放,再进行裁剪。
3.反转(flip),进行水平或者垂直的反转。
4.平移变换(shift)。
5.旋转/仿射变换。
6.添加噪声(noise),添加高斯噪声。
7.模糊(blur),对图像进行模糊处理。
互信息
如果对最大化互信息的目标进行推导,就会得到对比学习的loss(也称InfoNCE),其核心是通过计算样本表示间的距离,拉近正样本,拉远负样本。也就是说,当我们能够区分该样本的正负例时,得到的表示就够用了。
关于pretext task(网络前置任务)和downstream task(下游任务)
Pretext task 可以理解为是一种为达到特定训练任务而设计的间接任务。比如,要训练一个网络来对 ImageNet 分类,可以表达为,目的是获得具有语义特征提取/推理能力的 。假设有另外一个任务 (Pretext task ),可以近似获得。 比如, , 表示为:。为什么 AE 可以近似呢? 因为 AE 要重建 就必须学习 中的内在关系,而这种内在关系的学习又是有利于我们学习 的。这种方式也叫做预训练,为了在目标任务上获得更好的泛化能力,一般还需要进行 等操作。因此,Pretext task 的好处就是简化了原任务的求解,在深度学习里就是避免了人工标记样本,实现无监督的语义提取。Pretext任务可以进一步理解为:对目标任务有帮助的辅助任务。这种任务目前更多用于 Self-Supervised learning,即一种更加宽泛的无监督学习。以往训练深度学习需要大量的人工标注的样本,这是费时耗力的,而自监督的提出就是为了打破这种人工标注样本的限制,目的是在没有人工标注的条件下也能高效的训练网络,自监督的核心问题是如何产生伪标签(Pseudo label),而这种伪标签的产生是不涉及人工的,比如上述的 AE 的伪标签就是自身。这里举几个在视觉任务里常用的 pretext task 伪标签的产生方式:Rotation(图片旋转),Colorization(图片上色),Inpainting(图片补全),Jigsaw Puzzle/Context Prediction(关系预测/上下文预测)
下游任务(downstream tasks)是一种对学习到的特征的定量评估(quantitative evaluations),常用的下游任务有:语义分割,对象检测,图像分类,动作识别
论文翻译:https://zhuanlan.zhihu.com/p/92038230
参考资料:https://blog.csdn.net/dhaiuda/article/details/117782404
https://zhuanlan.zhihu.com/p/401360692
https://blog.csdn.net/FatMigo/article/details/103211622
https://blog.csdn.net/weixin_42764932/article/details/112768710
https://blog.csdn.net/weixin_42764932/article/details/112927959
https://www.cnblogs.com/BlairGrowing/p/15023137.html
https://zhuanlan.zhihu.com/p/342839459