跳转到内容
English

DINO 系列:从无标签自蒸馏到稠密特征

交互教程

没有类别标签,模型如何教自己?三代 DINO 又分别改变了什么?

前置阅读:ViT · 语义表征

本页讲自监督视觉表征 DINO 系列。同名的目标检测模型 DINO 属于另一方法家族;其检测 queries 与目标函数不在本系列范围内。

DINO 预训练没有人工提供的类别名称。模型看到同一图像的不同裁剪,并学习在这些视图之间保持一致的输出。Backbone f 产生图像级与 patch 特征;独立 head h 把图像级特征映射为 K 个原型分数。这些分数构成预测分布,不是人工类别词表,也不是 VQ 码本。DINO 不用最近码替换 backbone 特征,目标函数也不训练像素解码器。

gθ(x)=hθ(fθ(x)),p(k)=eg(k)/τ∑jeg(j)/τg_\theta(x)=h_\theta(f_\theta(x)),\qquad p^{(k)}=\frac{e^{g^{(k)}/\tau}}{\sum_j e^{g^{(j)}/\tau}}

阅读顺序从左到右。点击模块,将它与计算和代码对应。代码为教学伪代码;来源链接提供论文方法或已核查的实现。

没有标签,到底在学什么?

DINO 预训练没有人工提供的类别名称。模型看到同一图像的不同裁剪,并学习在这些视图之间保持一致的输出。Backbone f 产生图像级与 patch 特征;独立 head h 把图像级特征映射为 K 个原型分数。这些分数构成预测分布,不是人工类别词表,也不是 VQ 码本。DINO 不用最近码替换 backbone 特征,目标函数也不训练像素解码器。

# Teaching pseudocode; not a complete training implementation.
feature = backbone(view).cls
logits = projection_head(feature)
p = softmax(logits / temperature)

训练状态:训练与推理角色在下文分别解释。

gθ(x)=hθ(fθ(x)),p(k)=eg(k)/τ∑jeg(j)/τg_\theta(x)=h_\theta(f_\theta(x)),\qquad p^{(k)}=\frac{e^{g^{(k)}/\tau}}{\sum_j e^{g^{(j)}/\tau}}

逐步讲解:没有标签,到底在学什么?

两个网络:视图不同,更新方式也不同

原始 DINO 的 teacher 接收两个全局裁剪;student 接收全局裁剪和较小的局部裁剪。二者 backbone 与 head 的结构相同,但参数值不同。每个 teacher 视图与其他 student 视图配对,不与同一视图配对。反向传播只更新 student。Teacher 从 student 初始化,通过指数滑动平均 EMA 跟随它,不是训练开始前另行提供的预训练专家。

# Teaching pseudocode; not a complete training implementation.
teacher = [stop_grad(teacher_net(v)) for v in global_views]
student = [student_net(v) for v in global_views + local_views]
loss = cross_view_ce(teacher, student, exclude_same_view=True)

训练状态:训练与推理角色在下文分别解释。

L=−∑v∈Vg∑u∈V, u≠v∑kpt(k)(v)log⁡ps(k)(u)\mathcal L=-\sum_{v\in V_g}\sum_{u\in V,\,u\ne v}\sum_k p_t^{(k)}(v)\log p_s^{(k)}(u)

逐步讲解:两个网络:视图不同,更新方式也不同

中心化与锐化分别针对不同失败方式

若每张图像都输出同一个常量,视图之间也能一致,却没有有效特征。原始 DINO 先从 teacher logits 减去运行均值向量 c,再使用较低 teacher 温度。中心化限制少数原型维度独占输出;锐化抵抗均匀分布。中心对每个原型维度各有一个值。如果所有 logits 只减同一个标量,它会在 softmax 中抵消,毫无作用。这些操作与 momentum teacher 共同构成经过实验验证的配方;改变一个教学分布不能证明实际训练不会坍塌。

# Teaching pseudocode; not a complete training implementation.
target = stop_grad(softmax((teacher_logits - center) / tau_t))
loss = cross_entropy(target, student_logits / tau_s)
center = mc * center + (1 - mc) * batch_mean(teacher_logits)

训练状态:训练与推理角色在下文分别解释。

pt=softmax⁡ ⁣(gt−cτt),c←mcc+(1−mc) mean⁡batchgtp_t=\operatorname{softmax}\!\left(\frac{g_t-c}{\tau_t}\right),\quad c\leftarrow m_c c+(1-m_c)\,\operatorname{mean}_{batch}g_t

逐步讲解:中心化与锐化分别针对不同失败方式

EMA 是参数更新,不是梯度

令 θt 为旧 teacher,θs 为 optimizer 更新后的 student。m=0.9 时,旧 teacher 参数 0.8 与新 student 参数 0.2 得到 0.74。m=1 时 teacher 不动;m=0 时直接复制 student。计算 student 梯度前,teacher 目标要 detach。Teacher EMA 与中心 EMA 是两个不同状态更新,系数也不同。下游推理通常只保留一个训练好的 backbone,丢弃自蒸馏 head。

# Teaching pseudocode; not a complete training implementation.
student = optimizer_step(student, loss)
# Separate no-gradient state update:
teacher = momentum * teacher + (1 - momentum) * student

训练状态:训练与推理角色在下文分别解释。

θt←mθt+(1−m)θs,∇θtL=0\theta_t\leftarrow m\theta_t+(1-m)\theta_s,\qquad \nabla_{\theta_t}\mathcal L=0

逐步讲解:EMA 是参数更新,不是梯度

查看固定版本来源

L=−∑v∈Vg∑u∈V, u≠v∑kpt(k)(v)log⁡ps(k)(u)\mathcal L=-\sum_{v\in V_g}\sum_{u\in V,\,u\ne v}\sum_k p_t^{(k)}(v)\log p_s^{(k)}(u)

两个网络:视图不同,更新方式也不同

Section titled “两个网络:视图不同,更新方式也不同”

原始 DINO 的 teacher 接收两个全局裁剪;student 接收全局裁剪和较小的局部裁剪。二者 backbone 与 head 的结构相同,但参数值不同。每个 teacher 视图与其他 student 视图配对,不与同一视图配对。反向传播只更新 student。Teacher 从 student 初始化,通过指数滑动平均 EMA 跟随它,不是训练开始前另行提供的预训练专家。

L=−∑v∈Vg∑u∈V, u≠v∑kpt(k)(v)log⁡ps(k)(u)\mathcal L=-\sum_{v\in V_g}\sum_{u\in V,\,u\ne v}\sum_k p_t^{(k)}(v)\log p_s^{(k)}(u)
训练架构与参数更新
训练架构与参数更新 原创教学图;具体配置和简化边界见正文。 · 论文来源小屏可左右滚动;点击查看全尺寸。

将架构与公式结合阅读。每个版本改变的是学习系统中的具体部分。

中心化与锐化分别针对不同失败方式

Section titled “中心化与锐化分别针对不同失败方式”

若每张图像都输出同一个常量,视图之间也能一致,却没有有效特征。原始 DINO 先从 teacher logits 减去运行均值向量 c,再使用较低 teacher 温度。中心化限制少数原型维度独占输出;锐化抵抗均匀分布。中心对每个原型维度各有一个值。如果所有 logits 只减同一个标量,它会在 softmax 中抵消,毫无作用。这些操作与 momentum teacher 共同构成经过实验验证的配方;改变一个教学分布不能证明实际训练不会坍塌。

pt=softmax⁡ ⁣(gt−cτt),c←mcc+(1−mc) mean⁡batchgtp_t=\operatorname{softmax}\!\left(\frac{g_t-c}{\tau_t}\right),\quad c\leftarrow m_c c+(1-m_c)\,\operatorname{mean}_{batch}g_t

DINOv2 加入局部目标与规模化训练配方

Section titled “DINOv2 加入局部目标与规模化训练配方”

DINOv2 结合图像级 DINO 目标与 iBOT patch 目标。Student 看到被遮盖的 patches,未遮盖的 teacher 在同一裁剪的对应位置提供目标。图像与 patch 损失使用独立 heads。Sinkhorn–Knopp 用来平衡 teacher 分配;KoLeo 鼓励一批归一化图像特征分散。数据筛选、实现效率和最后的高分辨率阶段同样重要,因此不能把 DINOv2 简化成“DINO 换一个更大的 ViT”。

Lpatch=−∑i∈M∑kpt,i(k)log⁡ps,i(k),LKoLeo=−1B∑ilog⁡min⁡j≠i∥fˉi−fˉj∥2\mathcal L_{patch}=-\sum_{i\in M}\sum_k p_{t,i}^{(k)}\log p_{s,i}^{(k)},\quad \mathcal L_{KoLeo}=-\frac1B\sum_i\log\min_{j\ne i}\|\bar f_i-\bar f_j\|_2

DINOv3 报告:长时间训练可能改善全局特征,却损害局部一致性。Gram anchoring 选择较早、稠密特征更好的 teacher 作为参照。将 X 的每个 patch 向量归一化后,比较 XXᵀ,即 N×N 的 patch 两两相似度矩阵。它约束关系,却不要求每个通道逐值等于 teacher。若 Q 正交,(XQ)(XQ)ᵀ=XXᵀ,因此通道旋转可以保持该损失。Gram teacher 与通常的 EMA 目标是两个角色,并在 refinement 阶段周期性更新。

Xs,Xg∈RN×D,LGram=∥XsXsT−XgXgT∥F2X_s,X_g\in\mathbb R^{N\times D},\qquad\mathcal L_{Gram}=\|X_sX_s^T-X_gX_g^T\|_F^2

公开实现使用 mean squared error,并提供负相似度截断选项。这些设置会改变归一化或所比较的矩阵;数值复现前需要检查选定配置。

系列变化的结构对照
系列变化的结构对照 原创教学图;具体配置和简化边界见正文。 · 论文来源小屏可左右滚动;点击查看全尺寸。
目标函数的局部结构
目标函数的局部结构 原创教学图;具体配置和简化边界见正文。 · 论文来源小屏可左右滚动;点击查看全尺寸。

温度、中心化与教师更新

固定的教学向量,只计算概率和损失。数值变化不能证明训练会更稳定或模型效果更好。

教师 logits:[1, 0.3, −0.5];学生 logits:[0.1, 0.8, −0.2],学生温度 0.4。旧教师参数为 0.8,新学生参数为 0.2。

原型维度教师概率学生概率
0 0.73030.1384
1 0.26860.7963
2 0.00110.0654

教师熵: 0.5901 · CE: 1.5085 · EMA: 0.7400

令 θt 为旧 teacher,θs 为 optimizer 更新后的 student。m=0.9 时,旧 teacher 参数 0.8 与新 student 参数 0.2 得到 0.74。m=1 时 teacher 不动;m=0 时直接复制 student。计算 student 梯度前,teacher 目标要 detach。Teacher EMA 与中心 EMA 是两个不同状态更新,系数也不同。下游推理通常只保留一个训练好的 backbone,丢弃自蒸馏 head。

θt←mθt+(1−m)θs,∇θtL=0\theta_t\leftarrow m\theta_t+(1-m)\theta_s,\qquad \nabla_{\theta_t}\mathcal L=0

DINOv3 也改变模型规模、位置编码和训练方式。大 teacher 使用 RoPE 与 registers;较小的发布模型由固定的大 teacher 蒸馏而来。论文并未在这个小模型蒸馏阶段使用 Gram anchoring。DINOv2 同样区分大模型自蒸馏与小 backbone 蒸馏。Registers 提供内部计算位置,不会把图像 token 压得更短。后续与文本对齐的 DINO 分支增加了图像自监督之外的训练,不能默认为普通 DINO 输出。

CLS 向量概括整张图像;patch 向量保留有索引的空间网格,reshape 前必须排除 registers。RAE 会在语义特征上额外训练图像 decoder。分割或线性探针表现好,不代表像素可以无损重建。比较时必须一起记录 checkpoint、patch 大小、分辨率、特征宽度、归一化、冻结策略与 decoder。本页数值交互只说明目标概率和 EMA 算术,不训练 DINO,也不测量特征质量。

这些特征就是离散重建码吗?

不是。Backbone 输出连续特征。预测原型或文本 ID 不会把它们变成 VQ 码本;重建需要另行定义 decoder 与训练目标。

返回学习地图

自绘图和伪代码用于教学;原论文图片单独标注来源。论文报告、固定实现观察和解析示例分别标记;未运行研究模型。