第8章 什么叫从数据中学习
假设你要写一个垃圾邮件过滤器。
最直接的办法,是列规则:“免费中奖”出现两次就拦截;发件地址不在通讯录而且包含外部链接就提高风险;主题全是大写字母再加一分。规则开始可能有效,但发送者会换词,正常商家也会说“免费”,不同语言和公司邮件格式又不一样。规则表越长,冲突与例外越多,第 7 章的维护问题很快回来。
另一种做法,是收集一批已经被人标记为“垃圾”或“正常”的邮件,把每封邮件转换成若干可计算的特征,再让算法寻找一组参数,使预测尽量接近这些标签。程序员不再逐条决定“出现哪个词就拦截”,而是定义数据怎样进入、模型能怎样变化、错误怎样计算,以及何时停止训练。
这就是从数据中学习的基本转变。人没有退出系统设计,只是把一部分行为细节从手写规则改成了由数据和优化过程共同确定。
普通程序与学习系统差在哪里
普通程序常被概括为:数据与规则进入程序,得到答案。学习系统则多了一段训练过程:样本与已知答案进入学习算法,产生一个带参数的模型;新数据进入模型,才得到预测。
这张图容易造成两个误解。
第一,学习系统仍然有程序。读取文件、提取特征、计算预测、更新参数和部署服务,都由人编写的软件完成。变化的是其中一部分判断规则不再逐条指定,而由可调参数承载。
第二,数据不会自行告诉机器“应该学什么”。同一批邮件,可以训练垃圾邮件分类器,也可以训练主题分类器或写作风格识别器。任务目标、标签定义、损失函数和数据选择共同决定了模型被奖励去发现什么规律。
Tom Mitchell 曾用一种任务化定义描述机器学习:如果程序在任务 \(T\) 上的表现 \(P\) 随经验 \(E\) 改善,就说它从经验中学习。(Mitchell 1997年) 这一定义的价值在于要求我们把三个字母说清楚:什么任务,什么经验,什么表现指标。缺少其中任何一项,“模型学会了”都可能只是一句没有检验条件的宣传。
样本、特征、标签和参数
一封邮件、一张图片、一位患者的一次检查记录,都可以成为一个样本(example)。原始样本常不能直接被简单模型处理,需要转成数字表示。
描述样本的输入量叫作特征(feature)。邮件特征可以包括词语出现次数、发件域名、链接数量和文本长度;花朵特征可以包括花萼与花瓣的长度和宽度。Fisher 在 1936 年分析鸢尾花测量数据时使用了多项连续特征,这组数据后来成为分类方法的常见示例。(Fisher 1936年)
我们希望模型预测的已知答案叫作标签(label)或目标。垃圾邮件的标签可以是 0 与 1,房价的标签可以是一个数值。把样本特征记为 \(x_i\),标签记为 \(y_i\),一组有 \(n\) 个样本的监督学习数据可以写成:
\[ \mathcal{D}=\{(x_1,y_1),(x_2,y_2),\ldots,(x_n,y_n)\} \]
模型 \(f_\theta\) 根据输入 \(x\) 给出预测,\(\theta\) 表示模型中可以调整的参数(parameter)。在线性模型里,参数可能只是几十个权重;在现代神经网络中,它们可能达到数十亿个。参数数量不同,训练的共同目标仍是找到一组 \(\theta\),使模型在任务指标上表现较好。
核心机制
监督学习的数据流是:样本经过特征表示进入模型,模型用当前参数生成预测,损失函数比较预测与标签,优化算法依据损失修改参数。训练反复进行,最终参数被固定下来用于新样本。
标签从哪里来
“有标签”听起来像数据天然携带答案,实际标签总有生产过程。
邮件标签可能来自用户点击“举报垃圾邮件”;医学标签可能来自检测、诊断或出院记录;图片标签可能由众包人员标注;贷款是否违约要等数月甚至数年才能观察。不同生产过程带来不同误差:用户可能误点,医生可能意见不一,未来结果尚未发生,历史制度还可能让某些群体较少得到检测。
因此,标签不是现实本身的完美副本。评价数据时至少要问:
- 谁定义了类别,边界是否清楚?
- 标签由谁、在什么条件下产生?
- 标签错误是随机的,还是集中在特定样本上?
- 模型部署后,标签获取方式会不会改变?
- 目标是否只是更重要结果的替代指标?
例如,“用户点击”容易记录,却不等于“内容对用户有帮助”;“三十天内再次入院”可以观察,却不完全等于“治疗质量”。模型会优化被交给它的标签和指标,不会自动补上设计者心里没有写出的价值判断。
训练不是考试,训练集也不是未来
若只要求模型把已经见过的样本答对,最笨的办法也可能成功:把每个训练样本和答案逐一记住。真正有用的学习要求模型在没有见过的新样本上仍能工作,这种能力叫作泛化(generalization)。
为评估泛化,数据通常被分成三部分:
| 数据部分 | 主要用途 | 不应该用来做什么 |
|---|---|---|
| 训练集 | 调整模型参数 | 报告最终泛化能力 |
| 验证集 | 选择模型、特征和超参数 | 反复选择后再假装它是全新数据 |
| 测试集 | 最终估计未见数据表现 | 在开发过程中持续调参 |
超参数(hyperparameter)是训练开始前或训练过程外选择的设置,例如模型深度、正则化强度、学习率和特征方案。虽然验证集不直接更新模型权重,但开发者依据验证结果选择方案,信息仍会逐渐渗入设计。因此,同一验证集被尝试数百次后,模型和团队也可能对它过拟合。
测试集应尽可能留到最后。如果看到测试结果后再修改模型,然后仍报告同一个测试分数,它就已经参与了开发,不再是独立考试。严肃项目往往需要新的保留集、时间上更晚的数据或外部数据进行复核。
技术深潜:训练究竟在最小化什么
损失函数 \(\ell(f_\theta(x_i),y_i)\) 衡量模型对第 \(i\) 个样本错得多严重。训练集上的平均损失称为经验风险(empirical risk):
\[ \hat{R}(\theta)=\frac{1}{n}\sum_{i=1}^{n} \ell\bigl(f_\theta(x_i),y_i\bigr) \]
训练通常寻找使 \(\hat{R}(\theta)\) 较小的参数。这里的“风险”不是日常语言中的危险,而是给定损失下的平均错误代价。
我们真正关心的却是未来数据分布上的期望风险:
\[ R(\theta)=\mathbb{E}_{(x,y)\sim p_{\mathrm{future}}} \left[\ell\bigl(f_\theta(x),y\bigr)\right] \]
未来分布 \(p_{\mathrm{future}}\) 不可完整观察,训练集只是它在某种采样过程下的有限切片。统计学习理论研究的核心之一,就是在模型复杂度、样本数量和数据假设下,经验风险与真实风险可能相差多远。(Vapnik 1995年)
这解释了为什么降低训练损失不是终点。如果模型容量很大,它可能把训练集中的偶然噪声也编码进参数,使 \(\hat{R}\) 很低而 \(R\) 反而升高。正则化、早停、数据增强和更合理的模型结构,都是在约束“怎样拟合”,而不只是要求“拟合得更紧”。
过拟合:把偶然当成规律
想象只有六个学生的数据,记录了学习时间和考试是否通过。一条简单直线可能大致表达“学习时间越长,通过机会越高”。一条弯折很多次的曲线则能穿过所有六个点,连某个学习很久却因生病缺考的异常样本也完美解释。
在训练集上,复杂曲线零错误;面对新学生,它却可能作出荒谬预测。这就是过拟合(overfitting):模型不仅学到可重复规律,也学到训练样本中特有的噪声和偶然组合。
相反,模型过于简单,连主要规律也表达不了,叫作欠拟合(underfitting)。判断二者不能只看训练误差:
- 训练和验证误差都高,常提示欠拟合、特征不足或优化失败;
- 训练误差很低而验证误差明显高,常提示过拟合或数据不一致;
- 两者都低,只说明在当前划分和指标下表现好,仍需检查泄漏与部署差异。
模型复杂度也不只等于参数数量。决策树的深度、特征是否携带身份信息、预训练模型已获得的知识、正则化强度和数据量都会改变实际拟合能力。不能只凭“参数多”断言过拟合,也不能凭“模型简单”断言可靠。
数据泄漏:答案提前进入了输入
有时验证分数高得惊人,不是模型发现了深刻规律,而是答案以某种形式混进了输入或开发流程。这叫作数据泄漏(data leakage)。
常见泄漏包括:
- 用全体数据计算均值和方差,再切分训练与测试;
- 同一位患者的多次记录被随机分到训练集和测试集;
- 预测“是否住院”时使用了住院后才生成的费用字段;
- 图片文件名或拍摄设备直接暴露类别;
- 在测试集上选择特征、阈值或模型版本;
- 网页数据的近似副本同时出现在训练和评测中。
泄漏的共同点,是评测时使用了真实部署中无法获得的信息,或者测试样本不再独立。算法本身可以完全正确,评价仍然失真。
技术深潜:为什么随机切分并不总是公平
随机把样本分成 80% 训练和 20% 测试,隐含假设是样本近似独立,并且两部分来自同一目标分布。很多现实数据不满足。
若任务要预测未来需求,应按时间切分,让训练数据早于测试数据;否则未来价格或政策可能间接进入过去。若同一用户贡献很多记录,应按用户分组切分;否则模型可能识别用户,而非学习可迁移规律。若要部署到新医院或新地区,应保留整个机构或地区作为外部测试,而不是把每个机构的记录都随机混合。
选择切分方式的原则不是机械追求某个比例,而是模拟实际使用时“哪些信息已经可见,哪些对象真正未见”。一个可靠测试集应回答部署问题,而不只是方便地从文件中抽出 20%。
分布变化:昨天的规律到了今天还成立吗
即使没有泄漏,训练数据与未来数据也可能不同,这称为分布变化(distribution shift)。
垃圾邮件发送者会适应过滤器;新的医学设备改变图像特征;经济环境变化使历史违约规律失效;摄像头从白天移到夜间;一个只见过正式书面语的模型开始处理网络缩写。模型参数没有突然损坏,输入与结果之间的统计关系变了。
分布变化至少可能发生在不同位置:
- 输入 \(x\) 的分布改变,例如新相机产生不同颜色;
- 标签 \(y\) 的比例改变,例如罕见疾病在特定门诊更常见;
- 相同输入下结果规律改变,例如政策更新后审核标准不同;
- 数据收集机制改变,例如模型上线后只复核高风险案例。
这些变化不能只靠一次离线测试解决。部署系统需要监测输入、抽样获得新标签、比较不同时间段表现,并规定何时重新训练、降级或停止使用。
模型学到的规律不一定是我们想要的规律
训练过程只看到数据与目标。如果医院的某种便携设备主要用于病情较重的患者,模型可能把设备痕迹当作疾病线索;如果过去招聘中某类学校的候选人更常被录用,模型可能把学校名称当成能力替代;如果训练图片里的狼总在雪地,分类器可能主要识别雪。
这些特征在训练分布中确实有预测力,优化算法并没有“算错”。问题在于相关性来自采集过程或历史制度,不一定在新环境保持,更不一定是可接受的决策依据。
因此,机器学习把规则提取的一部分工作交给数据,也把注意力转向新的责任:数据代表谁,目标测量什么,哪些捷径会降低损失,测试是否模拟部署,错误由谁承担。
不止一种学习方式
本章主要讨论有标签的监督学习(supervised learning)。机器学习还包括其他设置:
- 无监督学习从没有人工标签的数据中寻找结构,例如聚类与降维;
- 自监督学习从数据本身构造预测目标,例如遮住一个词再要求模型恢复;
- 强化学习让系统依据行动后的奖励改善策略;
- 半监督学习同时利用少量标签和大量未标注数据。
它们的反馈来源不同,却共享同一个判断框架:经验是什么,目标是什么,可调部分是什么,模型是否在未见情形中仍有效。
下一章将选择最小的监督学习模型,把“根据错误调整参数”完整展开。感知机只有一层加权求和和一个阈值,却已经包含现代学习系统的基本循环:预测、比较、更新,再预测。
本章小结
- 机器学习仍由程序实现;区别在于部分行为规则由数据、模型和优化目标共同确定,而不是逐条手写。
- 样本、特征和标签定义了经验,参数承载模型从经验中获得的可调整部分。
- 训练集用于调整参数,验证集用于选择方案,测试集用于最终估计泛化;反复查看测试结果会污染评估。
- 经验风险是训练样本上的平均损失,真正目标是未来分布上的表现,两者之间存在泛化差距。
- 过拟合把训练数据中的噪声和偶然规律当成可重复结构;欠拟合则无法表达主要规律。
- 数据泄漏会让评测提前获得部署时不可用的信息;切分方式必须模拟真实使用边界。
- 分布变化意味着历史规律可能失效,部署后的监测与更新是学习系统的一部分。
- 模型会利用任何能降低目标的相关性,不会自动区分因果、捷径和社会上可接受的依据。
思考问题
- 如果一个垃圾邮件模型在训练集上达到 100% 准确率,这个结果能说明什么,又不能说明什么?
- 预测学生期末是否通过时,哪些字段只有考试结束后才出现,因而会造成数据泄漏?
- 对一个要在新城市部署的模型,随机切分、按时间切分和按城市切分分别回答什么问题?
延伸阅读
- Mitchell 的教材从任务、经验和表现出发组织机器学习概念,适合建立全局框架。(Mitchell 1997年)
- Hastie、Tibshirani 与 Friedman 的教材系统讨论监督学习、模型复杂度与评价,适合理工科读者进阶。(Hastie 等 2009年)
- Bishop 的教材把概率模型、决策理论与机器学习连接起来,可与第 10 章配合阅读。(Bishop 2006年)
- Vapnik 的著作深入讨论经验风险与泛化边界,数学要求较高,可作为统计学习理论路线的延伸。(Vapnik 1995年)

