ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Agnostic PAC学习与ERM:有限样本下最优泛化误差的理论与实践

2026/8/28 3:08:18 拓冰建站 浏览量
Agnostic PAC学习与ERM:有限样本下最优泛化误差的理论与实践 在传统监督学习项目中我们经常默认“数据是由某个已知模型生成的”然后去训练一个分类器拟合它。但真实业务里噪声、特征缺失、标签错误、分布偏移都让这个假设变得十分脆弱。Agnostic PAC不可知PAC正是为了打破这种理想化假设而出现的框架它不要求存在一个理想函数在假设类中只要求学习算法尽可能逼近假设类内最优模型的效果。本文围绕“An Optimal Agnostic PAC Algorithm”这一主题从数学定义、ERM算法、样本复杂度、Python模拟到实践建议做一次系统拆解适合刚接触计算学习理论、想理解“有限样本为什么能泛化”的读者。1. 背景与核心概念1.1 从PAC到Agnostic PACPACProbably Approximately Correct学习理论由Valiant在1984年提出它用概率语言回答了一个非常根本的问题给定多少样本才能让学习到的模型以较高概率接近最优模型在经典PAC设定中我们通常假设输入空间 (X) 中的样本按某个未知分布 (D_X) 独立同分布采样存在一个目标概念 (c \in H)使得所有样本标签 (y c(x))学习算法输出一个假设 (h)希望在大多数情况下满足 (L_D(h) \le \epsilon)。这里的“Probably”对应置信度 (1-\delta)“Approximately Correct”对应误差不超过 (\epsilon)。这套理论非常优美却有一个很强的前提数据标签必须由假设类中的某个概念无噪声生成。现实项目中这个前提几乎不可能满足。Agnostic PAC去掉了这个限制。它不再关心数据是否来自某个理想概念而是允许数据分布 (D) 是任意的标签与输入之间甚至可以是随机关系。学习算法的目标变为找到假设 (h)使它的泛化误差不比假设类 (H) 中任意假设的最优误差差太多。简单说标准PAC要求“找到正确答案”Agnostic PAC要求“在候选模型里做到尽量不输”。1.2 Agnostic PAC的正式定义为了后续推导我们需要用数学语言定义Agnostic PAC学习。令 (X) 为输入空间(Y {0,1})本文以二分类为例。令 (D) 为 (X \times Y) 上的未知联合分布。假设类 (H) 是从 (X) 到 (Y) 的映射集合。定义假设 (h) 的泛化误差[ L_D(h) \mathbb{P}_{(x,y) \sim D}[h(x) \ne y] ]给定训练集 (S {(x_1,y_1),...,(x_m,y_m)})每个样本独立同分布取自 (D)。定义经验误差[ L_S(h) \frac{1}{m}\sum_{i1}^m \mathbb{1}[h(x_i) \ne y_i] ]Agnostic PAC学习器的要求是存在一个样本复杂度函数 (m_H(\epsilon,\delta))使得对任意分布 (D)、任意 (0\epsilon,\delta1)、任意 (m \ge m_H(\epsilon,\delta))学习算法 (A) 输出的假设 (h_S) 满足[ L_D(h_S) \le \min_{h \in H} L_D(h) \epsilon ]并且该不等式以至少 (1-\delta) 的概率成立。这里最关键的一点是(D) 可以是任意分布甚至可以是标签完全随机、可任意复杂的分布。算法不需要恢复某个“真实概念”只需要逼近假设类中最佳模型的误差。1.3 为什么需要“最优”算法计算学习理论中“最优”通常有两个维度样本复杂度和计算复杂度。Agnostic PAC框架下我们希望找到一种算法在给定相同样本量时达到最小可能的泛化误差或者反过来说达到相同误差所需样本量尽量少。对于有限假设类经验风险最小化ERM被证明是样本复杂度最优的算法之一。它的思路很直白从模型集合中挑出在训练集上误差最小的那个假设。这个“简单粗暴”的算法不仅在理论上达到最优数量级而且实现容易也是很多实际机器学习算法如逻辑回归、支持向量机、决策树的雏形。需要说明的是本文讨论的“最优”主要指minimax样本复杂度最优而不是说ERM在所有场景下都表现完美。过度拟合等问题依然存在但其理论保障是清晰的。2. 数学与符号准备2.1 数据集与损失函数本文统一采用0-1损失即判断错误一次计1次loss。0-1损失最直观也与分类准确率直接对应。虽然它不可导给优化带来难度但在理论分析中它表达泛化误差非常自然。给定训练集 (S)我们关心两类误差训练误差经验误差 (L_S(h))模型在训练集上的错误比例。测试误差泛化误差 (L_D(h))模型在整个分布上的期望错误比例。在Agnostic设定中我们还会关心所谓的“误差差距”[ L_D(h) - \min_{h \in H} L_D(h) ]这个差距越小说明算法越接近假设类允许的最佳性能。2.2 泛化误差与经验误差的关系机器学习泛化的核心本质上是在问为什么训练集上的表现可以代表未知分布上的表现这依赖一个关键性质当样本量足够大时训练集中每个假设的经验误差都会接近其泛化误差。如果假设类规模有限我们可以用联合界Union Bound把这个问题变成一系列概率事件的叠加。具体来说对于任意一个固定假设 (h)Hoeffding不等式给出[ \mathbb{P}\left(|L_S(h) - L_D(h)| t\right) \le 2\exp(-2mt^2) ]也就是说单个假设的经验误差偏离真实误差超过 (t) 的概率指数级下降。接下来对有限假设类中所有 (h) 取联合界就能得到一致收敛结果。2.3 概率不等式工具Hoeffding不等式是Agnostic PAC分析的主要工具之一。它适用于有界随机变量。在二分类0-1损失中每个样本的损失要么0要么1正好满足有界条件。如果需要说明为什么用Hoeffding而不是Chernoff可以理解Chernoff通常用于泊松实验的尾概率Hoeffding直接面向有界独立随机变量的和证明界面更简洁。实际推导中两者都可得到类似数量级的界。接下来所有推导都围绕如下逻辑展开证明假设类中所有假设的经验误差一致收敛到泛化误差。利用ERM的最优性把 (L_D(\hat h)) 与 (\min_H L_D(h)) 关联起来。3. 最优Agnostic PAC算法经验风险最小化3.1 ERM算法定义与直觉ERM的完整定义是[ \hat h \arg\min_{h \in H} L_S(h) ]也就是在给定的假设集合中选择训练误差最小的那个假设。如果多个假设的训练误差相同可以任意选一个例如通过特定规则确定。为什么ERM在Agnostic PAC中有效直觉是训练误差最低的假设未必是泛化误差最低的假设但当样本量足够大时训练误差会逼近泛化误差。此时训练误差最低的假设其泛化误差也会接近最优水平。误差传递链条非常清晰[ L_D(\hat h) \le L_S(\hat h) \frac{\epsilon}{2} ][ L_S(\hat h) \le L_S(h^) \le L_D(h^) \frac{\epsilon}{2} ]合并后得到[ L_D(\hat h) \le L_D(h^*) \epsilon ]其中 (h^* \arg\min_{h\in H} L_D(h)) 是假设类中真正的泛化最优假设。3.2 有限假设类下的样本复杂度上界我们先讨论有限假设类。设 (|H|N)对于任意 (h\in H)由Hoeffding不等式[ \mathbb{P}\left(|L_S(h) - L_D(h)| t\right) \le 2\exp(-2mt^2) ]对所有假设取联合界[ \mathbb{P}\left(\sup_{h\in H}|L_S(h) - L_D(h)| t\right) \le 2N\exp(-2mt^2) ]令上式等于 (\delta)解得[ t \sqrt{\frac{\ln(2N/\delta)}{2m}} ]也就是说至少有 (1-\delta) 的概率所有假设的经验误差与泛化误差之差不超过 (t)。此时如果希望 (t \le \epsilon/2)需要[ m \ge \frac{2\ln(2N/\delta)}{\epsilon^2} ]等价地取 (m \ge \frac{\ln(2N/\delta)}{2(\epsilon/2)^2})即[ m \ge \frac{\ln(2N/\delta)}{2(\epsilon/2)^2} \frac{2\ln(2N/\delta)}{\epsilon^2} ]忽略常数因子时可以简写为[ m O\left(\frac{\log(N/\delta)}{\epsilon^2}\right) ]这就是有限假设类下ERM的样本复杂度上界。3.3 最优性匹配的下界理论分析不能只给上界还要说明这个界不能进一步显著改进。简单起见可考虑一个由两个仅在某处不同的假设组成的假设类。为了分辨哪个假设更优学习算法必须从样本中获得足够信息而信息论下界告诉我们至少需要 (\Omega(\log N/\epsilon^2)) 个样本。更具体地说对于任意学习算法存在一个分布使得其误差差距超过 (\epsilon) 的概率大于 (\delta)除非样本量达到上述下界。因此ERM在常数因子范围内是样本复杂度最优的。这个结论说明在有限假设类的Agnostic PAC设定中ERM就是“最优算法”的代表。3.4 从有限类到VC维类现实中的假设类通常是无限的例如高维线性分类器。此时不能直接使用联合界。我们需要引入VC维Vapnik-Chervonenkis dimension来衡量假设类的表达能力。如果假设类 (H) 的VC维为 (d)则一致收敛界变为[ m \ge C \cdot \frac{d \ln(1/\delta)}{\epsilon^2} ]其中 (C) 是某常数。这个界同样由ERM实现且在分布无关情形下是最优的。也就是说VC维替代了 (\log N)成为量化假设类复杂度的核心指标。当假设类VC维有限时Agnostic PAC学习是可行的当VC维无限时不存在分布无关的学习保证。4. 完整算法与证明思路4.1 算法伪代码下面给出一个基于ERM的Agnostic PAC算法伪代码。它假设假设类 (H) 是有限的并且可以枚举。算法Agnostic PAC ERM 输入训练集 S {(x_i, y_i)}_{i1}^m有限假设类 H 输出假设 h_S ∈ H 过程 1. 初始化 best_loss ∞best_h None 2. 遍历 H 中的每个假设 h a. 计算经验误差 L_S(h) (1/m) Σ 1[h(x_i) ≠ y_i] b. 如果 L_S(h) best_loss - 更新 best_loss L_S(h) - 更新 best_h h 3. 返回 best_h该算法的时间复杂度为 (O(m \cdot |H|))。假设类越大训练时间越长样本量越大计算经验误差的开销也越大。4.2 泛化误差界证明这里给出一个简短但完整的证明思路帮助读者理解ERM为什么成立。首先由一致收敛性质以概率至少 (1-\delta)对所有 (h \in H) 同时成立[ |L_S(h) - L_D(h)| \le \sqrt{\frac{\ln(2N/\delta)}{2m}} ]令该上界为 (\gamma)。设 (h^* \in H) 是分布最优假设即 (L_D(h^*) \min_{h\in H} L_D(h))。设 (\hat h) 是ERM输出。那么[ L_D(\hat h) \le L_S(\hat h) \gamma ]因为 (\hat h) 在训练集上误差最小所以 (L_S(\hat h) \le L_S(h^))。而 (L_S(h^) \le L_D(h^*) \gamma)。将三式合并得到[ L_D(\hat h) \le L_D(h^*) 2\gamma ]为了使 (2\gamma \le \epsilon)可以取[ m \ge \frac{2\ln(2N/\delta)}{\epsilon^2} ]因此ERM是Agnostic PAC学习器。证明中关键的“三角不等式”用得非常优雅先通过一致收敛把未知分布和有限样本拉近再通过ERM的“最小经验误差”性质把两个假设的误差串联起来。4.3 算法复杂度分析样本复杂度方面有限假设类下为 (O\left(\frac{\log(N/\delta)}{\epsilon^2}\right))这个数量级是minimax最优的。计算复杂度方面枚举所有假设需要 (O(mN))。如果N巨大或无限直接枚举不可行需要借助凸优化、梯度下降或集成方法在受限子类上近似ERM。值得一提的是虽然ERM的理论最优性非常漂亮但它没有告诉我们在计算资源有限时怎么做。实践中我们通常只能在一个可优化的参数化家族中搜索而非整个假设类。这种“近似ERM”也是很多工业级算法的基础。5. Python模拟演示5.1 环境准备为了直观展示Agnostic PAC中ERM的行为我们用Python做一个简单实验。实验不依赖特殊库只需要numpy和sklearn的基类工具。Python 3.8numpy 1.21scikit-learn 0.24如果环境没有安装可以执行pip install numpy scikit-learn本文示例代码建议保存在一个完整的Python文件中运行也可以复制到Jupyter Notebook逐段执行。5.2 生成模拟数据我们构造一个“不干净”的二分类问题真实标签由阈值 (x 0.4) 决定但以10%的概率翻转标签。这样平面上的最优分类器误差不可能低于0.1这就是不可知部分——没有任何阈值分类器能达到0误差。import numpy as np def generate_data(n, threshold0.4, flip_prob0.1, seedNone): if seed is not None: np.random.seed(seed) X np.random.uniform(0, 1, sizen) y (X threshold).astype(int) mask np.random.rand(n) flip_prob y[mask] 1 - y[mask] return X.reshape(-1, 1), y这里返回的X是一个二维数组便于后续扩展模型y是0/1标签。可以看到我们并没有假定模型知道 threshold0.4而是让它从数据中学习。5.3 实现有限假设类与ERM我们用阈值分类器构成一个有限假设类。候选阈值取0.1到0.9之间的9个值每个阈值还允许翻转预测方向因此假设类大小为18。from sklearn.base import BaseEstimator, ClassifierMixin class ThresholdClassifier(BaseEstimator, ClassifierMixin): def __init__(self, threshold0.5, flipFalse): self.threshold threshold self.flip flip def predict(self, X): pred (X self.threshold).astype(int) if self.flip: pred 1 - pred return pred接下来是ERM算法本体。它遍历所有候选阈值和翻转方向选择训练误差最小的假设class ThresholdERM: def __init__(self, thresholdsNone): if thresholds is None: self.thresholds np.linspace(0.1, 0.9, 9) else: self.thresholds thresholds def fit(self, X, y): best_h None best_loss np.inf h_cache [] for t in self.thresholds: for flip in [False, True]: h ThresholdClassifier(t, flip) loss np.mean(h.predict(X) ! y) if loss best_loss: best_loss loss best_h h h_cache.append((t, flip, loss)) self.best_h best_h self.best_loss best_loss self.h_cache_ h_cache return self def predict(self, X): return self.best_h.predict(X)注意这里为了演示简单直接遍历了阈值。实际项目中如果假设类无法枚举需要改成梯度下降等方式。5.4 运行与结果解读我们用不同样本量运行ERM观察选择的阈值和最小经验误差sizes [20, 50, 200, 800, 3000] for n in sizes: X, y generate_data(n, seed42) model ThresholdERM().fit(X, y) t model.best_h.threshold flip model.best_h.flip print(fn{n:5d}, 选择阈值{t:.2f}, flip{flip}, 训练误差{model.best_loss:.3f})一种可能的输出如下实际结果受随机种子影响但趋势类似n 20, 选择阈值0.40, flipFalse, 训练误差0.050 n 50, 选择阈值0.40, flipFalse, 训练误差0.100 n 200, 选择阈值0.40, flipFalse, 训练误差0.095 n 800, 选择阈值0.40, flipFalse, 训练误差0.104 n 3000, 选择阈值0.40, flipFalse, 训练误差0.098可以看到随着样本量增加ERM选出的阈值稳定在0.4附近训练误差稳定在10%附近。这正是Agnostic PAC期望的行为算法并不强迫自己达到0误差而是逼近假设类内的最优误差0.1。这里需要特别说明因为生成数据时用了10%翻转噪声所以任何一个固定阈值的泛化误差至少是0.1。训练集上的误差会因为噪声和有限样本而波动但理论上不会大幅度低于0.1尤其是样本量增大之后。6. 常见问题与理解误区6.1 ERM一定会过拟合吗ERM没有正则化在假设类很大、样本量不足时确实容易过拟合。例如让假设类包含大量复杂决策树训练误差可能为0但泛化误差很高。Agnostic PAC理论中的样本复杂度边界给出了“不严重过拟合”所需的样本量。实际工程中为了在有限数据上运行我们会用正则化、交叉验证、早停等手段控制有效模型复杂度而不是直接枚举所有可能函数。6.2 Agnostic PAC是否要求假设类包含真实模型不要求。Agnostic这个名字就提醒我们数据分布可能是任意复杂的可能没有一个假设可以同时拟合所有样本甚至接近完美。学习目标始终是逼近 ( \min_{h\in H} L_D(h) )而不是“找到真相”。因此即便你的模型集合里没有真实决策函数只要它能做到“相对最优”就算成功。6.3 样本复杂度中的常数重要吗理论复杂度一般保留常数但实际调参会遇到。比如 (m O(\log(N/\delta)/\epsilon^2)) 中的常数2或1/2会影响训练所需样本量。实际项目中我们通常用验证集调参然后观察验证曲线是否收敛而不是精确套用理论常数。理论的价值在于给出一致的数量级和参数依赖方向。6.4 为什么不是“交叉验证”交叉验证本身是评估和选择模型的工具它并不改变ERM的核心策略。交叉验证可以看成在多个训练子集上重复执行经验风险最小化再平均评估。它有助于减小方差和参数选择偏差但理论分析通常针对单次ERM。理解ERM的最优性是理解交叉验证有效性的理论基础之一。6.5 0-1损失不可导怎么使用ERM这是理论分析与实际优化的关键差距。实际分类模型常使用交叉熵、hinge loss等代理损失它们是0-1损失的连续近似便于梯度下降。不过代理损失改变了原问题不一定保留原最优性。理论中讨论ERM时仍然以0-1损失为基准实际优化时可以把代理损失看作一种近似实现。6.6 最优算法是否意味着“任何情况下最优”不是。理论“最优”通常是minimax意义下的最优即面对最坏分布时能达到最佳样本复杂度。在某个特定分布上可能有其他算法利用分布特有结构比ERM更好例如加入先验或正则化的贝叶斯方法。Agnostic PAC回答的是“在没有任何附加假设时我们能做到多好”而不是“在所有数据集上都最好”。7. 工程实践建议7.1 从理论到实际调参理解Agnostic PAC后调参时应该主动区分“模型类别内最优”和“全局最优”。当你面对一个模型迟迟无法降低验证误差时不要盲目调参而是先判断误差是否已经接近假设类的极限。如果接近说明该换模型族或增加特征如果还差很远说明训练过程没有逼近ERM可以继续优化目标函数、学习率或正则化系数。7.2 如何选择假设类根据Agnostic PAC假设类越复杂样本复杂度越高假设类太简单误差下界 ( \min_H L_D(h) ) 可能很大。这构成了一个偏差-方差权衡复杂类有更好的“最优潜力”但需要更多样本保证收敛。实践中最常见的错误是追求模型复杂度而忽略样本量。可以用一个简单原则样本量增大时可以考虑扩大假设类样本量受限时保守模型更稳定。7.3 异常处理与边界情况在实现ERM或其他学习算法时有几个边界情况需要注意。第一训练集为空时需要定义默认假设否则算法会崩溃。第二多个假设拥有相同最小经验误差时需要定义确定性选取规则避免随机输出导致结果不可复现。第三如果假设类中存在重复假设应该去重否则联合界中的 (N) 虚高理论上会过高估计样本需求。7.4 安全与合规提醒虽然Agnostic PAC是理论框架但在实际数据建模中仍然要遵守工程伦理与数据安全要求。本文中的模拟数据是随机生成的不涉及真实用户隐私。如果读者在真实业务中应用需要注意数据采集要获得合法授权标签标注可能有主观偏差Agnostic假设更符合实际情况模型上线前要在测试集上验证最好保留回滚机制不要单纯追求训练集性能而忽略模型鲁棒性和沉默故障。性能评估时建议同时计算准确率、精确率、召回率、F1等指标并切分训练集、验证集、测试集。虽然0-1损失便于理论分析但真实业务往往需要权衡不同错误的代价。8. 总结与下一步学习方向本文围绕“An Optimal Agnostic PAC Algorithm”展开核心结论可以浓缩为三条第一Agnostic PAC不假设数据存在理想目标概念只要求学习算法逼近假设类内的最优误差这一框架更贴近真实业务中的噪声和偏差。第二有限假设类下经验风险最小化ERM是一个样本复杂度最优的Agnostic PAC算法其复杂度为 (O(\log(N/\delta)/\epsilon^2))。第三无限假设类时需要用VC维替代 (\log N)样本复杂度变为 (O((d\log(1/\delta))/\epsilon^2))ERM依然是一种可证明的学习规则。如果希望继续深入建议按以下顺序阅读先吃透Hoeffding不等式和联合界推导这是理解一致收敛的基础再学习VC维定义与Sauer-Shelah引理理解无限假设类的复杂度刻画然后看Rademacher复杂度它比VC维更精细能处理更多损失函数最后可以把目光投向随机梯度下降、正则化、boosting等算法从“近似ERM”的角度观察它们与理论最优性的距离。理论学习的价值不在于直接得到一份“调参模板”而在于建立对模型泛化能力的直觉。当你遇到一个分类器在测试集上表现突然变差时Agnostic PAC会提醒你先检查是样本不够还是模型复杂度过高还是最优假设本身就不够好带着这些问题去跑实验会比盲目堆模型更有收获。建议你亲手把第5节的Python模拟扩展一下把阈值候选数量增加、把噪声比例提高、对比不同样本量下的误差曲线。你会发现理论边界虽然保守但趋势与实验结果高度一致。这就是计算学习理论最迷人的地方。