对比学习(一):CV领域对比学习的兴起

对比学习

在这里插入图片描述
论文Dimensionality Reduction by Learning an Invariant Mapping是由LeCun团队做的比较早的关于对比学习的工作。在这篇论文中,作者研究了一种降维方法,学习不变映射(DrLIM),用于学习一个全局一致的非线性函数,该函数将数据均匀映射到输出流形上。学习仅依赖于邻域关系,不需要输入空间中的任何距离度量。现有降维方法一般有两个缺点,其一是不会产生一个从输入到流形的函数或映射,这个函数或映射可以应用于与训练点的关系未知的新点;其二是许多方法都假定在输入空间中存在一个有意义(可计算)的距离度量。

LeCun团队认为所提出的DrLIM方法的主要有点有:1. 只需要训练样本之间的邻域关系,这些关系可以来自先验知识或手工标记,且独立于任何距离度量;2. 可以学习对输入的复杂非线性变换不变的函数(如光照变化和几何扭曲);3. 学习到的函数可以用来映射训练过程中没有看到的新样本,没有先验知识;4. 函数在某种意义上是平滑的,在输出空间中是连贯的。

对于低维映射,应具有如下的属性:

  1. 输出空间的简单距离度量(如欧氏距离)应该近似于输入空间中的邻域关系;
  2. 映射不应该受限于在输入空间中实现简单的距离度量,并且应该能够学习复杂变换的不变性;
  3. 即使对于邻域关系未知的样本,它也应保持可靠。

基于上述分析,设计了一种新型损失函数,对比损失函数:
D W ( X 1 , X 2 ) = ∣ ∣ G W ( X 1 ) − G W ( X 2 ) ∣ ∣ 2 D_{W}(X_1,X_2)=||G_W(X_1)-G_W(X_2)||_2 DW(X1,X2)=∣∣GW(X1)GW(X2)2

L ( W ) = ∑ i = 1 P L ( W , ( Y , X 1 , X 2 ) i ) \mathcal{L}(W)=\sum\limits^P_{i=1}L(W,(Y,X_1,X_2)^i) L(W)=i=1PL(W,(Y,X1,X2)i)

L ( W , ( Y , X 1 , X 2 ) i ) = ( 1 − Y ) L S ( D W i ) + Y L D ( D W i ) L(W,(Y,X_1,X_2)^i)=(1-Y)L_S(D^i_W)+YL_D(D^i_W) L(W,(Y,X1,X2)i)=(1Y)LS(DWi)+YLD(DWi)

式中 ( Y , X 1 , X 2 ) i (Y,X_1,X_2)^i (Y,X1,X2)i为第 i i i个标记的样本对, L S L_S LS为相似点对的部分损失函数, L D L_D LD为不相似点对的部分损失函数, P P P为训练对的个数(可以等于样本个数的平方)。

L S L_S LS L D L_D LD的设计必须使 L L L最小化时,对于相应的 W W W会导致相似对的 D W D_W DW值较低,而不相似对的 D W D_W DW值较高。

这种方法能够有效利用样本自身的特征进行无监督学习,然而,这种设计意味着batch size越大越好,最好能将所有数据放在一个batch。这显然是很难做到的。

基于动量对比的无监督视觉表征学习

在这里插入图片描述

一、引言

何恺明团队认为,无监督表示学习在自然语言处理中非常成功,但在计算机视觉领域,监督预训练仍然占据主导地位,其原因可能源于它们各自信号空间的差异:语言任务具有离散的信号空间(字、词等),用于构建token化的字典,无监督学习可以基于该字典进行。而计算机视觉更关注字典构建,原因是原始信号处于连续的高维空间中,并且不适合人类交流。

基于对比损失的方法可以被认为是构建动态字典。字典中的键值(Token)从数据(例如图像或patch)中采样,并由编码器网络表示。无监督学习训练编码器执行字典查找:编码的Query应该与其匹配的键值相似,并与其他键值不相似。学习被表述为最小化对比损失。

基于上述讨论,所构建的字典具有一下理想特性:

  1. 足够大;
  2. 在训练过程中保持一致性。

直观的说,一个更大的字典可能更好地采样潜在的连续高维视觉空间,而字典中的键值应该有相同或相似的编码器表示,一遍它们与查询的比较是一致的。然而,使用对比损失的现有方法存在一定的局限。

针对现有问题,该论文提出了动量对比(MoCo)作为一种构建具有对比损失的无监督学习的大型一致字典的方法。

将字典维护为数据样本的队列:当前小批量的编码表示被入队,最旧的被出队。队列将字典大小与batch大小解耦,使其可以很大。此外,由于字典的键值来自前面的几个batch,因此提出了一个缓慢处理的键值编码器,具体为查询编码器的基于动量的移动平均来实现,以保持一致性。
在这里插入图片描述

相关工作

无监督/自监督学习方法通常涉及两个方面:代理任务和损失函数。术语“前提”意味着解决的任务并非真正感兴趣,而只是为了学到一个良好的数据表示而解决的。损失函数通常可以独立于代理任务进行研究。MoCo关注损失函数方面。接下来,我们将从这两个方面讨论相关研究。

损失函数是为了衡量模型的预测输出和固定目标之间的差异,如通过 L1、L2 损失重构像素或通过交叉熵对输入进行分类。对比学习的损失测量的是样本对在特征空间的相似性,在训练过程中,目标通常是不固定的。对抗学习的损失衡量的是概率分布的差异,经常用在无监督数据生成。

代理任务。已经提出了各种各样的代理任务。如重构整张图、重构某个 patch、给图片绘上颜色。具体地,恢复在某种破坏下的输入,例如去噪自动编码器[58],上下文自编码器[48],或交叉通道自编码器(着色)[64, 65]。一些代理任务通过对单个(“示例”)图像的转换形成伪标签,例如[17]中的变换,补丁排序[13, 45],在视频中跟踪[59]或分割对象[47],或对特征进行聚类[3, 4]。

对比学习与代理任务。各种代理任务可以基于某种形式的对比损失函数。实例区分方法[61]与示例为基础的任务[17]和NCE [28]相关。对比预测编码(CPC)[46]中的代理任务是一种上下文自编码[48],而在对比多视角编码(CMC)[56]中,它与着色[64]相关。

三、方法

3.1 对比学习与字典查找

对比学习及其最近的发展,可以看作是训练一个编码器来完成字典查找任务,如下所述。

考虑一个编码查询 q q q和一组编码样本 k 0 , k 1 , k 2 , … {k_0,k_1,k_2,…} k0,k1,k2,,对应字典的键值。假设字典中有一个键值(记为 k + k_+ k+)与 q q q匹配。对比损失函数是指,当 q q q与它的正键值 k + k_+ k+相似时,它的值很小,且与所有其他键值(认为是 q q q的负键)不相似。通过点积测量相似性。本文考虑对比损失的一种形式,称为InfoNCE:
L q = − l o g e x p ( q ⋅ k + / τ ) ∑ i = 0 K e x p ( q ⋅ k i / τ ) \mathcal{L}_q=-log\frac{exp(q\cdot k_+/\tau)}{\sum^K_{i=0}exp(q\cdot k_i/\tau)} Lq=logi=0Kexp(qki/τ)exp(qk+/τ)
其中 τ \tau τ为温度超参数。求和是在一个正样本和K个负样本之上进行的。直观地说,这个损失是一个基于 K + 1 K+1 K+1 s o f t m a x softmax softmax分类器的对数损失,该分类器试图将 q q q分类为 k + k_+ k+

对比损失充当训练表示查询和键值的编码器网络的无监督目标函数。通常情况下,查询表示为 q = f q ( x q ) q=f_q(x^q) q=fq(xq),其中 f q f_q fq是编码器网络, x q x^q xq是查询样本(同理 k = f k ( x k ) k=f_k(x^k) k=fk(xk))。它们的实例化取决于具体的代理任务(pretext task)。输入 x q x_q xq x k x_k xk可以是图像、patch或包含一组patch的上下文内容。网络的 f q f_q fq f k f_k fk可以是相同的,部分共享的,或者是不同的。

pretext task 通常是指这样一类任务,该任务不是目标任务,但是通过执行该任务可以有助于模型更好的执行目标任务。其本质可以是一种**迁移学习:**让网络先在其他任务上训练,使模型学到一定的语义知识,再用模型执行目标任务。这里提到的其他任务就是pretext task。

3.2 动量对比

从以上的角度看,对比学习是一种在高维连续输入(如图像)上构建离散字典的方法。这个字典是动态的,因为键是随机抽样的,而键编码器在训练过程中发生演变。我们的假设是,通过一个涵盖丰富的负样本集的大字典,可以学到良好的特征,同时尽管字典键的编码器在演变中,但仍然保持尽可能一致。

作为队列的字典:字典作为队列。我们方法的核心是将字典维护为数据样本的队列。这允许我们重复使用来自即将到来的小批次的编码键。引入队列使得字典的大小与小批次的大小解耦。我们的字典大小可以远远大于典型的小批次大小,并且可以灵活地独立设置为一个超参数。

字典中的样本逐步被替换。当前小批次被入队到字典中,而队列中最老的小批次被移除。字典始终代表了所有数据的一个抽样子集,同时维护这个字典的额外计算是可管理的。此外,移除最老的小批次可能是有益的,因为它的编码键是最过时的,因此与最新的键最不一致。

动量更新:使用队列可以使字典变得很大,但也使得通过反向传播来更新键编码器变得难以实现(梯度应传播到队列中的所有样本)。一种简单的解决方案是从查询编码器 f q f_q fq中复制键编码器 f k f_k fk,忽略这个梯度。但在实验中,这种解决方案得到了较差的结果。我们假设这种失败是由于快速变化的编码器导致了键表示的不一致性。为了解决这个问题,我们提出了一个动量更新。

形式上,将 f k f_k fk的参数记为 θ k \theta_k θk f q f_q fq的参数记为 θ q \theta_q θq,将 θ k \theta_k θk更新为:
θ k ← m θ k + ( 1 − m ) θ q \theta_k\leftarrow m\theta_k+(1-m)\theta_q θkmθk+(1m)θq
其中 m ∈ [ 0 , 1 ) m\in[0,1) m[0,1)为动量系数。只有参数 θ q \theta_q θq通过反向传播更新。该更新方式使得 θ k \theta_k θk θ q \theta_q θq更平滑地演化。因此,尽管队列中的键值由不同的编码器编码(在不同的mini-batch中),但这些编码器之间的差异可以很小。在实验中,相对较大的动量(例如m=0.999)比较小的动量(例如m=0.9)要好得多,这表明缓慢演变的键值编码器是充分利用队列的核心。

与先前机制的关系:MoCo是使用对比损失的一般机制。其与现有的两种通用机制进行比较,它们在字典大小和一致性上表现出不同的属性。
在这里插入图片描述
通过反向传播的端到端更新是一种自然的机制(图2a)。它使用当前小批次中的样本作为字典,因此键是一致地被编码的(由相同的编码器参数集)。但字典大小与小批次大小耦合在一起,受限于GPU内存大小。它还受到大型小批次优化的挑战。一些最近的方法基于由局部位置驱动的代理任务,其中通过多个位置可以使字典大小变得更大。但这些代理任务可能需要特殊的网络设计,比如对输入进行块化或自定义感受野大小,这可能会使这些网络转移到下游任务变得更加复杂。

另一种机制是由提出的内存银行方法(图2b)。内存银行由数据集中所有样本的表示组成。每个小批次的字典是从内存银行中随机抽样得到的,没有反向传播,因此可以支持大字典大小。然而,内存银行中样本的表示在上次更新时发生了变化,因此抽样的键实质上关于整个过去时期各个步骤上的编码器,因此一致性较差。对内存银行的动量更新,其动量更新是在相同样本的表示上进行的,而不是在编码器上。这个动量更新与我们的方法无关,因为MoCo不跟踪每个样本。而且,我们的方法更节省内存,并且可以在规模达到数十亿的数据上进行训练,而对于内存银行而言,这可能是难以处理的。

3.3 代理任务

对比学习可以驱动各种代理任务。该论文使用个体判别任务用于研究。如果查询和键来自同一图像,我们将其视为正对,否则将其视为负样本对。我们在随机数据增强的情况下,对同一张图像随机取两个“视图”,形成正对。查询和键分别由它们的编码器 f q f_q fq f k f_k fk编码。编码器可以是任何卷积神经网络。对于当前的小批量,我们对查询及其对应的键进行编码,它们形成正样本对。负样本来自队列。

技术细节。我们采用ResNet作为编码器,其最后一个全连接层(经过全局平均池化)具有固定维输出(128-D)。该输出向量由l2范数归一化。这是查询或键的表示形式。设温度系数 τ \tau τ为0.07。数据增强设置如下:从随机调整大小的图像中截取224×224-pixel裁剪,然后经历随机颜色抖动,随机水平翻转和随机灰度转换,这些都可以在PyTorch的torchvision包中使用。

Shuffling BN。我们的编码器 f q f_q fq f k f_k fk都使用了标准ResNet 中的批量归一化(BN)。在实验中,我们发现使用BN会阻止模型学习到良好的表示,这与[35]中的报告相似(该方法避免使用BN)。模型似乎会“作弊”代理任务并轻松找到低损失的解决方案。这可能是因为样本之间的批内通信(由BN引起)泄漏了信息。

我们通过进行Shuffling BN来解决这个问题。我们使用多个GPU进行训练,并且对每个GPU的样本独立执行BN(与通常的做法一样)。对于键编码器 f k f_k fk,我们在将其分配到GPU之前对当前小批次的样本顺序进行洗牌(在编码后进行洗牌回来);查询编码器 f q f_q fq的小批次样本顺序不发生改变。这确保用于计算查询和其正样本键的批次统计来自两个不同的子集。这有效地解决了作弊问题,并允许训练从BN中受益。

我们在我们的方法和其端到端消融对照组(图2a)中都使用了Shuffling BN。而对照组的内存银行(图2b)则不受此问题的影响,因为正样本键来自过去的不同小批次。

四、实验

在ImageNet-1M,Instagram-1B两个数据集上进行实验。

ImageNet-1M(IN-1M):这是ImageNet的训练集,包含大约128万张分为1000类的图像(通常称为ImageNet-1K;我们根据图像数量而非类别进行计数,因为无监督学习不利用类别信息)。该数据集在其类别分布上是均衡的,其图像通常包含对象的标志性视图。

Instagram-1B(IG-1B):这是来自Instagram的大约10亿(940M)张公共图像的数据集。这些图像来自于与ImageNet类别相关的约1500个哈希标签[44]。与IN-1M相比,这个数据集相对不太经过筛选,并且具有真实世界数据的长尾、不平衡分布。该数据集包含具有标志性对象和场景级图像。

训练:我们使用SGD作为优化器。SGD的权重衰减为0.0001,SGD的动量为0.9。对于IN-1M,我们在8个GPU上使用256的小批量大小(Algorithm 1中的N),初始学习率为0.03。我们进行200个epoch的训练,学习率在第120和160个epoch时乘以0.1[61],训练ResNet-50大约需要53个小时。对于IG-1B,我们在64个GPU上使用1024的小批量大小,并且学习率为0.12,经过每62.5k次迭代(6400万张图像)后按0.9的指数衰减。我们进行了125万次迭代(IG-1B的大约1.4个epoch),使用ResNet-50大约需要6天。

4.1 线性分类协议

我们首先通过一个常见的协议,即在冻结特征上进行线性分类,来验证我们的方法。在这个小节中,我们在IN-1M上执行无监督的预训练。然后我们冻结这些特征并训练一个监督线性分类器(一个全连接层后接softmax)。我们在ResNet的全局平均池化特征上训练这个分类器,进行100个epoch的训练。我们报告在ImageNet验证集上的1-crop,top-1分类精度。

如左图所示,三种对比学习方法结果对比:黑色的线表示的是端到端的学习,它的结果只有三个点,因为受限于显卡内存,蓝色的线表示的是 memory bank 的形式,它可以用很大的字典,所以它可以随着字典增大一直训练,但是它的效果整体上要比端到端学习和 MoCo 的结果都要差一截。作者说这可能是因为特征的不一致性导致的。橙色的线表示 MoCo,MoCo 确实可以有很大的字典,之所以停在65536这个数字,从图中可以看到,从16384到65536性能也已经比较饱和了,所以再大也可能不会带来更多的性能提升了。如果拿 MoCo 和端到端学习的方法做比较,可以发现它们的曲线在刚开始的时候的重合度还是比较高的,但是作者说,因为没有实验的支撑,不知道黑线是否能继续按照现有的趋势继续增长下去,有可能结果会更高,也有可能结果会更低,但是因为做不了实验,所以无从得知。

如下图表格所示,动量使用一个相对较大的值(0.999或者0.9999)的时候性能是最好的,差不多都是59,这就说明了一个变化非常缓慢的编码器是对对比学习有好处的,因为它能够提供一个一致性的特征。但是当把动量逐渐变小,变到0.99或者是0.9的时候,性能的下降就比较明显了,尤其是当直接去掉动量,直接将 query 的编码器拿过来当 key 编码器用的时候,就会发现不光是性能下降的问题,整个模型甚至都不能收敛。

右下图是和其它分类方法的比较,首先可以发现,对比学习的效果还是不错的,因为准确率要比没有使用对比学习得到得结果要好。作者还强调:在无监督学习中,模型的大小还是非常关键的(模型越大,一般效果就会越好),所以只是比较最后的准确率,而不去关注模型大小的话,就不太公平了,从图中可以看到 MoCo 既能在小模型上得到最好的效果,也能在大模型的比较中得到最好的结果。
在这里插入图片描述

无监督学习最重要的目标是学习到可迁移的特征,作者用视觉领域中最常见、应用最广的检测任务来做无监督的MoCo 预训练模型和 ImageNet 的有监督预训练模型之间的比较。表2种第一行使用的是随机初始化的模型再做微调,所以它是一个基线网络,分数比较低;第二行使用的是 有监督ImageNet 的预训练的模型做初始化然后再做微调,也就是一个比较强的基线结果;最后两行分别是 MoCo 在 ImageNet-1M上和在 Instagram-1 上做无监督预训练当作模型的初始化,然后再做微调。可以看到大多数结果显示 MoCo在 ImageNet-1M 上的预训练就已经超过了有监督的预训练模型。当换成更大的数据集的时候还会有进一步的提升。

接下来作者又再次比较了三种对比学习的检测结果,从表3可以看到 MoCo 和前面两种方式比起来确实是好了很多,而且最主要的是之前的两种方法都没有超越有监督预训练模型的结果,只有MoCo是真的超越了。
在这里插入图片描述

作者又在 COCO 数据上进行了对比。除了在设置a里面 MoCo 的模型稍显逊色,在剩下的三个设置下,MoCo 预训练的模型都比 ImageNet 有监督预训练模型得到的效果要好。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值