自监督表征预训练之对比学习
本文为MoCo 论文逐段精读【论文精读】、对比学习论文综述【论文精读】 笔记。
随着 GPT、BERT、T5 等一系列方法的提出,无监督/自监督方法已经在自然语言处理领域取得了巨大的成功。然而,在计算机视觉领域,无监督表征学习的方法虽然也有一些进展,但性能始终与有监督学习的方法有一定差距。MoCo 作为无监督表征学习的方法,首次追平甚至超越了有监督方法。它不仅在 ”兵家必争之地“ ImageNet 上逼近了主流的有监督方法,更惊艳的是,在检测、分割等计算机视觉主流任务上,MoCo 超越甚至大幅超越了有监督方法。
根据 bryanyzhu 老师的分享,本文将精读 MoCo,串烧其他对比学习论文。串烧部分,根据发展历程,分为四个阶段:1. 百花齐放 2. CV双雄 3. 不用负样本 4. Transformer。
对比学习简介
在介绍 MoCo 之前,首先简单介绍一下什么是对比学习。顾名思义,对比学习就是通过“对比”的方式来学习。如图 1 所示。现在有三张图像 I 1 , I 2 , I 3 I_1,I_2,I_3 I1,I2,I3 。其中 I 1 , I 2 I_1,I_2 I1,I2 语义内容相同,都是汽车,它们彼此在对比学习中称为正样本。 I 3 I_3 I3 语义内容与它们不同,是猫,相对于前两者来说是负样本。对比学习通过一个特征提取器,提取图像的特征,根据对比关系: I 1 , I 2 I_1,I_2 I1,I2 的特征 f 1 , f 2 f_1,f_2 f1,f2 接近,而 I 3 I_3 I3 与它们的特征远离 f 3 f_3 f3,来驱动模型训练。
在对比学习的过程中,不需要人工标注的标签,而需要明确正负样本的定义。因此,一般认为对比学习是无监督/自监督学习方法。正负样本由人们通过设计代理任务,设定划分规则来定义。代理任务的设计是对比学习的关键。
近年来,对比学习最常用的代理任务是实例判别(instance discrimination)。具体过程如图2所示。实例判别任务通过对同一张图像 x i x_i xi 施加不同的数据增强 T 1 , T 2 \mathcal{T_1},\mathcal{T}_2 T1,T2 得到正样本对 x i 1 , x i 2 x_i^1,x_i^2 xi1,xi2 ,数据集中其他图像 x j , j ≠ i x_j,j\ne i xj,j=i 均视作 x i 1 , x i 2 x_i^1,x_i^2 xi1,xi2 的负样本。在对比学习中,一般将 x i 1 , x i 2 , x j x_i^1,x_i^2,x_j xi1,xi2,xj 分别称为锚点、正样本和负样本。构建正负样本对之后,将图像送入模型提取特征 f a , f p , f n f_a,f_p,f_n fa,fp,fn,并根据正负样本定义计算损失(如 NCE 损失等),拉近正样本间距离,推远与负样本距离,更新模型参数。以上就是实例判别任务的正负样本定义及对比学习过程。
对比学习的过程看起来非常简单直接。它最大的优势在于灵活性。根据需要,合理地定义正负样本即可,其他的过程基本都是标准的。定义正负样本的方式非常灵活,可以根据特定的任务/业务需求自行设计。如视频领域中,可以定义同一视频中任意两帧是正样本,其他视频中的帧是负样本;在 NLP 中,SimCSE 将同一个句子输入模型,在不同 dropout 的情况下提取特征,作为正样本,其他不同句子的特征是负样本;CMC 将同一个物体的不同视角(view),如 RGB图和深度图、不同视图等,看做是正样本,其他物体的视角作为负样本。更广为人知的,在多模态领域,CLIP 将同一个图像文本对的图像和文本作为正样本,其他图像文本对的图像和文本作为负样本。总之,只要我们能够根据具体的任务,合理地定义正负样本,就可以使用接下来将要介绍的对比学习研究成果,进行自监督的表征学习。
MoCo精读
前言
MoCo 将对比学习看作是“字典查询”(dictionary look-up)任务。具体来说,MoCo 构建了一个动态字典,该字典由一个队列和一个滑动平均的编码器组成。由于队列中的样本不需要维护梯度信息,因此队列中可以保存大量负样本。滑动平均的编码器则是为了使得队列中特征尽可能具有一致性。从而,MoCo 训练时有一个规模大且一致性强的字典,有利于无监督对比学习的训练。MoCo 的预训练效果十分惊人,在 ImageNet 分类任务上与有监督方法接近,甚至能够在检测、分割等视觉任务上迁移时超越有监督预训练的模型。
在自然语言处理领域,GPT 和 BERT 的成功已经验证了无监督学习的潜力。然而,当时在计算机视觉领域,主流的工作还是进行有监督学习。作者认为,这种差异可能是因为他们的信号空间的不同。语言类任务具有离散的信号空间(如单词、词根词缀等),可以自然地建立一个 tokenized dictionary(vocab),将每个单词映射为对应的特征。如果将字典中所有的单词看做是一个类别,就相当于存在天然的标签,从而可以利用语言建模(GPT)或掩码语言建模(BERT)进行自监督的训练。因此,NLP 的无监督学习比较容易建模和优化。然而,在计算机视觉领域,信号是连续且高维的,不适合建立字典来建模。因此,计算机视觉领域的无监督学习尚未取得较好的成果。
作者将当时已有的对比学习的相关工作归纳为去建立一个动态字典(dynamic dictionaries)。字典的“键”(keys)就是数据集中图像经过编码器 E k E_k Ek 提取的特征。对比学习就是要训练一个编码器 E q E_q Eq 来执行字典查询, E q E_q Eq 对查询图像进行编码,得到“查询”(query),query 需要与字典中匹配的 key 接近,与不匹配的 keys 远离。如此,就能像 NLP 中一样,构造出字典,通过预测“类别”(正样本),进行自监督表征预训练。
注意,MoCo 文中的 key 就是一般对比学习定义中的正负样本,而 query 则对应锚点。两个编码器 E k E_k Ek 与 E q E_q Eq 可以是相同的,也可以是不同的,MoCo 中是不同的。
作者指出,在这个视角下,我们要构造的字典需要有两个特点:大、一致,从而能更好地进行表征预训练。更大的字典,能够更好地从连续、高维的视觉空间中采样。另外,query 和 key 最好是通过相同或相似的编码器提取的较为一致的特征,也就是 E q E_q Eq 和 E k E_k Ek 要尽可能一致,从而能进行可靠的对比。现有的方法都在上述两个特点的其中一个上受限。
为了构造出同时满足这两个特点的字典,作者提出了 MoCo,其框架如图 3 所示。大体与我们在图 2 中介绍的一般的对比学习方法类似,关键的区别在于队列(queue)和动量编码器(momentum encoder)的引入。引入队列,是为了将批尺寸与字典大小解耦。在一些已有的方法中,字典的大小就是当前的批尺寸。受限于 GPU 显存容量的限制,批尺寸不可能无限地增大,导致这些方法无法构造出足够大的字典。而引入队列,维护样本特征,在每个批次的训练中,将最新的一批样本特征存入字典,最老的一批样本特征移出字典,按照先进先出的特性维护队列。队列维护的样本特征不需要存储在显存中,这样就能不受批尺寸大小的限制,尽量地扩大字典容量。队列的大小(即字典的大小)可以比批尺寸大很多。然而,这样带来的问题是队列中的样本特征一致性差。队列中较新的样本特征与较老的样本特征由不同的编码器提取,而编码器经过多轮迭代,参数已经发生很大变化,从而导致队列中样本特征一致性差。为了解决这个问题,MoCo 引入了栋梁编码器,通过滑动平均的方式更新动量编码器的权重,并设定一个较大的动量值,此时动量编码器更新足够缓慢,从而提高队列中的新老特征的一致性。
确定了对比学习的框架之后,再来看一下文中选用的损失函数。MoCo 作为一种对比学习的框架,理论上可以搭配任何对比学习的损失和正负样本的定义方式来进行训练。文中选用了简单有效的实例判别(instance discrimination),该代理任务我们在之前介绍对比学习时有提到,这也是近些年对比学习方法中比较常用的损失。在 MoCo 论文定义的“字典查询”视角下,实例判别任务即如果 query 与 key 是来自同一张图像经过不同数据增强之后的编码特征,则他们是匹配的,否则是不匹配的。
除了在 ImageNet 上进行预训练,MoCo 还在更大、更嘈杂的 Instagram 1B 上进行了预训练,效果有进一步的提升。在视觉领域验证了继续扩大模型或数据量时,模型性能仍可一致提升,尚未出现饱和现象。
方法
将对比学习视作字典查询
现有的对比学习方法,可以归纳为一个字典查询任务。考虑一个经过编码的 query q q q 和一组经过编码的 keys k 0 , k 1 , k 2 , … {k_0,k_1,k_2,\dots} k0,k1,k2,… ,假设 keys 中只有一个 key(记作 k + k_+ k+) 是与 q q q 匹配的。对比损失希望在 q q q 与 k + k_+ k+ 接近,与其他所有 keys 远离时,损失值较低。MoCo 采用 InfoNCE loss:
L q = − log exp ( q ⋅ k + / τ ) ∑ i = 0 K exp ( q ⋅ k i / τ ) \mathcal{L}_q=-\log\frac{\exp(q\cdot k_+/\tau)}{\sum_{i=0}^K\exp(q\cdot k_i/\tau)} Lq=−log∑i=0Kexp(q⋅ki/τ)exp(q⋅k+/τ)
其中 τ \tau τ 是温度超参数。上式分母的求和项包括了 1 个正样本和 K K K 个负样本,共 K + 1 K+1 K+1 个样本。实际上,这个损失就是一个 K + 1 K+1 K+1 类的 softmax 分类问题,希望将 q q q 预测为类别 k + k_+ k+ 。
关于对比学习 InfoNCE loss 的演进
考虑有 K K K 个类别的 softmax 操作: exp ( z + ) ∑ i K exp ( z i ) \frac{\exp(z_+)}{\sum_i^K\exp(z_i)} ∑iKexp(zi)exp(z+) ,如果再对其取负对数 − log exp ( z + ) ∑ i K exp ( z i ) -\log\frac{\exp(z_+)}{\sum_i^K\exp(z_i)} −log∑iKexp(zi)exp(z+) ,就是交叉熵损失函数,常用于有监督学习 K K K 分类任务。对比学习领域常用的实例判别任务也可以看作是多分类任务,但是类别数 K K K 大很多。以 ImageNet-1K 为例,有监督学习时,是 1000 分类任务,自监督学习实例判别时,相当于 128W 分类任务。在如此巨大的类别数下,直接套用有监督学习的交叉熵损失,softmax 基本无法工作。
为解决类别过多的问题,研究者提出了 NCE(Noise Contrastive Estimation) loss。将实例判别视作二分类任务,只有数据类( q q q 和 k + k_+ k+)和噪声类(其他 k i k_i ki) 。但是这样还是数据量过大,并且 exp \exp exp 操作的复杂度很高,每次迭代需要计算全部样本的话训练效率太低。因此,只好取近似(estimation),取数据集中的部分计算损失。我们知道,对一大批数据取其中部分进行近似计算时,肯定是取得数据越多,近似越精确,这也就是为什么 MoCo 一直强调要有一个规模足够大的字典。
后来,研究者认为直接将实例判别视作二分类任务过多简化了问题,因为噪声类中的样本之间实际上也不是同一类。因此,又有人提出了 InfoNCE loss(即公式(1)),还是将实例判别视作多分类任务。观察公式(1),式中的 q ⋅ k q\cdot k q⋅k 就是 logits,即交叉熵公式中的 z z z 。如果暂时不管超参数 τ \tau τ ,可以发现,其实 InfoNCE loss 就是交叉熵损失,只不过这里的 K K K 表示的是负样本数量,而交叉熵中的 K K K 则表示类别数。
再回过头来说一下超参数 τ \tau τ 。 τ \tau τ 一般称为温度超参数,用来控制分布的形状, τ \tau τ 越大, 1 / τ 1/\tau 1/τ 越小,分布越扁平,模型对各个负样本关注度越平均; τ \tau τ 越小,分布越陡峭,模型越特别关注困难负样本。
对比学习中 NCE、InfoNCE 损失的演进看起来复杂,其实搞清楚每次优化的出发点以及它们与交叉熵损失的关系,还是比较好理解的。
确定目标函数之后,再来看一下模型,使用什么样的模型计算得到 q q q 和 k k k。一般来讲,对比学习的 q q q 和 k k k 是不同的样本通过不同的编码器得到的特征,即: q = f q ( x q ) q=f_q(x_q) q=fq(xq) , k = f k ( x k ) k=f_k(x_k) k=fk(xk) 。根据代理任务的不同,输入可能不同,比如图像、图像块等,模型也可能不同, f q f_q fq 与 f k f_k fk 可能是相同的、部分相同的或完全不同的。
MoCo
从上述视角来看,对比学习就是要在图像等高维、连续的数据上建立一个离散的字典。这里的字典是一种动态字典,因为字典里的 keys 是随机采样的,并且随着训练的进行, f k f_k fk 也会更新。本文的假设是当我们有一个规模足够大的字典,且字典内的 keys 特征比较一致时,模型通过对比学习可以得到比较好的表征能力。本文提出的 MoCo 机制,就是为了构建一个大且一致的字典。
将队列作为字典
MoCo 机制的核心之一是使用队列来维护字典中的样本。使用队列的数据结构有两个好处。一是可以将字典的大小与批尺寸的大小解耦,字典的大小可以设置得很大,不受批尺寸的限制。从而尽可能地维护一个更大的字典。二是队列先进先出的特性,可以保证每次存入的是最新的编码器提取的特征,移出的是最老的编码器提取的特征,即与当前最不一致的特征。从而尽可能地保证字典中特征的一致性。
动量更新
采用队列来维护字典中的样本虽然使得字典可以尽可能地大,但是受到显存大小的限制,我们也不可能根据队列里的每一个样本都进行梯度反传,从而更新 f k f_k fk 。一个直接的想法是不更新 f k f_k fk ,而是每次迭代直接照搬更新后的 f q f_q fq ,来提取 key 的样本特征。但这样的效果并不好,作者猜测,这是因为直接照搬的做法会导致队列中的样本特征不一致。因为 f q f_q fq 根据梯度反传进行参数更新,而每次参数更新的幅度可能非常大,导致队列中来自不同 f k ( = f q ) f_k(=f_q) fk(=fq) 编码器提取的特征非常不一致。为了解决队列维护过程中特征一致性的问题,作者提出了动量更新的策略。
θ k ← m θ k + ( 1 − m ) θ q \theta_k\leftarrow m\theta_k+(1-m)\theta_q θk←mθk+(1−m)θq
动量更新策略的公式如式 (2)。如果设置一个非常大的动量值,如 m = 0.999 m=0.999 m=0.999 ,就能够保证 f k f_k fk 参数变化幅度很小,每次更新只有 0.01 % 0.01\% 0.01% 的变动,即 f k f_k fk 的更新非常缓慢,从而尽可能地保持队列中特征的一致性。
与现有机制的关系
在前言中提到,MoCo 通过队列字典和动量更新构建了大且一直的字典,而前人的方法至少受限于大/一致两个要求中的一项。如图 4 所示,这里简单对比一下 MoCo 与前人的方法。
图 4 (a) 中展示的是端到端的损失机制,该机制将一个批次内的其他样本作为负样本, f q f_q fq 和 f k f_k fk 同时通过梯度反传更新。这种方法的好处是字典中 keys 的一致性极佳,因为它们就是来自同一个编码器,而这种方法的缺点是字典的大小就是批尺寸的大小,无法构建更大的字典。
图 4 (b) 展示的是记忆库机制,该机制中仅有一个编码器 f q f_q fq ,key 侧没有编码器,而是通过维护数据集中所有样本的特征并采样,来得到正负样本。在每个批次内更新被采样的样本特征。这种机制的好处是字典的规模可以足够大,整个数据集的特征都存储在记忆库中,缺点是记忆库中的特征一致性极差,虽然有的工作通过 proximal regularization 进行特征的动量更新来改善一致性,但这仍是该类方法的主要问题。
图 4 © 展示的是 MoCo 机制,通过使用队列维护字典中的样本特征,得到足够大的字典,通过动量更新,保证字典中特征的一致性。
实验
实验部分就不一一列举了,提几个有意思的点:
- MoCo 在 ImageNet 上进行 Linear Classification Protocol 测试(即固定特征提取器,微调分类器)时,grid search 得到的最优学习率为 30。这极大地不同于深度学习领域的常见学习率(<1)。作者认为,这表明自监督表征学习得到的特征与有监督学习的特征差异极大。
- 考虑到 1 中自监督学习特征与有监督学习特征的极大差异,为了在迁移能力测试时统一超参数(学习率),MoCo 在实验时对特征进行了标准化。
- 自监督表征学习的主要目的就是学习到迁移能力强的特征提取器,使得其特征在多种下游任务上均有较好的效果。MoCo 在 7 个检测/分割相关的任务上进行了实验,其特征的迁移能力得到了充分的验证,
百花齐放
接下来将串烧对比学习在视觉自监督表征预训练领域的进展,根据发展历程,分为四个阶段:1. 百花齐放 2. CV双雄 3. 不用负样本 4. Transformer。接下来将逐一进行介绍。
- 百花齐放:InstDisc,CPC,CMC
- CV双雄:MoCov1v2、SimCLRv1v2、CPC/CMC 延伸工作、SwAV
- 不用负样本:BYOL 及其改进、SimSiam(卷积时代对比学习的总结性工作)
- Transformer:MoCov3、DINO
InstDisc
看名字就知道,这是提出实例判别任务 Instance Discrimination 的奠基性工作,后续大部分计算机视觉领域的对比学习式自监督表征方法都是使用实例判别任务来进行预训练。在方法部分,InstDisc 的对比学习框架即 MoCo 中总结的图 4 (b) 记忆库方法。即,InstDisc 这篇工作的主要贡献有两个,一是提出了实例判别的代理任务,二是提出了记忆库机制的对比学习方法。
作者通过图 5 展示了他们提出实例判别任务的动机。经过有监督学习训练的模型,在输入一张豹子的图片时,模型给出高分的类别是豹子、美洲豹、雪豹等,给出低分的类别是船、书架等。作者认为,模型理解豹子、美洲豹是相似的类别的原因并不是语义标签,而是图像本身的特征、纹理等。豹子和美洲豹看起来就是很相似,它们与书架看起来就是不相似。基于这个观察,作者提出了实例判别任务,将每张图像自己的不同数据增强结果作为正样本,与其他图像作为负样本。模型在实例判别任务的训练过程中,就能识别出图像本身的特征、纹理等。
作者提出的基于记忆库机制的对比学习方法如图 6 所示。该方法在 MoCo 精读时已经大致介绍过。它使用记忆库来存储数据集中全部图像的特征,在每个批次中,从记忆库中采样一些正负样本,计算 NCE 损失,更新编码器。然后将该批次内计算的图像特征更新到记忆库中。
其他细节:
- 为了尽量降低存储成本,每个特征维度较小,为 128
- 提出了 proximal regularization,对记忆库中的特征进行动量更新,尽量保持特征的一致性。
InvaSpread
InvaSpread 是 MoCo 中总结的图 4 (a) 中端到端的方法。InvaSpread 的代理任务同样是实例判别,其模型框架中只使用了一个编码器,提取当前批次中的图像特征。我们之前提到,端到端的方法没有使用额外的数据结构来存储字典,因此其字典大小即批尺寸大小。受到计算资源的限制,InvaSpread 的作者实验时的批尺寸为 256,因此没有得到特别惊人的结果。在之后的 SimCLR 中,谷歌团队使用 TPU,将批尺寸扩大到 8192,证明了端到端的方法在大批尺寸的加持下,也能取得很好的效果。
CPC
以上都是使用实例判别作为代理任务的工作,既然是百花齐放,当然也要介绍一些其他的代理任务。CPC(Contrastive Predictive Coding)是一种预测式的代理任务。它可以用于不同类型数据的表征预训练,如用于音频、文本、图像等。图 8 以音频数据为例展示了 CPC 的对比学习框架。给定一段音频信号,使用共享的特征提取器 g e n c g_{enc} genc 提取各个时间点的音频特征,然后送入 g a r g_{ar} gar 进行自回归式的预测。如果提取到的特征足够好,那么 c t c_t ct 应该能够根据上文,预测出之后的特征 z t + 1 , z t + 2 , … z_{t+1},z_{t+2},\dots zt+1,zt+2,… 。因此,可以将之后的特征作为正样本,而负样本可以使用其他音频的特征,从而构建正负样本,进行对比学习。
CMC
人类感知同一个物体是通过不同的视角(views)的,比如一只狗可以被看到、听到、摸到灯。这些不同的视角可能是含有噪声的,或是不完整的,但是,属于同一个物体的不同视角的关键属性,如物体特性、几何特性、语义信息等,应该是共享的。那么,这些来自同一个物体的不同视角就可以被定义为正样本对,而来自不同物体的视角则可以充当负样本,从而进行对比学习。图 9 所示的 CMC 多视角对比学习示意图中,来自同一个场景的灰度图、深度图、分割图等被视作正样本,而不同的场景的视角则被视作负样本。
CMC 让大家意识到对比学习极强的灵活性。只要能够合理的定义目标任务/场景/业务下的正负样本对,就可以使用对比学习的方法进行训练。以上和接下来将要介绍的所有对比学习的损失函数、训练框架,均可直接拿过来用。另外,CMC 提出的对比学习中的不同”视角“,也可以认为是不同的模态,CLIP 就使用对比学习的方式,进行了图文多模态预训练,取得了成功。
CV双雄
CV 双雄指的是 MoCo 和 SimCLR,两家交替提出 MoCo、SimCLR、MoCov2、SimCLRv2,不断地提高自监督表征学习在计算机视觉领域的 SOTA。
MoCo
MoCo 在本文开始已经精读过一遍,这里简单回顾它的贡献。MoCo 提出了两点创新:一是使用队列维护字典,使得字典大小与批次大小解耦,从而获得足够大的字典;而是提出动量更新,缓慢地更新 q k q_k qk ,从而保证字典中的样本特征尽可能一致。MoCo 首次在计算机视觉领域证明了自监督的预训练方法能够超越有监督的方法,并且,在某些下游任务上,迁移能力更好,能够大幅超越有监督方法。
SimCLR
如名称所示,SimCLR(Simple framework for Contrastive Learning of visual Representation)是一个简单的对比学习框架。SimCLR 的模型框架如图 10 所示。可以看到,真的是非常简单,一张输入图像 x x x 经过不同的数据增强 t , t ′ t,t' t,t′ ,得到 x ~ i \tilde{x}_i x~i 和 x ~ j \tilde{x}_j x~j ,然后经过共享权重的编码器 f ( ⋅ ) f(\cdot) f(⋅) ,得到特征 h i h_i hi 和 h j h_j hj ,下面一步是 SimCLR 的重要创新,使用一个 MLP 层 g ( ⋅ ) g(\cdot) g(⋅),将 h i h_i hi 和 h j h_j hj 再进行一次映射,得到 z i z_i zi 和 z j z_j zj ,根据特征 z i , z j z_i,z_j zi,zj 计算对比损失,更新参数。需要注意的是, g ( ⋅ ) g(\cdot) g(⋅) 在下游微调时被丢弃的,它是用来辅助训练,下游任务还是在特征 h i , h j h_i,h_j hi,hj 上进行微调。看起来在训练时加一个非线性变换是一个很简单的改进,但是它使得模型在 ImageNet 上微调的性能提高了十几个点。这样一个简单的全连接层+relu的变化带来这么大的性能提升是很少见到的,在之后的很多工作中都使用了这个 projection head,其工作原理还有待进一步研究。
SimCLR 的取得成功的原因有以下几点:
- 使用了多种数据增强操作。作者发现,相比于有监督学习,数据增强对自监督学习的提升更强;
- 提出了非线性变换 projection head(即图 10 中的 g ( ⋅ ) g(\cdot) g(⋅)),大幅提高了表征的质量
- 合理调整交叉熵损失中的归一化嵌入和温度超参数
- 超大的 batch size 和训练步数
其他细节:
- SimCLR 使用的对比学习损失为温度可调的归一化交叉熵损失
- SimCLR 使用 LARS 优化器来进行大 batch size 的训练优化
MoCo v2
MoCo v2 实际上是一个两页的技术报告,而非正式投稿的论文。MoCo v2 在 MoCo v1 的基础上,借用了 SimCLR 提出的两个即插即用的优化做法:使用 projection head 和使用更多数据增强,进行了实验。
消融实验的结果如表 1 所示。MLP、aug+、cos 分别表示添加 projection head、更强的数据增强和余弦学习率调整。可以看到,不只是在 SimCLR 中 projection head 提升显著,在 MoCo 中,projection head 也有 6 个多点的性能提升。更强的数据增强也能带来近 3 个点的提升。而余弦学习率调整策略的提升较小,只有 0.2 个点。
MoCo v2 与之前工作的性能对比实验结果如表 2 所示。得益于 MoCo 中队列和动量编码器的设计,MoCo 可以在较小的 batch size 的设置下维护一个大且特征一致的字典,从而相较于大 batch size 的 SimCLR 能得到更好的性能。在短时训练(200ep)和长时训练(800/1000ep)的设置下,均领先 SimCLR 近 1 个点。
MoCo v2与end-to-end机制的计算开销对比如表 3 所示。在相同的小 batch size (256)下,end-to-end 与 MoCo 计算开销接近,但注意结合表 2 来看,此时 MoCo 性能领先 5 个多点(67.5-61.9)。而当 end-to-end 方法通过增大 batch size,性能与 MoCo 相仿时,其计算开销讲大幅增加,甚至大到无法接受。
SimCLR v2
SimCLR 小部分篇幅介绍了如何将 SimCLRv1 提升至 SimCLRv2,而大部分篇幅都在讲如何基于自监督训练得到的模型,使用自训练的方法,进行半监督学习。半监督学习框架如图 11 所示,其思路是来自于 Noisy Student 中提出的伪标签自训练方法。由于这与对比学习关系不大,本篇串烧中就不多介绍了。
主要还是说一下 SimCLRv2 相较于 v1 的改进:
- 使用更大的骨干网络。SimCLRv2 使用 ResNet-15w3,并使用了 selective kernel,来构建骨干网络。
- 加深 projection head 层的深度。SimCLRv1 中 projection head 层只有一层,v2 尝试加深。
- 使用 MoCo 的队列和动量编码器机制。由于 SimCLR 本身 batch size 已经够大,因此使用 MoCo 的训练机制仅带来了约 1 个点的性能提升。
SwAV
SwAV(Swapping Assignments between Views)的思路是对于一张给定的图像,不同视角(views,比如同一张图像经过不同数据增强)应该可以做到用一个视角的特征去预测其他视角的特征。SwAV 结合了聚类的方法,进行对比学习。聚类,本身也是一种无监督表征的方法,本文的一作之前也一直研究的是聚类相关的工作,如 deep cluster。
图 12 展示了实力对比学习与 SwAV 的对比。左侧图所示的实例对比学习就包括之前的 end-to-end、MoCo 等方法。流程前文已经介绍了很多次了,就是将一张图像经过不同数据增强的结果作为正样本,其他图像作为负样本,分别提取特征,进行不同实例间的对比学习。这类方法计算开销较大,并且通常需要对数据集进行部分采样,然后计算近似的损失。
SwAV 提出,可以不跟每个实例进行对比,而是跟聚类中心进行对比。聚类中心即图 12 右侧图中的 c ∈ R D × K c\in\mathbb{R}^{D\times K} c∈RD×K 。特征 z 1 , z 2 ∈ R B × D z_1,z_2\in \mathbb{R}^{B\times D} z1,z2∈RB×D ,与聚类中心 c c c 相乘,得到 Q 1 , Q 2 ∈ R B × K Q_1,Q_2\in \mathbb{R}^{B\times K} Q1,Q2∈RB×K ,作为目标。而 z 1 , z 2 z_1,z_2 z1,z2 既然是来自同一样本的不同 view 的特征,应该能够预测彼此,所以就可以做交换(swapped)的预测对方的 Q Q Q 。
结合聚类的好处有两个。首先,聚类可以进行高效的对比。如果对比实例,一般最多对比数万个实例,而且数万相对于完整数据集也只是做个近似。而如果对比聚类中心(ImageNet 上通常 K = 3000 K=3000 K=3000),则计算成本更小,并且可以完整地对比整个数据集中的样本。其次,聚类中心具有明确的语义含义。相比之下,对样本实例进行对比学习时很可能采样的负样本中存在语义正样本,且负样本中类别也可能不均衡。
如表 4 所示,SwAV 基本是使用卷积神经网络的对比学习自监督表征任务中的最佳结果,在 ImageNet 上的准确率达到 75.3%。不仅优于 MoCo、SimCLR 等,之后的 BYOL 等工作也没有超越 SwAV。
SwAV 具有如此高的性能指标不仅来自于聚类的思想,它还提出了一种新的数据增强方式:multi-crop。相较于之前的工作使用 2-crop,multi-crop 结合局部特征和全局特征,极大地提高了 SwAV 的性能。消融实验小时,multi-crop 带来了 4 个多百分点的提升。
图 12 展示了 2-crop 与 multi-crop 的对比。一般的 2-crop 是对 256x256 的图像随机进行两次 224x224 的裁剪,作为正样本对。然而,如此大尺寸的裁剪只能保持全局特征,而无法学习局部物体的特征。为了获得更多的 view,并结合局部、全局特征进行学习,SwAV 提出多从原始图像中裁剪快,并且尺寸大小不一。为了全权衡计算量和视角数,经过实验,将原始图像裁剪为两个 160x160 加上四个 96x96 的 6 个 view。
multi-crop 不仅在 SwAV 中提点显著,对于 SimCLR 也有两个多百分点的提升。
CPCv2
CPCv2 是 CPC 的延伸工作,用更大的模型,更大的图像块,做了更多方向上的预测任务,把batch norm换成了layer norm,使用了更多的数据增强,将 CPCv1 在 ImageNet 上的准确率从 40 多提升到 70 多。
Info Min
InfoMin 是 CMC 的作者做的分析延伸工作,到底选什么样的视角才能对对比学习最好,提出了 InfoMin:最小化互信息,想要不多不少刚好的互信息。按InfoMin原则做合适的数据增强,拿到合适的对比学习的视角。
综上,发展到这个阶段,对比学习很多细节都趋于统一。目标函数都是用 InfoNCE 或类似的函数,模型都是用一个编码器加一个 projection head,都采用了更强的数据增强,使用动量编码器,尝试训练更久。在 ImageNet 上的准确度也逐渐逼近于有监督的基线模型。
下一阶段是不用负样本的对比学习。SwAV 算是一个承上启下的工作,也没有用负样本,而是用聚类中心,但还是存在明确的对比对象。第三阶段的 BYOL 和 SimSiam 就是只有正样本,没有负样本和聚类中心这样明确的东西去做对比。
不用负样本
BYOL
对比学习中的负样本十分关键。如果没有负样本的约束,使得不同类的样本需要分离开模型很容易学习到一种捷径解,就是对所有输入,输出完全相同的特征。这种情况也称为模型坍塌。那么,BYOL 是如何实现不用负样本的对比学习的呢?
BYOL 的模型架构如图 13 所示。同一张图像经过不同的数据增强之后分别送入两个编码器 f θ f_\theta fθ 和 f ξ f_\xi fξ ,得到特征 y θ y_\theta yθ 和 y ξ ′ y'_\xi yξ′ ,再经过 projector g θ g_\theta gθ 和 g ξ g_\xi gξ,得到 z θ z_\theta zθ 和 z ξ ′ z'_\xi zξ′ ,然后 z θ z_\theta zθ 会再经过一个 q θ q_\theta qθ ,得到 q θ ( z θ ) q_\theta(z_\theta) qθ(zθ) ,用它去逼近 z ξ ′ z'_\xi zξ′ 。即根据一个视角的特征,去预测另一个视角特征。
注意:
- f θ , g θ , q θ f_\theta,g_\theta,q_\theta fθ,gθ,qθ 根据梯度反传更新, f ξ , g ξ f_\xi,g_\xi fξ,gξ 由 f θ , g θ f_\theta,g_\theta fθ,gθ 动量更新;
- q θ q_\theta qθ 与 g θ g_\theta gθ 网络结构相同;
- 训练完成之后,只有 f θ f_\theta fθ 保留,其余网络全部丢弃;
- 损失函数是 q θ ( z θ ) q_\theta(z_\theta) qθ(zθ) 与 z ξ ′ z'_\xi zξ′ 之间计算 MSE。
BYOL 在不使用负样本的情况下也能 work,吸引了大批研究人员的注意。其中某组研究者在复现 BYOL 时发现了一个问题,即网络在不含有 BN 层时,BYOL 的训练就坍塌了。研究者立即进行了大量的相关实验,并将实验结果与结论写成了一片博客。
博客中关于 BN 的消融实验结果如表 5 所示。第一行是 end-to-end 对比学习的结果,下面六行是 BYOL 的结果。可以看到,在 BYOL 的实验结果中,只要 projection mlp 或 prediction mlp 中存在 BN,性能就正常,而如果不存在 BN,或者换成 LN,性能就几乎与随机相同,即发生训练坍塌。博客作者认为,BN 在每个训练批次内计算特征的均值和方差,然后做归一化。当计算某个正样本的损失时,也看到了其他所有样本的特征,这造成了其他样本的信息泄露。也就是说,模型也看到了批次内其他的负样本,并计算出了一个”平均图像“,BYOL 会与这个”平均图像“进行对比学习,该”平均图像“就是一个隐性的负样本。作者将这种情况称为隐式对比学习。第一行的 end-to-end 方法有真正的负样本,称为显式对比学习,显式对比学习不需要 BN 计算出的”平均图像“来对比,因此,即使没有 BN 也能得到正常的效果。而当 BYOL 方法没有 BN,或只有 LN 时,既没有真正的正样本,也没有”平均图像“,无法进行对比学习,发生训练坍塌。
总结来说,博客作者认为 BYOL 虽然没有在算法框架中直接引入负样本,但是 BN 会计算出”平均图像“,作为隐式的负样本,使得模型进行隐式对比学习。
为了维护 BYOL 不使用负样本的创新,避免大家认为是 BN 计算出的”平均图像“作为负样本,使得 BYOL 进行了隐式的对比学习,BYOL 的作者回应了一篇技术报告。报告中进行了详尽的消融实验,最终证明了 BYOL 中的 BN 只是起到稳定训练的作用,而非提供隐式负样本。作者还通过 GN(Group Normalization)+WS(Weights Standarization)成功地在不使用 BN 的情况下使得新版本的 BYOL 达到了与带 BN 的 BYOL 几乎持平的性能,在此证实了 BYOL 不使用负样本的创新性。
SimSiam
SimSiam 可以看作是一个对目前已有工作的总结、梳理的工作,并且,SimSiam 挖掘出了对比学习的一种理论解释,即将对比学习视作为 EM 算法,最后又落脚到 K-means。
目前为止,对比学习的进展如火如荼,但是看起来好像性能的提升都是一些个小 trick 堆起来的。比如动量编码器、projection head、更强的数据增强、超大 batch size 等。SimSiam 的模型部分指出,即使不使用负样本、大批次、动量编码器这些 trick,对比学习也能训练得很好,并且能有很好的迁移能力。
SimSiam 的模型结构如图 14 所示。Siamese 是指孪生网络,通常包含两个结构相同,权重共享的编码器。SimSiam 中的两个编码器 f f f 结构与权重均共享。整体结构与 BYOL 非常类似(见图 15),只是没有使用动量编码器,而是进行端到端的训练。
SimSiam 能够成功训练,不出现模型坍塌,主要是有 stop gradient 操作的存在。SimSiam可以看成一种EM算法,一个训练过程或者一套模型参数被人为劈成两份,相当于解决两个子问题一样,模型更新也在交替进行。通过逐步更新的方式避免模型坍塌。
所有孪生网络的做法归纳见图 15。SimCLR end-to-end 学习,两边都有梯度回传,还是做的一个对比学习的任务。SwAV 也是对比任务,没有跟负样本对比,跟聚类中心去对比。BYOL 的贡献是添加一个 predictor 网络,对比任务换为预测任务,用左边预测右边。SimSiam 和 BYOL 几乎一样,只是没有使用动量编码器。
主流孪生网络在 ImageNet 分类和检测、分割下游任务上迁移能力的测试结果如表 6 表 7 所示。综合结果来看,分类任务上,短时训练时 SimSiam 效果较好,随着训练步数的增加 BYOL 的分类性能最好。迁移能力上,MoCov2、SimSiam 的迁移能力最强。
综合来说,MoCov2 和 SimSiam 两种方法(均来自 Kaiming 组),训练成本最低,训练速度最快,迁移能力最好。是研究或业务上不错的对比学习基线模型候选。
Barlows Twins
更换了一个目标函数。生成一个关联矩阵,希望矩阵与单位矩阵尽可能接近,变成两个矩阵之间比相似性。
Vision Transformer
MoCo v3
MoCo v3 的模型部分是 MoCo v2 和 SimSiam 的结合,不做过多介绍。MoCo v3 论文的主要篇幅也不是介绍 MoCo v3 的模型结构,而是讨论如何发现、分析并解决了使用 MoCo v3 框架训练 ViT 模型时出现的一个问题。
如图 16 所示,作者发现在大批尺寸的情况下,训练曲线会出现震荡的情况,虽然每次都能攀升回来,但是还是最终性能还是有所损失。作者们查看了每轮训练的梯度情况,发现出现震荡时,都是第一层(patch projection 层们,相当于 tokenization 层)出现梯度震荡。为了稳定训练,作者在随机初始化第一层之后,将其权重冻结,不参与梯度反传参数更新。问题得到解决。这个方法是一个普适的方法,对 MoCo v3 和 BYOL 等都有用,用 BYOL 框架把残差网络换成VIT,patch projection 冻住,一样能获得更平滑的曲线,更好地结果。
DINO
DINO (self-distillation with no labels)框架如图 17 所示。其做法与 BYOL 极其接近,只是换了个讲故事的方法。所谓自蒸馏,其实就是 BYOL 中的自己预测自己。DINO 还提出了 centering 操作,减去样本特征的均值,进行归一化。这一 BYOL 中对 BN 的讨论类似。
总结
朱老师对上述对比学习工作的发展历程及他们间关系的总结如下。