chaos-moon / paper_daily

One paper a day, keep laziness away.
MIT License
6 stars 3 forks source link

[explore] Contrastive Learning #17

Open yaoyz96 opened 1 year ago

yaoyz96 commented 1 year ago

Contrastive Learning

InstDisc, CVPR 2018

Unsupervised Feature Learning via Non-Parametric Instance Discrimination, CVPR 2018. [paper]

Contribution:

InstDisc 受到有监督学习结果的启发。如果我们将一张“豹子”的图片交给一个通过有监督学习训练好的分类器,发现分类器给出的分类结果排名前几的类别都是和“豹子”相关的,比如“猎豹”、“美洲豹”等,而排名靠后的类别都是和“豹子”很不像的。通过很多这样的现象,InstDisc 作者认为,让分类结果如此聚集在一起的原因并不是因为它们有相似的语义标签,而是因为这些照片长得像,包含的 object 确实很相似。

作者根据这个观察,提出了个体判别任务,将有类别信息的有监督信号推到极致,将每一个 instance 看作一个类别,目标就是学习一些特征能够将每个 instance 都区分开。

InstDisc 是 MoCo 论文中反复提到的 [61] 号论文,除了 MoCo,还有很多其他工作的实验细节都来源于 InstDisc

Pipeline:

2023-05-16_153151

假设 input batchsize 包含 256 张图片,输入到 backbone。InstDisc 的 backbone 简单地使用一个 CNN 对输入图像进行编码。backbone 输出维度为 2048 维,然后再降维到 128,并经过L2 正则化、softmax 输出每张图像的 feautre vector。

训练网络使用对比学习,因此需要有正样本和负样本。对于个体判别这个任务来说,正样本就是图像本身,它可能会经过一些图像增强,而负样本就是数据集里所有其他图片。为了获取负样本,作者提出将所有图像特征都存储在 memory bank 中。

输入 batch size 为 256 意味着有 256 个正样本,那么负样本就要从 memory bank 中随机地抽取一些负样本(论文中抽取4096个负样本)。有了正负样本,就可以通过 NCE Loss 去算对比学习的目标函数。

当前 batch 学习完毕后,将 256 个样本特征更新到 memory bank 中,这样 memory bank 就得到了更新。反复该学习过程,不停更新网络和 memory bank,目标是让最后学到的特征尽可能地有区分性,也就是所有图像的特征在特征空间里能够尽可能分开。因为对于个体判别任务来说,每张图像都代表一个类别。

降维到128:这是因为memory bank中要存储所有图像的feature,因此存储代价决定了每个特征的维度不能太高,所以作者定了128维

yaoyz96 commented 1 year ago

InvaSpread, CVPR 2019

Unsupervised Embedding Learning via Invariant and Spreading Instance Feature, CVPR 2019. [paper]

Contribution:

InvaSpread 遵循最基本的对比学习思想,同样的图片通过特征编码器以后,得到的 feature 应该很相似。反之,不同的图片之间 feature 就应该不相似。对应到论文题目,即相同 instance 之间特征应有 invariant(不变性),不同 instance 之间的特征应尽可能 spread(分散)。

这篇论文可以看作是 SimCLR 的前身,但为什么没有取得和 SimCLR 一样好的效果?MoCo 里提到,对比学习负样本的数量最好足够多,InvaSpread 作者没有 TPU,论文设置的 batch size 是 256,也就是说负样本只有 500 多个,另外 InvaSpread 缺少 SimCLR 使用的数据增强和 MLP Projector。

Pipeline:

2023-05-16_153151

仍采用了个体判别的代理任务,与 InstDisc 不同之处在于如何选取正负样本。

假设输入图像的 batchsize 为 256,对它们进行数据增强,又得到了 256 张图像。对于 $x_1$ 来说, $\hat{x}_1$ 就是它的正样本,所有其余的输入图像(包括原始图像和经过增强的图像 $x_2$, $x_3$, $\hat{x}_2$, $\hat{x}_3$)都是 $x_1$ 的负样本。也就是说,一个 minibatch 内,正样本总数是 256,每个正样本对应 (256-1)*2 个负样本。

前向过程与 InstDisc 类似,经过编码器之后,用 FC layer 对 feature vector 降维,最后得到每个样本的 feature,使正样本尽可能接近,使负样本尽可能远离。

使用的目标函数是 NCE loss 的一个变体。

yaoyz96 commented 1 year ago

CPC, 2018

CPC: Representation Learning with Contrastive Predictive Coding, 2018. [paper]

Contribution:

机器学习分判别式模型和生成式模型,InstDisc 和 InvaSpread 都通过个体判别代理任务去做对比学习,CPC 则属于另一个流派,用生成式代理任务来做对比学习。

Pipeline:

2023-05-16_153151

CPC 以音频信号为例作为模型输入。假设有一个时序序列 $x$,从历史时刻 $x_{t-1}$ 到当前时刻 $xt$ 再到未来时刻 $x{t+4}$。我们将历史时刻输入到编码器 $g{\text{enc}}$(encoder),编码器输出的 feature 再输入到一个自回归模型 $g\text{ar}$(auto regressive),常见的自回归模型包括 RNN、LSTM。自回归模型在每一步都输出一个 context representation,代表上下文特征表示。注意,自回归模型每一步输出的上下文表征都应该包含之前时刻的表征,也就是 $ct$ 中包含了 $c{t-1}$, $c_{t-2}$ ...。

CPC 认为,如果自回归模型输出的上下文表征足够好,也就是 $c_t$ 确实包含了当前和之前所有的信息,那么 $c_t$ 就应该能够对未来时刻的特征输出做出一些合理预测。

这里对比学习的正样本就是未来时刻的输入 $x$ 通过编码器得到的未来时刻的特征输出 $z$,也就是说,从 $ct$ 生成的未来时刻的预测都属于 query,未来时刻真正的输出 $z{t+k}$ 都是由 $x{t+k}$ ($k > 0$) 决定的。那么相对于时刻 $t$ 的预测, ${z{t+1}, ..., z_{t+4}}$ 就是正样本。而负样本的定义很广泛,给一个任意的输入 $x$,它经过编码器得到的输出和当前预测都应该是不相似的。

输入序列也可以替换为一个句子,用前面的单词去预测后面单词的特征输出;替换为图片,可以将图片处理成从左上到右下的一个序列,可以用上半部分的图像特征去预测后半部分的图像特征。

yaoyz96 commented 1 year ago

CMC, ECCV 2020

CMC: Contrastive Multiview Coding, ECCV 2020. [paper]

Contribution:

CMC 作者在摘要中写道,人观察世界是通过很多个传感器的。以视角为例,每个视角其实都是 noisy 且 incomplete 的。但是,一个物体最重要的特征往往是共享的,比如几何信息、物理信息、语义信息。CMC 目的是探究一种强大的特征,其具备视角不变性(view-invariant)。CMC 的工作内容就是在增大同一个物体所有视角之间的互信息,找到一种好的特征,它能够在所有视角下都抓住目标的关键因素。

2023-05-16_175041

CMC 使用 NYU RGBD 数据集,该数据集每个图像有四种 view,包含:

  1. 原始图像
  2. 图像的深度信息
  3. surface normal
  4. 分割信息

CMC 要做的事情是,虽然一幅场景有来自 4 个不同传感器(模态)的信息,但是这些输入都对应一个图片,所以应互为正样本,它们在特征空间中都应该很接近。而随机挑选一个非该图片的信息,不论是何种 view,它都属于负样本。

CMC 证明了多模态对比学习的可行性后,Open AI 就推出了 CLIP,将图片和描述图片的文本作为正样本对。CMC 让大家意识到了对比学习的灵活性。

CMC 的局限性在于,不同模态的数据可能需要不同的编码器,训练计算代价比较高。比如 CILP 在文本端使用了一个大型语言模型 BERT,在图像端使用 ViT。但是后续工作证明了 Transformer 是可以同时处理多个模态的数据的,比如 MA CLIP 就使用一个 Transformer 同时处理文本和图像,效果反而比两个编码器更好。

CMC 原班人马还用对比学习思想做了一篇知识蒸馏的工作,基本思想是,不论使用什么网络,只要输入是同一张图片,输出的特征就应该尽可能相似。也就是说,我们想让 student 和 teacher 网络的输出尽可能相似,通过这种方式将 student 和 teacher 网络做成了正样本对进行对比学习

yaoyz96 commented 1 year ago

MoCo v1, CVPR 2020

CV 领域使用对比学习里程碑式工作

Momentum Contrast for Unsupervised Visual Representation Learning, CVPR 2020. [paper]

Contribution:

关于将对比学习看作字典查询问题的解释:

2023-05-17_121232

假设数据集 $X$ 中有 $n$ 张图像,我们随机选一张图片 $x_1$,对它进行不同的 transformation $T_1$ 和 $T2$ 得到 $x{11}$ 和 $x{12}$ 组成正样本对。通常把 $x{11}$ 称作 anchor, $x{12}$ 称作 positive,即相对于 anchor $x{11}$ 来说 $x_{12}$ 是一个正样本,其余所有图像 $x_2, ..., x_n$ 均为负样本 negative。

有了正负样本的概念,就可以把它们输入到 encoder 得到特征输出 $f$。正样本对输入的 encoder $E{11}$ 和 $E{12}$ 可以是同一个编码器,也可以是不同的编码器。负样本则输入和 positive 样本相同的编码器,即 $E_{12}$,得到负样本特征 $f_2, ..., f_n$。因为正负样本都是相对于 anchor 来说的,因此在编码时应该保证正负样本编码的一致性。

对比学习的基本思想是让 anchor 的特征 $f{11}$ 和正样本特征 $f{12}$ 在特征空间中尽可能相近,而让 $f_{11}$ 与负样本特征 $f_2, ..., fn$ 尽可能远离。MoCo 认为可以将正负样本的特征集合 $f{12}, f_2, ..., fn$ 看作一个字典,每个特征就是字典中的一个 key。因此可以将 anchor 特征 $f{11}$ 看作是 query,字典中的特征看作 key,对比学习就可以转化为字典查询问题,即让 query 尽可能与和它匹配的 key 相似,与其他 key 远离。

MoCo 将所有对比学习看作动态字典查询问题(dictionary look-up),不再使用之前的 anchor、positive、negative 概念,而使用了 query 和 key。

要提升无监督对比学习的性能,MoCo 认为字典应该有两个特性:

  1. 字典要足够大

因为只有字典越大,字典中能表示的视觉信息就越丰富,对 query 来说才能 sampling 更丰富的 key。当用 query 和字典中的 key 做对比时,才更有可能学到将样本区分开的特征、更本质的特征。如果字典太小,模型就有可能学到一个捷径(short-cut solution),导致模型没有很好的泛化性。

  1. 训练过程中字典内容要尽可能保持一致

意思是,字典中所有的 key 都应该用相同或者相似的编码器得到,这样才能保证与 query 做对比的一致性。如果使用不同的编码器,那么 query 查询时最有可能查询到与它使用了相同编码器的 key,而不是相同语义特征的 key,也就是变相地找到一个 short-cut solution。

MoCo Method:

MoCo 发现,如果能够有一个 large 且 consistent 的字典,对无监督的对比学习性能很有好处。因此 MoCo 构建的动态字典(dynamic dictionary),包含两个部分:

1. queue

使用 queue 来表示字典,主要是出于显卡内存的考虑。如果我们要构造一个很大的字典,那么就要输入很多的样本,显卡内存肯定难以支持的。因此 MoCo 想要把字典的大小和模型做 forward 时 batchsize 的大小解耦。

作者利用队列数据结构实现。具体来说,队列容量很大,但不是一次更新的,而是每个 mini-batch 的特征入队,将最早的 mini-batch 特征出队。队列 FIFO 特性适合对比学习中对一致性的要求,因为最早进队的 feature 与当前 feature 的一致性最低,最晚入队的 feature 与当前 feature 的一致性最高。

队列元素可以看作整个数据集的一个 subset,队列容量可以设置很大,因为队列中大部分的元素不是每个 iteration 都需要更新的,因此维护它的计算开销比较小。队列大小的设置很灵活,可以作为一个 hyper-parameter 设置。

2. momentum update (moving-averaged encoder)

用队列数据结构能让字典变得很大,但也由于队列很大,就无法对队列中所有元素做梯度回传,也就是说 key encoder 无法通过 back-propagation 的方式更新参数。

作者提到一个 naive 的方法是,每此迭代 query encoder $f_q$ 更新之后,直接把 $f_q$ 的参数 copy 给 key encoder $f_k$,这样做虽然简单但实验中效果并不好。作者认为,效果不好的原因是 $f_q$ 更新太快,直接 copy 给 $f_k$ 降低了 key representation 的一致性。

作者前面说过,字典中的 key 最好保持一致性,也就是由相同或相似的编码器得来,如果 queue 中的 key 只有当前 mini-batch 是从当前的编码器得到的,之前的 key 都是由之前时刻的编码器得来的,也就无法保持一致性。

因此 MoCo 提出动量更新策略 momentum encoder:

Momentum(动量)可以理解为加权移动平均: $yt = m \cdot y{t-1} + (1-m) \cdot xt$,其中 $m$ 就是动量超参数, $y{t-1}$ 和 $y_t$ 分别为上一时刻和当前时刻的输出, $x_t$ 为当前时刻的输入。意思是,不想让当前时刻的输出 $y_t$ 完全依赖于 $xt$,所以让上一时刻的输出 $y{t-1}$ 也来湊凑热闹。动量 $m$ 是一个介于 0~1 之间的数,动量 $m$ 越大, $y_t$ 的改变就越缓慢。

MoCo 利用动量的这种特性,去缓慢地更新编码器,从而中间学习的特征尽可能保持一致。设 query encoder 参数为 $\theta_q$,key encoder 参数为 $\theta_k$,则参数 $\theta_k$ 的更新规则为: $\thetak = m \cdot \theta{k-1} + (1-m) \cdot \theta_q$, $m \in [0,1)$ 为动量参数。

$\theta_q$ 通过 back-propagation 方式更新,而 $\theta_k$ 最开始由 $\theta_q$ 进行初始化,后续更新则遵照动量更新策略。

当我们选择一个比较大的动量 $m$,那么 $\theta_k$ 的更新实际上是非常缓慢的,不会跟着 $\theta_q$ 快速改变,从而保证字典中的所有 key 都是由相似的编码器抽取得到的。在 MoCo 实验里选择了一个很大的动量 $m = 0.999$,并且对比了 0.999 和 0.9 的实验效果,0.999 比 0.9 效果要好得多。因此作者认为,要利用 queue 达到比较好的效果,就需要 key encoder 尽量保持一致。

Pretext tasks:

MoCo 只是帮助对比学习建立了一个动态字典,而具体到 pretext task,MoCo 可以很灵活,在实验中使用了 InstDisc(个体判别任务)。

MoCo 解释之前的对比学习基本都受限于两个因素:1)字典大小,2)字典一致性,以及 MoCo 是如何通过动量对比解决这些局限性的:

2023-05-17_133654

1. end-to-end

端到端方法关注 encoder 的一致性,其优点是 key encoder 可以通过反向传播更新参数,因此字典中的 key 具有很高的一致性。但局限性在于,字典大小就是 mini-batch 的大小,导致字典无法设置过大。

端到端方法 query 和 key 来自同一个 mini-batch,因此 encoder q 和 k 可以是同一个编码器,一次 forward 就可以得到所有样本特征。这样虽然能够对 key encoder 进行反向传播来更新参数,但字典大小和 mini-batch size 是等价的,我们无法获得一个很大的字典,因为 GPU 放不下过大的 batch size。

SimCLR 使用的就是端到端方式,但谷歌有 TPU 可以无脑上大 batch size(batch size=8,192),是足以支持对比学习的。

2. memory bank

相比端到端方式,基于 memory bank 的工作更关注大字典,因此要牺牲字典的一致性。

基于 memory bank 的工作只有一个 query encoder,通过梯度回传进行更新。另一边通过 memory bank 将整个数据集的特征都存下来。对于 ImageNet 来说就有 128w 个特征,InstDisc 作者提到,由于每个特征只有 128-d,因此即使有 128w 个特征,总存储量也只有 600M,对整个 memory bank 做一次查询,在 GPU 上只需要 20ms,因此效率是有保证的。

每次模型训练时,就从 memory bank 中抽采样很多 key 作为字典。由于字典及抽样过程都是 offline 的,因此抽样的字典可以很大。但是,以 InstDisc 为例,memory bank 的更新方式是,每次抽取一个字典后,会用 query encoder 输出的特征对它们做替换,而 query encoder 更新速度是非常快的,因此整个 memory bank 要经过一个 epoch 才能完全更新,里面包含了多个 iteration 更新的结果,导致 memory bank 内部不一致。

3. MoCo

解决前面两种做法的局限性,MoCo 不受限于端到端方法的字典大小,还能保证字典特征的一致性。MoCo 和 memory bank 流派更接近,都是只有一个 query encoder 通过梯度回传更新参数,字典都采用了额外的数据结构进行存储。但是,memory bank 方法的扩展性不如 MoCo,当数据集特别大时,memory bank 的存储开销会上升。

其实 memory bank 方法也意识到字典不一致的问题,因此提出了 Proximal Regularization 让更新变得更平滑,这和 MoCo 中的动量更新原理是类似的,只不过 memory bank 动量更新的是特征,而 MoCo 动量更新编码器。

Experiment:

这里不再使用 ImageNet-1K 这个名称,因为 1K 表示有 1,000 个类别,而 MoCo 使用个体判别任务,类别数量等于样本数量,因此是 1 Million。

Facebook 的 Instagram 包含 1 Billion 数据。

MoCo 和 InstDisc 很相似,用 queue 取代了 InstDisc 的 memory bank 作为一个额外的数据结构存储负样本;用 momentum encoder 取代了 InstDisc 的 loss 约束项,达到动量地更新编码器,而不是动量地更新特征,得到了更好的结果。InstDisc 使用了 NCE loss,MoCo 使用 InfoNCE loss。在实验细节上,MoCo 也沿用了 InstDisc 的设置,采用 ResNet-50 作为 encoder,均降维到 128-d,最后都使用了 L2 进行标准化,loss temperature $\tau$ 都设置为 0.07,等。

yaoyz96 commented 1 year ago

SimCLR v1, ICML 2020

A Simple Framework for Contrastive Learning of Visual Representations, ICML 2020. [paper]

Pipeline:

2023-05-17_151940

对一个 mini-batch 中的数据,假设有样本 $x$,对 $x$ 做两次数据增强得到 $x_i$ 和 $x_j$,同一个样本增强得到的两个样本为正样本,mini-batch 中其余样本以及它们经过数据增强后的样本均为负样本。正负样本通过共享权重的编码器 $f(\cdot)$ ,得到特征表示 $h$。SimCLR 在此之后,又加了一个 projection head $g(\cdot)$(MLP layer + relu),输出特征 $z_i$ 和 $z_j$,让它们俩达到最大一致性(agreement)。就是这样一个简单的 projection head 层,让最后学到的特征在 ImageNet 分类任务上提升 10%。为了保持工作的一致性,projection head 输出特征也是 128-d。

projection head $g(\cdot)$ 仅在训练时使用,在做下游任务时去掉,只用 $f(\cdot)$,这样和其他工作对比是公平的,因为 $g(\cdot)$ 只是为了让特征学习地更好,不参与下游任务的学习。

SimCLR 只有一个编码器,不需要 memory bank 或者 queue,整体过程非常简单。CVPR 2019 InvaSpread 可以看作是 SimCLR 的前身,它们的区别是:

  1. SimCLR 用了更多的数据增强,作者发现对比学习需要很强的数据增强技术
  2. SimCLR 加了一个 projection head,可以学习的非线性变换
  3. SimCLR 使用了更大的 batch size,训练时间更久

SimCLR 主要突出了数据增强技术在对比学习中的重要性:

2023-05-17_152002

Loss function: Normalized temperature-scaled 交叉熵函数

yaoyz96 commented 1 year ago

MoCo v2, 2020

两页的技术报告

Improved Baselines with Momentum Contrastive Learning, 2020. [paper]

MoCov2 发现 SimCLR 中提到的技术都是即插即用的,因此直接拿过来用在了 MoCo 上,实现了比之前 MoCo 和 SimCLR 更好的结果。作者强调了 MoCo 相比 SimCLR 的优越性:硬件条件

改进:

  1. 添加 MLP
  2. 添加更多的数据增强
  3. 训练使用 cosine learning rate schedule
  4. 更多的训练 epoch

2023-05-17_160612

yaoyz96 commented 1 year ago

SimCLR v2, NIPS 2020

Big Self-Supervised Models are Strong Semi-Supervised Learners, NIPS 2020. [paper]

SimCLR 论文讲了三个部分:

2023-05-17_161439

  1. 如何从 SimCLR v1 变到 v2
  2. 自监督预训练模型可以用于样本很少的下游任务 fine-tune
  3. 自监督预训练模型可以用于下游的 self-training/distillation(论文标题)

v2 相比 SimCLR v1,改进点包括:

  1. 使用了更大的模型,152层的残差网络
  2. 加深了 projection head,将 mlp+relu 变成了 mlp + rule + mlp + relu(更深提升不大)
  3. 使用了 MoCo 的动量编码器(提升1%左右,作者认为是 SimCLR 本身的字典已经很大了,不论是字典大小和字典的特征一致性都做的很好了,因此动量编码器不会带来大的提升)
yaoyz96 commented 1 year ago

SwAV, NIPS 2020

Unsupervised Learning of Visual Features by Contrasting Cluster Assignments, NIPS 2020. [paper]

基本思想: Swap Assignment Views (SwAV) 认为,给定同一张图片,用该图片生成不同的视角(views),这些所有视角得到的特征原则上应该是很接近的,因此可以用一个视角的得到的特征去预测另一个视角得到的特征。

Contribution:

聚类是一种无监督的表征学习方法,它的学习目标和对比学习非常接近,都是希望拉近相似物体的距离,增大不相似物体的距离。SwAV 则将对比学习和聚类方法结合在一起,通过换位预测(Swap prediction)方法对模型进行训练。

对比学习用 query 和 key 的 feature 做对比,计算目标函数。而 SwAV 认为,直接用样本的特征去做对比不仅原始而且费资源,SwAV 认为每个样本都代表一个类别,对 ImageNet 来说,负样本总数应该是 128w,而字典大小总是数据集的子集,属于一种近似。

SwAV 提出使用 prototype $C \in \mathbb{R}^{d \times k}$ 作为聚类中心, $d$ 为特征维度(128-d), $k$ 表示聚类中心的个数(作者选择 3,000)。

Pipeline:

2023-05-17_163638

forward 过程:得到特征 $Z_1$ 和 $Z_2$ 之后,SwAV 不是直接再特征上做对比学习 loss,而是先通过聚类将特征 $Z$ 和 prototype $C$ 共同生成一个目标 $Q$,这里 $Q$ 相当于 ground-truth。

pretext task:如果 $X_1$ 和 $X_2$ 是正样本,那么它们生成的特征 $Z_1$ 和 $Z_2$ 就应该很相似,那么它们是可以互相去做预测的。也就是说,让 $Z_1$ 和 $C$ 做点乘按道理是可以预测出 $Q_2$ 的,类似用 $Z_2$ 和 $C$ 做点乘也是可以预测出 $Q_1$ 的。点乘结果就是我们的预测,通过聚类得到的 $Q_1$ 和 $Q_2$ 就是 ground-truth。

SwAV 相比之前的对比学习方法:

Trick: multi-crop

这种思想比较普适,能够用在多种 learning task 中

原本对比学习在一张图片上做 2 次 crop(224x224),获取两个比较大的 view 作为正样本。SwAV 认为除了全局特征,还应该对比学习一些局部 view 的特征,因此提出 multi-crop,对一张图像进行 2 次大 view crop(160x160)和 4 次小 view crop(96x96),在节省计算代价的前提下获取更多的 crop。

yaoyz96 commented 1 year ago

CPC v2, ICML 2020

Data-Efficient Image Recognition with Contrastive Predictive Coding, ICML 2020. [paper]

相比 CPC v1,使用了更多的 trick,将 40% 左右的准确率直接拉到了 70%。

yaoyz96 commented 1 year ago

InfoMin, NIPS 2020

CMC 作者分析型研究工作

What Makes for Good Views for Contrastive Learning? NIPS 2020. [paper]

Contribution:

分析到底选择什么 view 更有益于对比学习。提出 InfoMin 原则:最小化互信息(其实不是严格意义上最小,而是不多不少的、刚刚好的互信息)。作者的观点是:互信息太大,不仅浪费而且容易导致泛化性能不好;互信息太少,模型就可能达不到最优信息。作者的意思是不能一味追求最大化互信息,而是不多不少的状态最好。按照 InfoMin 原则,选择合适的数据增强技术,选择合适的对比学习 view。

yaoyz96 commented 1 year ago

BYOL, NIPS 2020

Bootstrap Your Own Latent - A New Approach to Self-Supervised Learning, NIPS 2020. [paper]

Bootstrap 的意思是你已经有了一些东西,在它的基础上进行改造。

对比学习为什么要使用正负样本:

如果只有正样本,模型学习的唯一目标就是让同一类尽可能相似,没有其他约束的情况下模型就会找到一个捷径解,也就是不论给模型输入什么样本,模型都输出相同的特征,这样计算两个样本之间的相似度肯定是最大的,loss 等于 0。而使用负样本,就会给模型加上一个约束,不仅要使同类样本相似度最大,还要使不同类样本相似度尽可能小,模型才会让正样本和负样本的 loss 都下降,有动力达到最优解。

因此,负样本应该是对比学习里必须存在的东西,它能防止模型学到捷径解,很多论文把这种情况叫 model collapse 或 learning collapse(模型/学习坍塌),说白了就是什么也没学到。

Contribution:完全不用任何形式的负样本的对比学习

Pipeline:

2023-05-17_191244

input $x$ 通过两钟数据增强得到 $v$ 和 $v'$,它们分别经过 enocder $f{\theta}$ 和 $f{\xi}$ 得到特征 $y{\theta}$ 和 $y{\xi}$。这里两个 encoder 使用相同的架构,但不同的参数。其中 $f{\theta}$ 通过反向传播进行更新, $f{\xi}$ 使用了动量编码器,通过 moving-average 方式进行更新。和 SimCLR 一样,在 encoder 之后使用了 projection head $g{\theta}$ 和 $g{\xi}$,它们结构相同,参数不同,其中 $g_{\xi}$ 也是通过动量方式更新。

之前的对比学习方法,这里就要比较 projection head 输出结果 $z{\theta}$ 和 $z{\xi}$ 之间的 agreement,从而优化目标函数。但是,BYOL 没有这样做,BYOL 又添加了一个 predictor 网络 $q{\theta}$, $q{\theta}$ 和 $g{\theta}$ 网络结构完全一样,得到新特征 $q{\theta}(z{\theta})$。BYOL 想要让 $q{\theta}(z{\theta})$ 和 $z{\xi}$ 尽可能一致。BYOL 将原本的 $z{\theta}$ 和 $z{\xi}$ 的匹配问题换成了 $q{\theta}(z{\theta})$ 对 $z_{\xi}$ 的预测问题,用一个 view 的特征去预测另一个 view 的特征。

Loss function:

使用 mean squared error(MSE),因为变成预测任务以后,目标就是让两个 vector 尽可能接近,所以一个 MSE loss 足够了。

为什么这样左脚踩右脚就能上天?

blog 作者通过消融实验发现,BN 层是比较关键的点。

BN 层:将一个 batch 内所有样本的特征计算均值和方差,即 running mean 和 running variance,然后用整个 batch 的均值方差对该 batch 中的样本特征做归一化。这就意味着在计算某个正样本 loss 的同时,也能看到其他样本的特征,这是存在信息泄露的。MoCo 中的 Shuffling BN 操作也是为了防止这种信息泄露的。由于有这种信息泄露的存在,就可以将一个 batch 内其他样本都看作隐式的负样本。因此,有了 BN 操作之后,BYOL 并不是真的只是自己和自己学,其实也在做隐式的对比,此时的对比任务其实是:正样本特征和这个 batch 中的平均特征有什么差别。这样就和 SwAV 很像了,SwAV 也没有和负样本去比,而是和聚类中心去比,BYOL 通过 BN 产生的平均特征也可以看作一种聚类中心。

后来 BYOL works even without batch statistics 赶紧写了一篇论文解释这种现象。作者发现,BN 确实比较关键... 不是,最后 BYOL 作者和 blog 作者达成一致,认为 BN 确实重要,但并不是因为提供了隐式负样本效果才好。

yaoyz96 commented 1 year ago

SimSiam, CVPR 2021

用卷积神经网络做对比学习的总结性工作

Exploring Simple Siamese Representation Learning, CVPR 2021. [paper]

2023-05-17_201731

Contribution:

2023-05-17_202314

yaoyz96 commented 1 year ago

Barlow Twins, ICML 2021

Barlow Twins: Self-Supervised Learning via Redundancy Reduction, ICML 2021. [paper]

Contribution:

基本思想不变,还是想让正样本间的相似度尽可能等于 1,让负样本的相似度尽可能为 0。

yaoyz96 commented 1 year ago

MoCo v3, ICCV 2021 Oral

论文只很简单地介绍了 MoCo 如何从 v1 到 v2 到 v3 的,大部分篇幅都在讲如何提高自监督学习在 ViT 的稳定性

An Empirical Study of Training Self-Supervised Vision Transformers, ICCV 2021. [paper]

MoCo v3 架构 = MoCo v2 和 SimSiam 的合体

Contribution:

2023-05-17_204755

yaoyz96 commented 1 year ago

DINO v1, ICCV 2021

Emerging Properties in Self-Supervised Vision Transformers, ICCV 2021. [paper]

详见:DINO系列-MetaAI #13