不可知PAC学习:为何经验风险最小化是最优算法
2026/8/28 9:13:51 网站建设 项目流程

训练误差很低,但模型一上线就“翻车”,这类案例在工程里并不少见。常见的解释是“数据有噪声”或者“模型容量不够”,但很少有人从学习理论的角度追问一个更根本的问题:如果真实世界根本不按照我们假设的模型走,那么“学习”这件事到底还能不能保证成功?

这就是不可知PAC学习(Agnostic PAC Learning)要回答的问题。这篇文章想把理论拆开,讲清楚一个可能反直觉的结论:在不假设存在完美假设的情况下,只要假设类容量有限,经验风险最小化(ERM)就是样本复杂度意义上的最优算法。读完你会理解为什么训练误差不能作为模型好坏的唯一标准,也会用一段可以运行的Python代码,亲手验证泛化误差如何随样本量下降。

1. 为什么需要“不可知”PAC学习

传统PAC学习(Probably Approximately Correct Learning)由Valiant在1984年提出,它的核心设定是:存在一个目标概念函数,并且这个目标函数一定位于学习算法考虑的假设空间中。算法从样本中学习后,要有高概率输出一个误差小于某个阈值的假设。

这个设定有几个理想化条件:

  • 数据分布固定,训练和测试来自同一个分布。
  • 标签由某个真实函数生成。
  • 该真实函数在假设空间中。

但现实工程中,这三个条件几乎不可能同时满足。以分类任务为例:

  • 标签可能由人工标注,存在不可避免的噪声。
  • 数据的特征可能根本无法完全区分类别,比如两个样本特征相同但标签不同。
  • 我们选定的模型家族(比如线性分类器)很可能不包含真正的标签生成函数。

如果继续用经典PAC的框架去分析,结论会非常脆弱:一旦假设空间里不存在完美函数,理论上就无法保证学习成功。于是就有了更贴近实际的“不可知PAC学习”:

不假设存在一个零错误的完美假设,只假设存在一个“在假设类中表现最好”的假设。学习算法的目标是,以高概率输出一个假设,使其真实风险尽量接近这个最优假设的风险。

换句话说,不可知PAC允许“做不到最好”,但要求“尽量向最好的那个靠拢”。这个设定更符合机器学习在真实数据上的行为,也是统计学习理论中处理噪声和模型偏差的标准框架。

2. 最优的不可知PAC算法:就是经验风险最小化

很多人在第一次接触这个结论时都会觉得难以置信:理论上的最优算法,居然就是最简单的“在训练集上挑误差最小的假设”?

先给结论:在有限的假设空间或者有限VC维的假设类中,经验风险最小化(Empirical Risk Minimization,ERM)就是最优的不可知PAC算法。所谓“最优”,不是指它在任何数据集上都拿到最低误差,而是指它需要的样本数量达到了信息论意义下的下界,不会再有其他算法能在同样的样本规模下稳定地做得更好。

为什么是ERM?因为不可知PAC的目标是最小化风险:

[ R(h) = \mathbb{E}_{(x,y)\sim D}[\mathbb{1}[h(x) \neq y]] ]

但我们只能看到有限的训练样本,无法直接计算真实风险 (R(h))。ERM的做法很直接:用训练集上的经验风险 (\hat{R}(h)) 来逼近真实风险,然后选择经验风险最小的假设:

[ \hat{h}{\mathrm{ERM}} = \arg\min{h \in \mathcal{H}} \hat{R}(h) ]

从统计学习理论的角度看,ERM之所以是最优的,是因为它满足“一致性”和“最小最大最优性”。给定样本量 (m),任何算法的泛化误差都不可能低于某个信息论下界,而ERM恰好能达到这个下界的量级。这里的“最优”是指样本复杂度意义上的最优,不是指“每个数据集上都最准”。

这个结论并不依赖复杂的优化技巧,它依赖的是概率集中不等式:当样本量足够大时,训练误差会以高概率接近真实误差。而ERM选择训练误差最小的假设,自然也就选择了真实误差足够小的假设。

3. 样本复杂度:不可知设定比可实现设定贵在哪里

PAC学习中最重要的指标之一是样本复杂度,也就是为了达到预期精度和置信度,需要多少训练样本。在“可实现”(realizable)设定下,即假设类中存在完美假设时,ERM需要的样本量约为:

[ m = O\left(\frac{\ln |\mathcal{H}| + \ln(1/\delta)}{\varepsilon}\right) ]

而在不可知设定下,这个上界变成了:

[ m = O\left(\frac{\ln |\mathcal{H}| + \ln(1/\delta)}{\varepsilon^2}\right) ]

差别在于分母中 (\varepsilon) 变成了 (\varepsilon^2)。也就是说,当精度要求提高一个数量级时,可实现设定只需要样本量线性增长,而不可知设定需要平方级增长。

这个代价来自哪里?可以用一个直观例子理解。可实现设定下,学习算法只需要在所有误分类样本 “消失” 的假设中找到一个即可。不可知设定下,由于存在噪声,最优假设的经验风险不一定是最小的,甚至可能出现“多个假设经验风险接近最优”的情况。算法必须先确定哪些假设是真正优秀的,这需要更精细的估计,因此误差的方差对样本量的影响更强。

对于无限假设类,用VC维替代 (\ln |\mathcal{H}|)。只要假设类的VC维 (d) 有限,不可知PAC学习的样本复杂度就是:

[ m = O\left(\frac{d + \ln(1/\delta)}{\varepsilon^2}\right) ]

并且存在匹配的下界。这说明:

  • 一个假设类是否可学习,取决于VC维是否有限。
  • 在不可知PAC框架下,ERM达到了这个上界,因此是最优的。
  • 如果假设类无限且VC维无限,则不存在任何算法能以有限样本保证泛化。

表格对比一下两种设定的差异:

设定是否假设存在完美假设样本复杂度主要项对噪声的容忍
可实现PAC(\frac{\ln|\mathcal{H}|}{\varepsilon})不允许标签噪声
不可知PAC(\frac{\ln|\mathcal{H}|}{\varepsilon^2})允许任意标签噪声
不可知PAC + VC维(\frac{d}{\varepsilon^2})允许任意标签噪声

可以看到,不可知设定只是让“保证”更容易成立,但没有让“保证”更容易达成。它付出的代价,就是需要更多的样本。

4. 一个具体例子:带噪声的线性分类

为了把上面的理论落到代码里,我们构造一个最简单的不可知学习场景:

  • 二维平面上的点,真实标签由 (x_1 > 0) 决定。
  • 但标签有30%的概率被随机翻转,也就是说存在噪声。
  • 假设类是一组法向量角度不同的线性分类器,候选角度从0到(\pi)均匀采样。

在这个场景下,假设类中并不存在一个完美分类器。即使选到最优角度(0度),真实风险也会是0.3。因为标签本身有30%被随机翻转了,任何分类器都无法做到100%正确。

我们要验证的是:随着训练样本 (m) 增大,ERM选择的分类器的测试误差是否逐渐逼近0.3,并且误差下降的趋势符合不可知PAC的样本复杂度结论。

5. 环境准备与演示代码

本文的代码只需要标准Python数据科学库。建议创建一个虚拟环境,然后安装依赖:

mkdir agnostic_pac_demo cd agnostic_pac_demo python -m venv venv source venv/bin/activate pip install numpy matplotlib

5.1 计算有限假设空间的理论样本数

先写一个函数,计算有限假设空间下不可知PAC所需样本数的上界。这个函数的依据是Hoeffding不等式加并集界。

import numpy as np def sample_complexity_finite(M: int, eps: float, delta: float) -> int: """ 有限假设空间下,不可知PAC学习所需样本数的上界。 M: 假设个数 eps: 泛化误差允许的最大差距 delta: 失败概率 """ return int(np.ceil((np.log(M) + np.log(2.0 / delta)) / (2.0 * eps**2))) # 示例:100个假设,期望误差差距不超过0.1,置信度0.95 m_needed = sample_complexity_finite(M=100, eps=0.1, delta=0.05) print(f"理论上需要的样本数: {m_needed}")

这里使用了并集界,代价是假设个数 (M) 进入对数项。也就是假设类越大,需要样本越多,但是增长速度只是对数量级。

5.2 生成带噪声的合成数据

接下来定义一个数据生成函数。注意这里故意引入了标签噪声,使场景变为不可知。

def make_data(n_samples: int, noise: float = 0.3, seed: int = None): """ 生成二维数据,真实标签为 x1 > 0,但以 noise 概率翻转标签。 返回 X (n, 2) 和 y (n,),y 取值为 0 或 1。 """ rng = np.random.default_rng(seed) X = rng.uniform(-1, 1, size=(n_samples, 2)) y_true = (X[:, 0] > 0).astype(int) flip = rng.random(n_samples) < noise y_noisy = np.where(flip, 1 - y_true, y_true) return X, y_noisy

在这个设定中,真正的标签生成函数是“看第一维是否大于0”。但由于噪声,数据分布中已经有30%的标签是错的。任何分类器在完美边界上的期望误差都不低于0.3,这就是“最优假设”的风险。

5.3 实现ERM并评估泛化误差

我们实现一个简单的ERM:在候选角度里,选择训练集误差最小的那个分类器,然后用独立的测试集估算它的真实风险。

def evaluate_erm(sample_sizes, M=60, noise=0.3, trials=50): """ 对每个样本量,重复 trials 次实验,返回平均测试误差。 """ # 候选角度,不包括 pi,避免与 0 表示同一决策面 thetas = np.linspace(0, np.pi, M, endpoint=False) def risk_of_theta(theta, X, y): pred = (X[:, 0] * np.cos(theta) + X[:, 1] * np.sin(theta) > 0).astype(int) return np.mean(pred != y) results = [] for m in sample_sizes: er_risks = [] for trial in range(trials): X_train, y_train = make_data(m, noise, seed=1000 + trial) # ERM:选择训练误差最小的角度 best_theta = min(thetas, key=lambda th: risk_of_theta(th, X_train, y_train)) # 独立测试集 X_test, y_test = make_data(5000, noise, seed=2000 + trial) test_risk = risk_of_theta(best_theta, X_test, y_test) er_risks.append(test_risk) results.append(np.mean(er_risks)) return results sample_sizes = [10, 20, 50, 100, 200, 500, 1000] avg_risks = evaluate_erm(sample_sizes, M=60, noise=0.3, trials=20) for m, risk in zip(sample_sizes, avg_risks): print(f"m={m:4d}, 平均测试误差={risk:.4f}")

运行这段代码,你会看到:

  • 当训练样本很少时(比如10个),ERM选出的角度可能不稳定,测试误差明显高于0.3。
  • 随着样本量增大,测试误差逐渐接近0.3。
  • 逼近速度在样本量较小时增快,随后变缓,这与 (\frac{1}{\varepsilon^2}) 的样本复杂度曲线形状一致。

这就是不可知PAC学习在实践中的体现:ERM在有限假设类上,虽然没有找到完美分类器,但确实在朝最优分类器收敛。

6. 运行结果与效果验证

上面的实验可以用输出结果判断是否成功:

  • 如果每个样本量下运行多次后,平均误差稳定在0.30左右,说明ERM在接近最优假设。
  • 如果样本量很小(如10),平均误差明显高于0.35,不需要担心,这是样本不足导致的正常波动。
  • 如果样本量到了1000,平均误差仍然高于0.35,则说明代码或候选角度范围有问题。

建议先跑sample_complexity_finite函数,确认理论样本数与实验样本量在同一量级。比如当 (M=60, \varepsilon=0.1, \delta=0.05) 时,理论上需要几百个样本。实验中的样本量覆盖10到1000,正好可以看到“不足”和“足够”两个阶段。

如果运行失败,按下面顺序依次检查:

  • 是否安装了numpy和matplotlib。
  • 是否在虚拟环境中运行。
  • 代码缩进是否正确。
  • 如果np.random.default_rng报错,需要numpy版本在1.17以上。

7. 常见问题与排查思路

问题现象可能原因排查方式解决方案
样本量增大但测试误差不下降标签噪声过大,最优风险本身很高计算训练集标签翻转比例用无噪声数据对比,确认是否是噪声导致的理论下界
ERM在样本小时非常不稳定训练样本太少,候选假设过多打印每个角度的经验误差,观察是否有多解增加样本量,或减少候选角度M
测试误差始终高于理论最优测试集中的噪声导致无法达到零误差设置 noise=0 运行实验如果 noise=0 时误差接近0,说明代码正确
运行需要很长时间候选角度过多或trials过大降低M和trials观察趋势先用 M=20, trials=10 跑通,再加大

这些问题的共同核心是:不可知PAC只能保证“接近最优”,不能保证“达到最优”。实验里看到误差停在0.3附近,不是模型坏了,而是问题本身的最优风险就是0.3。

8. 从理论到工程:这些结论对实际项目意味着什么

理论结论看起来和“调参、训练、上线”的日常相隔很远,但仔细想想,它其实在解释很多工程现象。

第一,模型容量的选择决定了“假设类”的大小。在有限假设空间里,ERM有明确的泛化界;但如果把假设类无限扩大,比如不加限制地使用超大规模神经网络,VC维很大,样本复杂度也会变得非常大。这时就需要依赖隐式正则化、数据增强、预训练等手段,等效地缩小假设类。

第二,验证集的本质是“在更大的假设类上做ERM”。如果你把验证集反复用于模型选择,其实相当于把候选模型集合扩大,最终选择的模型可能过度拟合验证集。这是为什么需要单独的测试集,也是为什么嵌套交叉验证更可靠的原因。

第三,噪声并不是“坏数据”那么简单。在不可知PAC框架下,噪声决定了最优风险的下界。即使把模型调到最好,误差也不可能低于数据本身的噪声水平。因此,当线上表现接近某个平台期时,与其一味调模型,不如回头检查数据标注质量和特征区分度。

第四,ERM最优并不意味着“训练误差最小就一定最好”。注意最优性成立的前提是固定假设类,并且样本量足够。如果样本量不足,ERM依然可能过拟合。实际工程中,样本量、模型容量和正则化需要一起考虑。

这些都是不可知PAC理论给我们的工程启示:它没有给出一个神奇的算法,却给出了判断算法是否可靠的标尺。

9. 总结与后续学习方向

这篇文章从头梳理了不可知PAC学习的最核心结论:

  • 不可知设定不假设存在完美函数,只要求逼近最优假设。
  • 经验风险最小化在有限假设类上是最优的不可知PAC算法。
  • 样本复杂度为 (O((\ln|\mathcal{H}|+\ln(1/\delta))/\varepsilon^2)),比可实现设定多付出 (1/\varepsilon) 的代价。
  • 通过带噪声数据的实验,可以看到ERM确实在样本量增加时逼近最优风险。

如果还想继续深入,可以先从两个方向入手。一是学习VC维与泛化误差界的推导,理解为什么“假设类复杂度”会进入样本复杂度公式。二是阅读Valiant的PAC学习原始论文和Vapnik的统计学习理论相关章节,了解理论结果成立的基础假设。理解不可知PAC之后,再去看Boosting、正则化、迁移学习等话题时,你会更容易判断一个方法在什么条件下有效,在什么条件下只是经验上的“碰巧有效”。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询