DINOv3 预训练中的数据采样机制:同质批次、异质批次与训练数据组织详解 详细解释DINIO-v3中的以下内容:Data Sampling During pre-training, we use a sampler to mix different data parts together. There are several different options for mixing the above data components. One is to train with homogeneous batches of data that come from a single, randomly selected component in each iteration. Alternatively, we can optimize the model on heterogeneous batches that are assembled by data from all components, selected using certain ratios. Inspired by Charton and Kempe (2024), who observed that it is beneficial to have homogeneous batches consisting of very high quality data from a small dataset, we randomly sample in each iteration either a homogeneous batch from ImageNet1k alone or a heterogeneous batch mixing data from all other components. In our training, homogeneous batches from ImageNet1k account for 10% of training.3.1.2 数据采样(Data Sampling)在预训练过程中,我们使用一个采样器( Sampler )将不同数据部分混合在一起。对于上述数据组件的混合方式,存在多种选择。一种方式是在每次训练迭代(Iteration)中,从随机选择的单一数据组件中构造同质批次( Homogeneous Batches )进行训练。另一种方式是优化异质批次( Heterogeneous Batches ),即按照一定比例从所有数据组件中选择数据并组合成批次。受到 Charton 和 Kempe(2024)的启发,他们发现由小规模数据集中的高质量数据组成的同质批次具有积极作用,因此我们在每次迭代中随机选择以下两种方式之一:仅从 ImageNet1k 中采样一个同质批次;混合其他所有数据组件的数据,形成异质批次。在我们的训练过程中,来自 ImageNet1k 的同质批次占总训练过程的 10%。结合代码和mermaid图详细解释在训练过程中,DINO-v3是如何组织训练数据的。我会把论文里的采样策略和官方实现对上:先定位 DINOv3 的数据配置、sampler / dataloader 构造和训练循环,再用 Mermaid 把“10% ImageNet-1k 同质批次 + 90% 其他数据异质批次”的实际数据流画出来。这样可以区分论文层面的策略描述和代码层面的具体实现。目前有一个关键点已经能确认:论文明确给出“每次迭代在两类 batch 之间随机切换”,但公开训练入口默认只接收一个train.dataset_path。所以我正在核对CombinedDataLoader到底是在混“数据源”,还是只是在混不同裁剪分辨率;这会决定哪些细节能直接从开源代码验证,哪些只能按论文机制还原。可以把 DINOv3 这一段理解成:它不是简单地把所有数据集拼成一个巨大的ConcatDataset,然后均匀随机抽图;而是在每一个训练 iteration 开始时,先决定“这一整个 batch 应该是什么性质的 batch”,再进入 DINO/iBOT 的多裁剪与训练流程。这里尤其要区分两件事:论文里的数据源级采样(Source-level Sampling),以及公开代码里的样本索引采样(Sample-index Sampling)。这两个层次经常被混在一起理解。DINOv3 论文明确描述了前者,但目前公开训练代码并没有完整公开原始预训练使用的那个多数据源异质混合器。turn306672view2turn944118view21. 先说最核心的结论DINOv3 每个 iteration 的逻辑可以抽象成:Z t ∼ Bernoulli ⁡ ( 0.1 ) Z_t\sim\operatorname{Bernoulli}(0.1)Zt​∼Bernoulli(0.1)其中Z t Z_tZt​决定第t tt个 iteration 使用哪种 batch:B t = { B t I m a g e N e t 1 k , Z t = 1 Mix ⁡ ( D 1 , D 2 , … , D K ; r ) , Z t = 0 \mathcal{B}_t=\begin{cases}\mathcal{B}_t^{\mathrm{ImageNet1k}},Z_t=1\\\operatorname{Mix}(\mathcal{D}_1,\mathcal{D}_2,\ldots,\mathcal{D}_K;\mathbf{r}),Z_t=0\end{cases}Bt​={BtImageNet1k​,Mix(D1​,D2​,…,DK​;r),​Zt​=1Zt​=0​也就是说:10% 左右的 iteration:整个 batch 全部来自 ImageNet-1k。90% 左右的 iteration:ImageNet-1k 不参与,而是把其他数据组件按照预设比例混到同一个 batch 中。这正是论文所说的:ImageNet-1k 使用同质批次(Homogeneous Batch)其余数据使用异质批次(Heterogeneous Batch)论文原文明确说,每次 iteration 随机选择二者之一,并且 ImageNet-1k homogeneous batch 占训练的 10%。这里最容易误解的一点是:“ImageNet-1k 占 10%”并不意味着每个 batch 里放 10% ImageNet-1k 图片。实际上更接近:iteration 000001 : Other mixed batch iteration 000002 : Other mixed batch iteration 000003 : ImageNet1k-only batch iteration 000004 : Other mixed batch iteration 000005 : Other mixed batch ...而不是:每个 batch: 10% ImageNet1k 30% LVD 20% Retrieval ...这两种训练分布其实相当不一样。2. DINOv3 到底有哪些数据源?论文首先从约 170 亿张公开 Instagram 图像构成的大规模原始池出发,再构造不同的数据部分。第一部分通过层次k kk-means 和均衡采样形成了约 16.89 亿图像的 LVD-1689M;第二部分是基于下游 seed 数据集做相似图像检索得到的检索筛选数据(Retrieval-curated Data);第三部分直接加入公开视觉数据集,包括 ImageNet-1k、ImageNet-22k 和 Mapillary Street-level Sequences。turn306672view0因此可以把预训练数据概念化为:D = { D L V D , D r e t r i e v a l , D I N 1 K , D I N 22 K , D M a p i l l a r y , … } \mathcal{D}=\{\mathcal{D}_{\mathrm{LVD}},\mathcal{D}_{\mathrm{retrieval}},\mathcal{D}_{\mathrm{IN1K}},\mathcal{D}_{\mathrm{IN22K}},\mathcal{D}_{\mathrm{Mapillary}},\ldots\}D={DLVD​,Dretrieval​,DIN1K​,DIN22K​,DMapillary​,…}然后 DINOv3 特意把D I N 1 K \mathcal{D}_{\mathrm{IN1K}}DIN1K​单独拿出来。整体结构大致如下: