资讯详情

资讯详情

分布外泛化OOD:从ERM失效到最坏域评估的避坑指南

简介这份由清华大学崔鹏等研究者完成的分布外泛化综述面向深度学习研究者及需在非独立同分布场景下提升模型鲁棒性的工程人员。论文从形式化定义、方法分类、理论联系、评估指标到未来方向系统梳理OOD泛化重点讨论无监督表示学习、监督模型学习与优化策略三条路线并串联因果推理、不变性学习、稳定学习及分布鲁棒优化等思路便于读者建立从问题定义到方法选型的整体框架对分布偏移、领域泛化与鲁棒学习等方向亦有直接参考价值。资源包共1个PDF文件大小约5.34MB适合作为论文精读、组会分享与课题调研的底稿。目前已有2740人学习下载可据此了解该领域常用数据集、评价方式与研究脉络并获取后续选题和实验设计的参考。1. 一个在训练集上 AUC 0.95 的模型换家医院就掉到 0.6分布外泛化到底在解决什么一个在训练集上把 AUC 刷到 0.95 的模型换一批从另一家医院采来的同一类数据AUC 直接掉到 0.6 以下甚至偶尔低于随机猜——这种翻车现场在医疗、自动驾驶、金融风控里反复出现不是数据脏也不是模型没调好而是训练分布和测试分布压根不是同一个。这就是分布外泛化Out-of-Distribution GeneralizationOOD要处理的核心问题测试分布 Pte(X,Y) 在训练阶段未知且不等于训练分布 Ptr(X,Y)经典机器学习赖以成立的 i.i.d. 假设在这里直接失效。这篇综述值得啃不是因为它列了多少篇参考文献而是它第一次把 OOD 问题从定义、方法到评估串成了一条完整的链先把问题形式化再按方法在整个学习流水线里介入的位置切成三层——表示层、模型层、优化层最后用因果视角把这三层之间的理论联系讲清楚。读完你会明白为什么 ERM 在分布偏移下必然抓取虚假相关、为什么有些方法看起来是玄学、以及评估 OOD 性能时哪些坑几乎人人踩过。2. 从 i.i.d. 到 Ptr ≠ PteERM 为什么在分布偏移下必然翻车2.1 ERM 的最优性只在一个等式成立时才成立经典监督学习的形式化很干净给定训练分布 Ptr(X,Y) 上采样的 n 个样本找一个参数化模型 fθ: X → Y使它在测试分布 Pte 上的期望损失最小fθ* arg min_{fθ} E_{X,Y ~ Pte}[ ℓ(fθ(X), Y) ]但注意训练阶段你能拿到的只有 Ptr 的样本所以实际做的是经验风险最小化ERML_ERM (1/n) · Σ_i ℓ(fθ(x_i), y_i)i.i.d. 假设的含义是 Ptr(X,Y) Pte(X,Y)。在这个等式下训练误差是测试误差的一个无偏估计泛化界可以用 Rademacher 复杂度或 VC 维来刻画ERM 的最优解就能近似 Pte 上的最优解。这个结论漂亮但它的全部前提都压在一个等式上。一旦 Ptr ≠ Pte这个界就不成立了。更具体地说Pte 上的风险会被拆成两部分Ptr 上的风险加上一个衡量两个分布差异的散度项比如 f-散度或 Wasserstein 距离。前者可以靠训练压下去后者在 ERM 的目标里根本没有出现所以 ERM 没有任何动力去控制它。模型越强、训练集上拟合得越好越倾向于把 Ptr 里所有可用的相关性都吸收进去——包括那些只在 Ptr 里成立、到了 Pte 就消失的虚假相关。这就是为什么训练集上刷得越狠的模型换分布时往往摔得越重。2.2 协变量偏移只改变 X 的分布标签机制不动OOD 是一个大类里面包含协变量偏移、标签偏移、概念偏移等多种形态它们的成因和应对方式差别很大。综述聚焦的是协变量偏移因为它最常见也最容易在现实里被观测到。形式化定义是Ptr(Y|X) Pte(Y|X) 且 Ptr(X) ≠ Pte(X)翻译成人话输入 X 的边缘分布在训练和测试之间发生了漂移但给定 X 之后 Y 的生成机制没变。比如同一套疾病诊断规则在不同医院拍出来的影像由于设备、人群、拍摄习惯不同X 的分布变了但放射科医生的判断逻辑没变。协变量偏移相对好处理的一点是标签机制稳定意味着存在一个跨分布不变的映射模型只要学到它就能泛化——问题在于 ERM 没法区分哪个相关性是“不变”的哪个是“环境特异”的。和它相邻的另一个概念是域适应Domain Adaptation。域适应假设测试分布要么有标签、要么无标签可用相当于你在训练时对 Pte 已经有了一点先验知识所以能拿到理论保证。OOD 泛化更狠Pte 在训练阶段完全未知没有任何测试样本可用。这个差别决定了 OOD 方法不能直接套用域适应那一套对齐手段——你没法对齐一个你看不见的分布。2.3 三个介入点表示层、模型层、优化层把监督学习拆开来看其实只有三个可动的部件特征表示 g(X)、从表示到标签的映射 fθ、以及优化的目标函数。综述按方法介入的位置把现有工作分成三类这个划分不是拍脑袋它对应着你在工程里实际能改的三个地方介入层代表方法族核心思路典型代价表示层解耦表示学习、因果表示学习用先验约束隐空间结构让不变因子和变化因子分开需要假设隐因子的独立性或因果结构模型层因果学习、稳定学习、域泛化设计模型结构或学习策略迫使模型依赖跨域不变的机制需要多环境/多域数据或因果图先验优化层分布鲁棒优化、不变性优化直接改写目标函数在训练时显式约束最坏情况需要定义分布距离且半径选择敏感三层之间不是互斥的很多实战方法会同时动两层。但理解这个划分的价值在于当你在实际项目里遇到分布偏移时你能清楚自己手上的资源够你动哪一层。只有单域数据表示层和优化层是主要抓手有多域数据模型层的域泛化和因果学习才有发挥空间。3. 表示层解耦与因果表示把“变化的”和“不变的”拆开3.1 解耦表示学习让隐变量各管一件事解耦表示学习的出发点很朴素如果数据的真实变化因子可以被拆成若干独立维度每个维度只控制一个语义因素比如人脸数据里的姿态、光照、身份那么当测试分布只在某几个因子上发生偏移时模型只要依赖剩下的不变因子就能做出稳定预测。问题在于无监督学习本身没有任何信号告诉模型“哪个维度该对应哪个因子”所以需要人为注入先验。最典型的实现是 β-VAE 这一类变分框架。它的损失由两部分组成重构项和 KL 正则项通过调节 β 来控制隐空间的解耦程度# 简化的 β-VAE 损失 recon_loss F.mse_loss(x_recon, x) # 重构项让隐变量保留足够信息 kl_loss -0.5 * torch.sum(1 logvar - mu**2 - logvar.exp()) loss recon_loss beta * kl_loss # beta 1 时更强地约束隐空间这段代码里 β 是关键参数。β1 退化成标准 VAEβ1 会加大对隐空间分布与先验通常是各向同性高斯之间差异的惩罚迫使不同维度去编码相对独立的变化方向从而提升解耦度。代价是重构质量会下降——β 越大解耦和保真之间的拉扯越明显。这背后是一个很现实的取舍解耦程度和下游任务性能并不总是正相关综述里也明确提到解耦只是“好表示”的一个候选属性不是 OOD 泛化的充分条件。3.2 因果表示学习从观测分布走到干预分布解耦表示学习有一个隐含假设隐因子之间是独立的。但现实里的语义因子往往有因果依赖比如“光照”会影响“阴影”“身份”会影响“表情习惯”。如果强行假设独立学出来的表示结构就可能和真实生成机制对不上换一个分布就失效。因果表示学习试图把结构信息也编码进去用结构因果模型SCM来刻画观测 X 和隐变量 Z 之间的关系X f(Z) ε, Z 的各个分量之间由一个有向无环图约束在这个框架下分布偏移被理解为对 Z 的干预intervention或混杂confounder变化的结果。如果模型能学到 Z 的因果结构那么当测试分布对应某种干预时模型可以推理出哪些机制应该保持不变哪些应该随干预改变从而做出更可靠的预测。常见的实现思路是在 VAE 式的框架里加入结构约束比如给隐变量的先验加上因果图对应的条件依赖或者在训练目标里加入对干预分布的模拟。这条路的理论很优雅但工程上有一个硬骨头因果结构本身通常不可观测你得靠很强的假设比如已知因果图、或者线性非高斯假设才能从观测数据里辨识出来。综述把这部分放在表示层而不是模型层恰恰说明它的定位是“给表示加先验”而不是“直接给预测器加约束”。在实际项目里如果你的领域知识足够强、能画出因果图这条路值得走如果画不出来就要谨慎估计收益。4. 模型层与优化层因果、稳定、域泛化、DRO 与不变性优化4.1 因果学习找到跨域不变的因果机制因果学习在 OOD 里的核心操作是区分“因果特征”和“虚假特征”。因果特征和标签之间的关联在所有分布下都成立虚假特征只在训练分布里成立。如果模型能只依赖因果特征那换分布时就不会崩。形式化地把输入 X 拆成因果部分 Xc 和虚假部分 Xs目标是学一个只对 Xc 敏感的预测器。这条路的一个代表作是不变风险最小化IRM那一系思路它不做显式的特征拆分而是要求存在一个表示 Φ使得在所有训练环境上最优分类器 w 都相同min_{Φ, w} Σ_e R_e(w ∘ Φ) s.t. w ∈ arg min_{w} R_e(w ∘ Φ) 对所有环境 e 成立实际优化时这个约束没法直接求通常用惩罚项来近似——要求每个环境上的风险对 w 的梯度在 w1 处接近零。代码上大概长这样# IRM 的惩罚项近似 penalty 0.0 for x_e, y_e in envs: loss_e loss_fn(model(x_e), y_e) grad_w torch.autograd.grad(loss_e, model.classifier.weight, create_graphTrue)[0] penalty grad_w.pow(2).sum() loss sum(loss_fn(model(x_e), y_e) for x_e, y_e in envs) lam * penalty这里的 lam 控制不变性约束的强度。lam 太大模型会被压得过于保守、连正常拟合都做不好lam 太小则退化成 ERM。IRM 的一个已知问题是它对环境划分方式很敏感——环境切得太粗不变性约束几乎没有信号切得太细每个环境里的样本量又不够估计风险。4.2 稳定学习给样本重新加权消除选择偏差稳定学习的切入点和因果学习不同它不拆分特征也不要求多环境而是从样本权重入手。核心观察是训练数据里的选择偏差会让某些虚假特征和标签产生虚假相关如果能给样本重新加权使得加权后的特征分布中每个特征和标签都边际独立那么在这些特征上学到的预测器就不会依赖虚假相关。技术上通常是一个交替优化的过程先固定权重训练一个基础模型再根据模型给出的特征-标签相关性去更新权重让相关性往零的方向走如此反复。这条路的好处是不需要多域数据、也不需要因果图先验单域数据就能跑代价是它对高维特征的相关性消除往往不彻底而且交替优化本身可能不稳定——权重和模型互相拉扯收敛性分析比 ERM 难得多。综述把它归在模型层是因为它改的是“学习策略”而不是“目标函数的形式”。4.3 域泛化多源数据上的对齐与不变性域泛化假设训练阶段可以拿到多个源域 D1,…,Dn每个域内部的分布不同目标是学一个在未知目标域上也表现好的模型。这条线的常见操作有两类一类是对齐各域的特征分布比如用对抗训练让特征提取器骗不过域判别器或者对齐二阶统计量CORAL另一类是把 IRM 那一套不变性约束扩展到多域上。域泛化和 OOD 泛化的关系需要说清楚域泛化是 OOD 泛化的一个子集它额外假设了“多源域可用”这个信息。这个假设在医疗多家医院、自动驾驶多个城市、推荐系统多个场景里很现实但如果你的项目只有单域数据域泛化方法就用不上。综述把它和因果学习、稳定学习并列放在模型层是因为它们共享同一个操作逻辑——都是从数据里挖出某种跨域稳定的结构区别只在于挖的方式。4.4 DRO 与不变性优化带理论保证的目标函数优化层的方法不绕弯子直接改写训练目标。分布鲁棒优化DRO的写法是min_θ sup_{Q: D(Q, Ptr) ≤ ρ} E_Q[ ℓ(fθ(X), Y) ]意思是在所有和训练分布距离不超过 ρ 的分布 Q 里找最坏的那个让模型在最坏分布上的损失最小。这里 D 可以选 f-散度、Wasserstein 距离等ρ 是鲁棒半径。理论上这个框架有清晰的保证只要测试分布落在半径为 ρ 的球里模型性能就有下界。但实操中 ρ 的选择是个玄学——ρ 太小等于 ERMρ 太大模型会为了应付根本不存在的极端分布而牺牲正常性能。f-散度下内层 sup 有闭式解计算上等效于对样本损失做重加权Wasserstein 球下则需要求解一个对偶问题计算量更大。另一条优化路线是不变性优化代表是 V-REx 那类方法直接惩罚各环境风险的方差risks torch.stack([loss_fn(model(x_e), y_e) for x_e, y_e in envs]) loss risks.mean() beta * risks.var() # beta 控制方差惩罚强度这段代码比 IRM 的梯度惩罚简单得多实践中也更稳但它的理论保证比 DRO 弱——方差小不直接等价于最坏情况风险小。综述在优化层花了大量篇幅讨论这些方法的理论联系因为这一层是唯一能给出“为什么能 work”的严格答案的地方表示层和模型层的方法大多只有经验证据。5. 避坑与排查那些在 OOD 实验里翻车的血泪经验5.1 坑一数据划分看起来是 OOD实际还是 i.i.d.现象按 8:2 随机划分训练测试集跑出来的 OOD 实验结果比论文里的数字还漂亮换到真实场景直接崩。原因随机划分保证训练集和测试集来自同一个分布模型只是在做插值根本没被逼着处理分布偏移。你测的是 i.i.d. 泛化不是 OOD 泛化。解决划分必须按域、按时间、按人群来切。比如医疗数据按医院切时序数据按时间点切推荐数据按用户群体切。切完之后先验证训练分布和测试分布确实不同——可以用一个简单的域分类器来测如果它能轻易区分两个分布说明偏移够强如果区分不了说明你的 OOD 设定名不副实。5.2 坑二把域泛化方法套到单域数据上现象拿了一个域泛化方法但项目里只有单域数据硬造了几个“伪域”出来结果还不如 ERM。原因域泛化方法的有效性依赖源域之间的差异足够大、且目标域和源域共享某些不变结构。硬造出来的伪域如果差异不够不变性约束拿不到有效信号差异太大又可能把真正有用的特征也当成环境特异给扔了。解决先判断自己的数据形态。有多源数据再考虑域泛化只有单域优先考虑优化层方法DRO、V-REx或稳定学习的重加权路线。造伪域时至少保证伪域划分和某个真实的变化因素时间、设备、地区对齐不要随机切。5.3 坑三DRO 的鲁棒半径拍脑袋定现象ρ 设大了模型在所有域上都很平庸设小了和 ERM 没区别。原因ρ 应该对应测试分布和训练分布之间的真实距离但这个距离在训练阶段未知。拍脑袋定 ρ等于在赌测试偏移的幅度。解决用验证集上的分布偏移程度来标定 ρ而不是在训练集上交叉验证。如果有多域数据可以留一个域做验证看不同 ρ 下在留出域上的表现选一个在最坏域上表现最好的 ρ。没有多域数据时宁可取一个偏小的 ρ避免模型过度保守。5.4 坑四评估只看平均指标不看最坏域现象模型在平均指标上赢了 ERM但某个特定域上比随机猜还差。原因OOD 评估的核心是最坏情况不是平均水平。平均指标会被表现好的域拉高掩盖掉模型在某些域上的灾难性失败。解决评估时必须报告每个域的单独结果重点关注最差域的性能和跨域方差。综述里提到的评估指标除了平均准确率还包括最差域准确率、跨域标准差、以及和 ERM 基线的逐域对比。如果你只能报一个数字报最差域。6. 设计取舍与验证为什么没有一个 OOD 方法能通吃把三层方法摆在一起看会发现一个让人不太舒服的事实没有哪个方法在所有场景下都占优。这不是研究没做到位而是 OOD 问题本身的性质决定的——你对测试分布假设得越多方法能给的保证越强但适用范围越窄。因果学习理论最漂亮但它要求你能定义环境、能画出因果图这两个前提在真实项目里经常凑不齐。域泛化在多源场景下很实用但单域项目直接出局。DRO 有严格的理论下界但 ρ 的选择和分布距离的定义都需要额外的领域判断。解耦表示灵活但解耦程度和下游性能的关系并不单调。稳定学习对数据要求最低但高维下的相关性消除往往不彻底。我的一般判断顺序是这样的先诊断偏移类型——用域分类器或者简单的分布距离度量确认 Ptr 和 Pte 到底差在哪再看手上有多少资源——单域还是多域、有没有因果先验、能不能承受额外的计算开销最后选方法而且一定保留 ERM 作为基线。ERM 在新分布上的表现经常被低估很多花哨方法在真实数据上打不过一个调好正则的 ERM原因就是方法引入的假设和真实偏移形态不匹配。验证环节有一个容易忽略的点OOD 方法的超参数不能只在训练分布上交叉验证。IRM 的 lam、V-REx 的 beta、DRO 的 ρ这些参数控制的是模型对分布偏移的鲁棒程度在 i.i.d. 验证集上调出来的值到了偏移场景下很可能完全不对。正确做法是留出一个和训练分布不同的验证域在这个域上做超参选择——这也是为什么域泛化方法通常比单域方法更稳因为它们天然有多域数据可以用来做这件事。从那以后我每次碰分布偏移相关的项目都强制走一遍“先诊断偏移类型、再确认可用资源、最后用 ERM 当基线”的流程绝不跳过诊断直接上方法。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →