一、DINOv3的目标

在经历了DINO和DINOv2的持续演进后,Meta本月推出了新一代视觉自监督模型DINOv3。

DINOv3的诞生,部分灵感来源于大语言模型LLM的成功经验:随着模型规模和训练数据量的指数级增长,模型开始展现出以往小模型难以实现的新兴能力(emergent abilities)。

这不禁让人思考:这种Scaling Law在视觉任务中是否同样适用?
也就是说,当我们不断扩大视觉模型的参数量和训练数据时,它是否也会出现类似语言模型的能力跃迁——生成更丰富、更稳健、更加通用的视觉特征?

DINOv3正是在这种背景下应运而生,它通过大规模训练和精心设计的自监督策略,尝试验证视觉领域的scaling law,同时解决以往扩展SSL模型时常见的不稳定问题。

二、DINOv3的特性

既然想要训练一个大模型,那必然要构建一个参数量较大的模型架构,并且给这个模型喂大量的训练数据,并搭配合适的训练技巧。

2.1 大规模数据集制作

大型基础模型的成功很大程度上依赖于大规模的训练数据,但是,单纯增加数据量并不保证性能提升,还需要保证:

  • 数据多样性与平衡:确保不同视觉概念均被覆盖
  • 数据有用性:与下游任务相关的图像内容。

DINOv3构建了一个大规模预训练数据集,总数据量约170亿张图片。通过结合聚类和检索两种方法,DINO在泛化能力和下游性能之间取得了平衡,具体实现步骤如下:

1
2
3
1. 聚类:使用DINOv2将图像压缩成特征向量,执行层级k-means聚类,然后应用平衡抽样算法,生成16.89亿张精选图片(LVD-1689M),覆盖网络上所有视觉概念。
2. 检索:从原始的数据池中,检索与种子图像(比如下游任务的图像)相关的图像
3. 补充公开数据集:加入ImageNet1k、ImageNet22k和Mapillary街景,用于进一步优化模型性能。

2.2 大规模自监督训练

2.2.1 DINOv3继承了DINOv2的特性

DINOv3继承了DINOv2的多裁剪策略(全局CLS token loss和局部patch token loss),以及Sinkhorn-Knopp中心化策略和Koleo正则化。

2.2.2 DINOv3在大规模训练时遇到的问题

不一样的是,DINOv3将参数量由DINOv2的1.1B增加到了7B,并采用了在LLM中被广泛使用的ROPE,同时引入了一个新的loss约束:Gram Anchoring,这是DINO
v3新引入的一个损失函数,专门来解决密集任务能力退化的问题。

过程是这样的,首先为了获得更好的DINOv3训练效果,需要尽可能迭代更多次。然而,在实验中作者发现,在达到一定迭代次数后,模型对于全局表征的能力在变强,但是对于局部的细节感知能力却在急剧退化,从而导致下游的密集预测任务效果不佳,比如语义分割。

为了更好地理解这种性能下降,作者通过可视化块间余弦相似度来分析patch特征的质量。下图展示了主干网络输出的patch特征与参考patch(红色高亮)之间的余弦相似度图。在20万次迭代后,相似度图平滑且局部化良好,表明patch级表征具有一致性。然而,在60万次迭代及以上后,相似度图性能显著下降,与参考patch高度相似但无关的patch数量不断增加。patch级一致性的丧失与密集任务性能的下降相关!
1756113815862

虽然将全局DINO损失与局部iBOT损失相结合已开始解决这个问题,但实验发现这种平衡并不稳定,随着训练的进行,全局表征将占据主导地位。

为了减轻密集任务的下降,作者提出了一个专门设计的新目标函数,用于正则化 patch特征并确保良好的patch级一致性,同时保持较高的全局性能。

接下来具体看一下这个Gram Anchoring。

2.2.3 用于优化patch特征一致性的loss:Gram Anchoring

Gram矩阵是多个patch特征之间的两两点积矩阵,能反映局部特征的相似性结构。

作者从Gram矩阵出发,在特征的相似性结构上对patch一致性进行约束,而非直接约束具体的特征向量。只要保持相似性结构不变(Gram 矩阵匹配),patch局部特征本身可以自由移动,从而不抑制判别能力

给定一幅图像包含$P$个 patch、特征维度为$d$。

  • 学生网络局部特征矩阵(L2归一化):$\mathbf{X}_S \in \mathbb{R}^{P\times d}$
  • Gram 老师(早期迭代的教师网络,稠密性质更好)对应特征矩阵:$\mathbf{X}_G \in \mathbb{R}^{P\times d}$

Gram loss如下:

$$\mathcal{L}_{\text{Gram}} = \lVert \mathbf{X}_S \mathbf{X}_S^\top - \mathbf{X}_G \mathbf{X}_G^\top \rVert_F^2$$

由于Gram Anchoring loss约束的是图像整体的结构相似性,因此仅在全局裁剪视图(比如2张global crops)上计算 $\mathcal{L}_{\text{Gram}}$。为了提高效率,作者选择在 1M 次迭代之后才启用该损失,但即使在训练后期加入,它依然能够有效修复退化的局部特征。与此同时,Gram教师模型会每隔10k次迭代更新一次,并与主EMA教师保持对齐,从而进一步提升训练稳定性与性能。

Gram Anchoring loss的代码实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import torch
import torch.nn as nn
import torch.nn.functional as F

class GramLoss(nn.Module):
"""Gram Loss 实现"""

def __init__(
self,
apply_norm=True,
img_level=True,
remove_neg=True,
remove_only_teacher_neg=False,
):
super().__init__()

# 均方误差损失
self.mse_loss = torch.nn.MSELoss()

# 参数
self.apply_norm = apply_norm # 是否对特征做 L2 归一化
self.remove_neg = remove_neg # 是否去掉负相似度
self.remove_only_teacher_neg = remove_only_teacher_neg # 仅去掉教师负相似度

if self.remove_neg or self.remove_only_teacher_neg:
assert self.remove_neg != self.remove_only_teacher_neg

def forward(self, output_feats, target_feats, img_level=True):
"""
计算学生和教师特征之间的 Gram Loss

参数:
output_feats: Tensor
img_level=True 时,形状为 (B, N, D)
img_level=False 时,形状为 (B*N, D)
B = batch 大小
N = 图像 patch 数
D = 特征维度
target_feats: Tensor,形状同 output_feats
img_level: bool, 是否按图像计算 Gram 矩阵,否则按整个 batch

返回:
loss: 标量
"""

# 如果按图像计算 Gram 矩阵,确保输入维度为 (B, N, D)
if img_level:
assert len(target_feats.shape) == 3 and len(output_feats.shape) == 3
# output_feats.shape == (B, N, D)
# target_feats.shape == (B, N, D)

# 转为 float32 以保证计算稳定
output_feats = output_feats.float()
target_feats = target_feats.float()

# 可选:沿特征维度做 L2 归一化
if self.apply_norm:
target_feats = F.normalize(target_feats, dim=-1)
# shape 不变,仍为 (B, N, D)

# 如果不是按图像计算,展开 batch 维度
if not img_level and len(target_feats.shape) == 3:
target_feats = target_feats.flatten(0, 1) # shape -> (B*N, D)

# 计算教师 Gram 矩阵: (B, N, D) @ (B, D, N) -> (B, N, N)
target_sim = torch.matmul(target_feats, target_feats.transpose(-1, -2))
# target_sim.shape == (B, N, N) 如果 img_level=True,否则 (B*N, B*N)

# 学生特征归一化
if self.apply_norm:
output_feats = F.normalize(output_feats, dim=-1)

# 学生特征展平
if not img_level and len(output_feats.shape) == 3:
output_feats = output_feats.flatten(0, 1) # shape -> (B*N, D)

# 计算学生 Gram 矩阵: (B, N, D) @ (B, D, N) -> (B, N, N)
student_sim = torch.matmul(output_feats, output_feats.transpose(-1, -2))
# student_sim.shape == (B, N, N) 如果 img_level=True,否则 (B*N, B*N)

# 去掉负相似度
if self.remove_neg:
target_sim[target_sim < 0] = 0.0
student_sim[student_sim < 0] = 0.0
elif self.remove_only_teacher_neg:
target_sim[target_sim < 0] = 0.0
student_sim[(student_sim < 0) & (target_sim < 0)] = 0.0

# 计算 MSE 损失
loss = self.mse_loss(student_sim, target_sim)
return loss

2.2.4 DINOv3的最终训练目标总结

根据Gram loss开始作用的时间,可以将DINOv3的训练过程分为两个阶段:

阶段1主要是常规的自监督对比学习目标,和 DINOv2 类似:

  • 全局表征:$\mathcal{L}_{\text{DINO}}$
  • 局部一致性:$\mathcal{L}_{\text{iBOT}}$
  • Koleo正则化:$\mathcal{L}_{\text{DKoleo}}$

因此基础阶段的 Loss 可以写成:

$$
L_{\text{Base}} = w_D * L_{\text{DINO}} + L_{\text{iBOT}} + w_{DK} * L_{\text{DKoleo}}
$$

在这个阶段,学生模型学习全局和局部特征,但尚未引入Gram Anchoring。

阶段一训练收敛后,阶段二引入Gram Anchoring Loss来修复和增强patch级局部特征:

$$
L_{\text{Ref}} = w_D * L_{\text{DINO}} + L_{\text{iBOT}} + w_{DK} * L_{\text{DKoleo}} + w_{\text{Gram}} * L_{\text{Gram}}
$$

Gram loss只在global crops上计算,并在1M 次迭代后启用,每10k 次迭代更新Gram教师以与EMA教师对齐。

2.2.5 DINOv3的其它trick

上面讲过,在训练自监督视觉模型时,学生网络学习到的局部patch特征容易退化。虽然原本的Gram loss可以约束patch之间的相似性,但如果图像分辨率太低,patch特征本身就粗糙了,效果有限。

因此,作者提出用更高分辨率的图像生成教师特征,再把这种高质量的特征蒸馏给学生。

具体来说,将输入的视图resize到高分辨率,比如256x256 resize到512x
512,然后输入给Gram教师,教师网络预测结果,再将这个结果下采样resize回去,据此计算与学生网络之间的Gram Anchoring Loss。

三、Post-Training

在训练完成后,DINOv3还进行了一系列扩展,包括高分辨率自适应,高效模型蒸馏,并进一步扩展到文本对齐。

3.1 高分辨率自适应

虽然模型主要在较小分辨率(256)下训练以兼顾速度和效果,但实际应用往往需要处理更高分辨率(如512×512及以上)以捕捉更丰富的空间信息。为此,引入了高分辨率适应训练:在训练中采样不同大小的全局裁剪和局部裁剪,额外训练10k次迭代,从而让模型适应多分辨率输入。

此外,该阶段关键在于Gram Anchoring:使用7B教师模型作为Gram教师,通过约束特征的Gram矩阵,使模型在不同空间位置保持一致且稳健的局部特征相关性。这一操作确保在高分辨率输入下,模型不会因局部特征不稳定而性能下降。

实证结果显示,这一针对性的高分辨率步骤显著提升了模型整体质量,使其在ImageNet分类、ObjectNet OOD等任务中均有所改善,尤其在高分辨率输入下,局部特征质量提高明显。同时,经过适应训练的模型能够处理远高于训练最大分辨率(比如768)的图像,实现稳定的高分辨率推理。

3.2 高效模型蒸馏

为了能够真正地将DINOv3应用到各种设备上,需要将能力其蒸馏到小模型中。由于教师模型推理成本高,因此采用了一种并行蒸馏流水线:多个学生同时训练,共享教师模型推理结果。

这种方式的优点是增加学生数量不会显著增加总教师推理成本,可加快整体蒸馏速度。

3.3 文本对齐

传统的CLIP模型只做全局图文对齐,零样本能力强,但对局部、细粒度特征的捕捉能力有限。新方法发现,如果使用预训练的自监督视觉骨干网络(如DINOv3),可以实现更精细的图文对齐,同时节省计算,因为视觉特征已经学好了。

DINOv3通过冻结视觉骨干并训练文本编码器(加两个小Transformer层,让视觉特征有一定调整空间),利用对比学习将图像的全局与局部特征与文本描述对齐,从而在开放词汇、多模态任务中实现高效、精细的图文匹配。

其中的文本编码器从头训练,目标是让图像和对应的文本描述匹配,这一阶段采用了对比学习的技术。

在匹配文本嵌入之前,把视觉骨干DINOv3的patch特征进行均值池化([B,N,D]–>[B,D])和CLS token([B,2,D]–>[B,D])拼接起来,作为视觉特征,从而可以同时对齐全局特征和局部特征,在密集预测任务(如语义分割)上效果更好,无需额外手工调参。

以上就是关于DINOv3的全部介绍。