对应 Maps to:Stanford CS525 Winter 2026 Training Data for AI,1/21 Contemporary image datasets(Ludwig Schmidt 的 DataComp slides,19 页 + 学生报告)。阅读:Gadre et al. DataComp(2023)、Xu et al. MetaCLIP: Demystifying CLIP Data(2023)、Maini et al. T-MARS(2023)、FLYT: Filter Like You Test(2025)、Laurençon et al. OBELICS(2023)、McKinzie et al. MM1(2024)。 依据说明:DataComp 的部分依据 Schmidt 的 slides 和论文摘要;学生报告没有公开,MetaCLIP、T-MARS、FLYT、OBELICS、MM1 各节依据论文的摘要和正文中的主要结论。数据过滤网络(DFN,Fang et al. 2023)不在阅读列表里,但和本讲关系密切,依据论文摘要补充。第 8 节”统一的视角”和第 9 节”延伸与前沿”是我补充的。 配套代码 Code:
code/lecture05/(numpy + PyTorch;3 个脚本 + 1 个模块;最慢的01_datacomp_baselines.py约 85 秒) 预计阅读时间:2.5 小时(含运行代码)
0. 本讲导航 · How to read this lecture
0.1 学习目标 Learning goals
- 说明 DataComp 为什么要”把基准翻过来”(固定训练代码和算力,只比数据),以及它的设计:候选池、四个规模、38 个评测任务、两个赛道。
- 描述 DataComp 的基线过滤方法和主要发现:CLIP 分数和图片内容过滤互补、更宽松的阈值、质量和数量的权衡、小规模实验能指导大规模。
- 解释 MetaCLIP 的”元数据 + 子串匹配 + 平衡”,以及平衡解决了什么、没解决什么。
- 解释为什么 CLIP 分数会偏爱”图里有字”的样本,T-MARS 怎样处理;从中理解”基于模型的过滤会放大过滤模型自己的捷径”。
- 了解学习过滤器的两种思路(DFN、FLYT),以及”过滤器好不好”和”模型好不好”是两回事。
- 了解超越图文对的数据:交错图文文档(OBELICS)和多模态大模型的数据配比(MM1)。
0.2 先修与本讲范围 Prerequisites & scope
| 默认你已经会 Assumed | 本讲不展开 Not covered |
|---|---|
| 第 2 讲:CLIP、对比学习、零样本分类、有效鲁棒性 | 语言模型的预训练数据(第 6–7 讲;DCLM 会沿用 DataComp 的思路) |
| 第 3 讲:LAION-5B 的构建和 CLIP 分数过滤 | 合成的说明文字(第 11 讲) |
| 第 4 讲:大规模数据处理与去重 | 数据配比的优化方法(第 10 讲) |
0.3 本讲地图 Map
§1 从 LAION 到 DataComp:为什么要"比数据"
§2 DataComp 的设计 ← 代码模块 datacomp_mini
§3 基线与发现:CLIP 分数、图片聚类、质量 vs 数量、跨规模的一致性 ← 代码 01,代码 02 演示 1
§4 MetaCLIP:揭开 CLIP 数据的秘密——元数据与平衡 ← 代码 02 演示 2
§5 T-MARS:图里有字的样本 ← 代码 03
§6 学习过滤器:DFN 与 FLYT
§7 超越图文对:交错图文数据(OBELICS)与数据配比(MM1)
§8 一个统一的视角:过滤 = 选择一个分布
§9 延伸与前沿
§10–14 小结、常见误区、练习、延伸阅读、下一讲预告
0.4 记号 Notation
| 记号 | 含义 |
|---|---|
| CLIP 分数:图片 和说明文字 的嵌入的余弦相似度 | |
| 过滤后保留的比例(例如 CLIP 分数前 30%:) | |
| 候选池的大小 | |
| 训练中看到的样本总数(DataComp 里每个规模固定) | |
| 每个保留的样本平均被看几遍 | |
| MetaCLIP 里每个元数据词条最多保留的图文对数 |
0.5 关于数字
本讲的实验数字来自配套代码的实际输出(固定随机种子,同一台机器上重复运行逐字相同)。代码搭了一个迷你 DataComp:
- 候选池:10 万个图文对,沿用第 2 讲的合成世界(形状 + 纹理特征、5 种风格、好 / 含糊 / 错三种说明文字),再加两种真实网络数据里常见的”麻烦”:图里印着字的样本(特征后面多 8 维”文字块”),以及(代码 02 里)长尾的类别分布。
- 教师:一个在”私有数据”上训练的迷你 CLIP,扮演 OpenAI 的 CLIP,用来打 CLIP 分数。
- 学生:固定的训练配方——6000 步、每步 256 对,不管过滤后剩多少数据。
- 评测:7 个零样本任务(第 2 讲的 ImageNet、V2、ObjectNet、Sketch、Rendition,加上狗的品种、超类),报告平均准确率。
噪声:同一个子集用 5 个不同的随机种子训练学生,平均准确率的标准差约 0.006(不过滤:0.466 ± 0.007;CLIP 分数前 30%:0.540 ± 0.005;脚本里用的是种子 0,恰好在偏高的一端)。所以差别小于约 0.015 的两个结果不要当作真实的差别;本讲只解读比这大的差别。
小模型演示的是机制,不是量级。DataComp 的真实数字会在每节给出作为对照。
1. 从 LAION 到 DataComp:为什么要”比数据”
第 3 讲结尾留下了一个问题:LAION-5B 第一次让公开的数据集达到了十亿级,用它训练的 CLIP 在小规模上和 OpenAI 的差不多;但模型越大,差距越大(slides:ViT-L/14 在 ImageNet 上 OpenAI 75.6%,LAION 72.8%;在 ObjectNet 上 69.0% vs 59.9%)。OpenAI 的数据(WIT,4 亿对)从未公开,它的构造方式只在论文里有一段描述。怎样才能造出更好的数据集?
回顾一下机器学习的进步方式:ImageNet 把数据固定下来,所有人在同一份数据上比模型和训练方法——第 3 讲的”共同任务框架”。几十年来,大量研究精力投在了架构、优化器、训练技巧上。可是从第 2 讲开始我们反复看到,数据才是决定鲁棒性、决定能力的那个因素,而数据集的设计却很少被系统地研究。DataComp 论文开篇就说:多模态数据集是 Stable Diffusion、GPT-4 这些突破的关键部分,但它得到的研究关注远少于模型架构和训练算法。
原因不难理解:没有一个”比数据”的基准。如果甲用自己的数据训练 ViT-L 训练 30 个 epoch,乙用另一份数据训练 ViT-B 训练 10 个 epoch,两个结果没法比较。DataComp 把基准翻了过来:训练代码、模型、算力都固定,唯一可以改变的是训练数据。
为什么要固定算力(看到的样本总数),而不只是固定模型?因为”数据越多越好”和”训练越久越好”是纠缠在一起的。如果过滤后剩下的数据少,就训练得少,那么过滤看起来就会吃亏;如果多的数据也意味着多的训练,不过滤就总是赢。固定”看到的样本总数” ,问题就变得干净:同样的训练预算,用哪些样本最好? 保留得少,每个样本就被多看几遍( 遍);保留得多,每个样本质量就低一些。这正是本讲反复出现的权衡。
2. DataComp 的设计
slides 列出了 DataComp 提供的东西:
- 候选池(CommonPool):从 Common Crawl 收集的 128 亿个图文对——网页上的图片和它的 alt-text(和第 3 讲的 LAION 来源相同,但没有做 CLIP 分数过滤,把过滤留给参赛者)。
- 四个规模:候选池 1280 万(small)、1.28 亿(medium)、12.8 亿(large)、128 亿(xlarge);每个规模的模型大小和训练中看到的样本数是固定的,算力跨越四个数量级。小规模让学术实验室也能参与。
- 安全措施:过滤不适宜的内容、模糊人脸、去掉和评测集重复的图片;提供图片的哈希值,下载时可以校验图片没有被替换(防止”数据投毒”,第 18 讲)。
- 标准化的 CLIP 训练代码(OpenCLIP)。
- 38 个下游评测任务:ImageNet 和它的分布偏移版本(第 2 讲)、各种细粒度分类、检索等;报告平均分。
- 两个赛道:过滤赛道(只能从候选池里选子集)和自带数据赛道(BYOD,可以加入外部数据)。
参赛者提交的东西是一份”样本编号的列表”——这就是一个数据集。
代码里的对应物(
datacomp_mini.py):make_pool生成候选池;make_teacher训练教师 CLIP;train_student是固定的训练配方(不管子集多大,都训练 6000 步 × 256 对);eval_tasks+evaluate是 7 个任务的评测。参赛者要写的只是一个”掩码”——保留哪些样本。
3. 基线与发现
3.1 基线过滤方法
slides 列出了 DataComp 论文的基线:
| 基线 | 做法 | 用到了什么信息 |
|---|---|---|
| 不过滤 | 全部保留 | — |
| 基本过滤 | 英文、说明文字的最短长度、图片的最小尺寸等简单规则 | 元数据 |
| 按文本 | 说明文字里出现 ImageNet 的类别名(WordNet 同义词) | 说明文字 + 目标任务的类别名 |
| 按图片 | 用图片嵌入聚类,保留”和 ImageNet 训练图片最近”的那些簇 | 图片 + 目标任务的图片 |
| LAION-2B 式 | 英文 + CLIP 分数阈值(LAION 用 0.28) | 一个预训练的 CLIP |
| CLIP 分数 | 调过阈值的 CLIP 分数过滤(例如保留前 30%) | 一个预训练的 CLIP |
| 组合 | 例如 CLIP 分数 ∩ 按图片 | 以上的组合 |
3.2 教师 CLIP 打出的分数
代码 01 演示 1:迷你候选池里有四种样本,教师给它们的平均 CLIP 分数:
| 说明文字 | 占比 | 平均 CLIP 分数 | 进入前 30% 的比例 |
|---|---|---|---|
| 好 | 0.401 | 0.405 | 0.528 |
| 含糊(“photo of my trip”) | 0.348 | 0.256 | 0.075 |
| 错(说的是别的东西) | 0.150 | 0.110 | 0.018 |
| 图里有字(字和图无关) | 0.102 | 0.430 | 0.584 |
前三行就是 LAION 和 DataComp 里 CLIP 分数过滤的基础:教师能把好的说明文字和含糊的、错的分开。第四行是一个预告:说明文字恰好是图里印的字时,教师(它在私有数据里学会了”读字”)给的分数比好的说明文字还高,在前 30% 里的比例约是在整个池子里的两倍。§5 会回到这里。
3.3 各种基线的对比
代码 01 演示 2(训练配方固定,只换数据;“平均”是 7 个任务的平均零样本准确率):
| 过滤方法 | 保留 | 平均 | ImageNet | Sketch | 子集里好的说明文字 | 子集里图里有字 |
|---|---|---|---|---|---|---|
| 不过滤 | 100,000 | 0.477 | 0.504 | 0.343 | 0.40 | 0.10 |
| 基本过滤(说明文字 ≥ 3 个词) | 69,186 | 0.501 | 0.536 | 0.378 | 0.50 | 0.12 |
| 按文本(说明文字里有类别名) | 65,202 | 0.503 | 0.559 | 0.395 | 0.61 | 0.16 |
| 按图片(ImageNet 式的簇) | 70,174 | 0.548 | 0.588 | 0.419 | 0.43 | 0.05 |
| CLIP 分数前 30% | 30,000 | 0.548 | 0.596 | 0.426 | 0.71 | 0.20 |
| CLIP 分数前 30% ∩ 按图片 | 21,969 | 0.571 | 0.623 | 0.446 | 0.81 | 0.07 |
| CLIP 分数前 50% ∩ 按图片 | 35,814 | 0.571 | 0.627 | 0.447 | 0.69 | 0.07 |
几点观察:
- 最简单的规则就有用:说明文字至少 3 个词,就去掉了大量只有一两个填充词的含糊样本(0.477 → 0.501)。
- 按文本过滤去掉了所有含糊的说明文字,却留下了错的(有类别名,只是名字不对)和图里有字的;它和基本过滤的差别在噪声以内。
- 按图片过滤完全不看文字,效果却和 CLIP 分数一样好(0.548)。它去掉的是看不清的图和图里有字的截图——这些图片的嵌入不落在”ImageNet 式图片”的簇里。
- 两类信号互补:CLIP 分数看”图文是否匹配”,按图片看”这张图像不像我们关心的那类图片”。两者取交集最好(0.571),而且把 CLIP 的阈值放宽到前 50% 再取交集,结果一样好、保留的数据多了约 60%。这和 DataComp 的发现一致:DataComp-1B 用的正是”CLIP 分数 + 图片聚类”的组合(§3.6)。
要警惕的一点:按文本、按图片过滤都用到了目标任务(ImageNet)的信息——它们让训练数据更像评测数据。DataComp 允许这样做(38 个任务里只有一部分和 ImageNet 相似,这在一定程度上防止了只针对 ImageNet 优化),但这提醒我们:数据过滤的”好”,总是相对于某个评测而言的。第 1 讲的”基准在测什么”在这里换了一个面目出现。
3.4 质量与数量
代码 01 演示 3:按 CLIP 分数保留前 ,训练步数固定。
| 保留比例 | 样本数 | 平均 | ImageNet | 每个样本被看几遍 |
|---|---|---|---|---|
| 10% | 10,000 | 0.523 | 0.574 | 153.6 |
| 20% | 20,000 | 0.545 | 0.590 | 76.8 |
| 30% | 30,000 | 0.548 | 0.596 | 51.2 |
| 50% | 50,000 | 0.529 | 0.572 | 30.7 |
| 70% | 70,000 | 0.516 | 0.550 | 21.9 |
| 100% | 100,000 | 0.477 | 0.504 | 15.4 |
一条倒 U 形曲线:最优在 20%–30% 附近(两者的差别在噪声以内),两端都更差。保留太多,一半以上的样本说明文字含糊或错误;保留太少,同样的训练预算下每个样本被看了上百遍,模型开始记住少数样本,而不是学到一般的规律。
DataComp 论文的发现(slides):
- 更多的数据即使更嘈杂,也有帮助——到一定程度为止。DataComp-1B 用的 CLIP 阈值比 LAION 更宽松,也不做语言过滤(LAION-2B 只保留英文)。
- CLIP 知道自己什么时候看不懂一段说明文字:不是英文、但图文确实匹配的样本,CLIP 分数也不低。所以语言过滤是多余的,甚至有害——它丢掉了大量好的非英文数据。
- 最优的过滤强度取决于算力:Goyal et al.(2024)的”过滤的扩展律”把这一点说得更清楚——算力越大,小而精的数据会被重复太多遍,最优的过滤就越宽松。第 7 讲会详细讨论,练习 3 在迷你世界里试一试。
3.5 小规模实验能指导大规模吗?
如果每个想法都要在最大的规模上验证,几乎没人做得起——DataComp 四个规模的算力跨越四个数量级,最大规模训练一次的算力约是最小规模的上万倍。slides 报告:DataComp 的小(1280 万)、中(1.28 亿)、大(12.8 亿)三个规模之间,各种过滤方法的结果相关性很好,跨越了 100 倍以上的算力。所以可以在小规模上筛选想法,只把最好的几个放大。
代码 02 演示 1:6 种过滤方法,小规模(池子 2.5 万对、1500 步)vs 中规模(10 万对、6000 步),算力相差 16 倍。
| 过滤方法 | 小规模(名次) | 中规模(名次) |
|---|---|---|
| 不过滤 | 0.412(6) | 0.477(6) |
| 基本过滤 | 0.418(5) | 0.501(5) |
| 按文本 | 0.421(4) | 0.503(4) |
| 按图片 | 0.448(3) | 0.548(2) |
| CLIP 前 30% | 0.485(2) | 0.548(3) |
| CLIP 前 30% ∩ 按图片 | 0.525(1) | 0.571(1) |
排名的 Spearman 相关是 0.94。唯一交换名次的两种方法,在中规模上的差别在噪声以内;基本过滤和按文本在两个规模上的差别也都在噪声以内。小规模实验能可靠地排除坏想法、找出明显更好的想法;对”几个都不错的想法哪个最好”,要更谨慎——而且 §3.4 说过,最优的过滤强度本身会随规模变化。第 6 讲的 DCLM 把同样的策略用在了语言模型上。
3.6 DataComp-1B
在 128 亿的候选池上,作者用”更宽松的 CLIP 分数阈值 + 图片聚类”(不做语言过滤)选出了 DataComp-1B(约 14 亿对,比 LAION-2B 还小)。slides 的结果(ViT-L/14,零样本准确率):
| 训练数据 | ImageNet | ObjectNet |
|---|---|---|
| OpenAI(WIT,未公开) | 75.6 | 69.0 |
| LAION-2B | 72.8 | 59.9 |
| DataComp-1B | 79.2(+3.6) | 74.2(+5.2) |
这是第一个比 OpenAI 的数据更好的公开数据集(论文摘要:同样的训练流程和算力下,ImageNet 高 3.7 个百分点)。slides 还对比了算力:要达到同样的准确率,用 DataComp-1B 比用 LAION-2B 需要的训练算力少得多(约九分之一)——更好的数据相当于免费的算力。
4. MetaCLIP:揭开 CLIP 数据的秘密
4.1 动机
DataComp 的最好方法依赖一个已经训练好的 CLIP来打分。这有一种循环的味道:要造好的 CLIP 数据,先得有一个好的 CLIP。而且 OpenAI 的 CLIP 本身是用什么数据训练的?CLIP 论文里只有一段描述(§2.2):他们构造了 50 万个查询词,搜集”说明文字里包含某个查询词”的图文对,并且为了大致平衡,每个查询词最多保留 2 万对。
Xu et al.(2023,Demystifying CLIP Data)想把这段描述变成一个可以复现、完全透明的算法——不用任何预训练模型。
4.2 算法
- 元数据(metadata):约 50 万个词条,来自 WordNet 的同义词集、维基百科里的常见单词和双词短语、维基百科的文章标题。它们代表”世界上值得认识的概念”。
- 子串匹配:说明文字里出现了哪些词条?一个词条都没出现的图文对直接丢掉——这一步本身就是一个很强的过滤(含糊的说明文字往往不包含任何具体的概念)。
- 平衡:统计每个词条匹配了多少对。匹配数少于 ( = 2 万)的词条,全部保留;匹配数多于 的热门词条,按 的概率抽样。一个图文对只要通过它匹配的任何一个词条被选中就保留。
直觉:网络数据是长尾的。“photo""image""t-shirt”这类词出现在上千万个说明文字里,而大多数具体的概念只出现几百次。不平衡的话,训练预算的大部分花在了少数热门概念上。平衡把”头部”截平、“尾部”全部保留,让训练分布更接近”每个概念都重要”——而评测(ImageNet 的 1000 个类别、38 个任务)恰恰是这样的。这和第 2 讲 §1 的”按风格均衡抽”是同一个思想:训练数据的分布应该匹配你关心的分布,而不是网络上碰巧出现的分布。
结果(论文摘要):从 Common Crawl 构造的 4 亿对(和 WIT 同样大小),ViT-B 在 ImageNet 上零样本 70.8%,超过用 OpenAI 数据训练的 68.3%;扩大到 10 亿对、训练预算不变,72.4%;ViT-H 达到 80.5%。
4.3 在迷你世界里
代码 02 演示 2:一个长尾的候选池——第 热门的类别占比 ,最热门的 8 个类别占 73%,最冷门的 20 个类别加起来只占 10.8%。元数据是 48 个词条(40 个类别名 + 8 个超类名),。
| 训练集 | 样本数 | 平均 | 头部 8 类 | 尾部 20 类 |
|---|---|---|---|---|
| 匹配上的全部(不平衡) | 78,927 | 0.420 | 0.648 | 0.334 |
| MetaCLIP 平衡( = 600) | 27,167 | 0.454 | 0.504 | 0.471 |
| 匹配上的随机子集(同样大小) | 27,167 | 0.405 | 0.677 | 0.287 |
| CLIP 分数最高的(同样大小) | 27,167 | 0.493 | 0.619 | 0.497 |
| CLIP 前 50% 之后再平衡( = 300) | 12,213 | 0.515 | 0.577 | 0.557 |
(“头部 / 尾部”是 ImageNet 任务里这些类别的图片上的零样本准确率;评测集本身是类别均衡的。)
- 平衡把能力从头部挪到了尾部:和同样大小的随机子集比,尾部类别 0.287 → 0.471,头部 0.677 → 0.504,平均 0.405 → 0.454。即使和匹配上的全部数据(大约是平衡后的 2.9 倍)比,平衡后的尾部也更好(0.471 vs 0.334):热门类别多出来的样本挤占了训练步数,对尾部类别没有帮助。
- 平衡解决的是”分布”,不是”质量”:同样大小的”CLIP 分数最高”子集平均更好(0.493),连尾部都更好——平衡后的数据里,错的说明文字一条都没少。先按 CLIP 分数过滤、再平衡,两者结合最好(0.515,尾部 0.557)。
- 真实的 MetaCLIP 能在不用任何 CLIP 分数的情况下超过 OpenAI 的数据,说明在真实网络数据上,“匹配元数据”这一步本身已经过滤掉了大量低质量的样本;而我们的迷你世界里,错的说明文字也包含类别名,子串匹配挡不住它们。
- 和”按图片过滤”一样,元数据列表也编码了”我们关心哪些概念”——它决定了模型会擅长什么、不擅长什么。
5. T-MARS:图里有字的样本
5.1 问题
网络上大量的图片里印着字:海报、截图、表情包、商品包装、路牌、幻灯片。Maini et al.(2023)发现,LAION 里将近 40% 的图片包含和说明文字高度重叠的文字。对这类样本,说明文字常常就是图里的字——CLIP 很会”读字”,所以给它们打很高的分。
这有两个后果:
- CLIP 分数过滤去不掉它们,反而提高了它们的比例。
- 用它们训练出的模型学会的是”读图里的字”,而不是”认图里的东西”。Goh et al.(2021)在真实的 CLIP 上发现了著名的贴字攻击(typographic attack):在一个苹果上贴一张写着 “iPod” 的纸条,CLIP 就把它认成了 iPod。
5.2 方法
T-MARS(Text Masking and Re-Scoring):
- 用文字检测器找到图里的文字区域;
- 把这些区域遮掉(用周围的颜色填充);
- 用 CLIP 重新给”遮掉字之后的图”和说明文字打分;
- 按新的分数过滤。
关键在于:它不是删掉所有带字的图,而是只删掉”字主导了图文匹配”的样本。一张贴着 “Coca-Cola” 标签的可乐瓶的照片,遮掉字之后图里仍然是一个可乐瓶,分数仍然高,会被保留。
结果(论文摘要):在 DataComp 的中规模上,比当时最好的方法在 ImageNet 上高 6.5%、在 VTAB 上高 4.7%;而且在 2M 到 64M 的数据规模之间,数据和算力指数增长时,它带来的提升线性增长。
5.3 在迷你世界里
迷你世界里,“图里印着字”表现为特征最后 8 维的”文字块”里有某个类别名的”字形”信号;“遮字”就是把这 8 维清零。代码 03 的候选池里有两种带字的图:无关的字(10%,字说的是一回事、图是另一回事),和图文一致的字(5%,图里的东西本身就和说明文字相符,像贴着标签的商品)。
代码 03 演示 1:
| 样本 | 占比 | CLIP 分数 | 遮字后的分数 | 进入 CLIP 前 30% | 进入遮字后前 30% |
|---|---|---|---|---|---|
| 好 | 0.348 | 0.406 | 0.417 | 0.496 | 0.625 |
| 含糊 | 0.349 | 0.257 | 0.264 | 0.064 | 0.129 |
| 错 | 0.153 | 0.110 | 0.113 | 0.014 | 0.027 |
| 无关的字 | 0.100 | 0.429 | 0.107 | 0.541 | 0.025 |
| 图文一致的字 | 0.050 | 0.595 | 0.416 | 0.965 | 0.620 |
无关文字图的 CLIP 分数比好的说明文字还高,遮掉字之后掉到和”错的说明文字”差不多。而且CLIP 分数越严,问题越严重:前 10% 里无关文字图占 14.7%,前 30% 里占 18.1%,而整个池子里只有 10%——过滤在放大问题。按遮字后的分数,这三个比例是 0.2%、0.8%、2.3%。
代码 03 演示 2:五种过滤训练出的学生。“贴字攻击”:给 ImageNet 任务的图片”贴上”另一个随机类别的名字,看模型还认不认得对、有多少被字带偏。
| 过滤 | 平均 | 子集里无关文字图 | 子集里图文一致的字 | 贴字后认对 | 被字带偏 |
|---|---|---|---|---|---|
| 不过滤 | 0.454 | 0.100 | 0.050 | 0.122 | 0.575 |
| CLIP 前 30% | 0.535 | 0.181 | 0.162 | 0.198 | 0.456 |
| T-MARS:遮字后的分数前 30% | 0.607 | 0.008 | 0.104 | 0.578 | 0.041 |
| 删掉所有带字的图,再取 CLIP 前 30% | 0.601 | 0.000 | 0.000 | 0.591 | 0.035 |
| 用真相只删掉无关文字图,再取 CLIP 前 30% | 0.580 | 0.000 | 0.165 | 0.393 | 0.150 |
- CLIP 前 30% 训练出的学生,贴字之后只有 0.198 还认得对,0.456 被贴上去的字带偏——它学会了”字比图更可靠”。T-MARS 的学生几乎不受影响(0.578 / 0.041),7 个任务的平均也从 0.535 升到 0.607。
- 出乎我意料的一行是最后一行:用真相把无关文字图全部删掉、再取 CLIP 前 30%,平均只有 0.580,仍有 0.150 被字带偏。原因在”图文一致的字”那一列:这些样本在池子里只占 5%,在 CLIP 前 30% 里却占 16.5%——CLIP 分数极度偏爱它们,模型照样学会了”图里的字和说明文字总是一致”。T-MARS 遮字之后打分,不再偏爱任何带字的图。问题不只是”哪些样本是错的”,还有”过滤器偏爱什么”。
- “删掉所有带字的图”在这里和 T-MARS 差不多(0.601 vs 0.607,差别在噪声以内)。这是迷你世界的局限:这里带字的图只占 15%,文字检测器又是完美的(检测出 0.150,真实比例 0.150)。真实网络数据里带字的图约占 40%,有些概念主要以带字的形式出现(路牌、商品、图表),文字检测也不完美——一刀切会丢掉大量有用的数据。T-MARS 正是为了不一刀切而设计的。练习 4 把”图文一致的字”的比例调高,再比较一次。
5.4 一个普遍的教训
基于模型的过滤会把过滤模型自己的捷径放大到下一代模型的训练数据里。 过滤模型的分数衡量的是”它认为”的质量。教师会读字,CLIP 分数就偏爱带字的图,学生就更依赖字。第 3 讲看到的”CLIP 过滤偏爱清晰的典型图、让有效鲁棒性下降”是同一个现象的另一面。用一个模型选数据训练下一个模型,这个循环在语言模型里也无处不在(第 6–7 讲的质量分类器、第 11 讲的合成数据)。
6. 学习过滤器:DFN 与 FLYT
CLIP 分数过滤用的是一个”现成”的模型。能不能专门为过滤而训练一个模型?
6.1 数据过滤网络(DFN)
Fang et al.(2023,Data Filtering Networks;作者包括 Schmidt 和下一讲的讲者 Shankar)研究了怎样训练一个用于过滤的 CLIP(数据过滤网络)。最重要的发现:一个网络作为过滤器的好坏,和它在下游任务上的表现是两回事。在 ImageNet 上更准的 CLIP 不一定是更好的过滤器;决定过滤器好坏的,主要是训练过滤器的数据质量——在少量高质量的图文对上训练(或微调)的 CLIP,哪怕本身的准确率不高,也能选出好得多的数据。
他们公开了 DFN-2B(20 亿对);用 DFN-5B 训练的 ViT-H 在 ImageNet 上零样本准确率 84.4%,超过了用 LAION-2B、DataComp-1B 和 OpenAI 的数据训练的模型。他们也说明,只用公开数据也能训练出强的过滤网络。
和代码的联系:迷你世界里的教师在 10% 带字的私有数据上训练,所以”会读字”;它作为分类器并不差,但作为过滤器有偏差(§5)。DFN 的发现说的是同一件事——过滤器要按”它选出的数据训练出的模型好不好”来评价。
6.2 FLYT:照着测试的样子过滤
FLYT: Filter Like You Test(2025)更进一步:直接学习一个打分模型,训练信号来自下游任务的训练集(不是测试集)——用打分模型给的权重训练一个 CLIP,看它在下游任务的训练数据上表现如何,再把梯度传回打分模型。几个组成部分:
- FLYT:用下游任务的梯度信号学习”每个样本该给多大权重”;
- M-FLYT:把多种现成的分数(CLIP 分数、图片聚类……)当作输入特征,学习怎样组合它们;
- 软上限采样(Soft Cap Sampling):按分数抽样,并且对被抽中太多次的样本施加”重复惩罚”——这正是 §3.4 的”质量 vs 重复”权衡。
在 DataComp 中规模上,它达到 ImageNet 零样本 40.1%(比之前所有方法高 2 个百分点,比只用公开资源的方法高 5.5 个百分点),38 个任务平均 37.7%。
学习过滤器带来一个新问题:它离”针对评测优化”更近了一步。用的是下游任务的训练集而不是测试集,所以不算作弊;但它确实让训练数据向这些任务靠拢。这又回到了 §3.3 的提醒。
7. 超越图文对:交错图文数据与数据配比
7.1 为什么需要交错的图文文档
图文对(一张图 + 一句 alt-text)适合训练 CLIP 这样的双塔模型。但多模态大模型(把图片输入一个语言模型,例如 Flamingo、IDEFICS、GPT-4V)需要更多:它们要能处理多张图和长文本交替出现的输入,要能在上下文里看几个例子就学会一个新任务(few-shot)。训练它们需要交错的图文文档(interleaved):一个网页,文字和图片按原来的顺序排列。
7.2 OBELICS
Laurençon et al.(2023)从 Common Crawl 构建了 OBELICS:1.41 亿个网页、3.53 亿张图片、1150 亿个文本 token。构建过程是第 4 讲那种管线的一个实例:解析 HTML、简化 DOM 树、保留正文和图片的相对位置;在网页、段落、图片几个层次上过滤(质量、不适宜内容);去重。用它训练的 IDEFICS(90 亿和 800 亿参数)在多模态基准上和同期的闭源模型可比。
7.3 MM1:数据配比的经验
McKinzie et al.(2024,Apple 的 MM1)系统地做了消融,回答”多模态大模型预训练该用什么数据、什么比例”。主要经验:
- 三种数据的配比:图文对、交错图文文档、纯文本。它们最终的选择大约是 45 : 45 : 10。
- 不同的数据管不同的能力:图文对主要帮助零样本(看图说话)的能力;交错文档对 few-shot 和纯文本的能力很重要;纯文本数据帮助保住语言能力。
- 模型上:图片的分辨率、图片编码器、图片 token 的数量影响最大;连接图片编码器和语言模型的模块怎么设计,影响相对很小。
- 模型最大到 300 亿参数(稠密)以及混合专家(MoE)版本,在 few-shot 上达到了当时的最好结果。
这里出现了一个后面会反复出现的主题:数据配比(data mixing)。不同来源的数据管不同的能力,怎样搭配是一个独立的优化问题(第 10 讲)。
8. 一个统一的视角:过滤 = 选择一个分布(补充)
把这一讲的方法放在一起,每一种都在回答”训练数据应该是什么分布”,只是用了不同的信号:
| 方法 | 信号 | 要不要一个预训练模型 | 用没用目标任务的信息 | 代码 |
|---|---|---|---|---|
| 基本过滤 | 元数据规则 | 不要 | 没有 | 01 |
| CLIP 分数 | 图文是否匹配 | 要(教师 CLIP) | 间接(教师的偏好) | 01、03 |
| 按图片 / 按文本 | 像不像目标任务 | 要(图片嵌入) | 用了 | 01 |
| MetaCLIP | 概念的覆盖和平衡 | 不要 | 间接(元数据列表) | 02 |
| T-MARS | 去掉”字主导匹配”的样本 | 要 | 没有 | 03 |
| DFN | 专门训练的过滤器 | 要(在高质量数据上训练) | 间接 | — |
| FLYT | 下游任务的梯度信号 | 要(学出来的打分模型) | 用了(训练集) | — |
三个反复出现的问题:
- 参照分布是什么? “好的数据”总是相对于一个目标而言:ImageNet 式的图片、元数据里的概念、下游任务的训练集。这些选择决定了模型会擅长什么。
- 过滤器自己有什么偏差? 基于模型的过滤会放大过滤模型的捷径(§5.4);平衡、遮字、专门训练过滤器都是在对抗这种偏差。
- 质量和数量怎样权衡? 固定算力下,过滤越狠,每个样本被重复得越多(§3.4);最优的强度随算力变化。
9. 延伸与前沿 · Beyond the original lecture
本节是我补充的。
- 重写说明文字:与其过滤掉含糊的 alt-text,不如用一个多模态模型给图片重新写说明文字(recaptioning)。DALL-E 3、许多后来的 CLIP 和多模态大模型都用了合成的说明文字,常常和原始的 alt-text 混合使用。这模糊了”过滤”和”生成”的界限(第 11 讲)。
- 多语言:DataComp 发现语言过滤有害;后来的工作把 MetaCLIP 式的元数据和平衡扩展到了多语言的全球网络数据。只用英文数据训练的模型,对非英语世界的概念和图片表现更差——这既是能力问题,也是公平问题。
- 过滤的扩展律:Goyal et al.(2024)把”质量 vs 重复”写成了可以预测的扩展律(第 7 讲)。
- 数据和模型的循环:今天的过滤器(CLIP、DFN、质量分类器)是用上一代数据训练的,它们选出的数据又训练下一代过滤器。这个循环放大了什么、丢掉了什么,是一个开放的问题。
10. 小结 · Summary
- DataComp 把基准翻了过来:训练代码和算力固定,只比数据;128 亿对的候选池、四个规模、38 个任务、过滤和自带数据两个赛道。
- CLIP 分数和图片内容是互补的信号,组合最好;更宽松的阈值、不做语言过滤;DataComp-1B 是第一个超过 OpenAI 数据的公开数据集(ViT-L/14 ImageNet 79.2%)。
- 质量 vs 数量:固定算力下,过滤太松留下噪声,太严导致重复;最优在中间,并随算力变化。
- 小规模实验能指导大规模:各规模的排名高度相关,但对差距很小的方法要谨慎。
- MetaCLIP:元数据 + 子串匹配 + 每个词条最多 对的平衡,不用任何 CLIP 就复现并超过了 OpenAI 的数据;平衡把能力从头部挪到尾部,但不解决质量问题。
- T-MARS:CLIP 分数偏爱图里有字的样本,过滤会放大这个偏差;遮掉字再打分,只去掉”字主导匹配”的样本。
- 学习过滤器(DFN、FLYT):过滤器的好坏和模型的好坏是两回事;用下游信号学过滤器更强,但也离”针对评测优化”更近。
- 超越图文对:交错图文文档(OBELICS)和数据配比(MM1:45 : 45 : 10)决定了多模态大模型的不同能力。
11. 常见误区 · Common pitfalls
- “CLIP 分数越高,数据越好,所以阈值越严越好。” 固定算力下太严会导致重复(代码 01 演示 3);而且 CLIP 分数有自己的偏差(图里有字)。
- “过滤只是去掉坏样本。” 过滤同时改变了分布:哪些概念、哪些风格、哪些类型的图片被保留(代码 02、03;第 3 讲)。
- “语言过滤总是有益的。” DataComp 发现它丢掉了大量好的非英文数据。
- “平衡数据能解决质量问题。” 平衡解决分布,不解决噪声(代码 02 演示 2)。
- “删掉所有带字的图最安全。” 真实数据里带字的图约占 40%,很多概念主要以带字的形式出现;T-MARS 只删字主导匹配的那些。
- “用 ImageNet 上更准的模型做过滤器,选出的数据就更好。” DFN:过滤器的好坏和下游表现是两回事。
- “小规模实验的排名在大规模上一定成立。” 明显的差别能保持;差距很小的方法可能交换名次,最优的过滤强度也会变。
- “两个结果差 0.005 就说明一个方法更好。” 先估计噪声(这里随机种子的标准差约 0.006)。
12. 练习 · Exercises
练习 1(每个样本被看几遍) DataComp 的每个规模里,训练中看到的样本数等于候选池的大小(例如中规模:池子 1.28 亿,训练中看到 1.28 亿个样本)。(a) 如果保留 CLIP 分数前 30%,每个样本平均被看几遍?前 10% 呢?(b) 迷你 DataComp 里(池子 10 万,6000 步 × 256),保留前 30% 时每个样本被看几遍?为什么迷你世界里的”最优比例”不能直接搬到 DataComp 上?
参考答案
(a) :前 30% 约 3.3 遍,前 10% 10 遍。(还要考虑下载时有一部分图片已经失效,实际可用的池子更小。)
(b) 遍。迷你世界的训练预算相对池子大得多(不过滤也要看 15.4 遍),重复的代价、噪声的代价都和 DataComp 不同;而且合成数据里”好 / 含糊 / 错”的比例是我设定的。迷你世界演示的是”存在一个最优比例、它取决于预算”这个机制,具体的 30% 不能外推。
练习 2(MetaCLIP 的平衡) 代码 02 演示 2 里,,最热门的词条匹配了 15,776 对。(a) 一个只匹配了这个词条的图文对,被保留的概率是多少?(b) 一个同时匹配了这个词条和一个只有 400 对的冷门词条的图文对呢?(c) 不考虑一个图文对匹配多个词条的情况,平衡后的数据集大小约等于什么?为什么平衡后剩下 27,167 对,比 48 × 600 = 28,800 少?
参考答案
(a) 。
(b) 保留概率取它匹配的所有词条里最大的那个:冷门词条 ,所以一定保留。(这也意味着热门词条实际保留的样本会比 多一些——一部分是”搭冷门词条的便车”进来的。)
(c) 约 。有些词条(冷门的类别名)匹配数少于 600,只能全部保留、贡献不到 600;另一方面,一个图文对可能同时匹配类别名和超类名,会被重复计数。两者相抵,结果是 27,167。
练习 3(最优的过滤强度随算力变化吗?) 在代码 01 的设置下,把训练步数从 6000 改成 1500(1/4 的算力)和 24000(4 倍),重新做演示 3。预测:最优的保留比例会怎样变?然后看实际结果(在代码副本里运行,课程目录的文件没有改动)。
参考答案(实际运行结果)
| 保留比例 | 1500 步 | 6000 步(代码 01) | 24000 步 |
|---|---|---|---|
| 10% | 0.480 | 0.523 | 0.540 |
| 20% | 0.504 | 0.545 | 0.551 |
| 30% | 0.505 | 0.548 | 0.558 |
| 50% | 0.482 | 0.529 | 0.552 |
| 70% | 0.450 | 0.516 | 0.535 |
| 100% | 0.405 | 0.477 | 0.524 |
| 100% 比最好的低多少 | 0.100 | 0.071 | 0.034 |
| 10% 比最好的低多少 | 0.025 | 0.025 | 0.018 |
- 宽松一端的损失随算力迅速缩小:不过滤比最好的低 0.100 → 0.071 → 0.034;在 4 倍算力下,保留 50% 已经和 30% 分不开(差 0.006,在噪声以内)。这和 Goyal et al. 的方向一致:算力越大,更宽松的过滤越划算。
- 但峰值没有明显移动(三个算力下都是 30%),严格一端的损失也没有变大(0.025、0.025、0.018):保留 10% 时每个样本在 24000 步里被看了 614 遍,准确率却比 6000 步时还高(0.540 vs 0.523)。迷你学生是一个很小的线性模型,重复几百遍也没有明显的过拟合;真实的大模型在重复的数据上会出现 Goyal et al. 描述的”效用衰减”,迷你世界没能体现这一半。
- 教训:最优的过滤强度不是数据集本身的属性,而是”数据 × 算力 × 模型”的属性。在一个算力下调好的阈值,换一个算力要重新检查。
练习 4(什么时候”删掉所有带字的图”会吃亏?) 代码 03 里,“删掉所有带字的图”和 T-MARS 差不多。把候选池里”图文一致的字”的比例从 5% 提高到 20%(make_pool(..., p_textgood=0.20)),预测两者的差别会怎样变化,然后看实际结果。
参考答案(实际运行结果)
我的预测是:图文一致的字多了,“一刀切”会丢掉更多好样本,T-MARS 应该明显更好。实际结果不是这样(在代码副本里运行;池子里图文一致的字 20%,文字检测器判为带字的 30%):
| 过滤 | 平均 | 子集里无关文字图 | 子集里图文一致的字 | 贴字后认对 | 被字带偏 |
|---|---|---|---|---|---|
| CLIP 前 30% | 0.448 | 0.128 | 0.613 | 0.116 | 0.618 |
| T-MARS:遮字后的分数前 30% | 0.575 | 0.008 | 0.415 | 0.416 | 0.113 |
| 删掉所有带字的图,再取 CLIP 前 30% | 0.585 | 0.000 | 0.000 | 0.575 | 0.025 |
| 用真相只删掉无关文字图,再取 CLIP 前 30% | 0.502 | 0.000 | 0.636 | 0.190 | 0.440 |
- CLIP 分数前 30% 里,图文一致的字占了 61%——偏爱被放大得更厉害,平均跌到 0.448。T-MARS 仍然比它好得多(0.575)。
- “删掉所有带字的图”仍然略好于 T-MARS(0.585 vs 0.575,差别接近噪声),而且贴字攻击下明显更稳(被带偏 0.025 vs 0.113)。原因是 T-MARS 选出的子集里图文一致的字占了 41.5%:这些样本本身没错,但”图里的字总是等于说明文字”让模型依赖字——而评测图片里没有字。
- 为什么这和真实世界的经验不同?迷你世界缺了三样东西:(1) 这里删掉所有带字的图之后,剩下的 7 万张不带字的图仍然足够选出 3 万张好样本——真实数据里带字的约 40%,删掉它们会让好数据明显不够;(2) 这里没有”主要以带字的形式出现”的概念(路牌、商品、图表),删掉带字的图不会让任何概念消失;(3) 这里的文字检测是完美的。
- 教训:一个过滤方法的价值取决于它处在什么样的数据和预算里;迷你世界能演示机制(偏爱被放大、字会成为捷径),但”一刀切”和 T-MARS 谁更好,取决于真实数据里这三样东西的量级。
练习 5(设计一个”比数据”的基准) 你要为医学影像(例如胸部 X 光 + 放射科报告)设计一个 DataComp 式的基准。列出你要固定的东西、候选池的来源、评测任务,以及至少两个你担心的问题。
参考答案(要点)
- 固定:模型架构、训练代码、看到的样本总数(几个规模);评测流程。
- 候选池:多家医院的影像和报告(隐私是首要问题:去标识化、数据使用协议,第 19 讲),或公开的数据集合并。
- 评测:多种疾病的零样本 / 线性探针分类、报告检索;按医院、设备、人群分开报告——第 2 讲的分布偏移在医学里非常严重(不同医院的设备和人群不同)。
- 担心的问题:(1) 评测集和候选池来自同一家医院,造成泄漏或高估(第 3 讲的按组划分);(2) 过滤器(例如一个预训练的医学 CLIP)的偏差被放大,例如偏爱某家医院的图像风格、偏爱带有文字标注(“L”、箭头、测量值)的图片——正是 §5 的问题;(3) 平衡:罕见病的样本少,类似 MetaCLIP 的平衡可能有帮助,但罕见病的标注也更不可靠;(4) 针对评测优化:评测任务太少时,过滤方法会向它们过拟合。
13. 延伸阅读 · Further reading
原课阅读
- Gadre et al., DataComp: In search of the next generation of multimodal datasets(NeurIPS 2023):arXiv:2304.14108。
- Xu et al., Demystifying CLIP Data(MetaCLIP,ICLR 2024):arXiv:2309.16671。
- Maini et al., T-MARS: Improving Visual Representations by Circumventing Text Feature Learning(ICLR 2024):arXiv:2307.03132。
- FLYT: Filter Like You Test(2025):arXiv:2503.08805。
- Laurençon et al., OBELICS: An Open Web-Scale Filtered Dataset of Interleaved Image-Text Documents(NeurIPS 2023):arXiv:2306.16527。
- McKinzie et al., MM1: Methods, Analysis & Insights from Multimodal LLM Pre-training(2024):arXiv:2403.09611。
本讲补充
- Fang et al., Data Filtering Networks(2023):arXiv:2309.17425。
- Goh et al., Multimodal Neurons in Artificial Neural Networks(Distill 2021)——贴字攻击。
- Radford et al., Learning Transferable Visual Models From Natural Language Supervision(CLIP,2021)§2.2——WIT 的构造。
- Goyal et al., Scaling Laws for Data Filtering — Data Curation cannot be Compute Agnostic(CVPR 2024)——第 7 讲。
和本目录其他课程的联系
- CS336 第 17 讲(多模态):多模态模型的架构和训练。
14. 下一讲预告 · Next lecture
DataComp 的思路——固定训练配方,只比数据;在小规模上筛选想法,再放大——被原班人马搬到了语言模型上。
第 6 讲:预训练数据 I。 客座讲者 Vaishaal Shankar(DataComp、DFN 的作者之一)讲语言模型的预训练数据:从 Common Crawl 的 HTML 里抽取文本、语言识别、启发式过滤、去重(第 4 讲的工具派上用场)、基于模型的质量过滤(一个 fastText 分类器,正例该选什么?),以及 DCLM 基准的设计和发现。代码会搭一个带隐藏”质量”变量的合成网页世界,用一个小语言模型做 DCLM 式的固定预算比较。