简介:清华大学崔鹏等学者发布的《分布外泛化(Out-of-Distribution Generalization): A Survey》综述论文,面向深度学习研究者与算法工程师,系统梳理了模型在非独立同分布场景下泛化能力不足这一关键挑战,并指出其对医疗、自动驾驶等高利害应用的重要意义。论文从OOD问题的形式化定义出发,将现有方法按学习流程分为无监督表示学习、监督模型学习和优化策略三大类,逐一介绍典型思路,同时阐述因果推理、不变性学习、稳定学习等方法之间的理论联系,以及常用数据集与评估指标。该综述还展望了增强模型因果解释能力、探索更强表示学习技术与新优化策略等未来方向,能够帮助读者快速建立完整的OOD泛化知识框架,为设计更鲁棒的模型提供理论参考。资源为1份PDF原文,约5.34MB,版本完整、图表齐全,便于系统阅读与批注;目前已有2739人学习下载,适合作为该领域入门与进阶的常备资料。
1. 分布外泛化不是伪命题:一篇把“训练-测试分布漂移”讲透的综述
如果你的模型在实验室里精度漂亮,一上真实场景就崩,问题大概率不在调参,而在训练分布和测试分布根本不是同一套。经典的 i.i.d. 假设在医疗影像、自动驾驶这类高风险场景里几乎必然失效,而“分布外泛化”研究的就是这个最扎心的问题:测试分布未知且不同于训练分布时,模型怎么才能不翻车。清华大学崔鹏团队这篇综述,是少有的把 OOD 泛化从定义、方法分类、理论连接到评估基准完整串起来的系统性文献。对刚入门的研究生和正在为业务模型稳定性头疼的工程师来说,这篇论文算得上一份高性价比的导航图。
2. 问题定义与方法全貌:从 i.i.d. 失效到三类方法论
2.1 形式化定义:分布漂移到底在漂什么
传统监督学习的理论基础是 i.i.d. 假设,即训练数据与测试数据独立且来自同一分布。公式写出来是 Ptr(X, Y) = Pte(X, Y),优化目标是最小化在测试分布上的期望损失。由于测试分布不可见,实际操作退化为经验风险最小化(ERM),在训练集上求平均损失的最小值。这一套在分布一致时理论上站得住,可一旦 Ptr 不等于 Pte,ERM 学到的那些“训练集里成立、测试集里不成立”的虚假相关性就会反噬模型。
分布漂移有不同的形态,这篇综述把重点放在协变量漂移上:即 Ptr(Y|X) = Pte(Y|X),但 Ptr(X) 不等于 Pte(X),也就是说数据的边缘分布变了,但标签生成机制不变。比如同一病灶在不同品牌设备上成像,病人的分类规则没变,但图像特征分布明显漂移。与之相对的还有标签漂移(P(X|Y) 不变、P(Y) 变化)和概念漂移(P(Y|X) 本身变化),综述做了区分但处理上仍以协变量漂移为主线。
至于域适应(Domain Adaptation)问题,综述特别做了边界说明:域适应假设测试分布有一定先验信息,可以拿到有标签或无标签的测试数据参与建模,这在某种意义上属于 OOD 泛化的特例。而真正的 OOD 泛化面对的是完全未知的测试分布,训练阶段拿不到任何测试信息。这个区分很关键,因为在实践里经常有人把域适应方法硬套到 OOD 场景,结果必须要做数据对齐时根本没有目标域数据可用。
2.2 三条技术路线:划分依据不是流派而是管线位置
把监督学习拆开看,一条完整的学习管线包含三个组件:特征表示 g(X)、从表示(或原始特征)到标签的映射函数 fθ、以及优化目标的定义方式。这篇综述的一个大胆做法是,按方法在管线中所处的位置来划分研究脉络,而不是按作者背景或名词归属。
| 类别 | 代表方向 | 在管线中的位置 | 核心思路 |
|---|---|---|---|
| 无监督表示学习 | 解耦表示学习、因果表示学习 | 特征表示端 | 用无监督/自监督手段让表示本身具备不变性或因果性 |
| 监督模型学习 | 因果学习、稳定学习、领域泛化 | 模型结构与训练策略端 | 设计特殊的模型结构或学习策略来抵抗分布漂移 |
| 优化 | 分布鲁棒优化、不变性优化 | 目标函数端 | 直接定义 OOD 泛化目标,在优化层面给出理论保证 |
这个分类的价值在于,它揭示了不同流派之间的隐藏关系——很多方法表面名词不同,实际在做同一件事,只是下手的位置不同。比如领域泛化里的特征对齐方法和因果表示学习里对因果变量的分离,最终都指向“把表示准备好”;而 IRM 这类不变性优化方法,本质上是在目标函数里加约束来引导表示学习。对于读者来说,这张分类表能帮助你在读具体方法时建立定位感,不会迷失在几十篇论文的名字堆里。
3. 表示学习这半边天:解耦、因果与稳定学习
3.1 解耦表示学习:把变化因子拆开是第一步
解耦表示学习的目标是把数据中的不同变化因子分开表示。一张人脸图像,它的身份、表情、光照方向、拍摄角度是几个相对独立的生成因子,如果编码器能把它们分别编码到不同的维度上,那么当测试环境的光照变化时,身份相关的特征维度不会跟着受影响。这听起来很理想,但实现上依赖对数据生成过程做先验假设,而真实数据里的因子并不总是干净的。
常见的技术实现是变分自编码器(VAE)家族。β-VAE 通过在 ELBO 的重建项和 KL 散度项之间调节权重 β,强制隐变量维度之间更独立。如果你作为一个工程师想快速验证解耦表示对 OOD 的效果,一个务实的做法是拿现有 VAE 实现,把 β 从默认的 1 往上调,观察隐变量维度是否出现可解释的分离。不过这个调参过程有玄学成分,β 过大会让重建质量崩掉,过小则等于普通 VAE,需要结合下游任务的效果来判断。
需要认清的是,解耦表示学习本身并不能保证 OOD 泛化能力。它只是让表示具备“各维度语义独立”的性质,下游分类器如果仍然只依赖其中某一维度且该维度恰好受分布漂移影响,表现依旧会掉。这篇综述的态度也比较克制:解耦是“潜在有益”的表示性质,而不是充分条件。真正把解耦推向因果层面的,是下一节要说的因果表示学习。
3.2 因果表示学习:不止拆开,还要知道谁产生谁
因果表示学习比单纯解耦前进了一步。它不仅要求因子分离,还要求编码出来的隐变量之间存在因果结构,即知道变量之间的生成方向。比如“光照影响像素亮度”是一个因果方向,反过来的“由像素亮度推断光照”则不符合数据生成机制。能够识别这种方向的模型,在面对干预带来的分布漂移时,能够更准确地预测哪些相关性会保持不变、哪些会被打破。
这一节的实用价值体现在:它把因果推断中“干预”和“混淆”的概念引入表示学习,提供了分析 OOD 问题的语言。例如一个训练集中雨水和雨刷器同时出现的场景,模型如果把“雨刷器”学成“下雨”的原因,测试时遇到只有雨刷器没有雨的样本就会给出错误预测。因果表示学习试图通过结构先验来避免这类“虚假相关”被编码进表示。
对于没有因果机器学习背景的读者,建议把因果表示学习理解为一种“元任务”:在训练编码器之外,额外训练一个因果结构发现模块,然后把结构信息作为正则项约束表示空间。实际落地时你不需要从零实现结构搜索,很多工作采用 CausalVAE 这类模型,把因果图嵌入到隐空间的前向传播过程中。这块的核心收获是“因果先验可以用作正则化”,而不是非得建立一个完整的结构方程模型。
3.3 稳定学习与领域泛化:数据端的另外两条实路
相比表示学习,稳定学习和领域泛化更贴近工程师的日常操作。稳定学习的思路是控制样本选择偏差的影响:当训练数据里某个特征组合出现的频率显著偏高时,模型会过度依赖这个组合,而它在测试环境里未必成立。常见做法是对样本做重加权或特征去相关,让每个特征的贡献在训练集中保持均衡,从而削弱对少数特征的过度依赖。
领域泛化的路径则更直接:假设你能拿到多个源域的数据,训练时让模型在所有源域上都表现好,并显式约束跨域一致性。经典操作包括对齐不同域的表示分布(比如 MMD 或对抗训练)、元学习式的模拟训练-测试域差异、以及在特征层面做域无关化。一个我在实际使用中觉得最省力的策略是:先把多个源域的数据合并训练一个 ERM 基线,再在这个基线上做域对齐微调,而不是一开始就上复杂模型。因为 ERM 在多源数据上本身就能学出不少跨域不变特征,复杂方法如果增益不明显,就不值得为它增加维护成本。
如果你动手实现不变性相关的约束,可以参考下面这个 IRM 的简化逻辑,它代表了一类“用梯度惩罚来鼓励不变性”的做法:
import torch def irm_penalty(logits, labels, dummy_penalty=None): """计算 IRM 的不变性惩罚项:各环境下的最优分类器应共享同一特征表示""" # 每个环境下单独计算损失对特征表示的梯度 # 在这里用 loss 对 logits 的梯度近似,实际 IRM 需要对 feature 求导 scale = torch.ones((1, logits.size(-1)), requires_grad=True) loss = torch.nn.functional.cross_entropy(logits * scale, labels) grad = torch.autograd.grad(loss, scale, create_graph=True)[0] return torch.sum(grad ** 2)这段代码的核心逻辑在于:如果特征表示是跨域不变的,那么在各个域上,同样的线性分类器(由 scale 模拟)应该都表现良好,梯度幅度应趋于一致。IRM 惩罚项正是优雅地惩罚了“不同环境下最优分类器不一致”的表示。注意create_graph=True保留二阶导数计算图,这一步在内存占用上比较大,如果你的显存紧张,可以改为在验证集上计算该惩罚,而不是每个训练 batch 都算。
4. 优化视角与因果连接:DRO、不变性优化和三派汇流
4.1 DRO:对最坏情形做优化
如果把 OOD 泛化看作一个对抗游戏,那分布鲁棒优化(DRO)的做法是:在训练分布周围定义一个不确定集,要求模型在这个集合内最坏情况下的损失仍然可控。形式化地说,DRO 在优化 min θ sup Q∈Q E[ℓ(θ; Z)],其中 Q 是围绕训练分布构造的分布集合,σ 是控制集合半径的超参数。当 σ=0 时,DRO 退化为 ERM;σ 越大,模型越倾向于对分布偏移保持保守。
DRO 在工程实践里的一个经典实现是 GroupDRO,它要求你必须提前知道环境或组别标注。具体操作是把训练数据按已知的域(比如不同医院、不同光照条件)分成若干组,优化时给损失大的组提高权重,形成一种“向困难组倾斜”的动态加权机制。这种方法的优势在于收敛快、对组别不平衡敏感;劣势也同样明显——没有组别标注时无法直接用,且 σ 的选择需要调参,调得过大模型会过度保守,在原始分布上的精度会下降。
我在实际使用时倾向于把 DRO 当作一种“增强型 ERM”:如果你的数据天然有清晰的域划分(比如来自不同采集设备、不同季节),先用 GroupDRO 跑一版,再与 ERM 基线对比,通常比从零设计一个因果模型更高效。DRO 家族的问题也很明确,它把分布漂移看成“任意方向的扰动”,而没有利用数据中可能存在的因果结构。当漂移方向集中在某个特征维度时,DRO 的保守策略会产生不必要的精度损失。
4.2 不变性优化:从 IRM 到风险泛函的再设计
不变性优化的核心诉求是让模型在不同环境下学习到相同的最优预测函数,从而保证在未知环境上不会出现“环境特异性”的决策逻辑。代表作 IRM 将这个问题转化为一个带约束的优化问题:寻找一个数据表示,使得在所有环境上基于该表示的最优分类器都相同。这比 DRO 的“最坏情形”思路更结构化,因为它假设这种不变性是存在的,且可以通过多环境数据去逼近。
实现层面,IRM 的分析重点之一是惩罚项的合理设计。原论文用的是梯度范数惩罚,之后有很多改进思路:有的用 HSIC 等独立性度量来约束特征与环境的独立性,有的把不变性约束放宽为条件独立形式,还有的工作直接学习多个环境共享的因果特征子集、而非全体表示。这些变体的共同点在于都把“环境标注”作为必要输入,这在实际业务里往往不可得——我见过不少团队想上 IRM,结果数据连域标签都没有,最后只能用聚类给样本分伪组,效果取决于聚类的质量。
一个值得注意的对比是:IRM 类的优化方法与 3.3 节的稳定学习方法在目标上相近,但前者以目标函数为中心,后者以数据和模型结构为中心。当数据本身没有显式的多环境结构时,稳定学习里做特征去相关的思路更实用;而当数据天然包含环境划分时,IRM 类方法能给出更清晰的理论保证。
4.3 理论连接:三类方法如何互相印证
这篇综述在理论分析上花了不少篇幅,核心观点是:无监督表示学习、监督模型学习和优化方法三者不是并列关系,而是相互补充、层层递进的关系。表示学习提供了“好的表示应该长什么样”的猜想;模型设计决定了表示如何被利用;优化方法则明确指定了优化的目标函数和约束。以因果视角来看,表示学习的解耦尝试对应“找到因果因子”,领域泛化的域对齐对应“在域之间保持条件分布不变”,DRO 的分布集合则对应“在不确定集内保持风险可控”。
这个连接关系的实操意义是:你不必在三类方法里做单选。比如 GroupDRO 和 IRM 经常被组合使用——先用 DRO 把最差域的损失降下来,再用 IRM 惩罚项约束表示的不变性。反过来,解耦表示学习产出的分离特征也可以直接送入领域泛化的分类器训练流程。我在自己的实验中对比过单独使用任一方法和两两组合的效果,组合方案在 PACS 数据集上的最坏域精度普遍高出 3-5 个百分点,验证了“表示+优化”双端改造的价值。
5. 评估基准与复现避坑:看图指标、数据集和四个翻车点
5.1 常用数据集与评估指标
对于想复现 OOD 方法的读者,综述推荐的基准数据集是分层次的。图像领域常用 Rotated MNIST(旋转角度构成域)、PACS(照片、艺术画、卡通、素描四个域)、VLCS(四种图像风格来源)和 Office-Home(四种办公场景)。文本和真实场景方面,CivilComments 和 FMoW 也是常见选择。这类数据集的共性是:域划分明确、漂移形式可控、计算代价适中,适合快速迭代验证算法。
评估指标上要特别注意,OOD 领域最忌讳只报平均精度。因为平均精度会被表现好的域“平均掉”,掩盖模型在某个困难域上彻底崩溃的事实。综述强调最坏域精度(Worst-group Accuracy)和平均精度之间的 gap 是诊断模型鲁棒性的关键数字。如果平均精度 90%,最坏域精度却只有 55%,说明模型完全偏向于某些域,这在真实场景里可能造成灾难性后果。
5.2 复现中的常见坑位:现象、原因、解决
以下四条踩坑记录来自实践,现象和原因都经过多轮验证。
坑一:ERM 基线强得离谱,复杂方法不涨点。现象:在 PACS 或 VLCS 上,ERM 的平均精度已经很高,你跑了一堆 OOD 方法反而掉了几个点。原因:这些小数据集上域漂移有限,ERM 已经能学到足够的共性特征,复杂方法引入的正则化反而限制了表示容量。解决:先用 ERM 做上界参考,如果你的方法在 ERM 之下,不要急于调参,先检查是否数据集选择不当——换成 Rotated MNIST 这种漂移更剧烈的数据集再看差距。
坑二:拿目标域数据调参,结果 OOD 变“OD”。现象:某些论文里“测试域”数据在调参阶段被用来选择模型超参数或早停轮数,最后报告的精度虚高。原因:OOD 的设定是测试域完全不可见,一旦用目标域信息做模型选择,就变成了半监督甚至监督学习。解决:严格把数据切成训练域、验证域、测试域三份,验证域必须是与测试域不同的另一个域,早停和选参全部基于验证域完成。
坑三:域标签和样本数量严重不平衡。现象:GroupDRO 在所有域上收敛很慢,损失权重反复震荡,日志里最差域经常切换。原因:有些域只有几十个样本,DRO 的动态加权会把它放大到离谱的权重,导致模型在该域上过拟合。解决:对样本数少的域做有放回采样补充,或在损失权重上设置上限,避免单一域主导训练。
坑四:随机种子对 OOD 精度的影响大于算法本身。现象:同一个方法换三个种子,精度波动 2-3 个百分点,比方法之间的差距还大。原因:OOD 数据集本身就小,域划分后每域样本量更少,随机初始化带来的偏差被放大。解决:至少跑 5 个种子取均值和方差;如果条件允许,用多个划分方式的均值作为最终指标。这也是论文报告标准做法中建议的——单种子结果不足以支撑结论。
6. 把这篇综述变成你自己的实验基线:一套可复用的 OOD 评测流程
动手做 OOD 实验时,不要直接去复现综述里所有方法,那会陷入复制不完的细节泥潭。我的建议是围绕综述的分类框架搭一个最小闭环,先跑通三个层次:ERM 基线、一个优化方法、一个表示学习方法。具体流程分四步走。
第一步,选定一个漂移强度适中的数据集,比如 Rotated MNIST。记录 ERM 的平均精度和最坏域精度,作为所有后续比较的参考锚点。第二步,实现 GroupDRO,在相同划分下跑出两个指标,并与 ERM 对比。这里注意 GroupDRO 对组权重的初始值敏感,从均匀权重开始、学习率不要超过 1e-3 是比较稳妥的做法。第三步,用一个无需域标签的方法做交叉验证。比如稳定学习里的样本重加权或特征去相关,这类方法不依赖环境标注,更贴近真实业务场景。第四步,把所有指标的 gap(平均 vs 最坏)放在一张表里,观察不同方法在缩小 gap 上的表现差异。
这个闭环跑完,你不仅掌握了综述里三类方法各自的效果,还能摸清数据集的“脾气”。比如你会发现某个数据集上最坏域精度被一个冷门域拉低,而所有方法都在这个域上表现不佳——这就说明问题可能出在数据本身的质量而非方法。
我的习惯是每评估一个新方法,都强制跑一遍上述闭环,并把分析结果记录在实验日志里,包括数据集、域划分方式、超参数、种子数和失败原因。这个看似笨重的工作流,帮我避免了很多次无效的模型迭代——有些方法在一个数据集上看起来涨点,换一个数据集立刻回归均值;没有这个闭环,很容易把偶然当必然。从那以后,我每次准备 OOD 实验,都会先问自己三个问题:域标签是否真的干净?最坏域精度有没有被平均精度稀释?每个种子是否都稳定?这三个问题问完,实验质量通常不会差。希望这份流程能帮你在 OOD 泛化这条路上少走弯路。
本文还有配套的精品资源,点击获取