type
status
password
date
slug
summary
category
URL
tags
icon
概述
对比学习的发展历程大概可以分为四个阶段:
1、数据增强

1.1、多裁剪策略(multi-crop)
从单张图像中提取多个不同区域(裁剪)进行分析,提升模型鲁棒性和预测精度。
2、动量编码器
- 队列字典:核心思想是将字典维护为数据样本的队列,允许重复使用前续小批量的编码键。队列将字典大小与小批量大小解耦,其大小可作为超参数灵活设置,远大于典型小批量尺寸。字典中的样本逐步替换:当前小批量入队,最早小批量出队,确保字典始终代表数据的采样子集,且维护计算成本可控。移除最早小批量有益,因其编码键最过时,与最新键的一致性最差。
- 动量更新:使用队列可扩大字典规模,但通过反向传播更新键编码器变得不可行(梯度需传播至队列中的所有样本)。简单复制查询编码器参数会导致性能下降,原因是编码器快速变化破坏了键表示的一致性。为此,我们提出动量更新:
其中 为动量系数,仅查询编码器参数 通过反向传播更新,动量编码器参数没有反向传播。动量更新使 比 演化更平滑,确保队列中的键虽由不同时期的编码器编码,但差异较小。实验表明,较大动量(如 )效果显著优于较小值,验证了缓慢演化的键编码器是队列机制的核心。
3、projector head

projector head就是,本质上就是MLP(论文经过实验,发现使用2层MLP就好)。在下游任务中使用、。
百花齐放
模型 | 正负样本 | 损失函数 |
正样本:增强数据
负样本:非正样本的所有样本 | ||
正样本:增强数据
负样本:同一batch中的其他样本 | ||
对照样本由生成器生成Embedding
正样本为编码器生成的正确样本
负样本为编码器随意生成的样本 | ㅤ | |
CMC 使用一个物体的多个视角来作为正样本。其它的图片就是负样本。 |
InstDisc(instance discrimination)
这篇文章提出了个体判别任务(代理任务)以及
memory bank
,非常经典,后人给它的方法起名为InstDisc。在有监督学习的分类模型中,如果给一张豹子图片进行分类,会发现排前几名的都是跟这张图很像的图片,而排名靠后的那些往往是跟豹子一点关系都没有的类别;所以,监督学习不止学习到了标签信息。还学习到了图片的深层语义信息,使得相似图片的得分高。我们的无监督方法将类别级监督推向极致,学习能够区分个体实例的特征表示。
个体判别任务:把每一个instance(实例,这里就是指每一张图)都看成是一个类别,目标是学一种特征,把每张图片都区分开来。
2、正负样本定义
InstDisc中正样本就是这个图片本身(可能经过一些数据增强),负样本就是数据集里所有其它的图片,这些负样本都存储在 memory bank里。
3、模型架构
我们的无监督特征学习方法流程。我们使用主干CNN将每张图像编码为特征向量,该向量被投影到128维空间并进行L2归一化。最优特征嵌入通过instance级判别学习得到,该过程试图将训练样本的特征最大程度地分散在128维单位球面上。

4、softmax函数
- 带参数的softmax:假设训练集包含 张图像 (对应 个类别),其特征表示为 ()。在传统的参数化 softmax 公式中,对于特征为 的图像 ,其属于第 个实例类别的概率为:
其中 是第 类的权重向量, 表示 与第 个实例的匹配程度。
- 无参数Softmax分类器:作者认为参数阻碍了个体之间的对比,于是文章采用的无参softmax:使用L2正则化的来替换,用来调整类别分布的集中程度:
5、Noise-Contrastive Estimation
由(2)式可知,计算瓶颈在于分母,需要枚举所有图片,这样的计算复杂度是无法接受的。为解决计算所有实例相似性的难题,我们将 NCE 引入当前问题。其核心思想是将多分类问题转化为一组二分类问题,即判别数据样本与噪声样本。具体来说,特征向量 属于第 个实例的后验概率为:
我们设定噪声分布为一个均匀分布,则属于第个个体的后验概率为:
训练目标为最小化似然函数
其中指代正样本数据分布,对而言 是 的特征;是来自另一幅图片,从噪声分布中随机采样得到, 和 都是从Memory Bank中采样得到的。
在正向计算时, 分母项的计算是无法避免的,直接计算的计算量同样很大,于是本文使用蒙特卡罗方法来估计这一项:
6、正则化
由于每个“类”只有1个样例,在每个epoch中,一个“类”只被访问一次,训练的过程比较不稳定。为了使训练更加平滑,在损失函数上增加一项针对 的惩罚, 来稳定训练过程:
其中,(第t次迭代时backbone的输出特征), 来自于memory bank。这样随着多次迭代,由于的加入,backbone和memory bank存储的特征就逐渐相同了,回到了原始的损失,加速了收敛。
所以Proximal Regularization相当于模型的训练加了一个约束,从而能让 memory bank 里的那些特征进行动量式的更新(当前时刻的输出和上一时刻的输入有关),跟 MoCo 的想法是非常一致的。
7、超参数
本文的一些超参数设定,比如backbone选择ResNet50,batch_size=256,负样本采样数为4096,特征维度dim=128,epoch=200,初始lr=0.03,计算NCELoss时=0.07;这些超参数在在MoCo 中也是沿用的,没有进行更改。
8、结论
Inst Disc
这篇论文也是一个里程碑式的工作:它不仅提出了个体判别这个代理任务,而且用这个代理任务和 NCE loss做对比学习,从而取得了不错的无监督表征学习的结果。同时它还提出了用别的数据结构存储这种大量的负样本,以及如何对特征进行动量的更新,所以真的是对后来对比学习的工作起到了至关重要的推进作用。Inva Spread
1、前言
Inva Spread
是一种端到端的训练方式,直接训练特征本身,无需额外的数据结构(比如上文的memory bank),提升了效率和准确度。作者还使用了新的采样方式,降低了计算复杂度。2、正负样本定义
简单来说,本文中的正负样本都来自同一个mini_batch。比如对于图片,其正样本就是数据增强后的图片,而负样本就是这个mini_batch中除了 之外的所有样本,而不是整个数据集中的所有其它样本。这样负样本数大大减少,可以不需要额外的数据结构来存储,就可以用一个编码器做端到端的训练了。
Inva Spread
可以看做是SimCLR
的前身,但由于数据增强策略不足以及负样本数量太少,也没有SimCLR
提出的mlp projector ,使得最终的训练效果不好,没有太大的影响力。3、算法
作者认为,相似图片通过编码器以后,它的特征应该很类似,不同的图片,它的特征出来就应该不类似,这就是题目中说的invariant和 spreading 。

我们提出使用孪生网络来实现所提出的算法,如图2所示。在每个迭代中,将 个随机选择的图像实例输入到第一个分支,对应的增强样本输入到第二个分支。注意,第一个分支中也可以使用数据增强来丰富训练样本。
4、损失函数
我们的目标是从一组无标签图像 中学习一个特征嵌入网络 。 将输入图像 映射到低维嵌入特征 ,其中 是特征维度。为简单起见,图像实例的特征表示 用 表示,并且我们假设所有特征均经过 归一化,即 。一个好的特征嵌入应满足:1)视觉相似图像的嵌入特征彼此接近;2)不相似图像实例的嵌入特征相互分离。
对于每个迭代,我们从数据集中随机采样 个实例,所选样本记为 。对于每个实例,应用随机数据增强操作 对原始图像进行轻微修改。增强后的样本 记为 ,其嵌入特征 记为 。我们将其视为二分类问题。具体来说,对于实例 ,增强样本 应被分类到实例 ,而其他实例 ()不应被分类到实例 。 被识别为实例 的概率定义为:
另一方面, 被识别为实例 的概率定义为:
相应地, 不被识别为实例 的概率为 。假设不同实例被识别为实例 是相互独立的,那么 被识别为实例 且 ()不被分类到实例 的联合概率为:
负对数似然为:
我们通过最小化批量内所有实例的负对数似然之和来解决这个问题,记为:
CPC
之前的几篇代理任务都是个体判别任务,那么自然也有生成式的代理任务,CPC就是其中之一。CPC是一个通用结构,其输入是一个序列,可以是图片(不同patch)、文字或者音频、视频等等。本文使用音频为输入,如下图所示:

- 对于一个输入序列,当前时刻为。时刻输入经过编码器得到编码特征。
- 经过自回归模型(比如RNN/LSTM)得到输出(context representation,上下文特征,因为含有之前时刻的信息)。如果表示的足够好,包含之前所有时刻的信息,那么应该可以用来预测未来时刻的输出特征。
- 对比学习的正样本就是未来的输入、、通过编码器以后得到的未来时刻的特征输出、、,负样本就是任意输入通过这个编码器得到输出。
CMC
CMC
使用一个物体的多个视角来作为正样本。这个思想来自于人类对世界的感受、观察。在摘要中,作者说人类观察这个世界是通过很多个不同视角的传感器,比如说眼睛或者耳朵,来给大脑提供不同的信号。每一个视角都是带有噪声的,而且有可能是不完整的。但是最重要的那些信息,比如物理性质,几何形状以及语义信息,在所有的这些视角中间共享。例如一只狗可以被看到、听到、感受到。
基于此,作者认为一个强大的特征,应该具有视觉不变性(不论是看到还是听到,都应该能判断出那是一只狗)。所以CMC目的,就是最大化同一个场景不同视角的互信息,并且可以扩展到任意数量的未知视角,且视角越多效果越好。
1、正负样本

如上图所示,
CMC
选用 NYU RGBD
数据集进行训练。数据集中每张图有4个视角(view):原始的图像、原图对应的深度信息(每个物体离观察者到底有多远)、SwAV ace normal以及原图的分割图像。
在CMC中,一张图的四个视角就是互为正样本,因为其代表的是同一个东西;其它的图片就是负样本。在上图表示,就是特征空间中四个绿色的点互相靠近,而都和红色的点远离。2、损失函数
本文使用的也是普通的NCELoss目标函数,但作者将其进行扩展以适应不同视角的需求
- 两个视角
这里的和是两种主干网络,不共享参数,这个和Spreading Instance是有区别的。损失将视图作为锚点,并枚举中的样本。对称地,我们可以通过将锚点设为来得到。
- 多个视角
CV双雄
模型 | 正负样本 | 损失函数 |
MoCo | 查询 和一组作为字典键的编码样本 ,假设字典中仅有一个正样本键 与 匹配。 | |
SimCLR | 正样本:图片 经过不同的数据增强得到不同的图片和
负样本:同一个mini_batch里面的其它图片都是负样本 |
【论文精读】:MoCo
SimCLR
1、原理

- 图片 经过不同的数据增强得到不同的图片和,这两个就是互为正样本;同一个mini_batch里面的其它图片都是负样本,这点和
inva spread
一样。
- 正负样本经过同一个编码器(权重共享)得到编码特征。比如encoder选ResNet50,就是输出2048维特征。
- 经过同一个projector head,即图中的(其实就是一个mlp层,)得到最终的对比学习特征(128维)。
在下游任务中使用、
- 对比学习的训练目标就是使正样本特征更相似(同一张图片得到的 ),而负样本的特征不相似。
- 选用的损失函数是
NT-Xent loss
(the normalized temperature-scaled cross entropy loss)。normalized是指在特征后面进行了 L2 归一化,temperature-scaled 就是说在 loss 里加了个,所以和infoNCE loss
也是非常接近的。
2、损失函数
我们随机采样一个包含个样本的小批量,对该批量中生成的增强样本对执行对比预测任务,共得到个数据点。我们不显式采样负样本,而是借鉴(Chen 等人,2017)的方法,将小批量内除正样本对之外的个增强样本视为负样本。令表示归一化后的和的点积(即余弦相似度)。则正样本对的损失函数定义为:
其中,为指示函数,当且仅当时取值为 1;为温度参数。最终损失计算小批量中所有正样本对和的损失均值。
MoCo V2
MoCov2
主要是借鉴了SimCLR
而做的优化,对比MoCo
主要有4个改动:- 添加 projection head。其实就是一个mlp层,
- 使用更多的数据增强。
- 训练时使用cosine的learning rate schedule
- 训练的epoch,从200增加到800
SimCLRv2

SimCLRv2
相比SimCLRv1
有三处改进:- 大模型:backbone从
ResNet50
替换为ResNet152+SK net
(selective kernels)
- 加深
protection head
:从一层加到两层。protection head在SimCLRv1和MOCOv2中都被证明很有用,所以作者考虑多加几层。最后发现加到两层效果就够了
- 引入了动量编码器:使用了类似
MOCO
的动量编码器,效果提升了一个点。作者解释是,SimCLR
模型的 batch_size已经够大了,也就是字典的大小和字典里特征一致性,SimCLR v2 都已经做的很好了。换成MOCO
这种队列结构的动量编码器,虽然可训练的负样本更多,但是提升没有那么明显了。
SwAV
1、研究动机
一张图片不同视角的特征可以互相预测,因为来自同一张图片的不同视角特征按道理来说都是相似的。具体的做法,就是将聚类加入到了对比学习中。
作者认为之前的对比学习,直接拿所有图片的编码特征去做对比有点原始而且计算量太大。作者考虑,能不能借助一些先验信息,一些更简洁的东西比进行对比,而不是和所有负样本直接进行对比。由此作者提出了可以和聚类中心特征进行对比(128万张图片被聚成3000个簇类中心
cluster center
)。2、算法

- 左图:普通的对比学习方法。
同一张图片,做两次数据增强得到 (正样本),然后所有的样本通过一个图片编码器(比如ResNet50等等,也可以加几层mlp之类的,这里没有具体说明)输出编码特征 ,然后在编码特征上去做对比学习。
- 右图:
SwAV
的做法 - 每个batch输入数据为 , 分别经过不同的增强, 得到
- 将 输入编码器中,得到编码特征
- 已知个聚类中心prototypes ,表示为。将编码特征与聚类中心计算相似度,得到相似度矩阵,这样算完又获得了一个新的表示 (Codes)理想情况下,样本与自己的类簇中心相似度为1,与其他的为0,类似于有监督任务中的one-hot label。不过作者发现soft label效果会好一些。
- 理论上同一张图片不同view(比如Augment)所产生的 和 可以相互预测。也就是说,如果拿这个特征去跟去做点乘,按道理来说也是可以去预测;反之亦然。所以说点乘之后的结果就是预测,而ground truth就是之前按照clustering分类而得到的q1和q2。
不同负样本
BYOL
BYOL没有引入任何形式的负样本,而是用图片的编码特征(梯度更新)去预测自己的编码特征(动量更新),模型就这样训练起来了。(相当于用一个视角的特征取预测另一个视角的特征,将匹配转为预测问题)

模型中分BN层极其重要。如果没有BN层,那么无法训练。
1、前向过程
- 输入经过两次不同的增强得到。
- 编码特征
- 上面的online分支经过编码器得到编码。会进行梯度更新。
- 下面的target分支经过编码器得到编码特征,和模型结构一样,但用的是动量更新的方式。也就是说, 引入了MoCo中的动量编码器,其参数和不同,但是结构一样。
- 如果这两个编码器都是ResNet50,则输出特征是2048维
- projection head
- 使用类似
SimCLR
中一样的projection head 和(也是一个MLP,BYOL
中也把这个结构叫predictor
),将特征降到256维,得到特征。 - 和分别是梯度更新和动量更新,但二者结构一样。
2、对比预测
- 在 SimCLR中,是在之间做maximum agreement,即使不同增强后再编码和MLP映射后的特征尽可能的接近。
- 在SwAV中,是将分别和K个簇类中心计算相似度得到,然后互相预测作对比学习(和相似度矩阵点乘的结果去预测,反之亦然)。
BYOL
中,上分支使用prediction head
(也是predictor
结构)将映射为,然后用去预测来进行对比学习,其中sg表示stop-gradient
,因为下分支编码器是动量更新。
- 损失函数是
MSELoss
,即直接计算预测特征和标签这两个向量之间的mse。
SimSiam
SimSiam结构非常简单,不需要用负样本(结构类似
BYOL
)、大的batch size,也不需要动量编码器。然而即使在这种情况下,模型效果也很好。
SimSiam的整理结构如图所示。它以一张图片 的两个随机增强视图 和 为输入,这两个视图由一个backbone和一个projection MLP head组成的encoder网络进行处理,编码器 在两个视图之间共享权重。随后,通过一个预测多层感知机头(prediction MLP head)对其中一个视图的编码输出进行转换,并将转换后的结果与另一个视图的编码输出进行相似度匹配。将两个输出向量分别表示为 和 ,模型通过最小化二者之间余弦相似度的负值来优化参数。
其中 是 。我们定义对称损失
这是针对每张图片定义的,完整的损失是对所有图片的损失取均值,最小可能值为-1。
如图1所示,该方法的一个重要部分就是停止梯度更新,我们修改式(1)得到
这意味着该式中 视为常数。同样,式(2)修改如下
这里 上的encoder在第一项中不接受来自 的梯度,但在第二项中接受来自 的梯度(对于反之亦然)。
Transformer
MoCo V3
使用ViT作为backbone,但是冻结ViT的
patch projection
层。patch projection
也称为 Patch Embedding 层) 是将图像转换为适合 Transformer 处理的序列格式的关键组件。它的核心作用是将高维图像数据划分为多个固定大小的 “图像块(patches)”,并将每个块映射到低维向量空间。DINO

- 一张图片经过不同的视角得到
- 分别经过两个编码器(结构相同参数不同,包含projection head)得到编码特征。
- teacher网络的编码器是动量更新;且为了避免模型坍塌,其编码特征会额外进行一个centering的操作。centering类似于BN,对同一个batch中的样本减去batch的均值
- 这样学生分支和教师分支经过softmax分别得到K维概率分布,然后用去预测()