ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

分布外泛化(OOD)综述:从表示、模型到优化的方法体系与评估避坑

分布外泛化(OOD)综述:从表示、模型到优化的方法体系与评估避坑

简介:这份资源是清华大学崔鹏团队等撰写的《Towards Out-Of-Distribution Generalization: A Survey》综述论文PDF,面向深度学习研究者、算法工程师及关注模型鲁棒性的高年级学生,系统回应现实场景中训练与测试分布不一致、i.i.d.假设难以成立时模型性能骤降的问题。论文从OOD泛化的形式化定义出发,按学习流程将现有方法归为无监督表示学习、监督模型学习与优化策略三类,并串联因果推理、不变性学习、稳定学习与分布鲁棒优化之间的理论联系,同时介绍常用数据集与评估指标,最后总结文献并展望未来方向。资源包仅含1个PDF文件,大小约5.34MB,轻量便于离线阅读与检索。该论文已有2740人学习,适合作为进入OOD泛化方向的系统性入门读物,也可供撰写综述、梳理方法脉络与设计评估方案时参考。

1. 分布外泛化:为什么模型在训练集上越准,换一个分布就越容易翻车

一个在 ImageNet 上刷到 90% 以上准确率的分类器,换到手机拍摄、加了雾天、换了城市街景的数据上,准确率可能直接掉到随机猜的水平。这不是模型没训好,而是它训得太“好”了——好到把训练集里所有能蹭的相关性都蹭上了。经典监督学习建立在 i.i.d. 假设上:训练和测试数据独立同分布。可现实里时间在推移、采集设备在换、人群在变,测试分布几乎不可能和训练分布一模一样。分布外泛化(Out-of-Distribution Generalization,OOD)要回答的就是:当测试分布未知且与训练分布不同时,模型还能不能泛化。这篇综述把定义、方法分类、理论联系和评估体系串成一条线,值得逐层拆开看它到底怎么把“分布偏移”这件事讲清楚。

2. 问题定义:OOD 泛化到底在数学上难在哪

2.1 从 ERM 到 OOD:一个等号被拿掉之后

经典监督学习的形式化很干净:给定特征空间 X 和标签空间 Y,参数化模型 fθ: X → Y,损失函数 ℓ: Y × Y → R。学习目标是找一个在测试分布上期望损失最小的模型:

f*θ = arg min_{fθ} E_{X,Y ~ Pte}[ℓ(fθ(X), Y)]

i.i.d. 假设下 Ptr(X,Y) = Pte(X,Y),于是可以用经验风险最小化(ERM)直接逼近:

L_ERM = (1/n) Σ_i ℓ(fθ(x_i), y_i)

ERM 之所以 work,是因为训练分布和测试分布是同一个,训练误差是测试误差的无偏估计。OOD 泛化把 Ptr(X,Y) = Pte(X,Y) 这个等号拿掉,变成 Ptr(X,Y) ≠ Pte(X,Y),而且 Pte 在训练阶段完全未知。这一改,ERM 的理论保证就断了:训练误差再低,也不能推出测试误差低。

这里有个容易被忽略的点:OOD 问题在无假设条件下是不可解的。如果测试分布可以任意偏移,那训练集提供的信息不足以约束测试行为。所以所有 OOD 方法本质上都在做同一件事——对“测试分布会怎么变”加一个假设,把不可解问题变成可解问题。综述里不同方法分支的区别,很大程度上就是它们加的假设不同。

2.2 协变量偏移:最常被研究的那一类

综述主要聚焦协变量偏移(covariate shift),定义为:

Ptr(Y|X) = Pte(Y|X) 且 Ptr(X) ≠ Pte(X)

意思是输入 X 的边缘分布在变,但标签生成机制 P(Y|X) 不变。比如同一套疾病诊断规则,病人群体构成变了;同一个物体识别任务,拍摄光照和角度变了。这个假设的价值在于:它保留了 X→Y 的稳定关系,让“学不变性”这件事有了落脚点。如果连 P(Y|X) 都变(概念偏移),那问题性质就完全不同了。

综述还区分了 OOD 泛化和领域自适应(domain adaptation):领域自适应假设测试分布的部分信息可知(有标签或无标签的测试数据),因此有理论保证;OOD 泛化则假设测试分布完全未知,难度更高。这个区分很关键,很多工程场景里大家嘴上说 OOD,实际做的是领域自适应——有目标域的无标签数据可用,那方法选择和评估方式都不一样。

2.3 按学习流水线切三刀:表示、模型、优化

综述的分类方式不是按技术名词堆,而是按方法在整个学习流水线中的位置切三块:

位置类别代表方向
特征表示无监督表示学习解耦表示学习、因果表示学习
模型与学习策略监督模型学习因果学习、稳定学习、领域泛化
优化目标优化方法分布鲁棒优化、不变性优化

这个切法的好处是:同一个 OOD 目标,可以从三个入口去逼近。改表示,是让学到的特征本身携带不变性;改模型,是换归纳偏置或学习策略;改优化,是直接把 OOD 目标写进损失函数并给出理论保证。后面几章就按这条流水线往下拆。

3. 表示层:解耦与因果表示学习怎么把先验塞进特征

3.1 解耦表示学习:把变化的因子拆开

解耦表示学习(disentangled representation learning)的目标是让学到的表示中,不同且有意义的变化因子被分离开。直观理解:一张人脸图片里,身份、姿态、光照是三个独立因子,如果表示能把它们拆到不同维度上,那么当光照分布变化时,身份相关的维度不受影响,模型就自然对光照偏移更稳。

常见的实现思路是以变分自编码器(VAE)为骨架,通过设计先验和正则项来鼓励解耦。综述里提到的代表性做法,核心是在 ELBO 之外加约束,让潜变量的后验分布逼近某个分解形式。用伪代码表达这个结构:

# 解耦表示学习的典型训练骨架(示意) # encoder 输出潜变量 z 的后验参数,decoder 重建输入 def train_step(x): mu, logvar = encoder(x) z = reparameterize(mu, logvar) # 重参数化采样 x_rec = decoder(z) rec_loss = mse(x_rec, x) # 重建损失 kl_loss = kl_divergence(mu, logvar) # 逼近分解先验 # 关键:额外的解耦正则,鼓励不同潜维度独立 disentangle_reg = independence_penalty(z) loss = rec_loss + beta * kl_loss + gamma * disentangle_reg return loss

beta控制 KL 项的权重,gamma控制解耦正则的强度,independence_penalty的具体形式因方法而异(如对潜变量的协方差矩阵做惩罚)。这里的机制逻辑是:重建损失保证信息不丢,KL 项把潜空间压向先验,解耦正则把不同因子推向独立。三者拉扯的结果,是表示中“可分离的变化方向”被显式建模。

但这条路有个硬伤:解耦的监督信号很弱。无监督条件下,什么算“有意义的因子”本身没有唯一答案,不同随机种子训出来的解耦维度可能对不上。所以解耦表示对 OOD 的帮助更多是“有潜力”,而不是“有保证”。综述把它放在表示学习分支里,定位是提供一种带先验的特征构造方式,而不是端到端的 OOD 解法。

3.2 因果表示学习:从相关到因果的那一步

因果表示学习更进一步:它不满足于把因子拆开,而是希望学到的表示对应数据生成过程中的因果变量。动机很直接——相关性在分布偏移下会断,因果关系不会。如果模型抓住的是 X 中真正导致 Y 的那部分结构,那么当 X 的边缘分布变化时,这部分结构仍然成立。

常见的实现思路是把结构因果模型(SCM)的假设嵌入表示学习:假设观测数据由一组潜因果变量经过未知的混合函数生成,学习目标是从观测中反解出这些潜变量及其因果结构。综述里讨论的做法通常需要额外的假设,比如因果变量之间满足某种稀疏性或独立性条件,否则反解不唯一。

这里的机制要点是:因果表示学习把 OOD 泛化问题转化成了“识别不变机制”的问题。协变量偏移下 P(Y|X) 不变,但 X 内部哪些维度是原因、哪些是伴随现象,需要靠因果结构来区分。一旦区分开,模型就可以只依赖因果部分做预测,对非因果部分分布的变化免疫。代价是假设强、可识别性条件苛刻,实际落地时往往需要领域知识介入。

提示:表示学习分支的共同特点是“把先验写进特征”,优点是和下游模型解耦,缺点是先验对不对很难验证。评估这类方法时,光看 OOD 准确率不够,还要看学到的表示在换分布后是否稳定。

4. 模型层:因果学习、稳定学习与领域泛化的三种归纳偏置

4.1 因果学习:用干预和混杂来解释分布偏移

因果学习处理 OOD 的方式,是把训练分布和测试分布都用因果结构来刻画,分布偏移的来源被归为两类:干预(intervention)和混杂(confounder)。干预改变某个变量的生成机制,混杂则让两个变量产生虚假相关。

一个典型的例子:模型在训练集里学到“草地”和“牛”强相关,因为训练图片里牛大多在草地上。这里草地是混杂或伴随变量,不是牛的原因。当测试集出现“沙滩上的牛”,模型就翻车。因果学习的做法是识别出真正导致标签的因果特征,把伴随特征剥离。

综述里讨论的因果学习方法,核心操作通常包括:构建因果图、识别不变机制、在干预分布上做训练。机制上可以理解为——不追求在单个分布上误差最小,而是追求在多个干预分布下误差都稳定。这和后面要讲的不变性优化是同一件事的两种语言。

4.2 稳定学习:从样本重加权到消除虚假相关

稳定学习(stable learning)引入分布偏移的方式是选择偏差(selection bias):训练样本不是总体的随机样本,某些子群体被过度代表。模型会利用这种偏差学到虚假相关。

稳定学习的代表性思路是样本重加权:给每个样本一个权重,使得加权后的特征之间近似独立,从而切断虚假相关。用伪代码表达这个流程:

# 稳定学习的样本重加权骨架(示意) # 目标:找一组样本权重 w,使加权后特征间协方差接近对角 def stable_weighting(X, y, max_iter=100): w = np.ones(len(X)) / len(X) # 初始均匀权重 for _ in range(max_iter): Xw = X * np.sqrt(w)[:, None] # 加权特征 cov = Xw.T @ Xw # 加权协方差 # 惩罚非对角元素,推动特征独立 off_diag = cov - np.diag(np.diag(cov)) grad = X.T @ (X @ off_diag) # 对权重的梯度(示意) w = project_to_simplex(w - lr * grad) # 投影回概率单纯形 return w

project_to_simplex保证权重非负且和为 1,off_diag惩罚的是特征间的残余相关。机制逻辑是:如果加权后特征之间独立,那么模型学到的每个特征的系数就只反映该特征对标签的独立贡献,而不是通过其他特征传导的虚假相关。这样在测试分布中虚假相关断裂时,模型不会崩。

稳定学习的优点是实现相对轻量,不需要显式的因果图;缺点是重加权只能处理观测到的混杂,未观测混杂仍然无解,而且权重估计本身有方差,样本少时不稳定。

4.3 领域泛化:多源分布下的不变性提取

领域泛化(domain generalization)假设训练阶段有多个源域,测试域未知。它的核心假设是:不同源域之间共享某种不变表示,学到这个不变表示就能泛化到新域。

常见做法包括:对齐不同域的特征分布(如最小化域间分布距离)、做元学习式的域间划分训练、或者用对抗训练让特征对域标签不可区分。机制上,这些方法都在逼模型回答一个问题——哪些特征是所有域都有的、哪些是某个域特有的。前者被保留,后者被抑制。

领域泛化和因果学习、稳定学习在目标上高度重合,区别主要在假设的表述方式:领域泛化用“域”来刻画分布变化,因果学习用“干预/混杂”,稳定学习用“选择偏差”。综述在第 6 部分专门讨论这些分支的理论联系,核心观点是它们在不同语言下描述同一类不变性。

注意:领域泛化要求多源域,且默认源域之间的差异能代表测试域的偏移方向。如果源域覆盖不足,学到的“不变性”可能只是几个源域的共同偏差,换到真正的新域照样失效。

5. 优化层:DRO 与不变性优化怎么把 OOD 写进目标函数

5.1 分布鲁棒优化:在最坏分布上最小化风险

分布鲁棒优化(Distributionally Robust Optimization,DRO)的思路很直接:既然测试分布未知,那就不要只优化训练分布上的期望损失,而是优化一个分布集合中最坏情况下的损失:

min_θ sup_{Q ∈ Ω} E_Q[ℓ(fθ(X), Y)]

Ω 是以训练分布为中心的一个分布集合(如基于 Wasserstein 距离或 f-散度的球)。机制上,DRO 把 OOD 泛化变成了一个 min-max 问题:内层找最坏的分布,外层让模型在这个最坏分布上表现最好。这样训练出来的模型对 Ω 内的任何分布偏移都有鲁棒性。

关键参数是 Ω 的大小:球太小,覆盖不到真实测试分布;球太大,最坏分布过于极端,模型会过度保守、在正常分布上性能下降。这个权衡是 DRO 落地的核心难点,综述里也提到半径选择缺乏通用准则。

5.2 不变性优化:跨环境的风险一致性

不变性优化(invariance-based optimization)的代表是 IRM 类方法。它假设训练数据来自多个环境,要求模型学到的表示使得最优分类器在每个环境上都相同。形式化上,除了最小化各环境风险之和,还加一个惩罚项衡量各环境最优分类器的差异:

# 不变性风险最小化的训练骨架(示意) # 输入:多个环境的数据 (x_e, y_e),e = 1..E def irm_loss(model, environments, penalty_weight): total_risk = 0.0 penalty = 0.0 for x_e, y_e in environments: # 每个环境单独算风险,并对表示做一次“虚拟分类器”更新 repr_e = model.featurize(x_e) risk_e = model.classify_loss(repr_e, y_e) total_risk += risk_e # 惩罚:各环境梯度方向的一致性 grad_e = compute_grad(risk_e, model.classifier) penalty += (grad_e - mean_grad) ** 2 return total_risk + penalty_weight * penalty

penalty_weight控制不变性约束的强度,grad_e是各环境对分类器的梯度。机制逻辑是:如果表示是“不变的”,那么基于它学出的分类器在每个环境上都应该是最优的,梯度方向应该一致。惩罚项就是在逼这件事发生。

IRM 的理论动机很漂亮,但实践中对超参敏感,且需要环境划分。环境怎么划、划得对不对,直接决定方法是否有效。综述在理论联系部分指出,不变性优化和因果学习中的不变机制识别在数学结构上是相通的,这给跨分支借鉴提供了依据。

6. 避坑与排查:OOD 实验里最容易翻车的几件事

6.1 把领域自适应当成 OOD 泛化来评估

现象:方法在测试域上表现很好,但测试域的无标签数据在训练时已经用上了。原因:这是领域自适应,不是 OOD 泛化,测试分布信息泄露了。解决:严格隔离测试域,训练阶段完全不接触测试域任何数据,包括无标签数据。

6.2 源域划分不合理导致不变性学错

现象:领域泛化方法在留一域评估中表现不稳定,换个划分方式结果差异巨大。原因:源域之间的差异不能代表测试域的偏移方向,学到的“不变性”只是源域共同偏差。解决:增加源域多样性,检查源域覆盖的偏移类型,必要时用多个划分做交叉验证。

6.3 只报平均准确率,掩盖了子群体崩溃

现象:整体指标看起来还行,但某些子群体上性能断崖式下跌。原因:OOD 评估需要看分布偏移下的最差表现,平均值会被多数群体拉高。解决:按子群体、按偏移类型分别报告指标,关注最差组表现和方差。

6.4 DRO 半径设得过大导致模型过度保守

现象:DRO 训练后,训练分布上的性能明显下降,测试分布上也没提升。原因:分布集合半径过大,最坏分布过于极端,模型为了鲁棒牺牲了太多正常性能。解决:从较小半径开始做敏感性分析,结合验证集上的偏移程度调整。

6.5 用训练集上的验证划分来调 OOD 超参

现象:调参时指标很好,换到真正的新分布就失效。原因:验证集和训练集同分布,调出来的超参是在拟合训练分布,不是在对齐 OOD 目标。解决:验证集必须来自与训练分布不同的域,且调参过程不能接触最终测试域。

7. 设计取舍:OOD 泛化的假设强度与可验证性

把这篇综述的方法谱系摊开看,会发现一个贯穿始终的取舍:假设越强,理论保证越漂亮,但可验证性越差;假设越弱,方法越通用,但越难说清它为什么 work。

因果学习和不变性优化假设存在稳定的因果机制或不变表示,理论上能给出 OOD 最优性的保证,但前提是因果图或环境划分正确——而这个前提本身在真实数据上很难验证。稳定学习和 DRO 的假设相对温和,实现也更轻,但它们只能处理假设范围内的偏移类型,超出范围就退化成普通 ERM。表示学习分支把先验写进特征,和下游解耦,灵活但缺乏端到端的保证。

我的判断是:选 OOD 方法时,先问清楚自己的分布偏移属于哪一类、有没有多域数据、测试域信息到底可不可得,再去看方法假设是否匹配。匹配不上,再漂亮的理论也只是纸面功夫。评估上,别只看平均值,按偏移类型和子群体拆开看,才能暴露真实短板。

从那以后我每次碰 OOD 相关的实验,都强制先把测试域隔离干净、把源域划分和偏移类型写清楚,再动手调方法——这一步省掉,后面所有指标都不可信。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表