机器学习西瓜书第一章习题全解析:从假设空间到NFL定理
周志华老师的《机器学习》因为封面上那颗切开的大西瓜被大家习惯性叫作“西瓜书”。而“吃瓜教程”这个叫法最早来自 Datawhale 开源社区做的配套学习项目核心就是一边“吃西瓜”一边把书里的公式推导和课后题讲清楚。很多刚接触机器学习的朋友会把第一章当成普通绪论快速翻过去觉得概念而已没什么考点。但真正到了期末复习、面试、或者动手做第一个模型的时候才发现连“假设空间”“版本空间”“归纳偏好”这些最基础的概念都没完全吃透。我这两年带新手做机器学习入门辅导被问得最多的恰恰就是第一章的课后习题尤其是习题 1.1 的版本空间、习题 1.2 的析合范式题目只有几行字做起来却处处是坑。这篇文章就把第一章课后习题逐题拆开从解题思路、标准答案到常见翻车点一次性讲清楚。1. 先搞懂第一章在考什么四个概念串起一份完整的机器学习世界观很多人做不出第一章习题不是因为计算能力不行而是没明白这几个概念到底在回答什么问题。你如果把“假设空间、版本空间、归纳偏好、NFL定理”这四个词的关系理顺习题就是送分题。1.1 假设空间把“学习”翻译成“搜索”机器学习的核心任务可以粗暴理解成“从数据中找规律”。但“找规律”这个词太模糊西瓜书把它精确成了一个搜索问题先规定所有可能的规律长什么样这个集合就是“假设空间”。具体到西瓜分类问题每个样本有三个属性色泽、根蒂、敲声。一个“假设”可以写成类似“色泽青绿 且 根蒂蜷缩 且 敲声浊响”这样的合取式。更一般地每个属性位置上你既可以选择“取某个具体值”也可以选择“不管这个属性”也就是通配符星号。于是单个合取式假设的数量就是每个属性可选种类数的连乘。这里有个容易被忽略的细节习题里说的“只包含编号为1和4的两个样例”到底怎么数属性取值表 1.1 中色泽只出现了“青绿”和“乌黑”根蒂只出现了“蜷缩”和“稍蜷”敲声只出现了“浊响”和“沉闷”。所以每个属性有两个具体取值加上一个通配符星号就是 3 种选择三个属性合起来是 3 的 3 次方也就是 27 个合取式假设。再算上“空集”这个特殊假设表示“世界上不存在好瓜”总共 28 个假设。如果你把属性域扩展到书里完整定义的三值比如色泽还有“浅白”根蒂还有“硬挺”敲声还有“清脆”那假设空间就会变成 4 的 3 次方加 1也就是 65 个。这两种口径在各类解析里都能看到核心是必须搞清你数的是哪种。回到习题 1.1参考答案通常采用 28 这个口径因为这样和教材正文的表述一致。1.2 版本空间、归纳偏好与NFL从搜索到决策的完整链条有了假设空间学习就变成了在 28 个候选假设里搜索。但搜索需要标准这个标准就是“与训练集一致”。把所有与当前训练数据一致的假设挑出来形成的集合就是“版本空间”。版本空间为什么重要因为它说明了一个事实能解释当前数据的假设往往不止一个。这时候问题就来了最后模型总要选一个用吧于是需要“归纳偏好”也就是在多个都可以解释数据的假设里你更倾向选哪一个。比如奥卡姆剃刀原则选最简单的那个或者你根据业务经验优先选某个属性组合。而 NFL 定理也就是“没有免费的午餐”定理则是在更深的层面提醒我们如果对所有可能的数据分布求平均任何两个学习算法的期望性能是一样的。换句话说不存在一个算法在所有任务上都碾压另一个算法。你必须结合具体问题和先验知识来选择模型否则就是盲人摸象。这四个概念是层层递进的假设空间定义搜索范围版本空间给出当前数据下的候选集合归纳偏好帮你从中做选择NFL 定理告诉你选择必须依赖任务背景。理解了这条链路再去碰课后题思路会清楚很多。2. 课后习题1.1与1.2逐题拆解版本空间怎么算析合范式怎么估这一节先把最容易被问爆的两道题讲透。2.1 习题1.1当训练集只剩两个正例版本空间如何收缩题目只取了编号 1 和编号 4 两个样例而且两个都是好瓜。编号 1 是“青绿、蜷缩、浊响”编号 4 是“乌黑、稍蜷、沉闷”。问题是给出相应的版本空间。第一步先确定假设空间大小。前面说过按表 1.1 出现过的属性值口径每个属性有 3 种选择所以合取式假设是 27 个加上空集共 28 个。这一步大多数人能写对。第二步用训练数据删掉不一致的假设。这里有一个容易懵的点版本空间到底剩下几个网上流传最多的答案是一组 7 个的假设通常会写成下面这样编号色泽根蒂敲声1青绿蜷缩浊响2青绿蜷缩*3青绿*浊响4*蜷缩浊响5青绿**6*蜷缩*7**浊响这个答案的逻辑是以编号 1 这个正例为“种子”从最特殊的假设“青绿、蜷缩、浊响”开始逐步把某个属性泛化成星号。只要假设还能覆盖编号 1并且训练集中没有反例与它冲突就保留下来。因为当前训练集里只有正例、没有反例所以这些假设都不会“踩雷”都被视为与训练集一致。但如果你较真会发现一个明显的疑问编号 4 也是正例这 7 个假设里除了“*、*、浊响”之外很多都没覆盖编号 4。按严格的二分类视角一个假设在某个训练样本上输出“不是好瓜”而真实标签是“好瓜”那就应该算不一致。如果按这个标准版本空间会被压缩得非常厉害最后只剩下“*、*、*”这个超级泛化的假设因为只有它才能同时覆盖两个毫无共同属性值的正例。为什么会出现两种答案原因是“一致”的判定口径不同。习题解析里常用的宽松口径是训练集只有正例时假设只要不把正例“误伤”也就是它覆盖的样本都是正例就可以保留不要求覆盖所有正例。而候选消除算法那种严格口径则要求假设必须覆盖所有正例且不覆盖任何反例。我个人在实际做题和教学时的建议是考试或作业里优先写常见参考答案的 7 个因为这是教材配套解析和大多数高校认可的口径但你在思考时一定要知道严格口径下结论会变否则面试时被人追问一句就得露馅。2.2 习题1.2析合范式把假设空间撑大了多少题目问如果只用单个合取式假设表示能力有限若使用最多包含 k 个合取式的析合范式来表达 1.1 的西瓜分类问题试估算有多少种可能的假设。先看单个合取式的情况。在完整属性域口径下每个属性有 4 种可能3 个具体取值加星号三个属性一共是 4 的 3 次方也就是 64 个不同的合取式。这 64 个不包括空集因为空集表示“没有任何样本是好瓜”它是一个特殊的假假设。如果用析合范式也就是把若干个合取式用“或”连起来那么任意一个假设都可以看成 64 个合取式的一个子集。64 个元素组成的集合有多少个子集2 的 64 次方。所以理论上如果不限制合取式数量析合范式能表达的假设种类可以达到 2 的 64 次方这是一个大得惊人的数字。题目加了限制最多包含 k 个合取式。那数量怎么算最简单的估算思路是组合数求和从 64 个候选合取式里选 1 个、2 个……直到 k 个所以可能假设数约等于 C(64,1) C(64,2) … C(64,k)。如果允许空集也就是“什么都不选”表示没有好瓜那就再加 1。当 k 足够大到 64 时这个和加上空集刚好就是 2 的 64 次方。这里必须提醒一个坑这个组合数算的是“合取式集合”的数目不是“逻辑上真正不同”的假设数目。因为有些析合范式可能逻辑等价比如“色泽青绿”和“色泽青绿 且 根蒂*”在实际语义上就是同一个东西但在组合数里被重复计数了。题目用“估算”这个词就是允许你忽略这种等价性按组合数上界来答。真正要精确计数需要处理大量布尔函数的等价类那已经不是第一章课后题该承载的难度了。这道题背后的意图是让你理解表示能力的重要性。单合取式只能描述“同时满足若干条件”的规则而现实概念往往是多峰、多条件的比如“好瓜可以是清脆的绿瓜也可以是沉闷的黑瓜”这种“或”逻辑就必须用析合范式才能表达。表示能力强未必是好事因为假设空间变大后搜索难度也会爆炸式增长这就是后边要提到的“没有免费的午餐”和过拟合问题的雏形。3. 课后习题1.3与1.4逐题拆解噪声场景下怎么选模型NFL到底在说什么如果说前两道题考的是“你会不会数数”那么后两道题考的就是“你有没有建立起机器学习的价值观”。这往往是新手最容易空谈、也最容易失分的地方。3.1 习题1.3数据有噪声时归纳偏好应该怎么设计题目说如果数据包含噪声假设空间中可能不存在与所有训练样本都一致的假设。这种情形下试设计一种归纳偏好用于假设选择。所谓噪声可以理解为数据里的“脏东西”标签标错了、属性值记错了、或者有些影响因素根本没有被采集进来。此时如果你强行追求“训练集上零错误”就会陷入过拟合。比如一个样本明明是“青绿、蜷缩、浊响”却被标成坏瓜如果你为了让模型在这条样本上也“正确”而把规则改成“只有这一个样本是好瓜”那这个规则基本没有泛化能力。那该怎么办一个很实用的偏好设计是“结构风险最小化”。核心思想是损失函数不要只看训练误差还要加一个衡量模型复杂度的正则项。训练误差小但模型极其复杂的假设不会被优先选择反而是那些训练误差在可接受范围内、但结构更简洁的假设更容易胜出。这就把奥卡姆剃刀原则变成了一个可计算的优化目标。还有一个思路是“最小描述长度”。它认为最好的假设是能让“假设本身的编码长度”加上“在该假设下对训练数据编码的误差”之和最小的那个。你可以类比成压缩文件同一个数据有人用 3GB 的模型去精确记录每一个字节有人用 10MB 的模型就抓住了主要规律显然后者更值得选因为它的描述总长度更短。实际操作中我一般还会建议用“验证集”来辅助决策。既然训练集有噪声不能全信那你可以把数据切一部分出来做验证在多个候选假设里挑验证集上表现最好的那个。这种方法不依赖具体公式工程上非常直接。下面把几种常见偏好放在一起对比归纳偏好核心思想优点缺点最小训练误差选择训练集上错误率最低的假设简单直观噪声多时容易过拟合结构风险最小化训练误差加正则项一起最小化兼顾拟合与泛化正则系数需要调最小描述长度模型编码与误差编码总长最小理论优美自带模型选择编码长度计算复杂验证集调参在保留集上比较候选模型工程上最实用数据少时验证集不可靠3.2 习题1.4NFL定理给机器学习研究的三条启示NFL 定理全称 No Free Lunch Theorem结论是在所有可能的目标函数上均匀平均任意两个学习算法的期望性能相同。也就是说如果所有问题出现的概率一样你拿任何算法去跑最后平均下来的正确率都是一样的。听起来很反直觉但数学证明并不复杂对每个样本算法 A 在这个目标函数上对、算法 B 就在另一个目标函数上对把全部目标函数一平均谁也不占便宜。先别急着说“那机器学习没意义了”。NFL 定理成立有三个关键前提目标函数在所有可能空间上均匀分布、所有问题同等重要、你没有任何先验知识。这三个前提在真实世界里几乎都不成立。你之所以能用 SVM 或神经网络解决某个具体问题恰恰是因为你手里的任务不是“所有问题的平均”而是某一个带明确结构的问题。那么它对机器学习研究的启示是什么我认为最重要的有三条。第一脱离具体任务谈“哪个算法最好”毫无意义。以后你看到有人发帖说“CNN 就是比 SVM 强”你要明白这种结论只在特定数据集和特定任务下成立。第二必须利用先验知识。图像用卷积结构、文本用注意力机制、小样本用正则化这些本质上都是在注入领域先验把搜索空间缩小到更可能正确的区域。第三算法对比必须有多数据集、多任务支撑否则只是在某个“午餐”上白吃白喝代表不了全局。这道题想考察的不是你背没背下定理内容而是你能不能把它变成一种“反万能药”的思维方式。机器学习模型不是魔力盒子选模型之前先想清楚数据长什么样、噪声水平如何、可解释性要求多高这才是 NFL 定理真正想告诉你的东西。4. 做第一章习题的常见翻车点与学习资源推荐刷完这几道题你会发现第一章的“坑”往往不在于题目本身而在于概念口径和思考方式。4.1 版本空间为什么有人算出1个、有人算出7个这是我在答疑时遇到最多的困惑。同一个习题 1.1有人用候选消除算法算出“只有‘*、*、*’一个假设”有人按常见参考解析算出 7 个两个人对答案时直接吵起来。原因就是前面说的“一致”判定口径。严格二分类视角下一个假设必须对训练集中每个样本都给出正确预测那么为了同时覆盖编号 1 和编号 4 这两个没有共同属性值的正例只能把所有属性全部泛化成星号于是版本空间只有一个元素。而常见解析采用的宽松口径是训练集里没有反例所以只要假设不会“冤枉”正例也就是它覆盖的样本都是正例就认为与训练集一致。在这个口径下以编号 1 为种子泛化得到的 7 个假设都能留下来。我个人的建议是做作业、应付考试先按你老师或参考书的口径来通常就是 7 个那版。但你自己心里要清楚这一点万一哪天做项目时用候选消除算法版本空间真的会只剩一个那是正常现象不是算错了。建议在解题开头写一句“按常见解析的宽松一致性口径”直接把口径摆明既严谨又不容易被扣分。4.2 组合数与“逻辑等价”的坑以及NFL的常见误读习题 1.2 里如果你直接说“假设空间大小是 2 的 64 次方”会被懂行的人挑出一个问题2 的 64 次方是所有“合取式子集”的数量不是所有“逻辑上不同假设”的数量。因为不同子集可能表达同一个函数比如“色泽青绿”和“色泽青绿 且 根蒂*”显然是同一个条件。真正去重后数量一定会变小。所以答题时要用“估算”“上界”这种词避免把上界当精确值。NFL 定理的误读更常见。很多新手会把它理解成“所有算法效果一样那还学个啥”。实际上NFL 说的是“所有问题均匀平均”下的期望性能一样而不是“每个具体问题”上一样。在某个特定数据集上算法之间的差异可能非常巨大这正是我们做特征工程、调参、设计网络结构的价值所在。NFL 打击的不是机器学习而是“一招鲜吃遍天”的幻想。4.3 从西瓜书出发的完整进阶路线如果你被第一章的公式和数学符号吓到了别怕这是正常的。西瓜书的特点是“字字珠玑但没有保姆级推导”所以配套资源很重要。最推荐的是 Datawhale 的“吃瓜教程”项目它把西瓜书的知识点和习题用更口语化的方式重新讲了一遍适合第一遍学习时对照着看。如果数学推导跟不上还可以搭配“南瓜书”专门把西瓜书里的公式一步步拆开补全。看完概念和推导之后强烈建议去动手跑一个小项目比如用 sklearn 或 PyTorch 做一个简单的分类任务把“假设空间、过拟合、验证集”这些概念在代码里真正对应起来。很多学校期末考试的机器学习题目比如“西电机器学习期末”“山东大学机器学习期末”都会把第一章的版本空间、NFL 变形后拿来考你把这些基础概念吃透后面学梯度下降、神经网络、模型评估都会顺很多。有些朋友可能会问要不要直接啃 PRML 或者花书我的看法是先把西瓜书课后题做完再用吃瓜教程对答案这个过程打下的底子比盲目啃大部头扎实得多。机器学习入门从来不缺资料缺的是把每个基础概念都掰开揉碎的耐心。最后再分享一个小技巧做完第一章节题后试着把 1.1 到 1.4 串成一个小故事——先有假设空间再用数据筛出版本空间然后靠归纳偏好做选择NFL 提醒你别迷信唯一正确答案。能用自己的话把这个故事讲清楚第一章就算真正过关了。