UBC-CPSC340-机器学习数据挖掘笔记-全-
UBC CPSC340 机器学习数据挖掘笔记(全)
01:机器学习导论



在本节课中,我们将要学习机器学习的基本概念、其重要性以及它在现实世界中的广泛应用。我们将从人类感知的局限性出发,探讨为什么传统的编程方法在处理某些复杂任务(如视觉识别)时会遇到困难,从而引出机器学习这一替代方案。


人类感知的局限性
上一节我们介绍了课程的主题,本节中我们来看看为什么我们需要机器学习。首先,一个关键原因是:我们人类并不完全理解自己是如何完成某些复杂任务的,比如“看”。



以下是两个视觉实验,它们展示了我们视觉注意力的局限性。
- 在第一个实验中,两张几乎相同的图片快速切换,其中一张图片的飞机引擎消失了。许多人最初无法察觉到这一变化。
- 在第二个更复杂的视频中,场景在每次切换时会发生多处改变(如建筑物颜色、行人消失、标志变化等)。即使观众被告知会有变化,也往往只能注意到其中一小部分。
这些实验表明,我们并非如想象中那样“看到”了整个场景。我们每秒只能以高分辨率处理大约拇指指甲盖大小的区域,其余部分是我们大脑根据经验和预期“脑补”出来的。我们的视觉系统更像是一个为完成特定任务(如抓取物体)而优化的工具,而非一台高清录像机。

既然我们自己都不完全清楚“看”是如何工作的,那么我们如何用传统的“如果-那么”规则来教会机器“看”呢?这引出了机器学习的基本思想。


什么是机器学习?

上一节我们看到了传统编程在模拟人类感知时的困境,本节中我们来看看机器学习的核心思想。
机器学习采取了一种不同的方法:我们不再尝试为机器编写详细的指令来告诉它“如何看”,而是向它提供大量的示例,让机器自己从数据中找出规律和模式。简单来说,机器学习是关于从经验(数据)中自动改进性能的算法研究。

一个生动的例子是跳蛛的求偶识别。当向人类展示一系列图片并询问“哪张最像跳蛛”时,大家的选择与雄性跳蛛在实验中表现出兴奋的图片是一致的。这意味着,即使是只有几千个神经元的小生物,也能通过进化“学习”到复杂的识别模式,这远比我们手动编写识别算法要高效和强大得多。
另一个例子是学习虚构概念“Tufa”。仅通过观察几个正例图片,人类就能迅速总结出关键特征(如长茎、顶部有结构),并判断新图片是否属于该类。这个过程涉及自动提取特征并进行类比,而机器学习的目标就是让机器自动化这个过程。
更广义地,我们可以将学习视为一个智能体(如机器人、生物)与环境交互的过程。智能体通过感知环境、采取行动、接收反馈(奖励或惩罚)来积累经验,并利用这些经验调整自身行为,以在未来更好地实现其目标(如找到食物、避免危险)。
机器学习的应用与驱动力
上一节我们定义了机器学习,本节中我们来看看它为何如此流行以及有哪些应用。
机器学习之所以在今天变得至关重要,主要得益于大数据现象。我们生成、存储和处理数据的能力正在呈指数级增长。例如,谷歌每小时处理的数据量高达1 PB(约100万GB),这为训练复杂的机器学习模型提供了燃料。

以下是机器学习的一些主要应用领域:
- 预测:基于历史数据预测未来趋势,如能源需求、商品销量、电影评分。
- 异常检测:建立“正常”模型,用于发现异常情况,如信用卡欺诈、网络入侵、病毒变异。
- 分类:将数据点划分到不同类别,如信用风险评估、医疗诊断(影像分析)、垃圾邮件过滤。
- 排名与推荐:根据用户偏好对项目进行排序,如搜索引擎结果、商品推荐(亚马逊、Netflix)、音乐推荐(Pandora)。
- 摘要:自动总结冗长文本的核心内容,如产品评论摘要。
- 决策:为自主系统(如火星车、自动驾驶汽车、游戏AI)制定行动策略。
在以下情况中,机器学习通常是必要的解决方案:
- 需要自动化和自主性的系统(如太空探测器)。
- 人类无法明确描述解决过程的任务(如视觉、听觉、自然语言理解)。
- 问题或模式会随时间变化(如用户兴趣、疾病发展)。
- 需要为海量用户或海量项目进行个性化(如在线广告投放)。
- 问题规模极其庞大,人工无法处理(如全网网页排序)。
数据与理解的平衡
上一节我们看到了数据的力量,但本节需要指出,仅有海量数据并不总是足够的。
像谷歌翻译和语音识别这样的成功案例表明,通过收集大量用户数据(及其修正反馈),系统性能可以持续提升。一个有趣的例子是图像修复:通过匹配海量数据库中的相似图像,可以智能地填充照片中缺失的部分。
然而,数据并非万能。谷歌的工程师们指出,当前挑战已从数据收集转向理解。例如,在学术引用中,一个错误引用可能因为被多次转载而比正确的引用更“流行”。如果算法只依赖数据出现的频率(流行度),就会强化这个错误。这就需要算法能够真正理解内容的语义,而不仅仅是匹配模式。
因此,未来的机器学习不仅需要处理大数据的能力,更需要推动走向能够真正理解数据含义的“人工智能”。
课程展望与总结
本节课中我们一起学习了机器学习的核心动机与定义。我们了解到,由于人类自身感知的局限性和某些任务的复杂性,我们需要让机器从数据中自行学习。机器学习在大数据时代的推动下,已广泛应用于预测、分类、推荐和决策等众多领域。同时,我们也认识到,在利用数据力量的同时,向机器注入“理解”能力是下一个重要的前沿。
本课程将使用数学作为描述和构建机器学习模型的语言。请不要畏惧,我们将从基础开始,逐步展示数学如何被用来解决这些激动人心的现实问题。如果你对学习新语言(数学)以创造酷炫事物感到兴奋,那么这门课正适合你。

准备好迎接一个充满“惊叹”的学期吧!
02:机器学习导论(二)🎓
在本节课中,我们将继续探索机器学习的核心思想,了解其背后的神经科学灵感,并认识其在现实世界中的广泛应用。我们将看到,通过利用大量数据,计算机可以学会识别图像、理解语言,甚至像人类一样“看”世界。
大脑的启示 🧠
上一节我们讨论了为何直接编程让计算机理解事物(如识别长颈鹿)非常困难。本节中我们来看看,人类大脑是如何处理这类感知任务的,这为机器学习算法提供了重要灵感。
神经科学研究表明,我们的大脑通过分层处理信息来理解世界。例如,在视觉皮层中,单个神经元只对特定模式的刺激(如特定角度的线条)产生反应。

以下是一个关键实验的发现:
- Hubel和Wiesel的实验:科学家将电极植入猫的大脑视觉皮层。他们发现,当屏幕上出现特定方向的条纹时,某个神经元会剧烈放电;当条纹方向改变,该神经元便停止放电。
- 结论:单个神经元负责识别图像中非常基础的特征(如边缘、角度)。复杂的物体(如一张脸)是由大量这样的神经元协同激活来表征的。
这个原理启发了人工神经网络的设计。我们可以构建一个网络,其底层的“神经元”学习识别图像中的基础特征(如边角),更高层的神经元则将这些基础特征组合起来,识别更复杂的模式(如眼睛、鼻子,最终整张脸)。
从大脑到算法:特征学习与自动编码器 🤖
理解了大脑的分层处理机制后,我们来看看如何用算法模拟这一过程。一个强大的工具是自动编码器。
自动编码器是一种特殊的神经网络,其目标是学习输入数据的高效表示。它的结构通常包含一个“瓶颈”层。
核心思想:网络尝试将输入数据(如图像)压缩成一个紧凑的编码(即“瓶颈”层的激活值),然后再从这个编码中尽可能准确地重建出原始输入。通过训练网络最小化输入与输出之间的差异,网络就学会了数据中最关键的特征。
以下是其工作流程的简化描述:
- 编码:输入数据通过网络前半部分被压缩为低维编码。公式可表示为:
编码 = f(输入) - 解码:编码通过网络后半部分被重建为输出。公式可表示为:
输出 = g(编码) - 训练目标:使
输出尽可能接近输入,即最小化两者之间的差异(如均方误差)。
谷歌著名的“识别猫”项目就运用了类似思想。他们用海量的YouTube视频帧训练了一个巨大的自动编码器网络。训练完成后,他们发现网络高层的一些神经元变得只对特定概念(如“人脸”或“猫”)敏感。这表明,通过无监督学习(仅使用数据本身,无需人工标签),机器可以自动发现数据中反复出现的重要模式。
机器学习的现实应用 🌍
现在,我们来看看基于数据学习的理念,在现实世界中催生了哪些变革性的应用。

计算机视觉 👁️
以下是几个关键领域:
- 人脸检测:早期基于规则的人脸检测程序(例如,寻找肤色和椭圆区域)非常脆弱,无法处理所有情况(如浅色眉毛)。现代方法通过收集数百万张标注好的人脸图片,让机器学习模型从中自动学习,从而实现了在各种条件下的鲁棒检测。
- 自动驾驶:让汽车识别行人、车辆、车道线是自动驾驶的核心挑战。公司通过收集并标注海量的道路场景图像,训练机器学习模型来实时感知环境。这有望大幅提升道路安全。
- 图像分类:直接告诉计算机“长颈鹿”的定义极其困难。但如果我们提供成千上万张标注为“长颈鹿”的图片,机器学习模型就能学会识别它,即使在新的、复杂的背景中。
自然语言处理与语音 🔤

文本和语音是机器学习的另一大用武之地。
- 机器翻译:早期基于语言学规则的翻译系统效果有限。如今,像谷歌翻译这样的系统,利用互联网上存在的海量双语对照文本(如加拿大议会的英法文件)进行训练,实现了质量更高的翻译,极大地促进了全球商务和交流。
- 搜索引擎:谷歌早期的成功离不开其利用网页链接数据(视为一种“标注”)来评估网页重要性的机器学习算法(PageRank)。
- 语音识别:将声音波形转化为文字。现代系统(如谷歌、微软)将音频信号预处理后,输入深度神经网络进行训练,模型的输出就是对应的文字序列。随着用户数据的不断反馈和积累,这些系统变得越来越精准。
其他领域 🎮
机器学习的应用无处不在。
- 推荐系统:分析你的观影、购物记录,预测并推荐你可能喜欢的内容。
- 关系挖掘:从海量文本中自动提取实体(如人物、地点)之间的关系。
- 体感交互:如微软Kinect,通过数百万个人体姿态的深度图像数据进行训练,从而能够实时、准确地识别人体的动作和姿势。


本节课中我们一起学习了机器学习如何从大脑处理信息的方式中获得灵感,并深入了解了自动编码器这一通过无监督学习提取数据特征的核心工具。我们看到,从人脸检测、自动驾驶到机器翻译和语音识别,通过利用大规模数据,机器学习技术正在深刻改变我们生活的方方面面。这些应用的共同关键在于:让系统能够从每一次交互和数据中持续学习,不断改进。
03:基础概率论 📊






在本节课中,我们将学习概率论的基础概念,这是理解机器学习算法的关键。我们将从概率的定义开始,逐步介绍两个核心操作:条件概率和边缘化。这些操作是所有高级机器学习算法(如自然语言处理、翻译、网页排名和语音识别)的基础。
什么是概率?🎯
概率是衡量不确定性或机会的一种方式。它并非仅仅基于频率,还依赖于领域知识,并且具有一定的主观性。
例如,考虑一个边长为1的正方形墙面。假设你蒙上眼睛向墙面投掷飞镖。墙面上有一个半径为0.5的圆形阴影区域。飞镖击中阴影区域的概率是多少?答案是阴影区域的面积除以墙面的总面积,即 π * (0.5)^2 / 1 = π/4。这个计算基于一个假设:飞镖击中墙上任何一点的机会是均等的。

另一种估算概率的方法是蒙特卡洛方法:反复投掷飞镖,计算击中阴影区域的次数占总投掷次数的比例。当投掷次数足够多时,这个比例会趋近于真实的概率值。
概率论的基本框架 📐


在概率论中,我们讨论样本空间、结果和事件。
- 样本空间 (Ω):所有可能结果的集合。例如,掷一个骰子的样本空间是 {1, 2, 3, 4, 5, 6}。
- 结果:样本空间中的单个元素。
- 事件:样本空间的一个子集。例如,“掷出偶数”这个事件对应子集 {2, 4, 6}。
我们可以为每个事件分配一个概率值。概率论建立在两个基本公理之上:
- 任何事件的概率都在0和1之间。空事件(不可能发生)的概率为0,整个样本空间(必然发生)的概率为1。
P(∅) = 0P(Ω) = 1
- 如果一系列事件
A1, A2, A3, ...互不相交(即没有重叠),那么这些事件中至少有一个发生的概率,等于它们各自概率的总和。P(A1 ∪ A2 ∪ A3 ∪ ...) = P(A1) + P(A2) + P(A3) + ...

如果两个事件 A 和 B 可能相交,那么“A或B发生”的概率公式为:
P(A ∪ B) = P(A) + P(B) - P(A ∩ B)
这里需要减去P(A ∩ B)是为了避免交集部分被重复计算两次。
条件概率 🧩

上一节我们介绍了概率的基本公理,本节中我们来看看条件概率。条件概率描述的是在已知某个事件 B 发生的情况下,另一个事件 A 发生的概率。
其直观理解是:在 B 发生的所有情况中,A 也发生的比例。公式定义如下:
P(A | B) = P(A ∩ B) / P(B)
其中P(A | B)读作“给定 B 时 A 的概率”。



这个公式可以改写为:
P(A ∩ B) = P(A | B) * P(B)
这个等式非常重要,它连接了联合概率P(A ∩ B)、条件概率P(A | B)和边缘概率P(B)。


链式法则是条件概率的推广。对于多个事件,其联合概率可以分解为一系列条件概率的乘积:
P(A, B, C) = P(A | B, C) * P(B | C) * P(C)

如果事件 A 的发生与否与事件 B 无关,则称 A 与 B 独立。此时,条件概率等于无条件概率:
P(A | B) = P(A)
并且联合概率简化为各自概率的乘积:P(A ∩ B) = P(A) * P(B)


边缘化 🧮


现在我们已经了解了如何通过条件概率将事件组合起来(链式法则),接下来看看反向操作:边缘化。边缘化允许我们从联合概率中“消除”或“求和掉”我们不关心的变量,从而得到我们感兴趣的变量的概率。


假设我们想知道事件 A 的概率 P(A),但我们只知道它与另一个变量 B 的联合概率 P(A, B)。如果变量 B 的所有可能取值构成了一个互斥且完备的集合(即覆盖了整个样本空间),那么 P(A) 可以通过对 B 的所有可能取值求和来得到:
P(A) = Σ_{b} P(A, B=b)
这个过程就是边缘化。它本质上是对联合概率中不关心的维度进行求和。

实例应用:摸球问题 🎱




让我们通过一个具体例子来实践条件概率和边缘化。假设一个盒子里有3个红球和1个蓝球。我们进行不放回抽球:先摸出一个球,记下颜色后放在一边,然后再摸第二个球。


我们定义随机变量:
X1表示第一个球的颜色(0代表红球,1代表蓝球)。X2表示第二个球的颜色(0代表红球,1代表蓝球)。



已知的先验和条件概率为:
P(X1=0) = 3/4,P(X1=1) = 1/4P(X2=0 | X1=0) = 2/3(第一个是红球,第二个还是红球的概率)P(X2=1 | X1=0) = 1/3P(X2=0 | X1=1) = 1(第一个是蓝球,第二个是红球的概率)P(X2=1 | X1=1) = 0


问题1:两个球都是红球的概率是多少?
这要求的是联合概率 P(X1=0, X2=0)。我们使用链式法则:
P(X1=0, X2=0) = P(X2=0 | X1=0) * P(X1=0) = (2/3) * (3/4) = 1/2
问题2:第二个球是红球的概率是多少?
这要求的是边缘概率 P(X2=0)。我们不知道第一个球是什么颜色,因此需要对 X1 的所有可能取值进行边缘化:
P(X2=0) = P(X2=0, X1=0) + P(X2=0, X1=1)
= [P(X2=0 | X1=0) * P(X1=0)] + [P(X2=0 | X1=1) * P(X1=1)]
= (2/3 * 3/4) + (1 * 1/4) = 1/2 + 1/4 = 3/4
我们可以用向量和矩阵运算简洁地表示这个过程。令概率向量 p1 = [P(X1=0), P(X1=1)]^T = [3/4, 1/4]^T,条件概率矩阵 M 的 (i, j) 元素为 P(X2=j | X1=i),即:
M = [[2/3, 1/3],
[ 1 , 0 ]]
那么第二个球颜色的概率分布 p2 可以通过矩阵乘法得到:
p2 = M^T * p1
计算可得 p2 = [3/4, 1/4]^T,这与我们手动计算 P(X2=0)=3/4, P(X2=1)=1/4 的结果一致。
总结 📝
本节课中我们一起学习了概率论的基础。
- 我们首先明确了概率是衡量不确定性的工具。
- 然后建立了基于样本空间、事件和概率公理的形式化框架。
- 我们深入探讨了两个核心操作:
- 条件概率 (P(A|B)):在已知部分信息(B发生)的情况下,更新对事件A发生的信念。
- 边缘化:通过对不关心的变量求和,从联合分布中得到特定变量的分布。
- 我们通过链式法则将多个变量的联合概率分解为条件概率的乘积。
- 最后,我们用一个摸球的实例演示了如何运用条件概率和边缘化解决实际问题,并展示了其与线性代数中向量/矩阵运算的关联。




理解和熟练运用条件概率与边缘化,是构建和理解复杂机器学习模型(如贝叶斯网络、隐马尔可夫模型等)的基石。在接下来的课程中,我们将基于这些概念推导出非常重要的贝叶斯规则。
04:条件概率、边缘化与贝叶斯规则 🎲

在本节课中,我们将学习概率论的两个核心规则——条件概率和边缘化,并了解如何将它们应用于实际问题,例如理解谷歌的PageRank算法。我们还将学习贝叶斯规则,这是一个强大的工具,用于在获得新证据后更新我们的信念。
回顾:条件概率与边缘化
上一节我们介绍了概率的基本概念。本节中,我们来看看两个关键规则:条件概率和边缘化。
条件概率 允许我们从已知单个事件的概率,计算多个事件同时发生的概率。其公式为:
P(A and B) = P(B | A) * P(A)
例如,从装有3个红球和1个蓝球的袋子中,第一次抽到红球且第二次也抽到红球的概率,等于第二次抽到红球(在第一次是红球的条件下)的概率乘以第一次抽到红球的概率。
边缘化 则相反,它允许我们从联合概率(多个事件)中推导出单个事件的概率。其方法是求和:
P(B) = Σ P(A and B) 对所有可能的A求和
例如,想知道第二次抽到红球的概率,我们需要考虑第一次抽球的所有可能情况(红或蓝),并将每种情况下“第一次抽到某颜色且第二次抽到红球”的概率相加。
为了更高效地处理这类问题,我们引入了矩阵表示法。用变量 x 表示抽球结果(例如,0代表红球,1代表蓝球),初始概率可以表示为一个向量 π1,条件概率可以表示为一个矩阵 G。那么,第二次抽球的概率分布 π2 可以通过矩阵乘法得到:
π2 = π1 * G
这种表示法简洁有力,便于进行连续多次的概率计算。
从概率到谷歌PageRank算法 🕸️
理解了条件概率和矩阵表示后,我们来看看一个著名的应用:谷歌的网页排名(PageRank)算法。
PageRank的核心思想是:一个网页的重要性取决于链接到它的其他网页的数量和重要性。这很像我们之前讨论的概率传播过程。
以下是PageRank算法的简化步骤:
- 构建链接矩阵:将整个互联网视为一个巨大的图,网页是节点,超链接是边。创建一个矩阵
G,其中元素G[i][j]表示从网页j跳转到网页i的概率(通常假设用户随机点击页面上的一个链接)。 - 处理特殊问题:
- 可约简性:确保网络是充分连接的,没有完全独立的子图。谷歌通过给矩阵所有元素加上一个极小的值
ε来解决。 - 周期性:避免陷入循环。添加
ε也有助于打破严格的循环。
- 可约简性:确保网络是充分连接的,没有完全独立的子图。谷歌通过给矩阵所有元素加上一个极小的值
- 计算稳定状态:从一个任意的初始概率分布向量
π0(例如,所有网页等概率)开始,反复乘以矩阵G:
经过多次迭代后,向量π1 = π0 * G π2 = π1 * G ... πk = π(k-1) * Gπ会收敛到一个稳定状态,即π * G = π。这个稳定的π向量中的每个值就代表了对应网页的PageRank分数(重要性)。 - 排序与检索:当用户搜索一个关键词(如“cat”)时,系统会找出所有包含该词的网页,然后按照这些网页的PageRank分数从高到低进行排序,返回结果。
本质上,PageRank算法就是计算一个巨大随机矩阵的主特征向量(对应特征值为1)。谷歌利用MapReduce等分布式计算框架来处理这个海量矩阵乘法。
贝叶斯规则:反转概率 🔄
现在,我们转向另一个核心概念——贝叶斯规则。它源于我们已学的条件概率规则。
我们知道:
P(A and B) = P(B | A) * P(A) = P(A | B) * P(B)
由等式第二部分可以推导出贝叶斯规则:
P(B | A) = [P(A | B) * P(B)] / P(A)
其中 P(A) 可以通过边缘化计算:P(A) = Σ P(A | B_i) * P(B_i),对所有可能的 B_i 求和。

贝叶斯规则的意义在于“反转”条件概率。如果我们知道在某个假设 B 下观察到数据 A 的概率(似然度),以及假设 B 本身的先验概率,那么当观察到数据 A 后,我们就可以计算假设 B 成立的后验概率。



贝叶斯规则应用实例 🧩

以下是贝叶斯规则可以解决的几类经典问题:


- 医学测试:已知某种疾病的患病率(先验概率)和检测准确率(似然度)。当一个人检测结果为阳性时,他真正患病的概率(后验概率)是多少?结果往往出人意料。
- 蒙提霍尔问题:在三扇门后分别有两只山羊和一辆汽车。你选择一扇门后,知道答案的主持人打开另一扇有山羊的门。此时,更换选择是否会增加赢得汽车的概率?贝叶斯规则给出了明确答案。
- 语音识别:计算机可以轻松地将单词转换为声音(文本转语音)。但反过来,从声音推断出单词(语音识别)则困难得多。因为多个单词可能产生相似的声音,这正是一个典型的贝叶斯推理问题:在听到声音(数据)后,计算最可能是哪个单词(假设)产生了它。
以医学测试为例,假设疾病患病率 P(D)=1/10000,检测准确率 P(T+|D+)=0.99,P(T-|D-)=0.99。当一个人检测为阳性时,他真正患病的后验概率为:
P(D+ | T+) = P(T+ | D+) * P(D+) / [ P(T+ | D+) * P(D+) + P(T+ | D-) * P(D-) ]
代入计算后会发现,这个概率远低于直觉的99%。这凸显了结合先验知识(患病率)进行推理的重要性。
总结 📝
本节课中我们一起学习了:
- 概率论两大基石:条件概率(
P(A and B) = P(B|A)P(A))和边缘化(P(B) = Σ P(A and B))。 - 矩阵表示法:用向量和矩阵表示概率分布与转移,使计算更高效,并自然引出了特征向量的概念。
- 谷歌PageRank算法:一个将概率论和图论结合的实际应用,通过计算随机矩阵的主特征向量来评估网页重要性。
- 贝叶斯规则:一个由条件概率推导出的强大公式(
P(B|A) = P(A|B)P(B)/P(A)),用于在获得新证据后更新对假设的信念。我们看到了它在医学诊断、游戏策略和人工智能(如语音识别)中的关键作用。


掌握这些概念,你就拥有了理解许多现代机器学习与数据挖掘算法的基础工具。
05:贝叶斯入门 🧠
在本节课中,我们将学习贝叶斯规则,并通过几个经典问题来理解其应用。我们将看到,即使面对看似违反直觉的情况,贝叶斯推理也能提供清晰的答案。


上一节我们介绍了贝叶斯规则的基本概念,本节中我们来看看如何用它解决实际问题。
问题一:疾病检测的担忧 😟

你被告知一项准确率为99%的检测显示你患有某种疾病。你应该担心吗?尽管这种疾病在人群中非常罕见,但大多数人最初都会感到担忧。今天我们将通过计算来解答这个问题。
以下是计算过程:
- 定义事件:
D:患有疾病。T:检测结果为阳性。
- 已知概率:
- 疾病在人群中的先验概率:
P(D) = 0.001(即0.1%)。 - 检测准确率:
P(T|D) = 0.99(患病时检测为阳性的概率)。 - 误报率:
P(T|¬D) = 0.01(未患病时检测为阳性的概率)。
- 疾病在人群中的先验概率:
- 应用贝叶斯公式:
我们想知道检测为阳性后真正患病的概率,即P(D|T)。
根据贝叶斯公式:
其中,P(D|T) = [P(T|D) * P(D)] / P(T)P(T) = P(T|D)*P(D) + P(T|¬D)*P(¬D) = 0.99*0.001 + 0.01*0.999 ≈ 0.01098
因此:
计算结果显示,即使检测为阳性,你真正患病的概率也仅为约9%,远低于直觉判断。P(D|T) ≈ (0.99 * 0.001) / 0.01098 ≈ 0.0902
结论:基于先验知识(疾病罕见),即使检测准确率高,阳性结果也不意味着大概率患病。因此,无需过度担忧。


解决了疾病检测问题后,我们来看一个更著名的概率谜题。
问题二:蒙提霍尔问题 🚪


在一个游戏场景中,有三扇门。两扇门后是山羊,一扇门后是大奖。你选择了1号门。随后,知道门后情况的主持人打开了3号门,后面是一只山羊。主持人问:你是否要换到2号门?
大多数人直觉上会选择换门。今天我们将看到贝叶斯规则如何预测这是正确的做法。
以下是推理过程:
- 定义假设与数据:
- 假设
H:大奖所在的门(H1,H2,H3分别对应门1、2、3)。 - 数据
D:主持人打开了3号门,且后面是山羊。
- 假设
- 先验概率:
最初,大奖在任一扇门后的概率相等:P(H1) = P(H2) = P(H3) = 1/3 - 似然度:
在每种假设下,主持人打开3号门(且是山羊)的概率:- 如果大奖在1号门后(
H1),主持人可以随机打开2号或3号门(都是山羊)。所以P(D|H1) = 1/2。 - 如果大奖在2号门后(
H2),主持人必须打开3号门(因为不能打开有奖的2号门)。所以P(D|H2) = 1。 - 如果大奖在3号门后(
H3),主持人不能打开3号门(因为后面是大奖)。所以P(D|H3) = 0。
- 如果大奖在1号门后(
- 应用贝叶斯规则计算后验概率:
根据贝叶斯公式P(H|D) ∝ P(D|H) * P(H),并归一化:P(H1|D) ∝ (1/2) * (1/3) = 1/6P(H2|D) ∝ 1 * (1/3) = 1/3P(H3|D) ∝ 0 * (1/3) = 0
归一化后(总和为1/2):
P(H1|D) = (1/6) / (1/2) = 1/3 P(H2|D) = (1/3) / (1/2) = 2/3 P(H3|D) = 0
结论:在主持人打开3号门显示山羊后,大奖在2号门后的概率是2/3,而在你最初选择的1号门后的概率仅为1/3。因此,换门能将获胜概率从1/3提高到2/3。
贝叶斯规则:从不确定性到推理 🔄
我们之前看到,贝叶斯规则为我们提供了一种认知模型。在我们的大脑中,存在许多关于世界的假设(例如,一个物体可能是什么)。当我们接收到数据(例如,一个标签或感官输入)时,我们会根据似然度来评估这些数据与每个假设的匹配程度。通过将先验概率与似然度相乘并归一化,我们得到后验概率分布,它代表了我们在新证据下更新后的信念。
在下一节课中,我们将看到如何用图模型来表示这些关系,并且能够处理包含成千上万个变量的大型网络,而不仅仅是两个变量。

总结 📝
本节课中我们一起学习了:
- 贝叶斯规则的应用:通过疾病检测和蒙提霍尔问题,我们实践了如何利用先验信息和新的观测数据来更新对事件的概率判断。
- 核心概念:我们明确了先验概率、似然度和后验概率在贝叶斯推理中的作用。
- 认知模型:贝叶斯规则不仅是一个数学工具,也是理解人类如何进行不确定环境下推理的有效模型。
- 决策启示:正确的决策不仅取决于测试或证据的“准确性”,还强烈依赖于事件的基础发生率(先验概率)。

贝叶斯思维鼓励我们持续整合新证据来修正原有的看法,这是一种强大的学习和决策框架。
06:贝叶斯规则与贝叶斯网络 📊
在本节课中,我们将学习贝叶斯规则的应用,并引入一个强大的工具——贝叶斯网络(也称为概率图模型)。我们将探讨如何用它来简洁地表示多变量联合概率分布,并理解变量间的条件独立性。最后,我们会看到维度灾难如何使概率推断变得困难,以及贝叶斯网络如何帮助我们应对这一挑战。


回顾:蒙提霍尔问题与贝叶斯推断
上一节我们介绍了如何使用贝叶斯规则进行概率推断。我们通过一个经典例子——蒙提霍尔问题——进行了实践。
在这个问题中,有三扇门,一扇后面有奖品。参赛者选择一扇门(例如1号门)后,知道奖品位置的主持人会打开另一扇没有奖品的门。然后,参赛者需要决定是否更换选择。

我们通过定义先验概率和似然度,计算了在观察到主持人打开特定门(例如3号门)后,奖品在各扇门后的后验概率。


以下是计算后验概率的核心步骤,涉及边缘化和条件概率:
- 边缘化:为了计算证据的概率
P(D=3),我们对所有可能的假设(奖品位置)求和:
P(D=3) = Σ_{h=1,2,3} P(D=3|H=h) * P(H=h) - 贝叶斯规则:然后计算每个假设的后验概率:
P(H=h|D=3) = [P(D=3|H=h) * P(H=h)] / P(D=3)
通过代入数值,我们得出在主持人打开3号门后,奖品在2号门后的概率是2/3,因此更换选择是更优策略。
维度灾难与概率表示 🧩

当我们处理多个随机变量时,直接表示其联合概率分布会变得非常困难。这就是所谓的“维度灾难”。
假设我们有三个二值变量 A, B, C。要完整描述它们的联合分布 P(A, B, C),我们需要一个有 2^3 = 8 行的概率表(由于概率和为1,实际需要7个独立参数)。对于 n 个二值变量,参数数量约为 2^n - 1,这是一个指数级增长的数字。对于成百上千的变量,这在计算上是不可行的。
贝叶斯网络:一种简洁的表示法
为了应对维度灾难,我们引入贝叶斯网络。它是一个有向无环图,其中:
- 节点代表随机变量。
- 有向边表示变量之间的直接依赖关系(注意:是相关性,不一定是因果关系)。
贝叶斯网络的核心思想是因子分解。它假设一个变量在给定其父节点的条件下,独立于它的所有非后代节点。因此,联合概率分布可以分解为一系列条件概率的乘积:
P(X1, X2, ..., Xn) = Π_{i=1 to n} P(Xi | Parents(Xi))
举例说明:
考虑一个简单的网络:Cloudy -> Sprinkler, Cloudy -> Rain, Sprinkler & Rain -> WetGrass。
P(C, S, R, W) = P(C) * P(S|C) * P(R|C) * P(W|S, R)- 我们只需要存储几个较小的概率表(例如
P(C),P(S|C)等),而不是一个巨大的2^4=16行的联合表。这极大地减少了所需参数的数量。

条件独立性的三种基本结构


贝叶斯网络的图结构直观地揭示了变量间的条件独立性。以下是三种基本结构:
-
顺连结构 (Causal Chain)
- 示例:Cloudy -> Rain -> WetGrass。
- 规则:如果已知中间变量 Rain 的状态,那么 WetGrass 与 Cloudy 条件独立。
- 公式:
W ⊥ C | R
-
分连结构 (Common Cause)
- 示例:Rain <- Cloudy -> Sprinkler。
- 规则:如果已知共同原因 Cloudy 的状态,那么它的两个结果 Rain 和 Sprinkler 条件独立。
- 公式:
R ⊥ S | C



- 汇连结构 (Common Effect)
- 示例:Rain -> WetGrass <- Sprinkler。
- 规则:当共同结果 WetGrass 未知时,它的两个原因 Rain 和 Sprinkler 是独立的。但是,一旦 WetGrass 被观测到,Rain 和 Sprinkler 就不再独立(因为一个原因的信息会影响对另一个原因的推断),这称为“解释 away”效应。
- 公式:当 W 未观测时,
R ⊥ S;当 W 被观测后,R NOT ⊥ S | W


理解这些结构是进行高效概率推断的基础。


贝叶斯网络的应用实例 🌍

贝叶斯网络因其强大的表示和推理能力,被广泛应用于各个领域:

- 医疗诊断:根据症状推断疾病概率。
- 故障诊断(如打印机、复杂机械):根据观测到的错误信息定位根本原因。
- 基因调控网络:分析基因之间的相互作用关系。
- 环境建模与决策:模拟生态系统中多变量(如水位、降雨、偷水行为)的相互影响,辅助政策制定。
- 金融风控与市场营销:评估客户信用风险,或预测用户对香水等产品的偏好,实现精准营销。
- 人工智能:作为不确定性推理的基石,允许系统进行局部计算,高效得出结论。
总结

本节课我们一起学习了:
- 贝叶斯推断的实践:通过蒙提霍尔问题巩固了先验、似然、后验的计算。
- 维度灾难:认识到直接表示多变量联合分布的困难性。
- 贝叶斯网络:引入了用有向无环图来简洁表示联合分布的方法,其核心是因子分解公式:
P(X1,...,Xn) = Π P(Xi|Parents(Xi))。 - 条件独立性:学习了顺连、分连、汇连三种基本图结构所蕴含的条件独立关系,这是理解变量间依赖和进行高效推理的关键。
- 广泛应用:看到了贝叶斯网络从医疗、工程到商业、生态等多个领域的强大实用性。


贝叶斯网络为我们提供了一套系统的方法,以可管理的方式对复杂世界中的不确定性进行建模和推理。在接下来的课程中,我们将学习如何在这些网络上进行概率推断,以及如何从数据中自动学习网络结构和参数。
07:贝叶斯网络推理入门 🧠


在本节课中,我们将学习如何在贝叶斯网络中进行推理计算。我们将从一个简单的“洒水器网络”示例开始,手动计算边际概率,并理解如何通过动态规划技术将指数级复杂度的计算优化为多项式复杂度。

软件工具介绍 💻


上一节我们介绍了贝叶斯网络的基本概念,本节中我们来看看有哪些工具可以帮助我们进行建模和计算。虽然我们会手动处理小型网络以加深理解,但在处理大型网络时,通常会借助软件。


以下是两个实用的工具示例:


- Java贝叶斯网络工具 (JavaBayes):这是一个在线Applet,提供了图形化界面。你可以创建节点、绘制图结构、输入先验概率和条件概率表(CPT),并执行查询。对于课程中的四节点网络,你可以用它来验证手动计算的结果。
- 商业软件 (如Norsys):在工业界,有更专业的软件(如温哥华的Norsys公司开发的工具)用于处理更复杂的贝叶斯网络应用,例如市场营销、风险管理和医疗健康领域。

掌握小型网络的手动推理,有助于理解这些大型软件背后的原理。


概率推理的实际应用 🎯
理解概率推理不仅是学习理论,它也是许多现代应用的基础。这些应用构建在基本的概率概念之上。
以下是一些高级应用的例子:
- 概率分类模型:在课程后期,我们将学习能够根据数据点(例如左图中的彩色点)计算空间中任意一点属于某个类别(如红色或绿色)的概率的模型。这类模型的核心就是概率计算。
- 微软Kinect体感设备:Kinect使用机器学习算法来实时预测用户身体各部位(如肩膀、头部)的位置。其底层算法(如课程末尾会讲到的算法)依赖于概率推理。
- 医疗图像分析:类似的技术可以用于医学领域,例如在CT或MRI图像中自动识别和定位器官(如肾脏),或帮助医生检测肿瘤等异常情况。利用技术自动化部分医疗流程,对于应对人口老龄化带来的医疗系统压力具有重要意义。
这些高级应用的目标,驱使我们必须先打好概率推理的基础。
网络模型与概率表示 📊
现在,让我们开始今天的核心内容:推理。我们将使用一个经典的“洒水器网络”作为示例。该网络包含四个二值变量:阴天(C)、洒水器(S)、下雨(R)和草地湿(W)。
其图模型表示如下:
- C -> S (阴天影响是否打开洒水器)
- C -> R (阴天影响是否下雨)
- S -> W (洒水器影响草地是否湿)
- R -> W (下雨影响草地是否湿)
每个变量都关联一个概率分布:
- 先验概率 P(C):这是一个关于C的分布。
- 公式:
P(C=0) = 0.5,P(C=1) = 0.5 - 可以表示为表格
[0.5, 0.5]或柱状图。
- 公式:
- 条件概率 P(S|C):这是一个在给定C时,关于S的分布。
- 例如,
P(S|C=1) = [0.9, 0.1]表示如果阴天,洒水器打开的概率是0.9。 - 注意,
sum_{S} P(S|C=1) = 0.9 + 0.1 = 1。
- 例如,
- 条件概率 P(R|C) 和 P(W|S,R):同理。P(W|S,R) 有两位父节点,其条件概率表(CPT)包含 2^3 = 8 个值(但只需指定4个,因为每行和为1)。
联合概率:例如,变量C和S的联合概率 P(C, S) 可以通过链式法则计算:P(C, S) = P(S|C) * P(C)。这将产生一个2x2的表格,其所有条目之和为1。
条件作用的优先级:表达式 P(W | S=0, R=1) 应理解为 P(W | (S=0, R=1)),即给定S=0且R=1时,W的分布。从CPT中查找,对应 S=0, R=1 的行,得到 P(W=1 | S=0, R=1) = 0.9。这些概率值可以从实际数据中学习得到,但在学习之前,我们需要先掌握在给定模型下的推理。
边际概率计算:暴力求和法 ⚙️
推理的核心任务之一是计算边际概率。例如,我们想计算 P(S=1),即洒水器打开的概率。
根据概率论,当我们不知道其他变量的值时,需要对它们进行求和(即边际化):
P(S=1) = sum_{C, R, W} P(C, R, W, S=1)
利用网络的因子化性质,联合概率可分解为:
P(C, R, W, S=1) = P(C) * P(S=1|C) * P(R|C) * P(W|S=1, R)
因此,目标计算为:
P(S=1) = sum_{C} sum_{R} sum_{W} P(C) * P(S=1|C) * P(R|C) * P(W|S=1, R)
暴力计算法:最直接的方法是枚举所有变量 (C, R, W) 的 2^3 = 8 种可能取值组合,分别代入公式计算后求和。
- 计算成本:需要进行 8 * 3 = 24 次乘法运算(每次计算涉及4个概率相乘,但P(C)等对于固定组合是常数)。
- 代码实现:这对应于三层嵌套的循环。对于包含n个二值变量的网络,这种方法的复杂度是 O(2^n),是指数级的,对于大规模网络不可行。
边际概率计算:动态规划优化法 🚀
暴力法的低效在于它进行了大量重复的乘法运算。优化的关键是利用分配律,将求和与乘积操作重新排序,先进行局部求和,存储中间结果,再传递给外层循环。
让我们对 P(S=1) 的计算过程进行优化:
-
首先对 W 求和:注意到
P(W|S=1,R)只依赖于 W 和 R,而P(C),P(S=1|C),P(R|C)与 W 无关。因此,可以将内层对W的求和提前:
P(S=1) = sum_{C} sum_{R} [ P(C) * P(S=1|C) * P(R|C) * ( sum_{W} P(W|S=1, R) ) ]
由于sum_{W} P(W|S=1, R) = 1(条件概率分布归一化),内层求和结果恒为1。我们将其记为中间值φ(R) = 1。在实际更复杂的网络中,φ(R)可能不是一个常数,而是一个依赖于R的函数(向量)。 -
然后对 R 求和:现在表达式简化为:
P(S=1) = sum_{C} [ P(C) * P(S=1|C) * ( sum_{R} P(R|C) * φ(R) ) ]
我们计算对R的求和,并将其结果记为另一个中间值ψ(C) = sum_{R} P(R|C) * φ(R)。ψ(C)是一个依赖于C的向量(C=0和C=1分别对应一个值)。 -
最后对 C 求和:最终计算变为:
P(S=1) = sum_{C} P(C) * P(S=1|C) * ψ(C)
这只需要对C的两种状态进行循环计算即可。
优化效果:
- 计算复杂度:从指数级的 O(2^n) 降低到了多项式级别。对于此例,我们只需要进行顺序的三层循环,每层循环次数等于该变量的取值个数。总操作次数约为
|C| + |R|*|C| + |W|*|R|(此处|·|表示取值个数)。 - 存储开销:我们通过存储中间结果
φ(R)和ψ(C)(可能不是标量而是向量)来避免重复计算,这是典型的空间换时间策略。 - 算法名称:这种通过存储子问题解来避免重复计算的方法,正是动态规划的核心思想。
- 数值稳定性提示:在实际编程中,直接连乘许多小概率值可能导致下溢(结果四舍五入为0)。通常的做法是在对数空间中进行计算,将乘法变为加法,最后再取指数,这样可以提高数值稳定性。
代码结构示意:
初始化 psi 向量(长度为 |C|)
for c in 所有C的取值:
初始化 phi 标量(或向量,若内层和不为1)
for r in 所有R的取值:
phi += P(W|S=1, r) # 这里假设对W求和已解析为1,实际可能需内层循环
psi[c] = sum_{r} ( P(r|C=c) * phi )
最终结果 = sum_{c} ( P(C=c) * P(S=1|C=c) * psi[c] )
总结与扩展 📝
本节课中我们一起学习了贝叶斯网络推理的基础:
- 推理任务:我们以计算边际概率
P(S=1)为例,展示了如何在给定网络参数后回答查询。 - 两种方法:
- 暴力枚举法:直观但计算成本随变量数指数增长,不可行于大规模网络。
- 动态规划法:通过巧妙地利用分配律,重新排列求和与乘积顺序,并存储中间结果,将计算复杂度降至多项式级别。这是实际算法(如联结树算法)的基础。
- 核心思想:对于树状或稀疏连接的图,总存在一种变量消元顺序,可以高效地进行精确推理。对于稠密图,精确推理可能依然困难,但动态规划的思想是许多近似推理算法的起点。

理解这个简单网络的手动推理过程,是掌握复杂概率图模型推理的关键第一步。在作业和后续课程中,你将有机会应用这些技术解决更复杂的问题。
08:隐马尔可夫模型 (HMM) 🧠
在本节课中,我们将要学习隐马尔可夫模型。这是一种在序列数据分析中至关重要的模型,广泛应用于语音识别、基因组测序和金融预测等领域。我们将从一个简单的例子入手,理解其核心概念,然后学习如何使用该模型进行预测和滤波。
模型简介与简单示例 🤖
想象你有一个玩具机器人,它的任务是判断你的情绪是快乐还是悲伤。机器人无法直接观察你的情绪,但可以观察到你的行为:看电视、睡觉、哭泣或刷社交媒体。我们称你的情绪为状态(用 X 表示),机器人的观察为观测(用 Y 表示)。状态是隐藏的,观测是可见的,因此这是一个“隐”马尔可夫模型。
为了进行概率推断,我们需要三个组成部分:
- 初始状态概率
P(X0):表示在初始时刻,你是快乐或悲伤的先验概率。 - 状态转移概率
P(Xt | Xt-1):表示在给定前一时刻情绪状态下,当前时刻情绪状态的概率。例如,快乐的人下一时刻很可能保持快乐。 - 观测概率
P(Yt | Xt):表示在给定当前情绪状态下,做出某种特定行为的概率。例如,悲伤时更可能哭泣。
这些概率通常以表格形式给出。例如:
P(X0 = 快乐) = 0.8,P(X0 = 悲伤) = 0.2P(Y = 看电视 | X = 快乐) = 0.4,P(Y = 哭泣 | X = 快乐) = 0.1等。

有了这些,我们就可以使用贝叶斯规则计算后验概率,例如 P(快乐 | 观测到看电视)。
引入时间序列与图模型 ⏳
然而,人的情绪具有持续性。如果机器人知道过去几个小时你都很开心,那么你现在开心的可能性就更高。因此,我们需要引入时间维度,将状态和观测序列化:X0, X1, X2, ... 和 Y1, Y2, Y3, ...。

这可以用一个图模型清晰地表示:
- 每个状态
Xt只依赖于前一个状态Xt-1(马尔可夫性)。 - 每个观测
Yt只依赖于当前的状态Xt。
整个序列的联合概率可以分解为:
P(X0, X1, ..., XT, Y1, ..., YT) = P(X0) * ∏_{t=1}^T [P(Xt | Xt-1) * P(Yt | Xt)]
我们的核心目标,是计算在给定截止到当前时刻的所有观测序列 Y1:T 后,当前状态 Xt 的概率分布,即 P(Xt | Y1:T)。这个过程称为滤波。
滤波算法:预测与更新 🔄
滤波可以通过一个递归过程高效实现,该过程交替进行两个步骤:预测和更新。假设我们已经计算出了上一时刻的后验概率 P(Xt-1 | Y1:t-1)。
1. 预测步骤
预测步骤的目标是,在纳入新的观测 Yt 之前,估计当前状态 Xt 的概率。这通过将上一时刻的后验概率与状态转移模型结合来实现:
P(Xt | Y1:t-1) = Σ_{Xt-1} [ P(Xt | Xt-1) * P(Xt-1 | Y1:t-1) ]
这个公式的含义是:对 Xt-1 所有可能的状态(快乐/悲伤)进行求和。对于每一种可能,用“从该状态转移到 Xt 的概率”乘以“我们之前认为处于该状态的概率”。这本质上是对 Xt-1 的边缘化。
2. 更新步骤
更新步骤的目标是,当新的观测 Yt 到来时,用这个新信息来修正我们的预测。这通过应用贝叶斯规则来实现:
P(Xt | Y1:t) = ( P(Yt | Xt) * P(Xt | Y1:t-1) ) / ( Σ_{Xt} [ P(Yt | Xt) * P(Xt | Y1:t-1) ] )
这个公式的含义是:分子是“在当前状态下得到该观测的可能性”乘以“我们之前对该状态的预测概率”。分母是一个归一化常数,确保所有状态的概率之和为1。这里的关键在于,给定当前状态 Xt 时,新的观测 Yt 与过去的观测 Y1:t-1 是独立的。
通过交替执行预测和更新步骤,我们可以从初始概率 P(X0) 开始,随着每一个新观测的到来,持续地估计当前最可能的状态。
模型的应用与扩展 🌐
隐马尔可夫模型是许多强大应用的基础:
- 目标跟踪:
X代表物体的位置,Y代表视频帧中的图像特征。 - 设备诊断:
X代表机器内部组件(如火星车车轮)的健康状态,Y代表传感器读数。 - 语音识别:
X代表音素或单词,Y代表声音信号的声学特征。更复杂的层次化HMM可以建模从声音到单词再到句法的整个过程。 - 生物信息学:
X代表DNA序列的功能区域(如编码区),Y代表测序得到的碱基序列。
这些复杂应用的核心,仍然是基于概率论中边缘化和条件概率(贝叶斯规则)这两个基本概念所构建的预测与更新递归。


总结 📝




本节课我们一起学习了隐马尔可夫模型。我们从判断情绪状态的简单示例开始,引入了隐藏状态、观测、初始概率、转移概率和观测概率等核心概念。通过图模型,我们理解了状态与观测之间的依赖关系。最重要的是,我们推导并理解了滤波算法的两个核心步骤:预测(利用状态转移模型向前推算)和更新(利用新观测通过贝叶斯规则进行修正)。这个递归算法使得HMM能够高效地处理时间序列数据,并广泛应用于从机器人技术到生物学的众多领域。
09:期望、概率与伯努利模型 🎲


在本节课中,我们将学习概率论中的几个核心概念:随机变量、期望、方差,并重点介绍一个非常基础的模型——伯努利模型。这些概念是理解后续更复杂机器学习模型的基础。


随机变量与概率分布 📊
上一节我们介绍了概率的基本公理。本节中,我们来看看如何用随机变量来描述我们关心的事件。

随机变量是将样本空间中的结果映射到我们感兴趣的事件集合上的函数。我们首先关注最简单的二元随机变量,它只有两种可能的结果(例如:是/否、正面/反面、偶数/奇数)。
定义:对于一个样本空间 Ω,一个二元随机变量 X 是一个函数,它将每个样本点 ω ∈ Ω 映射到两个值之一(例如 0 或 1)。
示例:考虑一个六面骰子,样本空间 Ω = {1, 2, 3, 4, 5, 6}。我们可能只关心结果是“偶数”还是“奇数”。我们可以定义一个随机变量 X:
- 当 ω ∈ {2, 4, 6} 时,X = 1 (代表“偶数”)
- 当 ω ∈ {1, 3, 5} 时,X = 0 (代表“奇数”)
随机变量的行为由其概率分布描述。对于二元随机变量,分布由两个概率值完全确定:
- P(X = 1) = p
- P(X = 0) = 1 - p
其中 p 是变量取值为 1 的概率,且 p + (1 - p) = 1。

我们也可以用累积分布函数来描述,它是概率的累加和,在模拟随机抽样时非常有用。

期望:概率的加权平均 ⚖️
期望是随机变量所有可能取值的加权平均,权重就是对应的概率。
公式:对于随机变量 X,其期望 E[X] 定义为:
E[X] = Σ (x_i * P(X = x_i)),其中求和遍及 X 所有可能的取值 x_i。
一个非常有用的工具是指示变量。对于任意事件 A,指示变量 I_A 定义为:
- I_A(ω) = 1, 如果 ω ∈ A
- I_A(ω) = 0, 如果 ω ∉ A




指示变量的期望有一个简洁的性质:
E[I_A] = 1 * P(A) + 0 * P(非A) = P(A)
这个公式揭示了期望与概率之间的深刻联系:一个事件的指示变量的期望,就等于该事件发生的概率。 对于二元随机变量,其期望值就等于它取值为 1 的概率。


伯努利模型:有偏的硬币 🪙



现在,我们引入一个参数化的概率模型——伯努利模型,它常用于描述像抛硬币这样的二元结果实验。现实中,硬币可能不是公平的,它出现正面的概率可能不是 1/2。

我们用一个参数 θ (theta) 来表示硬币出现“正面”(或取值为 1)的概率,θ 的取值范围在 0 到 1 之间。那么,伯努利分布可以写成:
P(X = 1 | θ) = θ
P(X = 0 | θ) = 1 - θ

我们可以用一个更紧凑的公式来统一表示:
P(X = x | θ) = θ^x * (1 - θ)^(1 - x),其中 x ∈ {0, 1}。
- 当 x = 1 时,公式简化为 θ。
- 当 x = 0 时,公式简化为 1 - θ。
根据期望的定义,伯努利变量的期望是:
E[X | θ] = 1 * θ + 0 * (1 - θ) = θ
这再次印证了,期望值就是参数 θ 本身。



方差:衡量不确定性 📈
仅仅知道平均值(期望)还不够,我们还需要知道结果的波动性或不确定性。方差就是衡量这种离散程度的指标。
定义:方差是随机变量与其期望值之差的平方的期望。
Var(X) = E[(X - E[X])^2]
对于伯努利变量 X ~ Bernoulli(θ),其方差为:
Var(X | θ) = E[(X - θ)^2] = (1 - θ)^2 * θ + (0 - θ)^2 * (1 - θ) = θ(1 - θ)

以下是关于方差的一些关键点:
- 当 θ = 0.5 时,方差最大,为 0.25。这意味着不确定性最高,结果最难预测。
- 当 θ 接近 0 或 1 时,方差趋近于 0。这意味着不确定性很低,结果几乎可以确定(总是反面或总是正面)。
- 方差函数
θ(1 - θ)是一个开口向下的抛物线,在 θ = 0.5 处取得最大值。
独立性与联合分布 🔗
最后,如果我们进行多次独立的伯努利试验(例如,多次抛掷同一枚硬币),那么这些结果的联合概率就是各自概率的乘积。
公式:对于 n 个独立同分布的伯努利变量 X1, X2, ..., Xn,且都服从 Bernoulli(θ),它们的联合概率为:
P(X1=x1, X2=x2, ..., Xn=xn | θ) = Π_{i=1}^{n} P(Xi=xi | θ) = Π_{i=1}^{n} [θ^{xi} * (1-θ)^{(1-xi)}]
其中 Π 表示连乘。这个公式在下节课推导参数 θ 的估计方法时将至关重要。







本节课中我们一起学习了概率论的核心工具。我们定义了随机变量及其分布,理解了期望是概率的加权平均,并深入探讨了用于描述二元结果的伯努利模型及其参数 θ。我们还学习了用方差来量化不确定性,并知道了独立试验的联合概率计算方法。这些看似基础的概念,将是后续构建和理解复杂机器学习模型的基石。下节课,我们将利用这些工具,开始真正的“学习”过程——如何从观察到的数据中估计出未知的参数 θ。
10:最大似然估计 📊
在本节课中,我们将学习机器学习中的一个核心原理——最大似然估计。我们将从一个简单的抛硬币例子开始,理解如何根据观察到的数据来估计未知参数。接着,我们将探讨熵的概念,并理解最大似然估计与最小化不确定性(或最大化信息)之间的深刻联系。
概率模型回顾

上一节我们介绍了概率的基本概念。本节中,我们来看看如何为一个简单的随机事件(如抛硬币)建立概率模型。
一个服从伯努利分布的随机变量 X 可以这样描述:
- 它以概率 θ 取值为 1。
- 它以概率 1-θ 取值为 0。
其期望值(均值)为 θ。如果 X 表示“是否下雨”,那么下雨的期望值就等于下雨的概率。


我们还计算了方差,定义为 E[(X - μ)²],对于伯努利分布,方差为 θ(1-θ)。方差是衡量不确定性的一个指标。当 θ = 0.5 时,方差最大,不确定性最高;当 θ 接近 0 或 1 时,方差变小,不确定性降低。
我们将看到,方差并非描述不确定性的唯一方式,还有一种称为“熵”的度量。
学习的目标:最小化不确定性

学习,本质上就是最小化不确定性。我们来到这个世界时,对很多事情一无所知,而学习的过程就是不断减少未知,这等价于最大化信息。你现在学习机器学习,正是在试图减少对这个领域的不确定性,获取信息。
我们将以此作为今天学习的原则。
独立性假设
我们还学习了独立性。如果两次抛硬币是独立的,那么两次结果同时发生的概率等于各自概率的乘积。对于 n 个独立的变量,其联合概率分布可以分解为各个变量概率的乘积。
用图模型表示,即 n 个变量 X₁, X₂, ..., Xₙ 之间没有边连接,它们是完全独立的。因此,整个模型的概率就是每个变量概率的乘积。这里的随机变量是 X,而 θ 是描述这个分布的参数。
最大似然估计原理 🎯
在回顾了基础知识后,我们终于要开始“学习”这个主题了。本节介绍第一种学习原则——最大似然估计。
最大似然估计基于事件的频率观点。它假设存在一个真实的参数 θ₀ 生成了我们观察到的数据。我们不知道 θ₀ 是多少,但我们可以根据观察到的数据集 {x₁, ..., xₙ},尝试找到一个估计值 θ̂,使得在这个参数下,观察到当前数据的概率最大。
用公式表示就是:
θ̂ = argmax_θ P(x₁, ..., xₙ | θ)
其中,argmax 表示找到使函数值最大的那个参数 θ。
一个直观例子
假设你观察到一个硬币抛掷序列:1, 1, 1, 1, 1(全是正面)。
我们有两个候选参数:
- θ₁ = 0.99
- θ₂ = 0.5
哪个参数更可能产生这个序列?直观上,θ₁ 更合理,因为一个正面向上的概率为 0.99 的硬币,更有可能连续抛出 5 个正面。最大似然估计就是把这个直观过程形式化。
最大似然估计的步骤 📝
最大似然估计有一套通用的机械步骤,适用于几乎所有模型。以下是具体步骤:
第一步:写出似然函数
给定数据,我们首先对数据做出假设(例如,各次抛掷是独立的)。那么,观察到整个数据序列的联合概率(似然函数)为:
P(x₁, ..., xₙ | θ) = ∏ᵢ P(xᵢ | θ)
对于伯努利分布,每个 P(xᵢ | θ) = θ^{xᵢ} (1-θ)^{1-xᵢ}。设 M 为数据中 1 的个数,N 为总抛掷次数,则似然函数可简化为:
P(数据 | θ) = θ^M (1-θ)^{N-M}
第二步:转化为对数似然
我们定义对数似然函数 L(θ) = log P(数据 | θ)。取对数可以将连乘变为连加,简化后续求导计算。
对于伯努利分布:
L(θ) = M log θ + (N-M) log (1-θ)
第三步:求导并令其为零
为了找到最大化 L(θ) 的 θ,我们对 θ 求导并令导数为零:
dL(θ)/dθ = M/θ - (N-M)/(1-θ) = 0
第四步:求解参数
解上述方程:
M/θ = (N-M)/(1-θ) => M(1-θ) = θ(N-M) => M - Mθ = Nθ - Mθ => M = Nθ
最终得到最大似然估计解:
θ̂ = M / N
这个结果非常直观:硬币正面朝上的概率估计值,就是观察到的正面次数除以总抛掷次数。
最大似然估计的意义与熵 🔗
最大似然估计看起来是一套机械的数学流程,但它有深刻的内涵。为了理解它为何有效,我们需要引入熵的概念。
熵是信息论中的核心概念,用于度量一个随机变量的不确定性。对于一个伯努利分布,其熵 H 定义为:
H = -[θ log θ + (1-θ) log(1-θ)]
熵的曲线形状与方差类似:当 θ = 0.5 时,不确定性最大,熵也最大;当 θ 接近 0 或 1 时,不确定性小,熵也小。信息则被定义为负熵,因此最大化信息等价于最小化熵(不确定性)。
最大似然估计所做的,正是找到那个能使观测数据最“不意外”的参数。如果数据与我们的模型(参数)预测高度一致,那么模型的不确定性就低。从这个角度看,最大似然估计是在寻找能最小化“模型与数据间差异”所导致的不确定性的参数。这和我们“通过学习最小化不确定性”的目标是完全一致的。
总结

本节课中我们一起学习了:
- 最大似然估计的原理:通过寻找使观测数据出现概率最大的参数来学习。
- 标准操作步骤:写出似然函数 → 取对数 → 求导并令为零 → 求解参数。这是一套适用于众多模型的通用流程。
- 熵与信息:熵是衡量不确定性的指标,信息是负熵。学习的目标是最大化信息,即最小化不确定性。
- 内在联系:最大似然估计可以理解为一种最小化“模型预测”与“实际观测”之间不确定性的方法,从而与学习的根本目标相连。



最大似然估计是机器学习中最基础、最重要的参数估计方法之一。掌握了它,你就为理解更复杂的模型学习打下了坚实的基础。
11:贝叶斯学习 🎓



在本节课中,我们将要学习贝叶斯学习的基本原理,并将其与之前介绍的最大似然估计方法进行比较。我们将从一个简单的抛硬币模型入手,理解如何通过引入先验分布来融合领域知识,并计算后验分布。
最大似然估计回顾 📈




上一节我们介绍了最大似然估计的基本思想。本节中我们来看看其核心操作。

最大似然估计的核心原则是:通过最大化给定参数下数据的概率来寻找参数。其公式表示为:
θ̂_ML = argmax_θ P(数据 | θ)
对于抛硬币的例子,如果观察到 M 次正面和 (N-M) 次反面,其似然函数为:
P(数据 | θ) = θ^M * (1-θ)^(N-M)
实际操作中,我们通常对似然函数取对数(称为对数似然),然后对其求导并令导数为零,以找到最大值点。这是因为在单峰函数的最大值点,其斜率为零。
以下是最大似然估计的操作步骤:
- 写出给定参数下数据的概率表达式 P(数据 | θ)。
- 通常取对数得到对数似然函数 log P(数据 | θ)。
- 对参数 θ 求导,并令导数等于零。
- 解方程得到最大似然估计值 θ̂_ML。
从另一个角度看,最大似然估计等价于最小化真实数据分布与我们模型生成的数据分布之间的信息差异。虽然我们无法直接观测到真实参数 θ₀,但我们可以通过比较观测数据与模型“幻想”出的数据的统计模式来评估模型的好坏。
最大似然估计在数据量趋于无穷时具有一致性(即收敛到真实参数)和有效性(即具有最小的渐近方差)等良好性质。但在有限数据下,它可能得出过于自信的结论,例如观察到六只白天鹅就断定不存在黑天鹅。

贝叶斯学习原理 🔄

与频率学派的最大似然估计不同,贝叶斯学派对参数有着根本不同的看法。本节中我们将探讨这种差异。
在贝叶斯框架中,参数 θ 本身被视为一个随机变量。我们不仅需要指定数据的生成模型 P(数据 | θ)(似然),还需要指定一个关于参数的先验分布 P(θ),它代表了我们在看到数据之前对参数的信念或领域知识。
在看到数据后,我们通过贝叶斯定理更新先验,得到后验分布:

P(θ | 数据) ∝ P(数据 | θ) * P(θ)
其中,符号 ∝ 表示“正比于”。完整的后验分布需要归一化常数:
P(θ | 数据) = [P(数据 | θ) * P(θ)] / P(数据)

这里,P(数据) 是边缘似然,通过对所有可能的 θ 积分得到:P(数据) = ∫ P(数据 | θ) P(θ) dθ。对于连续变量,求和变成了积分。
贝叶斯观点非常适合描述一个智能体(如机器人)的学习过程:它从先验信念出发,观察数据,更新为后验信念;这个后验信念又成为下一步学习的先验。其结论综合了观测数据与先验知识。

抛硬币模型的先验:Beta分布 🪙

现在,我们将贝叶斯原理应用于抛硬币模型。首先需要为参数 θ(正面朝上的概率)选择一个合适的先验分布。
θ 是一个介于 0 和 1 之间的连续变量。均匀分布是一个简单的选择,但更通用且广泛应用的是 Beta 分布。Beta 分布的概率密度函数为:
P(θ; α, β) = [Γ(α+β) / (Γ(α)Γ(β))] * θ^(α-1) * (1-θ)^(β-1)
其中:
- θ 是随机变量,范围在 [0, 1]。
- α > 0, β > 0 是分布的参数,称为超参数。
- Γ(·) 是 Gamma 函数,可以看作阶乘在实数上的推广,在计算中常作为归一化常数处理。


Beta 分布的形状由 α 和 β 控制:
- 当 α = β = 1 时,Beta 分布退化为 [0,1] 上的均匀分布。
- 当 α > 1, β > 1 时,分布呈单峰状,峰值在 (α-1)/(α+β-2) 附近。
- 当 α < 1, β < 1 时,分布呈 U 形。
- Beta 分布的期望(均值)为 E[θ] = α / (α + β)。
通过设置不同的 α 和 β,我们可以表达各种先验信念,例如认为硬币是公平的、偏向正面或偏向反面。


计算后验分布 🧮

有了似然和先验,我们就可以计算后验分布了。我们将看到,对于抛硬币模型,计算过程非常简洁。

抛硬币模型的似然为:P(数据 | θ) = θ^M * (1-θ)^(N-M)
假设先验为 Beta 分布:P(θ) ∝ θ^(α-1) * (1-θ)^(β-1)
根据贝叶斯定理,后验分布正比于似然与先验的乘积:
P(θ | 数据) ∝ [θ^M * (1-θ)^(N-M)] * [θ^(α-1) * (1-θ)^(β-1)] = θ^(M+α-1) * (1-θ)^(N-M+β-1)
观察指数形式,我们发现后验分布仍然是一个 Beta 分布:
P(θ | 数据) = Beta(θ; α’, β’)
其中,新的超参数为:
α’ = M + α
β’ = (N - M) + β


这意味着 Beta 分布是伯努利分布似然的共轭先验:后验分布与先验分布属于同一家族。这使得计算极其简单,我们无需进行复杂的积分,只需将观测计数加到先验的超参数上即可。
后验分布的归一化常数同样由 Beta 分布的公式给出,其中 Gamma 函数部分保证了积分为 1。

实例分析:黑天鹅问题 🦢



让我们通过一个具体例子来对比最大似然估计和贝叶斯估计的行为。






假设我们连续抛掷一枚硬币 6 次,结果都是正面(M=6, N=6)。这类似于观察到了 6 只白天鹅。


- 最大似然估计:θ̂_ML = M/N = 6/6 = 1。结论是:所有天鹅都是白色的,不存在黑天鹅。
- 贝叶斯估计:结果依赖于我们选择的先验。
- 如果我们采用无信息先验 Uniform(0,1),即 α=1, β=1,则后验为 Beta(7, 1)。后验期望为 E[θ|数据] = 7/(7+1) = 0.875。我们仍然认为正面概率很高,但并非绝对为 1,为黑天鹅(反面)留下了可能性。
- 如果我们有一个强烈的先验信念认为硬币是公平的,例如 α=100, β=100(峰值在 0.5),则后验为 Beta(106, 100)。后验期望约为 106/206 ≈ 0.515。先验信念极大地削弱了 6 次观测的影响。
- 如果我们有一个认为硬币极度偏向正面的先验,例如 α=10, β=0.1,则后验期望将非常接近 1。
这个例子展示了贝叶斯学习的核心优势:它在数据证据与先验信念之间进行权衡。当数据量很少时,先验起到主导作用,防止我们得出过于极端的结论。随着数据量(N)不断增加,后验分布中的观测计数(M 和 N-M)将远远超过先验超参数(α 和 β),此时后验均值 α’/(α’+β’) 将趋近于最大似然估计 M/N,数据占据了主导地位。

本节课中我们一起学习了贝叶斯学习的基本框架。我们理解了它与频率学派最大似然估计的根本区别:将参数视为随机变量并引入先验分布。我们以抛硬币模型为例,介绍了 Beta 分布作为共轭先验的便利性,并演示了如何通过简单地将观测数据计数加到先验参数上来得到后验分布。最后,通过“黑天鹅问题”的实例,我们看到了贝叶斯方法如何自然地平衡先验知识与观测证据,避免在有限数据下做出武断的结论。
12:贝叶斯网络学习 🧠
在本节课中,我们将学习贝叶斯网络中的参数学习。我们将从回顾贝叶斯学习的基本概念开始,然后通过一个具体的例子,展示如何将贝叶斯方法应用于比简单的抛硬币更复杂的场景——即学习贝叶斯网络中的条件概率表。我们将分别使用最大似然估计和贝叶斯估计两种方法来完成参数学习。

贝叶斯学习回顾
上一节我们介绍了贝叶斯学习。我们提到,进行贝叶斯学习需要指定两个部分:数据模型(通常称为似然函数)和先验分布。对于抛硬币的例子,这很简单,就是伯努利分布和贝塔分布。未来,我们会接触到更有趣的数据模型,如神经网络和随机森林。
伯努利分布我们已经很熟悉了,它描述了单次抛硬币的概率。对于多次独立的抛掷,我们只需将所有独立的伯努利分布相乘。我们引入了贝塔先验分布。贝塔分布本质上是一个关于参数 θ 的概率分布,而 θ 本身是硬币正面朝上的概率。


在这个图中,变量 x 代表硬币正面朝上的概率,即 P(x=1)。在我的幻灯片中,我们用 θ 表示这个变量。关键点在于,我们是在对概率本身(即 θ)施加一个先验分布。因为 θ 是一个概率,其值必须在 0 和 1 之间。贝塔分布正好定义在 [0, 1] 区间上。通过调整超参数 α 和 β,我们可以改变这个分布的形状,以反映我们不同的先验信念。
在连续概率分布中,我们绘制的是概率密度函数。曲线下的面积总和为 1。对于连续变量,我们只能计算某个区间内的概率,即密度函数在该区间上的积分。密度函数的值可以大于 1,只要曲线下的总面积等于 1 即可。
贝塔分布的维基百科页面包含了所有你需要知道的信息:均值、中位数、众数(峰值位置)和方差(分布的宽度)。均值是 α / (α + β)。
频率学派使用点估计,他们相信存在一个单一的“真实”参数值,例如用正面次数除以总抛掷次数得到的 θ。而贝叶斯学派则返回一个完整的后验概率分布作为答案。如果需要总结这个分布,可以使用其均值、众数或方差等。了解参数估计的置信度(不确定性)在许多应用中至关重要,例如在金融中,了解市场波动率(方差)比仅仅知道汇率本身更重要。
我们如何计算后验分布呢?我们利用了一个技巧:后验分布对 θ 的积分必须等于 1。根据贝塔分布的定义,这立即告诉了我们归一化常数是什么。因此,在推导时,我们可以忽略常数项,只需写出似然函数乘以先验分布,并使用比例符号。通过合并同类项,我们可以看出后验分布的形状也是一个贝塔分布,其新的参数 α‘ 和 β’ 是原始参数加上观测数据中正面和反面的计数。
具体来说,新的 α‘ = m + α,新的 β’ = n - m + β,其中 n 是总抛掷次数,m 是正面次数。因为我们知道贝塔分布的归一化常数,所以可以直接写出完整的后验分布,而无需手动计算复杂的积分。
从硬币到贝叶斯网络
现在,让我们看看如何将这种方法应用到比抛硬币更有趣的例子上。正如之前提到的,对于任何包含二元变量的图模型,无论它有多大,你本质上只需要处理“抛硬币”模型。今天我将用一个例子来说明这一点,并且会先用最大似然估计,再用贝叶斯方法。
假设我们研究三个二元变量:
- M: 是否喝马提尼酒。
- F: 是否去 Fritz 餐厅。
- S: 是否在家学习。
- T: 是否变瘦。
我们进行了一项小调查,记录了五个周末的观测数据:
| M | F | S | T |
|---|---|---|---|
| 1 | 1 | 0 | 0 |
| 1 | 0 | 1 | 0 |
| 0 | 1 | 0 | 1 |
| 1 | 1 | 0 | 0 |
| 0 | 0 | 1 | 0 |
现在,我们选择一个图结构来描述这些变量之间的关系。在本讲末尾,我们会讨论如何选择最佳图结构,但现在我们假设图结构已给定:
M -> F
F -> T
S -> T
这个图表示:喝马提尼酒(M)影响是否去 Fritz 餐厅(F),而去 Fritz 餐厅(F)和在家学习(S)共同影响是否变瘦(T)。
在这个图中,我们需要学习的参数是各个条件概率表中的数值:
P(M): 一个参数 θ。P(S): 一个参数 α。P(F|M): 两个参数(因为 M 有两种状态),我们称之为 γ1 (当 M=0) 和 γ2 (当 M=1)。P(T|F,S): 四个参数(因为 F 和 S 有四种组合),我们称之为 β1, β2, β3, β4。
由于所有变量都是二元的,我们可以用伯努利分布来建模每一个条件概率。例如:
P(M | θ) = θ^{#M=1} * (1-θ)^{#M=0}P(F=1 | M=0, γ1) = γ1, 而P(F=0 | M=0, γ1) = 1-γ1。
根据图模型,数据的联合概率可以分解为:
P(M, F, S, T) = P(T | F, S) * P(F | M) * P(M) * P(S)
最大似然参数估计
现在,我们使用最大似然估计来学习这些参数。最大似然估计就是选择能使观测数据概率最大化的参数值。
以下是计算过程:
-
估计 θ (P(M=1)):
观测到 M=1 的次数是 4,总观测次数是 5。
所以,θ_ML = 4/5。 -
估计 α (P(S=1)):
观测到 S=1 的次数是 2,总观测次数是 5。
所以,α_ML = 2/5。 -
估计 γ1 (P(F=1 | M=0)):
我们需要看所有 M=0 的情况。在数据中,M=0 出现了 2 次。
* 在这 2 次中,F=1 出现了 1 次。
* F=0 出现了 1 次。
所以,γ1_ML = 1/2。 -
估计 γ2 (P(F=1 | M=1)):
我们需要看所有 M=1 的情况。在数据中,M=1 出现了 3 次。
* 在这 3 次中,F=1 出现了 2 次。
* F=0 出现了 1 次。
所以,γ2_ML = 2/3。 -
估计 β1 (P(T=1 | F=0, S=0)):
我们需要看所有 F=0 且 S=0 的情况。在数据中,这种情况出现了 1 次。
* 在这 1 次中,T=1 出现了 0 次。
* T=0 出现了 1 次。
所以,β1_ML = 0/1 = 0。
我们需要对 (F, S) 的其他三种组合重复类似的过程来计算 β2, β3, β4。
一旦我们得到了所有这些最大似然估计的参数,我们就可以填充条件概率表。之后,我们就可以使用这些表进行推理,回答诸如“给定喝了马提尼酒,变瘦的概率是多少?”之类的问题。
贝叶斯参数估计
现在,让我们看看贝叶斯方法如何应用于其中一个参数,例如 α (P(S=1))。
假设我对你们有先验信念:我认为你们是好学生,很可能在家学习。我可以用一个贝塔先验分布来表示这个信念,例如 Beta(10, 1)。这个分布的形状在 α 接近 1 的地方概率很高,表示我认为 P(S=1) 很可能很大。
P(α) ∝ α^{10-1} * (1-α)^{1-1} = α^9
现在,给定观测数据(S 的 5 个观测值:其中 2 个为 1,3 个为 0),似然函数是:
P(S数据 | α) ∝ α^2 * (1-α)^3
根据贝叶斯定理,后验分布与似然乘以先验成比例:
P(α | S数据) ∝ [α^2 * (1-α)^3] * [α^9] = α^{11} * (1-α)^3
我们可以看出,这是一个 Beta(12, 4) 分布的形状(因为 α^{11} 对应 α^{12-1},(1-α)^3 对应 (1-α)^{4-1})。
如果我们想用一个点估计来总结这个后验分布,例如使用后验均值,那么:
α_bar = E[α | 数据] = 12 / (12 + 4) = 12/16 = 0.75
贝叶斯估计的结果 (0.75) 比最大似然估计 (0.4) 更接近先验信念 (倾向于高概率),但也被数据(观测到一些不学习的情况)拉低了一些。这就是贝叶斯学习将先验知识与观测数据相结合的方式。
我们需要对 θ、γ1、γ2、β1-β4 所有其他参数重复这个贝叶斯估计过程。虽然繁琐,但方法是相同的:为每个参数选择一个合适的先验分布(通常是贝塔分布,因为它们是伯努利分布的共轭先验),然后根据数据计算后验分布。
模型选择
之前有人提出了另一个可能的图结构:
M -> F
F -> T
M -> S
S -> T
这个模型与原始模型的分解方式不同。原始模型是 P(T|F,S)P(F|M)P(M)P(S),而新模型是 P(T|F,S)P(F|M)P(M)P(S|M)。
我们如何决定哪个模型更好呢?我们可以同时学习两个模型(对于两个模型共有的部分,如 P(T|F,S) 和 P(F|M),学习过程是相同的,只有 P(S) 和 P(S|M) 不同)。然后,在一个新的、未见过的数据集上评估这两个模型。计算每个模型赋予该新数据集的联合概率 P(新数据 | 模型)。赋予数据更高概率的模型被认为是更好的模型。这就是模型选择的基本思想。
总结
在本节课中,我们一起学习了贝叶斯网络的参数学习。
- 我们首先回顾了贝叶斯学习的核心思想:结合似然函数和先验分布来得到后验分布。
- 然后,我们通过一个包含多个二元变量(喝马提尼、去餐厅、学习、变瘦)的生动例子,将学习问题从简单的抛硬币推广到贝叶斯网络。
- 我们详细演示了如何使用最大似然估计来学习网络中的所有条件概率参数,即通过计数和比例来填充概率表。
- 接着,我们展示了贝叶斯估计方法,通过为参数引入贝塔先验分布,将先验信念与观测数据相结合,得到后验分布,并以后验均值作为参数估计。
- 最后,我们简要讨论了模型选择的问题,即如何比较不同的图结构,其方法是在保留数据上评估模型的整体概率。

通过掌握这些参数学习技术,我们就能从数据中自动构建出可用于概率推理的贝叶斯网络模型。
13:课程概述与矩阵乘法





在本节课中,我们将学习线性代数的基础知识,这些知识对于理解后续的机器学习模型至关重要。课程将从矩阵乘法开始,逐步深入到特征值分解,并利用这些概念分析PageRank算法的收敛性。掌握这些内容将帮助我们处理连续变量和多维数据。






机器学习线性代数复习:2:矩阵向量乘法

上一节我们介绍了课程的整体目标,本节中我们来看看矩阵与向量的乘法,这是线性代数中最基础的操作之一。





矩阵是一个包含数字的数据结构。例如,一个2x2矩阵 A 可以表示为:
A = [[a11, a12],
[a21, a22]]
向量 x 可以表示为 [x1, x2]^T。




矩阵 A 与向量 x 的乘法定义为:
y = A * x
其中结果向量 y 的每个元素计算如下:
y1 = a11 * x1 + a12 * x2
y2 = a21 * x1 + a22 * x2

更一般地,对于第 i 个元素,公式为:
y_i = Σ_j (a_ij * x_j)


矩阵向量乘法还可以理解为矩阵 A 的列向量的线性组合:
y = x1 * (A的第一列) + x2 * (A的第二列)
这种视角在后续理解概念时非常有用。



机器学习线性代数复习:3:一个重要的引理
在理解了矩阵乘法的基本形式后,我们来看一个在分析概率模型(如PageRank)时非常有用的性质。


以下是该引理的描述:
假设我们有一个向量 x 和一个矩阵 G。如果向量 x 的所有元素之和为1,并且矩阵 G 的每一行元素之和也为1,那么乘积结果向量 y = x^T * G 的所有元素之和同样为1。
证明过程如下:
根据矩阵乘法定义,y_j = Σ_i (x_i * g_ij)。
对结果向量 y 的所有元素求和:
Σ_j y_j = Σ_j Σ_i (x_i * g_ij)
交换求和顺序:
Σ_j y_j = Σ_i x_i * (Σ_j g_ij)
已知对于所有 i,有 Σ_j g_ij = 1,且 Σ_i x_i = 1。
因此:
Σ_j y_j = Σ_i x_i * 1 = 1
证明完毕。这个性质保证了概率向量在乘以转移概率矩阵后,仍然是一个概率向量。




机器学习线性代数复习:4:特征值与特征向量简介



从离散变量过渡到连续变量和多变量分析,我们需要强大的数学工具。特征值和特征向量就是这样的工具,它们能帮助我们对数据进行压缩和简化。

对于一个方阵 A,如果存在一个标量 λ 和一个非零向量 x,使得:
A * x = λ * x
那么 λ 称为矩阵 A 的特征值,x 称为对应的(右)特征向量。
类似地,如果存在一个行向量 y^T,使得:
y^T * A = λ * y^T
那么 y^T 称为左特征向量。


这个等式的意义在于,矩阵 A 对向量 x 的复杂变换效果,等同于用一个简单的标量 λ 对 x 进行缩放。这揭示了数据中潜在的结构和模式。

机器学习线性代数复习:5:求解特征值与特征向量

那么,如何求解特征值和特征向量呢?本节我们将通过一个例子来演示计算过程。
从特征方程 A * x = λ * x 出发,我们可以将其改写为:
(A - λ * I) * x = 0
其中 I 是单位矩阵。为了使这个齐次线性方程组有非零解 x,矩阵 (A - λ * I) 的行列式必须为零:
det(A - λ * I) = 0
这个方程被称为特征方程。

以2x2矩阵为例:
A = [[1-α, α],
[ β, 1-β]]
其特征方程为:
det([[1-α-λ, α], [β, 1-β-λ]]) = 0
计算行列式:
(1-α-λ)*(1-β-λ) - α*β = 0
解这个方程,可以得到两个特征值:
λ1 = 1
λ2 = 1 - α - β
对于随机矩阵(每行之和为1),λ1 = 1 总是最大的特征值。将 λ1 代入方程 (A - I)*x = 0,可以求得对应的右特征向量为 [1, 1]^T。对应的左特征向量经过求解和归一化,可以得到一个概率分布向量。


机器学习线性代数复习:6:利用特征值分析PageRank收敛性


现在,我们利用特征值的知识来分析PageRank算法的收敛性。PageRank的核心是不断用概率向量 π 左乘一个随机矩阵 G。
算法可以表述为:
π_{k+1}^T = π_k^T * G
经过 m 次迭代后:
π_m^T = π_0^T * G^m



我们做一个简化假设:矩阵 G 有 n 个互不相同的特征值,并且其左特征向量构成一组基。这意味着初始向量 π_0^T 可以表示为这些左特征向量的线性组合:
π_0^T = Σ_{i=1}^n c_i * x_i^T
其中 x_i^T 是左特征向量,满足 x_i^T * G = λ_i * x_i^T。


那么,m 步迭代后的向量为:
π_m^T = π_0^T * G^m = Σ_{i=1}^n c_i * (λ_i)^m * x_i^T
假设我们将特征值按模从大到小排序:|λ1| > |λ2| > ... > |λn|。当 m 很大时,(λ1)^m 将远大于其他特征值的 m 次幂。因此,π_m^T 将主要由第一项主导:
π_m^T ≈ c1 * (λ1)^m * x1^T
同时,根据之前证明的引理,每一步得到的 π_k^T 都是概率向量(元素之和为1)。因此,当 m 趋向无穷大时,π_m^T 将收敛到与主左特征向量 x1^T 方向一致,且经过归一化的概率向量。这就证明了PageRank算法会收敛到一个稳定的概率分布。


这种方法本身也是一种数值计算特征向量的方法,称为幂法。








机器学习线性代数复习:7:矩阵的特征分解


最后,我们来看如何将矩阵分解为特征向量和特征值的形式,这种表示在数据压缩等领域有核心应用。






如果我们有矩阵 A 的所有特征向量 x1, x2, ..., xn 和对应的特征值 λ1, λ2, ..., λn,可以将它们分别组合成矩阵和向量的形式。


将特征向量作为列向量组合成矩阵 X,将特征值放在对角线上构成对角矩阵 Λ。
那么,所有的特征方程 A * xi = λi * xi 可以合并写成一个简洁的矩阵形式:
A * X = X * Λ
如果特征向量矩阵 X 是可逆的,我们可以将上式两边同时右乘 X^{-1},得到矩阵 A 的特征分解(或称对角化):
A = X * Λ * X^{-1}
这个分解将矩阵 A 表示为三个矩阵的乘积。特别地,如果 A 是实对称矩阵(A = A^T),那么它的特征向量是正交的,此时 X^{-1} = X^T,分解式变为:
A = X * Λ * X^T
这被称为谱分解。特征分解是主成分分析等降维技术的数学基础。



本节课中我们一起学习了线性代数中与机器学习密切相关的核心概念。我们从矩阵乘法出发,通过一个引理理解了随机矩阵的性质,然后深入探讨了特征值和特征向量的定义、求解及其重要意义。最后,我们利用特征值理论简要分析了PageRank算法的收敛性,并介绍了矩阵的特征分解。这些工具将是后续学习神经网络、数据压缩和降维等复杂模型的基础。
14:奇异值分解(SVD)🧩
在本节课中,我们将学习线性代数中的一个核心概念——奇异值分解。这是一种强大的矩阵分解技术,尤其适用于处理非方阵,在图像处理、数据压缩和机器学习等领域有广泛应用。我们将从线性代数基础回顾开始,逐步引出SVD的定义、计算方法和实际意义。
线性代数回顾 📐
上一节我们介绍了正交矩阵的定义。本节中,我们来看看它在矩阵分解中的应用。
如果一个矩阵 A 是对称的,即满足 A = Aᵀ,那么它可以进行特征值分解:
A = XΛXᵀ
其中,X 是一个包含矩阵 A 所有特征向量的矩阵。如果 A 是 M×M 的,那么它将有 M 个特征向量,每个特征向量的大小为 M。将这些特征向量组合起来,就构成了矩阵 X。
一个重要且正确的定理是,这些特征向量是正交的。因此,由这些特征向量组成的矩阵 X 是一个正交矩阵。正交矩阵意味着其转置等于其逆,即 Xᵀ = X⁻¹,这使得计算变得非常简便。
我们还引入了“标准正交”的概念。矩阵 X 的列是特征向量,任意两个不同特征向量的点积为零,而特征向量与自身的点积为 1。
我们可以将矩阵 A 分解为另一个矩阵、一个特征值对角矩阵和另一个特征向量矩阵的乘积。我们可以将其重写为:
A = Σᵢ₌₁ᴹ λᵢ xᵢ xᵢᵀ
其中,λᵢ 是特征值,xᵢ 是对应的特征向量。
以下是矩阵分解的几种等价写法:
- 矩阵形式:A = XΛXᵀ,其中 A、X、Λ 都是 M×M 矩阵。
- 展开形式:A = λ₁ x₁ x₁ᵀ + λ₂ x₂ x₂ᵀ + ... + λ_M x_M x_Mᵀ。这表示矩阵可以写成一系列标量(特征值)与向量外积的和。
为了理解外积,我们来看一个例子。假设向量 x = [1, 2]ᵀ,那么 x xᵀ 的结果是一个矩阵:
[1] * [1, 2] = [1, 2]
[2] [2, 4]
因此,一个矩阵可以表示为多个列向量与行向量乘积的叠加。掌握这些不同的表示法有助于我们编写代码和进行公式推导。
接下来,我们回顾向量的范数。对于一个属于 ℝᴹ 的列向量 x,其范数(通常指 L2 范数或欧几里得范数)定义为:
||x|| = √(x₁² + x₂² + ... + x_M²)
它也可以写成 xᵀx 的平方根。例如,对于 x = [1, 2]ᵀ,有 xᵀx = 5,所以 ||x|| = √5。
一个重要的性质是:如果一个矩阵 Q 是正交矩阵(即 Qᵀ = Q⁻¹),那么对于任意向量 x,有 ||Qx|| = ||x||。这意味着用正交矩阵乘以一个向量不会改变该向量的长度,因此正交矩阵也被称为旋转矩阵。在计算机图形学中,旋转、平移和缩放像素正是通过操作这类矩阵实现的。
以上就是本课程所需的线性代数知识回顾。
奇异值分解(SVD)的定义 🎯
从本节开始,我们将进入更有趣的内容。本节课和下一节课,我们将介绍奇异值分解以及主成分分析(PCA)。PCA是一种在数据分析中广泛使用的技术。
在本讲中,我将定义什么是SVD,解释如何计算SVD,并通过示例说明其应用。我还会讨论低秩近似的含义及其在数据压缩中的意义。
SVD是一种矩阵分解方法,与特征值分解非常相似。事实上,如果你会计算特征值和特征向量,就能计算SVD。
SVD的神奇之处在于它适用于非方阵。这对于处理像图像这样的数据非常有用,因为图像本质上是一个矩阵(像素值),但通常不是方形的。SVD就是处理非方阵特征值问题的工具。
对于一个 M×N 的矩阵 A,其SVD由三个矩阵的乘积构成:
A = UΣVᵀ
以下是各个部分的解释:
- Σ:一个 N×N 的对角矩阵,其对角线上的元素称为奇异值(类似于特征值),通常按从大到小的顺序排列。
- U:一个 M×N 的矩阵,其列向量称为左奇异向量(大小为 M)。
- V:一个 N×N 的矩阵,其列向量称为右奇异向量(大小为 N),并且 V 是一个正交矩阵(VᵀV = I)。
左奇异向量和右奇异向量都是标准正交的,即 UᵀU = I(注意,这里 U 不一定是方阵,所以 UUᵀ 不一定等于 I)。
根据使用的软件库不同,有时输出的 U 是 M×M 的方阵。这是通过格拉姆-施密特正交化过程添加了一些额外的列,并在 Σ 下方补零来实现的,这被称为“完全SVD”。而我们主要关注的是“精简SVD”(U 为 M×N)。对于我们的目的,这两种形式在数学和练习上是等价的,多出来的列我们不会用到。
同样,SVD也可以写成展开形式:
A = σ₁ u₁ v₁ᵀ + σ₂ u₂ v₂ᵀ + ... + σ_N u_N v_Nᵀ
其中,σᵢ 是奇异值,uᵢ 和 vᵢ 分别是左右奇异向量。
SVD的直观理解与应用示例 🖼️

SVD如何发挥作用呢?假设我们的矩阵 A 是一幅图像。一幅灰度图像就是一个矩阵,每个元素代表一个像素的亮度(例如0到255之间的值)。
当我们对图像矩阵进行SVD时,分解式 A = σ₁ u₁ v₁ᵀ + σ₂ u₂ v₂ᵀ + ... 具有深刻的含义。这意味着原始图像可以被分解为一系列子图像的加权和。
- 第一项 σ₁ u₁ v₁ᵀ 构成了一个图像,它捕获了原始图像中最显著、最粗线条的光影结构。
- 第二项 σ₂ u₂ v₂ᵀ 提供了更多一些的细节。
- 后续的项则专注于越来越精细的细节。
这就像用画笔作画:先是用大笔触勾勒出轮廓和主要色块,然后用更细的笔触添加细节。SVD将图像分解为从“平滑笔触”到“精细笔触”的一系列成分。
这种分解是数据压缩的基础。回想一下在导论课中提到的猫的视觉实验,大脑皮层有数百万神经元,每个神经元对视觉世界的不同特征产生反应。SVD提供了一种“分布式表示”,其中每个成分(uᵢ vᵢᵀ)可以看作一个基图像,而奇异值 σᵢ 表示其权重。这为我们构建模拟生物视觉感知的计算模型提供了思路。

如何计算SVD 🧮
在进入更激动人心的应用之前,我们需要先了解如何计算SVD。掌握小矩阵的SVD计算能让我们更深入地理解它。
计算SVD依赖于以下性质:矩阵 A 的奇异值,是 AᵀA 或 AAᵀ 的非零特征值的正平方根。
为什么?
首先,注意到 AᵀA 和 AAᵀ 都是对称矩阵。例如,(AᵀA)ᵀ = Aᵀ (Aᵀ)ᵀ = AᵀA。
将 A = UΣVᵀ 代入 AᵀA:
AᵀA = (UΣVᵀ)ᵀ (UΣVᵀ) = VΣᵀUᵀ U Σ Vᵀ
由于 U 的列是标准正交的,UᵀU = I。且 Σ 是对角阵,Σᵀ = Σ。因此:
AᵀA = V Σ² Vᵀ
这正好是矩阵 V Σ² Vᵀ 的特征值分解形式(对比 XΛXᵀ)。因此,V 的列向量就是 AᵀA 的特征向量,而 Σ² 的对角线元素就是 AᵀA 的特征值。


同理,对于 AAᵀ:
AAᵀ = U Σ² Uᵀ
所以,U 的列向量是 AAᵀ 的特征向量。

计算步骤:
- 给定矩阵 A (M×N)。
- 计算 AᵀA (N×N) 或 AAᵀ (M×M)。通常选择维度较小的那个来计算,更高效。
- 计算所选矩阵的特征值和特征向量。
- 特征值的正平方根就是奇异值 σᵢ,构成对角阵 Σ。
- 如果计算的是 AᵀA 的特征向量,那么它们就是右奇异向量 V。
- 要得到左奇异向量 U,可以利用公式 A = UΣVᵀ。两边同时右乘 V,得到 AV = UΣ。因为 Σ 是对角阵,其逆矩阵很好求,所以 U = AV Σ⁻¹。

示例:
设 A = [1, 2, 3]ᵀ,这是一个 3×1 的矩阵 (M=3, N=1)。
- 我们选择计算 AᵀA,因为它更小:AᵀA = [1, 2, 3] * [1, 2, 3]ᵀ = 14。
- 这是一个 1×1 的“矩阵”,它的特征值就是 14,特征向量是 [1]。
- 因此,Σ = √14, V = [1]。
- 现在求 U:U = A V Σ⁻¹ = [1, 2, 3]ᵀ * (1/√14) = [1/√14, 2/√14, 3/√14]ᵀ。
这样就得到了 A 的SVD分解。
低秩近似与数据压缩 💾
让我们回到图像的例子。当我们对图像矩阵 A 进行SVD后,得到 A = σ₁ u₁ v₁ᵀ + σ₂ u₂ v₂ᵀ + ... + σ_N u_N v_Nᵀ。
一个关键观察是:奇异值 σᵢ 通常衰减得很快。这意味着前几个项包含了矩阵的大部分信息。因此,我们可以用前 k 个项来近似原始矩阵:
A ≈ Aₖ = σ₁ u₁ v₁ᵀ + σ₂ u₂ v₂ᵀ + ... + σ_ₖ u_ₖ v_ₖᵀ
这被称为低秩近似。
优势在于压缩:
- 存储原始 M×N 的图像需要 M * N 个数字。
- 存储近似图像 Aₖ 只需要存储 k 个奇异值、k 个 M 维向量 uᵢ 和 k 个 N 维向量 vᵢ,总计 k * (1 + M + N) 个数字。
- 当 k 远小于 M 和 N 时,存储空间大大减少。
在实际中,我们并不存储近似矩阵 Aₖ,而是存储这些向量和奇异值。当需要显示图像时,再实时计算 σᵢ uᵢ vᵢᵀ 的和并显示。这就是许多图像和视频压缩技术(如JPEG)背后的核心思想之一。
通过选择不同的 k,我们可以在图像质量和压缩率之间进行权衡:k 越小,图像越模糊但压缩率越高;k 越大,图像越清晰但压缩率越低。学习,在某种程度上,就是寻找世界的简洁表示,SVD为此提供了一个强大的数学工具。

总结 📝
本节课中,我们一起学习了奇异值分解这一核心内容。
我们首先回顾了必要的线性代数知识,包括对称矩阵的特征值分解、正交矩阵和向量范数。接着,我们正式定义了奇异值分解,它可以将任意 M×N 的矩阵 A 分解为 A = UΣVᵀ 的形式,其中 U 和 V 的列向量是标准正交的,Σ 是对角阵。
我们探讨了SVD的直观意义,特别是在图像处理中,它可以将图像分解为从主要特征到细微细节的一系列层次。然后,我们学习了如何通过计算 AᵀA 或 AAᵀ 的特征值和特征向量来求解SVD。


最后,我们介绍了SVD最重要的应用之一——低秩近似。通过仅保留前几个最大的奇异值及其对应的奇异向量,我们可以用远少于原始数据的数据量来近似表示矩阵,从而实现有效的数据压缩,这为理解许多机器学习算法和数据处理技术奠定了基础。
15:主成分分析 - PCA 📊
在本节课中,我们将要学习奇异值分解(SVD)及其在数据压缩和降维中的一个核心应用——主成分分析(PCA)。我们将从图像压缩的例子入手,理解SVD如何将矩阵分解为向量外积的和,并探讨如何通过截断(即丢弃较小的奇异值)来实现数据压缩。接着,我们将看到如何利用同样的数学原理,将高维数据(如国家统计数据或图像)投影到低维空间(如二维平面),以便进行可视化或简化后续的机器学习任务。课程内容将涵盖SVD的计算、压缩原理、存储计算以及PCA的推导和应用。





SVD与图像压缩 🖼️
上一节我们回顾了矩阵分解的基本概念。本节中我们来看看奇异值分解(SVD)的具体形式及其在图像压缩中的应用。

SVD是一种将矩阵分解为一系列向量外积之和的方法。对于一个 ( M \times N ) 的矩阵 ( A ),其SVD可以表示为:
[
A = \sigma_1 u_1 v_1^T + \sigma_2 u_2 v_2^T + \dots + \sigma_r u_r v_r^T
]
其中,( \sigma_i ) 是奇异值(按从大到小排列),( u_i ) 和 ( v_i ) 分别是左奇异向量和右奇异向量。


当我们把一张灰度图像视为一个矩阵时,就可以应用上述分解。图像矩阵中的每个数值代表一个像素的亮度。通过SVD,我们将图像分解为多个由标量 ( \sigma_i ) 和两个向量 ( u_i )、( v_i ) 构成的“层”。
以下是SVD分解的关键优势:
- 压缩潜力:我们不需要保留所有 ( r ) 个分量。通常,前 ( K ) 个(( K \ll r ))最大的奇异值及其对应的向量就包含了图像的大部分信息(如整体亮度和主要轮廓)。
- 存储效率:存储向量 ( u_i ) 和 ( v_i ) 比存储完整的图像矩阵更节省空间。我们只需存储截断后的 ( U ) 的前 ( K ) 列、( \Sigma ) 的前 ( K ) 个奇异值以及 ( V^T ) 的前 ( K ) 行。
在Python中,计算SVD和进行截断压缩非常简便。以下是一个示例代码的核心部分:




import numpy as np
from scipy import misc
import matplotlib.pyplot as plt



# 1. 读取图像并转换为灰度矩阵
img = misc.imread(‘your_image.jpg‘, mode=‘L‘) # ‘L‘ 表示灰度模式
M, N = img.shape
# 2. 计算SVD
U, S, Vt = np.linalg.svd(img, full_matrices=False)
# S是一个一维数组,包含奇异值
Sigma = np.diag(S) # 转换为对角矩阵
# 3. 选择截断的秩K
K = 20
U_k = U[:, :K]
Sigma_k = Sigma[:K, :K]
Vt_k = Vt[:K, :]

# 4. 重建压缩后的图像
img_compressed = U_k @ Sigma_k @ Vt_k

# 5. 显示原图与压缩图
plt.subplot(1,2,1); plt.imshow(img, cmap=‘gray‘); plt.title(‘Original‘)
plt.subplot(1,2,2); plt.imshow(img_compressed, cmap=‘gray‘); plt.title(‘Compressed (K=‘+str(K)+‘)‘)
plt.show()
通过调整 ( K ) 值,我们可以在图像质量和压缩率之间进行权衡。( K ) 越小,压缩率越高,但图像细节丢失越多;( K ) 越大,图像越接近原图,但压缩效果越弱。
从压缩到降维:PCA的原理 🔍
上一节我们介绍了如何利用SVD进行图像压缩。本节中我们来看看SVD在机器学习中的一个更广泛的应用——主成分分析(PCA),它主要用于数据降维和可视化。
PCA的目标是将高维数据点投影到一个低维子空间(通常是二维或三维),同时尽可能保留数据中的主要变化模式。这对于理解数据结构或为后续分类等任务做准备非常有用。
其数学推导与SVD紧密相关。假设我们有一个数据矩阵 ( X ),其每一行是一个数据样本,每一列是一个特征。在进行PCA之前,一个常见的预处理步骤是标准化数据:对每个特征列,减去其均值并除以标准差。这使得所有特征具有可比性。
标准化后的数据矩阵 ( X ) 的SVD为 ( X = U \Sigma V^T )。那么,将数据投影到前 ( K ) 个主成分所张成的子空间,可以通过以下计算实现:
[
Z = X V_K = U_K \Sigma_K
]
其中 ( V_K ) 是 ( V^T ) 的前 ( K ) 行(即前 ( K ) 个右奇异向量,也是主成分方向)。矩阵 ( Z ) 的每一行就是对应数据点在新的 ( K ) 维空间中的坐标。
当 ( K=2 ) 时,( Z ) 给出了所有数据点的二维坐标,我们可以将其绘制成散点图,从而实现高维数据的可视化。
PCA的应用实例 🌍
理解了PCA的原理后,我们来看几个具体的应用场景。
1. 国家数据可视化
假设我们有一个数据集,每一行代表一个国家,每一列是国家的不同属性(如面积、GDP、人口等)。这些属性可能多达数十个,难以直接观察国家间的相似性。通过PCA将其降维至二维,每个国家就变成了二维平面上的一个点。我们可以通过点的聚集情况,直观地看到哪些国家在统计属性上更为相似。
2. 手写数字图像降维
MNIST数据集中的手写数字图像通常是28x28像素,即生活在784维空间中的点。通过PCA将其投影到二维,我们可以观察不同数字(如“2”、“3”、“5”)在二维平面上的分布。理想情况下,相同数字的点会聚集在一起,不同数字的点则会分开。这不仅能帮助我们理解数据,其降维后的表示也可能使后续的分类任务(如拟合一条曲线来区分“2”和“其他数字”)变得更容易。
3. 创建图像布局图
我们可以将一系列图像(如人脸、物体)各自拉成向量,组成一个数据矩阵 ( X )。对 ( X ) 进行PCA降维到二维,得到每张图像的二维坐标 ( (x, y) )。然后,在一个大的画布上,将每张图像绘制在其对应的 ( (x, y) ) 坐标位置。这样生成的“图像地图”能够根据图像内容的相似性(由PCA捕捉)来排列图像,内容相似的图像在布局上会彼此靠近。
以下是实现图像布局的简要步骤:
- 将每张 ( H \times W ) 的图像重塑(flatten)为一个长度为 ( H \times W ) 的向量。
- 将所有图像向量堆叠,形成数据矩阵 ( X )(每行一张图)。
- 对 ( X ) 进行标准化并计算PCA(即SVD),取前两个主成分得到二维坐标。
- 根据坐标,在二维平面上绘制每张图像的小缩略图。
总结 📝
本节课中我们一起学习了奇异值分解(SVD)及其在数据压缩和主成分分析(PCA)中的应用。


- 我们首先看到,SVD能将矩阵分解为奇异值、左奇异向量和右奇异向量的组合。通过仅保留最大的几个奇异值及其对应向量,可以实现有效的数据压缩,这在图像存储中尤为实用。
- 接着,我们探讨了如何将SVD用于PCA。PCA通过寻找数据中方差最大的方向(主成分),将高维数据投影到低维空间。这既便于数据可视化,帮助我们洞察数据结构,也能作为预处理步骤简化后续的机器学习任务。
- 最后,我们通过国家数据、手写数字和图像布局等实例,具体了解了PCA的强大用途。其核心思想是在降低数据复杂度的同时,尽可能保留数据中最重要的信息。

PCA是处理高维数据的基础且强大的工具,其背后的SVD则是线性代数中许多核心应用的基石。理解这些概念将为学习更复杂的机器学习模型奠定坚实的基础。
16:最小二乘法与多元高斯分布 🧮

在本节课中,我们将学习线性回归问题的两种求解视角:最小二乘法与概率模型(最大似然估计)。我们将看到,这两种方法最终会导向同一个简洁的数学解。


线性回归问题回顾
上一节我们介绍了线性回归问题的形式化。当我们拥有数据时,我们有输入数据(例如风速和建筑物内人数)和对应的标签(例如恒温器的设定值)。这使我们能够构建输入数据矩阵 X 和输出数据向量 y。
一旦构建了这两个矩阵,学习步骤的代码将非常简短。最耗时的部分实际上是加载数据并将其整理成矩阵形式。要进行预测,我们只需计算 X 乘以参数向量 θ,这在高维空间中代表一个平面或直线。
预测公式为:
[
\hat{y} = X\theta
]
最小二乘法的目标
我们最小化的目标是残差的平方和。通过推导,我们可以将平方和写成一个关于矩阵的二次表达式。
成本函数 J(θ) 定义为:
[
J(\theta) = (y - X\theta)^T (y - X\theta)
]
这是一个二次函数,其图像像一个碗。由于它是二次的,我们可以找到其唯一的最小值点,这就是为什么对于许多学习问题,我们只需要一行代码就能求解。
求解参数 θ
为了求解 θ,我们对成本函数求导并令其为零,因为导数为零的点对应最小值。
成本函数对向量 θ 求导,我们得到梯度向量。梯度指向函数值上升最快的方向。在最小化问题中,我们沿负梯度方向移动。
通过矩阵微分规则(具体规则可查阅资料),我们对 J(θ) 求导:
[
\frac{\partial J(\theta)}{\partial \theta} = -2X^Ty + 2X^TX\theta
]

令导数为零,我们得到正规方程:
[
X^TX\theta = X^Ty
]
求解 θ,我们得到最小二乘解:
[
\hat{\theta} = (XTX)X^Ty
]
这就是著名的“最小二乘估计”。在代码中,学习过程就是计算这一行公式。得到 θ 后,对于新的输入 x_new,预测就是 x_new * θ。
重要提示:我们从不直接对矩阵进行“除法”。我们通过左乘逆矩阵来求解方程。同时,X^TX 必须是一个可逆的方阵。
扩展到多输出情况
如果我们的问题有多个输出(例如同时预测温度和湿度),方法依然相同。我们只需扩展参数矩阵 Θ(而不再是向量 θ),使其列数与输出维度一致。矩阵 X 的构造方式不变,所有推导依然成立。
概率视角:最大似然估计

接下来,我们将从完全不同的视角——概率模型,来推导出完全相同的答案。这种方法的优势在于,它提供了一个通用框架(最大似然估计),可应用于分类、回归乃至神经网络等多种问题。

通用步骤是:写出似然函数,取对数,求导并令其为零,然后求解参数。

引入多元高斯分布




为了进行概率推导,我们需要引入多元高斯分布。大多数人都熟悉一元高斯分布(正态分布),它由均值 μ 和方差 σ² 控制。

一元高斯分布的概率密度函数为:
[
p(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x-\mu)2}{2\sigma2}\right)
]
简写为:
[
x \sim \mathcal{N}(\mu, \sigma^2)
]
在机器学习中,我们常处理多变量,因此需要其多元推广——多元高斯分布。此时,变量 y 是一个向量,均值 μ 也是一个向量,而方差则推广为一个协方差矩阵 Σ。



协方差矩阵 Σ 控制了分布的形态。在二维情况下,它有三个自由度:分别在两个轴方向上的伸展程度(方差),以及两者之间的相关性(协方差)。这允许分布呈现圆形、椭圆形或倾斜的椭圆形等各种形态。
独立高斯分布的联合分布
一个关键结论是:如果多个高斯随机变量是相互独立的,那么它们的联合多元高斯分布的协方差矩阵将是一个对角矩阵(非对角线元素为零)。这意味着各个维度之间没有相关性。

例如,两个独立的一元高斯分布 x1 和 x2,其联合分布可以写成一个均值为 [\mu1, \mu2]^T、协方差矩阵为 diag(σ², σ²) 的二元高斯分布。这个推导过程是理解后续最大似然估计的基础。
总结
本节课中,我们一起学习了:
- 最小二乘法:通过最小化平方误差,我们得到了线性回归参数的解析解 (\hat{\theta} = (XTX)X^Ty)。
- 梯度概念:成本函数的梯度指向上升最快的方向,其零点是解所在。
- 概率视角:引入了最大似然估计的通用框架。
- 多元高斯分布:作为概率模型的基础,它描述了多变量数据的分布形态,其协方差矩阵控制了各维度间的相关性。

下节课,我们将利用多元高斯分布,从最大似然估计的角度重新推导线性回归,并展示其与最小二乘法的等价性。
17:贝叶斯网络与概率图模型
在本节课中,我们将学习贝叶斯网络(也称为概率图模型)的核心概念。我们将探讨如何利用图结构来高效表示复杂的概率分布,理解变量间的独立性关系,并学习概率推断的基本思想。课程将结合线性代数与概率论的知识,以直观的方式展示数学如何作为描述现实世界的语言。
线性代数与概率论的回顾

上一节我们介绍了图模型的基本形式。本节中,我们来看看支撑这些模型所需的数学基础。

本课程所需的线性代数知识,与我将要回顾的概率论知识处于同一水平。当我回顾线性代数时,会结合各种实际应用,例如在管弦乐中的应用。我的课程更像一门物理课,致力于将数学与世界联系起来,而不是抽象地讨论数学本身。但抽象数学极其重要,只是它并非我们当前讨论的主题。对我而言,数学是一种语言,它让我能够更清晰地描述世界中的事物。因为一旦我有了一个能描述众多事物的公式,这个公式本身就蕴含了大量关于世界的信息,从而让沟通变得更加高效。
当然,有时我们使用语言并非为了沟通,而是出于对语言本身的热爱,就像诗人热爱写诗一样。因此,纯粹进行数学理论研究也有其价值,这些理论未来可能对他人有用。然而,在本课程中,我们将仅在需要沟通思想的程度上采用数学,确保足以清晰地传达概念。
关于课程事务的说明
在深入内容之前,有一个请求。如果你对作业有任何疑问,例如如何提交等,请使用Google小组来发布此类问题。在Google小组中提问时,请尽量简洁。助教们也有自己的学业要完成,请不要频繁地通过邮件或其他方式打扰他们。当然,如果是私人问题,则另当别论。
图模型的优势与局部计算
在上节课研究图模型时,我们提到了两点。
首先,图模型允许我们将规模呈指数级增长的表示形式,转化为一组紧凑的表示。只要网络连接不是过于密集,我们就能在一定程度上克服维数灾难,因为存储本身就会变得难以承受。想象一下,如果有1000个变量,就需要 2^1000 的存储空间,这显然是不现实的。




其次,我想说明一个现在看来显而易见,但前人付出了多年努力才解决的问题:如何进行局部计算,并保证全局一致性?也就是说,能否仅通过在此处、彼处进行局部计算,就得到正确的全局答案?这本质上是在问,我们能否分布式地进行计算?就像派出多个小组各自解决子问题,然后汇总得到大问题的解决方案。
事实证明,在三种关键情况下,我们可以利用上节课引入的性质来实现这一点:给定其父节点、子节点以及“配偶”节点(即其子节点的其他父节点)后,一个节点与图中所有其他节点条件独立。
以下是三个关键示例:
- 链式结构:在链
A -> B -> C中,给定父节点B,子节点C与祖父节点A条件独立。 - 共同父节点:在结构
A <- B -> C中,给定父节点B,两个子节点A和C相互条件独立。(遗传学类比:要知道我的基因材料,只需知道我父母的基因材料,无需知道我兄弟姐妹的。) - V型结构(共同子节点):在结构
A -> C <- B中,给定子节点C,两个父节点A和B变得相互依赖。(遗传学类比:要知道我孩子的基因材料,需要同时知道我和我配偶的基因材料。)
这些看似微小的局部案例,是构建更复杂推演的基础。
马尔可夫毯与全局独立性
现在让我们观察一个非常大的图。我们实例化一个节点,称之为 X_i。假设图中包含三种类型的节点:节点 X_i 本身,以及所有其他节点。我们将所有其他节点定义为集合 x_{-i}。
我们进一步将 x_{-i} 细分为:
- U:
X_i的所有父节点。 - Y:
X_i的所有子节点。 - Z:
X_i的所有“配偶”节点(即X_i子节点的其他父节点)。 - R:图中所有剩余节点。
核心论断是:节点 X_i 在给定所有其他节点 x_{-i} 条件下的概率,仅依赖于其父节点 U、子节点 Y 和配偶节点 Z。也就是说,概率 P(X_i | x_{-i}) 中,R 会消失。
这意味着,要计算一个变量(例如“我通过这门课的概率”)的概率,我们只需要知道直接影响它的因素(其马尔可夫毯内的变量),而无需关心更远的信息(例如科威特当前的浪高)。
以下是该论断的简要证明思路。我们使用条件概率定义和概率图模型的因式分解性质。
首先,根据条件概率公式:
P(X_i | x_{-i}) = P(X_i, x_{-i}) / P(x_{-i})
由于分母 P(x_{-i}) 对于不同的 X_i 取值是常数,我们可以将其视为归一化因子 Z,因此:
P(X_i | x_{-i}) ∝ P(X_i, x_{-i})


接着,根据有向图模型的因式分解性质,联合概率 P(X_i, x_{-i}) 可以写成图中所有节点条件概率的乘积:
P(X_i, x_{-i}) = P(X_i | U) * [∏_j P(Y_j | X_i, Z_j)] * [∏_k P(R_k | ...)]


在乘积中,与 X_i 无关的项(例如某些 R_k 的概率)在计算 P(X_i | x_{-i}) 的比例关系时可以消去。最终,剩下的项只涉及 X_i 本身、其父节点 U、以及每个子节点 Y_j 及其对应的配偶节点 Z_j。这正是其马尔可夫毯内的变量。
因此,P(X_i | x_{-i}) ∝ P(X_i | U) * ∏_j P(Y_j | X_i, Z_j)
这个性质是设计高效推断算法的基础。当面对大型图模型时,我们使用的算法正是利用了这一特性,只需关注局部马尔可夫毯即可更新节点的概率,无需遍历整个网络。
概率推断简介



现在让我们看看概率推断。推断是回答查询的过程。
假设我们有一个包含五个随机变量的网络(例如警报网络:盗窃、地震、警报、约翰打电话、玛丽打电话)。我们观察到某个变量,比如“约翰打电话”(用阴影节点表示)。推断的目标就是计算在其他变量(如“地震”或“盗窃”)上的概率分布。
例如,在观察到“约翰打电话”后,我们可能想计算 P(盗窃=是 | 约翰打电话=是) 和 P(地震=是 | 约翰打电话=是)。最初,我们可能利用图的概率表进行计算。


如果我们获得了更多信息,比如打开收音机并听到地震报道(即观察到“收音机报告地震”为真),我们就需要更新之前的概率。现在,“地震”的概率会显著增加。这种获得新证据后,能够区分不同竞争原因(盗窃或地震)的现象,称为 “解释消除” 。当然,盗窃和地震也有可能同时发生,所以概率并非完全为零。
示例:洒水器网络

我们将使用一个称为“洒水器网络”的经典例子来演示推断。该网络包含变量:多云、洒水器、下雨、草地湿滑。
假设我们已知所有条件概率表。例如:
P(多云=是) = 0.5P(洒水器=关 | 多云=是) = 0.9- ...等等。
现在,我们可能提出以下查询:给定草地是湿的,洒水器打开的概率是多少? 即计算 P(洒水器=开 | 草地湿=是)。
解决这类问题有两种方法:
- “笨”方法:进行指数级复杂度的计算,枚举所有变量的可能状态。
- “聪明”方法:利用图结构和条件独立性,进行高效局部计算。

在下节课中,我们将具体展示这两种方法,并介绍如何利用和积算法等高效算法进行推断。这也将为我们学习隐马尔可夫模型这一重要应用打下基础。
总结


本节课中,我们一起学习了贝叶斯网络的核心思想。我们理解了图模型如何通过紧凑表示克服维数灾难,并深入探讨了变量间的条件独立性,特别是马尔可夫毯的概念,它表明一个节点的状态仅依赖于其局部邻域。我们还介绍了概率推断的基本任务,即根据观察到的证据计算其他变量的概率。最后,我们通过洒水器网络的例子,引出了下一讲的主题:如何高效地进行概率推断。这些概念是理解更复杂概率模型和算法的基础。
18:线性预测 📈
在本节课中,我们将要学习监督学习的基本概念,并重点介绍一种最简单但极其重要的模型——线性模型。我们将从线性模型的基本形式开始,解释其工作原理,并展示如何通过最小二乘法来“学习”模型的参数。最后,我们会将一维的线性回归推广到多维情况,并使用矩阵形式进行简洁的描述。

概述:什么是监督学习?
上一节我们介绍了无监督学习(如PCA),其目标是在没有标签的情况下发现数据的结构。本节中我们来看看监督学习。

在监督学习中,我们不仅拥有数据,还拥有数据的标签。例如,我们可能收集了每个人的身高和体重数据(特征),并标注了他们的性别(标签)。目标是学习一个模型,当给定一个新人的身高和体重时,模型能够预测其性别。监督学习的核心流程分为两个阶段:训练阶段(利用带标签的数据学习模型参数)和预测阶段(利用学到的模型为新数据预测标签)。
线性模型:核心思想
线性模型是监督学习中最基础的模型之一。其核心思想是用一条直线(在一维情况下)或一个超平面(在高维情况下)来近似描述输入特征 x 与输出标签 y 之间的关系。

一维线性模型公式
在一维情况下,模型公式非常简单:
y = θ₁ + θ₂ * x
其中:
θ₁是截距。θ₂是斜率。x是输入特征(例如身高)。y是预测的输出(例如体重)。
我们的目标是,给定一系列数据点 (xᵢ, yᵢ),找到最优的 θ₁ 和 θ₂,使得模型预测的 ŷ 与真实的 y 尽可能接近。

如何“学习”模型参数:最小二乘法

为了找到最优的 θ₁ 和 θ₂,我们需要定义一个衡量预测好坏的准则。最常用的方法是最小二乘法。

目标函数
最小二乘法的目标是最小化所有数据点的预测误差的平方和。这个误差是真实值 yᵢ 与模型预测值 ŷᵢ 之间的垂直距离(残差)。
目标函数 J(θ) 定义如下:

J(θ) = Σᵢ (yᵢ - ŷᵢ)² = Σᵢ (yᵢ - (θ₁ + θ₂ * xᵢ))²
直观理解是,我们将每个数据点想象成图板上的一颗钉子,将模型直线想象成一根有弹性的木条。木条被钉子“拉”着,最终静止的位置就是使所有“弹簧”能量(即平方误差)总和最小的位置,也就是最优的直线。
从一维到多维:引入矩阵表示
现实问题中,输入特征通常不止一个。例如,预测房间 thermostat 设定值时,我们可能同时考虑风速和房间人数两个特征。这时,我们需要将线性模型推广到多维。
多维线性模型公式
假设我们有 d 个特征,模型公式变为:
ŷ = θ₁ * x₁ + θ₂ * x₂ + ... + θ_d * x_d

为了将截距项 θ₁ 也统一到这个形式中,我们引入一个技巧:增加一个恒为1的虚拟特征 x₀。这样,模型可以写成:
ŷ = θ₀ * 1 + θ₁ * x₁ + θ₂ * x₂ + ... + θ_d * x_d
紧凑的矩阵形式
使用矩阵表示可以极大地简化书写和计算。我们将所有 n 个样本的标签堆叠成向量 y,将所有样本的特征(包括值为1的虚拟特征列)堆叠成矩阵 X,参数堆叠成向量 θ。
模型对所有样本的预测可以简洁地写为:
ŷ = Xθ

此时,最小二乘法的目标函数用矩阵形式表示为:
J(θ) = ||y - Xθ||² = (y - Xθ)ᵀ(y - Xθ)
这个形式比求和形式更紧凑,也更利于后续的数学推导和编程实现(例如,避免使用低效的循环)。


学习与预测流程

以下是使用线性模型进行监督学习的完整步骤:



-
训练阶段:
- 输入:带标签的数据对
(X, y)。 - 过程:通过最小化目标函数
J(θ),求解最优参数θ。这通常通过求解使梯度为零的方程来完成(对于最小二乘,有解析解)。 - 输出:学习到的模型参数
θ̂。
- 输入:带标签的数据对
-
预测阶段:
- 输入:新的特征向量
x_new和学到的参数θ̂。 - 过程:计算
ŷ_new = x_newᵀθ̂。 - 输出:预测值
ŷ_new。
- 输入:新的特征向量

例如,在 thermostat 自动设定系统中,训练阶段使用前四天的(风速,人数,设定值)数据学习 θ̂。第五天,系统自动检测当前的风速和人数,构成 x_new,然后计算 ŷ_new 并自动设定 thermostat。
总结
本节课中我们一起学习了监督学习和线性模型的基础。
- 我们了解了监督学习与无监督学习的区别,其核心在于利用带标签的数据进行学习。
- 我们介绍了一维线性模型
y = θ₁ + θ₂x,其本质是用直线拟合数据。 - 我们学习了通过最小二乘法来训练模型,即最小化预测误差的平方和
Σ (yᵢ - ŷᵢ)²。 - 我们将模型推广到多维情况,并引入了矩阵表示法
ŷ = Xθ,这使得描述和计算更加简洁高效。 - 最后,我们明确了监督学习的两个阶段:训练(求解
θ)和预测(使用θ计算新输出的)。
线性模型虽然简单,但它包含了模型、参数、目标函数、优化等机器学习的所有核心概念。理解线性模型是学习更复杂模型(如神经网络、随机森林)的坚实基础。在下一讲中,我们将深入探讨如何求解最小二乘问题,并将其与概率统计中的最大似然估计联系起来。
19:交叉验证、大数据与正则化 🧠




在本节课中,我们将要学习如何通过正则化技术来改进线性回归模型,以及如何使用交叉验证来选择最佳的正则化参数。我们还将探讨模型复杂度、过拟合与欠拟合,以及大数据在机器学习中的作用。


概述


上一节我们介绍了线性回归及其最大似然估计。本节中我们来看看当数据矩阵条件数较差时,直接求逆可能导致数值不稳定(如得到 NaN 值)的问题。为了解决这个问题,并提升模型的预测性能,我们引入了正则化技术。同时,为了选择最佳的正则化参数,我们需要使用交叉验证方法。

正则化的起源与动机
当尝试对一个非常大的矩阵求逆时,它可能条件数很差。如果尝试对条件数很差的矩阵求逆,可能会得到 NaN(非数字)结果,程序很可能崩溃。


在20世纪70年代,一些研究者决定“修补”这个问题,他们引入了所谓的正则化。这个术语的由来是,你试图让问题变得更“规则”、更“良好”。
一个简单的修补方法是在矩阵的对角线上每个元素都加上一个小的值。任何尝试对矩阵求逆的程序员都可能想到这个办法。
然而,他们发现,如果知道如何选择这个增量(δ),这个“修补”实际上能得到更好的预测结果。这引发了许多相关的研究和论文。
从损失函数角度理解正则化
另一种推导出正则化方法的方式,不是去“修补”解,而是构造一个不同的损失函数,然后证明该损失函数的最优解恰好就是那个“修补”后的解。


就像之前的问题一样,我们从损失函数开始,对其求导并令其为零,从而得到行为更好的参数 θ。


岭回归(Ridge Regression)的损失函数如下:

J(θ) = (y - Xθ)^T (y - Xθ) + δ^2 θ^T θ




其中:
(y - Xθ)^T (y - Xθ)是原始的平方误差项(蓝色部分)。δ^2 θ^T θ是新的正则化项(绿色部分)。


对这个损失函数求导并令导数为零,我们可以得到岭回归的解:



θ_ridge = (X^T X + δ^2 I)^{-1} X^T y


这与最大似然估计的解完全相同,只是多了 δ^2 I 这一项。当 δ = 0 时,岭回归就退化成了普通最小二乘法(最大似然估计)。因此,只要选择了合适的 δ,岭回归的性能不会比最大似然估计差。



正则化的几何解释:权衡的艺术




损失函数 J(θ) 有两个组成部分:拟合数据的误差(蓝色项)和正则化惩罚(绿色项)。为了最小化 J(θ),我们需要同时最小化这两项。



但有时,最小化蓝色项会导致绿色项增加,反之亦然。最小化蓝色项的 θ(即最小二乘解)并不是最小化绿色项的 θ。最小化绿色项的 θ 是 θ = 0,因为这样绿色项就消失了。但如果 θ = 0,蓝色项就会变成 y^T y,这可能是一个很大的值。


因此,在这两项之间存在一个权衡。我们需要找到一个 θ,在拟合数据和保持参数值较小之间取得平衡。


另一种表述方式是:我们希望在约束 θ^T θ ≤ T(δ)(即参数向量的模长小于某个依赖于 δ 的常数)下,最小化 y - Xθ。







让我们看一个二维的例子。假设 θ 是一个二维向量 [θ1, θ2]。
- 正则化项
δ^2 θ^T θ = δ^2 (θ1^2 + θ2^2)。其等高线是一系列以原点为中心的圆。 - 似然项
(y - Xθ)^T (y - Xθ)是一个二次型。其等高线是一系列椭圆,中心点是最小二乘解θ_ML。
在二维平面上,蓝色椭圆和绿色圆的等高线会相交。对于任何一个给定的 δ 值,最优解 θ_ridge 是这样一个点:在该点上,椭圆和圆的等高线是相切的,即它们的梯度方向共线(或相反)。这是因为在最优解处,试图减小一项必然会增加另一项,因此梯度必须平衡。

随着 δ 从 0 增加到无穷大,最优解 θ_ridge 会沿着一条从 θ_ML 指向原点的路径移动。δ 越大,解越向原点收缩。



L1 正则化(Lasso)的几何解释


上一节我们介绍了岭回归(L2正则化)。本节中我们来看看另一种流行的正则化方法:L1正则化,也称为Lasso。
Lasso 的损失函数是:
J(θ) = (y - Xθ)^T (y - Xθ) + λ |θ|
其中 |θ| 是 θ 各分量的绝对值之和(L1范数)。








L1正则化项的等高线不是圆形,而是菱形(在高维是菱形体的等高面)。同样地,最优解发生在似然项椭圆与L1菱形等高线相切的地方。


关键区别在于:由于菱形有“角”,相切点有很大概率恰好落在坐标轴上。当一个最优解落在坐标轴上时,意味着对应的参数 θ_i = 0。这就是为什么 L1 正则化常常会产生稀疏解,即许多参数恰好为零,实现了特征选择。


如果数据强烈表明某个特征重要,解也可能不在角上,该参数就不会为零。




贝叶斯视角下的正则化
我们已知最小二乘法是频率学派最大似然估计的解。而贝叶斯方法则同时使用先验和似然。
当我们为参数 θ 选择一个均值为零的高斯先验,即 θ ~ N(0, τ^2 I),并与高斯似然函数结合,计算后验分布时,可以发现后验分布的均值恰好等于岭回归的解。其中,正则化参数 δ^2 与噪声方差 σ^2 和先验方差 τ^2 的比值有关:δ^2 = σ^2 / τ^2。
因此,岭回归等价于在特定高斯先验下的贝叶斯后验均值估计。
贝叶斯预测与频率学派预测的区别
对于频率学派的最大似然估计,预测新数据 x* 为:
y_hat = x*^T θ_ML
预测方差就是噪声方差 σ^2。它认为存在一个“真实”的 θ。
对于贝叶斯方法,预测是对所有可能的 θ 进行积分(边际化):
p(y* | x*, X, y) = ∫ p(y* | x*, θ) p(θ | X, y) dθ
这意味着预测是无数个以不同 θ 做出的预测的加权平均,权重是后验概率 p(θ | X, y)。


这种集成思想非常重要。贝叶斯预测的方差不仅包含噪声方差 σ^2,还包含一个依赖于训练数据 X 的项 V_N:
Var(y*) = σ^2 + x*^T V_N x*
其中 V_N 与 (X^T X + δ^2 I)^{-1} 有关。


这个额外的项意味着:在训练数据密集的区域,预测方差小,我们更自信;在训练数据稀疏的区域,预测方差大,我们更不确定。这对于决定在哪里探索新数据(如强化学习、医疗试验设计)至关重要。

如何选择正则化参数 δ?
现在最关键的问题是:如何选择正则化参数 δ(或 λ)?我们使用交叉验证技术。

以下是交叉验证最简单的形式:
- 分割数据:将数据分为两部分:训练集(用于学习模型)和测试集(用于评估性能,在训练过程中绝对不可查看)。
- 选择候选值:选择一组候选的 δ 值(例如 0.1, 1, 10, 50, 100)。
- 循环验证:对于每个候选 δ:
a. 使用训练集数据(X_train, y_train)和当前 δ,计算岭回归解θ_ridge。
b. 计算模型在训练集上的误差(例如均方误差)。
c. 使用学到的θ_ridge预测测试集X_test,并计算在测试集上的误差。 - 选择最佳参数:根据训练误差和测试误差选择 δ。有两种常见策略:
- 最小化最坏情况:选择那个使得“训练误差”和“测试误差”两者中最大值最小的 δ。这是一种保守策略。
- 最小化平均误差:选择那个使得“训练误差”和“测试误差”的平均值最小的 δ。
为了防止无意中通过测试集调整参数导致过拟合,更严谨的做法是将数据分为三部分:训练集、验证集(用于选择 δ)和测试集(最终评估,只在最后使用一次)。另一种流行的方法是 K折交叉验证。

模型复杂度、过拟合与泛化
通过交叉验证分析,我们可以总结出重要规律:
- 随着正则化强度
δ增加:- 训练误差会增大(因为模型拟合数据的自由度降低)。
- 测试误差会先减小后增大。
- 存在一个“最佳点”(甜点),使得测试误差最小。交叉验证的目标就是找到这个点。
我们希望模型在未来新数据上表现良好,这称为泛化能力。我们不想让模型过拟合训练数据。
通过一个多项式拟合的例子,我们可以理解模型复杂度、数据量和正则化的关系:
- 模型匹配真实情况:当模型复杂度(如多项式阶数)与真实数据生成过程匹配时,增加数据量能有效降低测试误差,最终收敛于由噪声决定的最低误差。
- 模型过于简单(欠拟合):即使增加大量数据,测试误差也无法降低到理想水平。此时需要换用更复杂的模型。
- 模型过于复杂(过拟合):在数据量少时,复杂模型(如高阶多项式)能使训练误差接近零,但测试误差极高。随着数据量增加,过拟合现象会缓解。
- 正则化的作用:正则化参数
δ就像一个“旋钮”,可以自动控制有效模型复杂度。δ太小 -> 模型行为复杂 -> 可能过拟合(训练误差低,测试误差高)。δ太大 -> 模型被强制简化(参数收缩)-> 可能欠拟合(训练误差和测试误差都高)。- 通过交叉验证选择恰当的
δ,可以在数据量有限的情况下获得良好的泛化性能。
大数据的作用在于,当拥有海量数据时,即使使用非常复杂的模型,也能通过数据本身的约束来防止过拟合。然而,获取和处理大数据成本高昂。在许多领域(如医疗),数据可能有限,此时巧妙地使用正则化比单纯追求更多数据更为关键和实用。
总结

本节课中我们一起学习了:
- 正则化(特别是岭回归和Lasso)的动机、数学推导和几何解释。它通过惩罚大的参数值来改善模型条件,提高泛化能力,Lasso还能产生稀疏解。
- 贝叶斯视角:岭回归等价于参数具有高斯先验的贝叶斯后验均值估计。贝叶斯预测提供了有数据依赖性的不确定性估计。
- 交叉验证:一种通过分割数据来估计模型在新数据上性能、并据此选择最佳超参数(如 δ)的黄金标准方法。
- 偏差-方差权衡:通过分析模型复杂度、数据量和正则化的关系,我们理解了过拟合与欠拟合的本质,以及如何利用正则化在有限数据下获得最佳泛化性能。

掌握这些概念,对于在实际中应用和调优机器学习模型至关重要。
20:L1正则化与Lasso 🎯






在本节课中,我们将要学习一种比岭回归(Ridge Regression)更强大的正则化技术——L1正则化,以及它在线性回归中的应用,即Lasso。这种技术不仅能防止过拟合,还能自动将不重要的特征权重精确地设为0,从而实现特征选择。




上一节我们介绍了岭回归,它通过L2正则化使权重参数变小,但通常不会精确为零。本节中我们来看看如何通过L1正则化,让某些参数真正变为零。







核心问题:特征选择与成本控制




在许多预测问题中,我们可能拥有许多特征(预测变量)。每个特征 x_j 乘以一个对应的权重参数 θ_j,共同预测目标值 y。在线性回归中,预测公式为:
ŷ = x₁θ₁ + x₂θ₂ + ... + x_Dθ_D




然而,某些特征可能测量成本高昂,或者对预测的贡献微乎其微。我们希望找到一种方法,能够自动识别并“关闭”这些不重要的特征。具体来说,如果某个权重 θ_j 变为0,那么对应的特征 x_j 在模型中就失去了作用,我们可以安全地将其从数据收集中移除,从而节省成本并简化模型。






从岭回归到Lasso





岭回归通过添加权重的平方和(L2范数)作为惩罚项来正则化模型:
J(θ) = (y - Xθ)ᵀ(y - Xθ) + λ * Σ(θ_j²)
随着正则化强度 λ 增大,权重会趋近于零,但很少会精确等于零。这留下了一个难题:我们如何判断一个非常小的权重(例如0.001)是否应该被视为零并舍弃其对应的特征?





我们需要的是一种能够精确地将某些权重设为零的技术。这就是Lasso(Least Absolute Shrinkage and Selection Operator)的目标。与岭回归不同,Lasso使用权重的绝对值之和(L1范数)作为惩罚项:
J(θ) = (y - Xθ)ᵀ(y - Xθ) + λ * Σ|θ_j|


L1正则化的几何直观理解(以二维为例)


为了理解L1正则化为何能产生零解,我们考虑一个二维权重空间 θ = [θ₁, θ₂]。





- 损失函数部分:
(y - Xθ)ᵀ(y - Xθ)是一个关于θ的二次函数,其等高线是一系列同心椭圆,中心点是最大似然估计解。 - L1惩罚项部分:
|θ₁| + |θ₂| = constant。这个方程的等高线是一个菱形(或称L1范数球)。


当我们最小化总目标函数 J(θ) 时,就是在寻找椭圆等高线与菱形等高线的“接触点”。由于菱形有尖角(例如在坐标轴上 θ₁=0 或 θ₂=0 的点),而椭圆是光滑的,因此最优解有很大概率会落在这些尖角上。在尖角处,至少有一个坐标(即一个权重参数)恰好为零。

相比之下,岭回归的L2惩罚项 θ₁² + θ₂² = constant 的等高线是一个圆形。圆与椭圆的接触点几乎永远不会落在坐标轴上,因此权重只会被压缩得很小,而不会精确为零。





Lasso的优势与应用
以下是Lasso方法带来的主要好处:



- 自动特征选择:Lasso能够自动将不相关或冗余特征的权重设为零。我们无需手动设定阈值来决定何时舍弃一个特征。
- 模型可解释性:最终模型只包含少数几个非零权重的特征,这使得模型更容易理解和解释。
- 预测性能:通过交叉验证选择合适的
λ,Lasso通常能获得与岭回归相当甚至更好的测试集预测性能,同时模型更加简洁。 - 处理高维数据:在特征数量
D远大于样本数量N的情况下,Lasso特别有用,因为它可以给出一个稀疏的、可用的模型。

一个典型的应用场景是文本分类(如垃圾邮件过滤)。特征可能是词汇表中每个词是否出现,维度可能高达百万。Lasso可以帮助我们自动筛选出对分类真正重要的关键词。


总结




本节课中我们一起学习了L1正则化与Lasso。我们了解到,通过在损失函数中添加权重的绝对值之和作为惩罚项,Lasso能够驱使不重要的特征权重精确地变为零,从而实现自动特征选择。我们从几何角度直观理解了为何L1范数会产生稀疏解(零解),并讨论了Lasso在简化模型、提高可解释性以及处理高维数据方面的优势。在接下来的课程中,我们将推导求解Lasso的算法,并亲自动手实现它。
22:稀疏模型与变量选择
在本节课中,我们将要学习一种特殊的线性模型——稀疏模型。这种模型不仅用于预测,还致力于使用尽可能少的变量来生成预测。我们将探讨其动机、数学原理以及一个核心的求解算法。
概述
线性模型是预测的基础工具。然而,在许多实际应用中,我们不仅希望模型预测准确,还希望它尽可能简洁,即使用最少的输入变量。这被称为稀疏性。本节课我们将学习如何构建这种稀疏线性模型,理解其背后的数学原理,并掌握一个名为坐标下降法的求解算法。
为什么需要稀疏性?
我们希望使用尽可能少变量的原因在于,某些变量可能获取成本高昂,或者难以实际测量。这在许多领域都是如此。
例如,在房地产领域,预测房屋价格时,你可能需要考虑许多变量:社区环境、房间数量等。但你可能还会考虑加拿大的GDP、美国的经济状况,甚至中国的经济状况等宏观因素。虽然这些变量可能有助于预测,但其中一些数据的获取成本非常高,有些甚至无法获得。因此,我们的目标是找出那些真正对价格有预测作用的重要变量。
这里需要明确一点:我们寻找的是变量与结果之间的相关性,而非因果关系。例如,观察到吸烟与癌症相关,但我们无法仅凭此数据断定吸烟导致癌症,还是患癌的人更喜欢吸烟。确定因果关系通常需要实验或更复杂的分析(如工具变量法)。
稀疏模型的目标函数
我们的目标是在线性模型框架下,构建一个同时考虑预测精度和模型简洁性的目标函数。
我们从一个标准的线性回归模型开始,其预测值为:
y_hat = X * theta
其中,y_hat是预测值,X是特征数据矩阵(N行D列,代表N个样本和D个特征),theta是模型参数。
通常,我们通过最小化预测误差(如平方误差)来拟合模型。为了引入稀疏性,我们在目标函数中添加一个额外的惩罚项。这个新的目标函数 J(theta) 如下:
J(theta) = Σ (y_i - x_i^T * theta)^2 + δ^2 * Σ |theta_j|
让我们分解这个公式:
- 第一部分
Σ (y_i - x_i^T * theta)^2:这是标准的平方误差损失,衡量模型的预测精度。我们希望它越小越好。 - 第二部分
δ^2 * Σ |theta_j|:这是L1正则化项(或Lasso惩罚项)。它对模型参数theta的绝对值之和进行惩罚。δ是一个超参数,用于控制惩罚的强度。 - 超参数
δ:它平衡了预测精度和模型简洁性。当δ很大时,惩罚项占主导,模型会倾向于让更多theta_j变为0,从而更稀疏。当δ = 0时,惩罚项消失,模型退化为普通的线性回归。
这个目标函数的核心思想是:为了最小化总成本 J(theta),我们不仅需要让预测误差小,还需要让参数 theta 的绝对值和小。如果一个参数 theta_j 变为0,就意味着对应的特征 x_j 对预测没有贡献,我们可以将其从模型中移除。
求解挑战与次梯度
为了找到最优的 theta,标准做法是对目标函数 J(theta) 求导并令其为零。然而,这里存在一个技术难题:绝对值函数 |theta_j| 在 theta_j = 0 处是不可导的。
为了解决这个问题,我们引入一个数学概念:次梯度。对于绝对值函数,在 theta_j > 0 时,导数为+1;在 theta_j < 0 时,导数为-1;在 theta_j = 0 时,导数不是单一值,而是一个集合 [-1, 1] 内的任何数。这个集合就是该点处的次梯度。
利用次梯度的概念,我们可以处理目标函数的导数问题,并推导出参数 theta_j 的更新规则。
坐标下降法
由于直接求解整个 theta 向量很困难,我们采用一种迭代算法——坐标下降法。其思想是:每次只优化一个参数 theta_j,而固定其他所有参数不变。如此循环往复,直至所有参数收敛。
以下是算法的具体步骤:
- 初始化:随机初始化参数向量
theta,或使用岭回归等方法的解作为起点。 - 循环迭代:重复以下步骤直至
theta不再变化(收敛):- 对
j = 1到D(遍历每一个特征):- 计算两个辅助量
A_j和C_j:A_j = 2 * Σ (x_ij)^2(与theta无关,可预先计算)C_j = 2 * Σ [ x_ij * (y_i - Σ_{k≠j} x_ik * theta_k) ](依赖于当前其他所有theta)
- 根据
C_j的值更新theta_j:- 如果
C_j < -δ^2,则theta_j = (C_j + δ^2) / A_j - 如果
C_j > δ^2,则theta_j = (C_j - δ^2) / A_j - 如果
-δ^2 ≤ C_j ≤ δ^2,则theta_j = 0
- 如果
- 计算两个辅助量
- 对
- 输出:得到稀疏的参数估计
theta。其中许多theta_j将为0,实现了变量选择。
这个算法易于实现,并且在目标函数是凸函数的情况下能保证收敛到全局最优解。

应用与意义
稀疏模型和L1正则化有广泛的应用:
- 成本降低:识别出关键变量后,在后续数据收集中可以忽略不重要的变量,节省成本。
- 科学发现:例如在遗传学中,通过分析成千上万个基因与疾病的关系,Lasso可以帮助找出少数几个真正相关的基因,极大缩小后续实验验证的范围。
- 特征学习:在图像处理等领域,对类似PCA的目标函数加入L1惩罚,可以学习到局部的、稀疏的基函数(如边缘检测器),这与人类视觉皮层神经元的感受野特性相似。
总结

本节课我们一起学习了稀疏线性模型的核心思想。我们了解到,通过在标准线性回归的目标函数中加入L1正则化惩罚项,可以迫使模型参数变得稀疏,从而实现变量选择。我们探讨了求解该模型时遇到的绝对值函数求导难题,并引入了次梯度的概念来克服它。最后,我们详细介绍了坐标下降法这一迭代算法来求解稀疏模型参数。这种方法不仅预测性能好,还能提供模型可解释性,是机器学习中一个非常强大且常用的工具。
22:稀疏模型与变量选择
概述
在本节课中,我们将要学习稀疏模型和变量选择。我们将探讨如何在构建线性模型时,不仅追求预测的准确性,还希望使用尽可能少的变量。我们将了解这样做的原因,学习如何通过数学方法实现变量选择,并最终掌握一个名为“坐标下降”的实用算法。
为什么需要稀疏模型?
上一节我们介绍了线性模型的基础。本节中我们来看看为什么有时我们希望模型是“稀疏”的,即只使用少数几个变量。
我们希望使用尽可能少的变量来生成预测,原因在于某些变量可能获取成本高昂,或者难以实际获得。这在许多实际应用中都是成立的。
例如,在房地产领域,如果你试图预测房屋成本(例如预测温哥华未来两年每栋房屋的价格),你需要考虑许多变量,如社区、房间数量等。但你可能还会考虑加拿大的GDP、美国的经济状况,以及中国的经济状况等宏观因素。虽然使用所有这些变量可以做出预测,但其中一些变量的获取成本非常高,有些甚至无法获取。因此,你需要找出那些真正对价格有预测作用的重要变量。
这里找到的是变量与结果之间的相关性,而非因果关系。例如,观察到癌症与吸烟相关,但你无法确定是吸烟导致癌症,还是患癌症的人更喜欢吸烟。确定因果关系通常需要通过实验或更深入的分析(如使用工具变量)。
我们的目标是识别出与结果Y相关的变量X。
稀疏模型的成本函数
为了同时实现预测准确性和变量稀疏性,我们需要设计一个新的成本函数。
我们熟悉的成本函数包含一个部分:残差平方和,即∑(yᵢ - xᵢθ)²,这衡量了预测的误差。
现在,我们向成本函数中添加另一个项:δ² ∑|θⱼ|,即所有参数θⱼ的绝对值之和,乘以一个权衡参数δ²。
这样做的原因是:当残差平方和很大,或者θ的绝对值之和很大时,成本都会很高。为了降低成本,我们必须同时做两件事:减小预测误差,并且减小参数θ的值。
减小参数θ的值之所以重要,是因为如果某个θⱼ变为0,就意味着我们不需要对应的变量xⱼ(因为xⱼ * 0 = 0)。这样,我们就能识别出哪些变量是相关的。
因此,我们的总成本函数J(θ)为:
J(θ) = ∑(yᵢ - xᵢθ)² + δ² ∑|θⱼ|
参数δ是一个权衡标量。如果δ非常大,第二项(正则化项)就占主导地位,会迫使所有θ趋近于0。如果δ为0,第二项消失,我们就回到了普通的线性回归(最大似然估计)。δ的选择至关重要,我们稍后会讨论如何通过交叉验证等方法选择它。
求解稀疏模型:挑战与思路
我们的目标是找到最小化成本函数J(θ)的参数θ估计值。通常的方法是求导数并令其等于零。
然而,这里遇到了一个难题:绝对值函数|θ|在θ=0处不可导。其导数在θ<0时为-1,在θ>0时为+1,但在θ=0处没有唯一的导数。
为了克服这个难题,我们需要引入一个新的数学概念:次梯度。对于绝对值函数在θ=0处,其次梯度是所有介于-1和+1之间的实数集合。这可以理解为在原点处所有可能的“支撑线”的斜率。
利用次梯度的概念,我们就可以处理成本函数的导数问题了。
坐标下降算法
由于直接对所有θ求导并求解方程组很困难,我们将采用一种迭代算法:坐标下降法。
以下是算法的基本思路:
- 首先初始化所有参数θ(可以随机初始化,或使用岭回归的结果作为起点)。
- 然后,我们一次只优化一个参数θⱼ,而固定其他所有参数。
- 对每个θⱼ,我们计算在给定其他参数时能最小化成本函数的最佳值。
- 更新完一个θⱼ后,我们转向下一个参数,重复此过程。
- 在所有参数上循环多次,直到参数值不再变化(收敛)。
这个算法之所以有效,是因为我们的成本函数是凸函数,保证能收敛到全局最优解。
参数θⱼ的更新规则
当我们固定其他参数,只对θⱼ求导时,成本函数可以重新整理。我们定义两个中间量以简化表达式:
- Aⱼ = ∑ xᵢⱼ² (总是非负)
- Cⱼ = ∑ [ (yᵢ - xᵢ₋ⱼθ₋ⱼ) * xᵢⱼ ] (这依赖于其他所有参数的当前值)
这里,xᵢ₋ⱼθ₋ⱼ 表示使用除第j个变量外所有其他变量和其对应参数所做的预测。
考虑绝对值函数的次梯度,我们得到关于θⱼ的导数方程。根据θⱼ的符号,我们分三种情况求解:
-
如果 Cⱼ < -δ²:
则最优的 θⱼ < 0。
更新公式为:θⱼ = (Cⱼ + δ²) / Aⱼ -
如果 Cⱼ > δ²:
则最优的 θⱼ > 0。
更新公式为:θⱼ = (Cⱼ - δ²) / Aⱼ -
如果 -δ² ≤ Cⱼ ≤ δ²:
则最优的 θⱼ = 0
这个更新规则是算法的核心。它清楚地展示了稀疏性是如何产生的:当Cⱼ的绝对值小于阈值δ²时,对应的参数θⱼ就会被精确地设置为零。

算法步骤总结
以下是完整的坐标下降算法步骤:
- 初始化:为所有参数θ选择一个初始值(例如,全零、随机值或岭回归估计值)。
- 预计算:计算所有Aⱼ = ∑ xᵢⱼ²,因为它们在迭代中不变。
- 迭代直至收敛:
- 对 j = 1 到 D(D为变量总数):
- 使用当前所有θ值计算 Cⱼ = ∑ [ (yᵢ - xᵢ₋ⱼθ₋ⱼ) * xᵢⱼ ]
- 根据上述三条规则更新θⱼ。
- 检查所有θ是否不再发生显著变化。如果是,则算法收敛;否则,进行下一轮迭代。
- 对 j = 1 到 D(D为变量总数):
- 输出:得到稀疏的参数向量θ,其中许多元素为零。
- 预测:对于新样本x_new,预测值为 ŷ = x_new * θ。
应用与意义
稀疏模型(L1正则化)的应用非常广泛:
- 特征选择:自动识别出最重要的变量,帮助理解数据。
- 降低成本:在医疗、金融等领域,避免测量昂贵或不必要的特征。
- 压缩感知:这是现代信号处理中的一个热门领域,它利用信号的稀疏性,以远低于传统要求的采样率重建信号。
- 神经科学:在图像处理中,类似的稀疏编码模型可以产生类似人眼初级视觉皮层中神经元的“感受野”,即对特定边缘或纹理敏感的局部滤波器。
与岭回归(L2正则化)使参数变小但非零不同,L1正则化能产生精确的零值,从而实现真正的变量选择。

总结
本节课中我们一起学习了稀疏模型与变量选择。我们了解到,通过在标准线性回归的成本函数中添加参数的L1范数(绝对值之和)作为正则化项,可以迫使模型在保持预测能力的同时,使用尽可能少的变量。我们引入了次梯度的概念来处理绝对值函数求导的难题,并详细阐述了坐标下降算法来高效求解这个优化问题。该算法通过逐个更新参数,并根据简洁的规则判断参数是否应为零,最终得到一个稀疏的、易于解释的模型。这种方法在特征选择、成本控制和许多科学发现中都具有重要价值。
23:狄利克雷分布与分类分布 🎲


在本节课中,我们将学习如何将二元的伯努利分布和贝塔分布推广到具有多个可能取值的变量上,即分类分布和狄利克雷分布。我们将看到,这些概念是构建分类器(如情感分析应用)的基础。

回顾:伯努利分布与贝塔分布
上一节我们讨论了二元变量的情况。如果一个变量是二元的(例如抛硬币),其似然函数可以用伯努利分布表示:
公式:P(D | θ) = θ^{n1} * (1-θ)^{n0}

其中,n1 是变量取值为1的次数,n0 是取值为0的次数,θ 是取值为1的概率。
我们了解到,θ 的自然先验分布是贝塔分布,它允许我们编码关于 θ 值的先验信念。在贝叶斯推断中,我们不进行优化,也不认为 θ 只有一个真实值。我们使用先验分布 P(θ) 乘以似然函数,然后归一化得到后验分布 P(θ | D)。当先验分布与后验分布具有相同形式时(例如先验是贝塔分布,后验也是贝塔分布),我们称该先验是似然函数的共轭先验。
推广:从二元到多元



本节中,我们来看看如何将上述概念推广到变量可以取 K 个值(K > 2)的情况。这就像从抛硬币(两个结果)推广到掷骰子(六个结果)。
分类分布


假设我们有 n 个数据点 x_1, ..., x_n。每个数据点 x_i 可以取 K 个值中的一个。为了便于数学表示,我们使用“独热编码”:如果 x_i 属于第 j 类,则将其表示为一个长度为 K 的向量,其中第 j 个位置为1,其余位置为0。例如,当 K=3 时:
- 类别1编码为
[1, 0, 0] - 类别2编码为
[0, 1, 0] - 类别3编码为
[0, 0, 1]
分类分布的定义如下:
公式:P(x_i | θ) = ∏_{j=1}^{K} θ_j^{I(x_{ij}=1)}
其中:
θ_j是数据点属于第j类的概率。I(x_{ij}=1)是指示函数,当x_i的第j个分量为1时取值为1,否则为0。- 所有
θ_j必须满足:∑_{j=1}^{K} θ_j = 1,且0 ≤ θ_j ≤ 1。
这个公式的含义很简单:x_i 属于第 j 类的概率就是 θ_j。当 K=2 时,分类分布就退化成了伯努利分布(设 θ_1 = θ, θ_2 = 1-θ)。

如果我们假设所有数据点独立同分布,那么整个数据集的似然函数就是每个数据点概率的乘积。
狄利克雷分布
正如贝塔分布是伯努利分布中参数 θ 的共轭先验,狄利克雷分布是分类分布中参数向量 θ 的共轭先验。
回忆一下,贝塔分布的形式为:P(θ) ∝ θ^{α1-1} * (1-θ)^{α2-1}。
狄利克雷分布是其多元推广:
公式:P(θ) ∝ ∏_{j=1}^{K} θ_j^{α_j - 1}
其中,α_j 是分布的参数(均为正数),并且同样有约束 ∑_{j=1}^{K} θ_j = 1。





例如,对于一个六面骰子(K=6),其 θ 的先验就是一个六维的狄利克雷分布。
贝叶斯推断:从先验到后验


现在,让我们像处理硬币问题一样,对分类分布进行贝叶斯推断。我们有:
- 先验:
P(θ) = Dir(θ | α)(狄利克雷分布) - 似然:
P(D | θ) = ∏_{i=1}^{n} ∏_{j=1}^{K} θ_j^{I(x_{ij}=1)}(分类分布)
根据贝叶斯定理,后验分布与先验乘以似然成正比:
P(θ | D) ∝ P(D | θ) * P(θ)
∝ [∏_{j=1}^{K} θ_j^{N_j}] * [∏_{j=1}^{K} θ_j^{α_j - 1}]
= ∏_{j=1}^{K} θ_j^{N_j + α_j - 1}

其中,N_j = ∑_{i=1}^{n} I(x_{ij}=1),即数据集中属于第 j 类的样本数量。
我们可以看到,后验分布仍然是一个狄利克雷分布,其参数更新为 α_j' = N_j + α_j。这完美展示了共轭性:狄利克雷先验与分类似然结合,产生狄利克雷后验。
应用实例:推特情感分析 🐦


理解了分类分布和狄利克雷分布后,我们就可以构建一个实用的分类器。让我们看一个有趣且即时的例子:分析推特上对某个人物(例如总统)的情感倾向。
问题建模
我们的目标是:给定一条推文,判断其情感是正面、负面还是中性。
- 定义输出变量 y:
y表示情感类别,是一个分类变量(K=3)。我们可以用独热编码表示。 - 定义输入特征 x:一条推文由许多单词组成。我们构建一个包含
D个常用单词(如“great”, “bad”, “OMG”, “cat”)的词典。然后将每条推文表示为一个长度为D的二进制向量x。如果推文中包含词典中的第j个词,则x_j = 1,否则为0。这称为“词袋”表示。
朴素贝叶斯分类器
为了连接 x 和 y,我们使用贝叶斯定理:
公式:P(y=c | x, θ, π) ∝ P(y=c | π) * P(x | y=c, θ)

其中:
P(y=c | π)是先验概率,表示任意一条推文属于类别c的概率。它服从分类分布,参数为π。P(x | y=c, θ)是似然,表示在已知情感类别为c的条件下,观察到特征向量x的概率。

为了计算似然,我们做一个关键的简化假设(“朴素”假设):假设在给定类别 c 的条件下,特征 x_1, x_2, ..., x_D(即各个词是否出现)是相互独立的。虽然这个假设在现实中不成立(词语有关联),但实践表明它通常能产生很好的效果。
在这个假设下,似然函数可以分解为:
公式:P(x | y=c, θ) = ∏_{j=1}^{D} P(x_j | y=c, θ_{jc})
其中,θ_{jc} 表示在类别 c 中,第 j 个单词出现的概率。对于每个类别 c,都有一套独立的参数 θ_{.,c}。




模型训练与预测


- 训练:我们需要从标注数据(例如,100万条已标记为正面/负面/中性的推文)中估计参数
π和θ。这可以通过最大似然估计(MLE)或贝叶斯估计(使用狄利克雷先验)来完成。MLE的解非常直观且易于计算:π_c的估计值是训练数据中类别c的比例。θ_{jc}的估计值是在类别c的所有推文中,包含单词j的推文所占的比例。
- 预测:对于一条新推文,我们将其转换为特征向量
x_new。然后对每个类别c,计算P(y=c | π) * P(x_new | y=c, θ)。概率最大的那个类别就是我们的预测情感。
这个模型的最终形式可以归结为一个简单的计数和比较过程,算法非常高效,甚至可以并行化和在线学习,每来一条新推文都可以实时更新模型。

总结
本节课中我们一起学习了:
- 分类分布:它是伯努利分布在
K > 2个类别上的推广,用于描述一个样本属于某个类别的概率。 - 狄利克雷分布:它是贝塔分布在
K维参数上的推广,是分类分布的共轭先验,使我们能方便地进行贝叶斯推断。 - 朴素贝叶斯分类器:利用贝叶斯定理和特征条件独立性假设,我们将分类分布应用于文本特征(词袋模型),构建了一个强大而简单的文本分类模型(如推特情感分析)。



通过将简单的硬币模型推广到多元情况,我们打开了处理更复杂、更实际数据的大门,为后续学习更高级的模型(如神经网络)奠定了重要基础。
24:朴素贝叶斯文本分类 📝

在本节课中,我们将学习如何使用朴素贝叶斯模型进行文本分类,例如判断一条推文的情感是积极还是消极。我们将从模型的基本概念开始,逐步推导其数学原理,并最终了解如何将其应用于实际数据。




模型概览与扩展 🔄


上一节我们介绍了基础的伯努利模型。本节中我们来看看它的一个泛化,这个泛化允许我们处理不止两个类别。例如,我们可以处理K个类别。对于文本分类,我们通常有多个类别(如积极、消极、中性)。



当有多个类别(例如K个)时,伯努利分布的扩展被称为分类分布。其公式可以表示为:
[
P(Y = c) = \pi_c
]





其中,(\pi_c) 是样本属于类别 (c) 的概率。

相应地,贝塔分布扩展到向量形式被称为狄利克雷分布。我们了解到,如果将狄利克雷先验与分类似然函数相乘并归一化,我们会得到狄利克雷后验分布。即:狄利克雷先验 × 分类似然 = 狄利克雷后验。

在处理文本时,单词本质上是计数。我们通常关注一个文档中出现了哪些词,因此我们处理的是许多“硬币”的投掷结果,每个词对应一枚硬币(出现或不出现)。这种模型在生物信息学(如分析DNA碱基)和网络信息挖掘(如文本分析)中极其有用。


文本分类示例:推文情感分析 🐦
我们从一个例子开始,这个例子是关于推文分类的。我们的目标是构建一个推文分类器,判断一条推文的情感是积极还是消极。


我们决定将输入编码为一个向量 x。如果某个词出现在推文中,向量的对应分量就是1,否则为0。因此,这个向量通常是稀疏的(大部分是0),可能只有5到10个位置是1。我们只需要存储这些1的位置。


然后,我们可能希望将推文分为两类(积极/消极),或三类(积极/消极/中性),或任何其他数量的类别。
获取带标签数据的一种方法是:收集所有包含笑脸符号的推文,标记为“积极”;收集所有包含哭脸符号的推文,标记为“消极”。当然,数据中会有错误(例如讽刺性推文),但大概率上,带笑脸的推文大多是积极的。即使数据存在一定误差,我们仍然可以构建出非常好的分类器。
实际上,存在一个名为“Sentiment140”的网站,它使用类似的方法。你输入一个词(如“Obama”),它会提取最近关于该词的一批推文,应用分类器预测每条推文的情感,然后统计积极和消极推文的数量。这种聚合分析即使对单条推文的预测存在少量错误,整体结果仍然可靠。



数据表示与模型假设 📊

为了进行分类,我们将从类别的先验概率开始。目前的数据表示有一个特点:它不考虑词语出现的频率。例如,如果“Obama”一词出现了三次,我们只记录它为1(出现),而不是3(频率)。我们可以使用多项分布模型来考虑频率,但在实践中,这种二元(出现/未出现)模型通常效果也很好。关于使用伯努利模型还是多项模型,存在支持和反对的论点,我们稍后会讨论。

首先,我们坚持使用当前思路:输入 x 是一个由0和1组成的向量。向量中的每个条目 x_j 都像一次抛硬币的结果(1或0),因此它是一个伯努利变量。我们假设这些词是相互独立的——这就是“朴素”贝叶斯中“朴素”一词的由来。我们假设所有词彼此独立。


定义:
- D:不同单词的数量(特征维度)。
- N:推文的数量(数据点数量)。
- C:类别的数量(例如,积极和消极时 C=2)。


模型推导与参数 📐



我们想要推导的是后验概率 (P(Y | X)),即在给定推文 X 的情况下,它属于某个类别 Y 的概率。应用贝叶斯规则,我们可以将其分解为先验和似然的乘积。
先验 (P(Y_i | \pi)) 是每个类别的先验概率,例如推文是积极或消极的先验可能性。我们用一个分类分布来建模它。对于类别 (c),其概率为 (\pi_c)。
似然 (P(X_i | Y_i, \theta)) 是在给定类别下,观察到推文 X_i 的概率。由于我们假设所有词独立,这个概率是每个词概率的乘积。对于第 (j) 个词,给定类别 (c) 时,它出现((x_{ij}=1))的概率是 (\theta_{jc}),不出现((x_{ij}=0))的概率是 (1 - \theta_{jc})。

因此,完整的模型表达式是各类别先验与所有词伯努利概率的乘积。
索引说明:
- i:数据点索引(第 i 条推文),从 1 到 N。
- j:单词特征索引(第 j 个词),从 1 到 D。
- c:类别索引(第 c 个类),从 1 到 C。


参数 (\theta_{jc}) 表示当推文属于类别 (c) 时,第 (j) 个词出现的概率。正是这些概率在不同类别间的差异,使得我们能够区分类别(例如,垃圾邮件可能更常出现“Viagra”和“deal”等词)。



参数估计与预测 🎯



为了进行预测,我们需要估计参数 (\pi_c) 和 (\theta_{jc})。直觉上:
- (\pi_c) 的一个好估计是:属于类别 (c) 的推文数量 (N_c) 除以推文总数 (N)。
- (\theta_{jc}) 的一个好估计是:在类别 (c) 中,第 (j) 个词出现的次数 (N_{jc}) 除以类别 (c) 中的推文总数 (N_c)。

这些实际上就是最大似然估计。


一旦我们有了这些估计,对于一条新推文 x*,我们可以计算它属于每个类别 (c) 的概率(正比于):






[
P(Y=c | X=x^) \propto \pi_c \times \prod_{j=1}^{D} \theta_{jc}{x_j} (1-\theta_{jc}){(1-x_j*)}
]

我们为每个类别计算这个值,然后归一化(除以所有类别的总和)就得到了属于各类别的实际概率。这就是我们进行预测的方式。


实现细节与数值稳定性 ⚙️

算法本身很简单:遍历数据,计数 (N_c) 和 (N_{jc}),然后计算估计值。



但有一个重要的警告:我们正在将许多介于0和1之间的小概率相乘。当处理数百万条推文和单词时,直接相乘会导致数值下溢(结果变为0)。这是计算机浮点数精度限制导致的问题。

为了解决这个问题,我们使用一个技巧:在对数空间中进行计算。我们计算概率的对数之和,而不是概率的乘积。因为:
[
\log(a \times b) = \log(a) + \log(b)
]
这避免了直接处理极小的数字。在需要比较概率时(例如,找最大概率对应的类别),我们可以在对数空间中进行。在需要实际概率值时,可以使用log-sum-exp等技巧来稳定计算。助教将在作业中帮助你们实现这个技巧。
最大似然估计推导(练习)✍️



本节课的最后,我们给出了对数似然函数的表达式:
[
\log L(\pi, \theta) = \sum_{c=1}^{C} N_c \log(\pi_c) + \sum_{c=1}^{C} \sum_{j=1}^{D} \left[ N_{jc} \log(\theta_{jc}) + (N_c - N_{jc}) \log(1-\theta_{jc}) \right]
]
作为练习,请大家回家尝试通过对此函数分别关于 (\pi_c) 和 (\theta_{jc}) 求导并令导数为零,来推导出它们的最大似然估计公式。这将帮助我们更深入地理解模型,并使得下节课关于贝叶斯分析的讲解进行得更快。
一旦掌握了这些,你就可以去实现自己的情感分析引擎了。
总结 📝




本节课中我们一起学习了:
- 如何将伯努利模型泛化到多类别的分类分布和狄利克雷分布。
- 如何将文本数据表示为二值特征向量,并基于朴素贝叶斯独立性假设构建分类模型。
- 推导了用于文本分类的朴素贝叶斯模型的整体结构,包括先验、似然和参数定义。
- 直观地理解了模型参数((\pi_c) 和 (\theta_{jc}))的最大似然估计方法。
- 学习了如何利用估计出的参数对新数据进行概率预测。
- 认识了在实际计算中处理数值下溢问题的重要性及对数域计算的技巧。
- 明确了下一步通过最大似然估计和贝叶斯分析完整求解模型的任务。
25:朴素贝叶斯推特情感预测 📊
在本节课中,我们将学习如何使用朴素贝叶斯模型对文本进行分类,特别是推特的情感预测。我们将推导模型的最大似然估计和贝叶斯估计,并理解其背后的原理。
概述
朴素贝叶斯是一种基于贝叶斯定理的简单分类算法。它假设特征之间相互独立,这使得模型计算高效且易于并行化。我们将从最大似然估计开始,然后引入贝叶斯方法来解决数据稀疏性问题。
模型与最大似然估计


上一节我们介绍了朴素贝叶斯的基本思想。本节中,我们来看看如何通过最大似然估计来学习模型的参数。
朴素贝叶斯模型假设每个特征(例如单词)在给定类别下是独立的伯努利分布。对于有 C 个类别和 D 个特征(单词)的问题,我们需要估计两类参数:
- 类别先验概率
π_c:文档属于类别c的概率。 - 条件概率
θ_jc:在类别c中,第j个特征(单词)出现的概率。
模型的似然函数可以写为:
L(π, θ) = ∏_c (π_c)^{N_c} * ∏_j (θ_jc)^{N_jc} * (1 - θ_jc)^{(N_c - N_jc)}
其中:
N_c是属于类别c的文档数量。N_jc是在类别c的文档中,特征j出现的次数。
为了便于优化,我们通常使用对数似然函数:

log L(π, θ) = Σ_c N_c log(π_c) + Σ_c Σ_j [N_jc log(θ_jc) + (N_c - N_jc) log(1 - θ_jc)]
参数 θ_jc 的估计
首先,我们估计条件概率 θ_jc。由于对数似然函数中关于 π 和 θ 的项是分离的,我们可以单独对 θ_jc 求导并令其为零。
对 log L 关于 θ_jc 求偏导:
∂ log L / ∂ θ_jc = N_jc / θ_jc - (N_c - N_jc) / (1 - θ_jc)
令导数为零,解得:
θ_jc_hat = N_jc / N_c



这个结果非常直观:在类别 c 中,单词 j 出现的概率估计,就是它在类别 c 的文档中出现的次数除以类别 c 的总文档数。
参数 π_c 的估计与约束
接下来估计类别先验 π_c。这里有一个重要的约束:所有类别的先验概率之和必须为1,即 Σ_c π_c = 1。我们需要在优化时加入这个约束。


我们构建拉格朗日函数,将约束条件融入目标函数:
L(π, λ) = Σ_c N_c log(π_c) + λ (1 - Σ_c π_c)
其中 λ 是拉格朗日乘子。现在我们对 π_c 和 λ 分别求导。
首先,对 π_c 求偏导并令为零:

∂ L / ∂ π_c = N_c / π_c - λ = 0 => N_c = λ π_c
然后,对 λ 求偏导并令为零,这直接给出了约束条件:
∂ L / ∂ λ = 1 - Σ_c π_c = 0 => Σ_c π_c = 1
现在,我们将 N_c = λ π_c 对所有类别 c 求和:
Σ_c N_c = λ Σ_c π_c
左边是所有文档的总数 N,右边根据约束条件 Σ_c π_c = 1,所以 λ = N。
将 λ = N 代回 N_c = λ π_c,得到:
π_c_hat = N_c / N
这同样符合直觉:类别 c 的先验概率估计,就是属于该类别的文档数占总文档数的比例。
贝叶斯估计
最大似然估计的一个问题是,如果某个单词在某个类别的训练数据中从未出现(N_jc = 0),那么 θ_jc_hat = 0。这会导致未来任何包含该单词的文档被判定为不可能属于该类,即“黑天鹅”悖论。贝叶斯估计通过引入先验分布来缓解这个问题。
上一节我们完成了最大似然估计。本节中,我们引入贝叶斯框架,为参数赋予先验分布,从而得到更鲁棒的估计。
我们为参数选择共轭先验:
- 对于伯努利分布的参数
θ_jc,选择 Beta分布 作为先验。 - 对于类别分布(Categorical)的参数
π,选择 狄利克雷分布 作为先验。
假设先验形式如下:

P(π) ∝ ∏_c π_c^{α_c - 1} # 狄利克雷先验
P(θ_jc) ∝ θ_jc^{β1 - 1} (1 - θ_jc)^{β2 - 1} # Beta先验(对所有j, c相同)
这里 α_c, β1, β2 是超参数。由于假设特征和参数独立,联合先验是这些分布的乘积。
后验分布正比于似然函数与先验分布的乘积:
P(π, θ | 数据) ∝ [似然函数] * [先验分布]
代入似然和先验的具体形式后,我们发现后验分布仍然具有相同的形式(共轭性):
π的后验是狄利克雷分布,参数更新为(N_c + α_c)。θ_jc的后验是Beta分布,参数更新为(N_jc + β1)和(N_c - N_jc + β2)。
我们通常取后验分布的均值作为点估计。以下是后验均值估计:
π_c_bayes = (N_c + α_c) / (N + Σ_c α_c)
θ_jc_bayes = (N_jc + β1) / (N_c + β1 + β2)
贝叶斯估计的优势
以下是贝叶斯估计解决的主要问题:
- 避免零概率:即使
N_jc = 0,只要β1 > 0,θ_jc_bayes就不会为零,保留了该单词出现的可能性。 - 平滑效果:先验参数
β1,β2起到了平滑作用。例如,设置β1 = β2 = 1(均匀先验)相当于在计数上加1,即拉普拉斯平滑。 - 融入先验知识:通过调整超参数
α_c,β1,β2,可以融入我们对类别的分布或单词出现频率的先验信念。


模型应用与扩展
我们推导了文本分类的朴素贝叶斯模型。这个模型的应用非常广泛。
以下是朴素贝叶斯模型的一些关键特性和应用场景:
- 高效并行:参数估计(计数)可以完全并行化,因为每个特征和类别的计数是独立的。
- 在线学习:模型可以轻松进行在线更新。每获得一个新的训练样本,只需更新对应的
N_c和N_jc计数即可,非常适合处理数据流(如推特流)。 - 应用领域:除了推特情感分析,该模型还可用于垃圾邮件过滤、博客分类、根据关键词自动归档邮件,甚至对离散序列(如RNA链)进行分类。

处理连续特征
我们目前假设输入特征是二元的(单词是否出现)。朴素贝叶斯也可以处理连续特征。


- 高斯朴素贝叶斯:如果输入特征是连续的(如图像像素值),我们可以假设每个特征在给定类别下服从高斯分布。此时,需要用高斯分布的参数(均值和方差)来代替伯努利参数
θ_jc。 - 模型选择:对于像图像这样的连续数据,实践中更常使用其他分类器,如逻辑回归、神经网络或随机森林。本课程后续将重点介绍这些方法。


与其他技术的关系
主成分分析(PCA)是一种无监督降维技术,它本身不是分类器。但实践中,我们经常先用PCA对图像等高维数据进行降维以去除噪声,然后在低维空间(例如5维或10维)中使用分类器(如朴素贝叶斯、逻辑回归等)进行分类。



总结
本节课中我们一起学习了朴素贝叶斯分类器用于文本情感预测的完整过程。

- 模型基础:我们基于特征条件独立性假设,建立了用于文本分类的朴素贝叶斯模型。
- 最大似然估计:我们推导了模型参数(
π_c和θ_jc)的最大似然估计,其结果直观(N_jc/N_c和N_c/N),但存在零概率问题。 - 贝叶斯估计:我们引入了Beta和狄利克雷共轭先验,推导了参数的后验分布和其后验均值估计。这种方法通过平滑有效避免了零概率问题,使模型更健壮。
- 特性与应用:我们讨论了该模型并行化、在线学习的优点,及其在文本分类等领域的广泛应用。同时也简要提到了如何将其扩展到连续特征(高斯朴素贝叶斯)。


你现在已经拥有一个可以处理多类文本分类的实用工具。通过完成相关的编程作业,你将能够亲手实现这个算法,并观察贝叶斯平滑带来的实际效果提升。
26:优化 🧠

在本节课中,我们将学习优化的基本概念和方法。优化是机器学习中求解模型参数的核心技术,特别是在无法获得解析解时。我们将从梯度和海森矩阵的定义开始,然后介绍三种重要的优化算法:梯度下降法、牛顿法和随机梯度下降法。理解这些内容是为后续学习神经网络和逻辑回归奠定基础。

梯度和海森矩阵 📈
上一节我们提到了优化在机器学习中的重要性。本节中,我们来看看优化的两个核心数学概念:梯度和海森矩阵。
当我们采用频率学派的机器学习方法时,通常会进行最大似然估计。我们定义一个目标函数(如对数似然),对其求导并令导数为零,从而得到参数的估计值。然而,对于大多数问题,我们无法通过简单的求导和求解方程来获得参数的解析解(即闭式解)。这时,我们就需要依赖优化算法来寻找使目标函数(如误差函数)最小化或概率最大化的参数值。这两个问题本质上是等价的。
为了找到导数变为零(即函数平坦)的点,我们需要“跟随导数”的方向。这就像如果你在格劳斯山顶,想要下到平坦的山谷,你会选择最陡峭的路径下降,直到无论朝哪个方向都无法继续下降为止。此时,你就找到了一个最小值点。这就是基于优化的学习算法的基本思想。

梯度
梯度是一个向量,其分量是目标函数关于每个参数的偏导数。对于一个包含多个参数的函数,梯度指向函数值增长最快的方向。
公式:
对于一个函数 ( f(\theta) ),其中 ( \theta ) 是一个参数向量 ( [\theta_0, \theta_1, ..., \theta_{d-1}]^T ),其梯度 ( \nabla f(\theta) ) 定义为:
[
\nabla f(\theta) = \left[ \frac{\partial f}{\partial \theta_0}, \frac{\partial f}{\partial \theta_1}, ..., \frac{\partial f}{\partial \theta_{d-1}} \right]^T
]

在线性回归的例子中,我们的目标函数(负的误差平方和)是:
[
f(\theta) = -\sum_{i=1}^{n} (y_i - (\theta_0 + \theta_1 x_i))^2
]
其梯度(经过求导计算)为:
[
\nabla f(\theta) = \begin{bmatrix}
\sum_{i=1}^{n} 2(y_i - \theta_0 - \theta_1 x_i) \
\sum_{i=1}^{n} 2(y_i - \theta_0 - \theta_1 x_i) x_i
\end{bmatrix}
]
梯度是一个关于 ( \theta ) 的函数,在不同的 ( \theta ) 值处,梯度向量的方向和大小也不同。在等高线图中,梯度方向总是垂直于等高线。


海森矩阵

海森矩阵是梯度的推广,它包含了目标函数的所有二阶偏导数,描述了函数在某个点的曲率。


公式:
函数 ( f(\theta) ) 的海森矩阵 ( H(f(\theta)) ) 是一个 ( d \times d ) 的矩阵,其第 ( i ) 行第 ( j ) 列的元素为:
[
H_{ij} = \frac{\partial^2 f}{\partial \theta_i \partial \theta_j}
]
对于线性回归问题,其海森矩阵是一个常数矩阵:
[
H = 2X^TX
]
其中 ( X ) 是设计矩阵。


梯度下降法(最速下降法) ⬇️


理解了梯度的概念后,我们来看第一个优化算法:梯度下降法,也称为最速下降法。其核心思想是:在当前位置,沿着梯度相反的方向(因为梯度指向函数增长最快的方向,而我们要最小化函数)前进一小步,逐步逼近函数的最小值。
算法描述:
参数更新公式为:
[
\theta^{(k+1)} = \theta^{(k)} - \eta \cdot \nabla f(\theta^{(k)})
]
其中:
- ( \theta^{(k)} ) 是第 ( k ) 次迭代的参数值。
- ( \eta ) 是学习率(步长),是一个需要手动设定的正标量。
- ( \nabla f(\theta^{(k)}) ) 是目标函数在 ( \theta^{(k)} ) 处的梯度。

对于线性回归,梯度为 ( \nabla f(\theta) = 2X^TX\theta - 2X^Ty ),因此更新公式为:
[
\theta^{(k+1)} = \theta^{(k)} - \eta \cdot (2XTX\theta - 2X^Ty)
]
常数因子 ( 2 ) 可以被吸收到学习率 ( \eta ) 中。
学习率的选择
学习率 ( \eta ) 的选择至关重要:
- 如果 ( \eta ) 太小:算法收敛速度极慢,在平坦区域可能几乎停滞不前,需要大量迭代才能接近最小值。
- 如果 ( \eta ) 太大:参数更新可能会在最小值附近震荡,甚至发散,无法收敛。
在实践中,有自适应调整学习率的方法(如线搜索),但本课程中我们通常将其视为一个需要手动调整的超参数。一种常见的策略是使用随时间衰减的学习率,例如 ( \eta_k = 1/k ),这样在初期更新幅度大,后期更新幅度小。

牛顿法 🍎
梯度下降法需要谨慎选择学习率。牛顿法则通过利用目标函数的二阶信息(曲率)来自动确定每一步的“最佳”步长和方向,通常收敛速度更快。
牛顿法的思想是:在当前点 ( \theta^{(k)} ) 处,用目标函数的二阶泰勒展开式(一个二次函数)来局部近似原函数。然后,直接求解这个二次函数的最小值点,并将其作为下一次迭代的参数值 ( \theta^{(k+1)} )。
算法描述:
参数更新公式为:
[
\theta^{(k+1)} = \theta^{(k)} - H{-1}(f(\theta)) \cdot \nabla f(\theta^{(k)})
]
其中:
- ( H(f(\theta^{(k)})) ) 是目标函数在 ( \theta^{(k)} ) 处的海森矩阵。
- ( H^{-1} ) 是海森矩阵的逆。
对于线性回归,海森矩阵 ( H = 2X^TX ) 是常数矩阵。可以证明,牛顿法在线性回归问题上只需一次迭代就能达到最优解(即最小二乘解),因为其局部二次近似本身就是精确的全局模型。
优缺点
- 优点:收敛速度快,无需手动选择学习率。
- 缺点:需要计算并存储海森矩阵及其逆矩阵。当参数数量 ( d ) 很大时,海森矩阵的大小是 ( d \times d ),计算和存储开销巨大,甚至不可行。
因此,牛顿法适用于参数规模不大的问题,而梯度下降法则更适用于大规模问题。

随机梯度下降法 🔄
在实际的机器学习应用中,尤其是在线学习或大数据场景下,数据可能无法一次性全部获得,或者数据量太大导致计算完整梯度代价高昂。随机梯度下降法应运而生。



它与标准梯度下降法(有时称为“批量梯度下降”)的关键区别在于:每次迭代时,它只使用一个随机样本(或一小批样本)来计算梯度估计值,并据此更新参数。

算法描述(单样本版本):
[
\theta^{(k+1)} = \theta^{(k)} - \eta \cdot \nabla f_i(\theta^{(k)})
]
其中 ( \nabla f_i(\theta) ) 是仅基于第 ( i ) 个数据点计算的目标函数梯度(或子梯度)。
特点
- 高效:每次迭代计算量小,更新速度快。
- 在线学习:非常适合数据流式到达的场景(如Twitter的推文流),可以实时更新模型。
- 随机性:由于使用估计的梯度,其更新路径是嘈杂的,但平均来看仍会朝向最小值区域前进。这种随机性有时有助于跳出局部极小值。
- 学习率:通常需要更精细地设计学习率衰减策略,以确保最终收敛。




总结 📝
本节课中我们一起学习了机器学习的核心数学工具——优化。

- 我们首先定义了梯度和海森矩阵,它们分别描述了函数的一阶变化(斜率)和二阶变化(曲率)。
- 接着,我们深入探讨了三种基本优化算法:
- 梯度下降法:通过沿负梯度方向迭代更新参数来寻找最小值。简单有效,但需要仔细选择学习率,且收敛速度可能较慢。
- 牛顿法:利用梯度和海森矩阵信息,通过局部二次近似更快地收敛。但它需要计算和存储二阶导数矩阵,对于高维参数空间计算代价高。
- 随机梯度下降法:每次迭代仅使用一个或一小批样本估计梯度,大大降低了计算成本,特别适用于大规模数据集和在线学习场景。


这些优化方法是训练复杂模型(如我们即将学习的神经网络)的基础。在线性回归模型上,它们都能(以不同效率)找到最小二乘解。在后续课程中,我们将把这些技术应用于逻辑回归(单神经元神经网络)以及更复杂的多层神经网络中。
27:逻辑回归 🧠
在本节课中,我们将学习逻辑回归模型,这是一种用于分类问题的强大工具。我们将从梯度下降和牛顿法的概念出发,理解如何通过优化算法来训练模型,最终将这些概念应用到逻辑回归中。
梯度与最速下降法


上一节我们介绍了梯度下降的基本思想。本节中我们来看看梯度的几何意义。
梯度垂直于等高线。等高线是函数值相等的点集。如果某个方向垂直于等高线,那么该方向就是函数值下降最快的方向。因此,沿着梯度方向移动的算法被称为最速下降法。
梯度是导数的向量。我们处理的大多数函数都有多个自由参数,因此我们需要计算关于每个参数的导数,最终得到一个包含所有导数的向量。
以下是使用向量和矩阵抽象表示的好处:
- 避免处理大量繁琐的求和与循环。
- 使代码和数学表达更简洁、清晰。
因此,基本思想是:在最大似然估计的框架下,学习过程就是沿着误差函数下降到最小值的过程。
梯度下降算法
现在,我们来看看梯度下降算法的具体形式。
梯度指向上升最快的方向。因此,为了下降,我们需要沿着梯度的反方向移动。这就是公式中出现负号的原因。
通用算法如下:假设我们当前在参数位置 θ_k。为了到达下一个位置 θ_{k+1},我们沿着当前梯度 g_k 的反方向移动一个步长 η。
公式表示为:
θ_{k+1} = θ_k - η * g_k
如果误差函数是二次的,并且步长选择得当,我们最终会到达最小值。
步长 η 的选择至关重要:
- 如果步长太小,下降过程会非常缓慢,甚至可能因数值下溢而无法收敛。
- 如果步长太大,参数更新会剧烈震荡,同样无法收敛。
在实践中,通常需要尝试不同的步长值,或使用线搜索等更高级的方法来自动确定。

牛顿法
为了解决步长选择的问题,我们引入牛顿法。
梯度下降使用标量步长 η。牛顿法则用一个矩阵 H^{-1}(海森矩阵的逆)来替代 η。这个矩阵告诉我们在每个参数方向上应该移动多快。
牛顿法的更新公式为:
θ_{k+1} = θ_k - H^{-1} * g_k

其原理可以理解为:在当前点 θ_k 处,用二次函数(泰勒展开)来近似原误差函数 F(θ)。然后,直接找到这个二次函数的最小值点,作为下一次迭代的参数 θ_{k+1}。
牛顿法的优势:
- 收敛速度通常远快于梯度下降。
- 无需手动选择步长。
牛顿法的代价:
- 需要计算和存储海森矩阵(二阶导数矩阵)。
- 需要求海森矩阵的逆,对于大规模问题(参数
N很大时),计算成本O(N^3)会非常高。

对于一个二次误差函数(如线性回归),牛顿法只需一步迭代就能到达最优解。




随机梯度下降与在线学习



在处理大规模或流式数据时,标准的批量梯度下降可能效率低下。这时可以使用随机梯度下降。


批量梯度下降在每次更新时使用全部 N 个数据点计算梯度:
g = Σ_{i=1}^{N} [ ... ]





随机(在线)梯度下降则在看到每个数据点后立即更新:
θ_{k+1} = θ_k + η * x_k^T (y_k - x_k θ_k)
这种方法适用于:
- 流式数据:如实时推特流、环境监测数据,数据持续到达,无法全部存储。
- 大规模数据集:即使数据可加载到内存,逐数据点或小批量处理也能在计算和存储之间取得更好平衡。
此外,还有小批量梯度下降,它折中了以上两种方法,每次使用一小批(例如20个)数据计算梯度并更新参数。这是训练神经网络等复杂模型时最常用的方法。
在线学习的更新路径不是直接指向最小值,而是带有噪声的曲折路径。这有时反而是有益的,有助于跳出较差的局部最优解。
逻辑回归模型
现在,我们将优化方法应用到一个新的模型——逻辑回归。逻辑回归可以看作是一个单层神经网络(一个神经元)。

我们从一个线性模型开始:z = x_i^T θ。与线性回归不同,我们不是直接输出 z,而是将其输入一个激活函数。这里我们使用 Sigmoid 函数,其形状像字母“S”。





Sigmoid 函数公式为:
σ(z) = 1 / (1 + exp(-z))




它将任意实数 z 映射到 (0, 1) 区间。因此,我们可以将输出解释为概率:
P(y=1 | x, θ) = σ(x^T θ)
这个概率表示在给定输入特征 x 和参数 θ 时,样本属于类别 1 的可能性。
Sigmoid 函数的特性:
- 当输入
z = 0时,输出为0.5。 - 当
z很大时,输出趋近于1。 - 当
z很小时,输出趋近于0。

在二维特征空间中,概率为 0.5 的等高线对应着决策边界 x^T θ = 0,这是一条直线。逻辑回归就是通过优化参数 θ,找到这条最佳的分割线,从而完成二分类任务(如垃圾邮件分类、疾病诊断等)。



本节课中我们一起学习了逻辑回归的核心思想。我们从梯度下降和牛顿法等优化算法出发,理解了如何通过迭代更新参数来最小化误差函数。接着,我们探讨了适用于不同场景的批量、在线和小批量梯度下降。最后,我们将这些优化技术应用于逻辑回归模型,它通过Sigmoid函数将线性组合转化为概率输出,从而解决二分类问题。逻辑回归是理解更复杂神经网络模型的重要基础。
28:神经网络 🧠
在本节课中,我们将学习如何从简单的逻辑回归模型过渡到更复杂的神经网络模型。我们将探讨如何为二元数据建模,理解逻辑回归的核心原理,并了解如何通过组合多个“神经元”来构建能够学习非线性决策边界的神经网络。
概述
我们将从给定的数据开始。在这个例子中,假设我们被给予了一些 X 和 Y 的数据点。例如,我知道一些数据点:(3, 2.1),(2, 6.0),(6, 8.1),(-2, 3.1)。与 Y 值是实数的线性回归不同,这里的 Y 值是二元的(0 或 1)。它们可能表示左侧的数字,输入 X 可能是一个人的身高减去某个值,而 Y 则表示这个人是否能通过测试。所以,X 是给定的,没有不确定性。Y 是我们将拥有分布的变量,Y 是这里具有随机性的变量。Y_hat 表示对 Y 的预测,这个“帽子”符号很重要。
为二元数据建模
如果我们拥有的数据中 Y 是 0 或 1,这本质上与抛硬币看是正面还是反面的数据相同。因此,为 0/1 数据建模的正确分布是伯努利分布。
但现在,硬币的成功概率取决于 X。这正是有趣的地方。
如果我想为我的 Y 建模,我假设所有抛硬币的结果都是独立的,所以我取从 1 到 n 的乘积。每个 y_i 只是一个成功概率为 π_i 的伯努利分布。
到目前为止,我们还没有做任何新的事情,这只是抛硬币。但现在我们说,π_i 本身是 X 的函数。
本质上,我们正在做的是线性回归。我们从 X 开始,拟合直线 X * θ,这本质上是一个方程,即一个平面的方程。然后我们通过一个 sigmoid 函数将其“压缩”。
我们通过 sigmoid 函数压缩它的原因是,我们知道这个函数的值在 0 和 1 之间。所以我们得到一个概率。这是一个技巧,允许我们将输出解释为介于 0 和 1 之间的概率。然后 1 - π 也是一个介于 0 和 1 之间的数。
这里有两件事:一是在 Y 上定义概率,分布是关于 Y 的;二是组合性,其中 Y_i 的成功概率 π_i 是输入 X 的函数。这就是我们开始为更复杂的场景引入概率模型的方式。
逻辑回归模型

随着我们进入神经网络,我将在这里重复相同的处理方法,但针对不同的情况:当你有二元数据时,当 Y 是高斯分布时,以及当 Y 有多个类别时。这些情况我们在线性模型中见过高斯情况,在朴素贝叶斯的处理中也见过多类别情况。但现在,我们将为这种形式的模型处理所有这些不同的“噪声”分布,在这种模型中,你有输入和输出,为了从输入到输出,存在某种组合性。
所以,π_i 是成功概率,因此 π_i 确实是在给定参数 θ 和观察到 X_i 的条件下,y 等于 1 的概率。这样做的好处是,θ 是一个在负无穷到正无穷之间的连续变量,它完全不受约束,但 π_i 自然会约束在 0 和 1 之间。因此,我们不需要引入复杂的约束来要求 π_i 和为 1 等等。我们只需使用这种参数化方法,就能确保得到概率。
参数估计与梯度

一旦我们有了似然函数,如何找到 θ 呢?寻找 θ 的过程是什么?通常是最大似然估计。你会取对数,求导并令其等于零。在这种情况下只有一个困难:当你求导并令其等于零时,你将无法为 θ 求解出一个封闭形式的解。
在我告诉你我们实际得到的梯度之前,另一件事是记住上一节课的内容:函数 1 / (1 + e^{-X_iθ}) 是一个 sigmoid 函数。sigmoid 函数具有在 0 和 1 之间的重要性质,因此你可以将其解释为概率分布。它在导数方面也有很好的性质。
在 1D 情况下,sigmoid 函数是一条 S 形曲线。在 2D 情况下,sigmoid 函数看起来像我在右侧显示的曲面。
然后,我们要做的是设定阈值。我们在某个值(比如 0.5,当高度为一半时)对这个函数进行阈值处理。然后,大于 0.5 的一侧被认为是类别 1,另一侧被认为是类别 0。这样,我们实际上就有了一个分类器。每当你有一个新的 X,你计算在该 X 下 y 等于 1 的概率。如果大于 0.5,你将其分配到一个类别;如果小于 0.5,你将其分配到另一个类别。
所以,一旦我们估计出这条曲线,我们只需在 0.5 处设定阈值,这等同于在零处对平面进行阈值处理,这为我们提供了一种分离 y=1 和 y=0 数据的方法。但我们做的不仅仅是说它是 1 还是 0,我们实际上估计了它是 1 的概率,所以我们实际上做得更多一些。
当我们对此求导并令其等于零时,我们得到了梯度和海森矩阵的以下表达式。我不会在课堂上做这些,我会要求你在下次作业中做这些,因为我认为在这个阶段,更有价值的是让你练习如何做到这一点。
我们发现梯度由方框中的这个表达式给出。这有一定道理,因为它基本上是在比较 y 和预测值 π。y 在 0 和 1 之间,π 是介于 0 和 1 之间的预测变量。所以,我们正在做的是将预测与实际数据进行比较。如果你的预测与实际数据不同,你的梯度更新就大,因为如果你的预测不匹配数据,你就应该学习,并且以大步长学习。而如果你的预测与数据一致,那么你的更新就小。
我们可以实现梯度下降,但也可以去计算海森矩阵。对于逻辑回归,很容易得到海森矩阵。你也会把这个作为一个练习。一旦你有了海森矩阵(它查看二阶导数的曲率,并且正如你所看到的,也与预测的方差有关),你就能够实现牛顿法。
本质上,牛顿法需要海森矩阵 H 和梯度 G。一旦你有了这些,就很容易应用牛顿法。这就是我们通常解决逻辑回归问题的方式:尝试牛顿法。
可以证明(这是我在线性代数复习中没有做的,所以如果你学过足够的线性代数,可以把它当作一个高级话题),海森矩阵是正定的,在多变量情况下可以解释为具有正曲率。拥有所有正特征值的正定海森矩阵意味着你有一个凸函数,并且有一个唯一的最小值,我们可以找到它。如果我们使用牛顿法,我们可以在这个问题中达到最优解。因此,逻辑回归仍然被认为是一个相当容易解决的问题。
牛顿法与实现
在具体实现牛顿法的情况下,我在这里展示给你看。这是上一张幻灯片中海森矩阵和梯度的表达式。如果你将这些代入 θ 的估计中,并进行一些简化以获得计算效率更高的东西,你会得到一个实际上有名字的算法。人们也称之为迭代重加权最小二乘法,因为该表达式看起来像一个最小二乘表达式,只是它有一个由矩阵 S 给出的权重。但它本质上是牛顿法。
我已经在课程网站上为你上传了幻灯片,并包含了实际的代码,告诉你如何获取逻辑函数以及如何运行 IRLS。正如你所看到的,实现这个实际上相当容易。这就是用于逻辑回归的牛顿法。
然后主函数只是加载数据、进行估计,然后你只需要调用牛顿法来给你一个新的 θ,然后你评估训练错误率和测试错误率。所以,实现逻辑回归变得相当容易。



从逻辑回归到神经网络
既然我们了解了逻辑回归,现在让我们转向一个更有趣的问题。逻辑回归是这门课程竞赛的一个比较基准。问题是,这与朴素贝叶斯相比如何?有一个竞赛,这是一个测试它的好地方。
我们只是用它来将数据分成两类吗?我们可以使用任意数量的阈值。所以,我向你描述了二元逻辑回归,但确实你可以进行多元逻辑回归,即处理多于两个类别,就像朴素贝叶斯一样,我将在几分钟内在神经网络的背景下解释它。但是的,这是一个问题。
你可以选择其他函数。相同的权重函数以不同的原因出现。一是从神经网络的角度来看,这是历史原因。有一个想法是有一个激活函数,当神经元不活跃时输出一个值,超过某个阈值后神经元在 1 处变得活跃。当他们尝试对这些模型进行编码时(这是 Jeff Hinton 有一次在晚餐时告诉我的),他们无法对阶跃函数求导,所以他们所做的就是拟合一条曲线,即 sigmoid 函数。
但如果你做机器学习的理论,我未涵盖线性判别分析,这是因为指数族吗?确实,我们正在研究的所有这些分布都是指数族的一部分。但我的意思是,这只是一个概括性的陈述。更直接的回答是,如果你有两个点分布根据两个多元高斯分布,并且你试图区分两者,那么你会发现最优边界是由逻辑函数给出的。所以这是一个我经常在 340 课程中做的版本,但今年我没有做。这是一个统计原因,它最优地区分了两个高斯分布。
对于竞赛,我们只是给你参数然后你加载它们吗?你是得到预测结果,还是也看它花了多长时间?对于竞赛,我们有多宽容?只要它运行时间不超过规定的最短时间(今年我认为我们设定为半小时),任何运行时间超过这个的都是无效的,因为我们不想要疯狂的算法。或者任何导致计算机崩溃的算法也无效。逻辑回归适用于那个数据集。
另一件我没有提到的事情是,我将在神经网络的背景下提到这一点,因为神经网络本质上是逻辑回归的推广。就像我们为线性回归添加正则化一样,所有这些论点在这里仍然适用。我们可以在 θ 上放置正则化项。我们可以放置 L2 正则化和 L1 正则化。带有 L1 正则化的逻辑回归是那里最广泛使用的二元分类技术之一。所以,它被用在像 Kaggle 这样的竞赛中。
对于二元数据,L1 范数和 L2 范数等价吗?比如,1 的值是 1,1 的平方也是 1?让我回头看看,我有一张关于正则化的幻灯片,但正则化是在参数上,而不是在 y 上。我不确定我是否理解了你的问题。
神经网络:你的第一个神经网络
神经网络,这是你的第一个神经网络。它就是逻辑回归,它是一个神经元。你有一个输入 X_i。它被 θ_2 加权。你加上 θ_1,这就给了你 u。换句话说,你的 u 将等于 θ_1 + X * θ_2。

然后我们通过一个 sigmoid 函数。我们得到 Y_i = 1 / (1 + e^{-u_i}),也就是 1 / (1 + e^{-(θ_1 + X_i * θ_2)})。
这里的数据和之前一样。所以我们有 X,然后我们有 y,比如 0.6,我不知道,也许是 1。重要的是,y 是二元的。我只用一个 X,但显然如果我有多于一个 X,这也可以工作。如果我有更多 X,我只需要另一个 X 点。所以我会有 X_i1,我还可以有 X_i2,然后我会在这里有另一个参数。我没有使用这个,但很明显我可以有很多输入。所以我可以有更多的 X 列。
这是给定输入 X_i 和当前参数设置 θ 的条件下,y 等于 1 的概率。所以,给定 X_i 和 θ,Y_i 等于 1 的概率就只是一个成功概率为 Y_i_hat 的伯努利分布。正如我们所知,这只是在说,当 Y_i 等于 1 时,概率将是 Y_i_hat;当 Y_i 等于 0 时,概率将是 1 - Y_i_hat。这只是总结这两个事实的快速方法。
现在,如果我们有 N 个独立的伯努利观测值,那么给定 X_1...n 和 θ 的向量 Y 的概率,就等于从 i=1 到 n 的乘积 P(y_i | x_i, θ)。一个变量根据伯努利分布分布。所以它是一枚硬币。然后如果你有 n 枚硬币,你只需将概率相乘。所以这是一个单一的神经元。
更复杂的递归架构
随着我们转向更现代的神经元,我们开始得到一个更有趣的、更复杂的递归架构。
我们将有一个 X_i。我们将有中间输入:u_11 = θ_1 + θ_2 * X_i。然后我们会有 u_12 = θ_4 + θ_3 * X_i。然后我们也将通过 sigmoid 函数压缩它们。所以现在把这想象成 3 个神经元。我们有两个神经元。所以,你有一个信号 X,它分裂成两个神经元,然后在输出端再次汇聚到一个神经元。
所以第一个神经元的输出就是 1 / (1 + e^{-u_11}),这在左边的表达式中给出。
然后对于下一个神经元,我们有 u_21 = θ_5 + θ_6 * o_11 + θ_7 * o_12。最后,我们压缩它以获得预测。所以,为了得到预测,我们对输入应用了一系列操作。
因此,给定 X_i 和 θ 的 Y_i 的概率仍然用伯努利分布建模,在这方面没有任何变化,因为我们处理的是二元数据。唯一改变的是,成功概率 Y_i_hat 现在由一个复杂得多的函数给出。
现在的问题是,我为什么要费心让函数变得更复杂?正是如此。因为最初,我的边界是线性的。但现在通过使用多个 sigmoid 函数,我实际上可以拥有一个非线性函数。
总结

在本节课中,我们一起学习了逻辑回归作为二元分类的基础模型。我们理解了如何用伯努利分布对二元输出建模,并通过 sigmoid 函数将线性组合映射为概率。我们探讨了使用最大似然估计和牛顿法来求解模型参数。最后,我们看到了如何通过堆叠多个这样的“神经元”来构建一个简单的神经网络,从而引入非线性决策边界,为处理更复杂的数据模式奠定了基础。逻辑回归不仅是强大的分类工具,也是理解更复杂神经网络架构的重要基石。
29:神经网络基础与反向传播推导 🧠

在本节课中,我们将学习神经网络的基本原理,包括其与逻辑回归的关系、不同任务下的模型构建(回归、二分类、多分类),以及核心的训练算法——反向传播的推导过程。我们将从简单的模型开始,逐步深入到更复杂的结构。
逻辑回归回顾

上一节我们介绍了逻辑回归作为二分类的基础模型。本节中,我们来看看它如何被视为一个最简单的神经网络。

假设我们有两个输入特征 x1 和 x2,数据形式如下(i 为数据索引):
- 输入:
x_i = [x_i1, x_i2] - 标签:
y_i ∈ {0, 1}
我们的目标是找到一个决策边界来分离两类数据(例如正面与负面推文)。对于逻辑回归,这个边界是一条直线(在二维空间)或一个超平面(在高维空间)。

逻辑回归模型可以看作一个单一的“神经元”。该神经元的输出是:
ŷ_i = σ(θ_0 + θ_1 * x_i1 + θ_2 * x_i2)
其中 σ(z) = 1 / (1 + e^{-z}) 是Sigmoid函数,将输出压缩到0和1之间,可以解释为概率。

我们将标签 y_i 建模为以 ŷ_i 为成功概率的伯努利分布:
P(y_i | x_i, θ) = ŷ_i^{y_i} * (1 - ŷ_i)^{(1 - y_i)}
对于N个独立观测,似然函数是各数据点概率的乘积。最大化这个似然函数等价于最小化一个称为交叉熵的代价函数。
从线性到非线性:引入隐藏层
然而,数据可能不是线性可分的。为了处理更复杂的情况,我们需要非线性函数。这就是神经网络的核心思想:在输入和输出之间加入一个或多个隐藏层。
一个带有隐藏层的神经网络可以进行非线性变换。例如,一个具有3-4个隐藏神经元的网络可能产生蓝色决策边界,而具有20个隐藏神经元的网络可能产生更复杂(如紫色)的边界。这里存在一个权衡:
- 更多神经元:可以更好地拟合训练数据,甚至达到零训练误差。
- 风险:可能导致过拟合,在测试集上表现不佳。

控制复杂度的方法包括:
- 使用交叉验证选择神经元数量。
- 对权重参数
θ添加L2正则化项,使部分权重趋近于零,从而平滑决策边界。
概率模型的核心没有变:我们仍然对输出 y 建模(伯努利分布),只是现在 ŷ_i 是通过Sigmoid函数复合而成的更复杂的非线性函数。
代价函数与最大似然的等价性
我们之前提到,最小化代价函数与最大化似然是等价的。这对于理解不同任务的损失函数至关重要。

- 对于高斯分布(如线性回归),负对数似然得到的就是平方误差和。
- 对于伯努利分布(如二分类逻辑回归),负对数似然得到的就是交叉熵。
最小化交叉熵就是最小化不确定性,这与最大化似然的目标一致。因此,在二分类神经网络中,我们使用交叉熵作为代价函数。

神经网络用于回归任务
现在,我们来看看如何将神经网络用于回归问题。关键的区别在于输出层神经元的选择。
对于回归任务(预测连续值,如房价):
- 我们使用恒等函数作为输出层神经元的激活函数,即
ŷ = u(直接输出加权和)。 - 这样,
ŷ可以取任意实数值,符合回归任务的要求。 - 如果错误地使用了Sigmoid函数,输出将被限制在0到1之间,无法拟合范围更大的真实
y值。
模型假设每个观测 y_i 服从以神经网络输出 ŷ_i 为均值的高斯分布。因此,最大化似然等价于最小化预测值 ŷ_i 与真实值 y_i 之间的平方误差和。神经网络在这里的作用是将线性回归中的“直线”替换为由多个非线性基函数(Sigmoid)组合而成的“曲线”。
神经网络用于多分类任务


在许多实际应用中,我们需要将数据分为多个类别(例如,将新闻文章分为体育、财经、科技等)。这需要扩展我们的模型。

我们使用 “独热编码” 来表示类别标签。例如,对于三类问题(红、绿、蓝):
- 类别1(红)编码为
[1, 0, 0] - 类别2(绿)编码为
[0, 1, 0] - 类别3(蓝)编码为
[0, 0, 1]
网络输出层现在有K个神经元(K为类别数)。为了获得每个类别的概率,我们使用 Softmax函数。对于第 j 个输出:
P(y = class_j | x, θ) = e^{y_j} / (Σ_{k=1}^{K} e^{y_k})
这里,y_j 是第 j 个输出神经元的原始输出(通常使用恒等激活函数)。Softmax确保所有输出为正且和为1,形成一个有效的概率分布。
多分类的似然函数是范畴分布(伯努利分布的多类别推广)。其负对数似然同样是交叉熵的一种形式,但需要对所有类别求和。







参数优化与反向传播推导
定义了模型和代价函数后,我们需要找到最优参数 θ。由于神经网络是非线性模型,无法直接求解解析解,必须使用迭代优化方法,如梯度下降。
梯度下降的核心是计算代价函数 J(θ) 关于每个参数 θ_j 的梯度 ∂J/∂θ_j。对于神经网络,计算这些梯度需要用到链式法则,这一过程有一个专门的名字——反向传播。
我们以一个简单的回归网络(1个隐藏层,2个隐藏神经元)为例,使用在线学习(每次一个样本)和平方误差代价:
J_i(θ) = (y_i - ŷ_i)^2
以下是计算梯度的步骤:
-
前向传播:首先,将输入
x_i通过网络前向计算,得到所有中间值(u和o)以及最终输出ŷ_i。u_{11} = θ_0 + θ_1 * x_i,o_{11} = σ(u_{11})u_{12} = θ_2 + θ_3 * x_i,o_{12} = σ(u_{12})ŷ_i = θ_4 + θ_5 * o_{11} + θ_6 * o_{12}
-
计算输出层梯度:对于直接连接到输出
ŷ的参数(如θ_4, θ_5, θ_6),梯度计算很简单。∂J_i/∂θ_4 = -2 * (y_i - ŷ_i) * 1∂J_i/∂θ_5 = -2 * (y_i - ŷ_i) * o_{11}∂J_i/∂θ_6 = -2 * (y_i - ŷ_i) * o_{12}
-
反向传播至隐藏层:对于隐藏层的参数(如
θ_1),需要沿网络路径反向应用链式法则。- 目标:计算
∂J_i/∂θ_1 - 路径:
J_i依赖于ŷ_i,ŷ_i依赖于o_{11},o_{11}依赖于u_{11},u_{11}依赖于θ_1。 - 应用链式法则:
∂J_i/∂θ_1 = (∂J_i/∂ŷ_i) * (∂ŷ_i/∂o_{11}) * (∂o_{11}/∂u_{11}) * (∂u_{11}/∂θ_1) - 代入具体项:
= [-2 * (y_i - ŷ_i)] * [θ_5] * [o_{11} * (1 - o_{11})] * [x_i] - 关键点:
∂o/∂u = o * (1 - o)是Sigmoid函数的导数。
- 目标:计算
通过系统地为每个参数 θ_j 应用此过程,我们可以计算出所有梯度。计算时存在一个模式:误差信号 (y_i - ŷ_i) 从输出层开始,乘以沿路径回传的权重和激活函数的导数。这就是“反向传播”名称的由来——误差从输出层向输入层反向传播。
在实际编程实现中,这些计算可以被高效地向量化和矩阵化。



对于二分类任务,只需将平方误差代价 (y_i - ŷ_i)^2 替换为交叉熵代价,反向传播公式中的误差信号项会相应改变,但反向传播的机制完全相同。


总结
本节课中我们一起学习了:
- 神经网络基础:逻辑回归是单层神经网络的特殊情况。加入隐藏层后,网络获得了拟合非线性决策边界的能力。
- 不同任务下的建模:
- 回归:输出层使用恒等激活函数,代价函数为平方误差。
- 二分类:输出层使用Sigmoid函数,代价函数为交叉熵。
- 多分类:输出层使用Softmax函数,代价函数为多类交叉熵。
- 反向传播原理:训练神经网络的核心算法。通过链式法则,将最终预测误差从输出层反向传播至网络中的每一个参数,从而计算梯度并用于梯度下降更新。理解前向传播和Sigmoid等激活函数的导数是掌握反向传播的关键。

通过掌握这些基本原理,你便具备了理解和构建常见神经网络模型的基础。在接下来的课程中,我们将探讨更前沿的网络结构与应用。
30:深度学习 🧠

在本节课中,我们将学习神经网络在当今的应用,特别是最前沿的进展。我们将探讨如何利用神经网络进行无监督学习,并深入了解用于物体识别和人脸检测的特定网络结构。课程将涵盖自编码器、池化、局部对比度归一化等核心概念,以及如何通过正则化技术实现不变性物体识别。
在上一讲中,我们研究了简单的神经网络。给定一个由输入 Xi 和输出 Yi 组成的数据集,我们能够拟合一个神经网络(例如绿色曲线)来近似红色数据点。该网络只是两个神经元的线性组合。每个神经元是一个阶跃函数,我们可以通过参数对其进行缩放、平移和翻转。通过这种简单的“砖块”,我们可以构建复杂的回归函数。

一个自然的问题是:我们应该添加多少个神经元?回答这个问题的方法之一是进行交叉验证。
在回归问题中,我们可以将神经网络的输出视为高斯分布的均值。每个红点 y 是真实数据,y_hat 是预测值,两者之间的差异构成了成本函数,即我们需要最小化的平方误差之和。取负值并指数化后,本质上就得到了一个高斯分布,这建立了预测 Y 的概率分布与成本函数之间的自然映射。
我们通过课堂练习展示了如何使用链式法则计算二次误差相对于任何参数(例如 θ2)的导数。一旦有了这些导数,就可以轻松应用在线梯度下降来学习参数 θ。
我们还可以使用不同类型的基函数。此外,与线性回归类似,我们可以在成本函数中加入正则化项以获得更好的预测。
我们的成本函数是所有数据案例的总和:
J(θ) = Σ (y_i - f(x_i; θ))^2
我们可以很容易地添加一个正则化项:
J_reg(θ) = J(θ) + λ * R(θ)

问题在于添加哪种正则化器。例子包括:
- L2范数平方:这会产生岭回归(Ridge)。在神经网络中,这被称为权重衰减。它的导数很简单,就是
2θ。 - L1范数:即参数绝对值之和。这很有用,因为它会迫使某些参数精确变为零。如果我们有多个输入,这可以有效地决定哪些输入是相关的。
我们甚至可以做得更智能。我们可以引入只关注神经元子集的正则化器。例如,我们可以使用 L1/L2 正则化器(也称为组Lasso)。其思想是将与单个神经元相关的所有权参数分组,计算该组的L2范数,然后对所有组的L2范数求和(即L1范数)。这样,我们试图一次性关闭整个神经元,而不是单个连接。
这种平方和项在我们解释Google网络时很快就会再次出现。
我们学习了如何用神经网络进行监督学习。但如何用神经网络进行无监督学习呢?在本课程中,我们见过无监督学习的方法,例如SVD(主成分分析,PCA)。PCA的目标函数本质上是:给定一个图像矩阵 X,找到两个矩阵 B 和 C 来近似 X。对于PCA,我们发现最优解是SVD分解,其中 B = UΣ,C = V^T。

如果我们在PCA的目标函数中添加一个惩罚 V 向量大小的额外项,就会得到稀疏编码。PCA得到的基向量(特征向量)看起来像全局模式,而稀疏编码得到的基向量看起来像边缘检测器(一边亮、一边暗的图像块)。这是因为稀疏性惩罚促使学习到的特征对图像中的局部对比度(边缘)敏感。
我们希望机器学习系统能学习到类似边缘检测器的特征,这源于Hubel和Wiesel的经典实验。他们发现,猫的初级视觉皮层(V1)中的神经元对特定方向的边缘有选择性反应。因此,能够构建检测边缘的机器学习技术非常有用。
以下是用于以无监督方式训练神经网络的解决方案,称为自编码器。
基本思想是:将图像作为输入,让神经网络预测相同的图像作为输出。换句话说,训练数据就是输入本身。如果你能闭上眼睛预测所见,你就能理解世界。你试图预测观察到的所有图像。

为了使这有意义,我们需要引入一个瓶颈。我们创建一个隐藏层,并希望该隐藏层的神经元数量少于图像的大小。这样,我们就能压缩图像,然后再从压缩表示中解压(重构)图像。如果我们能做到压缩和解压(即编码和解码),并成功重构图像,那么实际上我们就学会了图像中的重要内容。
训练完成后,我们可以忽略用于重构的解码部分权重,只关注神经网络的第一部分。这本质上现在是一个编码器。给定一个高维图像,它将其投影到一个低维空间。可以将其视为非线性的PCA,能够获得图像的低维表示。
自编码器的另一个优势是迁移学习(或自学习)。例如,我可以在非洲用数十亿张图像训练一个这样的神经网络。当我搬到加拿大,需要学习识别新物体(如浣熊)时,我只需使用神经网络输出的激活值(即学习到的特征),然后只需学习几个参数(例如进行逻辑回归)即可。其思想是,我已经以无监督的方式预先学习了所有高级特征(如獠牙、皮毛),在新环境中可以快速应用。

人们通常以两种方式训练这种神经网络进行重构:
- 使用线性单元:输入 -> 隐藏层 -> 输出(重构)。权重矩阵
W和W^T用于编码和解码。我们最小化重构x_hat与原始输入X之间的差异,并添加正则化器。 - 使用Sigmoid神经元:通过一组Sigmoid函数进行编码,然后解码。
为了获得之前展示的边缘检测器那样的滤波器,关键在于添加正则化器。实际上,我们甚至不需要非线性函数,只需使用线性神经元和合适的正则化器(如L1正则化)即可。如果不使用正则化器,只会得到PCA基(全局基),这与我们在V1中观察到的不匹配。
在自编码器中,每个滤波器图像对应于从所有输入像素连接到单个隐藏层神经元的权重向量。我们可以将这些权重可视化为一个图像。为了获得稀疏基,我们需要添加某种形式的L1正则化。
这与带L1范数的PCA非常相似,但我们使用梯度下降来最小化目标函数,而不是使用SVD。主要原因是当数据矩阵非常庞大(例如数十亿图像)时,进行SVD计算成本过高。梯度下降提供了一种在线学习该表示的方法。




到目前为止讨论的一切都是针对单层的。如何处理更多层呢?我们通过贪婪逐层训练来实现,这催生了最近非常流行的深度学习领域。
其思想是:
- 从图像作为输入开始,尝试预测图像本身,以学习第一层隐藏神经元(特征)。
- 然后,将这些第一层特征作为输入,再次尝试预测它们自身,以学习第二层特征。
- 重复此过程。

这样,我们就创建了一个深度架构,神经元嵌套在其他神经元之中。最终,我们可以将这些学习到的特征用于分类(例如,在顶部添加一个分类器)。如果将所有部分组合起来,就得到了一个深度神经网络。


我们这样训练的原因是:如果直接编写完整的神经网络并对其运行反向传播,计算成本非常高。误差项在通过链式法则传播时,由于Sigmoid函数导数的性质,往往会变得非常小(称为梯度消失问题),导致优化极其缓慢。通过这种贪婪逐层训练,可以快速获得一个良好的初始解。最后,仍然可以在整个网络上运行反向传播,对权重进行微调。


现在,我们来谈谈登上新闻的Google网络。它拥有数十亿参数,本质上遵循了这个思想。
网络从200x200像素的彩色图像(RGB通道)开始。首先,他们只允许每组约8个神经元连接到下一层的约18个神经元,以减少图像尺寸。这个第一阶段的权重称为 W。然后,他们引入使用权重 H 的进一步压缩操作,以及称为局部对比度归一化的操作(本质上是标准化)。

这个神经网络的整体训练目标仍然是重构误差(编码-解码)。他们允许 W1 和 W2 不同,但这样做主要是为了能在16,000个核心上高效运行。他们使用的L1正则化器是L2范数之和(即组L1/L2正则化),目的是让整个神经元(而不仅仅是单个连接)的输出趋于零。
接下来,我们详细描述池化和局部对比度归一化操作。



池化的目的是处理大图像并引入一定的不变性。图像非常庞大,如果为每个像素分配一个参数,很快就会面临巨大的计算问题。池化试图通过取一组神经元的平均值或最大值,将一个小区域压缩为单个单元,从而减少数据尺寸。在Google网络中,池化操作是取一个像素窗口内值的平方和,然后开平方根(本质上是该窗口的L2范数)。这样做的效果是,如果图像发生微小扭曲或平移,只要激活发生在同一池化区域内,输出神经元仍将保持活跃,从而获得对微小变形的不变性。

局部对比度归一化是我们已经学过的操作:减去数据的均值并除以标准差。这确保了所有数据具有可比性。在线性回归中,我们对输入进行标准化,以便正则化器对所有特征公平对待。同样,在神经网络中,对比度归一化确保输入在亮度等变化下保持稳定。例如,无论光照条件如何变化,手部神经元都应保持激活状态。

Google决定做以下事情:他们使用刚刚描述的网络,以无监督方式学习一个拥有10亿参数的自编码器模型。他们使用了约1000万张从YouTube截取的200x200大小的图像。网络包含三层,每层都包含子采样(池化)和对比度归一化操作。他们训练网络进行重构,并使用了稀疏正则化器。

一个关键问题是:我们如何知道这个网络学到了有用的东西?
训练完成后(在16,000个核心上训练了数天/周),他们选取输出层中的一个特定神经元,检查它何时倾向于激活。他们向这个神经元展示一系列人脸图像,并观察其激活直方图。结果显示,许多人脸图像比非人脸图像更能激发该神经元。这意味着该神经元在以完全无监督的方式学会了识别人脸。

他们为什么选择人脸?因为人脸识别对婴儿至关重要,是首先需要检测的东西。同时,YouTube上也充满了猫的视频,他们也尝试了猫的类别。这些是倾向于激发该神经元的图像。




本节课中,我们一起深入探讨了深度学习的核心概念与应用。我们从回顾简单的监督学习神经网络开始,引入了正则化技术(如L1、L2及组L1/L2正则化)以改善模型。接着,我们转向无监督学习,重点介绍了自编码器,它通过编码-解码结构学习数据的高效表示,并可用于特征学习和迁移学习。
我们探讨了如何通过贪婪逐层训练构建深度神经网络,以解决梯度消失问题并学习层次化特征。最后,我们剖析了引起轰动的Google大规模神经网络实例,了解了其利用池化实现空间不变性、利用局部对比度归一化实现亮度不变性的机制,并看到了无监督学习如何能自动发现诸如“人脸”或“猫”等高级概念。

通过本讲,你应该对现代深度神经网络的基本构件、训练策略及其在复杂模式识别任务中的强大能力有了系统的认识。
31:决策树 🌳


在本节课中,我们将要学习决策树。决策树是一种直观且强大的分类工具,它通过一系列简单的决策规则来对数据进行分类。我们将从决策树的基本概念开始,了解其结构和工作原理,然后学习如何使用熵和信息增益来构建一棵决策树。最后,我们会看到决策树在实际应用中的例子。
动机与示例 🎯
上一节我们介绍了决策树的基本概念,本节中我们来看看决策树的一些实际应用示例。
决策树及其组合(决策森林)在目标检测等领域有广泛应用。例如,通过收集大量包含人脸和不包含人脸的图像数据集,可以训练一个分类器来检测图像中的人脸。类似地,也可以训练分类器来检测行人、汽车等物体。这种技术是未来自动驾驶汽车的核心。
另一个例子是微软的Kinect传感器。它通过深度图像来预测像素点属于身体的哪个部位(如手臂、腿、躯干),从而实现体感交互。这种技术不仅用于游戏,也可用于机器人理解人类意图,以实现更自然的交互。
决策树的结构 🌲
在了解了决策树的应用后,我们来看看它的具体结构。决策树是一种类似计算机科学中树状的结构。
决策树包含一个根节点、若干内部节点和叶节点。每个节点都对应一个决策。其核心思想是:给定一个数据集(例如包含红色和绿色点),决策树通过学习一系列决策规则,最终将不同类别的数据点尽可能分到不同的叶节点上。对于一个新数据点,我们只需让它从根节点开始,根据决策规则选择路径,最终到达某个叶节点,该叶节点的类别(或类别概率)就是预测结果。
决策树的优点在于其易于解释。与神经网络等“黑箱”模型不同,决策树的决策过程是清晰可见的,我们可以直观地理解模型是如何做出判断的,并能识别出哪些特征对分类最重要。

决策树的可视化与概率输出 📊
上一节我们介绍了决策树的结构,本节中我们通过一个可视化示例来理解其分类过程。
以下是一个用于四分类问题的决策树可视化示例。训练数据用不同颜色的点表示不同类别,同时还有一些测试数据。数据可以是二维向量,也可以是更高维的(如基因数据中的2万个维度)。
决策树在训练时,会记录每个节点有多少数据点流向左右分支(图中用线条粗细表示)。理想情况下,到达叶节点时,该节点内的数据点应主要属于同一类别。但由于数据噪声和决策边界不完美,叶节点内通常是类别的概率分布。例如,一个叶节点可能输出 [0.8, 0.1, 0.05, 0.05],表示该节点属于第一类的概率是80%。这种概率输出是决策树(及后续的随机森林)的一个优点。

一个电子商务应用实例 📈

现在,让我们来看一个更具体的、来自电子商务领域的决策树实例。这个例子有助于我们理解如何将机器学习应用于常见的电子表格数据中。

以下是一棵已训练好的决策树,用于预测客户是否为“优质买家”。决策规则基于客户的购买总额、购买频率、单次最高消费额以及是否联系过客服等特征。例如,规则可能是:“如果总购买额 > 61000,购买频率 > 0.5,单次最高消费 ≤ 59,且未联系过客服,则该客户是优质买家”。这样的规则易于向业务人员解释和部署。
在实际业务中,数据通常以电子表格形式存在。决策树可以自动从这些数据中学习规则,这比人工编写复杂的 IF-THEN-ELSE 语句更高效、更可靠。

构建决策树:选择最佳分裂属性 ⚖️
我们已经看到了决策树的样子,那么如何从数据中自动构建它呢?关键在于每一步如何选择“最佳”的问题(即用哪个属性进行分裂)。

考虑一个餐厅顾客等待的示例数据集,包含12个实例。目标是根据“是否有空位”、“是否周五”、“是否下雨”等属性预测顾客“等待”还是“离开”。我们的目标是找出最能区分这两类顾客的属性作为根节点。
那么,如何衡量一个属性的好坏呢?例如,“店内顾客数量”这个属性可能比“餐厅类型”能更好地区分顾客。我们使用熵和信息增益来衡量。


- 熵:衡量一个集合的“混乱度”。对于一个二分类问题,如果集合中两类样本数量相等,熵最大(最混乱)。如果只包含一类样本,熵为0(最纯净)。
- 公式:
Entropy(S) = -p * log₂(p) - (1-p) * log₂(1-p),其中p是正类样本的比例。
- 公式:
- 信息增益:衡量使用某个属性进行分裂后,熵减少了多少。信息增益越大,说明该属性带来的“纯度提升”越多,越应该优先选择。

以下是选择分裂属性的算法步骤:


- 计算当前节点数据集的熵
Entropy(当前)。 - 对于每个候选属性
A:- 假设用
A分裂,会产生K个子节点。 - 计算每个子节点数据集的熵
Entropy(子节点i)。 - 计算分裂后的期望熵:
Σ ( (|子节点i| / |总数据|) * Entropy(子节点i) )。 - 计算属性
A的信息增益:Gain(A) = Entropy(当前) - 期望熵。
- 假设用
- 选择信息增益最大的属性作为当前节点的分裂属性。

计算示例 🧮

让我们通过餐厅示例中的两个属性来具体计算一下信息增益。
- 当前状态:总数据12条,6条“等待”(正类),6条“离开”(负类)。当前熵为
Entropy(6,6) = 1.0比特。 - 属性1: Patrons (店内顾客):
- 取值
None: 2条数据 (0等待, 2离开)。熵 =Entropy(0,2) = 0。 - 取值
Some: 4条数据 (4等待, 0离开)。熵 =Entropy(4,0) = 0。 - 取值
Full: 6条数据 (2等待, 4离开)。熵 =Entropy(2,4) ≈ 0.918。 - 期望熵 =
(2/12)*0 + (4/12)*0 + (6/12)*0.918 ≈ 0.459。 - 信息增益 =
1.0 - 0.459 = 0.541比特。
- 取值
- 属性2: Type (餐厅类型):
- 经过类似计算(过程略),其信息增益为
0比特。
- 经过类似计算(过程略),其信息增益为

因此,Patrons 属性的信息增益更高,应被选为根节点进行分裂。


总结 📝
本节课中我们一起学习了决策树。

- 我们了解了决策树的基本结构(根节点、内部节点、叶节点)及其直观易懂的优点。
- 我们看到了决策树在目标检测、体感交互和商业分析中的实际应用。
- 我们学习了构建决策树的核心思想:每一步选择能最大程度降低数据混乱度(熵)的属性进行分裂。
- 我们详细介绍了熵和信息增益的概念与计算公式,并通过餐厅顾客等待的示例,一步步演示了如何计算并选择最佳分裂属性。

决策树本身是一个有效的分类器,但它对噪声敏感,且单棵树的能力有限。在下一节课中,我们将学习如何将多棵决策树组合成随机森林,从而构建出当今最强大的分类器之一。
32:随机森林 🌲


在本节课中,我们将学习如何从简单的决策树出发,构建出被称为“随机森林”的强大分类器。随机森林是当前最先进的分类技术之一。我们还将探讨如何构建物体检测器(例如相机中的人脸检测功能)以及Kinect传感器的工作原理。

从决策树到随机森林
上一节我们介绍了决策树的基本概念。决策树虽然简单,但在存在噪声的数据中容易做出错误决策。本节中,我们来看看如何将许多简单的决策树组合起来,形成一个强大且稳定的分类器——随机森林。
我们的设定是:我们拥有数据,并且关注分类问题。在本讲中,我们假设数据是二维空间中的点,每个输入点是一个二维向量。每个节点(例如节点J)会将数据分割成左子集和右子集。在每个节点,我们可以通过计算该节点中每种颜色的数据点数量,来得到给定输入下每个类别的概率。
公式:对于节点J,其数据集合记为 S_J。左子集和右子集分别记为 S_J_left 和 S_J_right。一个点被分到左子集的概率是 P(left) = |S_J_left| / |S_J|。
处理连续数据与构建决策边界

当我们处理二维点数据而非表格数据时,如何进行分类?例如,我们需要将数据点分为四个类别。

假设我们有两个节点。我们没有现成的属性列,但我们可以创建决策边界。最直接的方法是考虑垂直线和水平线。
如果我们有一条居中的垂直线和一条居中的水平线作为选项,我们会发现:
- 水平线:顶部仍有少量红色点,包含一些蓝色和黄色点,没有绿色点。底部主要是绿色、红色和蓝色点。
- 垂直线:似乎效果更好,因为它将所有绿色和蓝色点放在一侧,红色和黄色点放在另一侧。
那么,如何在垂直线和水平线之间做出选择?我们计算信息增益。
以下是计算信息增益的步骤:
- 计算整个数据集的熵
H(S)。 - 对于每种分割方式(例如分割1:水平线,分割2:垂直线),计算分割后两个子集的熵
H(S_left)和H(S_right)。 - 计算子集的期望熵:
P(left) * H(S_left) + P(right) * H(S_right)。 - 信息增益
IG = H(S) - [P(left) * H(S_left) + P(right) * H(S_right)]。
选择信息增益最大的分割方式。在这个例子中,垂直分割的信息增益高于水平分割。

核心概念:信息增益衡量了通过某种分割方式,我们减少了多少关于类别的不确定性。


决策节点的数学表示与训练
显然,我们不仅可以使用一条水平线或垂直线,还可以使用许多条。决定这条线具体位置的参数,我们称之为阈值 θ。
一个决策节点本质上是一个函数。对于垂直线,其决策规则是:如果点的x1坐标大于阈值 θ,则前往右子节点;否则前往左子节点。
代码表示:decision = (x1 > θ) ? go_right : go_left

为了训练一个节点,我们需要找到最佳的 θ。一个典型的策略是:
- 枚举一组候选的
θ值(例如,随机选择5个值)。 - 对于每个候选
θ,计算使用该阈值进行分割所获得的信息增益。 - 选择能最大化信息增益的那个
θ。

在Kinect传感器等应用中,有时会随机选择一组 θ,然后直接从中挑选最好的一个,甚至不计算信息增益,这被称为完全随机化,效果出人意料地好。
训练完成后,在测试时,新的输入点会根据每个节点的决策规则(例如,是否大于 θ)被引导至某个叶子节点。在每个叶子节点,我们根据训练阶段统计的各类别数据点数量,计算出该点属于各个类别的概率直方图。

提升决策能力:更复杂的节点与集成学习
到目前为止,我们看到了水平和垂直分割线。我们也可以使用带角度的线,或者在每个节点使用一个逻辑回归分类器作为决策函数。
公式:一个节点可以是一个简单的线性分类器 f(x) = sign(w^T x + b),根据 f(x) 的正负决定左右分支。

但是,如果只构建一棵树,使用更复杂的节点可能很重要。然而,通过使用一种称为“集成学习”的技术——即构建许多树并对它们的结果进行平均——使用简单的树就足够了。
其核心思想是:
- 假设我们有许多非常简单的分类器(例如,仅基于一条线的左右决策)。
- 假设这些分类器都是无偏的(直观理解:如果有无限数据,它们能做出正确决策),并且比随机猜测略好一点(准确率 > 50%)。
- 假设这些分类器彼此不同(即它们的预测不高度相关)。
- 每个简单分类器可能具有很高的方差(对数据微小变化非常敏感,预测结果波动大)。

根据中心极限定理,如果我们平均许多具有高方差但低偏差的独立估计量,结果的方差会减小,从而得到一个更稳定、更准确的预测。
类比:在回归问题中,高方差、无偏的估计就像许多穿过数据点但形状各异的曲线。单独看每条曲线都不理想,但将它们平均起来,就能得到一条更接近真实趋势的平滑曲线。
构建随机森林:确保多样性
关键问题:如何确保这些树彼此不同(即降低相关性)?Leo Breiman提出了以下策略:
- 对数据行进行随机采样(Bootstrap):每棵树只用训练数据的一个随机子集(有放回抽样)进行训练。这称为“自助采样法”。在现代分布式计算中,可以将数据分块存储在不同机器上,每台机器用自己那部分数据独立构建一棵树。
- 对数据列(特征)进行随机采样:在构建树的每个节点时,不是考虑所有可能的特征(例如所有可能的划分线),而是随机选取一个特征子集(例如,从100万个特征中随机选100个),然后只在这个子集中寻找最佳划分。这进一步增加了树之间的差异性。
以下是构建单棵树的步骤:
- 从原始数据中自助采样得到一个子集。
- 从根节点开始,递归地构建树:
- 在当前节点,从所有特征中随机选取一个子集。
- 对于子集中的每个特征,寻找最佳分割阈值
θ(通常通过最大化信息增益)。 - 在所有候选特征中,选择信息增益最大的那个特征及其阈值
θ进行分割。 - 重复此过程,直到满足停止条件(如达到最大深度,或节点内数据点过少)。


随机森林的预测:组合策略
假设我们构建了T棵树。对于一个新的测试数据点 x,我们如何进行预测?
以下是预测步骤:
- 遍历每棵树:将测试点
x输入每棵决策树。从根节点开始,根据每个节点的决策规则(如x1 > θ),一路向下直到到达一个叶子节点。 - 获取叶子节点预测:每棵树的叶子节点都存储了一个基于训练数据计算的直方图,记录了落到该叶子的训练样本中各个类别的数量。我们可以将其归一化为类别概率分布
P_t(c | x),其中t表示第t棵树。 - 平均所有树的预测:对所有树的预测概率进行平均,得到随机森林的最终预测概率。



公式:随机森林对类别 c 的预测概率为:
P_RF(c | x) = (1/T) * Σ_{t=1}^{T} P_t(c | x)
然后,我们选择平均概率最高的类别作为最终分类结果。

总结:本节课我们一起学习了随机森林的核心思想。我们从简单的决策树出发,探讨了其在高噪声数据下的局限性。通过引入自助采样和特征子集采样,我们能够构建大量多样化的决策树。虽然每棵树可能很简单且不稳定(高方差),但通过平均所有树的预测结果,我们能够有效降低方差,从而得到一个强大、稳定且通常非常准确的集成模型——随机森林。这种方法巧妙地利用了“群体智慧”的原理,是机器学习中集成学习的典范。
33:随机森林、人脸检测与Kinect 🎯🌲👤🎮
在本节课中,我们将学习如何通过组合多个简单的决策树来构建强大的分类器——随机森林。我们将探讨其工作原理、优势,并了解它在人脸检测和微软Kinect等实际应用中的强大表现。
决策树回顾 🌳
上一节我们介绍了决策树。本质上,决策树在训练时选择一个非常简单的分割规则(分类器)。例如,一条垂直或水平的虚线就可以作为一个分割。
在训练数据中,你只需计算分割线两侧每个类别的点数。选择不同分割线的方式是最大化信息增益。在测试时,当一个点到达一个节点,你只需检查该点是在分割线的上方还是下方,然后将其发送到相应的分支。
决策树非常简单,仅使用垂直或水平线来分割数据。当然,单棵决策树可能不够鲁棒,因此我们提到更好的方法是组合多棵树,即对树进行平均。
随机森林:组合的力量 🌲🌲🌲
为了提升性能,我们组合并平均多棵决策树,这就是随机森林。
以下是构建随机森林的关键步骤:
- 数据子集:每棵树在数据的一个子集上进行训练。如果数据集过大无法全部加载到内存,这是一种有效策略。这被称为“袋装法”。如果使用全部数据,则称为“自助法”。
- 特征子集:对于每棵树,我们不考虑所有可能的特征,而只考虑一个特征子集。例如,在文本分类中,一棵树可能只查看10,000个特征中的100个,并从中选择信息增益最高的一个。
- 随机化与多样性:通过随机化数据和特征,我们创建了彼此差异很大的树。每棵树本身可能不是一个优秀的分类器,但当你平均许多棵树时,你会得到一个非常强大的分类器。

在测试时,对于一个新输入,它经过每棵树都会到达一个叶节点。每个叶节点在训练时都关联着一个归一化的类别直方图(概率分布)。我们只需将所有树给出的直方图相加并再次归一化,就得到了最终的分类概率。
例如,如果两棵树非常确信一个点是绿色,而第三棵树不太确定(可能认为是红色或蓝色),但通过平均,绿色仍将占主导地位,从而得到正确的分类。

关于平均方法,除了这里使用的算术平均,还有几何平均(乘积)等其他方式,这引出了“堆叠”等技术。
随机森林的行为与决策边界 📊
那么随机森林的表现如何呢?假设我们有一个二维数据集(例如身高和体重),包含两个类别。
如果只使用一棵树,决策边界可能是一条简单的直线。但如果使用8棵树并平均它们的输出,我们开始得到平滑的概率估计,通过颜色强度显示一个点属于某个类别的概率。使用更多树会得到更精细、更平滑的决策曲面。
即使对于复杂的螺旋状数据或多类别数据,随机森林通常也能表现得相当不错。
树的深度与过拟合 ⚖️
一个重要问题是树应该有多深。我们希望树是平衡的,但深度需要适中。

如果树太小(深度不足),可能会欠拟合,无法捕捉数据中的复杂模式。如果树太大(深度过深),模型会变得过于复杂,并开始过拟合数据,就像神经网络或支持向量机参数过多时一样。因此,存在一个最佳的“甜点”。我们通常通过交叉验证来自动找到这个最佳深度。
袋装法与边界特性 🛡️
之前的实验结果都是基于每棵树查看全部数据,仅随机化特征。现在我们来比较两种情况:顶部的图,每棵树查看全部数据;底部的图,每棵树只查看50%的数据(即也进行数据子采样)。
我们观察到几个重要现象。当只使用数据子集(袋装法)时,决策边界会移动,更倾向于位于两个大类点群的中间。这种边界对远离其同类的孤立点(可能是错误标注的噪声点)不那么敏感,从而提高了模型的鲁棒性。



值得注意的是,随机森林的决策边界天然地倾向于最大化边界点之间的间隔,这被称为“最大间隔”属性。这正是支持向量机的核心思想。边界上的这些点被称为“支持向量”。

应用一:人脸检测 👤
我们如何构建一个检测器来识别人脸、手部或世界上的任何物体?首先,你需要一个巨大的数据集。你无法手动教会机器什么是脸,但你可以展示给它5000张人脸图片和5000张非人脸图片。


以下是构建人脸检测器的步骤:

- 特征设计:使用非常简单的特征。取一个24x24像素的窗口,并使用一些预定义的简单图案(例如,两个白色矩形块和一个黑色矩形块)。特征值就是白色区域像素强度之和减去黑色区域像素强度之和。
- 特征生成:通过在图像的不同位置放置这些图案,你可以生成约18万个可能的特征。
- 弱分类器:每个弱分类器(决策树桩)就是检查某个特征值是否大于一个随机阈值。这构成了一个非常基本的决策节点。
- 构建强分类器:随机生成大量这样的特征和阈值,为每个创建一个弱分类器。然后,像构建随机森林一样,通过信息增益选择最好的那些,并对它们进行平均(组合)。最终的人脸检测器就是由成千上万个这样的简单“小东西”组合而成,共同决定是否为人脸。

同样的原理可以用于检测冰球运动员、构建自动驾驶汽车的物体检测器等,只要你有相应的标注数据。
应用二:微软Kinect 🎮
Kinect前面的传感器提供一个深度图,显示每个点距离传感器的远近。Kinect的目标是对每个像素进行分类,判断它属于身体的哪个部位(例如,手、头、躯干)。
他们面临的主要挑战是缺乏足够的标注数据。手动标注数百万张深度图中每个像素的身体部位是极其繁琐的。
他们的解决方案非常巧妙:
- 合成数据生成:他们使用计算机图形学生成合成数据。通过对一个基础3D人体模型应用各种变换(模拟不同身高、体型、姿势),他们可以生成无限多的、且自动拥有精确像素级标注的深度图。
- 特征设计:使用的特征极其简单。对于一个像素,随机选择两个方向向量,计算沿这两个方向一定距离处的深度值之差,并进行归一化。这个差值对于不同身体部位具有区分性(例如,手腕处的深度变化可能比腹部更大)。
- 训练与部署:使用这些随机生成的特征参数和阈值,构建随机森林分类器。训练过程可能很耗时,但一旦训练完成,分类(推断)过程计算量很小,可以廉价地部署在芯片上,实现实时身体部位追踪。

使用合成数据在此案例中非常聪明,可以廉价地创建大量精准标注的数据。
课程总结与伦理思考 🤔
本节课我们一起学习了随机森林,这是一种通过组合多个简单、随机的决策树来构建强大、鲁棒分类器的方法。我们探讨了其如何通过数据与特征的随机子采样来工作,以及它如何天然地产生平滑的概率估计和具有最大间隔特性的决策边界。我们还看到了随机森林在两个激动人心的实际应用——人脸检测和微软Kinect体感技术——中的核心作用。

最后,随着机器学习能力越来越强,我们必须思考其伦理影响。同样的技术和数据,既可以用来帮助诊断疾病,也可能被用于决定某人能否获得保险。请务必确保你用所学知识做正确的事。

浙公网安备 33010602011771号