☰
从Growth Function到VC维:理解模型复杂度与泛化界限
2026/10/15 20:13:17 网站建设 项目流程

机器学习理论里,很多人在growth function和VC-Dimension这两个概念上栽过跟头。书读了好几遍,公式也抄了,但总觉得隔着一层纱:这东西到底在解决什么问题?为什么非要绕这么大一圈去定义一个“维数”?我的经验是,直接上手算几个例子,比死磕证明有用得多。

这篇文章就围绕第三章第二部分的核心脉络展开,把 growth function 怎么来的、VC维怎么算的、以及它们和“学习可行吗”这件事的关联讲透。如果你目前正好卡在这两页纸上,或者准备面试、复现论文时需要补这块底子,这篇内容应该能帮上忙。

1. Why Growth Function:从有限假设空间到无限假设空间的跨越

1.1 有限假设空间的“安全区”与它的天花板

第三章前面部分已经建立了一个重要结论:当假设空间是有限集时,学习是可行的。那个结论依赖 Union Bound 和 Hoeffding 不等式,最后得到的是一个“训练误差和泛化误差的差距不会太大”的保证。这个保证很干净,但它有一个天然的软肋——如果假设空间是无限的,Union Bound 就失效了。

你总不能对无穷多个假设做求和吧?但这并不意味着我们要放弃理论分析。关键的想法在于:虽然假设空间有无限多个元素,但真正“起作用”的假设,在有限样本上表现出来的行为种类是有限的。这就是 growth function 出现的最根本动机。

1.2 从“假设数量”到“二分数量”的思维转换

Growth function 的定义看起来很简单:给一个假设集合 H,在 m 个样本上,最多能产生多少种不同的标签分配方式?这里的关键词是“不同的”。假设集合本身再怎么大,落到有限个点上的时候,能区分的模式数总会受限。

理解这个转变需要先放下“参数数量”的直觉。一个线性分类器有无限多个参数组合,但在三个不共线的点上有多少种分法?无非 8 种。所以衡量假设空间复杂度的单位不应该是“有多少个函数”,而应该是“它能对多少个有限点集打出多少种标签组合”。这个值,就是 growth function。

1.3 为什么说 growth function 能掌控无限假设的“有效规模”

很多初学者会问:growth function 不也还是可能指数增长吗?是的,但它有一个非常重要的性质——对于任意假设空间,growth function 要么始终指数增长,要么在某个点之后转为多项式增长。这个“要么”的分界,就引出了 VC 维。换句话说,growth function 提供了一个从“无限”到“有限”的桥梁,它让我们可以继续沿用之前有限假设空间那套分析工具,只是把“假设个数”换成“有效二分个数”。

一条实用的记忆线索:growth function 衡量的是“表达能力在样本口径下的上限”。它不直接告诉你某个算法好不好,但它告诉你这个假设空间在数据规模增长时会不会“失控”。

2. Shatter 与 VC-Dimension:break point 如何定义复杂度边界

2.1 “打散”的直观理解:在 m 个点上能演出所有戏

Shatter(打散)这个词刚开始接触时特别容易误解。它不是说一个假设能把数据“分得很开”,而是说:给定 m 个样本点,这 m 个点的所有 2^m 种标签组合,假设空间都能给出至少一个假设来实现。换句话说,对任意一种 label 配置,都存在某个 h,让预测结果完全吻合。

为了建立直觉,我把它类比成一个“班级分座次”的问题。m 个学生,每一种“谁坐左、谁坐右”的安排都能被某个规则说出来,那我们说这个规则集打散了这 m 个学生。但如果有一个安排始终说不出来,哪怕只有一种,这 m 个点就打不散。

打散是一个非常强的条件。它的强不在于“某个组合能实现”,而在于“所有组合都能实现”。这意味着假设空间的表达能力覆盖了样本点上全部的信息模式。

2.2 VC-Dimension:第一次出现“打不散”的那个点数

定义也很简单:VC 维是能被打散的最大样本点数。更精确地说,如果存在某个大小为 d 的点集能被 H 打散,且任何大小为 d+1 的点集都不能被完全打散,那么 VC 维就是 d。

这里有个细节值得圈出来:定义说的是“存在”某个 d 个点的集合,而不是“所有”d 个点的集合。换句话说,只要你能在平面上找到 3 个点,它们可以被某个二维线性分类器打散,那么 VC 维至少是 3。哪怕你同时能找到另外 3 个点打不散,也不影响这个下界。反过来的上界则需要“所有 d+1 个点的集合都不能被打散”。

这个“存在 vs 所有”的区分,是做题和理解概念时最容易搞混的地方。很多证明卡壳,都因为在这个逻辑上绕了进去。

2.3 为什么 VC 维能划分“可学习”和“不可学习”

回到之前说的“要么指数增长、要么多项式增长”,VC 维就是决定转折的那个点。当 m 小于等于 VC 维时,growth function 可以是指数的;但当 m 超过 VC 维之后,growth function 就被锁死在 m 的多项式函数以内。这个多项式上界正是泛化误差分析的基础。

用大白话讲:如果你的假设空间 VC 维是有限的,那么它再“大”,在数据变多时有效复杂度也不会爆炸,泛化差距能收到可控范围。“无限假设空间不可学习”这句话的准确版本是——如果 VC 维无限,那就真的不可学习;但如果 VC 维有限,学习仍然是可行的。

提示:这里值得暂停一分钟自己推一遍“为什么 VC 维有限就能控制 growth function”,而不是直接背结论。我当时把一个简单的筛法例子手推了一遍之后,对 Sauer 引理的理解完全不同了。

3. 手算 VC 维:三个例子帮你建立尺寸判断力

3.1 一维区间分类器:从“能塞几个点”开始

先举最经典的例子:在一维实数轴上,假设空间是所有闭区间 [a,b](a≤b),大于等于 a 且小于等于 b 的样本点标为正类,否则标为负类。问:VC 维是多少?

答案是 2。能打散两个点吗?能。任取两个点 x1<x2,四种标签组合:正正(区间覆盖两个点)、负负(区间选在两点外侧)、正负(区间只盖住 x1)、负正(区间只盖住 x2),全部可以通过平移区间实现。

三个点就行不通了。原因其实很直观:三个点的标签“正、负、正”无论如何都分不出来。因为区间是连续的,如果 x1 和 x3 都是正,区间 [a,b] 必须横跨 x1 到 x3,那么中间的 x2 也必然落入区间,没法变负。

这个例子虽然简单,但非常适合用来建立“为什么打散需要覆盖全部组合”的认知。多试几次你就会发现,判断 VC 维的难点通常不在构造“能打散”的组合,而在论证“更大点数决不可能”。

3.2 二维线性分类器:3 个点很顺,4 个点开始出问题

二维平面上,假设空间是所有的线性分类面(穿过原点的或任意方向的,取决于你的定义)。如果限制直线必须过原点,VC 维是多少?答案是 2。3 个点里,只要它们和原点共线排列或者分布特殊,你就找不到那条过原点的分割线。

但如果放宽到任意方向的直线,VC 维就是 3。三个不共线的点:任意三个点,任何标签组合都能找到一条直线把它们分开。4 个点呢?不管你怎么摆,都找不到能应对“异或模式”(一个对角是正类、另一个对角是负类并交错排列)的直线。

这个“4 个点失败”的直觉比三维空间里的证明更有价值。因为它揭示了一个核心规律:线性分类器的表达能力受限于维度,而“打散”这个概念精准地捕捉了这个上限——每增加一个可打散的点,假设空间的表达层数就增加一档。

3.3 高维超平面与参数数量的“不等号”

一般地,在 d 维空间里,方向任意的超平面分类器 VC 维是 d+1。这是一个被反复使用的结论,一个非常典型的记忆锚点。

但这里必须单独强调:VC 维通常等于参数数量,但不总是等于,也未必小于参数数量。比如某个假设空间有 2 个参数但 VC 维可以是无限大(比如正弦函数族 sin(ax + b),你甚至可以打散任意多的点)。所以在实际工程中,一些人习惯用“参数越多模型越复杂”来衡量风险,这个方向大体不错,但严谨意义上说,真正决定泛化边界的不是参数个数,而是 VC 维。

高维超平面这个结论本身不难,难的是理解它的证明思路:先构造 d+1 个点(通常取标准基向量加原点)证明下界,再用线性代数的秩约束或者 Radon 定理证明上界。如果你做深度学习研究,这个结论常在分析最后一层分类头的表达能力时被借用。

4. 从 Growth Function 到泛化界:VC 维如何真正“落地”

4.1 对称化技巧:理论推导中非常聪明的一步

有了 growth function 和 VC 维,还要解决一个核心问题:怎么把它放进泛化不等式里?有限假设空间那套证明,用的是 Union Bound;到了无限假设空间,自然想到先用 growth function 控制“有效假设数”,再用类似 Union Bound 的方式求和,听起来顺理成章。

但实际操作中有一个障碍:训练误差和泛化误差都在同一个数据集上计算,两者强相关,直接套大数定律会过度乐观。对称化(symmetrization)技巧可以把问题转成“两组独立样本上的比较”,一组当训练集,一组当校验集,这样相关性就拆开了。然后通过重排不等式的技巧,最终得到一个只跟 growth function 相关的上界。这个推导是第三章后半部分的高潮,也是很多教材里最劝退的一段。

我的建议是:不要第一遍就死磕每一步放缩,先把握主干逻辑。主干只有三步:对称化拆分样本、用 growth function 替换假设计数、最后用 VC 维的多项式界收尾。三步看懂之后,细节再慢慢磨。

4.2 泛化误差界的“形状”:你在论文里常看到的根号项

最终的泛化界长这样:训练误差加上一个复杂度代价,这个代价通常包含一个带有根号的对数项和 m 的 -1/2 次幂。更具体的形式可以写成:

  • 误差差 ≤ O( sqrt( (VC_dim + log(1/δ)) / m ) )

这个形式并不神秘。它就是从有限假设集的泛化界里,把“假设个数”替换成“growth function 上界”后自然冒出来的。也就是说,在有限假设空间和无限假设空间之间,理论上被打通了。

这个公式对实践的指导意义很直接:样本量 m 增大时,误差差按根号速度收缩;VC 维增大时,误差差随之增大。所以如果你有一个 VC 维很高的模型,又想保住泛化性能,唯一的出路是增大样本量,没有别的免费午餐。

4.3 样本复杂度:VC 维反向告诉你最少要多少数据

把上面的不等式反解,可以得到一个很实用的推论:如果希望泛化误差差小于某个 ε,需要多少样本?大致是 O( VC_dim / ε² ) 的量级。这个量级关系在生产环境中很有用。

比如你有一个高维稀疏特征模型,特征上万的场景很常见,VC 维如果近似等于特征数(在线性模型里往往如此),那么为了达到 0.05 的误差差,样本量至少也要几十万量级。你可以在项目早期就算清楚“手里的数据够不够支撑这个模型”,而不是等模型训出来才发现问题。

我见过不少团队在特征工程阶段疯狂加特征,模型在训练集上越来越好,测试集却一塌糊涂。用 VC 维这个框架去想,就非常合理:特征数量快速拉高了 VC 维,而样本量没跟上,泛化边界自然失控。

5. 那些年人人都踩过的坑:概念辨析与实战心得

5.1 最容易混淆的几组概念对照

我在学习和带人过程中,发现有几个概念间的关系特别容易被弄拧。整理下来最有价值的就是这三组:

概念核心含义容易错在哪里
Growth Function假设空间在 m 个点上最多产生的二分数量误以为它就是假设空间的元素个数
Shatter能实现全部 2^m 种标签组合误以为“能找到一种好标签”就叫打散
VC 维打散的最大点数误以为“所有该点数点集都能被打散”
参数数量模型参数的个数误以为它就是复杂度,但 VC 维才直接对应复杂度

尤其第二点,我碰到过有同学拿一个二分类例子说“这个假设能打散三个点”,结果他举的是三个点其中一种划分方式。这不对。打散要求的是那三个点的全部 8 种划分都能被实现,缺一种都不行。这个概念如果没矫正,后面所有计算都会出错。

5.2 计算 VC 维的实用套路

实战中计算一个陌生假设空间的 VC 维,我一般按这个顺序走:

  1. 先尝试构造一组点,证明下界:找出尽量多的点,并论证它们的所有标签组合都能被 H 实现。
  2. 再尝试证明上界:找出使打散失败的最小样本数。这一步通常依赖几何或代数结构,比如凸性、线性约束等。
  3. 如果上界难证明,退而求其次证明 growth function 的增速不会超过某个多项式且在某处开始不再是指数——这条路也能锁定 VC 维。

这套思路看着简单,落地时最耗时间的是第 2 步。因为它没有一个通用算法,每个假设空间都靠“灵光一现”。多看几个经典结论的证明,慢慢就会形成套路。比如线性超平面、区间、并集区间族、球体分类器这些,都是反复出现的素材。

5.3 实战心得:VC 维在真实项目里到底怎么用

说到真实项目,VC 维通常不会直接出现在代码里,更像一个思维模型。我在实践中总结出三条用法:

第一条,做特征筛选时把“特征数量 vs 样本数量”的比例当成第一道红线。如果这个比例已经威胁到泛化边界,基本可以预测过拟合风险,不需要等到训练完再看曲线。

第二条,比较两个模型时,如果训练误差都已经很低,判断哪个更好就不该只看验证集那一次随机划分,而要考虑它们的复杂度差异。VC 维高的那个即使当前表现好,换数据后翻车的概率也更大。

第三条,做模型选型汇报时,VC 维是一个能说服人的理论依据。说“我们控制的假设空间复杂度更低,因此泛化风险有保障”,比只说“我们用了正则化”更有底气。

提示:VC 维是假设空间的属性,不是算法的属性。同一个线性分类假设空间,用梯度下降、SVM 或最小二乘去求解,VC 维都相同。换句话说,VC 维衡量的是“天花板”,不是“具体路径”。

这篇文章的核心内容就到这里。我个人学习这部分的最大体会是:growth function 和 VC 维不是独立的知识点,而是第三章完整论证链条里的两个核心量——它们分别回答了“无限假设空间的有效规模怎么度量”和“这个规模会不会失控”两个问题。先把这两个问题的直觉打通,再回到教材啃证明,你会发现原本晦涩的对称化技巧也顺了不少。

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

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

立即咨询