TT Lab
博客

한국어 English 日本語 中文

开始
博客

博客

自监督学习 1:从 SimCLR·MoCo 到 DINO·DINOv2 —— 如何在无标签的情况下学习特征以及防止“坍塌”

状态:草稿 (2026-10-13)。 论文中的数值是查阅原文并结合实验条件确认的数值。亲自运行过的是笔记本电脑 CPU 上的玩具示例(code/02_ssl_collapse.py,耗时 30 秒左右),从未用乒乓球视频做过自监督学习(未实际测量)。 系列《阅读视觉模型 2》第 2 篇。上一篇: 对比学习与 CLIP。关于 ViT 架构本身,请参考 阅读视觉模型 1。

自监督学习 1:在无标签的情况下学习特征

目录

1. 直觉:标签昂贵,图像泛滥

只要想想乒乓球视频,就能立刻感同身受。用手机拍摄的练习视频可以堆积数小时,但要手工标注“这个帧里球在这里”,一小时最多也就标几百张。那么,能否直接从 无标签的图像堆中学习到一些东西呢?

自监督学习(self-supervised learning)通过在数据内部自主构建并解决问题来进行学习。本篇所涉及的方法族所解决的问题如下:

即使对同一张图像进行两次不同的变换(裁剪、颜色调整、模糊),模型也必须输出“它们是同一个东西”。

能够经受住变换考验的特征,很大可能是捕捉了图像的 内容并丢弃了 外观(亮度、裁剪位置)的特征。如果说第 1 篇的 CLIP 将“图像和文字”配对,那么在这里,则是将“图像与该图像的不同变体”配对。甚至连文字都不需要。

2. 问题:坍塌

然而,这个问题中存在一个陷阱。如果“让两个变体的输出相同”就是目标的全部,那么 对所有输入都产生相同输出的模型就是完美的正解。此时损失函数达到了最小值,但特征却没有任何信息。这被称为 坍塌(collapse) 。

如果把本篇中出现的方法都看作是防止坍塌的不同机制,那么就很容易进行总结了。

두 변형은 가깝게 — 그런데 「모두 한 점」 은 막는다 SimCLR · MoCo 오답을 밀어낸다(InfoNCE) 한 그림의 두 변형 다른 그림 = 오답 BYOL 오답 없이, 예측기 + 느린 교사 학생 인코더 예측기 교사 인코더 맞힌다 교사 = 학생의 이동 평균(EMA) 예측기를 빼면 붕괴 DINO: 교사의 분포를 학생이 따라 한다 큰 자르기 2장 작은 자르기 여럿 교사(EMA) 학생 가운데 맞추기 + 날카롭게(τ 0.04) 소프트맥스(τ 0.1) 손실 = 교사 분포와 학생 분포의 교차 엔트로피 가운데 맞추기만 → 고른 분포로 붕괴 날카롭게만 → 한 칸으로 붕괴 둘이 서로를 막을 때만 버틴다 (논문 그림 7, 이 글의 예제)
图:SimCLR·MoCo、BYOL 和 DINO 防止坍塌的方式
方法 防止坍塌的机制 损失函数
SimCLR (2020) 将批次中的其他图像作为负样本推开 InfoNCE(与第 1 篇相同形式)
MoCo (2020) 将过去批次的输出存入队列作为负样本。填充队列的编码器缓慢更新 InfoNCE
BYOL (2020) 无负样本。仅在学生侧附加预测器,教师是学生的指数移动平均(EMA) 规范化输出的均方误差
DINO (2021) 无负样本。减去教师输出的均值(中心化),并用低温度参数使其锐化 教师分布与学生分布的交叉熵

3. 如何进行训练

SimCLR:大批量与强数据增强

SimCLR 的损失函数被称为 NT-Xent,但其形式与第 1 篇的 InfoNCE 相同。在包含 N 张图像的批次中生成 2N 个变体,每个变体的正样本是其对应的配对变体,其余 2N−2 个则是负样本。论文发现的要点有三个:

MoCo:将负样本存入队列

大批量会消耗大量内存。MoCo 从过去的批次中获取负样本。将输出存储在一个长度为 65,536 的队列中并用作负样本。问题在于队列中的输出是由不同时间点的编码器生成的。因此,填充队列的编码器(键编码器)不进行反向传播,而是让其权重以极慢的速度跟随正在学习的编码器。

key 인코더 ← m · key 인코더 + (1 − m) · query 인코더,   m = 0.999

如果将 m 设为 0(每次直接复制),训练就会失败;当 m 为 0.9 时准确率为 55.2%,为 0.999 时为 59.0%(论文,队列大小为 4,096 的消融实验)。 缓慢跟随的教师这一机制延续到了 BYOL 和 DINO 中。

BYOL:没有负样本也能坚持

BYOL 完全不使用负样本。它在学生(online)编码器之上额外附加一个 预测器,去预测看到了不同变体的教师(target)编码器的输出。教师是学生的 EMA,并且梯度不回传(从 0.996 缓慢增加到 1)。虽然论文并未给出完整的证明来解释为什么“把它们收敛到一个点”这条捷径会被阻止,但通过实验可以明确的是,去掉预测器就会导致坍塌(论文)。我们在下面的例子中也将看到同样的结果。

DINO:模仿教师的分布

DINO 将输出转换为包含 K 个维度的概率分布。教师和学生观察同一张图像的不同裁剪部分,并通过减小交叉熵使学生去匹配教师的分布。这类似于蒸馏分类器的过程,因此被称为 自蒸馏(self-distillation) (蒸馏将在第 4 篇中详细介绍)。

# 02_ssl_collapse.py 의 DINO 부분에서 줄임
with torch.no_grad():
    q = softmax((teacher(v1) - center) / 0.04)         # 가운데 맞추고, 낮은 온도로 날카롭게
loss = -(q * log_softmax(student(v2) / 0.1)).sum(1).mean()
center = 0.9 * center + 0.1 * teacher_outputs.mean(0)    # 교사 출력의 이동 평균
teacher = EMA(student)

防止坍塌的两个组件朝相反的方向运作:

论文通过图表展示了如果只使用其中一个组件,模型就会分别向各自的方向坍塌。学生观察 2 张大裁剪图和多张小裁剪图,而教师只观察大裁剪图(multi-crop)。这变成了一个“仅通过观察小的碎片就要猜出整张图含义”的问题。

DINOv2:数据比方法更重要

DINOv2 并未对损失函数做出重大修改(DINO 损失 + 基于遮挡块的 iBOT 损失 + 使特征均匀分布的 KoLeo 正则化)。相反,它在 数据筛选上下了功夫。在去重后的 12 亿张原始图像中,检索出与已整理的数据集相似的图像,最终挑选出 1.42 亿张(LVD-142M)。然后,在训练了最大的 ViT-g(11 亿参数)之后, 小型模型并非从头开始训练,而是从大型模型中蒸馏而来(论文)。为什么蒸馏会胜出是第 4 篇的主题。

4. 动手实践:亲眼观察坍塌

code/02_ssl_collapse.py 生成了来自 10 个隐藏类别的 32 维“图像”。图像中除了决定类别的核心内容外,还混入了剧烈波动的“背景”,如果直接比较像素,背景就会主导距离。数据增强包括重新绘制背景、擦除 30% 的像素、亮度缩放和噪声。所有方法都使用相同的编码器(小型 MLP)和相同的 1,500 步进行训练。 标签(类别编号)仅用于评估 。

评估指标有两个:各嵌入维度的标准差(若接近 0 则表示全部坍塌到一个点),以及针对每张测试图像根据最近的 5 个类别编号进行投票的 k-NN 准确率(直接使用输出, code/02_ssl_collapse.out.txt).

方法 标准差 k-NN 准确率 备注
随机猜测 — 0.100
纯像素 — 0.315 背景主导距离
未经训练的编码器 0.170 0.234
1. 仅拉近 0.003 0.107 损失 −0.9998(最小值 −1)—— 彻底坍塌
2. SimCLR (τ=0.2) 0.170 0.931
3. BYOL 0.087 0.816
3′. 从 BYOL 中去掉预测器 0.002 0.150 坍塌
4. DINO 0.077 0.669 使用维度 12/32,每张图熵 2.62
4′. 去掉中心化 0.054 0.301 使用维度 1/32,熵 0 —— 坍塌到单一维度
4″. 去掉锐化 0.056 0.286 每张图熵 3.47 = 最大值 (log 32) — 坍塌为均匀分布

这里有几个可以读懂的结论:

5. 论文数值

评估大多采用 线性评估(linear evaluation)。冻结自监督训练好的编码器,在其之上仅用 ImageNet 标签训练一个线性分类器来测量准确率。以此观察特征被整理得“多大程度上可以被线性划分”。

方法 模型 ImageNet 线性评估 top-1 条件(论文)
MoCo ResNet-50 60.6% 200 个 epoch,批次 256
SimCLR ResNet-50 / 4 倍宽度 69.3% / 76.5% 1,000 个 epoch。76.5% 与有监督的 ResNet-50 处于同一水平
MoCo v2 ResNet-50 71.1% 800 个 epoch,添加 MLP 头·模糊数据增强
BYOL ResNet-50 74.3% 1,000 个 epoch,批次 4,096
DINO ViT-S/16 · ViT-B/8 77.0% · 80.1% k-NN 为 74.5% · 77.4%
DINOv2 ViT-S/14 · ViT-g/14 81.1% · 86.5% LVD-142M,S 从 g 中蒸馏
DINOv3 ViT-7B/16 88.4% 评估分辨率 512px,LVD-1689M(17 亿张)

也有关于数据增强重要性的数据。如果只保留裁剪一种数据增强,BYOL 还能维持 59.4%(−13.1%p),但 SimCLR 则暴跌至 40.3%(−27.6%p)(BYOL 论文)。这可以理解为:越是依赖负样本的方法,就越经不起“只看颜色找配对”这类捷径的考验。

DINO 除了数字之外还有一个著名的观察。ViT 的最后一层注意力(attention)图在从未看过标签的情况下,会沿着物体的轮廓走。用这张图制作的掩码重叠度(Jaccard)在 ViT-S/16 中达到了 45.9,高于相同结构的监督学习情况(27.3)(论文)。

计算量如下。DINO ViT-S/16 需要两台 8-GPU 服务器运行 3 天,整个 DINOv2 需要 2.2 万个数据中心级 GPU 小时,DINOv3 则需要 6.1 万个小时(论文)。

6. 局限性

7. 与我们项目的联系

TT 一句话。 如果对模型说“只要说这俩是一样的就行”,模型就会说世上万物都一样。亲眼看到阻止这种情况的装置——无论是错误答案、预测器还是中心对齐——哪怕漏掉一个真的就会崩溃,觉得挺有意思的。

参考文献

登录后即可点赞

评论

还没有评论。

登录后即可发表评论