DINO 系列:自监督视觉基础模型(DINO → DINOv2 → DINOv3)

Task: 自监督视觉表征学习 / 视觉基础模型
Method: 自蒸馏 + Gram Anchoring + 多尺度蒸馏
Venue: ICCV 2021 / TMLR 2024 / arXiv 2025
Year: 2021 → 2023 → 2025
Paper: DINO / DINOv2 / DINOv3
Code: facebookresearch/dino / facebookresearch/dinov2 / facebookresearch/dinov3

1. 摘要

DINO(ICCV 2021)首次揭示自监督 Vision Transformer 具备无需标注即可理解图像语义的涌现性质:ViT 的自监督特征隐含语义分割信息,且可直接作为 k-NN 分类器使用(ViT-S 在 ImageNet 上 k-NN 精度达 78.3%)。方法核心是 自蒸馏(self-distillation with no labels):学生网络学习匹配 EMA 教师网络的 softmax 输出,无需任何标签。

DINOv2(TMLR 2024)将 DINO 扩展至工业级规模:通过自动化数据整理管线构建 LVD-142M 数据集,训练 ViT-g(1.1B 参数),并结合 iBOT 的掩码图像建模损失。DINOv2 首次让自监督模型在各类视觉任务上匹敌甚至超越 OpenCLIP 等弱监督方法,在图像级和像素级任务均提供全能型视觉特征。

DINOv3(arXiv 2025)将模型规模推至 ViT-7B(6.7B 参数),训练数据扩充至 LVD-1689M。核心创新 Gram Anchoring 解决了长程训练中稠密特征退化的历史难题:通过将学生的 Gram 矩阵(patch 间余弦相似度矩阵)正则化到训练早期教师的 Gram 矩阵,同时保留全局语义表征的持续提升。配合高分辨率适配和多学生蒸馏流水线,DINOv3 在冻结 backbone 条件下刷新了目标检测(COCO mAP 66.1)、语义分割(ADE20k mIoU 63.0)、深度估计等多项 SOTA。

核心论点:自监督学习无需任何标注即可产出兼顾全局语义与局部几何的通用视觉特征,Gram Anchoring 突破了稠密表征随训练退化的瓶颈,使 SSL 真正成为视觉基础模型的可扩展范式。

2. 问题与动机

视觉基础模型的核心目标是训练一个”冻结即用”的通用视觉编码器。现有路线各有局限:

训练范式 代表方法 核心优势 核心问题
监督学习 ViT-22B, BiT 分类精度高 依赖大规模人工标注(JFT 3B 图像),特征偏向特定任务
弱监督(CLIP) OpenCLIP, SigLIP 2 利用图文配对数据,强零样本能力 稠密特征质量差(分割/深度任务明显落后),依赖元数据
聚合模型 AM-RADIO, PE 蒸馏多源教师(CLIP+SAM+DINO) 本质受限于教师质量,依赖监督标注的 SAM
自监督(MAE/JEPA) MAE, I-JEPA 无需标注 微调才表现好,冻结特征质量有限
自监督(DINO 系列) DINO → DINOv2 → DINOv3 无需任何标注或元数据 DINOv2 之前:稠密特征随长训练退化

核心痛点:自监督训练在大模型(>ViT-L)和长训练调度下,全局分类精度持续提升,但稠密特征(patch-level similarity map)会逐渐退化——语义定位变得嘈杂,分割/深度估计精度反而下降。这一矛盾在 DINOv2 训练中已被观察到,但一直未被解决。

3. 核心洞察

洞察 1:自蒸馏催生涌现属性——无标签即可理解语义

传统自监督方法(如 SimCLR、MoCo)通过对比学习拉近同一图像不同增强的表征,需要大量负样本。DINO 转而采用 知识蒸馏 框架:学生网络学习匹配 EMA 教师网络的输出分布,无需负样本。

核心公式——DINO 损失(cross-entropy with sharpened softmax):

$$\mathcal{L}_{\text{DINO}} = -\sum_{x \in \{x_1^g, x_2^g\}} \sum_{\substack{x' \in V \\ x' \neq x}} \sum_{k=1}^{K} P_t^{(k)}(x) \log P_s^{(k)}(x')$$

其中 $P_t(x) = \text{softmax}((g_{\theta_t}(x) - c) / \tau_t)$ 是教师输出(用 centering 和低温度锐化),$P_s(x') = \text{softmax}(g_{\theta_s}(x') / \tau_s)$ 是学生输出。教师权重通过 EMA 更新:$\theta_t \leftarrow m \cdot \theta_t + (1-m) \cdot \theta_s$。

关键发现:这种自蒸馏使 ViT 的自注意力图自发涌现出与物体边界高度对齐的语义分割能力,这在监督 ViT 中并不出现。

洞察 2:数据整理 + 模型规模 = 通用视觉特征

DINOv2 的关键突破不在算法创新,而在 工程规模化

  1. 数据整理:从公开爬虫数据出发,用层次化 k-means 聚类 + 去重构建 LVD-142M;DINOv3 进一步扩充至 LVD-1689M(17B 原始图像 → 多层过滤)
  2. 模型扩展:DINOv2 训练 ViT-g(1.1B),DINOv3 推至 ViT-7B(6.7B),40 层 Transformer,embedding 维度 4096
  3. 训练策略:DINOv3 采用恒定学习率调度(替代余弦调度),支持无限训练
  4. 损失组合:$\mathcal{L}_{\text{Pre}} = \mathcal{L}_{\text{DINO}} + \mathcal{L}_{\text{iBOT}} + 0.1 \cdot \mathcal{L}_{\text{Koleo}}^D$,兼顾全局判别、局部重建和特征均匀性
模型 参数量 数据集大小 Patch 大小 位置编码 ImageNet Linear
DINO ViT-B 86M ImageNet-1k 16 可学习 80.1%
DINOv2 ViT-g 1.1B LVD-142M 14 可学习 87.3%
DINOv3 ViT-7B 6.7B LVD-1689M 16 RoPE 88.4%

洞察 3:Gram Anchoring 修复稠密特征退化

DINOv3 的核心创新。问题根源:在长程 SSL 训练中(>200k 迭代),patch token 与 CLS token 的余弦相似度逐渐增大,patch 特征失去局部性,语义分割性能下降(见 Fig. 5)。

Gram Anchoring 的思路:不约束特征本身(允许自由演化),而是约束 patch 间相似度的结构

$$\mathcal{L}_{\text{Gram}} = \| \mathbf{X}_S \cdot \mathbf{X}_S^\top - \mathbf{X}_G \cdot \mathbf{X}_G^\top \|_F^2$$

其中 $\mathbf{X}_S$ 是学生的 L2 归一化 patch 特征($P \times d$),$\mathbf{X}_G$ 是 Gram 教师(训练早期 200k 迭代的快照)的特征。高分辨率变体:将高分辨率图像通过 Gram 教师后下采样,获得更平滑的相似度结构。

完整精炼目标:

$$\mathcal{L}_{\text{Ref}} = w_D \cdot \mathcal{L}_{\text{DINO}} + \mathcal{L}_{\text{iBOT}} + w_{DK} \cdot \mathcal{L}_{\text{Koleo}}^D + w_{\text{Gram}} \cdot \mathcal{L}_{\text{Gram}}$$

操作上,Gram Anchoring 在 1M 迭代后启动,每 10k 步用当前 EMA 教师更新 Gram 教师(最多 3 次),效果几乎立即可见——VOC 分割在 10k 步内显著改善。

要记住的 3 个数字

  • 66.1 mAP:DINOv3 在 COCO 目标检测上的表现(冻结 backbone + 100M 参数 Plain-DETR),超越所有微调方案
  • 63.0 mIoU:ADE20k 语义分割,冻结 backbone 匹配 ONE-PEACE(2.2B 参数微调)
  • 55.9 vs 49.5 mIoU:DINOv3 vs DINOv2 在 ADE20k 稠密线性探测上的差距,+6.4 mIoU 验证了 Gram Anchoring 的效果

4. 方法设计

4.1 整体架构

DINOv3 的完整训练流水线由四个阶段组成:

$$\text{Data} \xrightarrow{\mathcal{L}_{\text{Pre}}} \text{ViT-7B (1M iter)} \xrightarrow{\mathcal{L}_{\text{Ref}}} \text{Gram Anchoring} \xrightarrow{\text{HR}} \text{高分辨率适配} \xrightarrow{\text{Distill}} \text{模型家族}$$
DINOv3 模型家族性能概览
┌─────────────────────────────────────────────────────────────────────┐
│                    DINOv3 训练流水线                                  │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  阶段 1:SSL 预训练(1M iter, 256 GPUs)                               │
│  ┌───────────┐   ┌──────────────┐   ┌──────────────┐                │
│  │  2 global │──▶│ Student ViT  │──▶│ DINO Head    │─┐              │
│  │  crops 256│   │   7B/16      │   │ (CLS token)  │ │              │
│  │ + 8 local │   │  40 blocks   │   └──────────────┘ │ℒ_DINO        │
│  │  crops 112│   │  dim=4096    │   ┌──────────────┐ │              │
│  └───────────┘   │  RoPE+4 reg  │──▶│ iBOT Head    │─┤+ℒ_iBOT       │
│                  └──────┬───────┘   │(patch tokens)│ │              │
│                     EMA │           └──────────────┘ │+ℒ_Koleo      │
│                  ┌──────▼───────┐                    │              │
│                  │ Teacher ViT  │─── softmax target ─┘              │
│                  │(EMA, m=0.999)│                                   │
│                  └──────────────┘                                   │
│                                                                     │
│  阶段 2:Gram Anchoring(从 1M iter 开始)                             │
│  ┌──────────────┐   ┌──────────────────────────────────────────┐    │
│  │ Gram Teacher │   │ ℒ_Ref = w_D·ℒ_DINO + ℒ_iBOT              │    │
│  │(200k 快照)  │──▶│       + w_DK·ℒ_Koleo + w_Gram·ℒ_Gram     │    │
│  │ 每10k步更新   │   │ ℒ_Gram = ‖X_S·X_S^T - X_G·X_G^T‖²_F      │    │
│  └──────────────┘   └──────────────────────────────────────────┘    │
│                                                                     │
│  阶段 3:高分辨率适配(10k iter)                                       │
│  ┌────────────────────────────────────────────────┐                 │
│  │ 全局裁剪 512/768 + 局部裁剪 112~336               │                 │
│  │ + Gram Anchoring(Gram teacher 2× 高分辨率下采样)│                 │
│  └────────────────────────────────────────────────┘                 │
│                                                                     │
│  阶段 4:蒸馏(7B → 小模型)                                           │
│  ┌──────────────────────────────────────────────────────────┐       │
│  │ 冻结 7B 教师 → 同时蒸馏多个学生                              │       │
│  │ ViT-S(21M) / S+(29M) / B(86M) / L(300M) / H+(840M)       │       │
│  │ ConvNeXt-T(29M) / S(50M) / B(89M) / L(198M)              │       │
│  └──────────────────────────────────────────────────────────┘       │
└─────────────────────────────────────────────────────────────────────┘

4.2 关键组件

ViT-7B 架构对比

属性 DINOv2 (ViT-g) DINOv3 (ViT-7B)
参数量 1.1B 6.7B
层数 40 40
Patch 大小 14 16
位置编码 可学习 RoPE(axial)
Register tokens 4 4
Embedding 维度 1536 4096
FFN 类型 SwiGLU SwiGLU
FFN 隐层维度 4096 8192
注意力头数 24 32
DINO 原型数 128k 256k
iBOT 原型数 128k 96k

损失函数

损失 作用对象 功能 权重
$\mathcal{L}_{\text{DINO}}$ CLS token 全局判别性:student-teacher 交叉熵 $w_D$
$\mathcal{L}_{\text{iBOT}}$ Patch tokens 局部重建:掩码补全 1.0
$\mathcal{L}_{\text{Koleo}}^D$ CLS token 特征均匀正则化 0.1
$\mathcal{L}_{\text{Gram}}$ Patch tokens(全局裁剪) Gram 矩阵一致性正则 $w_{\text{Gram}} = 2$

4.3 关键代码

函数 文件 功能
GramLoss.forward dinov3/loss/gram_loss.py Gram Anchoring 核心——计算 Gram 矩阵 MSE
DINOLoss.forward dinov3/loss/dino_clstoken_loss.py DINO 自蒸馏损失(student-teacher 交叉熵)
📄 点击展开 GramLoss.forward 代码

(来源:dinov3/loss/gram_loss.py

class GramLoss(nn.Module):
"""Gram Anchoring 损失:约束学生与 Gram Teacher 的 patch 相似度结构"""

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() # Frobenius 范数等价
self.apply_norm = apply_norm # 是否 L2 归一化
self.remove_neg = remove_neg # 是否移除负相似度

def forward(self, output_feats, target_feats, img_level=True):
"""
Args:
output_feats: 学生 patch 特征 (B, N, dim)
target_feats: Gram 教师 patch 特征 (B, N, dim)
Returns:
loss: ‖X_S·X_S^T - X_G·X_G^T‖²_F(标量)
"""
output_feats = output_feats.float()
target_feats = target_feats.float()

# 对教师特征做 L2 归一化
if self.apply_norm:
target_feats = F.normalize(target_feats, dim=-1)

# 计算教师 Gram 矩阵:X_G · X_G^T
target_sim = torch.matmul(
target_feats, target_feats.transpose(-1, -2)
)

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

# 计算学生 Gram 矩阵:X_S · X_S^T
student_sim = torch.matmul(
output_feats, output_feats.transpose(-1, -2)
)

# 可选:移除负相似度值(保持余弦相似度的正半空间)
if self.remove_neg:
target_sim[target_sim < 0] = 0.0
student_sim[student_sim < 0] = 0.0

# 返回 MSE = ‖student_sim - target_sim‖²_F / numel
return self.mse_loss(student_sim, target_sim)
📄 点击展开 DINOLoss.forward 代码

(来源:dinov3/loss/dino_clstoken_loss.py

class DINOLoss(nn.Module):
"""DINO 自蒸馏损失:student-teacher 交叉熵"""

def __init__(self, out_dim, student_temp=0.1, center_momentum=0.9):
super().__init__()
self.student_temp = student_temp
self.center_momentum = center_momentum
self.register_buffer("center", torch.full((1, out_dim), math.nan))

@torch.no_grad()
def sinkhorn_knopp_teacher(self, teacher_output, teacher_temp, n_iterations=3):
"""Sinkhorn-Knopp 归一化替代简单 softmax centering(来自 SwAV)"""
Q = torch.exp(teacher_output / teacher_temp).t() # K × B
B = Q.shape[1] * world_size
K = Q.shape[0]
sum_Q = torch.sum(Q)
dist.all_reduce(sum_Q)
Q /= sum_Q
for _ in range(n_iterations):
sum_of_rows = torch.sum(Q, dim=1, keepdim=True)
dist.all_reduce(sum_of_rows)
Q /= sum_of_rows
Q /= K
Q /= torch.sum(Q, dim=0, keepdim=True)
Q /= B
Q *= B
return Q.t()

def forward(self, student_logits, teacher_probs, ignore_diagonal=False):
"""
student_logits: [student_crops, batch, prototypes]
teacher_probs: [teacher_crops, batch, prototypes](已经 softmax)
"""
student_crops, B, K = student_logits.shape
teacher_crops, _, _ = teacher_probs.shape
# 学生用较高温度的 log_softmax
student_logits = F.log_softmax(
student_logits.float() / self.student_temp, dim=-1
)
if not ignore_diagonal:
# 所有 student-teacher crop 对之间的交叉熵
loss = -torch.einsum("s b k, t b k -> ", student_logits, teacher_probs)
return loss / (B * student_crops * teacher_crops)
else:
# 排除同一 crop 对(避免退化解)
loss = -torch.einsum("s b k, t b k -> s t", student_logits, teacher_probs)
min_st = min(student_crops, teacher_crops)
loss = torch.diagonal_scatter(loss, loss.new_zeros(min_st))
return loss.sum() / (B * student_crops * teacher_crops - B * min_st)

5. 实验与分析

5.1 主要结果

目标检测(COCO,冻结 backbone + Plain-DETR)

方法 Backbone 状态 Backbone 训练参数量 COCO mAP COCO-O mAP COCO-O ER
EVA-02 + Cascade 微调 300M 300M 64.1 63.6 34.7
InternImage-G + DINO det 微调 6B 6B 65.1
EVA-02 + Co-DETR 微调 300M 300M 65.4 63.7 34.3
PEspatial + DETA 微调 1.9B 2B 65.3 64.0 34.7
DINOv3 + Plain-DETR 冻结 7B 100M 65.6 66.4 36.8
DINOv3 + Plain-DETR (TTA) 冻结 7B 100M 66.1

语义分割(ADE20k,冻结 backbone + Mask2Former + ViT-Adapter)

方法 Backbone 状态 训练参数量 mIoU (single) mIoU (TTA)
BEIT3 微调 1.6B 62.0 62.8
InternImage-H 微调 1.3B 62.5 62.9
ONE-PEACE 微调 2.2B 62.0 63.0
DINOv3 冻结 927M 62.6 63.0

稠密线性探测(冻结 backbone + 线性层)

方法 ViT ADE20k mIoU NYUv2 RMSE↓ Cityscapes mIoU
AM-RADIOv2.5 g/14 53.0 0.340 78.4
DINOv2 g/14 49.5 0.372 75.6
Web-DINO 7B/14 42.7 0.466 68.3
DINOv3 7B/16 55.9 0.309 81.1

关键发现

  1. DINOv3 是首个在冻结 backbone 条件下匹配全部微调 SOTA 的检测/分割系统——100M 训练参数 vs 竞品 300M-6B
  2. 在 ADE20k 稠密线性探测上,DINOv3 超出 DINOv2 +6.4 mIoU,超出需要 SAM 蒸馏的 AM-RADIOv2.5 +2.9 mIoU
  3. Web-DINO(同样 7B 规模但未用 Gram Anchoring)在稠密任务上大幅落后(42.7 vs 55.9),验证了 Gram Anchoring 的不可替代性

5.2 消融实验:验证三个洞察

Gram Anchoring 消融(洞察 3)

配置 Gram Teacher 迭代 Gram 分辨率倍数 IN-ReaL ADE20k mIoU NYUv2 RMSE↓ 验证洞察
Baseline(无 Gram) 88.2 50.3 0.307
+ Gram Anchoring 200k 88.0 53.6 0.285 洞察 3
+ 高分辨率 Gram 200k 88.0 55.7 0.281 洞察 3
高分辨率 Gram(早期 teacher) 100k 87.9 55.7 0.284 洞察 3
高分辨率 Gram(晚期 teacher) 1M 88.1 54.9 0.290 洞察 3

数据整理消融(洞察 2)——200k 迭代短训练:

数据集 IN-1k IN-R ADE20k NAVI SPair 验证洞察
Raw(未整理) 80.1 84.8 70.3 70.1 63.3
Clustering 79.4 85.4 72.3 81.3 85.2 洞察 2
Retrieval 84.0 86.7 70.7 86.0 82.7 洞察 2

自蒸馏涌现验证(洞察 1):DINOv3 ViT-7B 的无监督物体发现(TokenCut)在 VOC07 上达到 66.1 CorLoc,超出原始 DINO ViT-B(60.1)和 DINOv2 ViT-g(55.6),证明自蒸馏的涌现属性在规模化后更加显著。

5.3 性能瓶颈分析

  • 主要瓶颈在于 patch 大小:ViT-7B 使用 patch size 16,在 896×896 输入下仅产出 56×56 的特征图,对精细边界预测不利——这是语义分割仍需 ViT-Adapter + Mask2Former 等重解码器的原因
  • 全局任务仍略逊弱监督:ImageNet 线性探测 88.4% vs SigLIP 2 的 89.1%,差距主要来自 SSL 未利用任何文本/类别信息
  • OCR 场景差距明显:在文字识别相关数据集上,DINOv3 显著落后于 PE-core(训练中接触过图文配对数据)

5.4 失效场景分析

  • 文字/符号理解:由于纯视觉自监督训练不涉及文本监督,DINOv3 在 OCR 密集型数据集上远弱于 CLIP 衍生模型
  • 超长训练未配合 Gram 的场景:论文明确展示 ViT-7B 在 1M 迭代无 Gram 条件下,分割性能降至低于 200k 迭代时的水平(Fig. 5)
  • 低分辨率适配后 OOD 退化:高分辨率适配在提升高分辨率表现的同时,ObjectNet 等 OOD 任务在低分辨率下出现轻微退化(Fig. 11)

6. 工程实践

6.1 训练配置

Backbone:         ViT-7B/16 (40 blocks, dim=4096, SwiGLU FFN 8192)
Input: 全局裁剪 256×256, 局部裁剪 112×112 (2+8 multi-crop)
Batch: 4096 images, 256 GPUs (H100-SXM5)
Optimizer: AdamW, lr=0.0004 (恒定, warmup 100k), weight_decay=0.04
Precision: bfloat16 + FP8 矩阵乘法
EMA momentum: 0.999
Training: 1M 迭代预训练 → Gram (w_Gram=2, 每 10k 步更新, 最多 3 次)
→ 高分辨率适配 10k 迭代 → 蒸馏 1M+250k 迭代
Training Time: ~47 MWh (约 61,440 GPU 小时 H100)
Carbon Footprint: ~18 tCO2eq

6.2 复现要点

  1. RoPE Box Jittering:坐标框 $[-1, 1]$ 随机缩放至 $[-s, s]$($s \in [0.5, 2]$),增强对分辨率/尺度/宽高比的鲁棒性
  2. Register Tokens 不可省略:4 个 register token 消除高范数 patch 异常值,否则特征图出现伪影
  3. Gram Teacher 选择窗口:100k-200k 迭代的教师效果最优;太晚(1M)的教师本身 patch 一致性已退化
  4. 特征维度异常值:7B 模型的个别特征维度会出现异常大值,需对中间层特征施加 Batch Normalization
  5. 恒定学习率:不再使用余弦调度,允许训练无限延伸
  6. 蒸馏不需 Gram:蒸馏阶段用冻结 7B 教师直接指导,未观察到 patch 一致性问题

6.3 性能优化方向

精度提升

  • 利用 DINOv3 4k+ 高分辨率特征图进行 dense prediction,当前 ViT-Adapter 仅用到 896 分辨率
  • 探索更多 Gram Teacher 更新策略(如连续 EMA 而非离散快照)

速度优化

  • 蒸馏模型 ViT-L(300M)在多数任务上接近 ViT-7B,推理 FLOP 低 10 倍(721 vs 14515 GFLOPs @512)
  • ConvNeXt 蒸馏变体在边缘部署场景更高效(ConvNeXt-T 仅 29M 参数)

7. 研究启示

7.1 可迁移的思想

  • Gram 矩阵正则化可泛化到其他 SSL 任务:约束特征结构而非特征值,允许表征自由演化的同时保持局部一致性,可应用于视频 SSL、多模态预训练
  • “先大后小”的蒸馏范式:训练一个极大模型,再蒸馏出一整个家族,比直接训练小模型效果更好——ViT-H+(840M)性能接近 ViT-7B
  • 冻结 backbone 作为评估标准:DINOv3 证明高质量 SSL backbone 无需微调即可做检测/分割/深度估计,这支持”一次编码、多任务复用”的实际部署模式
  • 跨域通用性:同一训练管线直接应用于卫星遥感图像(SAT-493M),在 GEO-Bench 上超越专门的遥感模型

7.2 方法局限

  • 训练成本极高(47 MWh / ~18 吨 CO₂),难以被学术机构复现
  • 缺乏文本对齐能力,零样本分类/检索弱于 CLIP 系方法(需额外 dino.txt 阶段弥补)
  • Patch size 16 限制了像素级精度,对极精细任务(如实例边界)仍需重解码器

7.3 技术影响

  • 打破”SSL 不适合 dense tasks”的成见:DINOv3 首次在稠密任务上全面超越弱监督和聚合方法
  • 定义视觉基础模型新范式:单一冻结 backbone 支撑检测/分割/深度/3D/视频多任务,颠覆”每个任务微调一个模型”的传统流程
  • 推动多模态下游应用:高质量冻结视觉特征可直接嫁接 LLM(如 PaliGemma、LLaVA),降低多模态模型训练成本
  • 遥感领域破圈:首次证明通用 SSL 模型在卫星图像上可超越专门预训练的遥感基础模型(如 Prithvi-v2)