Appearance
第九章 机器学习
作者:Nikhil Sharma
编辑:Samantha Huang、Wesley Zheng
部分内容改编自《人工智能:一种现代方法》(Artificial Intelligence: A Modern Approach)。
最后更新:2024 年 9 月
9.1 机器学习
在前几章中,我们学习了多种帮助智能体在不确定性下进行推理的模型。到目前为止,我们把所用的概率模型视为已经给定,并且把底层概率表是如何从数据中产生的过程抽象掉了。本章开始拆开这层抽象,讨论机器学习:机器学习是计算机科学的一个广泛领域,研究如何根据数据构造指定模型,或者学习指定模型的参数。
机器学习算法面对的问题和数据类型各不相同,通常按照希望完成的任务以及处理的数据类型分类。两类主要的机器学习算法是监督学习和无监督学习。
- 监督学习算法从输入数据及其对应的输出数据中推断关系,用来预测此前未见过的新输入的输出。
- 无监督学习算法只接收没有对应输出标签的输入数据,因此关注识别数据点之间或数据点内部的固有结构,并据此进行分组或处理。
本课程讨论的算法局限于监督学习任务。
准备好数据集以后,机器学习过程通常把数据分成三个不同的子集。训练数据用于实际生成从输入到输出的模型;验证数据(也叫留出数据或开发数据)用于让模型对输入作出预测,并据此计算准确率,衡量模型表现。如果表现不够好,可以调整模型特有的超参数,或改用另一种学习算法,再重新训练,直到验证结果满足要求。最后使用测试集作出预测。测试集直到开发过程的最后阶段才会被智能体看到,可以把它看作衡量模型在真实数据上表现的“期末考试”。
本章将介绍几种基础机器学习算法:朴素贝叶斯、线性回归、逻辑回归和感知机。
9.2 朴素贝叶斯
先看一个具体的机器学习例子:构建电子邮件垃圾邮件过滤器,把邮件分为垃圾邮件(spam)和正常邮件(ham)。这类问题称为分类问题:给定若干数据点(这里每封邮件就是一个数据点),目标是把它们归入两个或更多类别中的一个。对于分类问题,训练集包含数据点及其标签,标签通常取少数几个离散值。
我们的目标是利用训练数据——邮件以及每封邮件的 spam/ham 标签——学习一种关系,用来预测此前未见过的邮件。下面介绍一种解决分类问题的模型:朴素贝叶斯分类器。
邮件本身只是文本字符串。为了从中学习有用的规律,需要提取某些属性,称为特征。特征可以是特定单词的计数、文本模式(例如单词是否全部大写),也可以是我们能够想到的其他数据属性。
训练时具体选择哪些特征,通常取决于所解决的问题;特征选择会显著影响模型性能。决定使用哪些特征的过程称为特征工程,是机器学习的基础内容之一。本课程中可以假设给定数据集已经提供了提取好的特征。本文用
假设词典中有
如果能够构造每个特征变量
以及
然后把邮件标记为概率较大的类别。
问题在于:有
这是一个很强的建模假设,也是它被称为“朴素”的原因。但它能大幅简化推理,并且在实践中通常效果很好。根据这个假设,网络包含一张
这体现了统计效率中的权衡:为了让计算规模保持在可接受范围内,有时需要牺牲模型的复杂程度。当特征数量足够少时,也可以对特征之间的关系作出更多假设,即给贝叶斯网络增加边,从而构造更精细的模型。
给定特征观测值
第一步利用了一个事实:归一化分布和未归一化分布的最大概率类别相同;第二步直接来自“给定类别标签后各特征相互独立”的朴素贝叶斯假设。
更一般地,假设
可以计算每个类别对应的未归一化概率:
因此,对特征向量
到这里,我们知道了朴素贝叶斯分类器的建模假设以及如何作出预测,但还没有说明如何从训练数据中学习网络所需的条件概率表。这就是参数估计要解决的问题。
9.2.1 参数估计
假设有一组样本或观测
如何根据样本学习最可能的
最大似然估计通常作出以下简化假设:
- 每个样本来自同一个分布,即所有
同分布。在抛硬币例子中,每次抛掷正面的概率都相同,都是 。 - 给定分布参数后,每个样本
与其他样本条件独立。这是一个很强的假设,但它能大幅简化最大似然估计,并且通常在实践中有效。在抛硬币例子中,一次抛掷的结果不会影响其他抛掷。 - 在看到数据之前,
的所有可能取值都同样可能,这称为均匀先验。
前两个假设通常合称为独立同分布(independent and identically distributed,i.i.d.)。第三个假设使 MLE 成为最大后验估计(maximum a posteriori,MAP)的一种特殊情形;MAP 允许使用非均匀先验。
定义样本的似然
利用样本 i.i.d. 的假设,似然可以写成
我们要找到使这个函数最大的
例:红球和蓝球
袋子里装着红球和蓝球,但不知道两种球各有多少个。每次取出一个球,记录颜色,再放回袋中,即有放回抽样。三次抽样结果是“红、红、蓝”。直观上可以推测袋中
假设每次取球得到红球的概率为
样本的似然为
令似然的一阶导数为零:
解得
9.2.2 朴素贝叶斯中的最大似然
回到垃圾邮件分类问题。先回顾几个变量:
:词典中的单词数量。 :训练样本(邮件)的数量。令 为标签是 ham 的训练样本数,令 为标签是 spam 的训练样本数,因此 。 :如果当前邮件中出现词典中的第 个单词则为 ,否则为 的随机变量。 :取 spam 或 ham 的随机变量,取值由对应邮件的标签决定。 :训练集第 个样本中随机变量 的已实现值。也就是说,如果第 封邮件中出现了第 个单词,则 ,否则为 。
下面的数学推导可以跳过。CS 188 要求掌握的是本节最后一段总结的结果。
在任意条件概率表
即词典中第
第二个等式来自一个简单技巧:如果
直接对
令导数为零:
整理可得
因此
结果非常简单:
对于采用伯努利特征分布的朴素贝叶斯模型,在给定类别中,某一结果的最大似然概率等于该结果出现的次数除以该类别的样本总数。
9.2.3 平滑
最大似然估计很强大,但糟糕的训练数据会造成问题。例如,如果训练集中每一封包含单词 “minute” 的邮件都被标记为 spam,模型可能学到
于是对于一封未见过的邮件,只要出现 minute,就有
模型永远不会把包含这个单词的邮件分类为 ham。这是过拟合的经典例子:模型对训练数据拟合得过度,无法很好地泛化到此前未见过的数据。训练数据中没有出现某个词,并不代表测试数据或现实世界中不会出现它。
朴素贝叶斯分类器的过拟合可以用拉普拉斯平滑缓解。强度为
那么强度为
这个式子表示:假设每个结果额外出现
拉普拉斯平滑有两个值得注意的极端情形。
实际模型中适合的
9.3 感知机
9.3.1 线性分类器
朴素贝叶斯的核心思想是从训练数据中提取特征,然后估计给定特征时标签的概率
如果不估计概率分布,会怎样?先看一个简单的线性分类器。它可以用于二分类,标签只有正类和负类两种可能。
线性分类器用特征的线性组合进行分类,这个值称为激活值。具体来说,激活函数接收一个数据点,把每个特征
二分类时,根据激活值的正负分类:
从几何上看,利用点积
其中
当
还要考虑
这条线称为决策边界,因为它把预测为正类的区域与预测为负类的区域分开。在更高维度中,线性决策边界通常称为超平面。超平面是比潜在空间低一维的线性曲面,会把空间分成两部分。对于一般的非线性分类器,决策边界不必是线性的,只需是特征向量空间中把类别分隔开的曲面。落在决策边界上的点可以任意分配标签,因为两类都同样合理;下面的算法把边界上的点归为正类。
9.4 二元感知机
现在已经知道线性分类器如何工作,但如何构造一个好的线性分类器?有标签的正确类别的数据称为训练集。构建分类器时,需要在训练数据上评估分类器,将预测结果与训练标签比较,再调整分类器参数,直到达到目标。
二元感知机是线性分类器的一种具体实现。它是二分类器,也可以扩展到两个以上的类别。二元感知机的目标是找到一条能够完美分隔训练数据的决策边界,即找到最好的权重向量
算法
感知机算法如下:
- 将所有权重初始化为
: 。 - 对每个训练样本(特征为
,真实类别标签为 ):用当前权重分类样本,令
为预测类别:将预测标签
与真实标签 比较:- 如果
,什么也不做。 - 如果
,更新权重: 。
- 如果
- 如果遍历整个训练集时一次也没有更新权重,说明所有样本都预测正确,终止;否则重复第 2 步。
更新权重
分类正确时权重不变;分类错误时按照
更新,其中
- 把正类错分为负类:
。 - 把负类错分为正类:
。
为什么这样有效?把它看作一种平衡过程。错分通常意味着某个训练样本的激活值太小或太大。以“正类被错分为负类”为例,激活值本来应该为正,却是负的,因此需要让激活值变大:
新激活值增加了
为什么更新量使用样本的特征,而不是对所有权重作相同幅度的修改?因为得分由权重和当前样本共同决定,样本的不同特征对得分贡献不同。例如某个负类样本的特征为
为了正确分类,权重需要变小,因为激活值应当为负。但第一个特征
对于当前被错分的正类样本,把它的特征向量加到权重向量上,会减小权重向量与该特征向量之间的夹角,同时移动决策边界。移动幅度足够时,样本就会落到正确的一侧;但一次更新并不保证一定修正错误,这取决于权重向量的大小以及样本距离边界有多远。
注:上面的图示在在线讲义中作为外部资源引用;用户提供的 PDF 未包含可提取的对应位图,因此这里保留文字推导,不伪造一个“原始图片”。
偏置
如果直接实现目前为止的感知机,会发现一个不太方便的限制:任何决策边界都必须经过原点。也就是说,感知机只能产生形如
的边界。但即便数据确实可以被某条线性边界分隔,这条边界也可能不经过原点。
解决方法是增加偏置项:给每个样本特征向量增加一个恒为
其中
几何上,需要在比带特征数据空间高一维的空间中理解这个变化:不带偏置时,边界只能经过原点;带偏置时,可以在更高维空间中移动对应的边界。
例:运行一次感知机更新
设偏置特征恒为
| 编号 | |||
|---|---|---|---|
| 1 | 1 | 1 | |
| 2 | 3 | 2 | |
| 3 | 2 | 4 | |
| 4 | 3 | 4 | |
| 5 | 2 | 3 |
按顺序遍历数据并作一次更新:
| 步骤 | 权重 | 得分 | 是否正确 | 更新 |
|---|---|---|---|---|
| 1 | 是 | 无 | ||
| 2 | 否 | |||
| 3 | 是 | 无 | ||
| 4 | 是 | 无 | ||
| 5 | 否 | |||
| 6 | — | — | — |
这里只展示一次遍历。实际运行中,算法还会进行更多轮遍历,直到某一轮中所有数据点都被正确分类。
9.4.1 多类别感知机
前面介绍的是二元分类器,但感知机可以很容易地扩展到多个类别。二分类只有一个权重向量,其维度等于特征数(加上偏置特征);多分类时,每个类别都有一个权重向量。三分类就有三个权重向量。
分类时,用特征向量分别与每个类别的权重向量作点积,得分最高的类别就是预测结果。例如,令
三个类别的权重为
三个得分分别是
实际实现中通常不会把权重保存成三个独立结构,而是把它们堆叠成权重矩阵。这样不必分别计算多个点积,只需做一次矩阵—向量乘法:
于是
权重更新也相应改变。如果分类正确,什么也不做;如果预测类别为
例如上面的例子中,如果真实类别是
这相当于奖励正确的权重向量,惩罚误导预测的权重向量,其他权重向量保持不变。剩余算法与二元情形相同:遍历样本,出现错误时更新权重,直到不再出错。要加入偏置项,只需像二元感知机那样给每个特征向量增加一个恒为
9.5 线性回归
下面从朴素贝叶斯转向线性回归。线性回归也叫最小二乘法,可以追溯到 Carl Friedrich Gauss,是机器学习和计量经济学中研究最充分的工具之一。
回归问题是输出为连续变量
使用以下线性模型预测输出:
模型权重
为了训练模型,需要度量预测结果与真实输出的差异。使用
其中
通过求导并令导数为零,可以得到使损失最小的权重
令梯度为零:
得到估计权重后,对新的、此前未见过的测试数据点进行预测:
9.6 优化
线性回归可以通过对损失函数求导并令梯度为零得到最优权重的闭式解。但一般来说,某个目标函数可能不存在闭式解。此时可以使用基于梯度的方法寻找最优权重。梯度指向目标函数增大最快的方向,因此最大化函数时沿最陡上升方向移动,最小化函数时沿最陡下降方向移动。
如果目标函数需要最大化,使用梯度上升:
text
算法 1:梯度上升
1. 随机初始化 w。
2. 当 w 尚未收敛时:
w ← w + α∇_w f(w)如果目标是最小化损失函数,使用梯度下降。它与梯度上升的区别只是沿梯度的反方向移动:
text
算法 2:梯度下降
1. 随机初始化 w。
2. 当 w 尚未收敛时:
w ← w − α∇_w f(w)开始时随机初始化权重。学习率用
如果数据集包含大量数据点,每轮计算完整梯度可能代价很高,因此出现了随机梯度下降和批量梯度下降等方法。随机梯度下降每次只使用一个数据点计算梯度,并从数据集中随机抽取该点;因为只用一个点估计梯度,梯度可能比较嘈杂,收敛也更困难。小批量梯度下降则是折中方案:每次使用大小为
以线性回归为例,损失函数为
虽然线性回归有闭式解
因此最小二乘梯度下降算法为:
text
算法 3:最小二乘梯度下降
1. 随机初始化 w。
2. 当 w 尚未收敛时:
w ← w − α(−X^Ty + X^TXw)可以自行构造一个线性回归问题,验证闭式解与梯度下降收敛后的解是否相同。
9.7 逻辑回归
在线性回归中,假设输出是数值型实数。如果希望预测类别型变量,可以使用逻辑函数把输入特征的线性组合转为概率:
虽然名称中有“回归”,逻辑回归实际上用于解决分类问题,而非回归问题。逻辑函数
常用于建模二元输出。它的输出总在
更具体地,令
逻辑函数的一个有用性质是
逻辑回归使用
逻辑回归没有可直接使用的闭式解,因此通过梯度下降估计未知权重。利用微分链式法则,损失函数对第
这里使用了
9.8 多类别逻辑回归
多类别逻辑回归要把数据点分到
这些概率之和为
为了找到使似然最大的参数,对每个参数计算似然的梯度,令其为零并求解。若没有闭式解,就计算梯度并使用梯度上升求最优值。
常见技巧是先对似然取对数,因为对数会把乘积变成求和,简化梯度计算。由于对数是严格递增函数,这个变换不会改变最大值位置。
对每个数据点
对数似然为
接下来估计使这个目标最大的
这里使用了
9.9 神经网络:动机
下面介绍神经网络。会用到二元逻辑回归和多类别逻辑回归中发展出的建模技术。
9.9.1 非线性分隔面
我们已经知道如何构造学习二分类线性边界的模型。这在最优决策边界本身是线性时很有效。然而,许多实际问题需要非线性的决策边界,线性感知机没有足够的表达能力来捕获这些关系。
考虑下面的一组数据。目标是把两种颜色的点分开,但在一维空间中无法做到这一点,因为一维决策边界只是一个点,只能把数轴分成两个区域。
一种解决方法是增加特征(特征也可以是非线性的),从而构造新的决策边界。例如把

加入这个信息后,就可以在包含这些点的二维空间中构造线性分隔面。这里通过手工增加有用特征,把数据映射到更高维空间,从而解决了问题。但在图像分类等高维问题中,手动选择有用特征十分繁琐,需要领域专家知识,也妨碍模型跨任务泛化。更自然的目标是让模型也学习这种特征变换,并使用能够表示更广泛函数的非线性函数族。
9.9.2 多层感知机
考虑如何从原始感知机结构导出更复杂的函数。下面的两层感知机把另一个感知机的输出作为输入:

可以把这个结构推广到

增加这些结构和权重后,可以表示更广泛的函数。模型复杂度提高以后,表达能力也显著增强。多层感知机提供了表示广泛函数的通用方法;事实上,多层感知机是通用函数逼近器,可以表示任意实函数。剩下的问题是选择参数化网络的最佳权重。
9.9.2.1 定理:通用函数逼近器
具有足够多神经元的两层神经网络,可以以任意期望精度逼近任意连续函数。
9.9.3 衡量准确率
二元感知机进行
其中
有时需要比二元标签更有表现力的输出。此时可以为
给定
这个式子表示一组特定权重解释观测标签和数据点的可能性。目标是找到使该量最大的权重。这等价于最大化对数似然:
9.9.4 多层前馈神经网络
现在引入人工神经网络。和多层感知机一样,在每个感知机节点之后应用一个非线性函数。这些非线性使整个网络变得非线性、表达能力更强。如果没有它们,多层感知机只是线性函数的复合,整体仍然是线性的。
多层感知机使用阶跃函数:
阶跃函数不连续,并且几乎处处导数为零,因此很难优化。可以改用连续函数,例如 sigmoid 函数或修正线性单元(rectified linear unit,ReLU)。
9.9.4.1 Sigmoid 函数


9.9.4.2 ReLU

在多层感知机中,每一层的输出都要应用其中一种非线性函数。选择哪一种非线性函数是模型设计决策,通常需要通过实验确定。
9.9.5 损失函数与多元优化
了解前馈神经网络的结构后,还需要一种训练方法。回到对数似然函数,可以推导出一个直观的权重优化算法。
为了最大化对数似然函数,对它求导得到梯度向量:
使用梯度上升寻找参数的最优值。由于数据集通常很大,批量梯度上升是神经网络优化中最常用的梯度上升变体。
本章小结
本章从“如何从数据中学习模型参数”出发,介绍了监督学习的基本流程,以及朴素贝叶斯、最大似然估计、拉普拉斯平滑、线性分类器、二元和多类别感知机、线性回归、梯度优化、逻辑回归、多类别逻辑回归和神经网络。它们共同体现了机器学习中的核心循环:选择模型表示,定义损失或似然,用数据估计参数,再用验证数据检验泛化能力。