小全读论文《Momentum Contrast for Unsupervised Visual Representation Learning》(MoCo)

介绍Momentum Contrast(MoCo)无监督视觉表示学习方法,解决图片无监督问题,构建large和consistent的dictionary,通过Dictionary as a queue和Momentum update两大改进,实现在多个下游任务上的优秀表现。


这是何恺明大大的新作,当然论文上满满都是赫赫有名的大佬们,Ross Girshick、Saining Xie等。这篇文章是做图片无监督问题的,自己虽然不是做无监督问题的,冲着一众大佬的光环,忍不住仔细钻研了一把,嘻嘻嘻(*_*),恺明小迷弟石锤了。 全文均根据自己理解整理的,如有纰漏欢迎指出。

1.浅谈无监督问题

1.1 什么是无监督问题?

有监督问题就是利用监督信息(也就是标注信息)去设计和训练模型,无监督问题就是不需要依赖于监督信息也能去设计和训练相应的模型,达成某些目的,如本文关注的图片无监督问题,就是在只给了你海量的图片的前提下而没有任何图片标签信息,依然能训练得到一个很好的特征提取器。他的目的是这个特征提取器能放之四海而皆准,就是你以后来了一个新任务,不需要设计新的feature了,直接用我的这个特征提取器就ok了,连finetune都不需要了。

1.2 图片无监督问题有什么意义?

我们可以参考一个无监督问题的应用,如nlp里面的word2vector算法,如GloVe和Bert,像cv很多领域都直接利用了这些算法,作为直接的external knowledge来使用。因此,图片无监督问题其实也希望能达到像Bert这种效果,我能有一个通用的图片特征模型,这个模型可以用于任何的图片提取feature,特别是,对于某些领域,如医疗,数据特别少,仅仅基于这些稀少的数据是很难提取到很好的feature的,但是通过这种通用的图片特征模型就能提取到较好的特征。

1.3 图片无监督问题的难点是什么呢?

为什么NLP领域能出现像Bert这样子的无监督模型,但是为什么目前CV领域却没有出现像Bert这样的模型?文章也指出了这个问题的难点,这里我也适当加入了自己的理解:

  1. NLP是以单词为输入的,而CV是以图片为输入(这个“输入”的意思是作为模型的输入)。单词是相对离散化的输入,他的输入可以采取one-hot的形式,可变的程度不高。而图片的输入维度太高,而且相对来说连续化一些,可变的程度高得多,如一个20x20的输入图片,就可以有无数种的可能,而一个单词最后也就n种变化(n是总词库的大小,在不同的位置取1而形成不同的one-hot)
  2. NLP的信息更加偏向于结构化,而CV不具备这种结构化信息。这种结构化信息可以举例来看,如NLP中很多模型是以句子为单位去设计模型的,一个句子往往是根据语法结构以及单词的词性构建的,主谓宾,宾语从句,状语从句和动词,名词等,而语法结构往往是有限的。而CV中的图片是很难有一致的结构化信息,如图片的变换太多,图片中物体的相互组合、物体的相互遮挡、物体的环境因素等,模型需要控制和适应的点会很多。

2.MoCo(本文方法)

在理解本文之前,首先先简要介绍一下图片无监督的方法,好理解论文老是提到的几个词(dictionary,key)的含义,我一开始看文章的时候,刚看到这几个词,真是云里雾里,绕有一种众人皆醒我独醉的感觉。

2.1 前备知识

我们都知道,有监督问题就是基于预测结果和监督信息设计一个损失函数loss function,但是无监督问题应该怎么设计loss function呢?图片无监督问题的一个经典的方法是contrastive learning里的instance discrimination method(因为论文提到了,我就称之为经典方法吧啊哈哈哈哈哈),他的设计原理是:
从一张图片中进行采样(crop),如果当前采样图片与另外一张图片来源于同一张图片,那么该图片就被为当前图片的一个正样本,否则则认为是负样本
所以当前采样图片我们称之为query,同时我们会将一系列的图片保存起来,形成一个图片集,并集合成一个dictionary,这些图片的特征作为这个dictionary的key(文章也没说dictionary的value是什么,我理解为是每个key对应的图片id吧,这其实不碍于理解整篇文章)
基于上述的设计原理,可以设计一个loss函数(InfoNCE):
L q = − l o g e x p ( q ⋅ k + / τ ) ∑ i = 0 K e x p ( q ⋅ k i / τ ) L_q=-log \frac{exp(q \cdot k_+/\tau)}{\sum^K_{i=0}exp(q \cdot k_i/\tau)} Lq=logi=0Kexp(

MoCoMomentum Contrast)是一种对比学习框架,在计算机视觉领域具有重要影响。虽然当前引用未直接提及 MoCo 的原始论文,但可以提供其核心信息如下: MoCo 原始论文标题为《Momentum Contrast for Unsupervised Visual Representation Learning》,由 He et al. 提出,并发表于 CVPR 2020 [^3]。该论文的核心贡献在于设计了一种动态字典的方法来解决对比学习中的内存瓶颈问题。通过引入动量更新机制,MoCo 能够维持一个一致的队列以存储负样本特征,从而提高无监督表示学习的效果。 以下是 MoCo 的主要特点: - 动量更新编码器:利用两个编码器(query encoder 和 key encoder),其中 key encoder 使用动量更新策略逐步调整参数。 - 队列机制:为了避免显存占用过高,MoCo 设计了一个循环队列来保存历史负样本特征。 ```python import torch.nn as nn class MoCo(nn.Module): def __init__(self, base_encoder, dim=128, K=65536, m=0.999, T=0.07): super(MoCo, self).__init__() self.K = K self.m = m self.T = T # 创建 query 和 key 编码器 self.encoder_q = base_encoder(num_classes=dim) self.encoder_k = base_encoder(num_classes=dim) # 初始化 key 编码器权重与 query 编码器相同 for param_q, param_k in zip(self.encoder_q.parameters(), self.encoder_k.parameters()): param_k.data.copy_(param_q.data) param_k.requires_grad = False # 注册队列 self.register_buffer("queue", torch.randn(dim, K)) self.queue = nn.functional.normalize(self.queue, dim=0) @torch.no_grad() def _momentum_update_key_encoder(self): """ 更新 key 编码器参数 """ for param_q, param_k in zip(self.encoder_q.parameters(), self.encoder_k.parameters()): param_k.data = param_k.data * self.m + param_q.data * (1. - self.m) ``` [^3]
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值