图宾根概统机器学习笔记-全-
图宾根概统机器学习笔记(全)
00:课程介绍

概述
在本节课中,我们将介绍图宾根大学《概率和统计机器学习》课程的基本信息、授课形式以及注册要求。由于当前的特殊情况,本学期的课程安排与以往有所不同。
课程与讲师介绍
大家好,我是菲利普·彭奇,本学期将负责教授概率机器学习课程。
我是来自吕斯堡的乌里克,本学期将负责教授统计机器学习课程。
课程形式变更说明
当前的情况有些特殊。几周前,我还期待着在图宾根市中心美丽的古老演讲厅与大家见面,向你们介绍不确定性的奥秘。
但时代已经改变。不确定性对我们所有人而言变得更为重要,并且由于新冠疫情,它已成为我们日常生活中的常规部分。
许多事情将以不同于往常的形式进行。具体来说,讲座将以视频形式进行教学。
我们将录制每一次讲座,并从不同地点进行录制,然后发布到你们正在观看的这个YouTube频道上。辅导课可能通过Zoom等在线方式进行。
每周二,我们可能会进行一次翻转课堂,届时你们可以向我提问。第一次翻转课堂计划在4月21日进行。
可能还会有更多我们需要引入的调整,我们需要共同找出本学期最适合大家的工作和学习模式。
课程注册要求
现在你们最重要的事情是注册这门课程。
要注册,请访问课程网页。如果你不知道网址,可以在谷歌搜索我的名字“Urique from Lusburg”,进入“教学”页面,点击“统计与机器学习”课程,你就能找到。在课程网页上,会有一个链接供你在伊利亚斯系统中注册。
我猜视频下方也会有一个可以点击的链接。请完成注册,最好在4月15日前完成,最晚不超过4月23日。请确保完成注册。
理想情况下,请在4月15日(下周三)前完成注册。这将确保你们能及时收到所有更新信息。
结语与展望
我希望我们能一起享受这个学期。这将是一次全新的体验,但也可能充满乐趣。
这对我们所有人来说都将是一次冒险。我期待着在这段时间与你们一同工作。
当出现一些不可避免的小问题时,我希望你们能多多包涵。问题迟早会出现。
我期待着,希望在未来某个时候,我们能再次面对面相见。

我期待着以某种虚拟方式与大家见面,也许在学期末,谁知道呢,或许也能以亲身方式见面。再见。
01:机器学习与归纳偏置
概述
在本节课中,我们将要学习机器学习的基本概念,并通过一系列实例了解其应用场景。我们将探讨机器学习的定义,并深入理解其核心思想——归纳推理。课程将重点解释为什么机器学习算法需要“归纳偏置”,以及没有它为何无法进行有效学习。最后,我们会通过实例讨论过拟合与欠拟合现象。


机器学习应用实例
以下是几个关键的机器学习应用领域,它们展示了机器学习如何解决现实世界中的复杂问题。
- 手写数字识别:这是机器学习的奠基性问题之一。问题描述为:给定一个16x16的灰度图像(每个像素是0到1之间的值,代表灰度),我们需要学习一个函数
f: R^256 -> {0,1,...,9},该函数能将代表数字的图像向量映射到正确的数字标签上。不同人的手写风格差异使得设计手工规则非常困难。 - 垃圾邮件过滤:这是一个典型的在线学习问题。系统根据用户标记的“垃圾邮件”示例,持续更新一个分类器,以区分正常邮件和垃圾邮件。这与手写数字识别不同,因为垃圾邮件的模式会随时间演变。
- 物体检测:这是自动驾驶等应用中的核心问题。给定一个复杂的场景图像(如道路),系统需要识别出其中的行人、车辆、交通标志等多种物体。这是手写数字识别问题的更复杂、更通用的版本。
- 生物信息学:机器学习被广泛应用于生物领域。例如,在微阵列数据分析中,根据蛋白质活性模式(可视为由0和1组成的矩阵)对癌症细胞类型进行分类;在药物发现中,预测特定小分子是否能与蛋白质的三维结构口袋结合。
- 医学应用(如皮肤癌检测):通过智能手机拍摄皮肤照片,利用自动分类器判断病变是否为皮肤癌。这类系统的准确度已可与训练多年的医学专家相媲美,能有效辅助医生。
- 考古学:通过对古人类基因组数据进行分析,机器学习帮助研究者发现了人类进化树中一个此前未被发现的支系,展示了其发现新知识的能力。
- 语言处理:从2011年IBM Watson在智力问答节目中获胜,到如今的语音助手(如Siri、Alexa)和高质量的机器翻译(如DeepL),自然语言处理取得了显著突破。
- 游戏AI(如AlphaGo):与早期依靠强大计算力和搜索算法战胜人类国际象棋冠军的计算机不同,AlphaGo纯粹使用机器学习(特别是神经网络),通过模仿专家棋谱和自我对弈来学习,最终在2016年击败了世界围棋冠军。
什么是机器学习?
上一节我们介绍了机器学习的多种应用,本节中我们来看看如何定义机器学习。
一个常见的定义是:机器学习是开发能从训练示例中学习特定任务的算法。这包含几个要点:
- 特定任务:当前机器学习旨在解决具体问题(如皮肤癌检测、翻译),而非构建通用人工智能。
- 训练示例:学习需要数据,即任务实例(如图像及对应的“癌症/正常”标签)。
- 泛化:学习意味着计算机不仅能记住训练示例,还能对未见过的实例做出正确预测。这是机器学习的核心目标。
- 提取规则:理想情况下,计算机应从示例中提取出执行任务的通用规则。
另一个更本质的解释是:机器学习试图将归纳推理的过程自动化。
归纳推理与演绎推理
为了理解上述定义,我们需要区分归纳推理和演绎推理。
- 演绎推理:从一般性前提(公理)出发,通过逻辑规则推导出必然正确的结论。例如:
- 前提1:这个房间里的每个人都是学生。
- 前提2:每个学生都大于10岁。
- 结论:这个房间里的每个人都大于10岁。
- 只要前提正确,结论就必然正确。数学体系建立于此。
- 归纳推理:从具体的观察中推导出一般性的命题或假设。例如:
- 观察:一个孩子多次掉落物体,物体每次都落到地上。
- 归纳出的假设:所有掉落的物体都会落向地面。
- 归纳得出的结论无法保证绝对正确,未来可能出现反例。人类和科学探索大量依赖归纳推理。
机器学习正是自动化归纳推理的过程:我们给计算机提供训练数据(具体观察),它需要从中学习并形成一个能解释和预测新数据的假设(一般规则)。
机器学习为何可行?需要何种假设?
通过一个简单的回归例子,我们可以理解机器学习成功所需的条件。假设我们有一些输入(x)和输出(y)的数据点,想要学习预测函数 y = f(x)。
观察四个数据点后,对于新的输入x=0.4,其输出y是多少?可能有两种拟合方式:
- 用一条简单的直线(线性函数)拟合。
- 用一条复杂的、上下波动的曲线拟合。
两种函数都能完美拟合已有数据,但会对x=0.4做出不同的预测。如果没有额外知识或假设,我们无法判断哪个预测更好。
可能的假设包括:
- 简单性假设:倾向于选择更简单的函数(如直线)。这符合奥卡姆剃刀原则。
- 领域知识:如果知道数据来自昼夜温度变化,可能会倾向于选择周期性函数。
核心结论:如果数据本身没有可学习的模式(例如,x和y完全是随机关系),则无法进行预测。要使机器学习可行,通常需要以下隐含假设:
- 输入与输出相关:输出值必须以某种(未知)方式依赖于输入。
- 平滑性假设:相似的输入应产生相似的输出。
- 存在简单规则:输入与输出之间的关系可以用一个相对简单的函数来描述。数据越多,可以学习的函数可以越复杂。
- 偏好简单函数:在能解释数据的所有函数中,我们倾向于选择更简单的那个。
这些假设很少被明确说明,但它们是所有机器学习算法的基础。如果假设错误,学习结果很可能也是错误的。
归纳偏置:学习的关键

上一节我们讨论了机器学习需要假设,本节中我们正式引入“归纳偏置”这个概念,并看看为什么它必不可少。
归纳偏置是指学习算法为引导学习、做出泛化预测而必须具有的偏好或假设。它决定了算法在众多可能解中更倾向于选择哪一类。
考虑一个极端的例子:输入空间X是100个离散点,输出Y是{+1, -1}。函数空间F包含所有可能的函数,共有 2^100 个。
- 场景一:无归纳偏置:算法考虑所有
2^100个函数。即使我们观察到5个无噪声的训练数据,排除了不符合这些数据的函数,剩余的函数空间仍然非常庞大(2^95个)。对于一个新的测试点x‘,会有同样多的函数(2^94个)预测其为+1或-1。在没有偏置的情况下,算法无法做出任何有意义的预测。无论收集多少数据,对于未见过的新点,不确定性始终存在。这直观地说明了“天下没有免费的午餐”定理:没有任何算法能在所有可能的问题上都表现良好。 - 场景二:强归纳偏置:假设我们知道函数只能是常值函数,即
f(x) = +1或f(x) = -1。那么,只需一个无噪声的训练样本,我们就能确定是哪个常值函数,并对所有其他点做出完美预测。
现实中的机器学习介于两者之间。模型选择的核心就是为特定问题找到一个大小适中、合适的函数空间(即归纳偏置)。

过拟合与欠拟合
选择不当的函数空间会导致两个典型问题:
以下是两种常见的问题表现:
- 过拟合:使用的模型过于复杂(如用20阶多项式拟合二次函数数据)。它能够非常好甚至完美地拟合训练数据,包括其中的噪声。但其预测对于新数据通常很差,因为模型学习了噪声而非潜在规律。其特征是近似误差低,但估计误差高。
- 欠拟合:使用的模型过于简单(如用直线拟合二次函数数据)。它无法很好地拟合训练数据,模型过于稳定,对新数据的预测同样很差。其特征是近似误差高,但估计误差低。
归纳偏置的普遍性
归纳偏置并非机器独有。任何成功的学习系统,包括人类和动物,都必须具备归纳偏置。
著名的“加西亚效应”实验说明了这一点:老鼠能快速学会将食物的味道与生病联系起来(这是一种合理的、进化形成的偏置),但却无法学会将灯光或声音等环境线索与生病联系起来(因为自然界中这种关联不常见)。这证明了老鼠的学习机制内置了特定的归纳偏置,限制了它能学习的内容。
总结

本节课中我们一起学习了机器学习的基本概念。我们了解到机器学习旨在通过训练数据自动化归纳推理的过程,以学习特定任务并实现泛化。归纳偏置是任何机器学习算法能够成功的关键,它是对学习结果的偏好或假设,引导算法在无数可能解中进行选择。没有归纳偏置,有效的学习是不可能的。最后,我们探讨了因模型选择不当导致的过拟合与欠拟合问题,并认识到归纳偏置在人类和动物学习中也普遍存在。理解这些基础概念是深入探索具体机器学习算法的第一步。
03:第二部分 - 热身:k近邻分类器
在本节课中,我们将学习第一个机器学习算法——k近邻算法。我们将了解如何设置机器学习实验,如何计算训练误差和测试误差,并深入探讨k近邻分类器的工作原理、参数选择及其优缺点。
实验设置与误差计算
上一节我们介绍了机器学习的基本概念。本节中,我们来看看如何为一个具体的算法设置实验并评估其性能。
首先,我们需要数据。数据是一组点,称为 (X_i, Y_i)。X_i 始终是输入,Y_i 是我们希望算法预测的输出。我们有 N 个这样的训练点,即 (X_i, Y_i),其中 i 从 1 到 N。这些是抽象的点,我们将把它们交给机器学习算法。
算法需要训练一个函数 F,该函数以输入空间(称为 X)中的点作为输入,并输出一个结果。在本例中,输出是 0 或 1。这是一个非常简单的二元分类任务。
接下来,一旦我们有了算法,就需要测试它。我们考虑一组测试点,其形式与输入点相同,称为 (X_j, Y_j),其中 j 从 1 到 M。非常重要的一点是,测试集独立于训练集,即没有任何测试点已经出现在训练集中。这就是我们在上一讲中定义的“未见过的点”。测试集将用于最终评估我们的算法。
现在我们假设有训练数据和某个算法(可以是k近邻算法或其他算法)。该算法基于训练点构建一个函数,在本幻灯片中我称之为 F_alg(算法选择的函数)。
现在我们要计算什么是训练误差和测试误差。
训练误差的计算方法如下:对于所有训练点,我们使用算法构建的函数来预测该函数认为此特定测试点的输出应该是什么。
我们取一个输入点 X_i,将函数 F 应用于此输入点,该函数产生一个输出,我们称之为 Y_i_hat。在统计学中,hat 符号用于表示估计量,因此 Y_i_hat 是算法对真实标签 Y_i 的估计。
现在我们可以计算损失:算法预测正确与否。我们定义一个损失函数 L(代表损失)。通常,损失函数接受三个输入:输入点 X_i、真实标签 Y_i 和预测标签 Y_i_hat。在最简单的情况下,它是0-1损失函数,它简单地检查预测标签 Y_i_hat 是否与真实标签 Y_i 相同。
如果相同,我们不产生损失(损失为0)。如果不同,我们产生损失1。因此,我们只是计算犯了多少错误,以及有多少情况算法预测了正确的输出。
这个损失函数首先计算单个数据点(一个训练点)的损失,因此有时被称为逐点0-1损失。
现在,我们想对所有训练点取平均值,得到所谓的训练损失或训练误差,通常也称为分类器的风险。在本幻灯片上,分类器应用于函数 F 的训练风险,是函数在所有输入数据点上预测输出并与训练点的真实输出比较时的平均损失。
直观上这很简单:我们的函数为训练点预测输出应该是什么,然后我们取平均值,看看我们犯了多少错误。例如,在许多应用中,10%的错误率可能是一个好的结果。
这个量稍后将被称作分类器的经验风险。
对于测试误差,我们做完全相同的事情,只是现在计算测试点上的误差。对于每个测试点 X_j,我们再次应用规则 F。规则输出一个标签 Y_j_hat,即算法认为正确的标签。然后我们再次评估损失:在这个真实标签为 Y_j 的测试点 X_j 上,预测标签是 Y_j_hat,如果预测标签和真实标签一致,损失为0,否则为1。
我们再次定义测试误差为所有测试集上的平均值,即对所有测试点从 j=1 到 M 的损失求和并平均。这给出了一个介于0和1之间的数字,即我们分类器的测试误差。
这里有一个小的技术说明:我们将测试误差定义为测试集上的平均值。稍后,我们还将定义在所有可能出现的点上的测试误差作为期望值,这将被称作分类器的真实风险,我们稍后会看到这一点。
关于误差的说明
在真正开始我们的第一个分类器之前,有两点说明。
显然,产生一个训练误差低的分类器并不是真正的挑战,因为训练集我们已经知道输出,在最坏的情况下,我们可以直接生成一个查找表,告诉所有输入点的预期输出应该是什么。因此,仅凭获得低训练误差本身并不是真正的挑战。
尽管如此,机器学习算法通常无法达到零训练误差。可能有很多原因。可能是因为零训练误差是不可能的,我们稍后会看到例子,因为标签中存在歧义。我们稍后会看到一些例子。
此外,有很多原因说明为什么产生零训练误差并不总是最好的主意。我们在上一讲中已经谈到了过拟合。通常,如果我们产生一个零训练误差的分类器,它会试图过拟合,因为它也模拟了噪声,这是我们经常要避免的。
无论如何,无论训练误差是多少,我们真正感兴趣的量是测试误差。这是我们机器学习算法成功的唯一衡量标准。最终,机器学习旨在产生一个能很好预测新的、未见过的实例的函数。我们并不真正关心训练误差是多少。训练误差可能是我们在构建算法时用来找到一个相当好的函数的工具。
但评估纯粹是在测试数据上进行的,测试误差最终是我们唯一感兴趣的量,因为这个量告诉我们,在未来应用我们的学习模型时,我们犯错误的可能性有多大。
特别地,正如我已经暗示的,低训练误差并不总是自动意味着低测试误差。例如,如果发生过拟合,情况就不是这样。
k近邻分类器
现在让我们谈谈k近邻分类器。解释k近邻分类器最简单的方法是使用幻灯片上的这张图。
在这张图中,我们有两类数据:绿色的叉号,称为类别0;黑色的叉号,称为类别1。
现在我们想要预测一个新点的标签,即图中中心的红点。我们该怎么做呢?
我们取红点,评估所有训练点(叉号)中哪些点离这个红点最近。例如,如果我们使用5近邻分类器,我们检查哪些训练点是最近的5个点。
我在这个测试点中心周围画了一个红色的圆圈,你可以看到这里最近的5个点是什么。然后你简单地取平均值,让这5个最近邻投票决定他们认为结果应该是什么。在这种情况下,我们有三个绿色叉号和两个黑色叉号,所以测试点的5个最近邻中的大多数说它是一个绿点,因此我们会预测绿色类别,即0。
这就是k近邻算法所做的。这真的是你能想到的最简单的算法。
让我们试着让它更正式一些。形式上,我们给定训练点 (X_i, Y_i),i 从 1 到 N。这些点来自某个输入空间 X 和二元输出空间 {0, 1}。
此外,我们在输入空间上给定一个距离函数,因为如果我们想评估一个点的最近邻是谁,我们需要有某种方法来衡量数据点有多接近。
所以我们需要一个距离函数,它告诉我们给定两个输入点,这些点有多接近。这个函数将用 D 表示,代表距离函数。
现在我们想构建一个分类器,能够预测新的测试点的结果。
它是如何工作的?我们给定这个测试点 x'。我们现在计算这个测试点 x' 到所有其他输入点(所有训练点)的距离。然后我们根据谁最接近测试点来对这些距离进行排序。我们取那些最接近测试点的几个点,K 是算法的参数。在前面的图中,我们有 k=5,我们看了5近邻算法。一般来说,我们谈论的是K近邻算法,所以 K 是我们要查看的邻居数量。假设我们以某种方式固定了它,所以我们取这个测试点的 K 个最近邻。
然后我们简单地分配这些 K 个邻居标签的多数票,这就是幻灯片底部的公式。y' 应该是函数赋予新数据点的标签。
我在这里所做的本质上是,我对所有传入的标签求和。因为我们有 K 个传入标签,即 K 个最近邻的标签,我们对它们全部求和。
在这种情况下,因为标签是 0 或 1,我们简单地检查和是小于 K/2 还是大于 K/2。如果小于 K/2,大多数标签会预测 0,所以我们也预测 0。如果和大于 K/2,大多数标签预测了 1,所以我们会输出 1。这就是k近邻分类器的工作原理。
这是一个非常非常简单的算法。它甚至简单到没有真正的训练阶段。在大多数其他算法中,我们会有一个训练阶段,检查许多可能的函数,以确定使用哪个函数最好。而k近邻算法甚至没有训练阶段。我们只需要查看数据,我们需要能够根据距离排序,然后我们就可以立即开始预测新测试的结果。
参数K的选择
现在,k近邻算法有一个参数 K,即我们要查看的邻居数量。这个参数 K 的范围可以在 1 到 N 之间。
K=1 意味着我们只取最近数据点的标签。没有平均,没有多数投票。我们只是检查测试点,哪个是最近的训练点,我们使用它的标签来预测测试点的结果。
在另一个极端情况下,我们可以使用 K=N,这意味着我们查看所有数据点,并使用多数投票评估标签。
现在我想请你思考一个问题:你认为参数 K 的范围应该是多少?K 小好还是大好?如果 K 非常小(比如1)和如果 K 非常大(比如 N)会发生什么?请现在暂停视频,认真思考一分钟,因为我认为理解这个概念很重要。
好的,我希望你已经有了自己的想法。你得出了关于 K 值小和大之间差异的一些想法。我想用一张图展示给你看。
这里你可以看到一个数据集,有黄色和蓝色的点。你看到黄色的圆圈和蓝色的圆圈,这些圆圈是我们给定的训练点。然后你看到小点,橙色和蓝色的点,这些是测试点。点的颜色表示该测试点将被分类为黄色还是蓝色。
你在左侧看到两个这样的图,你看到的是1近邻分类器。图中的黑线表示两个类别之间的决策边界,即类别标签将在哪里翻转,介于蓝色和橙色之间。这就是算法所做的,1近邻算法隐含地产生了这样的边界。
现在你可以看看它,你会发现1近邻分类器的这个边界真的非常非常弱。你几乎看不到任何连贯的东西,你甚至可以看到许多小岛,比如在许多橙色数据点中间有一个蓝色数据点,然后在这个蓝色数据点周围有一个小区域将被分类为蓝色,而其余部分将被分类为橙色。
这看起来甚至已经不太对劲了。你会很惊讶,如果你要分类的自然现象会有这样的决策边界。
这里发生的就是过拟合现象。因此,在这里,算法将适应我们数据中的每一个小的噪声位,即如果有一个点以某种方式是其自身类别的异常值,算法将在这个点周围制造一个小岛,这就是过拟合,它拟合了噪声,数据中的噪声对分类结果有太大的影响,这是不希望的。


一个更适中的参数 K 显示在这个图的右侧,这里你看到的是15近邻分类器。因此,这里的分类器取邻域中的15个点,并使用它们来分类测试点。当然,这里发生了多数投票,因为我们总是要对这15个最近邻进行平均。
你可以看到两个类别之间的边界比以前平滑得多。在这里,我们可能不会说它真的过拟合了。它似乎是对这个特定数据集的合理拟合。
你还可以看到,这意味着右侧情况下的训练误差不为零。因为有一些橙色点位于蓝色区域,反之亦然,它们会被错误分类。但总体而言,我们可能会认为右侧的分类器是更好的选择。
这是这个特定案例的一个要点:如果你看k近邻算法,如果参数 K 太小,你倾向于过拟合。如果你有一个适中的 K,情况就还好。然后如果参数 K 变得太大,你就会欠拟合。
如果你考虑极端情况,你可以选择 K=N。所以对于每个测试点,你将考虑数据集中的所有点作为邻居并进行多数投票。因此,无论你的测试点是什么,你总是会输出整个训练集中的多数标签,所以你产生的函数将是一个常数函数。
如果你的训练集中有更多标签为 0 的点,你将总是预测 0。如果你有更多标签为 1 的点,你将总是预测 1。这现在是欠拟合的明显情况。因此,除非你真的认为应该有一个常数函数,否则模型可能不够强大来拟合你的数据集,但那样你可能就不需要机器学习了。但如果你认为你的结果应该更复杂一些,那么如果你选择 K=N,就会发生欠拟合。
好的,这一切都在幻灯片上描述了,也许从理论角度再多说一句。k近邻算法是一个非常好的算法,因为它将是普遍一致的,我们稍后会看到这意味着什么。
为了从理论角度实现一个一致的算法,我们可以证明参数 K 应该是什么。你可以证明参数 K 应该大约是 log N 的数量级。所以如果你有 N 个训练点,参数 K 应该选择为训练点数量的对数。
这将实现的是,如果你有越来越多的数据点,你围绕测试点取的小区域会变小,所以在 N 趋于无穷的极限下,如果你有很多很多数据点,你将只对非常接近你的测试点的东西进行平均,这是有道理的,因为你不想对真的很远的东西进行平均。
但另一方面,即使你取平均的区域的直径在缩小,同时我们在这个区域内有 log N 个点,所以我们对越来越多的点取平均,点的数量在增长 log N,它不是常数。在统计学中,每当你想估计某物时,你至少需要在极限内有无限数量的点来取平均值,否则平均值不会趋于稳定。
如果我们选择 log N,这就会发生。当然,我们可以非常正式地证明这一点,我们现在不会在讲座中做这个,只是把它当作一个经验法则。
算法演示与实例分析
现在让我们简单地看看这对几个例子的表现,我们从高斯混合模型开始。我希望你已经完成了所有的数学复习,如果没有,请重新考虑什么是正态分布,从一维正态分布开始,考虑什么是多元正态分布,然后再思考什么是高斯混合。
直观地说,一个高斯混合,就像多个维度上的一个高斯分布,就像是多个维度上的高斯钟形曲线山。现在,高斯混合由许多这样的模式组成。我们马上会看到一个例子。
我们现在要做的是,我从高斯混合中抽取一个训练点样本,然后使用k近邻分类器,我只想在我写的一个Matlab演示中展示给你看。
(演示部分描述图表和结果,展示了不同 K 值下训练误差和测试误差的变化,以及数据分布变化对结果的影响。)

手写数字识别实例

我想向你展示第二个应用,它比高斯混合更自然一些,即手写数字识别。这是你在练习中也会经常看到的数据,称为USPS或MNIST数据。USPS是美国邮政服务,这是20世纪90年代创建的数据,是真正的邮政服务数据,他们想学习如何为邮政编码分类手写的0-9数字。
这个数据集由许多手写数字组成,像这样。所有这些数字都被很好地记录并居中在图像中间。这些是灰度图像,16x16像素。所以每个像素用0到1之间的灰度值编码。


每个图像,因为它是16x16,由256个介于0和1之间的不同数字组成。
现在我们想看看两个不同分类任务的结果,因为目前我们看的是二元分类,我只想向你展示如何分类数字8与数字1,所以我们只想学习区分8和1。


如果你想想这些数字的样子,8对1似乎相当简单,因为1是一条非常直的线,而8是卷曲的东西。
现在,如果你想对手写数字使用k近邻分类器,现在第一个障碍是:我们需要定义数字之间的距离函数,因为k近邻分类器最终要检查谁是我的最近邻,然后你需要评估它们的标签。要知道谁是你的最近邻,你需要有某种方法来测量距离。



你如何计算两个手写数字之间的距离?有很多不同的方法。如果你从数学角度思考,每个数字都表示为一个256维的向量。

所以你可能做的最天真、最直接的事情就是简单地使用向量空间中的欧几里得距离。这就是我们要做的,这是一种非常朴素的方法。
我们有一个输入点 x 和一个输入点 x',每个点由256个坐标组成,我们简单地计算这些点之间的欧几里得距离。如果你不知道这意味着什么,它只是向量空间距离,你对点的坐标之间的平方距离求和,然后取平方根。
这是向量空间中的欧几里得距离。好的,这就是我们使用的距离函数。
现在你可以在这里看到结果。这与我们刚刚在高斯混合演示中看到的设置类似。同样,我对此类问题进行了独立的测试运行、训练和测试运行。USPS数据包含许多数字,我只取了500个训练数字和100个测试数字,都只来自类别1和8。

你可以在左侧看到结果,即每当我独立抽取训练集和测试集时,这些独立运行的训练和测试结果。在右侧,也许我们应该关注这个,我们看到过程的误差,特别是测试误差,你可以看到它在这里。对于 k=3,误差约为0.013。对于 k=11,它上升到接近0.04。还有不同的训练误差,它们彼此非常接近,现在可能不那么重要。
现在我想问你,也许这又是一个你可能想暂停视频并盯着这个图看一分钟的点。你认为这是一个好结果还是坏结果?请先试着自己思考一下。
好的,我希望你已经有了决定。这是一个非常好的结果。如果你想一想,这是手写数字识别,这真是一个不那么容易的问题。你所有的数据点都由256维的灰度值向量组成。
而用这个愚蠢简单的k近邻分类器,它没有什么复杂之处,我们甚至使用了在大多数情况下不起作用的欧几里得距离,但在这里它起作用了,我们得到了仅仅1%的误差(对于 k=3),如果你选择更大的 K,它会增加一点。
这表明我们可能应该选择一个相当小的 K,至少对于我们在这里选择的这种设置。测试误差为1%,使用一种朴素的方法,这通常在你的机器学习实验中是得不到的。如果你为某家公司工作,他们希望你解决一个机器学习实验,不要指望在第一个简单的朴素方法之后就能达到1%的测试误差。所以这真的非常非常好。
这多少表明,毕竟,手写数字识别可能不是最复杂的问题。
也许再多说一句,当然,我们这里只分类数字1和数字8,如果你在所有10个测试点中进行分类,误差会增加,我们将在本讲座后面看到我们如何做到这一点,如何从二元方法扩展到多类方法,这并不复杂,但当然测试误差会增加,因为有更多不同的方式可能混淆你的真实测试标签。
这里是另一个分类任务的结果,我们分类数字3与数字8,这可能更复杂一些,因为如果你想象这些数字的样子,8是这样的,而3是8的一半,至少大致如此,所以混淆这两个数字的可能性更大。
让我们现在看看结果,我们使用完全相同的设置,你现在看到这里的红线又是测试误差,你看到它更高一些,所以这里最好的情况是3%(抱歉,是3%),而之前是1%左右,在这里它增加得更高一些。
因此,我们可以通过比较这张图和前一张图看出,这种情况稍差一些,区分3和8至少比区分1和8的测试误差稍高,但在两种情况下,测试结果都非常非常好。
算法的局限性与归纳偏好
现在我说过,我们到目前为止所做的真的是所有方法中最简单的,你甚至可以称之为朴素,我们使用了k近邻分类器,使用小的 K,并使用欧几里得距离作为距离函数或相似性函数。在大多数应用中,欧几里得距离不起作用。
当然,只有当你的距离函数编码了关于数据的重要内容时,应用k近邻分类器才能成功。事实上,在许多应用中,为你的数据集想出一个好的距离函数并不容易。
我这里有一个例子,你想分类蘑菇。蘑菇应该被分类为可食用和不可食用,所以你走过森林,看到一个蘑菇,你想知道,我能吃它吗?你有一组特定的特征,也许是蘑菇的大小、重量、颜色、外观等等。
现在,如果你想应用k近邻分类器,你需要有一个这些蘑菇之间的距离函数。现在,如果你记录的所有关于蘑菇的信息是重量和大小,并使用距离函数,比如这里使用欧几里得函数,或者更简单的情况,甚至只是重量差,它可能不会起作用,因为重量并不是真正指示你是否能吃蘑菇的因素。
在这个例子中,你可能会说,好吧,也许我没有真正选择正确的特征,如果我选择了其他特征,比如进行一些化学分析,然后得到蘑菇中某些部分的浓度,那么也许它会起作用,是的。但还有许多其他应用甚至更加复杂。
这里的例子是:假设你想对一首歌曲的类型进行分类。你有一个Last.fm或其中一个网络电台,你想播放一首歌,然后下一首歌应该与上一首歌相似。你如何计算两首歌之间的相似性?你的歌是你电脑中的声波。
声波之间的欧几里得距离可能不会给你一个好的距离函数。特别是,如果你想编码一些非常复杂的东西,比如一首歌的类型,它是流行歌曲还是古典音乐?这种欧几里得距离不会起作用。
因此,需要大量工作来设计这个距离函数。事实上,这在机器学习中经常发生。需要进行大量的预处理,以使你的数据格式能够成功应用机器学习算法。
这种预处理通常需要大量工作,并且这种预处理通常是你的算法成功或失败的关键,而顶层的机器学习,至少在很多时候,并不是那么重要。我的意思是,当然,它有影响,但我使用一个非常朴素的算法或一个更好的算法。但关键通常是你数据的预处理。
现在这里还有一个问题给你,再次请暂停视频思考一下:你认为k近邻算法的归纳偏好是什么?在上一讲中,我们谈到了没有任何归纳偏好的机器学习是不可能的。
那么,你认为k近邻算法将学习到哪种类型的函数?也许有哪些类型的函数是我无法使用k近邻分类器学习的?请暂停视频思考一下。
好的,对于这个问题,你可以给出许多不同的答案。我认为最简单、最直接的关于归纳偏好的答案是,k近邻算法试图编码的是:相似的输入点应该导致相似的输出。因为当你应用算法时,你取一个测试点,检查谁是最相似或最接近的数据点,然后你说,好吧,我想做这些接近的数据点告诉我的任何事情。
也许用一个更实际的例子:你想预测一个人是会购买三星手机还是苹果手机。现在你该怎么做?你有某种方法来衡量人与人之间的相似性,有无数种方法可以做到这一点,但假设你只是这样做,你查看谁是最亲密的朋友作为相似性函数,来预测我是否会购买三星手机或苹果手机。
我们简单地检查我的朋友们会做什么。如果我所有的朋友都有苹果手机,那么我买苹果手机的可能性也很大。这就是归纳偏好。所以你检查谁与我自己非常相似,然后你做这些人一直在做的事情。这就是k近邻分类器的归纳偏好。
算法的扩展与应用
现在有许多扩展,你可以使用k近邻分类器,或者我应该说k近邻工具箱非常强大,因为你可以将其应用于许多许多不同的问题。
一件非常简单的事情是应用于回归。在回归中,输出将是一个实数,而不是二元标签。例如,在回归中,你可能想预测某个特定人10年后的收入。你查看过去的教育历史等等,然后你想输出一个数字:这个人10年后能赚多少钱。所以这不是一个分类问题,而是一个回归问题。
同样在这里,你可以应用k近邻分类器。在你的训练数据中,你会有很多人,你知道他们的教育背景,也知道他们10年后赚了多少钱。现在你检查谁是我在训练集中最相似的人,我检查像10个最相似的人中,他们10年后赚了多少钱,我取平均值,这也许是对我10年后能赚多少钱的一个很好的预测,至少在平均水平上是这样。
然而,k近邻方法也可以用于更复杂的任务,如异常值检测、分类、密度估计、聚类等等。所以,对于你可能想出的所有机器学习任务,在k近邻算法方面都有一个解决方案。它们往往是有用的基线考虑。
总结
现在,让我们总结一下关于k近邻算法。
k近邻分类器是你能看到的最简单的分类器。它通常表现得相当合理。主要的挑战是你需要定义一个对你的任务有用的距离函数。
我的建议是,每当你有一个想要解决的机器学习问题时,先尝试k近邻算法。在某些情况下,比如数字识别,k近邻算法可能已经表现得相当好。那么,如果基线算法已经这么好,也许就没有必要再花五周时间试图改进机器学习算法了。
可能有很多很多其他例子,基线并不差,或者说基线要差得多。那么也许有足够的空间通过应用更聪明的机器学习算法来改进你的结果。
从理论角度来看,我已经提到k近邻算法是一个很好的算法,因为它将是普遍一致的,我们将在下一讲中看到这意味着什么。

在本节课中,我们一起学习了如何设置机器学习实验并计算训练与测试误差,深入探讨了k近邻分类器的工作原理、其参数 K 的选择如何影响过拟合与欠拟合,并通过高斯混合模型和手写数字识别的实例观察了算法的表现。我们还讨论了算法的关键挑战——距离函数的设计,以及其核心的归纳偏好:相似的输入应产生相似的输出。k近邻算法作为一个简单而强大的基线方法,是开始解决新机器学习问题的良好起点。
04:形式化设定、风险与一致性





在本节课中,我们将学习监督机器学习的形式化设定。我们将定义其核心组成部分,并介绍两个关键概念:贝叶斯分类器与学习算法的一致性。





上一节我们介绍了k近邻分类器作为机器学习算法的第一个例子。现在,我们将采取更形式化的方法,明确定义监督机器学习所需的要素,并解释一些重要概念,如贝叶斯分类器和学习算法的一致性。


输入与输出空间



首先,我们需要讨论监督(有时也包括无监督)机器学习问题的基础空间。

我们通常假设存在一个输入空间,记作 X。
在监督学习中,我们还有一个输出空间,记作 Y。


这些空间可能具有数学结构。例如,空间可能存在拓扑结构,或者是一个度量空间(例如,为了在k近邻分类器中测量距离),甚至可能是一个向量空间或更复杂的结构。机器学习有多种形式,目前我们只需要空间 X 和 Y。



概率分布与可测性

现在,我们需要在这些空间上定义概率分布,因此需要一个σ-代数。如果你不熟悉这个概念,可以暂时忽略它。我们假设在空间 X 和 Y 上分别存在σ-代数,以便定义概率测度。



在实际的机器学习中,可测性问题通常不是重点,因为现实世界中的测量都是有限的(例如有限的数据点、计算机的有限精度)。如果你不了解可测性,完全不必担心,这只是形式化设定的一部分。


有了空间 X 和 Y 上的σ-代数,我们现在可以定义概率测度。重要的是,我们考虑乘积空间 X × Y(及其乘积σ-代数)。这意味着我们有一个 X 的副本和一个 Y 的副本,最终我们将观察到成对的 (x, y)。正如之前所见,训练数据点 (X_i, Y_i) 就来自这个乘积空间。


机器学习的关键假设



机器学习的关键在于,我们不对这个概率分布做任何假设。我们不知道它是否来自某个特定类别(如高斯分布或指数分布)。这是机器学习与统计学的一个关键区别。在统计学中,你通常假设数据服从某种分布,如果假设成立,就能得到很强的结论。但在机器学习中,许多过程(例如在线商店的客户分布)非常复杂,难以用简单的概率分布建模。
本课程就属于不对数据分布做特定假设的统计机器学习分支。
另一个重要点是,输入变量和输出变量都是随机变量。输入变量是随机的(例如,从总体中随机抽取一个人)。输出变量也可能是随机的。例如,根据一个人的身高预测其性别(男/女),对于一个身高1.7米的人,其性别并非由身高唯一确定,因此输出本身也是一个随机量。


分类器与损失函数
一个分类器是一个函数,它接收输入并产生输出,即一个从输入空间 X 到输出空间 Y 的函数。
机器学习的目标是构建一个“好”的函数,使其具有较低的测试误差。为此,我们需要在形式化设定中定义训练误差、测试误差等概念。


首先,需要区分分类与回归问题:
- 如果输出空间 Y 是离散的(例如二元空间 {0, 1} 或有10个数字的类别),这类问题称为分类。我们通常从二元分类开始。
- 如果输出空间 Y 是实数轴 R(任何实数都可以是输出),则称为回归(例如预测收入或价格)。
- 还存在更复杂的输出空间(如结构化预测),但我们现在从分类开始。



为了评估分类器的好坏,我们需要定义一个损失函数。


损失函数是一个从 X × Y × Y 映射到非负实数的函数 L(x, y, y‘),其中 x 是输入,y 是真实输出,y‘ 是预测输出。




以下是两个常见的损失函数示例:


- 0-1损失(用于分类):如果预测错误,损失为1;否则为0。
L_0-1(y, y‘) = I(y ≠ y‘),其中I(·)是指示函数。 - 平方损失(用于回归):测量预测值与真实值之差的平方。
L_squared(y, y‘) = (y - y‘)^2

损失函数的选择会极大地影响学习算法的归纳偏好,我们在线性回归等例子中会看到这一点。
你可能会注意到,上述两个例子中的损失函数并不依赖于输入 x。但存在损失函数也需要依赖 x 的情况。



请思考一下,你能想出一个损失函数需要依赖输入值 x 的例子吗?


一个例子是医疗诊断。对于某些人群(如老年人),分类错误的代价可能远高于其他人群。因此,损失函数可以设计为:当分类器在关键人群(如老年女性)上犯错时,损失值要大得多。这样,分类器就会更专注于学习空间中重要的部分。



此外,在应用中,错误的类型也可能很重要,这体现在损失函数中两个参数 y 和 y‘ 的顺序上。


再思考一下,你能想出一个错误类型很重要的例子吗?



一个明显的例子是垃圾邮件检测。
- 如果将正常邮件误分类为垃圾邮件(假阳性),可能导致你错过重要邮件(如工作录用通知),造成很大损失。
- 如果将垃圾邮件误分类为正常邮件(假阴性),只是有点烦人,但损失较小。
因此,在垃圾邮件检测中,两种错误类型是不对称的。这也说明了为什么损失函数有三个参数,且参数的顺序很重要。



风险与贝叶斯分类器

现在我们需要定义一个分类器的风险。
一个分类器(或任何预测函数)f 关于给定损失函数 L 的真实风险(或称真实期望损失),是其损失的期望值。




风险 R(f) 定义为:
R(f) = E[ L(X, Y, f(X)) ]
其中,期望 E 是对随机抽取的点对 (X, Y) 取的,(X, Y) 来自乘积空间 X × Y。你随机抽取一个点对,用函数 f 对输入 X 进行预测,计算损失函数,然后对所有可能抽取的点对取期望。

在当前的设定中,f 是一个给定的固定函数。机器学习的目标是利用训练数据,构建一个风险尽可能小的函数。我们关心的正是这个真实风险,而不是训练误差或其他指标。


那么,可能想到的最好的分类器是什么?


为了定义这个最佳分类器,我们引入贝叶斯风险的概念。



贝叶斯风险 R* 定义为所有可能函数风险的下确界:
R* = inf { R(f) : f 为可测函数, f: X -> Y }
直观上,我们考虑所有从 X 到 Y 的可能函数,查看它们的风险,其中最小的风险就是贝叶斯风险。我们取下确界是因为最小值可能不存在。



如果存在一个分类器 f* 能达到这个下确界(即达到最小风险),我们称这个分类器为贝叶斯分类器。


训练数据与学习目标


在机器学习中,我们需要训练数据。
我们有一个基础空间和其上的概率分布。对于机器学习,我们从该空间中独立同分布地抽取 n 个点。


IID 意味着独立且同分布。每次抽取一个新点都与之前的数据点独立,并且所有点都服从相同的分布(即来自乘积空间 X × Y 上的特定概率分布)。

IID 是一个在数学上非常方便的假设,但从实践角度看,这是一个非常强的假设。现实中数据往往存在结构(例如,早上和晚上的客户行为可能不同)。此外,我们目前假设概率分布是固定不变的,也存在在线学习等场景,其中分布会发生变化,但我们目前不处理这些情况。



在目前定义的形式化设定中,机器学习的目标是:获取从基础概率分布中 IID 生成的训练数据,构建一个分类器 f_n(下标 n 表示它依赖于 n 个训练点),并希望该分类器的风险尽可能接近贝叶斯风险。


一致性



在统计学中,一致性是至关重要的性质,它表明你的算法最终会做正确的事。


现在我们考虑一个无限的数据点序列 (X_i, Y_i), i=1,2,3,...。我们希望表达:如果我们记录无限多的训练数据点,最终当 n 趋向无穷大时,分类器会做正确的事。




我们有一个从基础概率分布 P 中 IID 抽取的数据点序列。固定前 n 个点,我们构建一个分类器 f_n(这是我们的算法基于前 n 个训练点构造的函数)。

我们说这个算法对于给定的概率分布 P 是一致的,如果分类器 f_n 的真实风险 R(f_n) 收敛于贝叶斯风险 R*。




用公式表达,即对于任意 ε > 0,满足:
lim_{n->∞} P( |R(f_n) - R*| > ε ) = 0
如果你学过概率论,会认出这是依概率收敛。

这里的关键是,R(f_n) 是一个随机量,因为函数 f_n 依赖于我们的(随机)训练数据。而这个风险是在所有可能的测试点上计算的期望。这个依赖于有限训练集的函数的真实风险,应该收敛到贝叶斯风险。



需要注意的是,这个定义依赖于基础概率分布 P。一个算法可能对某些 P 是一致的,但对另一些 P 则不一致。



普适一致性

当然,我们并不知道实际应用中的概率分布是什么。我们希望的是:无论底层概率分布是什么,我都希望这个算法是一致的。


因此,我们定义:如果一个算法对所有可能的概率分布 P(在空间 X × Y 上)都是一致的,则称该算法是普适一致的。


机器学习的终极目标(从形式化角度看)就是找到普适一致的学习算法。无论底层概率分布多么奇怪复杂,只要我们能看到足够多的数据点(n 趋向无穷大),最终我们分类器的风险都将收敛到可能达到的最佳风险——贝叶斯风险。




这是一个很高的目标,因为它包含了所有你能想到的、最奇怪的概率分布。很长一段时间里,人们甚至不知道普适一致的学习算法是否存在。据我所知,第一个证明是1997年的Stone定理,它证明了k近邻算法是普适一致的。自此以后,许多经典机器学习算法(如支持向量机、Boosting、随机森林等)也在特定构造方式下被证明是普适一致的。机器学习理论的一个重要方面就是理解如何证明一个算法的(普适)一致性,或者需要什么假设才能保证一致性。





本节课中,我们一起学习了监督机器学习的形式化设定。我们定义了输入/输出空间、概率分布、分类器、损失函数以及核心的风险概念。我们了解了理论上最优的贝叶斯分类器及其对应的贝叶斯风险。最后,我们探讨了衡量算法渐近性能的一致性与普适一致性概念,并了解到寻找普适一致算法是统计机器学习理论的核心目标之一。
05:贝叶斯决策理论
在本节课中,我们将学习贝叶斯决策理论。我们将探讨在已知所有底层概率分布的理想情况下,如何找到最优的分类器。我们将通过一个预测人身高性别的具体例子,逐步介绍几种不同的决策方法,并最终理解如何结合损失函数来做出最优决策。
从监督学习到决策理论
上一节我们介绍了监督机器学习问题的形式化设置,了解了分类器的真实风险、贝叶斯分类器的概念以及分类算法的一致性定义。
本节中,我们将退一步,暂时不考虑数据有限的情况。我们假设自己拥有世界的全部知识,即知道所有底层的概率分布。那么,我们想要找到的最佳分类器是什么?我们应以何种方式决定分类规则?
一个运行示例:根据身高预测性别
我们假设在一个房间里有很多人。对于每个人,我们可以测量其身高(例如,1.68米)。这是我们可以获取的唯一测量值。我们的目标是:给定一个人的身高,预测此人的性别(男性或女性)。
请花一分钟思考一下,你会如何解决这个问题。假设有人告诉你一个人的身高是1.80米,你认为此人是男性还是女性?请暂停视频,尝试提出你的解决方案。
已知分布下的决策
我们将在已知底层概率分布的假设下审视这个机器学习问题。例如,我们知道类条件分布。
类条件分布是给定类别 y 时,特征 x(身高)的概率分布,即 P(x|y)。对于女性群体和男性群体,身高分布可能不同。我们假设身高大致服从正态分布。女性群体的分布(红色曲线)峰值可能在1.60米左右,而男性群体的分布(蓝色曲线)峰值可能在1.80米左右。
现在,请思考:如果我告诉你某人身高是1.60米,你认为此人是男性还是女性?更重要的是,你得出这个答案背后的推理算法是什么?

几种不同的决策方法
接下来,我将带你了解几种不同的方法,它们看起来都或多或少有道理,但可能导致不同的结果。
方法一:朴素先验法
第一种非常朴素的方法是,只查看两个类别的先验分布。例如,如果我们所在的计算机科学课堂中90%的人是男性,那么你可能根本不需要看身高测量值,直接预测“男性”即可。


形式化地,这意味着根据类别的先验概率进行预测。你的分类规则 n(x) 如下:
- 如果男性在底层人群中的概率
P(Y=男)大于女性的概率P(Y=女),则预测为男性。 - 反之,则预测为女性。
这种方法完全不看测量值 X。这听起来很愚蠢,但在某些情况下,如果只追求分类准确率,这可能不是最差的做法。例如,在垃圾邮件检测中,如果99%的邮件都是垃圾邮件,那么对所有邮件都预测为垃圾邮件,准确率已经达到99%。不过,我们通常更关心那1%的非垃圾邮件。
在视觉上,这意味着我们绘制男性和女性先验概率的条形图,然后选择较高的那个条形所代表的类别。



方法二:最大似然法
第二种方法更有意义,统计学家称之为最大似然法。
其思想很简单:我们查看之前提到的类条件分布图。对于给定的输入(例如身高1.60米),我们看哪个类别的分布在此身高值上具有更高的概率密度。

形式化地,最大似然原则的规则如下:

我们比较在给定测量值 x(如1.60米)的条件下,假设此人为男性或女性时,得到该测量值的概率:
- 如果
P(X=1.60 | Y=男) > P(X=1.60 | Y=女),则预测为男性。 - 反之,则预测为女性。
这感觉像是“反过来的”推理:我们假设知道类别,然后看得到此数据的可能性。在许多情况下,我们更希望进行“正向”推理:给定数据,看属于某个类别的概率。这引出了下一种方法。
方法三:贝叶斯后验法
第三种方法是贝叶斯方法,即后验准则。它进行的就是我们刚才提到的“正向”推理。
我们想知道:给定我们测量到一个人身高1.60米,此人是男性的可能性更高,还是女性的可能性更高?然后我们使用这个标准来决定。
形式化地,我们想比较后验概率 P(Y=男 | X=1.60) 和 P(Y=女 | X=1.60)。
为了计算这个量,我们需要使用贝叶斯公式。贝叶斯公式可以帮助我们转换条件概率中的参数:
P(Y=男 | X=1.60) = [P(X=1.60 | Y=男) * P(Y=男)] / P(X=1.60)

其中 P(X=1.60) 是边际概率,可以通过全概率公式计算:P(X=1.60) = P(X=1.60|Y=男)P(Y=男) + P(X=1.60|Y=女)P(Y=女)。
贝叶斯决策规则是:
- 如果
P(Y=男 | X=x) > P(Y=女 | X=x),则预测为男性。 - 反之,则预测为女性。
与最大似然法的关键区别:贝叶斯方法考虑了类别的先验概率(即“基础率”),而最大似然法忽略了它。当先验分布均匀(即男女人数相等)时,两种方法给出相同结果。但当先验分布不平衡时,结果会不同。
例如,如果房间里几乎全是女性(先验概率 P(Y=女) 很高),那么即使一个身高1.70米的人(在均匀先验下难以判断),在贝叶斯方法中也更可能被预测为女性,因为房间里女性基数太大。只有当身高非常高(如1.90米)时,才可能预测为男性。决策边界(后验概率相等时的身高值)会向右移动。
引入损失函数


在机器学习中,我们通常会定义一个损失函数,用以惩罚算法犯下的不同类型错误。如果我们知道这个损失函数,就应该设计能够考虑它的算法,使其能特别关注那些犯错代价高昂的区域。
以下是形式化的工作方式:
我们定义一个损失函数 L(x, y, ŷ),其中 x 是输入数据(身高),y 是真实标签,ŷ 是预测标签。
我们考虑条件风险。假设我们想为测量到身高 x(例如1.60米)的人做预测。在给定输入为 x 的条件下,预测 ŷ 的风险是期望损失:
R(ŷ | X=x) = E[L(x, Y, ŷ) | X=x]
这里,Y 是真实标签的随机变量,我们对其取期望。ŷ 是我们看到确定值 x 后做出的确定性预测。
这个条件风险可以分解为:
R(ŷ | X=x) = P(Y=男 | X=x) * L(x, 男, ŷ) + P(Y=女 | X=x) * L(x, 女, ŷ)
贝叶斯决策规则扩展为:选择那个能使条件风险最小化的标签 ŷ 作为预测。
损失函数的影响
损失函数会显著影响决策边界。例如:
- 对称损失:将男性误判为女性,和将女性误判为男性的代价相同。
- 非对称损失:例如,将女性误判为男性的代价很高(损失值大),而将男性误判为女性的代价较低。在这种情况下,算法会变得更“保守”,更倾向于预测代价低的类别(此例中为“女性”),除非有非常强的证据(如身高极高)支持另一个类别。
损失函数与先验概率会相互作用。例如,如果女性先验概率很高,并且将女性误判为男性的损失很大,那么算法会极度倾向于预测“女性”,决策边界会大幅右移。反之,如果男性先验概率高,但误判女性的损失大,决策边界则会左移。
总结

本节课中,我们一起学习了贝叶斯决策理论的核心思想。我们从最简单的仅依赖先验的方法开始,逐步引入了更合理的最大似然法和贝叶斯后验法,并指出了后者通过贝叶斯公式纳入先验知识的重要性。最后,我们探讨了如何将实际问题中的损失函数整合到决策框架中,通过最小化条件风险来实现最优决策。贝叶斯决策理论为我们提供了在已知完整概率信息和特定代价下,进行最优分类的理论基础。
06:贝叶斯分类器 📊

在本节课中,我们将学习贝叶斯决策理论的核心内容,特别是如何推导出最优分类器的显式公式。我们将从0-1损失下的分类问题开始,然后探讨平方损失下的回归问题。理解这些最优解的形式,有助于我们明确机器学习模型性能的理论上限。
回归函数与概率分布


上一节我们介绍了贝叶斯决策理论的基本框架。本节中,我们来看看如何用显式公式来描述最优分类器,而无需进行复杂的优化求解。

首先,我们需要定义几个核心概念。我们考虑一个二元分类问题,输入和输出是随机变量对 (X, Y),它们服从定义在乘积空间 X × {0, 1} 上的概率分布 P。
- 边际分布 μ: 这是输入 X 的分布。对于任意集合 A,μ(A) 表示输入点落在 A 中的概率。其定义为:
μ(A) = P(X ∈ A) - 回归函数 η(x): 这是一个关键函数,定义为在给定输入 X = x 的条件下,输出 Y 的期望值。其公式为:
η(x) = E[Y | X = x]
在二元分类的特定情况下,由于 Y 只能取0或1,这个期望值可以简化为:
η(x) = P(Y = 1 | X = x)
因此,回归函数 η(x) 的值域在0到1之间,它直接给出了在输入 x 下,标签为1的概率。

回归函数的值直观地反映了分类问题的难度。当 η(x) 接近0或1时,意味着我们几乎可以确定正确的标签。而当 η(x) 接近0.5时,意味着我们对该输入点的标签最不确定。

一个重要结论是,联合概率分布 P 可以由边际分布 μ 和回归函数 η 唯一确定。这意味着,如果我们知道了 μ 和 η,我们就完全掌握了数据的生成机制。
0-1损失下的贝叶斯分类器 🏆

现在,我们回到0-1损失下的分类问题。分类器 f 的风险 R(f) 定义为期望损失,在0-1损失下,它等于分类器出错的概率:
R(f) = E[1_{f(X) ≠ Y}] = P(f(X) ≠ Y)


贝叶斯分类器 f* 是能最小化此风险的最优分类器。我们可以推导出它的显式形式。考虑如下定义的分类器 f:
**f(x) = 1, 如果 η(x) > 1/2;否则 f*(x) = 0**

这个定义非常直观:如果给定输入 x 后,标签为1的概率大于0.5,我们就预测1;否则预测0。
定理:对于0-1损失,上述定义的分类器 f* 就是贝叶斯分类器。对于任意其他分类器 f,都有 R(f) ≥ R(f*)。
这个定理的证明思路是,固定一个输入值 x,比较任意分类器 f 和 f* 在该点出错的概率。通过分析可以发现,无论 η(x) 的值如何,f* 的出错概率总是小于或等于 f 的出错概率。将这个结论对 x 的分布取期望,就得到了风险的不等式。

然而,这个显式解在实践中有根本性的限制:要计算 f*,我们必须知道真实的回归函数 η(x),而这又要求我们知道整个潜在的概率分布 P。在实际的机器学习场景中,我们只有有限的训练数据,无法获知真实的 P。因此,贝叶斯分类器是一个理论上的黄金标准,但通常无法直接计算。
一个朴素的想法是使用“插件分类器”:先用有限数据估计出回归函数 η_n(x),然后用这个估计值来构建分类规则 f_n(x) = 1_{η_n(x) > 1/2}。虽然理论上,如果 η_n(x) 是 η(x) 的一致估计,那么 f_n 在数据量趋于无穷时会收敛到贝叶斯分类器,但在高维空间中,这种密度估计需要的数据量是指数级的,在实践中往往不可行。


平方损失下的贝叶斯回归器 📈

接下来,我们看看回归问题在平方损失下的最优解。平方损失函数定义为 L(f(x), y) = (f(x) - y)^2。
与分类类似,我们定义回归函数 η(x) = E[Y | X = x]。在回归中,它表示给定输入 x 时,输出 y 的平均值。
一个关键的工具是平方误差的分解公式。对于任意预测函数 f,其期望平方风险可以分解为:
E[(f(X) - Y)^2] = E[(f(X) - η(X))^2] + E[(η(X) - Y)^2]

注意,等式右边的第二项 E[(η(X) - Y)^2] 与函数 f 的选择无关,它反映了数据内在的噪声(不可约误差)。因此,最小化风险等价于最小化第一项 E[(f(X) - η(X))^2]。

显然,当且仅当 f(x) = η(x) 时,第一项为零,达到最小值。因此,我们得到结论:


定理:对于平方损失,回归函数 η(x) 本身即为贝叶斯回归器 f。也就是说,f*(x) = η(x) = E[Y | X = x]* 是最优的预测函数。

与分类情况一样,这个最优解同样依赖于未知的真实概率分布,因此在实际中无法直接获得。但它为我们构建回归模型(例如,试图用函数去逼近 η(x))提供了明确的理论目标。





总结



本节课中我们一起学习了贝叶斯分类器和回归器的显式解。
- 在0-1损失下的二元分类问题中,贝叶斯分类器是 f*(x) = 1_{η(x) > 1/2},其中 η(x) = P(Y=1|X=x)。
- 在平方损失下的回归问题中,贝叶斯回归器就是回归函数本身 f*(x) = η(x) = E[Y|X=x]。
- 这些解在已知完整数据分布时是最优的,但它们都依赖于真实的回归函数 η(x),而这在实际的、数据有限的机器学习问题中是未知的。因此,机器学习的核心任务就转化为:如何利用有限的训练数据,学习一个尽可能接近这些理论最优解的预测函数。
07:风险最小化、近似误差与估计误差 📊



在本节课中,我们将要学习两个最重要且基础的学习原则:经验风险最小化与正则化风险最小化。我们将探讨它们背后的核心思想,并深入理解机器学习中两种关键误差——近似误差与估计误差——的来源与权衡。

从经验风险最小化开始 🎯
上一节我们介绍了在已知概率分布情况下的最优分类器。本节中我们来看看当未知真实数据分布,仅拥有有限训练数据时,我们应如何进行学习。
假设我们拥有 N 个训练点:(X_i, Y_i), i=1,...,N。对于一个给定的函数 f,我们可以计算其在训练集上的平均误差,即经验风险 R_n(f):




公式: R_n(f) = (1/N) * Σ_{i=1}^{N} L(f(X_i), Y_i)

其中 L 是损失函数。这是一个仅基于训练数据即可计算的量。


一个直观的学习原则是:在一个预先设定的函数集合 F 中,选择那个经验风险最小的函数。这就是经验风险最小化:
公式: f_N = argmin_{f ∈ F} R_n(f)

这里,f_N 是我们算法基于 N 个样本选出的函数。我们暂时忽略解的存在性、唯一性等技术细节,专注于理解其核心思想。
理解两种关键误差:近似误差与估计误差 🔍


经验风险最小化的性能,很大程度上取决于函数类 F 的选择。为了分析这一点,我们需要区分两种误差。

首先定义 F 中的最优函数 f̃。这是在已知真实分布时,F 中风险最小的函数:
公式: f̃ = argmin_{f ∈ F} R(f)
其风险记为 R(f̃)。
现在,我们引入两个核心概念:
- 估计误差:
R(f_N) - R(f̃)- 这是由于我们只有有限数据,无法精确找到
F中最优函数f̃而产生的误差。它是一个随机变量,依赖于具体的训练样本。
- 这是由于我们只有有限数据,无法精确找到
- 近似误差:
R(f̃) - R(f*)- 这是由于我们的函数类
F可能不够大,甚至不包含全局最优函数f*(贝叶斯最优分类器)而产生的误差。它是一个确定性的量,取决于F的选择。
- 这是由于我们的函数类


我们可以通过一个图示来直观理解:
- 大圆圈代表所有可能的函数空间。
- 小圆圈代表我们选择的函数类
F。 f*是全局最优函数(可能不在F内)。f̃是F内的最优函数。f_N是我们的算法从F中选出的函数。f_N到f̃的距离(风险差)是估计误差。f̃到f*的距离(风险差)是近似误差。
函数类大小与误差的权衡 ⚖️



函数类 F 的“大小”(或复杂度)如何影响这两种误差呢?请思考以下问题:



- 当
F非常小(例如只包含常数函数)时,近似误差和估计误差分别会怎样? - 当
F非常大(例如包含所有可能函数)时,情况又会如何?



以下是关键结论:
- 近似误差随着函数类
F的增大而减小。因为更大的F更可能包含接近f*的函数。 - 估计误差随着函数类
F的增大而增大。因为更大的F让算法更容易“记住”训练数据中的噪声,导致选出的f_N与f̃差异变大。



因此,存在一个权衡:
F太小:近似误差大,估计误差小。模型欠拟合,无法捕捉数据中的基本结构。F太大:近似误差小,估计误差大。模型过拟合,过度适应训练数据中的噪声。



我们的目标是选择一个大小适中的 F,使得总风险(近似误差 + 估计误差)最小。




另一种视角:偏差-方差分解 📉


在回归问题中,特别是使用平方损失时,误差有另一种著名的分解方式:偏差-方差分解。


假设 f_N 是基于数据学习到的回归函数,f* 是最优回归函数。对于平方损失,期望风险可以精确分解为:
公式: E[(f_N(X) - f*(X))^2] = Var(f_N(X)) + [E[f_N(X)] - f*(X)]^2
- 方差项
Var(f_N(X)):衡量模型f_N对于不同训练集的输出波动程度。它与估计误差的直觉类似,随模型复杂度增加而增加。 - 偏差项
[E[f_N(X)] - f*(X)]^2:衡量模型平均预测与真实最优函数之间的差距。它与近似误差的直觉类似,随模型复杂度增加而减小。


测试误差(风险)是偏差、方差及固有噪声之和。最佳的模型复杂度需要在低偏差(拟合能力)和低方差(稳定性)之间取得平衡。


正则化风险最小化:控制复杂度 🛡️


经验风险最小化的关键挑战在于如何选择合适的函数类 F 的大小。正则化风险最小化提供了一种替代方案。

其思想是:我们使用一个很大的函数类 F(例如所有多项式),但通过一个正则化项 Ω(f) 来惩罚过于复杂的函数。我们最小化的是正则化风险:

公式: R_{reg, N}(f) = R_n(f) + λ * Ω(f)

其中:
R_n(f)是经验风险。Ω(f)是衡量函数f复杂度的正则化项(例如,多项式系数向量的 L2 范数)。λ > 0是正则化常数,控制我们对经验风险小和函数简单这两个目标的权衡力度。




正则化风险最小化的原则是:
公式: f_{N,λ} = argmin_{f ∈ F} [R_n(f) + λ * Ω(f)]

现在,请思考正则化常数 λ 的影响:
- 当
λ → 0,算法几乎只最小化经验风险,趋向于在大函数类F中进行标准经验风险最小化,可能导致过拟合(估计误差大)。 - 当
λ → ∞,算法极度偏好简单的函数(Ω(f)小),可能选择非常简单的模型(如常数函数),导致欠拟合(近似误差大)。

因此,选择合适的 λ 与在经验风险最小化中选择合适的函数类大小 F 是等价的核心问题,目的都是在近似误差和估计误差(或偏差与方差)之间找到最佳平衡点。



总结 📝
本节课中我们一起学习了:
- 经验风险最小化:在给定函数类
F中,选择训练误差最小的函数作为学习器。 - 两种核心误差:
- 近似误差:源于函数类
F的表达能力有限,是确定性误差。 - 估计误差:源于训练数据有限,是随机误差。
- 近似误差:源于函数类
- 权衡之道:函数类
F越大,近似误差越小,但估计误差越大。机器学习的关键是选择合适的模型复杂度以平衡两者,避免欠拟合和过拟合。 - 偏差-方差分解:在平方损失回归中,误差可分解为方差(类似估计误差)和偏差(类似近似误差),提供了另一种理解模型复杂度的视角。
- 正则化风险最小化:通过在原目标函数中增加一个惩罚复杂度的正则化项,来隐式地控制模型复杂度。正则化常数
λ的大小直接影响了模型是偏向拟合数据还是保持简单。



理解这些基本概念和权衡,是设计有效机器学习算法和进行模型选择的基石。
08:什么是凸优化问题
在本节课程中,我们将学习凸优化问题的定义及其重要性。凸优化是机器学习中一个非常强大的工具,因为它能保证我们找到的解是全局最优解,而非局部最优解。我们将从凸集和凸函数的基本概念开始,逐步构建出凸优化问题的完整定义。

凸集的定义
在讨论凸优化问题之前,我们首先需要理解什么是凸集。直观上,凸集是一个“向外凸出”且内部没有“凹陷”的集合。
以下是凸集的一个关键特性:对于集合中的任意两点,连接这两点的线段上的所有点也必须包含在该集合内。
我们可以用数学公式来精确描述凸集。首先,我们需要一个向量空间结构,因为只有在向量空间中,我们才能谈论连接两点的线段。设 S 是向量空间的一个子集,如果对于 S 中的任意两点 x 和 y,以及任意参数 t ∈ [0, 1],都有:
t * x + (1 - t) * y ∈ S
那么集合 S 就是凸的。参数 t 控制着从点 y 到点 x 的移动。当 t=0 时,我们位于点 y;当 t=1 时,我们位于点 x。这个定义要求线段上的所有点都属于集合 S。
凸函数的定义
理解了凸集之后,我们来看凸函数。直观上,一个函数是凸的,意味着其图像上任意两点间的连线位于图像的上方。
更正式地,一个函数 F 是凸的,需要满足两个条件:
- 函数的定义域 D 必须是一个凸集。
- 对于定义域 D 中的任意两点 x 和 y,以及任意参数 t ∈ [0, 1],都有:
F(t * x + (1 - t) * y) ≤ t * F(x) + (1 - t) * F(y)
这个不等式的左边是函数在连接 x 和 y 的线段上某点 Z 的值。右边是函数在 x 和 y 两点值的线性插值。凸性要求函数在线段上任意点的值,都不高于该点对应的线性插值。
一个简单的判定方法是:对于二阶可导的一元函数,如果其二阶导数非负(F''(x) ≥ 0),则该函数是凸的。对于多元函数,如果其海森矩阵是半正定的,则该函数是凸的。
与凸函数相对的是凹函数,其定义只需将上述不等式中的“≤”改为“≥”。也存在既非凸也非凹的函数。
下水平集
凸函数有一个非常重要的性质:它的下水平集总是凸集。
下水平集是指,对于给定函数 G(x) 和常数 a,满足 G(x) ≤ a 的所有点 x 构成的集合。如果函数 G 是凸的,那么对于任意常数 a,其下水平集都是凸集。
这个性质是单向的。存在一些函数,其所有下水平集都是凸的,但函数本身并不是凸函数。
凸优化问题的定义
现在,我们具备了定义凸优化问题所需的所有要素。
一个标准的优化问题形式如下:
- 最小化 目标函数 F(x)
- 满足约束条件 G_i(x) ≤ 0,其中 i = 1, 2, ..., K
这里,F(x) 是我们希望最小化的目标函数,G_i(x) 是约束函数。
如果满足以下两个条件,则该优化问题是一个凸优化问题:
- 目标函数 F 是凸函数。
- 所有约束函数 G_i 都是凸函数(这意味着每个约束 G_i(x) ≤ 0 定义了一个凸的下水平集)。
关于等式约束 H(x) = 0,可以将其转化为两个不等式约束:H(x) ≤ 0 和 -H(x) ≤ 0。因此,上述形式具有普遍性。
在优化问题中,满足所有约束条件的点集称为可行域。对于凸优化问题,由于其目标函数和所有约束都是凸的,可行域本身也是一个凸集。
为什么凸优化如此重要?
凸优化问题之所以在机器学习等领域备受青睐,是因为它拥有一个极其理想的特性:任何局部最小值都是全局最小值。
对于非凸优化问题,目标函数可能像崎岖的山地,存在许多“山谷”(局部最小值)。使用梯度下降法等迭代算法时,算法可能陷入某个局部山谷而无法找到最低的那个“山谷”(全局最小值)。
然而,对于凸优化问题,目标函数的形状像一个“碗”。无论从哪个点开始执行梯度下降,最终都会到达碗底,即唯一的全局最优点。这保证了我们找到的解是问题的最佳可能解。
此外,凸优化问题的凸可行域结构也避免了算法在边界处陷入困境而无法探索更好解的情况。
总结
本节课我们一起学习了凸优化问题的核心概念:
- 凸集:集合中任意两点连线上的所有点仍属于该集合。
- 凸函数:函数图像上任意两点连线位于图像上方,其定义域必须是凸集。
- 下水平集:凸函数的下水平集是凸集。
- 凸优化问题:目标函数和所有不等式约束函数均为凸函数的优化问题。
- 核心优势:凸优化问题的任何局部最优解即是全局最优解,这为寻找可靠的最优解提供了根本保证。


理解这些基础是后续学习如何求解凸优化问题(例如使用拉格朗日乘子法)的关键。
09:线性最小二乘法
在本节课中,我们将要学习线性回归,并从最经典的算法——线性最小二乘回归开始。我们将介绍其基本设置、数学推导以及在不同情况下的解析解。
回归问题设置
上一节我们介绍了课程主题,本节中我们来看看线性回归的具体设置。在回归问题中,我们有一些训练数据,称为 (X_i, Y_i)。
X_i来自输入空间\mathcal{X}。在本课程中,我们首先假设\mathcal{X}是一个欧几里得空间,即\mathbb{R}^D。D是空间的维度。Y_i来自输出空间\mathcal{Y}。在回归问题中,\mathcal{Y}就是实数集\mathbb{R}。

我们的目标是:给定这些训练数据,找到一个能最好地拟合这些数据的函数。在线性回归中,我们考虑的函数是线性函数。
线性函数与损失函数
上一节我们定义了回归问题,本节中我们来看看要寻找的函数形式以及如何衡量其好坏。
线性函数的最简单形式是:
f(x) = \sum_{i=1}^{D} w_i x^{(i)} + b
其中:
x是\mathbb{R}^D空间中的一个点,其坐标为(x^{(1)}, ..., x^{(D)})。w_i是权重,每个坐标对应一个。b是偏移参数,有时也称为截距或阈值参数。
接下来,我们需要定义一个损失函数。在当前设置下,我们使用最小二乘损失函数,有时也因其数学背景称为 L2 损失。
线性最小二乘问题可以形式化地表述为:找到参数 w_1, ..., w_D(在 \mathbb{R}^D 中)和偏移参数 b,使得该线性函数 f 在训练数据上的经验最小二乘误差最小。
经验最小二乘误差定义为:
\frac{1}{n} \sum_{i=1}^{n} (y_i - f(x_i))^2
其中 1/n 是归一化因子,有时可以省略。
一个直观的例子
为了更具体地理解,我们来看一个例子。假设我们想预测一个人的鞋码,我们收集了每个人的多项测量值。
- 输入
x可能包括:身高、体重、收入、年龄等。每个人由一个D维向量表示。 - 输出
y是鞋码。
一个可能的线性预测函数(虚构的)可能是:
鞋码 = \frac{2}{10} * 身高 + 0 * 体重 + 0 * 收入 + 0 * 年龄 + 1
这个例子中,只有身高被用作主要预测因子,其他特征的权重为 0,+1 是偏移量。
矩阵表示法
上一节我们通过例子理解了问题,本节中我们引入更简洁的矩阵表示法,以便于推导和实现。
我们定义以下矩阵和向量:
- 数据矩阵 X:一个
n \times D的矩阵,其中每一行是一个训练样本(一个人),每一列是一个特征(一项测量)。
X \in \mathbb{R}^{n \times D} - 输出向量 y:一个
n维向量,包含所有训练样本的真实输出(鞋码)。
y \in \mathbb{R}^{n} - 权重向量 w:一个
D维向量,包含每个特征的权重。
w \in \mathbb{R}^{D}
使用这种表示法,线性函数 f(x) = w \cdot x + b 可以写为 f(x) = x^T w + b,其中 x^T w 是向量内积。
最小二乘问题现在可以写为:找到 w 和 b,最小化
\sum_{i=1}^{n} (y_i - (x_i^T w + b))^2
消除偏移参数 b
上一节我们得到了矩阵形式的表达式,但其中包含偏移参数 b,这使得问题不是纯粹的线性问题。本节中我们通过一个技巧消除它。
我们扩展数据矩阵 X 和权重向量 w:
- 定义新矩阵
\tilde{X} = [X, \mathbf{1}],即在X的右侧添加一列全为 1 的列。\tilde{X} \in \mathbb{R}^{n \times (D+1)}。 - 定义新向量
\tilde{w} = [w; b],即将偏移量b作为权重向量的最后一个元素。\tilde{w} \in \mathbb{R}^{D+1}。
现在,预测值可以写为:
\tilde{X} \tilde{w} = X w + b \mathbf{1}
其中 \mathbf{1} 是全1向量。这样,原问题转化为了一个没有偏移参数的纯线性问题:最小化
\frac{1}{n} \| y - \tilde{X} \tilde{w} \|^2
这里 \| \cdot \| 表示向量的欧几里得范数。
在后续讨论中,我们将默认处理这种无偏移的形式,并简记为最小化 \| y - X w \|^2(其中 X 和 w 已包含扩展后的维度)。
问题求解:满秩情况
上一节我们将问题转化为标准的线性最小二乘形式。本节中我们来看看如何求解这个优化问题。这是一个凸优化问题,幸运的是,我们可以得到解析解。
定理 1(满秩情况):假设数据矩阵 X 的秩为 D(即满秩)。那么线性最小二乘问题
\min_{w} \| y - X w \|^2
的解由下式给出:
w = (X^T X)^{-1} X^T y
维数检查:X 是 n \times D,X^T 是 D \times n,所以 X^T X 是 D \times D 的方阵。X^T y 是 D \times 1 的向量。最终结果 w 是 D \times 1 的向量,符合预期。
证明思路(优雅方法,使用矩阵微积分):
- 定义目标函数
L(w) = \frac{1}{2} \| y - X w \|^2(添加1/2是为了求导后形式更简洁)。 - 对
L(w)关于w求梯度,并令其为零:
\nabla_w L(w) = -X^T (y - X w) = 0 - 整理得到正规方程:
X^T X w = X^T y - 由于
X满秩,X^T X可逆,因此解为:
w = (X^T X)^{-1} X^T y
证明思路(详细方法,手动求导):
也可以将目标函数 L(w) 完全展开为分量求和的形式,然后对每个权重 w_k 求偏导数并令其为零,最终会得到与上述正规方程相同的方程组。
验证是最小值:
需要检查海森矩阵(二阶导数矩阵)\nabla^2_w L(w) = X^T X 是正定的。由于 X 满秩,X^T X 是正定矩阵,所有特征值大于零,因此找到的临界点确实是全局最小值。
广义逆与秩亏情况
上一节我们讨论了数据矩阵满秩的理想情况。但在实际应用中,矩阵可能不满秩。本节中我们引入广义逆来处理这种情况。
首先,回顾对称矩阵的谱分解:对于对称矩阵 A \in \mathbb{R}^{D \times D},可以分解为
A = \sum_{i=1}^{D} \lambda_i v_i v_i^T
其中 \lambda_i 是特征值,v_i 是对应的单位特征向量。
如果 A 可逆(即所有 \lambda_i \neq 0),其逆为
A^{-1} = \sum_{i=1}^{D} \frac{1}{\lambda_i} v_i v_i^T
广义逆(Moore-Penrose 伪逆) 的定义是,对于可能不满秩的对称矩阵 A,我们只对非零特征值进行求逆操作:
A^+ = \sum_{i: \lambda_i \neq 0} \frac{1}{\lambda_i} v_i v_i^T
符号 A^+ 常用来表示广义逆。它具有一些类似逆矩阵的性质,例如 A A^+ A = A 和 A^+ A A^+ = A^+。

问题求解:秩亏情况
现在,我们可以给出线性最小二乘在数据矩阵不满秩时的解。
定理 2(秩亏情况):假设数据矩阵 X 的秩 r < D。
- 线性最小二乘问题的一个解由下式给出:
w = (X^T X)^+ X^T y
其中(X^T X)^+是X^T X的广义逆。 - 解不是唯一的。如果
w是一个解,那么对于任何满足X v = 0的向量v,w + v也是一个解。 - 然而,所有这些解在训练数据上给出相同的预测值,即对于任何两个解
w_1和w_2,有X w_1 = X w_2。
证明概要:
- 求导后得到的正规方程依然是
X^T X w = X^T y。 - 可以验证,
w = (X^T X)^+ X^T y满足这个方程(利用广义逆的性质)。 - 由于
X不满秩,存在非零向量v使得X v = 0。那么w + v也满足正规方程,因为X^T X (w+v) = X^T X w + X^T X v = X^T X w + 0 = X^T y。 - 对于任意两个解
w_1和w_2 = w_1 + v,有X w_2 = X (w_1 + v) = X w_1 + X v = X w_1。
虽然解不唯一,但在训练集上的拟合效果相同。至于选择哪个解,以及如何在测试集上获得更好、更稳定的性能,我们将在后续关于正则化的课程中讨论。
数据点数量 n 与维度 D 的关系
最后,我们讨论一个在机器学习中非常重要的问题:训练样本数量 n 和特征维度 D 之间的关系。
考虑两种极端情况:
D << n(低维情况):例如,5个特征,5000万个样本。这是相对“无害”的情况。我们不太容易过拟合,因为数据量远大于模型复杂度(参数数量)。主要风险可能是欠拟合。D >> n(高维情况):例如,在生物信息学中,20个病人(样本),但测量了10000个基因表达水平(特征)。这是极具挑战性的情况。线性函数空间在高维下已经非常庞大,极易发生过拟合。这是一个活跃的研究领域,称为高维统计学。
线性最小二乘问题总是有解的。解的(不)唯一性取决于 X^T X 是否可逆(即 X 是否满秩),而这与 n 和 D 的相对大小有关,但更直接地取决于 X 的列向量是否线性独立。
总结
本节课中我们一起学习了线性最小二乘回归。
- 问题:给定
\mathbb{R}^D中的输入和\mathbb{R}中的输出,用线性函数拟合数据,并使用最小二乘损失。 - 技巧:通过扩展矩阵,将偏移项融入权重向量,将问题转化为无偏移的纯线性最小二乘问题。
- 求解:
- 这是一个凸优化问题,存在解析解。
- 若数据矩阵
X满秩,唯一解为w = (X^T X)^{-1} X^T y。 - 若
X不满秩,解不唯一。一个特解可由广义逆求得:w = (X^T X)^+ X^T y。所有解在训练集上预测相同。
- 维度考量:特征维度
D与样本数量n的关系至关重要。D >> n时需格外警惕过拟合。

这是最传统的回归方法,其解析解形式优美。然而,面对高维、共线或存在噪声的数据时,我们需要引入正则化等工具来改进模型,这将是后续课程的内容。
10:特征表示 🧩

在本节课中,我们将要学习如何将非向量空间中的抽象对象(如文本、分子、图像)表示为欧几里得空间中的向量。这是机器学习中处理多样化数据的关键步骤。我们将探讨几种常见的特征表示方法,并了解如何对特征进行标准化,以及如何通过特征映射引入非线性。
从抽象对象到向量表示
在上一讲中,我们主要讨论了输入空间为 R^D 的回归问题。然而,许多自然对象(如文本、分子、图像)本身并不具备向量空间结构。本节中我们来看看,为何将数据假设为存在于 R^D 中可能并不像看起来那么具有限制性。

通过特征映射,我们可以将这些抽象对象转化为向量。这个过程通常涉及以下几个步骤:
- 识别或设计一组能够描述对象特性的“特征”。
- 对每个对象,计算这些特征的值。
- 将这些值组合成一个 D 维向量。
以下是几个具体的例子:
示例一:文本的词袋表示 📄
处理文本时,一种简单而有效的方法是“词袋”表示法。
- 步骤:首先,收集所有文本中出现过的词汇,形成一个词汇表。接着,对每个文本,忽略不具信息量的词(如冠词、代词),并进行词干提取(例如将“trees”还原为“tree”)。最后,用向量表示文本,向量的每个维度对应词汇表中的一个词,其值为该词在文本中出现的次数(或简单的0/1表示是否存在)。
- 向量化:一个文本最终被表示为一个高维稀疏向量 x ∈ R^V,其中 V 是词汇表大小,大部分元素为0。
示例二:生物信息学中的字符串表示 🧬
对于生物序列(如DNA或蛋白质序列),可以通过统计固定长度的子串(k-mer)出现频率来向量化。

- 步骤:给定一个字母表(如{A, C, T, G})和子串长度 k,枚举所有可能的 k 长子串。然后,像滑动窗口一样扫描目标序列,统计每个特定子串出现的次数。
- 向量化:序列被表示为一个向量,其维度为 |字母表|^k,每个元素的值是对应子串的计数。
示例三:分子的图结构表示 ⚗️
分子可以看作图(原子为节点,化学键为边)。我们可以通过统计图中特定子图(称为“模体”)的数量来向量化。
- 步骤:定义一组有意义的子图模体,例如:边、三角形、星形结构等。对于每个分子(图),计算这些预定义模体在其中出现的次数。
- 向量化:分子被表示为一个向量 x ∈ R^M,其中 M 是模体类型的数量,x_i 是第 i 类模体的计数。
示例四:用户-物品交互的表示 🛒

在推荐系统中,用户和物品(如书籍)可以通过他们的交互历史来表示。
- 表示物品:一本书可以表示为一个向量,其维度是用户数量,每个元素表示相应用户是否购买过该书(1/0)。即,用矩阵的行来表示物品。
- 表示用户:一个用户可以表示为一个向量,其维度是物品数量,每个元素表示该用户是否购买过相应物品。即,用矩阵的列来表示用户。
通用方法:特征工程 🛠️

上述例子都遵循一个通用模式,即特征映射。我们定义一组特征函数 {φ_1, φ_2, ..., φ_D},每个函数从对象中提取一个数值特征。对于一个抽象对象 o,其特征表示为:
Φ(o) = [φ_1(o), φ_2(o), ..., φ_D(o)]^T ∈ R^D

这种方法虽然简单,但在许多应用中作为基线方法非常有效。
特征标准化 📏

将不同对象转化为向量表示后,我们通常需要对这些特征进行标准化,以确保它们在模型中具有可比的影响力。
考虑一个预测鞋码的例子,特征可能包括年龄(0-100)、身高(1500-2000毫米)、收入(1000-5000欧元)。这些特征具有完全不同的尺度和范围。如果直接使用,在优化模型参数时,尺度大的特征(如身高以毫米计)会天然占据主导地位,影响正则化的效果,并使得参数解释变得困难。
标准化的常见步骤如下:

- 中心化:使数据均值为零。计算每个特征维度上的均值 μ_j = (1/N) Σ_{i=1}^N φ_j(x_i),然后对每个数据点进行变换:φ‘_j(x_i) = φ_j(x_i) - μ_j。
- 缩放:使数据具有单位方差(或统一尺度)。计算每个特征维度上的标准差 σ_j,然后进行变换:φ’‘_j(x_i) = φ‘_j(x_i) / σ_j。经过这两步,每个特征维度上的数据近似服从均值为0、标准差为1的分布。

标准化后的数据有助于提高许多机器学习算法的数值稳定性和性能。


引入非线性:基函数扩展 🌀
线性模型有时表达能力不足。为了捕捉数据中的非线性关系,我们可以使用基函数扩展(或特征映射)的技巧。
其核心思想是:我们不再直接对原始特征 x 进行线性建模,而是先通过一个非线性变换 Φ(x) 将其映射到一个新的高维空间,然后在这个新空间中学习线性模型。模型形式为:
f(x) = w^T Φ(x) = Σ_{j=1}^D w_j φ_j(x)
请注意,函数 f 对于参数 w 是线性的,但对于输入 x 可能是非线性的,这取决于 φ_j 的选择。

以下是几个例子:

- 拟合周期函数:要预测一天内的温度变化,可以使用傅里叶基函数,如 φ_k(x) = sin(kx) 和 cos(kx)。
- 拟合多项式趋势:可以使用多项式基函数,如 φ_k(x) = x^k。
- 自定义特征提取:就像前面文本处理的例子,φ_1(x) 可以统计“足球”一词出现的次数,φ_2(x) 统计文本长度等。
模型求解与注意事项

在定义了特征映射 Φ 之后,我们将所有训练数据 x_i 转换为新的特征矩阵 Ψ,其中第 i 行是 Φ(x_i)^T。原来的线性回归问题 y ≈ Xw 就变成了 y ≈ Ψw。求解方法(如最小二乘法)在形式上完全不变。
关于基函数扩展,有几点需要注意:
- 基函数的选择:通常依赖于领域知识,在见到数据之前就预先设定。更复杂的方法是“字典学习”,即从数据中学习基函数,但这超出了本课程范围。
- 特征维度 D:这是一个关键权衡。D 太小可能导致模型欠拟合,无法捕捉复杂模式;D 太大则容易导致过拟合,并且计算量增加。例如,即使对于二次多项式,如果原始维度是 d,则扩展后的特征维度约为 O(d^2),增长很快。
- 线性与非线性:最终模型在参数上是线性的,这使得许多线性模型的优化和理论工具仍然适用,同时又能拟合输入空间中的非线性关系。
总结 🎯

本节课中我们一起学习了机器学习中特征表示的核心思想。
- 我们了解到,通过特征映射 Φ,可以将文本、图、序列等抽象对象有效地表示为欧几里得空间 R^D 中的向量,从而能够应用广泛的机器学习算法。
- 我们探讨了词袋、子串统计、图模体计数等多种具体表示方法。
- 我们强调了特征标准化(中心化和缩放)的重要性,它确保了不同特征在模型中的公平性。
- 最后,我们介绍了通过基函数扩展来引入非线性模型的方法,即先对输入进行非线性变换,再在新空间中进行线性学习。这让我们在保持模型求解简便性的同时,大幅提升了模型的表达能力。

掌握这些特征工程的基本技巧,是构建有效机器学习模型的重要基础。
09b:岭回归 📈

在本节课中,我们将要学习普通最小二乘法的一个正则化版本,它被称为岭回归。我们将探讨其动机、数学形式、求解方法以及正则化参数的影响。
从普通最小二乘法到岭回归
上一节我们介绍了普通最小二乘法。本节中我们来看看它的一个正则化变体。

我们已经在上一讲中看到,如果不使用任何正则化,当数据空间的维度非常高时,最小二乘法可能会遇到问题。此外,标准普通最小二乘回归设置可能不是最优的,还有其他原因,我们稍后将进行讨论。
现在,我们想看看这个算法的一个变体,它被称为岭回归。
岭回归的动机
我们主要从两个角度来理解引入岭回归的必要性。

第一个角度是关于解的数值稳定性。回顾普通最小二乘法的解,特别是在数据矩阵不满秩的情况下,我们遇到了解不唯一的问题。这意味着我们的问题可能有许多解,而我们甚至不知道哪一个更好。此外,计算矩阵的伪逆时,如果特征值接近0,会导致数值上的不稳定,这是我们希望避免的。
第二个角度是关于模型参数的规模。在标准的最小二乘回归公式中,没有任何机制阻止权重参数 w_i 变得非常大。如果这些参数变得非常大,就会给我们的结果引入很大的方差。考虑一个函数 f(x) = 2*x1 + 100*x2 + 200*x3。由于 x2 和 x3 的系数很大,即使 x2 或 x3 有微小的扰动(例如数据中的噪声),也会导致函数值 f(x) 产生巨大的波动,从而带来高方差。为了避免这种效应,我们希望引入一种正则化,试图减小这类参数的规模。同时,这也能解决第一个关于数值稳定性的问题。
岭回归的数学定义
我们现在考虑以下的正则化问题,它将被称作岭回归。

输入空间 X 是任意空间,输出空间是 R。我们固定一组基函数 {φ_1, ..., φ_D},然后使用一个函数,即这些基函数的线性组合:f(x) = Σ_{i=1}^{D} w_i * φ_i(x)。
我们希望使用一个惩罚系数 w_i 大小的正则化项。我们定义一个函数 Ω(f),它将作为优化问题中的正则化项。在这个情况下,Ω(f) 简单地等于权重向量 w 的欧几里得范数的平方。我们说,如果这个范数小,我们就喜欢这个函数。
以下是岭回归的优化问题:

我们想要最小化经验风险(即真实输出 y_i 与预测输出 Φ * w 之间的最小二乘损失,用 L2 范数表示)加上一个正则化项。具体公式如下:
目标函数: min_w (1/n) * ||y - Φw||^2 + λ * ||w||^2

其中:
Φ是设计矩阵,其第i行是第i个样本在所有基函数上的值。y是输出向量。λ是一个需要预先设定的权衡常数(正则化参数),我们稍后会讨论如何选择它。||w||^2是权重向量的 L2 范数平方。
这个和要小,理想情况下要求两项都小。一方面,我们希望经验风险小,这意味着函数对训练数据拟合得好。另一方面,我们也希望正则化项 ||w||^2 小,这意味着我们喜欢系数较小的函数。
岭回归的解析解
现在,我们想要解决这个优化问题。令人惊讶的是,这个问题同样有一个解析解。
定理: 岭回归问题的解 w_{n,λ} 由以下公式给出:
w_{n,λ} = (Φ^T Φ + nλ I)^{-1} Φ^T y
其中 I 是 D×D 的单位矩阵。


在证明之前,让我们先理解这个定理的含义。
- 我们不再对矩阵
Φ是否满秩做任何假设。无论原始设计矩阵Φ是什么,这都将是解。 - 解的形式涉及矩阵求逆。这意味着我们希望这个矩阵总是可逆的,否则该陈述就没有意义。我们需要证明这个矩阵总是可逆的。
- 与普通最小二乘解
(Φ^T Φ)^{-1} Φ^T y相比,唯一的微小差别是多了nλ I这一项。这个蓝色标记的矩阵是一个对角矩阵,在对角线上每个元素都增加了nλ。这确保了矩阵是可逆的,然后我们就可以计算解了。

定理的证明

证明思路与之前类似。
- 凸性: 目标函数
J(w) = (1/n)||y - Φw||^2 + λ||w||^2关于w是凸的。因为第一项是凸的(已证),第二项(平方范数)也是凸的,且定义域R^D是凸集。 - 求梯度并设为零: 为了找到最小值,我们计算目标函数关于
w的梯度并令其为零。
∇J(w) = -(2/n) Φ^T (y - Φw) + 2λ w = 0
重新排列项,我们得到:
(Φ^T Φ + nλ I) w = Φ^T y - 矩阵可逆性: 要解出
w,我们需要对左边的矩阵(Φ^T Φ + nλ I)求逆。接下来我们证明这个矩阵总是可逆的。
证明矩阵 (Φ^T Φ + nλ I) 可逆:
- 矩阵
A = Φ^T Φ是对称矩阵。对称矩阵存在由特征向量构成的正交基,且其特征值都是实数。 - 此外,由于
A具有Φ^T Φ的形式,它是一个半正定矩阵,这意味着它的所有特征值σ_i都满足σ_i ≥ 0。 - 现在考虑矩阵
A + nλ I。一个线性代数中的基本事实是:如果σ是矩阵A的一个特征值,对应特征向量为v,那么σ + nλ就是矩阵A + nλ I的一个特征值,对应同一个特征向量v。 - 因为
σ_i ≥ 0且λ > 0(正则化参数通常为正),所以σ_i + nλ > 0。 - 因此,矩阵
A + nλ I的所有特征值都严格大于零,这意味着它是满秩的,从而是可逆的。
既然矩阵可逆,我们就可以解出 w:
w = (Φ^T Φ + nλ I)^{-1} Φ^T y
证明完毕。
一个简单示例

让我们看一个简单的应用示例。假设真实函数是一个周期函数加上噪声。作为基函数,我们简单地取前10个傅里叶正弦基函数:φ_k(x) = sin(k*x),其中 k 从1到10。
我们的目标是:给定一些训练数据,找到形式为 f(x) = Σ_{k=1}^{10} w_k sin(k*x) 的最佳函数,即找到系数 w_k。
在一张示例图中:
- 黑点是训练数据点。
- 黑线是真实的回归函数(即
E[y|x])。 - 红线是普通最小二乘拟合(无正则化)。
- 蓝线是岭回归拟合。
可以观察到,红线波动更大,因为它倾向于过拟合,或者说具有更高的方差。岭回归的蓝线方差要小得多,看起来更平滑。在这个具体问题中,哪个解更好可能值得商榷,但我们可以清楚地看到,岭回归通过控制参数大小,有效降低了模型的方差。
正则化参数 λ 的选择
这里有一个非常重要但尚未讨论的点:参数 λ 的选择。

我们的优化问题是:最小化 经验风险 + λ * 正则化项。根据 λ 的选择,会发生不同的事情。
请思考一下 λ 的作用:
- 当
λ非常小(极端情况λ -> 0)时会发生什么? - 当
λ非常大时会发生什么? - 估计误差和近似误差在这些情况下如何变化?
为了回答这个问题,我们借助一个图示来说明。图中展示了在不同 λ 下,对同一问题多次独立实验的拟合结果(左列)及其平均(右列,红线),绿线是真实函数。
- λ 很大(强正则化): 优化问题主要由正则化项主导。我们试图找到一个
w范数很小的函数,几乎不关心训练误差。结果学到的函数接近常数0(或一个很小的值)。此时,模型的偏差(Bias)很高(近似误差大),因为无法拟合复杂函数;但方差(Variance)很低,因为不同实验的结果非常相似。 - λ 很小(弱正则化,接近普通最小二乘): 优化问题主要由经验风险主导。我们尽可能最小化训练误差,不太关心正则化。结果可能对训练数据拟合得很好,但方差很高,因为不同实验的拟合结果差异很大。平均来看可能不错,但单个模型的稳定性差。
- λ 适中: 在偏差和方差之间取得平衡。方差比弱正则化时低,偏差比强正则化时低。测试误差(泛化误差)通常在这个区域达到最小。

下图展示了偏差-方差分解随 log(λ) 变化的典型曲线:
- 偏差(蓝线): 随
λ增大而单调增加。 - 方差(红线): 随
λ增大而单调减少。 - 测试误差(紫线): 是偏差和方差的综合体现,通常呈现一个U形或类似形状。存在一个“最佳点”(图中
log(λ) ≈ 0附近),使得测试误差最小。
在实践中,我们无法预先知道这个最佳 λ。在后续课程中,我们将看到如何使用交叉验证等技术来尝试找到这个最佳点。


历史、术语与名称由来
- 历史: 岭回归由俄罗斯数学家 Tikhonov 于1943年(二战期间)在解决积分方程逆问题的背景下首次提出,旨在提高数值稳定性。因此,该算法也常被称为 Tikhonov 正则化。在统计学文献中,它由 Hoerl 和 Kennard 于1970年独立提出并命名。
- 名称“岭”的由来: 名称“岭回归”(Ridge Regression)形象地描述了其解的形式。考虑设计矩阵
X^T X,将其元素值按位置绘制成三维图,可能看起来像起伏的山地。在岭回归中,我们在矩阵X^T X的对角线上加上了λI,这使得对角线上的值显著高于非对角线上的值。在三维图中,这就像在原本起伏的地形上,沿着对角线突起了一条长长的山脊(Ridge),因此得名。

总结 🎯
本节课中我们一起学习了岭回归。

岭回归问题设定如下:
- 我们仍处于标准回归框架中,输入数据在
R^D或通过基函数映射到R^D,输出是R。 - 我们使用平方损失。
- 函数类是线性函数,由参数
w参数化(隐式包含了偏移项b,如上节课所述)。 - 与普通最小二乘法不同,我们现在有一个正则化的经验风险最小化问题。
- 我们通过惩罚权重向量的平方 L2 范数
||w||^2来避免使用具有大系数的函数。
因此,我们的优化问题是:
min_w (1/n) * ||y - Φw||^2 + λ * ||w||^2

有趣的是,这个问题和普通最小二乘法一样,仍然有一个解析解,形式非常相似,只是在求逆的矩阵对角线上增加了一个“岭” λI。这使得问题数值上更稳定,并有助于防止过拟合。
10b:Lasso算法详解 🎯
在本节课中,我们将要学习一种名为Lasso的回归算法。Lasso是“最小绝对收缩和选择算子”的缩写,它是对普通最小二乘回归的一种改进,通过引入不同的正则化项来达到特定的目标。
算法核心思想
上一节我们介绍了岭回归及其L2正则化。本节中我们来看看Lasso,它使用L1范数作为正则化项。Lasso算法相对较新,于1996年被提出。
该正则化形式的核心目标是实现解的稀疏性。稀疏性意味着在众多参数W1到WD中,我们希望其中许多参数的值恰好为0。
为什么追求稀疏性?
以下是追求稀疏解的两个主要原因:
- 计算原因:当数据维度极高时,例如百万维,如果模型只需要评估其中10个维度而非全部,将显著提升计算效率,特别是在涉及矩阵乘法等操作时。
- 可解释性原因:这在当今尤其重要。考虑一个医疗诊断场景,我们有病人的体温、年龄、饮食、血液成分等200项测量值。我们希望算法能诊断疾病。
如果我们使用岭回归或普通最小二乘,得到的解向量W中许多分量可能都较大。这使得医生难以解读:为何是这个特定的线性组合?我们能否信任这个结果?

我们更希望算法只挑选出少数关键特征,例如血压和年龄,而将不重要的特征(如饮食)对应的参数设为0。这样,医生在查看算法结果时,可以凭借专业知识判断:算法找出的这10个特征是否合理?如果算法找出了已知与疾病无关的年龄特征,我们可能不信任它;反之,如果找出了已知重要的血压特征,我们则会更信任它。在医疗等需要专家信任算法结果的领域,这种可解释性至关重要。Lasso是实现这种可解释性的一种简单方法。
如何实现稀疏性:从理想目标到可行方案
回到问题本身,我们寻找的函数形式与之前相同:f(x) = Σ Wi * φi(x)。但我们希望系数Wi中许多为0,这样的解称为稀疏解。如果一个向量的大部分元素为0,则称该向量是稀疏的。
现在的问题是:如果你想强制实现稀疏性,什么样的正则化器是好的选择?
我们采取与岭回归相同的思路:最小化经验风险加上λ乘以正则化项。正则化器应该在我们喜欢的函数上取较小的值。我们喜欢稀疏的解向量W。
一个朴素的想法是:直接惩罚非零分量的数量。我们可以使用函数Ω0(W),它统计向量W中非零系数的个数。公式可表示为:
Ω0(W) = Σ I(Wi ≠ 0),其中I(·)是指示函数。
这个函数的值在0到D之间,告诉我们有多少个非零系数。这是惩罚非零系数最自然的函数。
然而,这个函数存在严重缺陷。请思考一下,在正则化最小二乘回归的背景下,这个函数有什么缺点?
主要问题是:Ω0(W)不是凸函数。它是一个离散函数,仅仅检查有多少个非零系数。离散函数通常难以优化。
考虑一个直观例子:假设向量W = [0, 0, 0.001, 2, 3]。它有5个坐标,其中3个非零,所以Ω0(W) = 3。注意中间那个分量0.001非常小。由于噪声或优化等原因,这个参数可能没有完全归零。这个向量的惩罚值是3。
现在考虑另一个向量W̃ = [0, 0, 0, 2, 3]。这里Ω0(W̃) = 2。这两个向量几乎相同,仅在一个坐标上有微小的差别(0.001与0)。在实践中,采用哪个向量可能没有实质区别,但它们的惩罚值却不同。
关键在于:只要一个分量从0变为任何非零数,无论这个数多小,惩罚值就会从2跳变到3。这不是连续的变化。在优化中,我们通常处理连续函数,因为我们可以说“我减小某个参数,惩罚值会随之变化”。但在这种离散跳变的情况下无法做到。这使得此类优化问题非常困难。这个优化问题是NP难的。
因此,尽管Ω0(W)是我们的理想目标,但在实践中无法直接使用。
P范数与凸松弛
作为替代,我们将研究向量略微不同的范数。首先,我需要介绍什么是P范数。
对于一个定义在R^D空间中的向量W,其P范数定义为:
||W||_p = ( Σ |Wi|^p )^(1/p)
其中p是一个正数。
当p ≥ 1时,该函数是一个范数,并且是凸函数。当p=2时,这就是我们熟悉的欧几里得范数(L2范数)。
当p在0和1之间时(0 < p < 1),上述表达式不是一个范数(不满足范数的某些公理),也不是凸函数。下图展示了不同p值对应的单位球(满足||W||_p = 1的点的集合):
p=2(红色圆形):是凸集。p=1(蓝色菱形):是凸集。p=0.5等(黑色星形):不是凸集。p=0:可以定义为||W||_0 = Σ I(Wi ≠ 0),这正是我们想要的Ω0(W)。它不是范数,也不是凸函数,甚至是离散的。
现在我们面临一个典型的机器学习问题:我们想优化某个函数(这里是Ω0),但由于它是非凸的或离散的而无法直接优化。常见的做法是尝试解决原问题的凸松弛版本,即寻找一个最接近原函数的凸函数来近似它。
我们希望最小化p=0的“范数”。从几何上看,p=0的单位球形状像是坐标轴。我们自问:最接近p=0的凸范数是哪个?观察图像,随着p从0增加,当p=1时我们首次得到一个凸范数(蓝色菱形)。因此,作为一种启发式规则,我们选择p=1的范数作为正则化器。
目前这只是一个启发式选择,没有保证这样一定能得到稀疏解。但接下来我们将看到,有理由相信它确实能起作用。
L1正则化为何能诱导稀疏性:几何视角
为了理解L1正则化如何导致稀疏性,我们需要从几何角度审视这个优化问题。下图绘制了参数空间(W1和W2)中的情况。
- 绿色等高线:表示经验风险(训练误差)。中心点的经验误差最小,向外围移动误差增大。
- 红色区域:表示正则化项为常数的点集。
- 在岭回归(L2)中,红色区域是一个圆(
||W||_2 = 常数)。最优解是绿色等高线与红色圆的切点。注意,这个解(切点)的W1和W2通常都非零,因此不是稀疏解。 - 在Lasso(L1)中,红色区域是一个菱形(
||W||_1 = 常数)。最优解是绿色等高线与红色菱形的切点。关键观察:由于菱形的尖角位于坐标轴上,等高线很可能在菱形的角点处(例如W1=0的轴上)与之相切。这意味着最优解的一个分量(如图中的W1)恰好为0,从而实现了稀疏性。
- 在岭回归(L2)中,红色区域是一个圆(
如果使用p<1的范数,单位球的形状会更“星形”,更尖锐地指向坐标轴,使得解落在坐标轴上的可能性更大。这从直觉上解释了为什么L1范数比L2范数更能鼓励稀疏解。

另一个原因是两种范数对系数大小的惩罚方式不同:
- L2范数的平方:
||W||_2^2 = Σ Wi^2。它对大系数施加了极其严厉的惩罚(因为平方放大效应),因此不惜一切代价避免出现大系数,但对许多小系数则不太在意。 - L1范数:
||W||_1 = Σ |Wi|。它对大系数的惩罚相对温和(线性增长)。因此,模型可以“承受”让一些小系数消失(变为0),同时保留少数较大的系数。而在L2正则化下,同样的情形不会发生。
Lasso算法正式定义
现在,我们整合所有要素来正式定义Lasso算法。
- 输入空间:任意空间
X(但需通过特征映射φ转换到R^D)。 - 输出空间:实数
R(回归问题)。 - 函数空间:特征
φ_i的线性组合,即f(x) = Σ Wi * φi(x)。 - 损失函数:仍然是L2损失(平方误差),即
(yi - f(xi))^2。 - 正则化器:L1范数,即
||W||_1 = Σ |Wi|。 - 优化问题:找到参数
W,最小化以下目标函数:
L(W) = Σ (yi - Σ Wj*φj(xi))^2 + λ * Σ |Wj|
其中,第一项是经验风险(L2损失),第二项是L1正则化项。
Lasso的目标函数是凸函数(凸损失+凸正则项)。然而,与岭回归和普通最小二乘不同,Lasso没有解析解。我们无法通过求导并令其为零得到一个封闭形式的解公式。
因此,在实践中,我们需要使用优化算法来数值求解。通常的做法是:
- 将Lasso优化问题输入一个凸优化求解器。
- 求解器会输出最优的参数
W。
当然,存在一些特别适合Lasso问题的求解器(例如坐标下降法、近端梯度法等),它们比通用的凸优化求解器更高效,但这超出了本课程的范围。
示例与效果
我们通过一个示例来直观感受Lasso的效果。任务是用多项式拟合一个正弦波数据(加入噪声)。
- 黑色点:数据点。
- 黑色曲线:真实的正弦函数(目标)。
- 红色曲线:岭回归的拟合结果。
- 蓝色曲线:Lasso的拟合结果。
仅从拟合曲线看,两者都能在一定程度上拟合数据,岭回归的曲线可能略显波动。
更具启发性的是下面的分析图,它展示了随着正则化参数λ变化(横轴,对数尺度),各种指标的变化:
- 绿线(Lasso)与红线(岭回归):表示解向量中非零分量的数量。
- 对于岭回归,无论
λ如何变化,几乎所有分量都是非零的,没有稀疏性。 - 对于Lasso,当
λ很小(接近0,即几乎不正则化)时,所有分量非零。随着λ增大,非零分量数量急剧下降。当λ极大时,所有分量都被压缩为0。
- 对于岭回归,无论
- 训练误差与测试误差:
- 黑色虚线:Lasso的测试误差。存在一个
λ的“甜点”(图中约在10^-2处),使得测试误差最小。 - 其他曲线:分别展示了Lasso和岭回归的训练误差。随着
λ增大,两者训练误差都会上升(因为更注重正则化而非完美拟合训练数据)。在最优λ附近,Lasso和岭回归都能达到相近的测试误差水平,但Lasso是用更少的非零特征(稀疏模型)达到的。
- 黑色虚线:Lasso的测试误差。存在一个
历史背景与总结
- 名称由来:Lasso是“Least Absolute Shrinkage and Selection Operator”(最小绝对收缩和选择算子)的首字母缩写。
- 历史意义:由Tibshirani于1996年提出。Lasso开启了一个新的趋势,即利用L1正则化来追求稀疏性,这一思想后来广泛应用于统计学和机器学习的诸多领域,例如低秩矩阵恢复等。

本节课总结:
我们一起学习了Lasso回归算法。我们从追求模型稀疏性的动机出发,探讨了直接使用非零计数(L0“范数”)作为正则化器的不可行性。进而引入了P范数的概念,并说明通过使用L1范数作为正则化器的凸松弛,可以有效地诱导出稀疏解。我们从几何角度理解了L1正则化如何通过其菱形等高线,使解更容易落在坐标轴上。最后,我们正式定义了Lasso的优化问题,指出其作为凸问题虽无解析解但可用优化算法求解,并通过示例观察了其产生稀疏模型的效果。Lasso是平衡模型精度与可解释性的重要工具。
11:交叉验证 📊












在本节课中,我们将要学习交叉验证。交叉验证是一种系统性的方法,用于为特定算法在特定问题上找到最佳的参数选择。












为什么需要交叉验证?







上一节我们介绍了多种机器学习算法。几乎所有我们见过的算法都有一个需要设置的参数。以K近邻分类器为例,它有一个参数 K,表示需要考虑多少个邻居。根据我们如何设置这个参数 K,模型可能会过拟合、欠拟合或表现刚刚好。




那么,问题来了:我们如何为特定的应用找出最佳的参数 K 呢?
















交叉验证的工作原理






选择的方法是交叉验证。本节中我们来看看交叉验证在实践中是如何工作的。







交叉验证的输入是你的训练数据点,以及一组你想要测试的不同参数组合(例如,所有你想测试的 K 值)。






以下是交叉验证的步骤:







- 划分数据:首先,将你的训练集随机划分为 K 个大小相等的部分。这些部分通常被称为“折”。
- 迭代训练与验证:对于你想要尝试的每一个参数(例如,每一个 K 值),进行以下操作:
- 依次将每一折作为验证集,其余 K-1 折作为训练集。
- 用当前的参数在训练集上训练模型。
- 在留出的验证集上计算验证误差。
- 计算平均误差:对同一个参数,在所有 K 次验证中得到的误差取平均值。这个平均值就是该参数的验证误差。
- 选择最佳参数:对所有尝试的参数重复上述过程,选择验证误差最小的那个参数组合,记为 S*。






这个过程可以用公式更精确地描述。假设我们将训练集划分为 K 折,对于第 k 折,训练集是除第 k 折外的所有折,验证集就是第 k 折。对于参数组合 S,在第 k 折上的验证误差记为 error(S, k)。那么,参数 S 的交叉验证误差为:






CV_error(S) = (1/K) * Σ_{k=1}^{K} error(S, k)





然后,我们选择使交叉验证误差最小的参数:





S = argmin_{S} CV_error(S)*








一旦你理解了原理,就会发现它其实非常简单。











交叉验证后的步骤







通过交叉验证选出了最佳参数组合 S* 后,你需要进行最后两步:






- 最终训练:使用选定的最佳参数 S*,在整个训练集上重新训练模型。因为你现在希望利用所有可用的数据来得到最好的分类器。
- 最终测试:在一个全新的、独立的测试集上评估最终模型的性能,得到测试误差。这个测试误差是对模型真实泛化能力的一个估计。






⚠️ 极其重要的注意事项:测试集必须完全独立于训练过程。你绝对不可以在参数选择或模型调整的任何阶段使用测试集。如果你根据测试集的结果返回去调整模型或参数,那么测试集就失去了独立性,你得到的“测试误差”将是有偏的,不能反映模型的真实泛化能力。在实践中,如果数据有限,你至少需要清楚这一点并明确说明。













实践中的问题与考量






以下是关于交叉验证的一些常见实践问题:





- 折数 K 的选择:通常选择 K=5 或 K=10。折数的选择对结果影响通常不大。
- 参数空间的大小:当需要调节多个参数时,参数组合的数量会呈指数级增长。例如,支持向量机有参数 C 和核宽度 σ,如果每个参数有6个候选值,就有36种组合。进行5折交叉验证意味着需要训练 36 * 5 = 180 次。如果单次训练耗时很长,总时间会变得不可接受。
- 解决方案:对于多参数调优,可以使用更智能的方法,如在参数空间中进行网格搜索的变体或梯度下降。许多机器学习工具箱都实现了这些方法。你需要了解你所用的工具包使用的是哪种策略。
- 交叉验证的过拟合:交叉验证过程本身也可能发生过拟合,尤其是在数据量很小或参数空间搜索过于精细时。
- 训练集大小:在交叉验证中,每次用于训练的样本量是
(K-1)/K,略小于最终使用整个训练集的大小。对于小数据集,这可能影响参数选择。













交叉验证的优缺点



缺点:
- 计算成本高:尤其当参数多时。
- 理论分析复杂:由于数据划分间的依赖性,为交叉验证的一致性等性质提供严格的理论保证比较困难。
优点:
- 系统性:它是目前唯一能系统性地为学习算法寻找最佳参数的程序化方法。
- 必要性:参数的默认值通常不是最优的,最佳参数取决于具体问题和数据。因此,只要算法有参数,就必须使用交叉验证(或类似方法)来选择它们。在使用任何机器学习软件时,都应检查它是否自动执行了交叉验证来调参,否则结果可能不可信。




总结







本节课中我们一起学习了交叉验证。我们了解到,交叉验证是一种通过将训练数据划分为多个“折”,并迭代地使用其中一部分作为验证集来评估不同参数性能的系统方法。其核心目标是找到使模型泛化能力最佳的参数组合。我们强调了保持测试集独立性的极端重要性,并讨论了交叉验证在实践中的优缺点。记住,交叉验证是调节模型参数、避免盲目猜测的关键工具。
12:风险最小化与概率方法
在本节课中,我们将探讨机器学习中两种核心思想——经验风险最小化与概率方法——之间的联系。我们将看到,看似不同的两种思路,实际上可以相互转化,并为彼此提供深刻的解释。
概述
到目前为止,我们介绍回归算法的动机都源于经验风险最小化和正则化风险最小化的视角。我们总是从一个损失函数开始,例如最小二乘损失,可能会加上一个正则化项,然后求解最小化“损失 + λ * 正则化项”的问题。
许多同学也在同时学习Philip Hennig教授的概率学习课程。我们这门课中的方法与那门课中的方法有着非常紧密的联系。本节旨在简要揭示这两种方法之间的关系,并展示如何将我们课程中的方法(至少在部分情况下)转化为Philip Hennig课程中的概率方法。这是一个非常有趣且深刻的主题,虽然我们只通过几页幻灯片来一窥究竟,但它能帮助你理解这两种思路的内在联系。如果你对此感兴趣,可以进一步阅读相关材料,例如Kevin Murphy的《概率机器学习》一书。
风险最小化与最大似然估计
上一节我们介绍了风险最小化的基本框架,本节中我们来看看它与概率方法中的最大似然估计有何关联。
这种转换的核心在于:我们框架中的经验风险最小化,在很大程度上等同于概率框架中的最大似然估计。
以下是其工作原理:
- 在我们的框架中,我们总是从一个函数类和一个损失函数出发,然后希望根据定义的损失函数,找到该类中的最佳函数。
- 在概率设定中,你总是从对数据分布的假设开始。我们假设数据是由一个线性模型生成的。
具体来说,我们假设观测到的输出变量 y 是输入的线性函数加上一些噪声:
y = x^T w + ε
这里的 w 是真实的底层线性函数参数。我们假设存在一个以这种方式生成数据的线性机制,并希望发现这个 w 向量是什么。噪声使问题变得困难,因为我们看不到真实数据,只能看到它的带噪版本。
在概率设定中,我们需要做出假设。第一个假设是噪声 ε 服从正态分布。在许多情况下,如果噪声由多种来源叠加而成,根据中心极限定理,噪声通常会近似服从正态分布。因此,假设噪声服从正态分布是合理的。
我们假设噪声分布是均值为零、方差为 σ² 的正态分布。在一个D维设定中,我们进一步假设其协方差矩阵在所有方向上具有相同的扩展,即单位矩阵乘以噪声的幅度(σ² * I)。
将这个噪声模型转化为观测信号 y 的分布,给定输入 x 和真实参数 w,y 也服从正态分布。其均值是真实的线性预测值 x^T w,方差来自噪声项。因此:
P(y | x, w) = N(y; x^T w, σ²)
这就是我们做出的假设。
现在,最大似然框架告诉我们,我们希望找到参数 w,使得观测数据的似然最大化。似然指的是在给定输入 x 和参数 w 的条件下,观测到输出 y 的概率 P(y | x, w)。最大似然估计就是要找到能最大化这个概率的 w。
在我们的具体形式中,我们已经对底层分布做出了假设。正如上一张幻灯片所示,P(y | x, w) 本质上是一个高斯(正态)分布。代入高斯分布的公式,我们有:
P(y | x, w) ∝ exp(- (y - x^T w)² / (2σ²))
现在,检查哪个 w 值能最大化这个表达式。由于 σ 只是一个缩放参数,最大化这个指数表达式等价于最小化其指数项中的平方项 (y - x^T w)²。而这正是最小二乘回归所做的事情。
由此我们可以看出,当我们从这种基于模型的视角出发,假设一个高斯噪声模型并使用最大似然估计时,我们便恢复了普通的线性最小二乘算法。这是一个很好的洞见,它可以帮助你思考普通最小二乘法何时可能表现良好,何时可能不佳。如果你所处的环境符合高斯噪声模型的假设,那么这可能是一个合适的选择;反之,如果你不相信噪声是高斯的,那么选择最小二乘损失函数可能就不是正确的做法。
正则化风险最小化与贝叶斯最大后验估计
我们已经看到线性回归始于简单的训练误差最小化,但后来我们更倾向于选择具有低L2范数或低L1范数的函数。那么,我们能否将正则化风险最小化也转化为概率设定呢?
我们像上面一样开始,假设数据生成过程与上述相同。但现在,我们额外假设参数 w 上有一个先验分布。这在统计学语言中,是传统(频率派)统计学与贝叶斯方法之间的关键区别。在频率派方法中,你不假设要学习的参数 w 是一个随机量或具有任何先验分布。而在贝叶斯框架中,你总是假设参数有某个先验分布,然后在观测数据后,查看其后验分布,以更新你对该参数可能取值的信念。
我们现在假设参数有一个先验分布。简单来说,我们假设参数的先验分布也是一个高斯分布,它具有不同的方差,这里称为 τ²。如果我们对这个参数应该是什么没有更好的猜测,也许可以简单地假设它可能服从高斯分布。这本质上意味着,我们认为 w 的值较小(接近0)的可能性很高,而离0越远,我们认为它真正是我们想要找到的参数的可能性就越小。
在下面这行公式的开头,我们仍然有关于底层数据的模型,它本质上说明我们有一个贝叶斯高斯噪声模型。
现在,如果我们看贝叶斯最大后验估计方法,该方法认为我们应该选择能最大化后验概率的向量 w。后验概率是给定输入 x 和输出 y 的条件下,参数 w 的概率 P(w | x, y)。
根据贝叶斯定理,可以将其重写为似然函数、先验分布和证据(归一化常数)的乘积。具体推导需要一些时间,但如果你写下所有公式并尝试求解,你会发现这完全等同于解决岭回归问题。
岭回归问题是:最小化最小二乘损失加上 λ 乘以 w 的L2范数的平方。其中,参数 λ 恰好是 σ²(数据噪声方差)与 τ²(先验分布方差)的比值。
这个转换非常美妙。它为我们所做的正则化风险最小化赋予了意义。我们之前说,使用最小二乘损失是因为它方便,并且我们希望参数 w 的范数较小。现在,你可以将其一对一地翻译为:这等同于假设我们的数据条件分布是正态分布的,并且我们对权重向量 w 也有一个先验分布。
当然,正是这个先验分布对应了正则化项。正如之前所说,这里的先验表明 w 很小的可能性很高,因为它是正态分布,集中在0附近。随着我们远离0,我们认为它越来越不可能。因此,对于一个数据集,如果我们选择一个远离此处的 w,那将是相当令人惊讶的。这与我们为岭回归所做的动机完全相同:我们不希望 w 的L2范数太大,我们不希望它偏离太远。这是看待我们想要寻找的相同直觉的两种不同方式。
美妙之处在于,这确实归结为完全相同的问题。
通用转换表
在更一般的层面上,概率世界与我们本课程中考虑的统计世界之间存在一个转换表。
以下是该对应关系:
- 概率设定中的噪声模型 对应于 经验风险最小化框架中的损失函数。在很高层次上,这是合理的。如果我们固定一个损失函数,我们本质上是在说,我们如何权衡数据之间的不同偏差。哪些偏差我们认为重要或显著,哪些偏差总是发生,也许我们不太在意——这就是我们在损失函数中编码的内容。但这与你在噪声模型中编码的内容相同。在噪声模型中,你也会说“这是我的真实数据,然后我给它加上一些东西”。根据你相信这个“东西”的样子,你也会以非常不同的方式惩罚偏差。
- 贝叶斯模型中的先验分布选择 对应于 正则化方法中的正则化项选择。正如我们之前在高斯模型中所解释的,这也很有道理。
更多示例
我已经展示了对应于最大似然估计的普通最小二乘回归,以及对应于贝叶斯最大后验估计的正则化岭回归(最小二乘),它们都基于高斯模型和高斯先验。
现在,你可能做出其他假设。例如:
- 拉普拉斯噪声模型:如果你认为数据中出现大异常值的可能性大得多,通常会选择拉普拉斯噪声模型。拉普拉斯分布具有更重的尾部,因此出现远离分布中心的大偏差的可能性更大。如果你因为看到数据中有许多远离数据均值的异常点而相信这一点,你可能会选择拉普拉斯噪声模型。与高斯噪声模型不同,这里 w 的范数不是平方的。进行这种转换后,会导致 L1 损失函数(即绝对误差损失)。这并非巧合,因为这里你有一个1次幂,那里也有一个1次幂。在统计学中,如果你认为数据有许多异常值,如果你想获得对异常点不那么敏感的稳健估计(统计学中常称为稳健统计),就会使用L1损失而不是L2损失。在这里,你也可以从贝叶斯角度得到它。
- 拉普拉斯先验:类似地,如果我们讨论先验,如果你对参数使用拉普拉斯先验而不是高斯先验,我们最终也会得到一个不同的正则化项——不再是岭正则化(L2),而是Lasso正则化(L1)。
总结
在本节课中,我们一起学习了机器学习中经验风险最小化与概率方法之间的深刻联系。我们看到:
- 普通最小二乘法 可以从高斯噪声模型下的最大似然估计推导出来。
- 岭回归(L2正则化最小二乘) 对应于高斯先验下的贝叶斯最大后验估计,其中正则化参数 λ 与噪声方差和先验方差的比值有关。
- 这种联系可以推广:损失函数的选择 对应着噪声模型的假设,而正则化项的选择 对应着参数先验分布的选择。例如,拉普拉斯噪声对应L1损失,拉普拉斯先验对应L1正则化(Lasso)。


这种对应关系不仅优美,而且极具启发性。它为我们通常从优化角度理解的方法(如选择损失函数和正则化项)提供了概率论的解释,帮助我们更深入地理解这些方法的假设、适用场景以及它们为何有效。当你面临模型选择时,这种双重视角可以指导你根据对数据噪声和参数分布的信念,做出更明智的决定。
13:线性判别分析 📊

在本节课中,我们将要学习线性分类方法,并重点介绍一种经典算法——线性判别分析。我们将从线性分类的基本概念入手,探讨如何寻找一个能将不同类别数据分开的超平面,并理解线性判别分析背后的多种动机。
线性分类简介 📈
上一节我们介绍了多种解决线性回归问题的方法,如最小二乘法、岭回归和Lasso等。本节中,我们来看看分类问题。与回归类似,我们将从线性方法开始。

我们假设数据存在于 R^D 空间中,这通常是因为我们将抽象对象表示为了特征向量。分类问题的输出是一个二元向量,标签通常为 +1 或 -1。我们目前专注于两类分类问题,这是最简单的情况。

线性分类的核心思想是找到一个能将两个类别分开的超平面。在二维空间中,这是一个直线;在更高维空间中,则是一个维度比原空间少一的超平面。
超平面的定义与几何意义 📐

形式上,一个在 R^D 空间中的超平面由两个参数定义:法向量 w 和偏移量 b。超平面 H 是所有满足以下方程的点 x 的集合:
w^T x + b = 0
从几何角度看,法向量 w 垂直于超平面,而 b 决定了超平面相对于原点的偏移。
为了判断一个点位于超平面的哪一侧,我们使用符号函数。对于点 x,我们计算 w^T x + b 的值。如果结果为正,则预测为 +1 类;如果为负,则预测为 -1 类。
另一种理解方式是投影。点积 w^T x 是将点 x 投影到法向量 w 方向上的标量值。参数 b 则在这条投影线上设定了一个阈值,用于区分两个类别。

分类的损失函数 ⚖️
在回归中,我们常用最小二乘损失。然而在分类中,有多种损失函数可供选择,不同的算法使用不同的损失。
以下是几种常见的分类损失函数:
- 线性判别分析:使用最小二乘损失。
- 逻辑回归:使用逻辑损失。
- 支持向量机:使用合页损失。

这些不同的损失函数会影响我们选择最佳分类超平面的几何解释和算法。



线性判别分析的几何动机 🔍
我们现在开始介绍线性判别分析。首先从几何角度进行动机阐述。
假设我们有一个数据集,包含红色和蓝色两类点。我们可以选择不同的超平面(及其对应的法向量方向)来投影数据。

问题是,如何判断哪个投影方向更好?费希尔提出了两个判断标准:
- 类内方差应小:投影后,同一类别的点应该尽可能聚集在一起。
- 类间方差应大:投影后,不同类别的点应该尽可能远离。
一个好的投影方向(即一个好的超平面)能同时满足这两个条件,使得在投影后的一维空间上,两类数据清晰地分开,便于设置分类阈值。


线性判别分析的其他动机 🔄
有趣的是,线性判别分析可以从完全不同的角度推导出来,并得到相同的解。
动机二:经验风险最小化
我们采用经验风险最小化的框架。我们选择线性函数作为函数类,并简单地使用最小二乘作为损失函数。这里需要注意的是,损失计算是在真实标签(+1/-1)和预测的函数值(w^T x + b,而非其符号)之间进行的。可以证明,由此得到的最优解与基于几何动机的线性判别分析解是一致的。

动机三:贝叶斯决策理论
我们还可以从概率模型的角度出发。我们假设每个类别的数据都服从多元正态分布,且具有相同的协方差矩阵,但均值不同。同时假设两个类别的先验概率相同。在这种情况下,根据贝叶斯最优决策规则(选择后验概率最大的类别)得到的决策边界,同样与线性判别分析的结果一致。
这表明,尽管出发点截然不同——几何直观、固定损失函数的经验风险最小化、基于概率模型的贝叶斯方法——但它们最终导向了同一个算法。这揭示了机器学习中频率学派与贝叶斯学派方法之间深刻的联系。
历史背景与总结 📜



线性判别分析由统计学奠基人罗纳德·费希尔在20世纪30年代提出,也被称为费希尔判别分析。

本节课中我们一起学习了线性判别分析这一经典的线性分类算法。我们了解到它可以通过三种不同的视角进行动机阐述:
- 几何视角:寻找使类内聚集、类间分离的投影方向。
- 经验风险最小化视角:使用线性函数和最小二乘损失。
- 贝叶斯视角:假设数据来自同方差的正态分布,并应用最优贝叶斯决策。

尽管该算法有解析解,但在实际应用中已不常用。然而,理解其背后的多种动机,有助于我们更深入地把握线性分类的本质以及不同机器学习范式之间的联系。
14:逻辑回归 📈









在本节课中,我们将要学习一个名为逻辑回归的分类算法。尽管它的名字中包含“回归”,但它实际上是一种用于解决分类问题的经典且在实践中广泛应用的算法。





上一节我们介绍了线性判别分析,本节中我们来看看逻辑回归。与线性判别分析不同,逻辑回归使用一种名为“逻辑损失”的损失函数,并通过经验风险最小化框架来寻找最优的线性决策边界。


问题设定与模型空间








我们从一个二分类问题开始。数据点位于 R^D 空间中,输出标签 y 取值为 +1 或 -1。我们希望使用一个线性模型,其函数空间由所有超平面诱导而成,即形式为 f(x) = ω^T x + b 的函数。




我们的目标是进行经验风险最小化。我们已经知道,使用平方损失函数本质上对应着线性判别分析。




逻辑损失函数


现在,我们想使用一个不同的损失函数,即逻辑损失函数。





逻辑损失函数的定义如下:对于输入数据 x,预测值 f(x) 和真实标签 y,损失定义为:
L(y, f(x)) = log(1 + exp(-y * f(x)))





为了理解这个损失函数,我们需要观察 y * f(x) 这个乘积。这个乘积的值决定了分类是否正确:
- 如果 y * f(x) > 0,则分类正确(y 和 f(x) 同号)。
- 如果 y * f(x) < 0,则分类错误(y 和 f(x) 异号)。





以下是几种常见分类损失函数的对比图,其中x轴代表 y * f(x):



- 0-1损失(黑色):这是理论上最自然的分类损失。分类正确时损失为0,分类错误时损失为1,与 f(x) 的具体数值无关。但它是离散的,难以直接优化。
- 逻辑损失(紫色):这是我们关注的损失函数。对于分类错误的点(y * f(x) < 0),损失大致线性增加。对于分类正确的点(y * f(x) > 0),损失虽然较小,但不会立即降为0,而是随着 y * f(x) 增大逐渐趋近于0。
- 合页损失(Hinge Loss,绿色):这是支持向量机使用的损失函数,其行为与逻辑损失类似,但在正确分类且远离边界后,损失会降为0。






使用逻辑损失(而非0-1损失)的原因在于,我们希望不仅追求分类正确,还希望决策的“置信度”更高。即使分类正确,如果点离决策边界很近,我们仍然会施加一定的惩罚,以此驱动模型将分类边界推离数据点,从而获得一个更稳健、更确信的决策边界。




经验风险最小化与优化




现在,我们考虑在逻辑损失下的经验风险最小化框架,即寻找使训练集上逻辑损失之和最小的线性函数。
第一个观察结果是,这个问题没有闭式解。但好消息是,逻辑损失函数导出的优化问题是凸优化问题,因此很容易求解。我们可以使用任何凸优化求解器。


在实践中,牛顿-拉夫森算法对于求解逻辑回归问题特别有效。不过,本课程不会深入讨论优化算法的细节。




逻辑损失的由来:判别式建模视角





一个自然的问题是:为什么会有人提出逻辑损失函数?这看起来像是一个随意的选择。

这背后其实与判别式建模方法有关。在判别式方法中,我们不试图对特征 x 和标签 y 的联合概率分布进行完整建模(那是生成式方法),而只关心在给定输入 x 的条件下,输出标签 y 的概率 P(y | x)。



人们选择的一个特定模型是:
P(y | x) = 1 / (1 + exp(-y * f(x)))
其中 f(x) = ω^T x + b。这个函数被称为逻辑函数(或Sigmoid函数),它在很多领域都有应用。




这个模型的直观理解可以通过一个投影示例来说明。考虑一个二维分类问题,我们将数据点投影到决策超平面的法向量上。逻辑模型表明,属于某个类别的概率并非在边界处突然从0跳变到1,而是有一个平滑的过渡。离决策边界越远,属于该类的概率就越接近1(或0),但永远不会达到绝对的100%,这反映了现实世界分类中固有的不确定性。




我们的目标是最大化在给定输入下观察到真实标签的条件概率。通过推导公式可以发现,最大化这个条件概率等价于最小化逻辑损失函数。这就是逻辑损失函数的起源。




正则化逻辑回归



与线性回归类似,我们也可以在逻辑回归中添加正则化项来控制模型复杂度,防止过拟合。



我们可以使用L2正则化(类似于岭回归)或L1正则化(类似于LASSO)。最终,我们求解的是标准的正则化风险最小化问题:
min (1/n) Σ L(y_i, f(x_i)) + λ * R(ω)
其中 R(ω) 是正则化项(如 ||ω||_2^2 或 ||ω||_1),超参数 λ 通常通过交叉验证来确定。





由于逻辑损失和L1/L2正则化项都是凸函数,因此整个优化问题仍然是凸的,可以高效求解。




历史背景与总结
逻辑回归算法拥有悠久的历史,其思想最早可追溯到19世纪。它在20世纪被重新发现并得到广泛应用。有趣的是,经济学家Daniel McFadden因在离散选择分析模型(逻辑回归是其中一部分)方面的贡献,于2000年获得了诺贝尔经济学奖。这说明了即使是一个“古老”的算法,其深刻内涵和应用价值依然巨大。


本节课中我们一起学习了逻辑回归算法。我们了解到它是一种判别式的线性分类方法,通过最小化逻辑损失函数(其背后对应着最大化条件概率的模型)来进行学习。逻辑回归模型易于解释,优化过程稳定(凸优化),并且可以通过添加正则化来提高泛化能力,因此至今仍在许多领域被广泛使用。
15:凸优化、拉格朗日法与对偶问题 🧠

在本节课中,我们将要学习如何利用拉格朗日方法解决凸优化问题。这是一个非常通用的方法,在许多情况下都能提供帮助,尤其是在支持向量机(SVM)中。我们将从直观理解开始,然后介绍一些形式化的定义和符号。请注意,这只是一个高层次的概述,旨在帮助我们最终解决SVM的对偶优化问题。

梯度回顾 📈

上一节我们介绍了本课程的目标。本节中,我们首先来回顾一个核心概念:梯度。梯度在优化问题中至关重要。

如果有一个函数 f, 从 R^d 映射到 R, 那么它的梯度是一个由偏导数组成的向量。梯度指向函数值增加最快的方向。

公式:
[
\nabla f(x) = \left[ \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \dots, \frac{\partial f}{\partial x_d} \right]^T
]

带等式约束的凸优化问题 ⚖️
现在,我们来看一个简单的凸优化问题:带有一个等式约束的最小化问题。
问题形式:
[
\begin{aligned}
& \underset{x}{\text{minimize}}
& & f(x) \
& \text{subject to}
& & g(x) = 0
\end{aligned}
]
其中,f 和 g 都是凸函数。


由于 g 是凸函数,其函数值小于等于0的子水平集是凸集。约束 g(x) = 0 定义了这个凸集的边界。

关键直觉 🔍
在最优解 x* 处,目标函数 f 的梯度与约束函数 g 的梯度是平行的。这是因为,如果梯度不平行,我们就可以沿着约束表面移动,进一步减小 f 的值,这与 x* 是最优解矛盾。


因此,存在一个常数 ν,使得在 x* 处满足:
[
\nabla f(x^) + \nu \nabla g(x^) = 0
]

拉格朗日函数 🧩
为了形式化地处理这个条件,我们引入拉格朗日函数。
定义:
对于上述等式约束问题,拉格朗日函数 L 定义为:
[
L(x, \nu) = f(x) + \nu g(x)
]
其中,ν 称为拉格朗日乘子。



现在,我们可以重新表述最优性条件:
- ∇ₓ L(x, ν) = 0 等价于 ∇f(x) + ν∇g(x) = 0。
- ∇ᵥ L(x, ν) = 0 等价于 g(x) = 0。
因此,寻找原优化问题的最优解 x*,等价于寻找拉格朗日函数 L(x, ν) 的一个鞍点(saddle point),即满足上述两个导数为零的点。

示例演练 🔧
让我们通过一个简单例子来实践这个方法。

问题:
最小化 f(x₁, x₂) = x₁² + x₂² - 1, 约束条件为 g(x₁, x₂) = x₁ + x₂ - 1 = 0。


解决步骤:
- 构造拉格朗日函数:L(x₁, x₂, ν) = x₁² + x₂² - 1 + ν(x₁ + x₂ - 1)。
- 求偏导数并设为零:
- ∂L/∂x₁ = 2x₁ + ν = 0
- ∂L/∂x₂ = 2x₂ + ν = 0
- ∂L/∂ν = x₁ + x₂ - 1 = 0
- 解这个方程组,得到 x₁ = 0.5, x₂ = 0.5, ν = -1。
因此,最优解是 (0.5, 0.5)。这个方法将带约束的优化问题转化为了一个无约束的方程组求解问题。

带不等式约束的凸优化问题 ⛓️


实际问题中更常见的是不等式约束。现在,我们考虑如下形式的问题:

问题形式:
[
\begin{aligned}
& \underset{x}{\text{minimize}}
& & f(x) \
& \text{subject to}
& & g(x) \le 0
\end{aligned}
]
同样,f 和 g 是凸函数,且约束已写成标准形式(≤ 0)。

这里需要区分两种情形:有效约束 和 无效约束。
情形一:有效约束 🎯


如果最优解 x* 正好落在边界上,即 g(x*) = 0,则称该约束是有效的。此时,情况与等式约束类似,但梯度方向有特定关系。

在边界点 x* 处:
- ∇g(x*) 指向可行域外部(因为 g 增加的方向)。
- 为了不违反约束且进一步减小 f, ∇f(x*) 必须指向可行域内部(否则可以向内移动以减小 f)。


因此,两个梯度方向相反,存在一个 正数 λ ≥ 0,使得:
[
\nabla f(x^) + \lambda \nabla g(x^) = 0
]
情形二:无效约束 😴

如果最优解 x* 位于可行域内部,即 g(x*) < 0,则约束是无效的。它不影响最优解的位置,问题退化为无约束优化。此时,在 x* 处有 ∇f(x*) = 0,且我们可以令 λ = 0。

统一处理与KKT条件 🤝


我们可以用拉格朗日函数统一描述这两种情况。

定义(不等式约束的拉格朗日函数):
[
L(x, \lambda) = f(x) + \lambda g(x), \quad \lambda \ge 0
]

在最优解 x* 处,无论约束是否有效,都必须满足以下KKT条件:
- 平稳性: ∇ₓ L(x*, λ) = 0 (即 ∇f(x) + λ∇g(x) = 0)。
- 原始可行性: g(x*) ≤ 0。
- 对偶可行性: λ ≥ 0。
- 互补松弛性: λ g(x*) = 0。
互补松弛性条件意味着:要么 λ = 0(约束无效),要么 g(x*) = 0(约束有效)。这正是我们上面分析的两种情形。

示例:最大面积矩形 📐
问题:在周长不超过1的条件下,求面积最大的矩形边长。
设边长为 x, y,则问题为:
最大化 xy, 约束为 2x + 2y ≤ 1。

首先转化为标准形式:
最小化 -xy, 约束为 2x + 2y - 1 ≤ 0。
构造拉格朗日函数:L(x, y, λ) = -xy + λ(2x + 2y - 1), λ ≥ 0。
应用KKT条件求解,可得 x = y = 0.25,即正方形面积最大。这验证了拉格朗日方法的有效性。


原始问题与对偶问题 🔄

上一节我们通过KKT条件在具体问题中寻找最优解。本节中,我们来看看更一般的理论框架:原始问题与对偶问题。
考虑一个更一般的凸优化问题标准形式:

原始问题 (Primal Problem):
[
\begin{aligned}
& \underset{x}{\text{minimize}}
& & f_0(x) \
& \text{subject to}
& & f_i(x) \le 0, \quad i = 1, \dots, m \
& & & h_j(x) = 0, \quad j = 1, \dots, k
\end{aligned}
]
其中 f₀, f_i 是凸函数,h_j 是仿射函数。记其最优值为 p*。
拉格朗日函数与对偶函数 📊
引入拉格朗日乘子 λ_i (对应不等式约束,λ_i ≥ 0)和 ν_j (对应等式约束),构造广义拉格朗日函数:
[
L(x, \lambda, \nu) = f_0(x) + \sum_{i=1}^m \lambda_i f_i(x) + \sum_{j=1}^k \nu_j h_j(x)
]


定义对偶函数 (Dual Function):
[
g(\lambda, \nu) = \inf_{x} L(x, \lambda, \nu)
]
对偶函数是拉格朗日函数关于原始变量 x 取极小值后得到的函数,它只依赖于对偶变量 λ, ν。

一个重要性质是:对偶函数 g(λ, ν) 总是凹函数,即使原始问题不是凸的。

对偶问题与弱对偶性 ⚖️

对偶问题 (Dual Problem) 定义为最大化对偶函数:
[
\begin{aligned}
& \underset{\lambda, \nu}{\text{maximize}}
& & g(\lambda, \nu) \
& \text{subject to}
& & \lambda_i \ge 0, \quad i = 1, \dots, m
\end{aligned}
]
记其对偶最优值为 d*。
弱对偶性:对于任何满足 λ ≥ 0 的 λ, ν,都有
[
g(\lambda, \nu) \le p^*
]
因此,对偶最优值提供了原始最优值的一个下界:
[
d^* \le p^*
]
差值 p - d** 称为对偶间隙。

强对偶性与鞍点解释 🏔️
如果对偶间隙为零,即 p = d,则称强对偶性**成立。这对于我们通过解对偶问题来获得原始问题的最优解至关重要。

强对偶性成立需要满足一定的条件(如Slater约束品性)。幸运的是,线性规划、二次规划(包括SVM的优化问题)等许多凸问题都满足强对偶性。

当强对偶性成立时,原始最优解 x* 和对偶最优解 (λ, ν) 之间存在紧密联系:


鞍点解释:点 (x, λ, ν*) 是拉格朗日函数 L 的一个鞍点。即,对于所有 x 和所有 λ ≥ 0, ν,有:
[
L(x^, \lambda, \nu) \le L(x^, \lambda^, \nu^) \le L(x, \lambda^, \nu^)
]
这意味着:
- 固定对偶变量为最优值,拉格朗日函数关于 x 在 x* 处取最小值。
- 固定原始变量为最优值,拉格朗日函数关于对偶变量在 (λ, ν) 处取最大值。



反过来,如果找到了拉格朗日函数的一个鞍点,那么这个点就给出了原始问题和对偶问题的最优解。
总结 🎓

本节课中,我们一起学习了凸优化中的拉格朗日方法和对偶理论。

我们从梯度的概念出发,首先学习了如何处理带等式约束的凸优化问题,引入了拉格朗日函数,并将其最优性条件转化为求解鞍点问题。
接着,我们将方法推广到更常见的不等式约束问题,分析了有效与无效约束的两种情况,并引入了统一的KKT最优性条件。

最后,我们探讨了更一般的原始问题与对偶问题框架。我们了解到,对偶问题总是给出原始问题最优值的下界(弱对偶性),而在强对偶性成立的条件下,对偶问题的最优值等于原始问题的最优值,并且最优解对应于拉格朗日函数的鞍点。
这套理论为我们提供了一套强大的工具,可以将复杂的带约束优化问题转化为可能更易求解的对偶问题或方程组问题,这直接为后续支持向量机(SVM)中对偶形式的推导和求解奠定了坚实的基础。
16:支持向量机(硬间隔与软间隔)🚀


在本节课中,我们将要学习支持向量机,这是传统机器学习中最著名的算法之一。我们将从直观理解开始,然后推导出支持向量机的原始优化问题。



支持向量机在20世纪90年代被发现,其最重要的组成部分都来自那个时期。该算法使机器学习成为计算机科学中一个独立的子学科,因为它非常成功,人们突然有了一个参数很少、能解决相当复杂问题的简单算法。它拥有一个非常强大的机制,称为核技巧,可以将原本线性的算法(如支持向量机)转变为强大的非线性分类器。我们将在接下来的几节课中看到这一切,今天我们将从硬间隔支持向量机的线性情况开始。





从直觉开始




与之前看到的算法一样,我们处于线性分类的情境中。我们有一些在 R^D 空间中的点,并希望将它们分类到若干类别中。我们将使用线性分类,即通过超平面进行分类,这与逻辑回归或线性判别分析的情况相同。


观察幻灯片,我们面临一个问题:可能存在许多不同的超平面都能实现对我们数据集的特定分类。那么,我们应该选择哪个超平面呢?

我们已经看到了两种不同的答案。一种是几何答案,来自线性判别分析,我们要求投影后类内点紧密聚集,而类间距离尽可能大。现在,我们将看到另一种几何动机,它最终引出了支持向量机。


间隔的概念


支持向量机从几何角度出发的主要思想是所谓的间隔。考虑幻灯片,假设我们有一个数据集,可以被一个超平面完美分离,即存在一个超平面能将两个类别的点完全分开。


现在,如果存在一个这样的超平面,通常会有许多超平面都能分离数据。我们应该选择哪一个呢?我们的做法是考虑间隔。如图所示,对于一个超平面,你可以画出其“边缘”,平行于超平面向外移动,直到触碰到第一个数据点为止。这个距离就是间隔。

我们的想法是,我们希望找到一个具有最大间隔的超平面。
为什么需要大间隔?
为什么这有意义呢?让我们回到上一张幻灯片的例子。考虑这里的三个超平面 H1、H2、H3。
你可能会说 H1 确实将所有点正确分类了。但它非常接近红色类别。在图的右上角,超平面几乎要触碰到那个红点。现在想象一下,如果我们给这个红点添加一点“抖动”,例如测量噪声,它可能立即跳到超平面的另一侧,从而获得不同的标签。从这个意义上说,如果我们选择超平面 H1,这似乎不是一个非常稳健的选择。如果给数据添加一点噪声,某些点的分类可能会改变。

对于超平面 H3 也是如此,它靠近另一个类别的某个数据点。
而超平面 H2 至少更好一些,因为它与两个类别的距离都更大。因此,如果只给训练点添加微小的噪声,这些训练点的分类不会轻易改变。
所以,我们希望拥有大间隔的原因之一是鲁棒性,因为如果给数据添加一点噪声,数据点的分类不会轻易改变。


我们稍后会看到,间隔的大小也引入了一种正则化。间隔越大,正则化程度越高。如果我们找到了能以大间隔实现分离的函数,这意味着我们从一个小的函数类中找到了一个非常简单的函数,但这将在后面讨论。

形式化定义

我们想通过超平面进行分类,因此我们对以下形式的线性分类器感兴趣:
f(x) = sign(ω·x + b)
其中 ω 和 b 是我们想要学习的两个参数。
对于支持向量机,如果我们想解决一个优化问题,现在需要弄清楚一个重要的事情:如果我们用同一个正常数 a 乘以参数 ω 和 b,超平面当然不会改变,因为观察这个函数的符号,它仍然是相同的。但这是优化问题中我们通常希望消除的一个自由度,因为它常常阻碍我们找到好的解决方案。


在这种情况下,我们通常的做法是固定某个常数。在这种特定情况下,我们通过定义规范表示或规范形式的超平面来固定它。

定义:对于给定的数据点,如果满足以下条件,则称参数对 (ω, b) 是规范形式的:
min_i |ω·x_i + b| = 1
这隐式地固定了常数,因为如果我们不乘以某个常数,这个最小值就不会是 1。我们通过固定这个等式成立来选择可以乘以 ω 和 b 的常数宽度。如果这个等式成立,我们就说超平面是规范表示的。这只在支持向量机中使用,是帮助其推导的术语。

定义间隔
现在,让我们尝试正式定义间隔。再次说明,H 是任意超平面。目前,我们假设有一个训练集,并且这个超平面能完美分离该训练集。我们首先在完美可分的情况下介绍支持向量机。

现在定义间隔:超平面 H 相对于给定训练点的间隔,定义为训练点到超平面的最小距离。



对于每个训练点,计算其到超平面的距离,然后取这些距离中的最小值,这就是我们所说的间隔。回想一下,这对应于我们的直觉:间隔衡量了在开始触碰到训练点之前,我们可以移动超平面多远。这正是训练点到超平面的距离。


形式化定义:在支持向量机文献中,间隔通常用 ρ 表示。超平面相对于训练点 {x_1, ..., x_n} 的间隔 ρ,定义为训练点到超平面的最小距离。

如何计算间隔?

现在我们提出第一个命题:如何计算给定超平面和训练点的间隔。




命题:对于一个规范表示的超平面,间隔 ρ 可以计算为:
ρ = 1 / ||ω||
我们在欧几里得空间中进行线性分类,因此我们看的是空间 R^D 中的欧几里得范数。ω 的范数的倒数就是间隔。


有多种简单的方法可以证明这一点,这里展示其中一种。


证明如下:
- 假设 x 是超平面上的一个点。那么它必须满足超平面方程:
ω·x + b = 0。 - 我们知道,位于间隔边界上的点满足
ω·x + b = ±1。这来自规范表示和间隔的定义。 - 现在考虑距离超平面最近的训练点 x。不失一般性,我们假设它取值为 +1(为 -1 时论证完全相同)。
- 令 h 是超平面上最接近点 x 的点。那么根据间隔的定义,x 到 h 的距离就是 ρ。
- 点 x 可以写成:
x = h + ρ * (ω / ||ω||)。这是因为从原点到 x,我们先到 h,然后沿着超平面的法向量 ω 方向走 ρ 的距离,而 ω/||ω|| 是单位方向向量。 - 现在,我们将等式两边同时与 ω 做内积:
ω·x = ω·h + ρ * (ω·ω) / ||ω||
由于ω·ω = ||ω||^2,所以:
ω·x = ω·h + ρ * ||ω|| - 在等式两边同时加上 b:
ω·x + b = (ω·h + b) + ρ * ||ω|| - 根据定义,
ω·x + b = 1(因为 x 在间隔边界上),且ω·h + b = 0(因为 h 在超平面上)。 - 代入得:
1 = 0 + ρ * ||ω|| - 因此,
ρ = 1 / ||ω||。证明完毕。





我们刚才证明的是,如果我们的超平面是规范表示的,那么间隔可以计算为 1 除以 ω 的范数。


幻灯片上也有另一种证明,如果你有兴趣可以阅读。




硬间隔支持向量机

现在,我们已经有了定义硬间隔支持向量机的所有要素。




我们想要做的是:在给定训练点并假设它们可以被超平面分离的前提下,找到一个具有尽可能大间隔的超平面。



所以,我们有一个目标函数:最大化间隔。即在所有能分离数据的超平面中,最大化间隔 ρ。
约束条件是:所有点都位于超平面的正确一侧,并且在间隔之外。


用公式表示:
- 目标:
max ρ,等价于max 1/||ω||,因为ρ = 1/||ω||。 - 约束 1:对于所有训练点 i,预测标签 sign(ω·x_i + b) 应与真实标签 y_i 相同。
- 约束 2:对于所有训练点 i,有
|ω·x_i + b| ≥ 1,因为我们希望点位于间隔边界之外。


通常,我们会简化这个优化问题。
- 首先,最大化
1/||ω||在优化上不太方便,我们可以改为最小化||ω||。取一个表达式的倒数,最大化变为最小化,但本质是同一个问题。最小化范数在概念上比最大化其倒数要容易得多。 - 其次,我们希望以更优雅的方式写出这些繁琐的条件。我们可以将两个条件合并为一个:
y_i (ω·x_i + b) ≥ 1。让我们看看为什么:- 如果要求
y_i (ω·x_i + b) > 0,那么我们就要求预测的符号是正确的。因为如果 y_i 是 +1 且预测为 +1,乘积为正;两者都为负时亦然。 - 但根据第二个条件,我们需要它大于等于 1,而不仅仅是大于 0。所以最终约束是
y_i (ω·x_i + b) ≥ 1。
- 如果要求



这样得到的问题称为原始硬间隔支持向量机问题:


min_{ω, b} (1/2) ||ω||^2
subject to y_i (ω·x_i + b) ≥ 1, for all i = 1, ..., n


几点说明:
- 前面的因子
1/2只是为了数学上的方便,不影响最终解。 - 我们将范数平方,最小化范数或最小化范数的平方会得到相同的解,但从数学角度看,最小化平方函数更友好,特别是在求导时,导数会是
2ω,处理起来更方便。



问题特性与局限性

观察这个优化问题,我们可以得到一些初步见解:
- 这是一个凸问题。目标函数是凸的(平方范数是凸函数),约束是线性的。具有二次目标函数和线性约束的问题称为二次规划问题,这是一类特别好的优化问题,存在非常高效的求解器。
- 从这个优化问题中找到的解,将始终是一个规范表示的超平面。
- 然而,这个方法有一个非常明显的缺点:目前我们推导的支持向量机仅适用于两类完全可分的情况。如果不存在这样的超平面,支持向量机就会失效,因为间隔的定义假设了我们可以分离数据点。

因此,接下来我们要做的是推导软间隔支持向量机,它将解决这个问题。

软间隔支持向量机


我们现在希望允许超平面犯一些错误。可能存在一些模糊的训练点,甚至可能属于错误的类别。也可能问题根本不可分。




在优化中,一个非常常见的做法是:如果无法总是满足硬间隔条件,那么就允许违反这个条件,但我们要衡量违反的程度。然后,违反得越严重,惩罚就越大。我们倾向于选择惩罚较小的解。



具体到我们的例子:
- 我们为每个数据点 x_i 引入一个松弛变量 ξ_i (xi_i ≥ 0)。这个变量用来衡量该数据点位于超平面错误一侧的程度(如果确实如此的话)。
- 优化目标现在扩展为:
min_{ω, b, ξ} (1/2)||ω||^2 + C * Σ_{i=1}^n ξ_i- 第一部分
(1/2)||ω||^2和之前一样,希望间隔大(即 ||ω|| 小)。 - 第二部分
C * Σ ξ_i是所有惩罚项的总和,希望惩罚小。 C是一个权衡常数,称为支持向量机的 C 参数。它控制着两部分之间的权衡。
- 第一部分
- 约束条件也改变了。之前的硬约束
y_i(ω·x_i + b) ≥ 1现在被放松为:y_i(ω·x_i + b) ≥ 1 - ξ_i。- 如果 ξ_i = 0,则条件与硬间隔相同,点位于间隔边界之外的正确一侧。
- 如果 ξ_i > 0,则允许点不满足硬间隔条件。ξ_i 越大,允许点离理想位置(间隔边界之外的正确一侧)越远。


这个新问题就是软间隔支持向量机,因为间隔条件被“软化”了。

注意,这仍然是一个二次规划问题,因为目标函数是二次的(对 ω 是二次,对 ξ 是线性),约束是线性的。不过,我们现在需要优化的变量除了 ω 和 b,还多了 n 个松弛变量 ξ_i。


松弛变量的几何解释



这些惩罚参数 ξ_i 有几何解释:
- 如果 ξ_i = 0:点位于超平面的正确一侧,并且在间隔之外。
- 如果 0 < ξ_i ≤ 1:点仍然位于超平面的正确一侧,但已经进入间隔内部。
- 如果 ξ_i > 1:点位于超平面的错误一侧。
可以看示意图:蓝色圆圈和红色叉号代表两类点,实线是超平面,虚线表示间隔。
- 位于间隔外部正确一侧的点,ξ_i = 0。
- 位于间隔内部但仍在正确一侧的点(例如被箭头指向的那个),0 < ξ_i < 1。
- 位于错误一侧的点,ξ_i > 1。距离超平面错误一侧越远,ξ_i 越大,惩罚也越大。


合页损失函数

有了这个直观理解,我们现在可以从正则化风险最小化的角度来理解软间隔支持向量机。


暂时忽略约束,只看目标函数:(1/2)||ω||^2 + C Σ ξ_i。
- 第一部分
(1/2)||ω||^2可以解释为正则化项,它不直接依赖于单个训练点,而是函数的属性。 - 第二部分
C Σ ξ_i可以解释为风险项或损失函数。




我们可以从约束条件中推导出这个损失函数。约束 ξ_i ≥ 1 - y_i(ω·x_i + b) 且 ξ_i ≥ 0,这意味着在最优解中,ξ_i 会取这两个下界中较大的那个:ξ_i = max(0, 1 - y_i(ω·x_i + b))。

因此,我们可以定义损失函数为:
L(y, f(x)) = max(0, 1 - y * f(x))
其中 f(x) = ω·x + b。


这个函数称为合页损失。如果绘制它:
- 横轴是
y * f(x)(预测值与真实标签的一致性)。 - 当
y*f(x) ≥ 1时,损失为 0(点位于间隔之外正确一侧)。 - 当
0 < y*f(x) < 1时,损失线性增加(点位于间隔内部正确一侧)。 - 当
y*f(x) ≤ 0时,损失线性增加(点位于错误一侧)。





合页损失的特点是:即使点分类正确,但只要它在间隔内部,就会产生损失;并且一旦点被错误分类,损失随错误程度线性增长,而不是二次或更快地增长。这为支持向量机提供了鲁棒性,因为一个远离群体的异常点不会因其巨大的距离而主导整个损失函数。


与其他损失函数(如指数损失、平方损失、逻辑损失)相比,合页损失在错误分类区域是线性增长,而其他一些损失增长更快。逻辑损失即使点分类正确且远离边界,损失也会逐渐趋近于零但不为零;而合页损失在点越过间隔边界后,损失就降为零。
正则化风险最小化框架



现在,我们可以将软间隔支持向量机解释为标准正则化框架下的问题:



min_{ω, b} C * Σ_{i=1}^n max(0, 1 - y_i(ω·x_i + b)) + (1/2)||ω||^2



这等价于:
min_{ω, b} (1/n) Σ_{i=1}^n L_hinge(y_i, ω·x_i + b) + λ ||ω||^2
其中 L_hinge 是合页损失,λ = 1/(2C)(形式上略有调整,但权衡关系相同)。



唯一的区别(主要是历史原因)是,在支持向量机中,权衡常数 C 放在风险项前面,而在岭回归等模型中,常数通常放在正则化项前面。这并不重要,行为是类似的:C 很大时,我们非常不希望有分类错误(间隔可能变小);C 很小时,我们更倾向于大间隔,可以容忍更多错误。你可以思考 C 极大和极小时会发生什么,以及这如何对应欠拟合和过拟合、方差与偏差的权衡。


总结




本节课中我们一起学习了线性支持向量机。

我们了解到:
- 线性支持向量机试图最大化两个类别之间的间隔。
- 在硬间隔情况下,我们只考虑没有任何训练误差的解。
- 在软间隔情况下,我们可以处理训练误差,并在解的误差和间隔大小之间进行权衡。
- 在两种情况下,最终都得到一个二次规划问题。该问题是凸的,存在特定的高效求解器。
- 我们得到了正则化风险最小化框架下的解释,使用的损失函数是合页损失。



支持向量机为线性分类提供了一个强大而直观的几何视角,并通过软间隔和核技巧(后续课程介绍)扩展了其应用范围。
17:对偶问题推导 🧠
在本节课中,我们将学习如何推导支持向量机的对偶问题。我们将从回顾原始问题开始,然后应用拉格朗日乘子法,逐步推导出对偶优化问题。理解这一推导过程是掌握支持向量机核心思想的关键。
回顾原始问题
上一节我们介绍了支持向量机的原始问题。在硬间隔情况下,我们希望找到一个超平面,使得所有数据点都位于间隔的正确一侧。原始优化问题如下:
目标:最小化超平面参数 w 和 b。
目标函数:(1/2) * ||w||^2,这等价于最大化间隔(间隔为 1 / ||w||)。
约束条件:对于每个数据点 (x_i, y_i),需满足 y_i (w^T x_i + b) >= 1。
这构成了一个带有 n 个不等式约束的二次优化问题。
引入拉格朗日乘子法
为了推导对偶问题,我们遵循拉格朗日乘子法的标准步骤。首先,为每个不等式约束引入一个拉格朗日乘子。在支持向量机文献中,这些乘子通常记为 α_i(而非 λ_i),并且由于是不等式约束,要求 α_i >= 0。
接下来,我们写出拉格朗日函数 L(w, b, α)。在标准形式中,约束需写为 <= 0 的形式,因此拉格朗日函数为:
L(w, b, α) = (1/2) * ||w||^2 - Σ_{i=1}^{n} α_i [y_i (w^T x_i + b) - 1]
构建对偶问题
对偶函数 g(α) 定义为拉格朗日函数关于原始变量 (w, b) 的最小值:
g(α) = min_{w, b} L(w, b, α)
对偶问题则是最大化这个对偶函数,并满足 α_i >= 0 的约束。然而,直接优化这个函数并不直观,因此我们需要进行简化。
利用鞍点条件简化
在原始问题的最优解处,必须满足鞍点条件,即拉格朗日函数对原始变量的偏导数为零。
对 b 求偏导:
∂L/∂b = - Σ_{i=1}^{n} α_i y_i = 0 => Σ_{i=1}^{n} α_i y_i = 0 (条件★)
对 w 求偏导:
∂L/∂w = w - Σ_{i=1}^{n} α_i y_i x_i = 0 => w = Σ_{i=1}^{n} α_i y_i x_i (条件★★)
现在,我们将这两个条件代回拉格朗日函数中,以消去原始变量 w 和 b。
首先,利用条件★,拉格朗日函数中与 b 相关的项 -b Σ_{i=1}^{n} α_i y_i 变为零。
接着,利用条件★★,将 w 替换为 Σ_{i=1}^{n} α_i y_i x_i。
经过代换和化简(具体代数运算略),拉格朗日函数简化为仅包含对偶变量 α 的形式:
L(α) = Σ_{i=1}^{n} α_i - (1/2) * Σ_{i=1}^{n} Σ_{j=1}^{n} α_i α_j y_i y_j (x_i^T x_j)
由于在鞍点处,L(w, b, α) 关于 (w, b) 的最小值就是 L(α) 本身,因此对偶函数 g(α) = L(α)。
硬间隔SVM的对偶问题
最终,硬间隔支持向量机的对偶优化问题可以明确写出:
目标:最大化 g(α) = Σ_{i=1}^{n} α_i - (1/2) * Σ_{i=1}^{n} Σ_{j=1}^{n} α_i α_j y_i y_j (x_i^T x_j)
约束条件:
α_i >= 0,对于所有i = 1, ..., n。Σ_{i=1}^{n} α_i y_i = 0(来自条件★)。
这仍然是一个二次规划问题,但形式更为简洁。
软间隔SVM的对偶问题
对于软间隔支持向量机,可以采用完全相同的推导策略。其最终的对偶问题与硬间隔版本非常相似,唯一的区别在于对偶变量 α_i 的约束发生了变化:
约束条件变为:0 <= α_i <= C/n,对于所有 i = 1, ..., n。
这里的 C 是软间隔SVM原始公式中的惩罚参数。这形成了一个“框约束”的二次规划问题。
从对偶解恢复原始解
在实践中,我们求解对偶问题得到 α_i,然后需要恢复出原始的超平面参数 (w, b) 以用于预测。
恢复 w:
这非常简单,直接利用条件★★即可:
w = Σ_{i=1}^{n} α_i y_i x_i
恢复 b:
这需要利用KKT互补松弛条件。简要来说:
- 若
α_i = 0,则对应点位于间隔之外且分类正确。 - 若
0 < α_i < C/n,则对应点恰好位于间隔边界上(即支持向量)。对于这些点,有y_i (w^T x_i + b) = 1。 - 若
α_i = C/n,则对应点位于间隔之内或被误分类。

为了计算 b,我们可以选取任意一个满足 0 < α_j < C/n 的支持向量 (x_j, y_j),然后利用其位于间隔边界上的性质求解:
b = y_j - w^T x_j = y_j - Σ_{i=1}^{n} α_i y_i (x_i^T x_j)
为了数值稳定性,通常对所有满足条件的支持向量计算 b 并取平均值。

对新点进行预测
一旦得到 w 和 b,对于新的测试点 x,其预测标签为:
y_pred = sign(w^T x + b) = sign( Σ_{i=1}^{n} α_i y_i (x_i^T x) + b )
原始问题 vs. 对偶问题:如何选择?
以下是两种问题形式的对比:
-
原始问题:
- 变量数量:
d + 1(w的d维 +b)。 - 约束数量:
n(数据点数量)。 - 适用情况:当特征维度
d远小于样本数量n时,求解原始问题可能更高效。
- 变量数量:
-
对偶问题:
- 变量数量:
n(拉格朗日乘子α_i)。 - 约束数量:
n + 1(n个α_i >= 0约束 + 1 个线性等式约束)。 - 适用情况:当特征维度
d非常大(甚至无穷维,如使用核函数时)或d > n时,求解对偶问题更优,因为变量数取决于样本数n。
- 变量数量:
大多数支持向量机库默认求解对偶问题,这一传统源于历史原因,并且更重要的是,核技巧天然地在对偶形式中实现。
支持向量机的重要性质

推导出对偶形式后,我们可以清晰地看到支持向量机的几个关键性质:
-
解的表示定理:
由条件★★可知,最优超平面的法向量w*可以表示为训练样本的线性组合:
w* = Σ_{i=1}^{n} α_i y_i x_i
这一性质是将线性SVM扩展到非线性核方法的基础。 -
支持向量与稀疏性:
在最优解中,只有一部分α_i不为零。这些非零α_i对应的数据点称为支持向量,它们包括:- 恰好位于间隔边界上的点。
- 位于间隔之内或被误分类的点。
而所有其他α_i = 0的点(即那些被正确分类且远离间隔边界的点)对最终超平面的定义没有贡献。这带来了解的稀疏性,也是算法名称的由来。
-
仅依赖内积:
观察对偶问题的目标函数和决策函数:- 目标函数中,数据点仅以
x_i^T x_j的形式出现。 - 决策函数中,新点
x仅以x_i^T x的形式出现。
这意味着,我们不需要知道数据点的具体坐标,只需要知道任意两点之间的内积即可。这是引入核函数的关键洞见。
- 目标函数中,数据点仅以
历史注记与总结
弗拉基米尔·万普尼克(Vladimir Vapnik)被公认为支持向量机的主要发明者,他也是统计学习理论的重要奠基人。
- 硬间隔SVM与核技巧:于1992年在学习理论会议上被引入。
- 软间隔SVM:随后在1995年发表。

本节课总结:
我们一起学习了线性支持向量机对偶问题的完整推导过程。我们从原始问题出发,应用拉格朗日乘子法,得到了等价的、有时更易求解的对偶优化问题。我们了解了如何从对偶解恢复原始超平面参数,并对比了原始问题与对偶问题的适用场景。最重要的是,我们揭示了支持向量机的三个核心性质:表示定理、解的稀疏性(支持向量) 以及计算仅依赖于数据点间的内积。最后一个性质为我们下一节课将学习的核方法铺平了道路,它将允许我们将线性SVM轻松地扩展到复杂的非线性分类器中。
18:核的定义与示例 🔍









在本节课中,我们将要学习核方法。核是一种非常强大的机制,它能够帮助我们将通常在线性空间中工作的算法,引入到高度非线性的场景中,并使其功能强大得多。在支持向量机发展和机器学习在20世纪90年代、21世纪初变得非常流行时,核是最重要的工具之一。正是这种工具,使得简单的机器学习算法能够在实践中发挥作用。





在本讲座中,我们将探讨核的定义、理论方面以及如何应用这些内容。





从直觉开始




我们目前已经见过许多用于回归或分类的线性算法。但可能很多人心里已经意识到,我们在日常生活中遇到的许多问题可能不是线性可分的。




例如,考虑一个分类问题,数据集看起来像幻灯片上显示的那样,由两个新月形的数据簇组成。如果你假设每个新月形代表数据的一个类别,那么无论你尝试使用哪个超平面,都无法很好地拟合你的数据。这意味着你的模型欠拟合,模型类的能力不足以在此类问题上做出良好预测。






造成这种情况的原因是我们使用了线性函数,而线性函数可能受到很大限制。





克服线性限制的思路





我们已经看到,为了克服这样的问题,你可以做的是想出一组基函数。例如,我们考虑一个声波的例子,也许我们的基函数可以是正弦函数,我们的任务将是学习这些函数的系数。这样,我们仍然有一个线性学习问题,因为系数是以线性方式进入问题的,而我们学习的函数(例如在回归框架中)可以是非线性的。






然而,这种方法也有一些缺点。首先,你通常需要定义一个非常大的基函数集合。在许多应用中,如果我们在谈论声音,那么查看不同频率的正弦波是很自然的;但如果你查看数据库中的客户,对于这种场景,什么是好的基函数并不清楚。



因此,理想情况下,你希望避免必须自己定义基函数的步骤。核方法的核心思想是,我们不必显式地定义这样的基,算法会隐式地完成。这就是整个方法的优雅之处。






核方法的工作原理






以下是核方法工作原理的核心图示,我们将在本讲座的剩余部分逐步展开。因为它非常重要,我想在平板上一步步地画出来。





假设我们有一些数据点。这里我们的数据点,有黑色的叉号,也许还有红色的圆圈。我们想要将这些黑色的叉号与红色的圆圈分开。现在的问题是,正如我在这里画的,这似乎不是线性可分的。




因此,我们想要学习一个函数,也许看起来像这样,它能够将类别分开,也许不能完美地分开,但接近完美。正如你已经在平板上的图中看到的,这个函数不是线性的。



现在的想法如下:假设存在另一个线性空间,比如这里这个。目前,我总是将线性空间视为某个欧几里得向量空间 R^D。假设我们有一种方法,可以将数据从原始空间转换到这样的向量空间。









我们假设存在一个映射,这个映射总是用 Phi 表示,代表特征映射。假设我们有这样一个映射,使得在转换数据之后,数据看起来有点像这样。我们有叉号,有圆圈,它们被很好地分开了。特别是,它们以这样一种方式被分开,以至于我可以拟合一个超平面或线性函数,然后或多或少正确地对我的数据进行分类。





整个技巧在于,核方法提供了一种工具来实现类似的目标。这就是我们想要达到的核心背景。




核技巧的起点






现在,为什么所有这些都有效的起点,是我们已经在支持向量机中观察到的一个非常重要的现象。即,我们已经看到支持向量机仅通过标量积的形式访问数据点。




如果你回想一下支持向量机的优化问题陈述,你会发现它只以标量积的形式包含数据点 X_i 和 Y_j,从未有任何需要直接访问点 X 本身的函数。这就是我们将要利用的技巧。






一个更明确的例子






现在来看一个更明确的例子。我们暂时假设我们的数据已经存在于 R^D 中,但可能不是线性可分的(稍后可以放宽这个假设)。目前假设我们在 R^D 中有一些点,但也许分类问题无法用线性函数解决。




现在,我们引入一个简写符号。这个简写符号表示我在平板上刚刚标注的两个数据点之间的标量积,我们称之为 K。K(X_i, X_j),K 代表核。到目前为止,这只是一个简写符号。我们不说标量积,而是说这是一个函数 K,它接受两个点作为输入,并产生输出 K(X, Y),输出是 X 和 Y 之间的标量积,或者在这种情况下是 X_i 和 X_j 之间的标量积。






现在,如果你看这张幻灯片,你可以看到我们如何用这个核函数来表达支持向量机的问题,特别是观察优化问题的这个特定方面。如果你看训练点 X_i 或 X_j 在优化问题中出现的位置,它们只出现在这个核函数内部。这是我们在支持向量机讲座结束时已经提到的评论:它们不会单独出现在标量积之外。






由于我们现在引入了这个简写符号 K 来表示核函数(即标量积),它们现在只出现在这个核函数内部。对于我们在测试点上计算结果时使用的函数也是如此。记住,当我们训练支持向量机时,我们只需要这里的核函数;当我们想在测试点上计算结果时,我们再次只需要知道训练点和这个测试点之间的标量积,我们不需要直接知道任何训练点或任何测试点的坐标。



核心技巧








现在的技巧如下。我再次在平板上画个草图。





再次画同样的草图,我们在某个有趣的空间中有一些数据点,这个空间没有任何向量空间结构(我总是通过在数据周围画一个有趣的形状来表示这一点)。我们有一个欧几里得向量空间,暂时称之为 R^D。左边是我们的数据空间 X,我假设我们有这个特征映射,称为 Phi。





现在的技巧是,我们需要做什么?我们现在在特征空间中有数据点,假设我们也有两个类别。现在我们想在特征空间(即右侧)中找到一个超平面,来像这样分隔我们的训练点。例如,我们想运行一个支持向量机。那么我们需要做什么?我们需要计算标量积 Phi(X_i) · Phi(X_j),对于我们所有的训练点。






现在的过程是:我们从左侧空间 X 中的原始数据开始。我们通过特征映射 Phi 将其映射到欧几里得空间。现在在这个欧几里得空间中,我们想做一个线性分类器。为了做到这一点,我们需要计算这些标量积,即 Phi(X_i) · Phi(X_j)。现在来了一个技巧,也许我用红色来画。





现在的想法是,核函数可能给我们提供一种简化的方式来实现它。因此,我们现在假设存在一个核函数 K(X_i, X_j)。核函数接受原始空间中的参数 X_i 和 X_j,并可以直接计算核值。这个想法是,K(X_i, X_j) 等于如果我们先嵌入到这个欧几里得空间然后计算标量积所得到的结果。





核方法的整个技巧就是使这件事成为可能。这就是我们想要达到的目标。




我在幻灯片上也有这个,这或多或少是我刚才解释的内容。再次用文字描述:我们想要达到的目标本质上就是我在平板上刚刚解释的。







核方法的正式目标





现在,这就是我们想要做的。假设我们在某个抽象空间中有一些点。这个空间本身没有任何结构,特别是它没有任何线性结构或向量空间结构。







我们想要隐式地拥有这样一个特征映射,将我们的数据点嵌入到某个好的特征空间中(通常是 R^D,或者更一般地是一个希尔伯特空间,但现在不用担心)。所以我们想要有这个特征映射 Phi。然后,一旦我们将数据转换到这个空间,我们想要计算点之间的标量积,并想在这个特定空间中使用线性算法。




现在的技巧是,我们希望避免显式计算这个特征映射 Phi,然后显式计算标量积。我们想要这种简写符号,它可以直接将我们从输入空间带到特征空间中计算出的标量积。





如果我们设法建立了这样的构造,这就被称为核算法,其背后的整个技巧被称为核技巧。我们稍后可能会为更多算法讨论它,它在文献中确实被称为“技巧”。





核的正式定义




当然,这看起来是一个非常抽象的想法,也有点奇怪。所以可能我们需要做一些形式化的工作,以便能够定义核是什么,以及这种方法何时有效,然后理解将会发生什么。


让我们从定义核开始。这是现在的正式定义。假设 X 是任意空间。我们对 X 不做任何假设。所以这里 X 是任意集合,然后我们有一个函数 K。它接受我们空间 X 中的两个点作为输入,并产生一个实数。





这个函数应该是对称的。这是第一个属性,我已经写在这里了。对称意味着 K(x, y) 等于 K(y, x),所以我可以交换 X 中两个参数的顺序,仍然得到相同的结果。



如果函数是对称的,那么第二个属性需要为真,我们才称那个东西为核函数。第二个属性如下:对于所有自然数 n,我们查看 X 中的任意 n 个点。它们可以是我们的训练点,但原则上也可以是任何其他点。所以我们固定空间中的 n 个点。我们还固定一个 R^n 中的向量。所以每个数字 c_1 到 c_n 都是一个实数。总的来说,这些数字 c_1 到 c_n 构成了 R^n 中的一个向量。我们也固定它。那么需要为真的属性是:如果我们取核值与标量值的二次型,我们得到的结果大于或等于 0。




具体写出来是:我们对 i 和 j 从 1 到 n 求和,c_i * c_j * 核值 K(x_i, x_j) 需要大于或等于 0。重要的是,这个属性必须对任何 n 都成立。一旦你固定了 n,对于空间中的任何 n 个点以及你可以选择的任何 c 值,它都必须成立。仅仅找到一个特定的点集和一个特定的向量 c 使其成立是不够的,它必须对所有这样的选择都成立。





如果这个属性得到满足,并且 K 也是对称的,那么我们就称 K 为一个核函数。





核矩阵





我们做的下一个定义是定义核矩阵。核矩阵就是那个以所有核值作为元素的 n×n 矩阵。所以我们首先固定一些点 x_1 到 x_n。我们总是假设这些点是已知的。然后说这些点之间的核矩阵就是那个元素为 K_ij 的矩阵,其中元素 K_ij 由 x_i 和 x_j 之间的核给出。它本质上也是标量积的格拉姆矩阵,其中包含不同点之间标量积的特定元素。




现在注意,用更简洁的矩阵符号,我在这里用求和和系数等写出的定义更容易表述:我们有向量 c,我们想要的是 c^T K c ≥ 0,对于所有向量 c 和所有核矩阵 K。




目前,这只是一个正式的定义。我们稍后会看到为什么我们以这种方式进行定义。





关于核定义的几点说明




现在,让我简单做几点说明。第一件重要的事情是:并非所有核矩阵的元素都大于等于 0(甚至大于 0)的函数就是正定的。这不是真的。原因很简单,你可以尝试找一个反例。也许把它作为一个练习:尝试找到一个反例,定义一个对称矩阵(比如一个 2×2 矩阵,所以你只需要定义四个元素,因为对称性,实际上你只需要定义两个元素),定义一个不是正定的矩阵。这意味着你尝试找到一个矩阵和一个向量 c,使得计算 c^T K c 时,结果不大于或等于 0。




我想做的另一个说明是关于符号或人们如何称呼所有这些矩阵。这在不同的文献(数学、计算机科学)中非常不同,也因论文和书籍而异。总是变化的是你称什么为正定或半正定。在数学中,人们倾向于说满足上一张幻灯片中属性的矩阵是半正定的,因为它有大于或等于 0,他们只会在严格大于 0 时才称它为正定。在机器学习文献中,有些书这样定义,有些书则不同。所以每当你读到关于正定的内容时,你总是需要检查定义,看看他们指的是大于等于 0 还是严格大于 0。我提到这一点是作为警告,因为它经常引起混淆。如果你对某些属性或论文中关于正定矩阵的陈述感到困惑,你可能首先想检查他们实际使用的定义。




第一个观察:已知的核函数




现在,我们可以做的第一个观察是,我们已经知道一个核函数。核函数如下:假设我们有一个没有任何结构的抽象数据空间。假设我们有一个映射 Phi,它将这个数据空间映射到 R^D。我再次画一个图。这里我们再次有我们的空间。我们有这个映射 Phi,它将空间的元素映射到 R^D。在这个空间 R^D 中,我们可以计算一个普通的标量积。





现在我们可以检查这是否以某种方式导致一个核函数,确实如此。现在我们要做的是定义一个核函数 K(x, y) 为 Phi(x) 和 Phi(y) 之间的标量积。目前,把它当作一个定义。我们被给予了这个空间、特征映射 Phi 和空间 R^D,我们知道标量积是什么。给定所有这些,我们定义函数 K。现在我想说的属性是,这个函数 K 是一个核。




如果你想证明这一点(也许你想把它作为一个练习),你需要证明两件事。第一件事你需要证明 K 是对称的。这非常明显,因为标量积是对称的。所以你会立即看到 K(x, y) 等于 K(y, x)。这直接源于标量积的定义是对称的。然后你需要证明这个正定性属性。这也直接源于标量积的定义。因为如果你记得,标量积是一个对称、正定的双线性形式。所以这将直接从标量积的定义中得出。但如果你对这些术语不太熟悉,你可能想把它当作一个练习,并正式地证明它:取标量积的性质,然后证明我放入核定义中的这个属性确实是真的。





现在我们简单地相信这是真的。并观察到,这某种程度上也是我们以这种方式定义核的背景。因为我说的是,我们从这个抽象空间开始,通过 Phi 将其带到空间 R^D,然后想用核函数替换标量积。所以,如果这种标量积不满足作为核的性质,那么整个方法就注定失败,因为这正是我们这样做的原因。这也是人们提出这个定义的原因。原则上,当你试图证明一个定理或推导某种方法时,你首先定义你需要的对象的属性,使其符合你想要做的事情。这正是核定义被精确地以这种方式制定的原因。



核矩阵的表示






如果我们现在看核矩阵,我认为这很清楚,但让我们看看这样一个核函数的核矩阵是什么样子。假设我们被给予空间中的 n 个点。我们有一个特征映射,我们再次认为我们有这样一个映射。然后我们可以用 Phi 表示那个包含数据点作为行的 n×D 矩阵。我们已经在平板上多次看到这个了。我们现在有这个矩阵 Phi,它是一个有 n 行和 D 列的矩阵,n 是数据点的数量,D 是欧几里得空间的维度。




现在我想指出的点是,核矩阵现在由 Phi * Phi^T 给出。所以我们有 K 等于 Phi 乘以 Phi 的转置。你可能想验证一下。也许只是为了确保没有明显的错误:核矩阵是一个 n×n 矩阵。矩阵 Phi 是 n×D。矩阵 Phi^T 是 D×n。所以维度至少是匹配的。我们在这里得到的是一个 n×n 矩阵。






也许作为一个有趣的练习,在这一点上,我想问你一个不在这个幻灯片上的问题:如果你看 Phi^T * Phi,这个矩阵是什么?我们将在以后的某个讲座中看到它,它也是一个非常特殊的矩阵。也许你可以尝试玩一下,看看是否能理解这个矩阵是什么。这也是为什么我总是非常注意矩阵维度匹配的原因,因为如果你现在做数学运算,你会看到这是一个 D×D 矩阵。所以我总是记不住核矩阵是 Phi * Phi^T 还是 Phi^T * Phi,我只知道是其中之一,所以我总是需要做数学运算来知道哪个顺序能得到核矩阵,另一个顺序得到那个神秘的矩阵。我现在不打算揭示它是什么,但你以后会学到,也许你可能想思考一下。




核函数的作用





在我们能够全面展开这个方法之前,还有一件事我们需要理解。即,这样一个核函数的作用是什么?假设你从一组分子 X 开始,你的空间 X 是分子,比如在化学信息学中。你想将分子分类为对特定蛋白质有希望的物质,用于设计药物。所以这是一个分类问题:分子可以结合到这个蛋白质,或者不能结合。是或否。





所以输入空间由分子组成,你想解决一个分类问题。现在有人告诉你,你应该使用核方法。那么,使用什么样的核函数呢?我们仍然对这种数学属性之外的任何直觉都没有。




现在来了第一点直觉。即,核函数是一种衡量数据点之间相似性的方法。它是一个相似性函数。




让我们看看如何证明这一点。首先,我再次给出线性核作为核函数的直接例子。这或多或少是我们已经看到的。我们可以定义的第一个核是线性核。我们从 R^D 开始。我们的特征映射是恒等映射。我们什么都不做,标量积就是核,简单地就是标量积。我画个图:我们已经从 R^D 开始。我们在这个空间中也有一个标量积。我们想要在右侧拥有的空间又是 R^D,带有正常的标量积。我们在这里使用的特征映射就是恒等映射。我们什么都不改变。那么,当然,我们有 K(x, y),其中 x 和 y 存在于我们的原始空间中,也是 x 和 y 之间的标量积,因为映射 Phi 的起始空间和最终空间是相同的。






所以这是核的第一个例子。现在来看第二个例子,这也是我们可以看到相似性函数直觉的地方,这被称为余弦相似度。例如,这经常用于文本文档。假设你的数据再次存在于空间 R^D 中。假设你的数据点,你的向量是归一化的。所以它们都有范数 1。这意味着它们都位于单位球面上。唯一区分数据点的是它们在单位球面上的角度。现在你会说,如果两个点在这个单位球面上彼此靠近,那么它们是相似的。




例如,在幻灯片上的图中,右侧这两个黑点会被认为是相似的。而这两个蓝点可能被认为是不同的,因为它们相距甚远。现在,为了衡量点是否相似,你可以做的是计算两个点之间角度的余弦值。我在下一张幻灯片上有它。如果角度之间的余弦是 1,那么两个点一致,我们会称它们非常相似,因为它们实际上是相同的。如果余弦是 0,点是正交的,我们会说它们彼此非常不同。





如果你记得你的数学背景,如果数据点是归一化的并且位于单位球面上,那么两个向量之间角度的余弦被定义为标量积。在这个意义上,余弦就是这些特定点的标量积。它也编码了相似性信息。这是你应该记住的例子之一,或者至少是例子之一。当我们谈论核时,这就是为什么我们认为核可能编码了一些相似性。





高斯核(RBF核)






我们想看的下一个核是高斯核。如果有任何核你应该从这整个讲座中记住,那就是高斯核。它在许多、许多、许多应用中都是默认的核。




定义如下。我们再次假设我们的原始数据存在于 R^D 上。也许目前这已经令人困惑了,因为我介绍或激励整个核方法的方式总是说,我们从分子空间或一个没有任何数学结构的真正抽象的空间开始,然后将其带到具有良好结构的空间。但请注意,即使我们的数据已经具有欧几里得表示,类似的直觉也可能有用,因为我们可能想调用核机制,只是为了能够在我们的空间中表达非线性函数。



现在,高斯核是在这种情况下,如果你没有更好的想法时使用的核。我们从 R^D 开始。我们有一个核函数,核函数定义如下:它接受两个数据点,本质上计算这两个点之间的正态分布密度。所以你取 x 减去 y,将其放入正态分布或钟形曲线的密度中。Sigma 是一个参数,告诉你这个特定核和高斯函数的宽度。我们将在后面的幻灯片上看到许多这方面的例子以及为什么它也有意义。




目前,当然,我们为什么可能想使用这个还不太清楚。在我们甚至提出为什么我们可能想使用它的直觉之前,我们首先需要弄清楚这是否真的是一个核。因为记住,核函数不仅仅是数据点之间的任何相似性函数,它具有这些特定的属性。







那么我们需要证明什么?也许想一秒钟。我们需要证明的是这个函数是对称的。这通常是微不足道的。在这种情况下也是微不足道的。我的意思是,交换参数的顺序,什么都不会改变。但我们需要证明这个半正定性属性。这通常是很难证明的,而且不是很明显。对于高斯曲线,当然,这是众所周知的,已经在数百万本教科书中描述过。你可以在机器学习教科书中查看,或者在任何概率论教科书,至少是数学概率论教科书中关于多元概率的部分看到它,因为这本质上涉及协方差矩阵以及协方差矩阵是正定的这一事实。所以外面有很多证明。我不想深入探讨如何证明,因为这走得太远了。但我想提一下,这通常并不容易。我记得几年前,我花了大约三个月的时间试图证明某个核函数是正定的,但我没有成功。也许作为一个旁注,在这种情况下你会怎么做?你做的第一件事是运行许多、许多模拟,你总是从你的空间中抽取点,抽取向量 c,并且总是评估你得到的是否是正定矩阵。你让它在集群上运行五天。你找不到反例。所以本质上,你确信你的函数可能是正定的。但现在你需要证明它。这通常在技术上非常具有挑战性且不明显,在许多情况下,你只需要放弃。所以我也放弃了我当时正在研究的那个特定核函数。




高斯核的直觉






作为高斯核的直觉。它编码了什么相似性概念?我再次在平板上画一下。或者也许先从幻灯片开始。如果你记得高斯曲线是什么样子,你可以在幻灯片上看到一半的高斯曲线。现在假设你想计算相似性的数据点位于中心。也许我画一下。所以假设我们的数据点位于实线上,我们只有一个维度。这是我们的数据点 x,这里是另一个数据点 y。现在我们想知道 x 与 y 有多相似,我们如何计算相似性?本质上,我们看这里高斯曲线的高度。所以我们将曲线中心放在第一个数据点上。然后看,也许我不知道 y 轴。然后我们检查值,高斯曲线在点 y 处的值。这本质上是我们编码的相似性。




现在,这仍然有点抽象。但也许让我们画一个不同的图。现在假设我们有二维数据点。假设我们对这个特定数据点的相似性感兴趣。现在,这个高斯曲线看起来如何?它现在是一个二维对象,但也许我把它画成一维的,只是为了有一个更好的图。假设曲线看起来像这样。它以我的数据点为中心。现在会发生什么?这个点在这里。它仍然与原始点相当相似,因为高度仍然... 这是中心的高度。这是这个新点的高度。所以它相当高。所以我们仍然会说这个点是相似的。而这个点在这里,下一个点,如果我在我的产品上加一个刻度,这个点的相似性已经接近 0,并且它离我们的原始点更远。






所以这个相似性函数所做的是,你在感兴趣的数据点上放置一个高斯曲线。然后本质上,你有等高线,等高线告诉你相似性下降的速度。例如,每个在这个等高线内的人仍然与 x 至少有二分之一的相似性,然后我们到下一个等高线,说它与 x 至少有三分之一的相似性,依此类推。它下降得非常快。所以高斯曲线具有尾部非常低的特性。我的意思是,有相当大面积的区域它是高的,但然后它基本上接近 0。





你可以在幻灯片上看到这一点,所以如果你看这样一个高斯曲线的几何形状。Sigma,核宽本质上告诉你高斯的宽度。只是为了有一些直觉,如果你从你的数据点开始,离开一个 sigma,那么本质上,这个曲线的高度仍然是 0.7 左右。如果你离开 3 个 sigma,这只有 0.01 左右,然后如果你走得更远,它基本上接近 0。




所以这个核宽 sigma 本质上告诉你,你认为一个特定点的影响区域应该有多大。再次,为了获得一些直觉,也许抱歉,再画一个图。这里是我们的数据点。像这样。现在假设我们会做类似 K 近邻分类的事情,你会说 k 应该是 5 左右。所以我们想知道,我不知道这个数据点的五个最近邻居是什么,所以我们会检查,也许我不知道,这些是五个最近的邻居。现在你可以构造一个具有类似属性的核。所以你查看核函数的等高线。你选择它,使得,我不知道,3 个 sigma 等于,我不知道,你在 K 近邻分类器中会使用的 K。根据数据的尺度,你需要选择 sigma 更大或更小,但你需要以这样一种方式选择它,使得一些数据点与你的点相当相似,而许多其他点与你的点不相似。



但我们将在讲座中进一步探讨这一点,这只是为了获得一些背景直觉。



哦,还有一个重要的说明:高斯核通常也被称为 RBF 核(径向基函数核)。这来自旧的神经网络文献,我认为人们称它们为径向基函数网络,并在那里为不同类型的网络使用了相同类型的相似性函数。





其他核示例




现在,外面还有很多其他核,我只想提一下其中的几个。




有多项式核,它在实践中基本上从未使用过,但总是在讲座和练习中作为例子,因为这些核有一些很好的性质可以证明。你不需要记住这个核是什么,我只是想把它放在幻灯片上,因为如果你曾经读到过多项式核,这就是它。所以它本质上定义为:你再次取你的数据点存在于... 你的空间已经是 R^D。你取两个点,核本质上是你的输入的某个多项式函数。所以你相乘(因为我们在 R^D 中,所以你有向量,你相乘它们,这是一个实数),加上 c,然后取它的 k 次幂。它被称为多项式,因为这本质上是类似于 k 次多项式的东西。正如我所说,它在实践中从未使用过,但对于理论来说很好。所以如果你曾经偶然遇到它,这里有定义它的幻灯片。





当然,还有更多定义核的方法,一种方法是使用我们在讲座开始时在回归框架中看到的特征映射,在那里我们说你可以定义一个特征映射。例如,使用正弦波,或者你有其他特征描述:你有一个客户数据库,你说一个特征是客户的年龄,一个特征是客户的身高,一个是客户的收入,等等,所以你有一些是实数的特征,然后你有一个 R^D 中的向量。当然,这也是你的数据在这个特征映射中的一种表示。我再次展示一下。所以这里我们有我们的抽象空间 X,我们有我们的欧几里得空间,现在以这种方式,你可以显式地定义这个特征映射。这通常是你不想做的,但有时它仍然有效。所以现在你通过拥有这个特征向量并取特征向量之间的标量积,获得了客户之间的相似性。





在幻灯片上,我现在有文本的相同例子。例如,你可以对你的文本使用词袋表示,那么你就将你的文本映射到 R^D 中,然后你可以在 R^D 中计算这个标量积。




还有很多其他例子。你可以自己看看它们。例如,如果书籍被同一用户购买,那么它们是相似的,所以你可以检查定义哪本书被哪个用户同时购买的矩阵,你可以用它来定义一个核。也许你可能想在家里尝试一下,看看你是否知道在这里该做什么。你也可以说两个图、两个分子如果包含相同数量的相同类型的基序,那么它们是相似的,等等。所以这本质上是我们已经在以前的讲座中看到的那种显式特征描述。所以这并没有什么真正的秘密。如果我们只想用这个,我们就不需要核方法,但它是数据上核的一个简单例子。




图上的核





接下来我想向你展示的是一个不那么明显的情况。情况是,我们被给予图,例如分子。我们被给予图,一个大图,我们想计算这个图中顶点之间的相似性。例如,你有一个社交网络,顶点是人,链接是友谊,你想计算社交网络中不同人的相似程度,所以你有一个巨大的图,相似性是在这个图内的顶点之间。


注意,还有另一种我早些时候偶然开始提到的应用:分子,其中每个数据点本身就是一个图,比如一个分子,然后你想计算两个这样的图之间的相似性。这不是我们目前正在看的情况。所以我们现在的情况是你有一个大图(比如 Facebook),你想计算图中两个特定顶点之间的相似性。




以下是这可能如何工作的。标准的想法是:如果两个顶点共享许多邻居,如果它们在图中彼此接近,那么它们是相似的。所以你想象你有这个巨大的社交网络,如果这里有德国这个人,那里有非洲某处的另一个人,他们从未见过面,他们没有任何共同的朋友,并且如果我从这个人走到这个人在图中,这将需要很长时间,因为我需要沿着许多不同的顶点走,那么我可能会说这两个人不那么相似。




而也许,如果我在图宾根,然后大学里的另一个同事,我们看某种社交图,那么我们会更接近。如果我们看我自己和我的家人,我们会更接近。这就是你想要编码的概念。




它的工作原理如下。我们通常做的是检查两个顶点。例如,这个红色的在这里,哦,抱歉,这里的这个红色的和这里的这个红色的。我们说两个顶点是相似的,如果它们被许多短路径连接。可能意味着你可能想看最短路径,但也许有几条路径,并且你在社交网络中两个人之间拥有的短路径越多,这些人就越相似。如果你考虑社交网络中的路径是什么,例如,这里有我自己,这里有我的一个朋友,也许可能有一个直接链接,因为他是我的朋友,但然后也许还有这个第三人,他既是我的朋友也是那个人的朋友,所以有第二条路径,然后可能有更多的人既是我的朋友也是那个人的朋友,所以有很多、很多链接,也许是间接链接,但在我和这个朋友之间。






这样的东西越多,我就认为越相似。如果你看这里的这个图,我认为这是一个 K 近邻图。所以这里的两个红点相当相似,因为有一条短线连接它们,实际上有很多短线。而你可能会说这里的这两个绿点,它们不像以前那样相似,因为本质上只有一条短路径连接它们,我的意思是这条路径只沿着这条特定的边,所以也许我的意思是存在一定的相似性,但也许这只是偶然的,所以你不会认为这是一个非常显著的相似性。




现在要正式定义这个,它的工作原理如下。我们现在考虑一个有向图,我们有边权重。假设这些边权重在 0 和 1 之间。重要的是,边权重编码了相似性。所以相似性有多高?1 意味着我们非常、非常相似,0 意味着我们完全不相似。如果你需要一些直觉,相似性总是类似于距离函数的反面,所以如果两个点非常相似,距离值就非常小,相似性值就非常高。所以现在我们假设边是根据相似性加权的。





现在我们首先考虑一条特定的路径,并计算这条路径的权重。我们简单地通过乘以这条路径上所有的相似性来定义一条路径的权重。有时你也可以想象这些数字是相遇的概率之类的东西,然后沿着这条路径相遇的概率被相乘。所以一条路径的值、权重是所有点的乘积,所以它从 v1 开始,v1 到 v2,v2,依此类推,到 v_k,然后我们乘以所有权重。这就是我们定义一条特定路径的权重的方式。





现在我们需要定义两个顶点的相似性,因为这就是我们想做的。现在我们做的是,我们固定一个参数 k。这有点像我们想要查看的邻域的大小。所以为了计算相似性,我们考虑所有长度最多为 k 的路径。所以首先,从我自己开始,找到所有可以从我自己通过长度最多为 k 的路径到达的其他人。然后我们总结所有这些路径的权重。




所以这里我自己和另一个顶点 v 之间的相似性,是所有在 P_k 中的路径的权重之和,其中集合 P_k 由所有长度最多为 k 的路径组成。如果集合中没有路径,那么相似性将是 0。例如,我想计算我自己和非洲这个人之间的相似性,参数 k 是长度 3,所以我们看最多三个人的路径。也许在 Facebook 上,我自己和这个人之间没有这样的链接,那么我们简单地说相似性是 0。当然,k 是一个我们必须设置的参数。但现在,我们不要谈论它。它只是一个参数,就像在 K 近邻情况中一样。






所以,到目前为止,这编码了这种直觉:如果图中有许多具有高权重的短路径连接两个顶点,那么两个点是相似的。到目前为止,我们所做的是定义了一个合理的相似性函数。我们在这里定义的函数 S 是一个相似性函数。我们还不知道它是否是一个核。正如我所说,很可能,如果你简单地定义一个相似性函数,它不会是正定的。




现在,如果你希望它成为一个核,你需要做的第一件事是使其对称。注意,因为图有有向边,可能不是这样的:可能有从我到一个人的路径,所以我说我是这个人的朋友,但也许这个人不说他是我的朋友。所以可能存在有向路径。所以如果我计算 S(v, v~),这可能与 S(v~, v) 不同。解决这个问题的最简单方法总是对称化你的表达式:你简单地定义核,现在对称函数为两种版本的和,即 v 和 v~ 之间的相似性加上 v~ 和 v 之间的相似性。通过这种方式,你总是可以轻松确保你以这种方式定义的核是对称的。所以这是简单的部分。





所以这里我再次有另一个图,但我想我已经解释过了。它是否真的是一个核函数并不那么明显。在这种情况下,它是一个核函数,但证明并不容易。需要研究这个。如果你感兴趣,你可能想谷歌“图核”,然后你会偶然发现这个。





关于显式特征表示的说明




我想在这里强调的另一个方面是,我们之前看到的许多核都有一个显式的特征表示,我们说,例如,对于客户,我们取他们的年龄、身高和收入,这些是我们的特征。然后我们得到标量积作为核。现在,在这种情况下,如何定义一个显式特征表示,使得如果你取显式特征表示之间的标量积,最终得到这个特定的核,这并不明显。你可能想思考一下为什么,因为这有点微妙,因为你可以考虑说,好吧,我对一个顶点做一个特征描述,本质上说明谁在最多 k 的邻域内,我把所有权重放在这个向量的某个地方,并试图通过非常复杂的特征来描述图中的这个特定顶点和另一个特定顶点,然后我只需要将它们相乘,就会得到结果。在这种情况下,这是行不通的。你可能想尝试找出为什么它行不通。有一个具体的原因。我在这里不揭示它。这将花费你一些时间,如果你喜欢,可以把它作为家庭练习。


扩散核




我想做的另一个说明是,我们在这里用来构造这个核的特定原理导致了一整个核族,称为扩散核。因为一些你可能有的直觉也来自物理学。假设你有一个网格。比如,你有一个由一些金属线组成的网格,网格线是你图中的边。现在,我不知道,你在一个特定点上放一点热量,现在你想看看它扩散到网格其他特定区域的速度有多快。这可以用类似的过程来描述:首先,它扩散到邻居,然后到它们的邻居,所以它扩散的速度取决于一个点在指示中有多远,但也取决于有多少线连接这两个点,因为热量将通过所有线传输。所以如果有更多的线,你会更快地将热量从一个顶点传输到另一个顶点。更一般地,这种原理被称为扩散原理,你可以通过基于这个扩散框架构建,推导出图上的整个核族。无论是在物理学中,还是在随机过程中,或者无论你想看哪里,这都是这个特定核的直觉。

构造新核的规则





正如我所说,证明某个函数是一个核通常非常困难。但是有一些规则,如果你已经有一些核,你可以用它们来从现有的核设计新的核。这些规则我想展示给你。这些都是典型的简单规则,大多数也容易证明。我建议你可能想把它作为一个练习。





假设我们在 R^D 上有两个核。实际上,不,抱歉,它们不一定在 R^D 上,它们不需要。所以我们有一个称为 X 的特征空间,它不一定是 R^D。现在我们有两个核,它们接受 X 的两个参数作为输入并映射到 R。所以核的标准设置。现在我们可以操作这些核。例如,我们可以构建一个新核:我们从 K1 开始,乘以某个常数 alpha,其中 alpha 是一个正常数。那么我们将再次得到一个核。这很容易证明,只是一行。我们也可以取两个核的和,它也将是一个核。我们可以取核的乘积,它也将是一个核。我们可以取一系列核的点态极限。这听起来有点不像你定义新核时首先想做的事情,比如取一系列其他核并检查它收敛到哪里。这个属性对理论很重要,因为你经常需要某种完备性属性。所以如果你有一个由核张成的函数空间,并且你在空间中取极限,它最终将再次进入核空间。这就是为什么这个属性很重要。




然后还有另一件事:如果你有两个核,并且你有另一个函数,它从你的输入空间中取点并分配一个数字(比如某个权重或其他什么)到这个实数,那么你也可以以这种方式定义一个新核:你取原始核 K(x, y),然后乘以 f(x) * f(y)。特别是,如果你中间没有任何东西,如果 K(x, y) 缺失,对于任何你可以取的函数 F,如果你定义你的核为 F(x) * F(y),这将是一个核函数。它通常不是一个非常有用的核函数,但它是。



关于正定性的最后说明



我想在幻灯片上简单提到的还有一点。关于核矩阵是正定还是半正定,以及标量积是正定还是半正定,经常有一些混淆。我已经暗示过这一点。有两张幻灯片,你可能想读一下。






标量积是正定的。特别是你有这个属性,如果这是在线性代数中定义的:如果你取一个点与自身的标量积,结果总是大于 0,如果 b 不是零向量。核矩阵总是一个半正定的东西,因为我们只有大于或等于 0。这不是一个矛盾,我想让你思考一下为什么这不是一个矛盾:我从一个在这个特定意义上正定的标量积开始(我们在顶行有),我们最终得到一个半正定的核矩阵。这如何发生,以及为什么核矩阵不需要是严格正定的。









本节课总结




在本节课中,我们一起学习了核方法的基本概念。我们从线性算法的局限性出发,引入了核作为将线性算法扩展到非线性领域的强大工具。我们详细探讨了核的正式定义,即对称且满足半正定性的函数,并介绍了核矩阵的概念。通过线性核、余弦相似度核和高斯核(RBF核)等具体例子,我们理解了核如何作为相似性函数工作。我们还了解了在图数据上定义核的方法,以及通过简单规则从现有核构造新核的技术。最后,我们讨论了核矩阵与标量积在正定性上的微妙区别。这些基础知识为我们后续应用核方法(如核化支持向量机)奠定了坚实的理论基础。
19:再生核希尔伯特空间 🧮
在本节课中,我们将要学习核函数背后的核心理论——再生核希尔伯特空间。我们将理解为什么一个满足特定条件的函数可以被视为一个核,以及如何从这样一个核函数构造出一个特征空间和映射。
回顾:核函数的目标
上一节我们开始定义核函数。本节中,我们来看看建立核函数作为机器学习合适工具的理论基础。
我们始终假设给定一个数据空间 X,它没有任何特定结构。我们希望有一个映射 Φ,将这个没有结构的输入空间映射到一个我们通常称为欧几里得空间 R^D 的空间。在本讲中,我们也会看到它是一个希尔伯特空间 H,这是比 R^D 更一般的概念。如果你不知道希尔伯特空间是什么,不必担心,可以始终将其理解为 R^D。
现在的情况是,我们有两个输入数据点 x 和 y。它们将被映射到特征空间中的另外两个点:Φ(x) 和 Φ(y)。然后我们想要计算一个标量积(内积)。我们得到 Φ(x) 和 Φ(y) 之间的内积。
我们之前已经阐述了直觉:我们希望避免计算这个迂回路径,即显式定义 Φ 和在希尔伯特空间中的内积。相反,我们希望有一个核函数 K,使得 K(x, y) 等于 Φ(x) 和 Φ(y) 之间的内积。
到目前为止,我们已经定义了核函数的性质,但现在我们需要证明这些性质确实能使这个方案成立。
核心定理 🔬
现在有一个定理告诉我们为什么这会成立。请查看幻灯片,我将阅读这个定理。
一个函数 K: X × X → R 是一个核,当且仅当存在一个希尔伯特空间 H 和一个特征映射 Φ: X → H,使得核性质成立,即 K(x, y) = <Φ(x), Φ(y)>_H。
让我们来解读一下。这是一个“当且仅当”的陈述,因此有两个部分,它们是等价的。
- 第一个陈述是:K 是一个核。
- 第二个陈述是:存在一个特征映射和一个希尔伯特空间,使得如果执行这个映射图,那么核就是这个图中的捷径。
如果你从未听说过希尔伯特空间,不用担心。简单地将其想象成欧几里得空间即可。希尔伯特空间的关键性质是:它是一个向量空间,具有内积(这很重要)。从数学角度来看,该空间需要是完备的,这意味着所有柯西序列都会收敛。特别是在希尔伯特空间中,这个内积总是与一个范数相关。但正如我所说,如果你以前没见过,就把它想成 R^D,这完全没有问题。
这是我们在 iPad 上刚刚看到的示意图。
这里有一个问题给你。在定理中,我说有两个方向。
- 一个方向是:如果某物是一个核,那么存在这个特征空间、特征映射和希尔伯特空间,使得图示成立。
- 另一个方向是:假设存在一个特征映射和希尔伯特空间,并且我们以标量积的方式定义 K。那么 K 是一个核吗?
如果你想证明这个定理,我们需要证明两个方向。我的第一个问题是:有一个简单的方向和一个不那么简单的方向。事实上,“不那么简单”可能说得太轻了,困难的方向是困难的。这不是你刚开始就能立即证明的。现在我问:哪个是简单的方向?请暂停视频,思考一分钟左右,找出简单的方向,然后我们可以讨论困难的方向。
简单的方向是从我们拥有希尔伯特空间中的特征映射到核函数的方向。这本质上就是我们在上一讲中已经看到的。我们说,如果某处有一个标量积,并且我们将核定义为这个标量积的求值,那么它就是一个核。这正是根据核的定义,它是对称且正定的。所以这是简单的方向,它直接遵循核的定义。我们以这种方式定义它,使得这个方向为真。
棘手的部分确实是另一个方向。
构造困难方向:再生核希尔伯特空间 (RKHS) 🏗️
所以我们现在需要证明的是:假设我们被给定任何空间(可以是任何东西,可以是文本、分子等等)和该空间上的一个核函数。假设有人给你一个函数并告诉你它确实是一个核函数,你知道它是正定且对称的。但这就是你在你的空间上所知道的全部。你没有任何结构,没有度量,没有希尔伯特空间,什么都没有。你可能甚至没有拓扑,你只有一个空间和这个函数。有人告诉你,根据核的定义,这个函数是一个核函数。
现在你需要证明的是:你需要证明存在一个向量空间 H(抱歉幻灯片上有笔误,这个不应该在那里),并且在这个向量空间上存在一个标量积(我们用下标 H 来区分它,以确保知道我们当前在哪个空间工作)。并且存在一个映射 Φ,将原始点映射到新空间 H,使得最终你的核函数恰好与这个新空间上的这个标量积一致。这对我们输入空间中的所有 x 和 y 都必须成立。
现在考虑一下,这确实不是一个简单或平凡的陈述,因为给定核,你需要构造向量空间,你需要构造向量空间上的标量积,你需要构造这个映射 Φ,而所有这些都需要以使得这个性质成立的方式来构造。所以这绝不是显而易见的。
这个问题的解决方案,一旦有人展示给你,就不再那么复杂了,但仍然不那么容易。解决方案就是所谓的再生核希尔伯特空间,缩写总是 RKHS。现在我们将看到这个构造是如何工作的。
第一步:定义空间和映射
我们首先想定义空间本身。这个空间将是一个函数空间。所以我们要构造的空间 H 中的元素将是函数。
现在我要做的是:我需要定义一个空间 H 和一个映射 Φ,使得我可以将 X 中的任何元素映射到空间 H 中。所以 Φ(x) 应该在空间 H 中。我从一个点 x 开始,x 在我的原始空间中,我想最终进入这个希尔伯特空间。
现在我要做的是(我先写下来,然后再解释):我取原始空间中的某个点 x,我将把它映射到希尔伯特空间中称为 K_x 的点。我定义 K_x 为一个函数,即 K(x, ·)。K(x, ·) 是一个从 X 到 R 的函数。如果你不熟悉这个符号,点号表示参数将要代入的位置。所以 x 不是函数的参数,它是一个固定的参数。而点号所在的位置,就是我们放入参数的地方。所以 X 中的一个点 y 将被映射到 K(x, y)。再次强调,y 是我们函数的参数,x 是函数的参数。我在这里使用的符号 K_x 试图明确这一点:K_x 是一个以 y 为参数的函数,它将被映射到 K(x, y),其中 K 当然是我们被给定的那个核函数。
再次强调,幻灯片上也有。所以我们有一个原始空间中的点 x,它将被映射到一个将存在于这个新空间中的函数。这个函数 K_x 接受一个参数 y,并将其映射到 K(x, y)。为了更明确,这也是幻灯片上的图,但我喜欢重画它。
所以我们这里有 x1, x2, x3 在我们的原始空间中,这里我们在新空间中。那么 x1 将被映射到这个函数 K(x1, ·),x3 将被映射到 K(x3, ·),x2 将被映射到某个 K(x2, ·)。所以每个原始点最终都被映射为新空间中的一个函数。
这对于非数学专业的人来说,已经是一个有点复杂的定义了。
到目前为止,我们只是定义了原始点的像,所以我们定义了将原始点映射到一些新点的映射。但到目前为止,这些新点没有任何向量空间结构或任何东西,但我们希望它们存在于一个希尔伯特空间中。
第二步:赋予向量空间结构
所以现在我们需要做的是,我们需要从这些点(到目前为止,我们只是有一组像点)中构造出一个希尔伯特空间。对于希尔伯特空间结构,我们需要能够求和、乘以标量常数等等。
所以现在我们做的是:我们考虑所有可能存在于我们输入空间中的点的像 K_x,并将它们视为一个向量空间的生成集。如果你记得线性代数,一个向量空间总是可以由一些元素张成。然后你需要定义取元素的和意味着什么,你需要定义乘以标量值意味着什么。然后你可以查看通过从原始数据点取一些标量和倍数所能达到的所有点。
所以,我们现在需要定义一个空间(暂时称为 G,因为它还不是我们最终要看的空间),它由这些函数的所有有限线性组合组成。所以我现在做的是:我有原始函数 K_x,我取所有线性组合。例如,我有 K(x1, ·), K(x2, ·), K(x3, ·)。这些是我拥有的三个点的像。现在我需要定义一个新函数 g,它可能是 5 * K(x1, ·) + 2 * K(x2, ·) - 3 * K(x3, ·)。这是一个点的线性组合。通过函数相加和乘以标量,我们真正意思是在空间中像求和函数那样求和函数,即求和这些函数的求值,取标量积也是如此。
一般来说,我们考虑所有可能长度任意 R 的线性组合(R 可以是任何自然数)。我们固定任何 R。对于每个 i,我们有一个 α_i,它也可以是任何实数。然后我们定义所有原始函数 K_{x_i} 的线性组合的和。到目前为止,这整个集合(它仍然是一个集合)比我们开始时的大得多。事实上,它已经是一个向量空间,这将被称为 G。
好的,所以我们现在有的是(也许我再来画一下我的图),这是我们的原始空间 X。我们现在定义了这个映射 Φ,它将一个点 x 映射到一个点 K_x。我们开始时有很多蓝点,它们是所有原始数据点的像。所以这里我们有一些蓝点。像就是另一边的蓝点。现在,我们所做的是:我们添加了更多更多的点,它们是我们通过这种方式可以达到的所有线性组合。由空间中的公式和所有蓝点和 G 点共同组成的集合,现在就是我们称为 G 的东西。
到目前为止,我们定义了(也许暂时仍称它为)一组更多的函数 G。
第三步:定义标量积
然后我们想做的是:我们想在 G 上定义一个标量积,因为最终我们想要一个希尔伯特空间。所以 G 已经是一组向量。还有一些小性质我们需要证明它是良定义的。但无论如何,所以 G 现在是一个向量空间,我们可以取和、差、乘积,所以它是一个向量空间。
现在,对于一个希尔伯特空间,我需要有一个标量积。所以现在我们需要定义我们向量空间中两个元素之间的标量积是什么。
我们首先在这些原始像上定义标量积,即在这个图中(目前在 iPad 中间)的蓝点上。所以我们需要做的是定义点 K_x 和 K_y 之间的标量积是什么。所以 x 和 y 存在于我们的原始空间中。我们将它们映射到空间 G 中的 K_x 和 K_y,我们现在需要定义这个新空间中的标量积是什么。
正如幻灯片上所示,如果你把它写出来,这是 K_x 和 K_y。如果你觉得这个符号有帮助,如果不觉得,就忽略它。但现在定义来了。第一件事只是一个等式。现在我定义标量积是什么:我简单地将其定义为 K(x, y)。
所以对于数据点的原始像,标量积本质上是它们的核值。注意,这某种程度上是我们需要拥有的,因为 K_x 和 K_y 之间的标量积是 Φ(x) 和 Φ(y) 之间的标量积,因为 Φ 是将数据点映射到函数 K_x 的映射。所以如果我们希望最终的东西是一个核,那么它最好与 K(x, y) 相同。
所以在这里,本质上我们没有选择。如果我们希望整个事情最终成立,我们定义这个标量积的唯一方式就是 exactly 这样做。
但现在注意,到目前为止,我们所做的只是定义了输入空间点像上的标量积(即之前绘图中的蓝点,目前在 iPad 右侧)。蓝点是原始数据点的像。我们现在知道这两个点之间、这些点中任意两点之间的标量积是什么。但我们还需要将这个定义扩展到向量空间中所有其他点,即线性组合,因为标量积需要定义在整个空间上。
这就是这张幻灯片中间的内容。现在,假设我们有两个函数存在于这个空间中。函数 g 是输入函数的线性组合。我们有一个函数 f,它是另一个组合。所以这两个定义中的 α_i 和 β_j 不相同,x_i 和 y_j 也不相同。而且这个线性组合的长度也不需要相同。
所以我们现在需要做的是:我们需要定义这些线性函数之间的标量积是什么。现在,再次强调,你没有太多选择。我想在 iPad 上展示一下。
所以我们现在想做的是 f 和 g 之间的标量积。目前,我们简单地代入定义。f 的定义是 ∑_j β_j K(y_j, ·)(如果幻灯片上有笔误,应该是 y_j)。然后 g 是 ∑_i α_i K(x_i, ·)。这是我们想要定义的标量积。
现在,它是一个标量积,对于标量积,你知道它在两边都是线性的。所以你需要能够做的是:你需要能够写成 ∑_j ∑_i β_j α_i,然后是 K(y_j, ·) 和 K(x_i, ·) 之间的标量积。到目前为止,我只是利用了标量积的双线性性质。如果我想定义一个标量积,它必须是线性的。所以没有选择,这个性质必须成立。
但现在注意,在这个表达式中,我们有 y_j 和 x_i,它们是我们数据空间中的原始点。对于那些点,我已经定义了标量积是什么。即,我知道标量积现在是 K(y_j, x_i)。这是根据我们之前拥有的性质,在那里我们也没有选择。
这就是我们现在在幻灯片上有的内容。所以,对于两个函数 f 和 g,它们是原始数据点的线性组合,我们将标量积定义为幻灯片上所写的那样。好的,没有选择,它必须是这种方式。
第四步:验证与完备化
现在,你仍然需要稍微思考一下这个定义是否真的有效。第一件事是:你需要检查它是良定义的,这是一个微妙的性质。注意,可能我们空间中有一个点(称为 h,是我们新定义空间 H 中的一个函数),假设 h 是一个线性组合 ∑_i α_i K(x_i, ·)。好的,所以它是任何线性组合。
现在,我达到一个新点 h 的这个线性组合可能不是唯一的,因为这些函数 K(x_i, ·) 可能是线性相关的。所以这也可以写成 ∑_j β_j K(y_j, ·),对于不同的 β 和 y。所以有两个线性组合都得到相同的函数 h,但线性组合不同,而且这些基点 x_i 和 y_j 也不同。
但现在注意,当我们定义标量积时,我们使用了这些数据点作为线性组合的显式表示。你现在需要证明的是,例如,如果你现在计算 h 和 f 之间的标量积(假设 f 是我们之前有的函数),那么无论我将 h 的哪个线性组合代入定义,这总是给你相同的结果。
如果这不成立,那么这个定义就不是良定义的。数学中的“良定义”总是意味着你做了一个不会引起任何冲突的定义。如果这个性质不成立,那么你就会有冲突,因为你有一个点,根据你如何表达那个点,你最终会得到这个标量积的不同值,这当然不可能是真的。所以你需要证明的第一件事是这是良定义的。
我没有把它放在幻灯片上,你可以在家尝试。真的不难。请尝试一下:假设你有两个线性组合,就像我们在 iPad 上那样,计算这个函数与另一个函数的标量积,并尝试证明你总是会得到相同的结果。
然后你可能想证明的下一件事是,我们定义的这个东西确实是一个标量积,即它是对称且正定的。正如我已经暗示的,当我们构建它时,某种程度上它一定是这样的,因为我们正是以这种方式构建它的。但形式上,你可能仍然想写下你需要证明哪些性质以及为什么 exactly 这些性质成立。这并不难,因为我们从一个正定函数开始。但这就是我们需要它是正定的事实的地方,因为否则,我们到目前为止定义的结果不能是一个标量积。好的,这个我也留作练习。
你需要证明的最后一件事(现在只在你了解希尔伯特空间的情况下相关)是:希尔伯特空间总是一个完备的向量空间。“完备”意味着如果你取向量空间中的点序列并且序列收敛到一个点,那么这个点也需要在向量空间内部。
所以我们现在做的是:如果你想让这成为一个真正的数学向量空间,我们需要取所有序列的极限。我们需要取这个特定点集的闭包。这就是我在幻灯片上写的:为了使 G 成为一个适当的希尔伯特空间,我们需要取拓扑完备化,通常用 G 上加一条横线表示。然后这意味着你添加了空间中序列极限的所有点。结果空间 H 就是我们称为希尔伯特空间的东西。它被称为再生核希尔伯特空间。通过构造,它具有 K(x, y) 与 Φ(x) 和 Φ(y) 之间的内积相同的性质。
好的,所以这确实不是一件容易的事,特别是如果你以前没见过。如果我上一门正式的课,我现在可能会重复这个构造,也许我现在也这样做。可能有助于理解。所以让我们再次回顾一下我们需要做什么。我现在做得快一点,但试图再次引出概念步骤是什么。
我们需要做的是:我们被给定一个空间(原始空间)和核函数 K。我们需要构造这个向量空间 H、这个特征映射 Φ 以及空间上的这个标量积。
为了构造空间本身,我们进行如下操作。对于原始空间中的每个输入点 x,我们定义这个点的像是什么。一旦我们完成了这个,我们就已经有了特征映射。这个点的像将是一个函数,称为 K(x, ·)。所以到目前为止我们已经定义了特征函数 Φ。这就是你在底部图像上看到的。
现在,我们需要给这些像点一个向量空间结构。首先,我们需要取所有输入点的线性组合,所以我们最终得到一个向量空间结构。这就是我们在这里所做的。所以我们取所有输入点像的线性组合,并将它们添加到空间中。我们称结果空间为 G。这现在是一个向量空间,因为在这个向量空间中,我们可以取任意点、线性组合、乘以标量等等,并且所有向量空间定律都将得到满足,所以我们现在有一个向量空间。
我们需要做的下一件事是定义标量积。对于标量积,我们首先定义它在输入点的像上应该是什么样子。我们在那里定义它的方式使得它确实与核一致。这个定义已经确保了我们想要的性质,即 K(x, y) 与 Φ(x) 和 Φ(y) 之间的标量积相同,这个性质成立。一旦我们完成了构造,这就成立,但这是说明这需要成立的那一行。
一旦我们在所有输入点或输入点对上定义了标量积,我们需要将这个定义扩展到空间 G 中所有可能的函数,我们需要通过标量积的线性性质来做到这一点。再次强调,如何做到这一点没有选择。这只是如果你希望构造成功,唯一的方法。
然后我们需要证明这一切都没问题且良定义。然后出于数学原因,我们取这个拓扑空间的完备化,添加所有柯西序列,然后我们就有了我们的向量空间/希尔伯特空间 H。
再生性与名称由来 🔄
你可能想知道为什么这个东西被称为再生核希尔伯特空间。这真是一个复杂的名字。特别是,“再生”这个词从哪里来?这来自一个非常简单的事实,称为再生性质。
假设你空间中有任何函数,比如说,是输入函数的线性组合。那么当你取这个函数与任何其他输入点的像之间的标量积时会发生什么?你得到的是 f(x)。证明在幻灯片上,你可以看看。这只是线性性质的一个简单操作,没有什么秘密。我想每个人在家也能做。
这就是为什么它被称为再生性质,因为我们 sort of 再生了函数 f,它 sort of 是一个求值函数。无论如何,再生核希尔伯特空间这个名字很久以前就在数学中被选定了,显然是这个性质让它得名。
关于 RKHS 的更多备注 📝
我想再做一些评论。再生核希尔伯特空间,正如我刚刚所说,是在机器学习之外、在核算法之外发明的数学对象。当然,有一篇非常著名的论文由 Aronszajn 在 1950 年代(我想是 1950 年)发表,他 essentially 发展了这个整个空间和整个数学理论,当然完全独立于机器学习,因为在 1950 年代机器学习还不存在。
关于这些空间有很多很多数学理论和泛函分析,因为它们是非常好的向量空间。在这里,我只想为你们中的数学家列出一些性质,其他人直接忽略它,这不重要,也不会出现在任何练习或考试中。但我还是想提一下。
再生核希尔伯特空间的一个很好的性质如下:一个希尔伯特空间是再生核希尔伯特空间,当且仅当所有求值函数都是连续的。这里隐藏了许多东西。我不想深入任何细节,如果你是数学家并且对此感兴趣,你可能会打开教科书阅读。事实上,这是一个合理的漂亮定理。也许再次,有简单和不那么简单的方向。如果你有一个再生核希尔伯特空间,证明求值函数是连续的是较容易的方向;另一个方向是 sort of 困难的,因为它意味着你有一个抽象的向量空间,你有一个求值函数,然后你可以构造一个核,使得如果你从这个核构建一个再生核希尔伯特空间,这与你开始的空间相同或同构于你开始的空间。是的,事实上,这与我们这里有的再生性质有关。无论如何,如果你感兴趣,可以查阅资料。
另一个重要的是,RKHS 中的函数是逐点良定义的。所以如果你有一个空间中的函数,并且你在一个特定点求值,你会得到一个适当的数值。这很好,因为例如在 L2 空间或 L1 空间中,你没有那个性质,因为函数只是几乎处处定义的。这对于机器学习当然很重要,因为我们在机器学习中,如果你在一个测试点求值一个函数,你想知道一个适当的值,而你不喜欢 L2 函数,你不能真正说出这个 L2 函数在测试点的值是什么,因为它甚至没有定义,只定义到零测集。所以,所以你不能为一个特定点定义函数值。再次强调,这是一个数学上的微妙之处。但 RKHS 空间在这个意义上确实很好。

另一件也很有趣且漂亮的事情是:如果你被给定一个核,那么 RKHS 在等距同构意义下是唯一的。所以无论何时你从一个核开始,并尝试构造一个特征映射和一个希尔伯特空间,使得整个图示成立,你最终总会得到完全相同的希尔伯特空间。所以这里没有歧义。
还要注意,这对机器学习也很重要,因为如果你有不同的构造导致不同的空间,那么某种程度上你对这个整个核框架对你的数据做了什么有不同的解释。而这里的答案说,不,这不可能是真的。它总是唯一的。反过来也是,如果你给定 RKHS,并构造一个核使得所有图示成立,它也将是唯一的。
然后还有一个更深刻的评论,这整个东西与这里的表示定理非常密切相关,如果你知道那是什么,你可能想思考一下,甚至可能想查阅资料。或者如果你不是数学家或不感兴趣,直接忽略。这只是为了展示这种整个方法的数学美感。我真的觉得这非常惊人、美好,而且,是的,我非常喜欢这整个框架。
表示定理 🎯
现在还有一个章节我想讨论,或者一个简要的性质,称为表示定理。当我们在讨论支持向量机时,我已经简要提到过它。在那里我们说,如果我们被给定,如果我们看一个支持向量机的解,这个系数向量 w,如果你记得,总是你的输入点的线性组合。现在这是更普遍成立的东西。现在我们想看看这个。也许抱歉,在我继续之前,为什么这很重要。
现在假设我们将数据通过这个特征映射映射到某个高维空间,某个希尔伯特空间。我需要做一个我之前没有提到的评论:我们构造的希尔伯特空间通常是无限维的。我的意思是,你已经可以看到,如果我们的原始数据空间有无限多个点,每个点都被映射到我们空间中的一个新点,如果这些点是线性无关的,我们显然已经,我的意思是,显然空间必须有无限维。
现在我们有我们的,比如说,n 个数据点映射到这个无限维的许多空间中。现在我们想在该空间中解决一个优化问题。当然可能发生的是,我们为分类找到的超平面的法向量,某种程度上,我的意思是当然它需要是一些点的线性组合,但可能它不是存在于我们原始数据空间中的点,那么我们就不知道如何表达这个新点,某种程度上我们会遇到或者我们可能会遇到麻烦,它可能存在于一个我们根本无法仅基于我们拥有的有限训练点集达到的空间中。
所以重要的是,空间真的被限制在这个范围内,或者我们需要看的解被限制在由我们的训练数据张成的子空间中。这就是这个表示定理的内容。
设置如下:假设我们被给定一个核 K,用 H 表示对应的 RKHS。我们再次有希尔伯特空间中的范数和标量积。现在假设我们想学习一个从希尔伯特空间到输出的线性函数。这是重点。最终,我们希望在空间中有线性算法。所以空间中的线性函数具有这种形式:函数 f 由 f(x) = <w, Φ(x)>_H 给出,就像在欧几里得空间中一样。所以我们可以用这个法向量 w 来识别函数 f,就像我们之前在欧几里得空间中一样,我们需要学习这个向量 w。



现在有以下定理成立,它被称为表示定理。我们现在考虑以下形式的正则化风险最小化问题。所以我们需要在我们的空间中搜索所有法向量。我们想要最小化所有这些法向量的某个量。我们最小化的量是某个经验风险值,加上 λ 乘以一个正则化项。而这个定理的正则化项需要是依赖于函数范数(向量范数)的东西。如果你记得,在我们的许多例子中,我们使用了一个向量的 1-范数或 2-范数,特别是对于支持向量机,我们使用 2-范数作为正则化项。现在它是这个希尔伯特空间中的范数。
假设是什么?所以 X 是任意输入空间,Y 是任意输出空间,K 是核函数,H 是 RKHS,我们看的分类器是线性分类器,我们的 R_emp 是关于损失函数的正常经验风险(我们并不真正关心它),而这个正则化器 Ω 是一个单调递增的函数。所以它只是意味着如果我们计算这个向量的范数的函数,w 的范数越大,这个正则化项就应该越高。
所以这些都是非常温和的假设。本质上,如果你想在这个上下文中解决一个正则化问题,这总是成立的。
然后陈述是:这个优化问题(定理顶部的星号)的解总是可以表示如下。它是我们输入点的线性组合。因为我们在 RKHS 中,输入点的像是 K(x_i, ·),所以这些是函数。陈述是,向量 w*(这里的解)可以表示为原始训练点的线性组合。它没有任何分量伸向空间中没有输入点的部分。这是主要信息。
我只想给你证明的直觉,它并不真的困难,但如果我们没有这种数学符号,那么很难正式地写出来,但我想非正式地我们可以做到。
表示定理证明思路
我们现在将空间分成两个子空间:H。也许我在这里画个图。所以我们有……在阳光下很难看清我的 iPad 是否开着。哦,温度,我的 iPad 需要冷却才能使用,因为阳光照在我的 iPad 上,这太完美了。那我需要不用我的图来做。我们空间分成两个空间:由数据张成的空间和补空间。所以没有图,尝试做一下,我们有……
所以如果你有一个空间,比如说我们在一个三维空间中,我们有两个输入点,它们张成一条线。现在我总能在基中描述空间,其中空间的第一部分是在线上的点,然后我有第三部分指向不同的方向。
一般来说,如果我有一个,比如说,维度为无穷的空间,我有 50 个输入点,比如说这 50 个输入点张成我的空间的 50 个维度,那么整个空间就是由数据点像张成的子空间加上其余部分的直和。
这就是我在这里做的:我有 H_data,这是由数据点张成的子空间,和补空间,我可以简单地称为 H_comp。一般来说,整个空间 H 现在是这两个空间的直和。这意味着我可以将每个向量在这个空间中表达为一个和:一部分存在于由数据张成的子空间中,一部分存在于与这个子空间正交的子空间中。
现在,如果我有两个不同的向量 w,但它们在 w_data 部分上的系数相同,那么容易看出的是,具有相同数据部分的这些函数的预测在所有训练点上是一致的。所以无论我在 w_comp 分量中放入什么,结果都不会改变训练点上的结果。
所以本质上,在不是由训练点张成的子空间中发生的任何事情,完全不会影响训练点上的结果。现在,特别是,这意味着这个向量 w 的损失不受我在这个 w_comp 部分放入的任何东西的影响。
现在,我们在这个正则化中做的是:我们想要找到具有最小目标函数的向量 w。当然,如果我现在对向量 w 有不同的选择,而损失只依赖于数据部分,但范数当然会改变,如果 w_comp 分量很大。所以如果 w_comp 部分不存在(即为 0),这个整个向量 w 的范数特别小。你可以正式证明,给定任何 w_data,如果你设置 w_comp 为 0,范数比如果你使用其他东西要小。所以,本质上,如果你的目标是最小化范数,那么 w_comp 最好设置为 0,而且它对于预测你的损失也不起任何作用。所以最终,解将是 w_comp 部分为 0。
这就是这里最后一行所写的:你总能找到一个最优解,其中 w_comp 为 0。这就是这个表示定理证明的概要。
也许再次,试着说,这直观上意味着什么。所以我们已经看到,对于任何给定的核,总存在一个特征空间。但通常,这是一个无限维的希尔伯特空间。而表示定理现在说,我们只需要看由我们的数据点张成的这个子空间。这些是 n 个数据点,现在这 sort of 给了所有人(或应该给所有从未听说过希尔伯特空间的计算机科学家)宽慰。我们现在知道,我们的结果存在,或者我们正在搜索的向量存在于一个由 n 个数据点张成的子空间中。如果我们有一个希尔伯特空间,并且我们只考虑一个 n 维的子空间,这总是同构于 R^n,即具有 n 维的欧几里得空间。所以在最后,我们可以忘记关于背景中有希尔伯特空间的整个问题,我们总是工作在最多 n 维的欧几里得空间中,如果 n 是训练点的数量。这真的会让我们的生活更容易,无论是在理论上,当然也在实践中,因为在实践中,你将如何搜索某个无限维空间?这将很麻烦。

特征映射的单射性与通用核 🚀
接下来我想简单谈一下特征映射的单射性。到目前为止,我们没有对这个映射 Φ 的形式做任何假设。特别是,你希望拥有的是这个函数 Φ 是单射的。如果你不记得单射是什么意思,单射意味着如果你在空间 X 中取两个不同的输入点,那么它们也被映射到空间中的两个不同的输出点。也许我试试我的 iPad 是否冷却了一点。好了,它冷却了。我需要快一点,否则它又会热起来。

所以这是我的图,输入空间 X。我们在那个空间中有两个点,我们将它们映射到我们的新空间。如果我们将它们映射到同一点,那么某种程度上我们就完了,因为会发生什么,比如说这两个点有不同的标签,比如说这个是叉,标签是 -1,这个是圆,标签是 +1。现在它们被映射到同一点,那么当然我们找不到任何线性分类器可以分开这些点了。
所以你真正希望拥有的是,在这个核框架中构造的特征映射是单射的。现在注意,到目前为止,没有什么阻止我们拥有非常平凡的东西,比如所有东西都被映射到恰好一个点上。所以并不清楚,给定一个核,特征映射是否具有它是单射的这个好性质。
所以从理论的角度来看,你需要证明特征映射是单射的,至少对于合理的核。现在注意,这将取决于你的核函数的性质,因为这个特征映射完全由你的核函数定义。
现在有一类特别好的核,被称为通用核,它们具有这个性质。我不打算深入细节,只花几分钟,这再次与任何考试无关。
我们说一个度量空间上的连续核被称为通用的,如果 K 的 RKHS 在 C(X) 中稠密。现在这又是,如果你没见过这些概念,请忽略它,正如我所说,它与考试无关。如果你知道那是什么意思,我试着解释一下。C(X) 是这个空间 X 上所有连续函数的空间。我们说一个连续核被称为通用的,如果那个空间 H 在 C(X) 中稠密,这意味着你可以用核函数的线性组合来近似你原始数据上的任何连续函数。这是在无穷范数下,因为这是 C(X) 上的范数。
从概念的角度来看,这是一个非常强的性质,但也是一个非常理想的性质,因为结合表示定理,它将说明无论我们的决策面是什么,只要两个函数之间的决策面是连续的,我们将能够找到它。所以如果我们有我们的数据空间 X,比如说两个类之间的决策面,最好的一个是这个,一个非常弯曲的函数。但它仍然是连续的。如果我们有一个通用核,那么我们将能够表达这个复杂的函数,或者至少用一个核函数的线性组合来近似这个函数。这就是将要发生的,例如,在支持向量机中。这是直觉。所以形式上通用核的定义是顶部的那个,直觉是我们可以近似所有连续函数,这很好,因为这样我们可以实现任何类型的连续分类函数。例如,我的意思是,举第一个例子,具有固定核宽的高斯核是通用的。我们稍后会看到,对于这个,如果你想证明支持向量机是一致的,你需要拥有核的这个通用性性质。好的。多项式核不是通用的。好的。这不是我现在想讨论的。
我想提到的是,我们在机器学习中看到的许多核都是通用的,特别是成功的那些,特别是高斯核。如果你想知道关于这个的任何事情,有这本由 Steinwart 和 Christmann 写的关于支持向量机的书。他们都是数学家、统计学家,从非常数学深刻的角度写了所有关于核、支持向量机和相关算法的理论。我的意思是,他们真的考虑了所有关于可测性和这类方面的细节,并写下了理论。所以如果你是数学系学生,并且对核的任何细节感兴趣,例如通用核的性质,那么你可能想看看这本书。事实上,Steinwart 多年前就提出了通用核的这个定义,他在斯图加特,他是斯图加特数学系的教授。
历史背景与总结 📜
为了结束这一讲,让我们简单地看一下历史,我总是喜欢把事情放在背景中,并提醒你们事情是何时发展的。正如我所说,这些 RKHS 是由 Aronszajn 在 1950 年代就已经在一篇令人惊讶地易读的论文中发展起来的。所以通常如果你打开那个时代的论文,它们很难读,因为它们是以与现在写论文非常不同的风格写成的,但这篇是一个例子,它甚至可以是一本教科书。我想如果你打开它,如果你有数学背景,你将能够理解其中的大部分。
然后这种特征空间解释显然已经在 1964 年由 Iizerman 发表,但它被完全忽视了,没有人真正理解这种整个方法的影响。可能他自己也没有注意到。然后这整个东西在支持向量机的背景下在 1992 年由 Boser、Guyon 和 Vapnik 关于支持向量机的论文中被重新发现,这篇论文将核技巧引入了机器学习文献。然后它就起飞了。
在那之后的时间里,本质上,有许多许多论文试图探索这整个核学习框架。当时的两本教科书是 Bernhard Schölkopf(他在 Tübingen)和 Alex Smola(现在在 AWS 和 John C. D. 和 K. 出现在 2002 和 2004 年)的领先教科书。从那时起,核方法就存在了,并且已经被彻底探索,我们将在接下来的讲座中看到更多。
总结 ✨

在本节课中,我们一起学习了再生核希尔伯特空间的核心理论。我们从回顾核函数的目标开始,理解了其核心定理:一个函数是核当且仅当存在一个希尔伯特空间和特征映射使得核等于特征映射后的内积。我们重点剖析了该定理构造性证明的困难方向,一步步构建了 RKHS:首先将数据点映射为函数,然后通过线性组合形成向量空间 G,接着在其上定义与核值一致的内积,最后通过拓扑完备化得到希尔伯特空间 H。我们还了解了 RKHS 的再生性质、唯一性等优美特质。随后,我们学习了表示定理,它保证了在正则化风险最小化问题中,最优解可以表示为训练样本的线性组合,这极大地简化了实际计算。最后,我们简要探讨了特征映射单射性的意义以及通用核的强大逼近能力,并对核方法的历史发展有了初步认识。通过本节课,你应当对核函数为何能在高维特征空间中有效工作,以及其背后的数学基础有了更深入的理解。
20:核支持向量机 🧠
在本节课中,我们将学习如何将核方法应用到支持向量机中,从而构建出强大的非线性分类器。我们将从回顾核方法的基本概念开始,逐步推导核化支持向量机的形式,并探讨其成功的原因与局限性。
核化算法框架回顾
上一讲我们介绍了核的定义、性质以及再生核希尔伯特空间的理论基础。本节中,我们将把这个框架应用到第一个具体算法——支持向量机上。
核化一个算法的核心步骤如下:
- 首先,将算法在线性空间中以线性形式写出,确保其中只涉及数据点之间的内积。
- 然后,用核函数替换这些内积。
- 最终,算法便在上一讲定义的再生核希尔伯特空间中运行。
从对偶问题出发
现在,让我们看看这在支持向量机中是如何实现的。我们从支持向量机的对偶问题开始。回想一下,在推导支持向量机时,我们首先从最大化超平面与训练点之间间隔的几何动机出发,将其写成一个二次优化问题,然后利用拉格朗日方法推导出所谓的对偶问题。
这个对偶问题正是我们核化的起点。在这个问题中,训练点影响问题解或进入优化问题的唯一方式是通过内积。我们永远不需要数据点的具体坐标,只需要两个训练点之间的内积。
核化支持向量机
核化意味着,每当我们在优化问题的表达式中遇到像 x_i · x_j 这样的两个训练点的内积时,我们简单地用核函数 k(x_i, x_j) 来替换它。
以下是核化后的支持向量机对偶问题。给定输入训练点 (x_i, y_i), i=1...n 以及核函数 k,优化问题如下:
优化问题:
maximize ∑_{i=1}^n α_i - (1/2) ∑_{i=1}^n ∑_{j=1}^n α_i α_j y_i y_j k(x_i, x_j)
subject to 0 ≤ α_i ≤ C, i=1...n
∑_{i=1}^n α_i y_i = 0
我们只需将核函数代入即可。这就是核化支持向量机问题。我们可以求解这个问题,得到对偶变量 α。

选择何种核函数取决于具体应用。核函数旨在编码数据点之间的某种相似性。如果你的数据在欧几里得空间中,可以简单地使用高斯核;如果你想对社交网络中的人进行分类,可以使用图核等。选择适合你应用的核函数。
计算新测试点的预测结果

一旦我们求解了优化问题,就需要能够计算新测试点的预测结果。回想一下,在推导对偶问题后,我们得到了原始变量 w 和 b 的表达式,我们需要它们来计算支持向量机对新测试点的解。
原始权重向量 w 的公式为:
w = ∑_{i=1}^n α_i y_i φ(x_i)
其中 α_i 是我们在对偶优化问题中找到的对偶变量,φ(x_i) 是将数据点映射到特征空间的映射函数。
偏移参数 b 的计算稍复杂一些。首先需要找到一个数据点 j,满足条件 0 < α_j < C,然后通过以下公式计算:
b = y_j - ∑_{i=1}^n α_i y_i k(x_i, x_j)
那么,对于一个新测试点 x,其预测标签由超平面方程给出:
f(x) = sign( ∑_{i=1}^n α_i y_i k(x_i, x) + b )
现在,我们可以用核语言来表达这一切,即将所有出现内积的地方替换为核函数。例如,在上面的求和项中,∑ α_i y_i φ(x_i) · φ(x) 被替换为 ∑ α_i y_i k(x_i, x)。这样,一旦求解了对偶问题得到 α_i,并且知道核函数,就可以计算新测试点的标签。这通常是实践中使用支持向量机的方式。
核方法的威力:以高斯核为例

为什么核方法如此强大?正是这种方法使得支持向量机取得了巨大成功,并推动了整个机器学习领域的突破。
为了解释这一点,让我们看一个具体的例子:高斯核。核支持向量机的决策函数具有以下形式:
f(x) = ∑_{i=1}^n α_i y_i k(x_i, x) + b
如果 k 是高斯核,那么这就是高斯函数的线性组合。
所有我们可以学习的函数都具有这种形式。现在,为什么这会成功?如果你考虑原始空间中的任意连续函数(这里以一维情况为例),一个数学事实是:你可以用高斯函数的线性组合来逼近任何连续函数。这意味着,无论你的原始空间中的决策面多么复杂,你都可以用高斯核来逼近它。
回想一下我们之前画的图:我们有一个复杂的数据空间 X,数据点分布其中。我们希望通过一个非线性函数来分类这些点。核方法通过映射到高维特征空间,希望在这个空间里数据是线性可分的。然后,我们通过核函数来计算这个特征空间中的内积。
这个在特征空间中的线性函数(红色线),在原始输入空间中,可以通过高斯函数的和来近似。
参数选择与过拟合
当然,这取决于参数的选择,特别是核参数 σ(高斯核的宽度)。σ 非常大时,高斯函数非常宽,你可能无法用少数几个高斯函数来近似复杂函数,这会导致欠拟合(高偏差)。σ 非常小时,高斯函数非常窄,原则上如果有足够多这样的函数,可以近似任何东西,但这可能导致过拟合。
需要注意的是,我们绘制的高斯函数通常以训练点为中心,因为我们的解 k(x, x_i) 的形式是围绕训练点 x_i 的。因此,σ 的选择决定了我们想要考虑的函数有多精细。较大的 σ 产生更平滑、变化较小的决策面;较小的 σ 可以产生非常复杂的决策面。
通用性与正则化的重要性
像高斯核这样的核被称为通用核,因为它们具有这样的性质:可以用此类核的线性组合以任意精度逼近任何连续函数。高斯核就是这样一个通用核,这是它如此强大的原因。
当然,这种通用性也意味着我们原则上处于一个巨大的函数空间中,因为我们可以逼近任何连续函数。这意味着,如果我们不进行正则化,可能会容易过拟合,因为我们的函数空间是所有连续函数,这可能太大了。

因此,我们的算法进行正则化就更加重要。在支持向量机中,正则化是通过间隔间接实现的。回想一下在线性SVM的原问题中,我们想要最大化间隔,而间隔的大小本质上给出了优化问题中的正则化项(即 ||w||^2)。
在核化版本中,损失函数没有改变(仍然是合页损失),但正则化项改变了。正则化现在发生在特征空间(再生核希尔伯特空间)中,正则化项是该空间中的范数 ||w||_H,而不是原始空间的范数。
这个正则化项可以具体写出来。因为 w 是特征映射的线性组合,w = ∑ β_i φ(x_i),所以:
||w||_H^2 = ∑_i ∑_j β_i β_j φ(x_i)·φ(x_j) = ∑_i ∑_j β_i β_j k(x_i, x_j)
用矩阵形式表示,就是 β^T K β,其中 K 是核矩阵。所以,我们在希尔伯特空间中的正则化项是 β^T K β。
直观理解这个正则化项在几何上意味着什么比较困难。一种思考方式是:这个机制限制了我们从中选取解的函数空间,这个项越小,我们选取解的函数空间就越小,这就是正则化能给出有用结果的原因。如果没有这个正则化,支持向量机将无法工作,因为函数空间太大,会导致严重的过拟合。
实践应用步骤
现在,假设你想在实践中应用支持向量机,应该如何进行?以下是基本步骤:
- 选择核函数:拥有训练数据后,你需要想出一个核函数。如果你的数据在
R^d中,可以从高斯核开始,然后需要确定核宽度σ。如果数据不是欧几里得的,你可能需要设计自己的核函数(例如图核)。 - 训练SVM:通常你会使用工具箱来训练SVM。
- 参数调优:非常重要的一步是确保通过交叉验证来设置参数。你有一个正则化参数
C(权衡正则化项和经验风险),如果使用高斯核还有核宽度σ。大多数核都有此类参数,需要通过交叉验证手动设置。 - 数据预处理:在实际应用SVM之前,通常还需要进行许多其他步骤,如数据清洗、归一化、去除异常值、降维等。
这里列出的是直接将SVM应用于数据的基本方法。
关于从原问题核化的思考
一个有趣的问题是:为什么我们实际上从对偶版本开始?我们不能直接从原问题推导核化算法吗?原支持向量机问题如下:
原问题:
minimize (1/2)||w||^2 + C ∑_{i=1}^n ξ_i
subject to y_i (w·φ(x_i) + b) ≥ 1 - ξ_i, i=1...n
ξ_i ≥ 0, i=1...n
这里已经涉及了特征映射 φ。你可能会想为此问题推导一个核化版本。
初步看来,似乎不能直接核化,因为我们需要计算 w 和 φ(x_i) 的内积,而 w 生活在特征空间中,通常不是某个训练点的简单映射,而是一个复杂的线性组合。除非我们再次调用表示定理。
表示定理告诉我们,如果优化问题具有某种形式(如上面的原问题),那么解向量 w 总可以写成输入点的线性组合。一旦我们利用这个定理,就可以将 w 表示为 ∑ β_i φ(x_i),然后代入原问题。这样,w·φ(x_j) 就变成了 ∑ β_i φ(x_i)·φ(x_j),又只需要训练点之间的内积,从而可以用核函数替换。对于 ||w||^2 项,同样可以替换。因此,从这个意义上讲,如果你愿意,也可以核化支持向量机的原问题。
支持向量机的成功与现状
为什么支持向量机如此成功或广为人知?我们需要回到它们被发明的20世纪90年代。在那个时代,模式识别还是一个相对年轻的领域。在支持向量机之前,人们经常使用神经网络(老式的神经网络)。当时需要大量精力来设计网络架构,并使用反向传播进行优化,但由于计算能力有限且缺乏如今深度学习中的许多技巧,神经网络通常只有专家才能用好。
支持向量机的出现改变了这一点。它们非常简单:通常只有两个参数 C 和 σ。你将其输入,它是一个凸优化问题,总能找到全局最优解,不需要像神经网络那样担心陷入局部最优、需要多次重启和大量调参。你只需“按下按钮”,就能得到一个解。这使得即使是机器学习非专家的应用领域研究者(如生物信息学)也能使用并获得相当好的结果。
从概念上讲,支持向量机也很有吸引力。你可以证明它在什么条件下有效,可以推导泛化误差界,研究核的性质(如通用性),并给出数学证明(例如,支持向量机是通用一致的)。这对于理论研究者也很有吸引力。
如今,经常有人问:既然有了深度网络,为什么我们还需要支持向量机?答案是:有时确实如此。深度网络非常强大,拥有大量计算资源和已知技巧,在许多领域(特别是与语音和图像相关的)表现出色。然而,神经网络需要大量数据。例如,在生物信息学的科学应用中,你可能只有20个患者的基因数据,试图分类他们是否患有癌症。只有20个训练点,你甚至无法开始训练一个有数百万参数的神经网络。在这种情况下,支持向量机仍然是一个非常重要的工具。
此外,从理论角度看,神经网络还远未被真正理解。例如,神经网络通常被训练到严重过拟合(零训练误差),而这从我们课程开始的理论来看显然是严重的过拟合。直到最近,理论界才有初步结果开始解释为什么这仍然有效、为什么它仍然能泛化。神经网络还有许多其他特性(如对抗样本的鲁棒性问题)也不尽如人意。对于安全关键型应用(例如飞机控制),目前很难想象有人会用深度神经网络来编写控制程序,因为我们不完全信任它,不知道它的行为方式,没有任何理论保证。对于关键应用,你需要知道你在做什么。相比之下,支持向量机的行为更易于理解。
底线是:支持向量机、深度网络以及其他算法(如概率方法)都有其擅长解决的问题集。理解不能用深度网络解决世界上所有问题是非常重要的,这也是为什么需要学习统计学习和概率学习这门课的原因。
总结
本节课中,我们一起学习了核支持向量机。
- 核心思想:我们被给予空间中的数据点和一个核函数(在许多应用中,设计核函数是关键步骤)。通过核技巧,我们将数据点嵌入到抽象的特征空间中。
- 归纳原理:其背后的原理仍然是追求大间隔,即使在希尔伯特空间中也是如此。
- 优化:最终我们得到一个凸优化问题,非常易于求解,并能达到全局最优。
- 正则化解释:从正则化角度看待,它对应于最小化合页损失,并以特征空间中的范数作为正则化项。

如果要从本讲中记住一件事,那就是:将支持向量机作为你解决分类问题的主要示例。这是在神经网络和概率模型之外,最常用的分类算法之一。如果你的数据中包含某种信号,支持向量机很可能成功解决你的问题。
23:核化最小二乘回归 🧮


在本节课中,我们将要学习如何将核技巧应用于回归算法,特别是最小二乘回归。我们将从无正则化的最小二乘开始,逐步过渡到岭回归,并探讨核化背后的核心思想与数学原理。




概述



上一节我们介绍了如何核化支持向量机。本节中,我们将看看核技巧如何应用于回归算法,特别是最小二乘回归。我们将从回顾最小二乘回归开始,然后展示如何利用表示定理将其转化为核版本,并最终讨论正则化版本(岭回归)的核化过程。




回顾最小二乘回归



首先,我们回顾一下最小二乘回归。在课程初期,我们学习了带有显式特征映射的最小二乘法。我们有一个特征映射 Φ(x),它将输入 x 从原始空间映射到特征空间 R^D。

我们考虑以下优化问题(目前没有任何正则化项):



公式:
min_w Σ_i (y_i - w^T Φ(x_i))^2


我们的目标是找到一个函数,该函数可以表示为这些特征表示的线性组合。这里的特征映射 Φ(x) 是显式的,例如,它可以是描述人物的特征,或者是一组基函数(例如,在处理声波时使用正弦波基)。




核化最小二乘回归

现在,我们想看看这与核方法有何关联。我们已经知道,上述问题存在一个解析解。我们想探究是否可以将这个简单的最小二乘算法用核函数重写。




有几种方法可以实现这一点。这里我们将详细介绍第一种方法,即通过表示定理。这通常是所有方法中最简单的一种。



利用表示定理

表示定理告诉我们,我们问题的解总可以表示为核函数的线性组合。或者,更具体地说,在特征空间设置中,解 w* 可以写成输入点(在特征空间中表示为 Φ(x_j))的线性组合:



公式:
w* = Σ_j α_j Φ(x_j)


现在,我们可以利用这一点,并将其代入我们的优化问题。在原始问题中,凡是出现 w 的地方,我们现在都代入这个线性组合。


以下是具体步骤。这是原始的优化问题:


公式:
min_w Σ_i (y_i - w^T Φ(x_i))^2



现在,我们代入 w = Σ_j α_j Φ(x_j)。我们可以将求和中的线性系数从内积中提取出来,最终得到一个只包含两个输入点内积的表达式:

公式:
min_α Σ_i (y_i - Σ_j α_j Φ(x_j)^T Φ(x_i))^2 = min_α Σ_i (y_i - Σ_j α_j K(x_i, x_j))^2



在这个表达式中,内积 Φ(x_j)^T Φ(x_i) 可以被核函数 K(x_i, x_j) 替代。



如果用矩阵符号表示,我们可以写成:


公式:
min_α ||y - Kα||^2
其中,K 是核矩阵,其元素为 K_ij = K(x_i, x_j),y 是真实标签的向量,α 是系数向量。

到目前为止,我们只是重写了优化问题。现在,我们可以像上一讲那样求解:对 α 求导,令导数为零,等等。然后我们可以发现,这个问题的解由下式给出:


公式:
α = K^{-1} y
在新测试点上进行评估



同样,我们也能够在新的测试点上评估我们的解。这之所以可行,再次归功于表示定理。如果我们想将函数应用于一个新的测试点 x,我们需要计算:




公式:
f(x) = w*^T Φ(x) = (Σ_j α_j Φ(x_j))^T Φ(x) = Σ_j α_j Φ(x_j)^T Φ(x) = Σ_j α_j K(x_j, x)



因此,所有重要的运算都可以用核函数来表示。在这种情况下,我们甚至仍然可以解析地计算解,只需将每个内积替换为核函数即可。



核化岭回归

上一节我们介绍了无正则化最小二乘的核化。本节中,我们来看看正则化版本,即岭回归。



岭回归类似于我们之前的最小二乘问题,但增加了一个额外的正则化项 λ ||w||^2,其中这个范数是在特征空间中的范数。



我们再次使用表示定理,然后替换所有项。你可以预见到这将导向何处:这里的 w 将被求和替换,同样,内积将在这里出现。类似地,在范数中,当我们代入 w 时,我们最终会得到一个只包含 Φ(x_i)^T Φ(x_j) 的内积。

具体操作如下。问题的第一项与无正则化版本相同。现在我们得到一个正则化项,其形式为 λ ||w||^2。当我们将 w = Σ_j α_j Φ(x_j) 代入时,这个范数变为 α^T K α。



公式:
min_α ||y - Kα||^2 + λ α^T K α


事实上,这与我们在支持向量机中看到的情况类似,在那里我们也是通过希尔伯特空间中的范数进行正则化。我们再次得到了相同类型的表达式。



同样,你可以推导出解由以下特定形式给出,并且预测函数的形式也只涉及核值。因此,我们也可以核化这个算法。


公式:
α = (K + λ I)^{-1} y
预测:f(x) = Σ_j α_j K(x_j, x)




两种核化方法的细微差别


这里可能有一个细微的差别,虽然不重要,但值得了解。我们看到了两种方法:
- 使用基函数的岭回归。
- 使用核函数的岭回归(即我们刚刚推导的核版本)。


这两种方法工作在相同的函数空间中(即由这些基函数或核函数张成的空间)。最小二乘误差项在两种方法中是相同的。


但是,正则化器看起来有点不同:
- 在标准基函数方法中,我们通过系数的 L2 范数 进行正则化:
||α||^2。 - 在核版本中,我们通过特征空间中的范数进行正则化:
||w||^2 = α^T K α。


因此,正则化的方式略有不同。这类似于支持向量机中的情况。这种差异的实际影响可能难以预测,两者都进行正则化,但由于这些表达式的量级可能不同,你可能需要选择不同的正则化常数 λ。




关于 Lasso 回归的核化
现在,我们正则化了岭回归(L2 正则化)。下一步将是正则化 Lasso 回归,即使用 L1 范数 进行正则化的问题。




公式:
min_w Σ_i (y_i - w^T Φ(x_i))^2 + λ ||w||_1



这是第一个如果你想尝试核化,可能会发现行不通的地方。我强烈建议你思考一下为什么它行不通。这有一个重要的原因,使得你无法核化这个算法。无法将其写成一个核算法并做这种隐式变换。我认为这是一个非常好的练习,因为它向你展示了核化一个算法可能需要满足哪些要求。对于 Lasso 来说,它就是不适用。


总结




本节课中,我们一起学习了如何将核技巧应用于回归算法。
- 我们从回顾最小二乘回归开始,并利用表示定理将其核化,得到了解
α = K^{-1} y。 - 接着,我们将此方法扩展到岭回归,得到了带有 L2 正则化的核版本,其解为
α = (K + λ I)^{-1} y。 - 我们讨论了两个核化岭回归方法在正则化项上的细微差别(
||α||^2与α^T K α)。 - 最后,我们指出Lasso 回归(L1 正则化)无法被核化,并鼓励大家思考其背后的原因。


核技巧是一个强大的工具,可以将线性模型扩展到复杂的非线性空间,而无需显式计算高维特征。
22:如何在特征空间中进行中心化和归一化
在本节课中,我们将学习核方法中一个关键但非直观的操作:如何在隐式的高维特征空间中对数据进行中心化和归一化处理。我们将看到,尽管无法直接访问特征坐标,但通过巧妙的核技巧,我们仍然可以实现这些数据预处理步骤。
概述
上一节我们介绍了核方法的基本原理和几种核化算法。本节中,我们来看看一个重要的实际问题:如何在特征空间中对数据进行中心化和归一化。这通常是数据预处理的标准步骤,但在核方法中,由于我们无法直接看到特征坐标,实现起来并非显而易见。
特征空间中的中心化

首先,我们考虑中心化。在显式特征空间中,中心化意味着计算所有数据点的均值(中心点),然后将每个数据点减去这个中心点,使数据分布以原点为中心。
在核方法中,我们只有数据点之间的核(内积)值,而没有特征坐标。因此,直接计算中心点坐标似乎是不可能的。
然而,我们可以通过纯核运算来推导中心化后的核矩阵。假设我们有一个原始核函数 K(x_i, x_j) = <Φ(x_i), Φ(x_j)>。我们希望得到中心化后数据点 Φ̃(x_i) = Φ(x_i) - (1/n) Σ_k Φ(x_k) 之间的核。
通过代数推导,中心化后的核 K̃(x_i, x_j) 可以表示为:
K̃(x_i, x_j) = K(x_i, x_j) - (1/n) Σ_r K(x_i, x_r) - (1/n) Σ_s K(x_s, x_j) + (1/n²) Σ_{r,s} K(x_r, x_s)
这个公式的妙处在于,它完全由原始核矩阵 K 的元素计算得出,不需要知道任何特征坐标 Φ(x)。因此,我们可以在不知道特征映射的情况下,模拟出数据在特征空间中被中心化后的效果。
在矩阵表示中,如果 K 是原始核矩阵,1_n 是一个所有元素都为 1/n 的 n×n 矩阵,那么中心化后的核矩阵 K̃ 为:
K̃ = K - 1_n K - K 1_n + 1_n K 1_n
我们可以验证,这个矩阵的每个元素 K̃_{ij} 都对应上述公式的计算结果。
特征空间中的归一化
接下来,我们讨论归一化。归一化通常有两种含义:

- 特征归一化:使每个特征维度(列)的方差为1(或其他值)。这需要知道每个特征的具体坐标,因此在纯核方法中无法实现。
- 数据点归一化:使每个数据点向量(行)的范数为1。这相当于将所有数据点投影到单位超球面上。这种方法可以在核方法中实现。
数据点归一化通常在数据已中心化的基础上进行。对于一个中心化后的数据点 Φ(x),我们希望将其归一化为单位向量 Φ̂(x) = Φ(x) / ||Φ(x)||。
那么,归一化后数据点之间的内积(即新的核函数)为:
K̂(x_i, x_j) = <Φ̂(x_i), Φ̂(x_j)> = <Φ(x_i), Φ(x_j)> / (||Φ(x_i)|| ||Φ(x_j)||)
由于 ||Φ(x)|| = √<Φ(x), Φ(x)> = √K(x, x),我们可以将上述公式完全用原始核函数表示:
K̂(x_i, x_j) = K(x_i, x_j) / √(K(x_i, x_i) K(x_j, x_j))
这样,我们就得到了一个归一化后的核函数,使用它进行计算,效果等同于先将所有数据点映射到特征空间,然后将其归一化到单位球面上。
中心化与归一化的效果与注意事项
以下是中心化和两种归一化效果的直观对比:
- 原始数据:数据点以其原始坐标分布。
- 中心化数据:数据整体被平移,使得坐标原点位于数据的中心(均值点)。这改变了坐标系,但不改变点之间的相对位置。
- 特征归一化(核方法中不可行):调整每个坐标轴的尺度,使得数据在每个维度上的方差相同(例如都为1)。这可以改变数据的形状(例如,使一个方向上的拉伸与另一个方向相同)。
- 数据点归一化(核方法中可行):将每个数据点单独缩放,使其位于一个以原点为中心的单位球面上。此时,点之间的角度信息得以保留,而距离信息被丢弃。
重要提示:数据点归一化并不总是有益的。例如,当一个数据集中存在远离主群体的离群点时,中心化过程会使均值严重偏向离群点。随后进行的数据点归一化,可能会将原本可分离的不同类数据点挤压到单位球面上非常接近的区域,从而破坏数据的可分性,导致分类器(如SVM)性能下降。
因此,在实践中,是否应用这些预处理步骤需要通过交叉验证来评估。比较使用原始核、仅中心化核、以及中心化加归一化核的模型性能,选择效果最佳的一种。
总结
本节课我们一起学习了如何在核方法的框架下对数据进行中心化和归一化。
- 我们证明了,尽管无法访问特征坐标,但可以通过纯核运算推导出中心化后的核矩阵。
- 我们区分了两种归一化:特征归一化(不可行)和数据点归一化(可行),并推导了数据点归一化后的核函数公式。
- 我们认识到,这些预处理操作(尤其是数据点归一化)是一把双刃剑,可能提升也可能损害模型性能,因此必须通过交叉验证进行谨慎评估。

掌握这些技巧,使我们能够在享受核方法带来的非线性能力的同时,也能进行必要的数据标准化处理。
23a:随机森林之构建决策树 🌲

在本节课中,我们将学习一系列分类和回归算法。这些算法主要源于统计学原理,而非传统的机器学习社区,但它们非常成功且基于简单的思想。我们将从随机森林开始,并探讨其背后的核心概念:集成方法、自助法(Bootstrap)和装袋法(Bagging)。
集成方法概述
上一节我们提到了算法的统计学背景。本节中,我们来看看集成方法的核心思想。

在集成方法中,我们不只训练一个分类器来完成特定任务,而是训练多个分类器,并且以略有不同的方式训练它们。例如,我们可以在训练集的不同部分训练多个分类器,或者使用不同的特征子集,甚至训练不同类型的分类算法(如决策树、K近邻或神经网络)。
我们知道每个分类器都有其优缺点。集成方法的理念是,如果我们能结合这些方法,例如通过多数投票等方式,那么最终得到的结果可能比任何一个单独分类器的结果都要好。
从高层次来看,这就是集成方法的思想。它指的是这样一个研究领域:你拥有一组分类器(或回归函数等)的集合,然后将它们组合起来,以产生一个全新的、希望是更好的问题解决方案。
统计学背景:自助法与装袋法
集成方法的统计学背景可能源于自助法和装袋法。我们已经见过一个类似的例子:交叉验证方法。
在交叉验证中,我们想要估计一个特定的量——测试误差。我们通过从训练集中抽取随机子集(即进行随机划分)来多次重复这个过程,最终取平均值,希望这样得到的估计比仅进行一次划分得到的估计更好。
自助法简介
考虑一个标准的统计设定:你有一个来自某个空间的样本点。假设你对一个参数(例如总体均值)感兴趣,并且有一个估计量能产生该参数的估计值 $\hat{\theta}$。
现在,你想知道这个估计量的分布,例如,为了获得估计值的置信区间。如果你知道样本点的分布,有时可以解析地计算出估计量 $\hat{\theta}$ 的分布。但如果你对训练点的分布一无所知,这就无法实现。

自助法的做法如下:
- 从原始训练样本中抽取一个包含 $M$ 个点的子样本(可放回或不放回抽样)。
- 在这个子样本上计算你感兴趣的参数的估计值。
- 重复此过程 $B$ 次,最终得到 $B$ 个参数估计值 $\hat{\theta}_1, ..., \hat{\theta}_B$。
- 观察这些估计值的分布,这可以为你提供关于置信区间大小的指示。
自助法背后的理论很复杂,因为从同一样本中抽取的子样本并非独立,它们会大量重叠。统计文献中有大量研究在何种情况下这种方法仍然能产生一致的估计。
装袋法:自助聚合
装袋法是自助法在机器学习中的直接应用。其名称“Bagging”是“Bootstrap Aggregation”的缩写。
与自助法类似,你有一个原始样本,并希望估计某个参数。你生成 $B$ 个自助样本,在每个样本上计算估计值 $\hat{\theta}$,得到 $B$ 个不同的版本。
此时,你可能并不关心置信区间或估计量的分布,而只想知道最终的估计值。最简单的方法是取这些估计值的平均值:$\hat{\theta}{bag} = \frac{1}{B} \sum^{B} \hat{\theta}_b$。

你可能会问,既然可以直接在原始样本上计算一个估计值,为什么需要这个自助过程?关键在于,装袋法可以产生一个方差远小于直接在完整样本上进行单次估计的估计量。
直观理解如下:如果这些估计值 $\hat{\theta}_b$ 是独立的(实际上它们并非独立,但先如此假设),并且每个的方差都是 $\sigma^2$,那么组合估计量的方差将是 $\sigma^2 / B$,方差减小了 $B$ 倍。
实际上,这些估计值并非独立,而是存在相关性 $\rho$。计算后可以发现,装袋后估计量的方差为:
$$\text{Var}(\hat{\theta}_{bag}) = \rho \sigma^2 + \frac{1-\rho}{B} \sigma^2$$
- 当 $\rho = 0$(独立)时,方差为 $\sigma^2 / B$,方差大幅降低。
- 当 $\rho = 1$(完全相关)时,方差变回 $\sigma^2$,即原始估计量的方差。
因此,如果相关性小,装袋法能显著降低方差;即使相关性不小,在最坏情况下你也只是回到了原始估计量的方差,并无损失。

应用于分类与回归
现在,我们将这个原理应用于分类或回归问题。

具体做法是:给定一组训练点,我们反复从中抽取子样本,并基于每个子样本训练一个分类器或回归函数(称为“基学习器”)。然后,对于一个测试点 $x$,我们计算每个基学习器给出的结果,并简单地取平均值,这个平均值就是我们的“装袋”分类器/回归器的预测结果。

关于基学习器的选择,有以下几点考虑:
- 计算成本:装袋法需要训练模型 $B$ 次,如果 $B$ 很大,计算量会很大。因此,最好使用训练速度较快的简单算法作为基学习器,例如K近邻、决策树等。
- 独立性:为了最大程度地降低方差,我们希望这些基学习器尽可能相互独立。
- 偏差:装袋法主要是为了减少方差,它无法改变基学习器本身的偏差。如果基方法是有偏的,那么装袋后的结果仍然有偏。
在接下来的课程中,我们将看到的标准选择是使用决策树作为基算法,因为它们简单,并且有潜力通过设计使它们彼此更加独立。
决策树基础

让我们从决策树开始简要介绍。决策树的直观思想是:每个数据点(例如病人)由一组特征描述。决策树通过一系列基于特征的判断(“问题”)来引导你得到一个最终结论(例如,应该采用治疗方案A还是B)。
例如,首先查看病人的年龄:如果大于50岁,走一个分支;如果小于50岁,走另一个分支。对于老年分支,下一步可能检查血压;对于年轻分支,下一步可能检查饮食习惯,以此类推。通常,重要的变量出现在树的顶部,次要的变量出现在底部。

构建决策树的方法有无数种。在随机森林中,我们将使用一种特定的类型:空间划分决策树。
空间划分决策树

空间划分决策树类似于k-d树。它是一种将数据空间最终分割成不同单元格的树结构。

其工作原理如下:假设我们有一个数据集。我们被允许考虑的所有划分都是平行于某个坐标轴的。例如在二维空间,我们可以进行垂直或水平划分。
构建过程是递归的:
- 在每一步,你需要选择一个维度进行划分,并决定在该维度上的最佳分割点。
- 你持续划分,直到每个单元格只包含预先设定的少量数据点(例如10个)为止。

如何使用构建好的树进行预测?对于一个测试点,你从树根开始,根据该点的坐标值(例如,x坐标是否小于5)决定向左还是向右分支,直到到达一个叶节点(即一个最终的单元格)。对于该测试点的预测,就是基于落入该叶节点的所有训练点的标签进行决策(分类时取多数票,回归时取平均值)。
确定划分标准

构建树时,我们需要确定如何选择划分的维度和位置。文献中有许多标准,一个直观的方法是评估每个候选划分可能产生的训练误差。
具体做法是:考虑一个将数据分成两部分的划分。假设我们进行此次划分,然后分别在左右两部分计算预测值(例如,该部分内训练点标签的平均值),并计算这两部分上的训练误差(例如L2误差)之和。我们评估不同的候选划分(不同维度、不同分割点),选择那个能产生最小训练误差总和的划分。
通常,这是一个贪心过程:对所有维度进行循环,对每个固定维度,评估不同的分割点并选择最好的,然后比较所有维度上最好的那个划分,最终使用全局最优的划分。
树的深度与一致性
另一个需要考虑的是树的深度,即你向下划分多少层。通常的做法是固定一个“叶节点最小样本数”,即你希望每个叶节点中包含的数据点数量。
文献中有两种重要的模式:
- 浅树:没有太多层。叶节点中的点数应随着总数据点数 $n$ 的增长而至少缓慢增长(例如 $\log n$)。这样构建的树具有统计一致性,因为单元格的直径会缩小,同时每个单元格内的数据点数量在增加。
- 深树:训练直到每个叶节点只剩下常数个点(极端情况下为1个点)。单独看,这样的一棵树不是一致的估计量(类似于1-最近邻,方差不会趋于0)。但是,在随机森林中,人们经常观察到使用深树会得到更好的结果。
为什么深树在随机森林中有效?几何解释是:虽然单棵深树的单元格非常小(可能只包含一个点),但当你将许多这样的树叠加组合时,对于一个给定的测试点,它会被许多不同形状的单元格所覆盖。平均来看,参与预测的训练点数量又变多了,从而整个集成模型可以再次变得一致。
决策树的优势与扩展
关于空间划分决策树的最后几点说明:
- 可解释性:决策树具有很好的可解释性。你可以追溯从根到叶的路径,理解做出某个决策所依据的特征和阈值(例如,“血压低于120且年龄约50岁的病人归入此类”)。
- 特征重要性:有许多方法可以计算在决策树或随机森林中各个特征的重要性,这是一个活跃的研究领域。
- 其他类型:除了空间划分树,还有很多其他类型的决策树,例如非常流行的C4.5算法,它使用信息论度量(如信息增益)来选择划分,将最重要的变量放在树的顶部。
本节课中,我们一起学习了随机森林的基础构件——决策树,特别是空间划分决策树的原理、构建方法以及深度选择的影响。我们还了解了集成方法背后的核心思想:通过结合多个略有不同的模型(基学习器)来降低预测方差,从而可能获得比单一模型更好的性能。这为下一节深入探讨如何将许多决策树组合成随机森林奠定了基础。
23b:构建随机森林 🌲
在本节课中,我们将学习如何将上一节介绍的单个空间决策树,通过集成学习中的Bagging(自助聚合)方法,组合成一个强大的模型——随机森林。我们将详细讲解其构建过程、关键参数,并探讨其理论性质。
概述
上一节我们介绍了空间决策树的基本原理。本节中,我们将看看如何利用Bagging思想,将许多棵决策树组合起来,构建所谓的“随机森林”。随机森林的核心在于引入随机性来构建多棵不同的树,并通过集成它们的预测结果来提高模型的泛化能力和稳定性。
随机森林的构建算法
以下是构建随机森林的一个标准算法框架,源自《统计学习基础》一书。我们的数据点位于 R^P 空间,其中 P 是特征维度。
随机森林有几个关键参数,我们将在代码中逐一介绍。
以下是构建过程的核心步骤:
- 设定树的数量:我们有一个从
b = 1到B的循环,其中B是我们计划构建的树的总数。 - 生成自助样本:在每次循环中,我们首先从原始训练数据中抽取一个大小为
N的自助样本。通常,我们采用有放回抽样,这意味着同一个数据点可能被多次选中。 - 生长单棵树:基于这个自助样本,我们生长一棵随机树
T_b。我们递归地分割节点,直到每个叶节点包含的数据点数量达到预设的最小值n_min。 - 随机选择特征进行分割:在每个需要分割的节点上,我们从全部 P 个特征中随机选择 m 个特征子集。然后,仅在这 m 个特征中寻找最佳的分割点(例如,基于基尼不纯度或信息增益等准则)。
- 生成森林:重复上述步骤
B次,我们就得到了一个由B棵随机树组成的森林。每棵树的随机性体现在:1)基于不同的自助样本;2)在每个节点基于随机的特征子集进行分割。
如何进行预测
在预测阶段,对于一个新数据点 x,随机森林会综合所有树的预测结果。
具体步骤如下:
- 获取单棵树预测:将测试点 x 输入每一棵树
T_b。从根节点开始,根据每个节点的分割规则,将 x “路由”到对应的叶节点。- 对于分类任务,该叶节点中训练样本的多数类即为这棵树的预测结果。
- 对于回归任务,该叶节点中训练样本目标值的平均值即为这棵树的预测结果。
- 集成所有预测:收集所有
B棵树的预测结果。- 对于分类任务,采用投票法,选择得票最多的类别作为最终预测。
- 对于回归任务,采用平均法,计算所有树预测值的均值作为最终预测。

公式化表示为:
- 分类:
最终预测 = mode( T_1(x), T_2(x), ..., T_B(x) ) - 回归:
最终预测 = (1/B) * Σ_{b=1}^{B} T_b(x)
关键参数与调优建议
随机森林主要有四个参数,但好消息是,与SVM等模型相比,它对参数的选择通常不那么敏感。以下是一些经验法则:
- 自助样本大小
N:通常设置为与原始训练集大小相当,采用有放回抽样。也可以尝试设为原始大小的2/3。 - 每次分割考虑的特征数
m:这是一个关键参数。经验上常设置为总特征数 P 的 1/3,即m ≈ P/3。这个值通常效果很好,无需过多调整。 - 树的数量
B:应尽可能大,只要在计算和存储资源允许的范围内。树的数量越多,模型的方差降低效果越好,预测越稳定。 - 叶节点最小样本数
n_min:这控制树的深度。n_min小则树深(可能过拟合),n_min大则树浅(可能欠拟合)。通常可以尝试log(n)到1之间的值,1对应完全生长的树。
总体而言,随机森林对这些参数具有相当的鲁棒性。然而,极端的选择(如树太浅或树太少)仍会导致模型性能下降。
理论性质:一致性探讨
从理论角度看,一个重要问题是随机森林是否具有一致性,即随着训练样本无限增多,其预测能否收敛到真实的最优函数。
主要结论如下:
- 单棵决策树:如果树不是太深,确保每个叶节点区域的直径趋于0,同时每个叶节点内的样本数趋于无穷,那么单棵树可以是一致的。
- 随机森林(平凡情况):如果森林中的每一棵树都是一致的,那么整个森林显然也是一致的。但这没有解释为何需要集成多棵树。
- 随机森林(有趣情况):随机森林可以是一致的,即使其中的每一棵单棵树都不是一致的。 这是随机森林强大之处的核心理论体现。
直观解释:考虑训练非常深的树,每片叶子里只有一个样本。这样的单棵树方差极高,是不一致的。但是,当我们集成许多棵这样的深树时,对于同一个测试点,不同的树会将其与训练集中不同的单个样本关联起来。虽然每棵树只用一个样本做预测,但集成了成百上千棵树后,参与预测的实际上是训练集中一个较大的、围绕测试点的邻域内的许多样本。如果这个“邻域”的直径能随着样本增多而缩小到0,同时参与预测的样本数却趋于无穷,那么集成模型就能恢复一致性。
目前,对于实践中使用的、基于优化分割准则的随机森林,其一致性的严格证明仍然是活跃的研究领域。
扩展:基于比较的随机森林
我们研究组近期的工作将随机森林的思想推广到了更一般的场景。考虑一种情况:你的数据并非欧氏空间中的向量,你只能获得数据点之间的相对比较信息,例如“点A更接近点B还是点C?”
基于此,我们可以构建基于比较的随机森林:
- 构建分割:在每个树节点,随机选择两个数据点作为“枢轴点”。
- 提出问题:对于节点内的所有其他数据点,询问:“你离第一个枢轴点更近,还是离第二个枢轴点更近?”
- 根据答案分割:根据答案将数据点划分到左子树或右子树。这相当于在隐含的距离空间中构造了一个分割超平面(垂直于两枢轴点连线的中垂面)。
- 递归构建:在子节点上重复此过程。
这种方法不再需要特征向量和轴平行分割,仅依赖于两两点之间的相对距离比较。我们已证明,在标准条件下,这种基于比较的随机森林同样具有一致性。在欧氏数据上,其经验性能与标准随机森林相当,但它的适用性更广,可用于仅有相似性比较信息的数据。

总结与历史讨论
本节课中,我们一起学习了随机森林的构建方法。我们从回顾Bagging和决策树开始,详细阐述了随机森林的算法步骤、预测方式以及关键参数的选择。我们还探讨了其理论一致性的核心观点,并简要介绍了一种更广义的基于比较的随机森林。
随机森林由统计学家Leo Breiman在2001年提出,相对而言是一个“年轻”的算法。如今,它已成为机器学习中标准的基线算法之一,因其以下优点而广受欢迎:
- 易于使用:通常无需繁琐的参数调优。
- 性能强大:在众多任务上表现优异。
- 提供洞见:可以评估特征重要性。
- 鲁棒性好:对异常值和数据尺度不敏感。

因此,在处理分类或回归问题时,随机森林应始终作为一个重要的基线算法予以考虑。它能够快速提供一个性能不错的解决方案,并帮助你对数据建立初步的直觉。在许多实际应用中,随机森林的表现已经足够好,无需寻求更复杂的模型。
24:Boosting 🚀
























在本节课中,我们将要学习一种称为Boosting的学习范式。这是一种通过组合多个弱学习器来构建一个强学习器的集成学习方法。我们将探讨其核心思想、算法流程、理论保证以及实践应用。
















概述














Boosting是一种统计启发的学习范式,其核心思想是组合同一算法的多个版本,以期通过这种组合来改善最终结果。这与随机森林等集成方法不同,Boosting不通过随机化数据或特征来生成多样性,而是通过为训练数据点分配不同的权重,并迭代地训练弱学习器,最终将它们组合成一个强学习器。












强学习器与弱学习器













上一节我们介绍了Boosting的基本目标。本节中,我们来看看其背后的核心哲学:强学习器与弱学习器的概念。















- 强学习器:这是我们最终希望得到的算法。它能够在有限的训练数据上学习到一个分类器,该分类器的误差非常小。直观地说,强学习器是一个能够以任意小的误差ε逼近真实解的算法。
- 弱学习器:这是指那些性能仅比随机猜测略好的算法。例如,在一个类别平衡的分类问题中,随机猜测的准确率是0.5。一个弱学习器的准确率可能是0.5 + ε,其中ε是一个很小的正数。















Boosting要解决的核心问题是:给定一个弱学习器,能否通过组合多个这样的弱学习器,最终得到一个强学习器? 答案是肯定的,而实现这一点的算法就是Boosting。













Boosting算法流程


理解了强学习器和弱学习器的概念后,本节我们来看看Boosting的具体算法是如何运作的。
















Boosting算法(以AdaBoost为例)在T轮中迭代进行。在每一轮中,它基于当前的数据权重训练一个弱学习器,然后根据该弱学习器的表现更新数据点的权重,使得被错误分类的点在下一轮获得更高的关注度。最终,算法输出所有弱学习器的加权组合作为最终假设。













以下是AdaBoost算法的伪代码步骤:


















- 输入:训练集 S = {(x₁, y₁), ..., (xₘ, yₘ)},弱学习器 WL,迭代轮数 T。
- 初始化权重:对于每个训练点 i,设置初始权重 D₁(i) = 1/m。
- For t = 1 to T:
- 使用当前权重分布 D_t 训练弱学习器,得到假设 h_t。
- 计算 h_t 的加权误差:ε_t = Σ_{i=1}^{m} D_t(i) * [y_i ≠ h_t(x_i)]。
- 计算该轮假设的权重:w_t = 0.5 * ln((1 - ε_t) / ε_t)。
- 更新数据点权重:对于每个 i,D_{t+1}(i) = (D_t(i) * exp(-w_t * y_i * h_t(x_i))) / Z_t,其中 Z_t 是归一化因子,确保所有权重之和为1。
- 输出最终假设:H(x) = sign( Σ_{t=1}^{T} w_t * h_t(x) )。















算法直观理解与示例
















上一节我们介绍了算法的形式化步骤。本节中,我们通过一个具体的例子来直观理解Boosting是如何工作的。
















假设我们有一个二维数据集,包含正例(+)和负例(-)。弱学习器是平行于坐标轴的决策树桩(单层决策树)。















- 第一轮:所有数据点权重相同。弱学习器产生一个分类边界(例如一条垂直线),它正确分类了大部分点,但错误分类了三个点(被圈出)。算法增加这三个错误分类点的权重。
- 第二轮:权重更新后,被错误分类的点显得更大(权重更高)。弱学习器在新的权重分布下训练,产生另一个分类边界(例如一条水平线)。它可能又错误分类了另外几个点(同样是之前难以分类的)。算法再次更新权重,增加新错误点的权重,同时降低正确分类点的权重。
- 第三轮:权重进一步调整。弱学习器训练后产生第三个分类边界。
- 最终组合:将三轮得到的三个弱分类器进行加权投票(权重 w_t 反映了该轮分类器的可靠性),得到一个复杂的非线性决策边界。在这个例子中,最终的组合分类器能够正确分类所有训练点。













这个例子展示了Boosting如何通过关注“困难”样本,并组合简单的决策规则,来构建一个强大的分类器。















理论保证:训练误差界















看到Boosting在示例中有效后,我们自然会问:它在理论上是否可靠?本节我们探讨其关于训练误差的理论保证。

















有一个重要定理保证了AdaBoost的训练误差会快速下降:
















定理:假设在AdaBoost的每一轮迭代t中,弱学习器都返回一个假设h_t,其加权分类误差 ε_t < 1/2 - γ(其中γ > 0)。那么,经过T轮迭代后,最终假设H的训练误差满足:
LS(H) ≤ exp(-2 γ² T)

















这个结论的意义:
- 只要弱学习器在每一轮的表现都稳定地比随机猜测好一点(误差小于1/2),那么最终分类器的训练误差就会以指数级速度下降。
- 迭代轮数T越大,训练误差的上界就越小。这从理论上解释了Boosting如何将弱学习器提升为强学习器(至少在训练集上)。
















证明思路(简述):
- 定义一个辅助变量 Z_T = Σ_{i=1}^{m} exp(-y_i F_T(x_i)),其中 F_T 是最终加权组合函数。可以证明,01训练误差 L_S(H) ≤ Z_T。
- 通过巧妙的 telescoping product(叠乘分解),将 Z_T 表示为 Z_T = Π_{t=1}^{T} (Z_t / Z_{t-1})。
- 核心步骤是证明每一轮的比值 Z_t / Z_{t-1} ≤ √(4 ε_t (1-ε_t))。
- 利用条件 ε_t ≤ 1/2 - γ,可以推导出 √(4 ε_t (1-ε_t)) ≤ exp(-2 γ²)。
- 因此,Z_T ≤ (exp(-2 γ²))^T = exp(-2 γ² T),从而定理得证。















这个证明优雅地展示了算法设计(权重更新公式 w_t = 0.5 * ln((1-ε_t)/ε_t))与理论保证之间的内在联系。















实践考量与总结















上一节我们看到了Boosting强大的理论保证。本节中,我们来看看它在实践中的应用和一些重要注意事项。
















实践要点:
- 弱学习器的选择:常用的弱学习器是决策树桩(深度为1的决策树),它简单、快速,并且能产生可解释的规则。理论上,任何能处理加权样本且性能略优于随机猜测的算法都可作为弱学习器。
- 泛化能力:上述定理只针对训练误差。在实践中,Boosting也表现出良好的泛化能力。其泛化误差的理论分析通常涉及间隔理论和函数类复杂度,相关结果可以在专门文献中找到。过度增加迭代轮数T可能导致过拟合,因此T常作为一个需要通过验证集调节的超参数。
- 与随机森林对比:
- 随机森林:通过自助采样和随机特征子集引入多样性,各基学习器独立训练,最终进行平等投票。
- Boosting:使用全部数据但赋予不同权重,基学习器顺序训练,每个都试图修正前一个的错误,最终进行加权投票。
- 优点:理论清晰、实践效果好、对于许多问题可以作为强大的基准模型。最终模型是简单模型的加权和,具有一定的可解释性。
- 扩展:AdaBoost是Boosting家族的基础算法,后续发展出了如Gradient Boosting、XGBoost、LightGBM等更强大的变体,它们在效率和性能上做了诸多优化。









总结:
本节课我们一起学习了Boosting集成学习方法。我们从强学习器和弱学习器的概念出发,详细讲解了AdaBoost算法的流程、直观工作原理以及其训练误差指数下降的理论保证。Boosting通过迭代地调整数据权重,迫使弱学习器专注于之前被错误分类的样本,并将这些弱学习器的结果进行加权组合,从而构建出一个强大的最终模型。该算法在理论和实践上都得到了充分验证,是机器学习工具箱中一个重要且有效的工具。
25:主成分分析 (PCA) 🧮
在本节课中,我们将要学习一种经典的数据分析算法——主成分分析。这是一种非常古老且在各个学科领域广泛使用的算法,是降维的标准工具。我们将了解其经典版本的工作原理,并在后续课程中探讨其核化版本。

目标与基本思想 🎯
主成分分析的目标是什么?我们面对的数据通常存在于一个高维的欧几里得空间中。这里的“高维”意味着维度超出了算法或我们自身能够轻松处理的范围。
PCA的目标是将数据投影到一个更低维度的空间中。希望通过这种降维,我们不会丢失太多关于数据的信息,同时能在低维空间中工作,这通常可以减少过拟合并降低计算需求。
我们用以下符号表示:
- D:原始高维空间的维度。
- L:我们希望投影到的低维空间的维度(L < D)。
核心思想与投影方向的选择 🤔

PCA的核心思想是什么?让我们看一个从二维降到一维的简单例子。
假设我们有一个二维数据集,它在空间中呈“拉长”的形状。我们希望将其投影到一条一维的直线上,因为我们可能认为数据中存在噪声,仅用一个维度就足以描述其主要结构。
那么,应该选择哪条直线进行投影呢?有很多可能性。例如,我们可以投影到这条红线、这条蓝线,或者这条绿线上。
问题是:哪条线是最好的投影方向?
PCA的想法是,我们应该以这样一种方式投影:尽可能多地保留数据的信息。直观地说,我们希望投影后数据的方差尽可能大。因为方差大的方向通常包含了数据中最重要的变化模式。
在上图中,如果我们将数据投影到蓝线方向,数据点会沿着该方向展开,保留了大部分结构。如果投影到红线方向,许多数据点会重叠在一起,导致信息大量丢失。
因此,PCA的目标是:找到投影方向,使得投影后数据的方差最大化。
投影的数学定义 📐

为了正式讨论投影,我们需要一个向量空间。投影是一个线性映射 P,它将空间 E 中的点映射回 E 自身。我们称 P 是一个投影,如果满足 P² = P。直观上,这意味着将投影应用两次与只应用一次的结果相同,因为点已经被“固定”在低维子空间上了。
我们通常关心的是正交投影。在正交投影中,投影向量与目标子空间是垂直的。形式上,一个投影被称为正交的,如果其零空间与像空间正交。
理解PCA时,有两种重要的视角:
- 视角1:投影后,我们仍然将点视为原始高维空间中的元素。点位于低维子空间上,但其坐标表示仍在 Rᴰ 中。
- 视角2:投影后,我们只关心点在低维子空间中的坐标,完全抛弃了其他维度。点现在位于 Rᴸ 中。
在机器学习中,视角2通常是我们进行数据处理的目标,因为我们希望直接在低维表示上工作。但视角1有时有助于理解数据在降维后于原始空间中的形态。
投影的数学表达 🧮
让我们从数学上形式化这两种视角。假设我们想投影到一个一维子空间,该空间由向量 a 张成。
- 视角2(到低维空间):投影是从 Rᴰ 到 R 的映射。点 x 的投影坐标是标量积 aᵀx。
- 扩展到L维:对于一个L维子空间,我们有一个由标准正交基向量 v₁, ..., vₗ 组成的矩阵 V(每列是一个基向量)。投影映射 Rᴰ → Rᴸ 定义为:y = Vᵀx。
- 视角1(仍在原始空间):投影矩阵 P 定义为 P = VVᵀ。点 x 被映射到 Px,这个点仍在 Rᴰ 中,但位于由 V 的列张成的子空间上。
注意:在应用PCA之前,我们通常先对数据进行中心化处理,即确保数据的均值为零。这样我们只需处理线性投影,而无需考虑仿射偏移。
PCA的推导:最大化方差 🚀
现在我们从形式化的角度推导PCA。给定中心化的数据点(均值为0)和目标维度 L,我们希望找到一个投影(到一个仿射子空间 S),使得投影点的方差最大化。通过中心化,我们可以专注于线性子空间。
首先考虑 L = 1 的情况,即投影到一条直线上。我们需要找到方向向量 a。
优化问题是:
最大化 投影后数据的方差。
约束条件:aᵀa = 1(只关心方向,不关心长度)。
投影后点 xᵢ 的坐标是 aᵀxᵢ。对于中心化数据,方差是这些坐标平方的平均值。因此,目标函数为:
最大化 (1/n) Σᵢ (aᵀxᵢ)² = aᵀ [(1/n) Σᵢ xᵢxᵢᵀ] a = aᵀC a
其中 C = (1/n) XᵀX 是数据的协方差矩阵(X 是数据矩阵,行为数据点)。
因此,问题简化为:
最大化 aᵀC a
约束条件 aᵀa = 1
这是一个带约束的优化问题,可以用拉格朗日乘子法求解。构造拉格朗日函数:
L(a, λ) = aᵀC a - λ (aᵀa - 1)
对 a 求导并令其为零:
2C a - 2λ a = 0 ⇒ C a = λ a
这个方程告诉我们,最优解 a 必须是协方差矩阵 C 的一个特征向量,对应的特征值为 λ。
将 C a = λ a 代回目标函数 aᵀC a,得到 aᵀ(λ a) = λ aᵀa = λ。
因此,投影后的方差就等于特征值 λ。
为了最大化方差,我们应该选择与最大特征值对应的特征向量。这就是第一主成分。
对于 L > 1 的情况,结论可以推广:为了最大化投影后的总方差,我们应该将数据投影到由协方差矩阵 C 的前 L 个最大特征值所对应的特征向量张成的子空间上。这些特征向量被称为主方向或主成分。
PCA算法步骤 📝
以下是PCA算法的伪代码总结:
- 输入:数据点 x₁, ..., xₙ ∈ Rᴰ,目标维度 L。
- 中心化数据:计算均值 μ = (1/n) Σᵢ xᵢ,令 x̃ᵢ = xᵢ - μ。
- 计算协方差矩阵:C = (1/n) X̃ᵀX̃,其中 X̃ 是中心化后的数据矩阵。
- 特征分解:计算 C 的特征值和特征向量:C = V Λ Vᵀ。V 的列是特征向量,Λ 是对角特征值矩阵。
- 选择主成分:将特征值从大到小排序,并相应排列特征向量。取前 L 个特征向量组成矩阵 V_L。
- 投影(视角2 - 低维坐标):计算低维表示 yᵢ = V_Lᵀ x̃ᵢ ∈ Rᴸ。
- (可选)投影(视角1 - 原始空间重建):计算投影矩阵 P = V_L V_Lᵀ,重建点为 x̂ᵢ = P x̃ᵢ + μ(注意加回均值)。
实例与应用演示 🖼️
PCA可以应用于各种数据。例如,在USPS手写数字数据集(16x16像素图像,维度256)上:
- 计算出的前几个特征向量(“特征数字”)图像显示了数据中的主要变化模式(如圆形、笔画等)。
- 用不同数量的主成分重建数字“6”时,可以看到:
- 用1个主成分:几乎无法识别。
- 用3个主成分:略有形状,但无法辨认。
- 用10个主成分:隐约可猜。
- 用50个主成分:重建效果很好,与原始图像差异很小。
- 用256个主成分:完全重建。
另一个著名例子是“特征脸”(Eigenfaces),即对人脸图像数据集应用PCA得到的前几个主成分。
如何选择维度 L? 📊
选择投影维度 L 是一个关键问题。有几种方法:
- 特征值谱(Scree Plot):绘制协方差矩阵的特征值(按降序排列)。通常存在一个“拐点”,之后特征值变得很小且平缓。可以选择拐点之前的维度数。这些微小特征值对应的方向可能主要是噪声。
- 方差解释率:投影到 L 维子空间后保留的方差比例为:(Σ_{i=1}^L λ_i) / (Σ_{i=1}^D λ_i)。可以设定一个阈值(如95%),选择使保留方差比例超过该阈值的最小 L。
- 重构误差:可以证明,平均重构误差(视角1中点与投影点的距离平方和)等于被丢弃的特征值之和:Σ_{i=L+1}^D λ_i。通过分析特征值尾部,可以估计误差。
- 实践中的方法:在机器学习流程中,L 通常被视为一个超参数。通过交叉验证来评估不同 L 值对最终任务(如分类精度)的影响,从而选择最优的 L。降维有时能通过去除噪声提升性能,有时也可能丢失有用信息,需要实际验证。
另一种推导:最小化重构误差 🔄
除了最大化方差,PCA还有另一种等价的推导方式:最小化重构误差。
重构误差是指原始数据点与其在低维子空间上投影点之间的距离(通常用平方距离)。PCA的目标变为:找到一个 L 维子空间,使得所有数据点到该子空间的(平方)距离之和最小。
可以证明,这个最小化重构误差的问题,最终导出的解与最大化方差的解完全相同:即选择协方差矩阵的前 L 个最大特征值对应的特征向量。
PCA的注意事项与局限性 ⚠️
在使用PCA时,需要注意以下几点:
- 全局最优 vs. 局部损失:PCA优化的是平均重构误差或总方差。这并不意味着每个单独的数据点重构误差都小。异常点(Outliers)可能具有很大的重构误差,并且它们也会严重影响协方差矩阵的计算,从而影响主成分的方向。对于含有大量异常值的数据,PCA可能不适用,需要先进行异常值处理。
- 线性假设:PCA是一种线性降维方法。它寻找数据的最佳线性子空间。如果数据的固有结构是非线性的(例如同心圆、流形),PCA可能无法发现其低维表示,甚至可能破坏数据结构。
- 无监督性质:PCA是一种无监督方法,它不考虑任何类别标签。因此,找到的主成分方向不一定与数据中的类别分离方向一致。在分类任务中,直接使用PCA降维有时可能不利于后续分类。
- 适用场景:PCA在数据近似服从高斯分布,且主要方差集中在少数几个方向上时效果最好。对于具有复杂非线性结构或多模态分布的数据,需要考虑非线性降维方法(如核PCA、t-SNE、UMAP等)。
总结 📚
本节课我们一起学习了主成分分析这一经典的线性降维技术。
我们首先明确了PCA的目标:将高维数据投影到低维空间,同时尽可能保留数据中的信息(方差)。然后,我们从两个等价的角度推导了PCA:
- 最大化投影方差:通过拉格朗日乘子法,我们推导出最优投影方向是数据协方差矩阵的特征向量,并且应选择特征值最大的前L个特征向量。
- 最小化重构误差:这一角度也导出了相同的解。
我们详细介绍了PCA的算法步骤:中心化、计算协方差矩阵、特征分解、选择主成分、投影。并通过手写数字和人脸数据的例子展示了其应用。

最后,我们讨论了如何选择降维维度L的几种策略,并重点指出了PCA的局限性:它对异常值敏感、本质上是线性方法、且是无监督的。因此,在实际应用中,需要根据数据特性和任务目标谨慎使用PCA,并考虑将其作为更大机器学习流程中的一个预处理步骤,通过交叉验证来评估其有效性。
26:核主成分分析 (Kernel PCA) 🧠

在本节课中,我们将要学习如何将经典的主成分分析(PCA)算法“核化”,从而推导出核主成分分析(Kernel PCA)。我们将看到,即使PCA算法看起来严重依赖于数据的坐标表示,我们依然可以通过巧妙的数学转换,仅使用核函数(即数据点之间的相似性度量)来实现降维。

回顾:经典PCA与核方法
上一节我们介绍了标准的经典主成分分析(PCA)。本节中,我们来看看如何将其核化。
核PCA听起来可能有点奇怪,因为回想一下核方法的核心思想。我们有一些存在于原始空间(可能不是向量空间)的数据集。核方法通过一个特征映射(通常是隐式定义的),将数据点映射到一个高维的特征空间(一个再生核希尔伯特空间)。然后,我们在这个特征空间中应用线性算法。在这里,这个线性算法就是PCA。我们的目标是找到数据的主方向并投影到这些方向上,可能作为后续学习算法的预处理步骤。
整个核方法的技巧在于,我们希望有一个涉及核函数的“捷径”,使得我们无需显式地经过这个高维特征空间。但PCA算法似乎非常需要访问数据点的坐标,因为它需要计算协方差矩阵(一个包含坐标间相关信息的矩阵)并找到最大方差的方向。令人惊奇的是,确实存在一种方法可以绕过对显式坐标的需求,这正是本节课要揭示的内容。
数学基础:协方差矩阵与核矩阵
为了理解其中的技巧,我们需要回顾PCA做了什么,以及协方差矩阵和核矩阵是什么。
假设我们有n个数据点 ( x_1, ..., x_n ),为简化起见,假设它们位于 ( \mathbb{R}^D ) 中,并且已经中心化(均值为零)。我们将数据点按行排列成数据矩阵 ( \mathbf{X} )(一个 ( n \times D ) 的矩阵)。
- 协方差矩阵 ( \mathbf{C} ):对于中心化的数据,协方差矩阵由 ( \mathbf{C} = \mathbf{X}^T \mathbf{X} ) 给出。这是一个 ( D \times D ) 的矩阵,其第 ( (k, l) ) 项是数据第 ( k ) 维和第 ( l ) 维之间的协方差。
- 核矩阵 ( \mathbf{K} ):对于线性核,核矩阵由 ( \mathbf{K} = \mathbf{X} \mathbf{X}^T ) 给出。这是一个 ( n \times n ) 的矩阵,其第 ( (i, j) ) 项是数据点 ( x_i ) 和 ( x_j ) 的内积 ( \langle x_i, x_j \rangle )。
我们注意到,协方差矩阵 ( \mathbf{C} = \mathbf{X}^T \mathbf{X} ) 和核矩阵 ( \mathbf{K} = \mathbf{X} \mathbf{X}^T ) 在形式上非常相似,只是矩阵乘法的顺序相反。这启发我们去思考:( \mathbf{C} ) 的特征值/特征向量与 ( \mathbf{K} ) 的特征值/特征向量之间是否存在某种关系?这正是核PCA推导的核心。
命题1:从核矩阵到协方差矩阵
首先,我们来看如何从核矩阵的特征向量得到协方差矩阵的特征向量。
命题:给定中心化的数据点 ( x_1, ..., x_n \in \mathbb{R}^D )。令 ( \mathbf{K} ) 为线性核矩阵。假设 ( \lambda ) 和 ( \mathbf{a} ) 是 ( \mathbf{K} ) 的一个特征值和对应的特征向量(即 ( \mathbf{K} \mathbf{a} = \lambda \mathbf{a} )),并且 ( \mathbf{a} ) 是归一化的(( |\mathbf{a}| = 1 ))。定义向量 ( \mathbf{v} = \mathbf{X}^T \mathbf{a} )。
如果 ( \mathbf{v} \neq \mathbf{0} ),那么 ( \mathbf{v} ) 是协方差矩阵 ( \mathbf{C} = \mathbf{X}^T \mathbf{X} ) 的一个特征向量,对应的特征值也是 ( \lambda )。此外,( \mathbf{v} ) 的范数为 ( |\mathbf{v}| = \sqrt{\lambda} )。
证明概要:
- 从 ( \mathbf{K} \mathbf{a} = \lambda \mathbf{a} ) 出发,代入 ( \mathbf{K} = \mathbf{X} \mathbf{X}^T )。
- 等式两边同时左乘 ( \mathbf{X}^T ),得到 ( \mathbf{X}^T \mathbf{X} (\mathbf{X}^T \mathbf{a}) = \lambda (\mathbf{X}^T \mathbf{a}) )。
- 根据定义,( \mathbf{C} = \mathbf{X}^T \mathbf{X} ) 且 ( \mathbf{v} = \mathbf{X}^T \mathbf{a} ),因此上式即为 ( \mathbf{C} \mathbf{v} = \lambda \mathbf{v} )。
- 范数的计算:( |\mathbf{v}|^2 = \mathbf{v}^T \mathbf{v} = \mathbf{a}^T \mathbf{X} \mathbf{X}^T \mathbf{a} = \mathbf{a}^T \mathbf{K} \mathbf{a} = \mathbf{a}^T (\lambda \mathbf{a}) = \lambda |\mathbf{a}|^2 = \lambda )。
这个命题告诉我们,可以从核矩阵的特征向量“生成”协方差矩阵的特征向量。
命题2:从协方差矩阵到核矩阵
接下来,我们需要反方向的关系,因为PCA算法原本需要的是协方差矩阵的特征向量。
命题:给定中心化的数据点 ( x_1, ..., x_n \in \mathbb{R}^D )。令 ( \mathbf{C} = \mathbf{X}^T \mathbf{X} ) 为协方差矩阵。假设 ( \lambda ) 和 ( \mathbf{v} ) 是 ( \mathbf{C} ) 的一个非零特征值和对应的特征向量(即 ( \mathbf{C} \mathbf{v} = \lambda \mathbf{v} ))。定义向量 ( \mathbf{a} = \frac{1}{\lambda} \mathbf{X} \mathbf{v} )。
那么,( \mathbf{a} ) 是核矩阵 ( \mathbf{K} = \mathbf{X} \mathbf{X}^T ) 的一个特征向量,对应的特征值也是 ( \lambda )(即 ( \mathbf{K} \mathbf{a} = \lambda \mathbf{a} ))。
证明思路:
- 从 ( \mathbf{C} \mathbf{v} = \lambda \mathbf{v} ) 出发,代入 ( \mathbf{C} = \mathbf{X}^T \mathbf{X} )。
- 可以证明,协方差矩阵的非零特征向量 ( \mathbf{v} ) 可以表示为输入数据点的线性组合:( \mathbf{v} = \sum_{i=1}^n a_i x_i ),其中系数 ( a_i ) 来自上面定义的向量 ( \mathbf{a} )。
- 通过将特征值方程与数据点 ( x_s ) 做内积等操作,最终可以推导出 ( \mathbf{K} \mathbf{a} = \lambda \mathbf{a} )。
这两个命题共同建立了协方差矩阵与核矩阵之间特征系统的桥梁。一个自然的疑问是:协方差矩阵是 ( D \times D ) 的(最多有 ( D ) 个特征向量),而核矩阵是 ( n \times n ) 的(最多有 ( n ) 个特征向量),数量如何匹配?关键在于,对于中心化的数据,协方差矩阵的秩最多为 ( \min(n, D) ),而核矩阵的秩也相同。非零特征值的数量由数据的有效维度决定,两者是一致的。
算法推导:从特征向量到投影
基于以上命题,我们可以设计算法。假设我们想计算协方差矩阵 ( \mathbf{C} ) 的前 ( L ) 个特征向量。

一个直接的方法是:
- 计算线性核矩阵 ( \mathbf{K} ) 及其前 ( L ) 个特征对 ( (\lambda_k, \mathbf{a}_k) ),并确保 ( \mathbf{a}_k ) 是归一化的(( |\mathbf{a}_k| = 1 ))。
- 对于每个 ( k ),计算向量 ( \mathbf{v}_k = \frac{1}{\sqrt{\lambda_k}} \mathbf{X}^T \mathbf{a}_k )。根据命题1,这就是 ( \mathbf{C} ) 的归一化特征向量(范数为1)。

但是,注意计算 ( \mathbf{v}_k ) 时仍然需要原始数据坐标 ( \mathbf{X} )。如果我们想在特征空间中进行,就需要特征空间的坐标,这违背了核方法的初衷。
关键在于,在实际的PCA应用中,我们通常不需要显式地得到特征向量 ( \mathbf{v}_k ) 本身,我们只需要用它们来投影数据点。而投影计算可以巧妙地用核函数表示。
考虑将一个数据点 ( x )(可以是训练集或新点)投影到特征向量 ( \mathbf{v}_k ) 上:
[
\text{投影坐标} = \mathbf{v}k^T x = \left( \frac{1}{\sqrt{\lambda_k}} \mathbf{X}^T \mathbf{a}k \right)^T x = \frac{1}{\sqrt{\lambda_k}} \mathbf{a}k^T \mathbf{X} x = \frac{1}{\sqrt{\lambda_k}} \sum^n a \langle x_i, x \rangle
]
这里,( a ) 是向量 ( \mathbf{a}k ) 的第 ( i ) 个分量。我们看到,投影坐标的计算只依赖于核函数(内积)( \langle x_i, x \rangle ) 以及从核矩阵特征分解中得到的系数 ( a ) 和 ( \lambda_k )。我们完全不需要知道 ( \mathbf{v}_k ) 或 ( x ) 在特征空间中的显式坐标!
核PCA算法 🚀
现在,我们可以给出完整的核PCA算法。输入是核矩阵 ( \mathbf{K} )(基于任意核函数 ( k(\cdot, \cdot) ) 计算)和想要降维到的目标维度 ( L )。
以下是算法步骤:
- 中心化核矩阵:由于我们的推导假设数据在特征空间中是中心化的,我们需要对核矩阵进行中心化处理。这可以通过一个“中心化矩阵”来实现:( \tilde{\mathbf{K}} = \mathbf{K} - \mathbf{1}_n \mathbf{K} - \mathbf{K} \mathbf{1}_n + \mathbf{1}_n \mathbf{K} \mathbf{1}_n ),其中 ( \mathbf{1}_n ) 是元素全为 ( 1/n ) 的 ( n \times n ) 矩阵。
- 特征分解:对中心化后的核矩阵 ( \tilde{\mathbf{K}} ) 进行特征分解,得到前 ( L ) 个最大的特征值 ( \lambda_1 \geq \lambda_2 \geq ... \geq \lambda_L ) 及其对应的归一化特征向量 ( \mathbf{a}_1, ..., \mathbf{a}_L )(满足 ( |\mathbf{a}_k| = 1 ))。
- 归一化特征向量:为了后续投影计算,我们需要对特征向量进行缩放。定义矩阵 ( \mathbf{V}_L ),其第 ( k ) 列为 ( \mathbf{a}_k / \sqrt{\lambda_k} )。
- 计算降维表示:对于任意一个数据点 ( x )(包括训练集中的点 ( x_j ) 或新点),其降维到 ( L ) 维的表示 ( z \in \mathbb{R}^L ) 的第 ( s ) 个分量计算如下:
[
z_s = \sum_{i=1}^n \frac{a_{s,i}}{\sqrt{\lambda_s}} k(x_i, x)
]
对于训练集本身,这等价于计算 ( \mathbf{Z} = \tilde{\mathbf{K}} \mathbf{V}_L )。

输出就是数据点在新的 ( L ) 维空间中的坐标 ( \mathbf{Z} )。
几何直观与演示

核PCA的几何过程可以理解为:
- 通过核函数隐式地将原始数据映射到一个非常高维(甚至是无限维)的特征空间。
- 在这个高维特征空间中,数据可能呈现出更简单的结构(例如,线性可分)。
- 在高维空间中进行PCA,找到主要的变化方向。
- 将数据投影到这些主方向上,得到低维表示。
通过Matlab演示,我们可以看到核PCA在一些非线性数据集上的神奇效果:
- 同心圆数据集:使用高斯核的核PCA可以将二维的同心圆映射到三维空间,使得不同半径的圆在第三维上分离开,这在原始二维空间或线性PCA中是无法实现的。
- 双螺旋/半月形数据集:核PCA可以将其映射到三维空间,形成一个“鞍形”或“展开”的结构,使得原本非线性可分的数据变得(近似)线性可分,便于后续分类。
- 高斯XOR数据集:核PCA也能找到有效的表示。
这些演示表明,通过选择合适的核函数(如高斯核)及其参数(如带宽 ( \sigma )),核PCA可以作为一种强大的非线性降维和特征提取工具。参数的选择会影响结果,通常需要通过实验来调整。

历史与总结 📚
- 经典PCA:由Karl Pearson等人于1901年左右提出,是统计学和数据科学中最基础、最广泛使用的工具之一。
- 核PCA:由Bernhard Schölkopf、Alexander Smola和Klaus-Robert Müller等人于1999年提出,是核方法浪潮中的重要成果,展示了将线性算法核化的强大能力。

本节课中我们一起学习了核主成分分析。我们首先回顾了经典PCA与核方法的基本思想。然后,通过建立协方差矩阵与核矩阵特征系统之间的数学联系(两个关键命题),我们推导出了核PCA的可行性。接着,我们详细阐述了如何仅利用核矩阵来计算数据在特征空间主成分上的投影,从而形成了完整的核PCA算法。最后,通过几何直观和实例演示,我们看到了核PCA如何通过非线性映射揭示数据的内在结构。核PCA不仅是一个实用的非线性降维工具,也是理解核化技巧的经典范例。
27:多维缩放(MDS)🔍
在本节课中,我们将要学习一种经典的嵌入算法——多维缩放。我们将了解什么是嵌入问题,为什么它有用,并详细学习经典多维缩放的数学原理和实现步骤。
什么是嵌入问题?🤔
上一节我们介绍了课程主题,本节中我们来看看什么是嵌入问题。
考虑以下场景:你有一些抽象对象,例如分子或文本。你有一种方法来测量这些对象之间的距离。例如,你可以测量两个分子之间的距离,并得到一个数值。现在,假设你拥有所有这些对象之间的成对距离。你可以将这些距离堆叠成一个矩阵,称为距离矩阵。
现在的问题是:如果有人只给你这个距离矩阵,你能在欧几里得空间 R^D 中找到一组点,使得这些点之间的距离与你给定的抽象对象之间的距离完全一致吗?
形式上,给定抽象对象 X_1, ..., X_n 和距离函数 d(i, j),我们希望找到一个嵌入映射 φ,将对象映射到 R^D 中,使得对于所有 i, j,有:
||φ(X_i) - φ(X_j)|| = d(i, j)
这样的问题被称为度量嵌入问题。
问题总是有解吗?❓
在深入解决方案之前,我们先思考一下:这个嵌入问题总是有解吗?解是唯一的吗?
以下是两个关键点:
- 如果数据点本身来自一个欧几里得空间,那么存在一个完美的嵌入(例如,原始的点配置本身)。
- 如果距离矩阵是任意的一般距离矩阵,通常我们无法找到一个完美的解,但可能可以找到一个近似解。
关于唯一性,问题通常没有唯一解。因为如果我们有一个嵌入,将所有的点平移或旋转,点之间的距离不会改变。因此,所有通过等距变换(平移、旋转、反射)相关联的嵌入都是等价的解。
为什么嵌入问题有用?💡
在探讨如何解决问题之前,我们先了解一下为什么嵌入问题在实际数据分析中是有用的。
以下是几个主要的应用场景:
- 可视化:这是使用度量嵌入最常见的原因之一。专家们希望将高维或抽象的数据(如分子)映射到2D或3D空间,以便直观地观察数据的结构、聚类和关系。
- 为算法准备数据:许多数据分析算法(如主成分分析PCA)要求输入数据是欧几里得空间的向量。如果原始数据是抽象对象(如分子),嵌入可以为其提供一个欧几里得表示。
- 降维:有时数据隐含在一个低维流形中,但显式表示维度很高。嵌入可以帮助我们发现并利用这个低维本质结构。
当然,使用嵌入也可能带来问题。如果原始数据的度量结构不是欧几里得的,嵌入必然会引入一些失真。在应用时需要权衡利弊。
多维缩放算法家族 📚
存在许多不同的嵌入算法。本节课我们主要关注多维缩放这一算法家族。它主要分为三类:
- 经典多维缩放:假设距离矩阵是欧几里得的,目标是完美恢复点配置。
- 度量多维缩放:处理更一般的距离矩阵,目标是找到一个尽可能保留给定距离结构的嵌入。
- 非度量多维缩放:仅知道距离之间的比较关系(如A比B更接近C),而非具体距离值,目标是找到一个满足这些不等式关系的嵌入。
我们将从经典多维缩放开始,它的数学原理出奇地简洁。
经典多维缩放:数学推导 🧮
我们假设给定的距离矩阵 D 是一个欧几里得距离矩阵,即存在某个欧几里得空间中的点集,其距离构成了矩阵 D。我们的目标是恢复这些点。
核心技巧是将距离矩阵重新表述为格拉姆矩阵(内积矩阵)。
第一步:用距离表示内积
在欧几里得空间中,两点间距离的平方可以展开为:
d(i, j)^2 = ||x_i - x_j||^2 = (x_i - x_j)^T (x_i - x_j) = x_i^T x_i + x_j^T x_j - 2 x_i^T x_j
重新排列上式,我们可以解出内积 x_i^T x_j:
x_i^T x_j = (1/2) * (x_i^T x_i + x_j^T x_j - d(i, j)^2)
第二步:选择坐标原点
上式仍然包含 x_i^T x_i 项,即点 x_i 到原点的距离平方。由于我们可以自由选择坐标系的原点而不改变点间距离,一个简便的做法是将第一个数据点设为原点,即令 x_1 = 0。
此时,x_i^T x_i 变成了 x_i 到 x_1 的距离平方,即 d(i, 1)^2。
因此,内积可以完全用已知距离表示:
s_{ij} = x_i^T x_j = (1/2) * (d(i, 1)^2 + d(j, 1)^2 - d(i, j)^2)
对所有 i, j 计算此式,我们就得到了格拉姆矩阵 S,其中 S_{ij} = s_{ij}。
第三步:从格拉姆矩阵恢复点坐标
格拉姆矩阵 S 是一个半正定矩阵,可以分解为:
S = X X^T
其中 X 是一个 n × d 的矩阵,它的第 i 行就是我们寻找的数据点 x_i 在 d 维空间中的坐标。
为了找到 X,我们对 S 进行特征值分解:
S = V Λ V^T
这里 V 是特征向量矩阵,Λ 是对角特征值矩阵。
然后我们定义:
X = V √Λ
这样得到的 X 满足 S = X X^T。矩阵 X 的每一行对应一个数据点的坐标。

第四步:确定嵌入维度 d
如果原始数据确实来自 d 维欧几里得空间,那么格拉姆矩阵 S 的秩就是 d,即只有 d 个非零特征值。
在实践中,我们通常绘制特征值谱,选择显著大于零的前 d 个特征值。对应的,我们取 V 的前 d 列(记为 V_d)和 Λ 的前 d 个特征值(记为 Λ_d),计算:
X_d = V_d √(Λ_d)
这样得到的 X_d 是一个 n × d 的矩阵,即 d 维嵌入结果。如果是为了可视化,通常选择 d=2 或 d=3。
算法总结与演示 📝

以下是经典多维缩放算法的步骤总结:
- 输入:欧几里得距离矩阵 D(n × n)。
- 计算格拉姆矩阵:选择第一个点为原点,对所有 i, j 计算:
S_{ij} = (1/2) * (D_{i1}^2 + D_{j1}^2 - D_{ij}^2) - 特征值分解:对矩阵 S 进行特征值分解,得到 S = V Λ V^T。
- 选择维度:根据特征值谱选择目标维度 d。
- 构造坐标矩阵:取前 d 个特征向量 V_d 和前 d 个特征值 Λ_d,计算嵌入坐标:
X = V_d * √(Λ_d) - 输出:矩阵 X 的每一行是原始对象在 d 维空间中的坐标。
在一个简单的演示中,我们从二维空间随机生成一些点,计算其距离矩阵,然后应用经典MDS算法。结果得到的嵌入点图与原始点图在旋转和平移意义下是完全一致的,并且特征值谱清晰地显示只有两个非零特征值,揭示了数据的本征维度为2。
度量与非度量MDS 🔄
当距离矩阵不是严格欧几里得时,我们使用度量多维缩放。其核心思想是定义一个应力函数来衡量嵌入的误差,然后通过优化(如梯度下降)最小化这个应力函数。
一个常见的应力函数是:
Stress = √[ Σ_{i≠j} (d_{ij} - ||x_i - x_j||)^2 / Σ_{i≠j} d_{ij}^2 ]
其中 d_{ij} 是原始距离,||x_i - x_j|| 是嵌入后的距离。优化这个非凸函数可能只能找到局部最优解,并且存在固有的近似误差。
非度量多维缩放处理的情况更特殊:我们只知道距离之间的排序比较(例如“对象A与B的距离小于对象A与C的距离”),而不知道具体的距离值。这种定性信息在某些场景(如人类主观评估)中更容易获得。其目标是找到一个嵌入,使得距离的顺序关系尽可能得到保持。
理论背景与总结 🏁
多维缩放算法历史悠久,经典MDS和基于应力函数的度量MDS可追溯到20世纪50-60年代。
在理论计算机科学中,对于嵌入问题有深入的研究,例如:
- Bourgain定理:任何n点度量空间都可以嵌入到欧几里得空间,且失真度最多为 O(log n)。
- Johnson-Lindenstrauss引理:高维欧几里得空间中的点集可以嵌入到低维空间,同时很好地保持点对距离。


本节课总结
本节课我们一起学习了多维缩放。我们首先定义了嵌入问题:根据给定的对象间距离矩阵,在欧几里得空间中寻找一组点,使其距离与给定距离一致。我们分析了问题并非总有完美解。然后,我们详细推导了经典多维缩放算法的数学原理,它通过将距离矩阵转换为格拉姆矩阵并进行特征值分解来获得点的坐标。我们还简要介绍了度量MDS(通过优化应力函数)和非度量MDS(处理距离比较信息)的概念。最后,我们了解了该领域的一些理论结果。多维缩放是一种强大的工具,可用于数据可视化、降维和为后续算法准备数据,但使用时需注意其可能引入的失真。
28:随机投影与Johnson-Lindenstrauss定理


在本节课中,我们将要学习Johnson-Lindenstrauss定理。该定理为我们提供了一种全新的方法,能够为原本存在于极高维空间的数据实现低维表示。这个定理非常精妙,不仅在机器学习领域,在理论计算机科学领域也常被用来降低某些算法的复杂度。


概述


之前我们已经学习了多种降维方法,例如主成分分析(PCA)或多维缩放(MDS)。这些方法提供了对整个空间的全局性保证,例如PCA旨在最小化平均重构误差。然而,无论是PCA还是MDS,都无法提供关于单个点对距离失真的保证,即无法保证特定点在进行投影后移动的距离。在某些情况下,可能会发生非常糟糕的失真。


Johnson-Lindenstrauss定理则采取了不同的思路,它试图证明所有点对距离的保证。


定理的核心思想

与之前的设定类似,我们有一些点,它们存在于一个高维欧几里得空间 R^D 中,其中 D 是一个很大的数。我们的目标是找到一个到低维空间 R^K 的投影,其中 K 远小于 D。

我们希望找到这样一个从高维空间到低维空间的投影 π,使得所有距离都近似保持不变。具体来说,对于原始空间中任意两点 x_i 和 x_j 的距离(用下标 R^D 表示),我们希望这个距离与投影 π 后这些点在低维空间 R^K 中的距离大致重合。
在本讲中,我们将看到可以构造这样一个嵌入,它是一个随机投影,并且可以保证这个性质对所有点对都成立,而不仅仅是平均意义上。这意味着我们可以大幅降低空间的维度,例如从指数维度降到多项式维度,同时不会丢失太多关于底层数据集的信息,因为距离只改变了非常微小的量。
Johnson-Lindenstrauss定理
以下是著名的Johnson-Lindenstrauss定理,我们将在本讲中证明它。
给定两个参数:N 是我们拥有的数据点的数量,ε 是一个介于0和1之间的数,代表我们允许的误差容忍度。
定理指出,存在一个维度 K,它需要大于某个特定的量(我们稍后会看公式)。假设我们有这样一个合适的 K,那么我们可以证明以下保证:


对于高维空间中的任意 N 个点的集合,存在一个映射 π,将你从高维空间 R^D 带到低维空间 R^K(其中维度 K 满足上述公式),使得对于所有点对 i ≠ j,都有以下保证:


原始高维空间中点的距离,与这些点被投影后的新距离相比,满足:
(1 - ε) * ||x_i - x_j||{R^D} ≤ ||π(x_i) - π(x_j)|| ≤ (1 + ε) * ||x_i - x_j||_{R^D}

这意味着,对于所有点对,投影后的新距离最多只能按因子 (1 ± ε) 偏离原始距离。

维度K的公式

现在让我们看看维度 K 的公式。公式表明 K 需要大于一个分数,分子是 log(N),分母包含 ε^2 和 ε^3 项。如果 ε 是一个非常小的数,那么分母主要由 ε^2 项主导。因此,忽略所有常数,我们得到的结果大致是 log(N) / ε^2。


这意味着我们从 N 个点开始,这些点存在于一个维度为 D 的空间中,D 可以任意大。实际上,N 个点最多张成一个维度为 N-1 的子空间,所以在最坏情况下,D 的数量级可以是 N。

定理告诉我们,我们可以将这些点嵌入到一个维度约为 log(N) / ε^2 的空间中,并且所有距离都接近原始距离的 (1 ± ε) 倍。



这之所以非常酷,是因为我们从数量级为 N 的维度,降到了数量级为 log(N) 的维度。这一切都受到 ε^2 的调节:你越想接近原始距离,任务就越困难。如果 ε 非常非常小,最终 K 可能会增长到无穷大,甚至超过原始维度。但原则上,如果你将 ε 设为一个常数,如0.1或0.01,事情仍然可以顺利进行。
此外,定理的大致轮廓是合理的:如果我们想提高嵌入的精度,就需要增加维度 K,因为我们需要更多的空间来安放数据点。在极端情况下,维度变得和原始维度一样大,我们当然可以实现零误差,但那样我们也没有获得任何好处。因此,ε 项以某种形式出现在分母中是合理的,而分子中的 log(N) 则带来了巨大的优势。


定理的算法意义


从算法角度来看,这非常酷。考虑许多算法,其复杂度以指数方式依赖于维度 N。例如,k-d树 的构建复杂度随维度 N 指数增长。这意味着如果你的数据存在于二维或三维空间,一切都很好;但如果你处于机器学习中常见的高维空间(如100维),由于复杂度原因,你可能永远无法在100维空间上构建一个k-d树。



利用Johnson-Lindenstrauss定理这个工具,你现在可以做到:取原始数据,将它们投影到一个维度仅为 log(N) 的空间中,然后应用你的算法。由于距离只被这个投影扭曲了非常微小的量,所以最终可能不会对你的算法造成太大伤害。但在新的低维空间中,如果你的算法复杂度指数依赖于维度,那么现在它只指数依赖于 log(N),这相当于关于 N 的多项式复杂度。在理论计算机科学中,这使你从指数复杂度 regime 转变为多项式复杂度 regime,这非常酷。


实现工具:随机投影
我们将通过随机投影来实现这个神奇的映射。

回忆一下,投影是指我们投影到一个一维向量上。如果这个向量是通过某个随机过程选择的,我们称这个投影为随机投影。在本例中,我们希望在所有可能方向上以相同的概率均匀投影。形式上,这意味着我们从 R^D 中的单位球面上选取一个单位向量,并用这个向量进行投影。

定义(一维随机投影):
设 Z 是从单位球面上的均匀分布中抽取的一个向量。那么映射 π_Z: R^D → R 定义为 π_Z(v) = Z^T v,这被称为到一维空间 R 的随机投影。

当然,我们也可以投影到 K 维空间。其原理与从一维扩展到多维类似。


定义(K维随机投影):
我们不是抽取一个向量,而是从单位球面上独立抽取 K 个向量 Z_1, ..., Z_K。这些向量张成一个子空间 S。那么到子空间 S 的投影 P_S 被称为到 R^K 的随机投影。

需要注意的是,只有当这些向量线性无关时,它才真正投影到 R^K 上。虽然理论上可能发生线性相关,但概率极低,我们在此假设抽取的向量是线性无关的。


如果你想实现这个随机投影,给定向量 Z,你可以将所有向量堆叠成一个矩阵 Z(大写),那么随机投影就是参数向量 v 与这个矩阵 Z 的乘法:P_S(v) = Z^T v。
随机投影的期望长度
现在,我们来看关于应用随机投影后期望长度的第一个命题。

命题:
假设 x 是原始空间 R^D 中的一个固定向量,且该向量的长度为1(单位向量)。考虑其在随机向量 V 上的随机投影 P_V(x),其中 V 有坐标 V_1, ..., V_D。那么,投影结果的期望平方长度是 1/D。


这意味着,与我们开始时范数为1的向量相比,经过随机投影后,我们至少在期望上得到一个范数为 1/√D 的向量。因此,如果我们想重新调整这个映射,使得映射保持长度的期望值,我们需要用一个因子 √D 来重新调整这个映射。

证明思路:
不失一般性,我们假设 x 是 R^D 中的单位向量 e_1。由于我们选择的随机向量在单位球面上均匀分布,我们所做的一切关于旋转都是不变的。因此,我们可以简单地假设从一个单位向量开始。

我们计算这个单位向量在随机投影后的期望平方长度,这等于随机抽取的单位向量的第一个坐标的期望平方值。由于向量 V 的范数为1,且所有坐标具有相同的期望(旋转对称性),所以每个坐标分量的期望平方长度必须是 1/D。这就证明了命题。


投影到K维子空间的期望长度
接下来,我们看看如果投影到一个K维子空间,期望长度是多少。


命题:
再次令 x 为一个固定的单位向量。考虑其在随机K维子空间 S 上的随机投影。那么,投影后向量的期望平方长度是 K/D。

直观上,之前我们有一维投影的直观含义:随机投影将所有东西减少了一个因子 1/D。现在,我们有一个因子 K/D。



证明思路:
设 R 是一个将子空间 S 映射到标准单位子空间 E_K(由前K个单位向量张成)的旋转。旋转不改变任何向量的范数。

关键技巧是:一个固定单位向量投影到随机K维子空间上的长度分布,与一个随机单位向量投影到固定K维子空间 E_K 上的长度分布相同。因此,我们可以交换随机性的角色:考虑 V 为一个随机向量(由旋转后的 x 定义),然后投影到确定的子空间 E_K 上。




然后,我们计算投影后的范数期望。由于投影到每个基向量上的期望平方长度是 1/D,而我们有K个这样的投影,所以总的期望平方长度是 K/D。


处理方差:集中不等式
到目前为止,我们已经知道了应用随机投影后期望长度是多少。但这只是期望值,实际上投影的真实长度可能存在高方差。接下来,我们将处理这个表达式的方差问题。

我们将使用集中不等式。集中不等式观察的是,如果一个随机变量有某个期望值,那么它的实际方差有多大?随机变量的实现值是以高概率非常接近期望值,还是分散在整个空间?


典型的集中不等式有两种形式:
- 加性偏差:概率 P(|U - E[U]| > ε) 很小,并且理想情况下应该是指数级依赖于偏差 ε。
- 乘性偏差:概率 P(U > (1+t)E[U]) 或 P(U < (1-t)E[U]) 很小,并且同样希望其随 t 指数级衰减。

我们将应用乘性集中不等式到随机投影的场景中。
引理(随机投影的集中性):
对于任意 β ∈ (0, 1) 和 β > 1,固定向量 x 在随机子空间 S 上投影的实际长度,与其期望值 K/D 之间的偏差,可以被一个表达式界定,该表达式涉及 K 和 β。



我们接受这个不等式,并将其应用到我们的随机投影场景中,结合我们已有的所有陈述。


证明Johnson-Lindenstrauss定理


现在,我们来证明Johnson-Lindenstrauss定理。


证明思路:
我们使用一个到K维子空间的随机投影,其中 K 的选择如定理所述。我们按因子 √(D/K) 重新调整这个随机投影。


根据关于期望值的命题19,如果我们从一个长度为1的向量开始,然后投影并重新调整,它将再次具有长度1。然后,根据集中不等式,我们将看到投影的实际值也将非常接近1。这就是整个定理的最终陈述。
详细步骤:
- 考虑 R^D 中的两个点 x_i 和 x_j。令 P 为一个随机投影,其维度 K 如定理所述。
- 我们希望证明定理中的不等式对于向量 P(x_i) - P(x_j) 成立。因此,我们定义向量 z = x_i - x_j。
- 第一步:我们考察投影后向量 z 的实际长度(即点 x_i 和 x_j 投影后的距离),并计算其偏离期望值 (1+ε)E[||P(z)||^2] 的概率。利用集中不等式,可以证明这个概率非常小,小于 1/n^2。
- 第二步:第一步的结论意味着,对于任何固定的点对 (x_i, x_j),定理不成立的概率最多为 2/n^2(考虑上下两个方向的偏差)。
- 第三步:我们希望定理对所有点对 x_i 和 x_j 都成立。我们需要控制至少有一个点对不满足定理的概率。利用概率的并集界限(Union Bound),这个概率小于等于所有点对不成立概率之和,即 ∑_{i<j} 2/n^2。共有 n(n-1)/2 个点对,计算可得该概率小于 1 - 1/n。
- 因此,定理对所有点对都成立的概率至少是 1/n。虽然这个概率看起来不大,但关键在于它大于0。这应用了概率方法:要证明某个对象(映射 π)存在,只需证明在某种随机构造下,该对象出现的概率为正即可。这便完成了定理的存在性证明。
算法实现与构造


定理证明了存在性,但在计算机科学中,我们不仅关心存在性,还希望实际计算它。

算法思路:
你可以简单地反复抽取随机投影,直到找到一个满足所有所需性质的投影。
- 抽取一个随机投影。
- 检查所有点对是否满足所需性质。
- 如果不满足,则抽取另一个随机投影。
从算法角度看,这可能不是最高效的方法,因为检查一个随机投影需要 O(n^2) 的复杂度(检查所有点对距离)。而我们需要抽取大约 O(n) 个随机投影才能在期望上找到一个可用的。因此,总的构造复杂度是 O(n^3)。这对于不是特别大的数据集是可行的。



如何构造随机投影?
一个重要细节是如何实际构造这样的随机投影。一个常见但错误的方法是使用极坐标均匀采样,这不会在单位球面上产生均匀分布。

一个简单且正确的方法是使用正态分布:
- 从 R^D 上的标准正态分布中抽取一个随机向量 z1。
- 将 z1 归一化为单位长度。
- 重复K次,得到K个向量。检查它们是否线性独立(概率极高),如果需要,可以对其进行正交化以得到标准正交基。


更简单的构造(Achlioptas, 2003):
一个更优雅的简化版本是使用随机 ±1 矩阵。构造一个 K × D 的矩阵 R,其中每个元素独立地以1/2概率取+1或-1。然后用 ** (1/√K) * R ** 作为投影矩阵。Achlioptas证明了,使用这种矩阵进行投影,以高概率同样满足Johnson-Lindenstrauss定理的性质。
定理的意义与应用

Johnson-Lindenstrauss定理之所以酷,原因如下:
- 算法加速:许多算法的运行时间指数依赖于维度。该定理可以将指数依赖降为多项式依赖。
- 机器学习应用:对于存在于高维空间的数据,我们可以将其投影到低维空间进行可视化或处理,并且知道所有点对距离都有逐点保证。这对于依赖距离的算法(如K近邻算法)可能很有用。虽然不能保证K近邻结果完全不变,但这是一个值得尝试的工具。


扩展与总结

我们目前看到的只是Johnson-Lindenstrauss定理的基本版本。存在许多变体和扩展,特别是在理论计算机科学领域。
- 例如,对于非欧几里得距离(如 L_p 距离),有相应的定理,需要使用 p-稳定分布 代替高斯分布。
- 还有关于将度量空间嵌入到低维欧几里得空间的许多其他定理,例如著名的 Bourgain定理。


本节课中,我们一起学习了Johnson-Lindenstrauss定理。该定理表明,通过随机投影,我们可以将高维空间中的点集嵌入到低得多的维度中,同时以高概率近乎保持所有点对之间的距离。我们探讨了定理的陈述、证明思路、算法实现及其重要意义。这是一个连接概率论、几何和算法设计的强大工具。
29:邻域图 🕸️
在本节课中,我们将学习如何将数据表示为图(或网络),并了解构建邻域图的标准方法。邻域图是一种将数据点之间的相似性关系编码为图结构的有效方式,是许多图机器学习算法的基础。
从数据到图
在机器学习中,存在一个庞大的子领域,专门处理基于图的机器学习算法。其核心思想是将数据以图或网络的形式表示,然后在这个图结构上运行算法来分析数据。
通常有两种不同的场景。第一种场景是数据本身已经具有有趣的图结构。例如,如果我们想对社交网络中的用户进行推断,而数据是Facebook的好友关系图,那么我们已经有了一个图:用户是图中的顶点,好友关系是图中的边。
然而,在许多研究领域中,数据本身并没有这种天然的图结构。但我们可以轻松地构建一个图。这就是本节课要简要介绍的邻域图,它是构建图的标准方法之一。

邻域图的核心概念
现在,我们来看看邻域图。邻域图粗略地试图编码以下概念:图中的顶点就是我们的数据对象。例如,如果要对分子进行推断,顶点就是分子;如果要对文本进行推断,顶点就是文本;如果要对人进行推断,顶点就是人。
在机器学习的标准记法中,顶点通常就是我们所说的数据点 Xi。我们希望在图中编码哪些对象彼此相似,并通过边连接那些非常相似的对象。这样得到的图有时被称为相似图。
幻灯片上展示了这一点:图中的顶点始终是我们感兴趣的对象,而边则表示对象是否处于相同的“邻域”或彼此相似。
接下来的问题是:我们如何衡量点是否在同一邻域或彼此相似?这可以通过以下几种方式实现。
K近邻图

首先,我们可以构建所谓的有向K近邻图。其定义如下:我们希望将数据点 Xi 通过一条有向边连接到它的 K 个最近邻。这里 K 是一个参数。我们简单地将每个点连接到它的K个邻居。
请看示意图。这里有一些生活在欧几里得平面中的数据点。如果我想构建一个有向3近邻图,并从标记的大点开始,我需要找出它的三个最近邻,并插入有向边。例如,第一个邻居、第二个邻居和第三个邻居,我们用红色边表示。
我们对图中的所有顶点都执行此操作,然后得到一个有向图,称为有向K近邻图。
需要注意的是,有时边可能只存在于一个方向,而不存在于另一个方向。例如,在数据集中添加一个离群点。这个点的三个最近邻可能是另外三个点,因此存在从这个离群点指向它们的边。但是,如果我们看其中一个蓝色点的最近邻,可能并不包括那个离群点。因此,从蓝色点到那个红色离群点就没有有向边。这是因为一个顶点可能是离群点,它指向正常顶点的边可能很长,但被它指向的顶点本身有更近的邻居,所以边不会双向存在。
从有向图到无向图
在许多机器学习应用中,使用有向图非常不便,因为我们经常需要查看邻接矩阵、图拉普拉斯矩阵或其他与图相关的矩阵,并进行特征分解。为此,我们首先希望矩阵是对称的,而有向图的邻接矩阵不是对称的。
因此,如果我们有一个有向图,但希望将其转换为无向图,主要有两种方法:
- 忽略方向,只要两个顶点之间至少有一个方向的箭头,就放置一条无向边。
- 只有当原始图中两个方向都有箭头时,才放置一条无向边。
以下是这两种方法的公式化定义。
标准K近邻图
第一种方法是构建标准K近邻图。做法是:在 Xi 和 Xj 之间放置一条边,如果至少满足以下条件之一:Xi 在 Xj 的K近邻中,或者 Xj 在 Xi 的K近邻中。这意味着,只要两个顶点之间至少有一个方向的箭头,就简单地放置一条无向边。这本质上是忽略了有向图中的边方向,从而得到一个无向图。这是机器学习中最广泛使用的图。
互K近邻图
另一种选择是构建互K近邻图。这里的关键区别在于使用“且”而不是“或”。要判断顶点 Xi 和 Xj 之间是否存在无向边,需要检查两个条件是否都成立:Xi 有一条指向 Xj 的有向边,并且 Xj 有一条指向 Xi 的有向边。只有当两个条件都为真时,才放置无向边。
从定义中可以明显看出,互无向图中的边集始终是标准无向图中边集的子集,反之则不成立。
Epsilon近邻图
除了K近邻图,还存在另一种图概念,通常称为 Epsilon近邻图。它更简单:如果两点之间的距离小于某个阈值 ε,则将每个点连接到其他所有点。
为了感受这些图的实际工作原理,这里有一个示例图。我们有一些从R2中随机抽取的蓝色数据点。图中显示了不同无向图的边。
- 左侧是K=5时的标准K近邻图。可以看到,该图倾向于良好连接。
- 右侧是相同K值下的互K近邻图。可以看到边少得多,并且图可能不连通,存在一些孤立的点或小簇。这是因为,如果一个点是离群点,它可能有边指向其他点,但其他点可能没有边指回它,导致它在互近邻图中被孤立。
- 如果增加K值(例如K=10),互近邻图的连通性会提高,但可能仍然存在离群点。
- 图中也展示了Epsilon图。Epsilon图存在类似互K近邻图的问题:如果存在离群点,且选择的 ε 不够大,图可能不连通;如果为了使图连通而选择非常大的 ε,那么在高密度区域内,几乎每个点都会连接到其他所有点,从而失去图的结构信息。
因此,从这张幻灯片得出的结论是:如果你要从数据构建无向图,应始终使用标准K近邻图。
边权重
到目前为止,我们看到的所有图都没有边权重,是无权图。但在许多应用中,为图添加边权重可能很有意义。
以标准K近邻图为例,图中有些边较长,有些边较短。我们可能希望将边的“长度”信息传达给算法,这可以通过边权重来实现。
重要的是,边权重应编码相似性,而不是距离。 在无权图中,邻接矩阵的条目是1(有边)或0(无边)。引入相似性权重时,我们希望边对应高值,而没有边或信息量不大的长边对应低值。
对于欧几里得数据,典型的选择是在边上使用高斯核作为边权重。本质上,通过高斯核计算两个顶点之间的相似性,并选择一个合适的核宽度 σ。这个 σ 的选择应使得一个点与大约10-15个邻居相似,但确保图中相距很远的点(例如左上角和右下角的点)不相似。
通过使用带相似性权重的K近邻图,可以向算法传达比无权图更多的信息。
切勿使用距离作为权重,因为这破坏了邻域图背后的逻辑。两个非常接近的点距离近乎零,但它们在图中应有边(权重应为高相似性值),这两者不匹配。
对于Epsilon图,通常不使用边权重,因为 ε 本身已经包含了某种距离信息。在Epsilon图中,所有边的长度大致都在 ε 以内,因此区分长边和短边的意义不大。
为何使用图表示数据?
将数据表示为图有许多原因,以下列举几点:
- 稀疏表示相似性结构:对于大规模数据(如十亿用户),存储完整的距离矩阵(十亿乘十亿)是不可能的。图只编码相近对象之间的相似性,而忽略相距甚远的对象,这非常高效。在机器学习中,通常只有相似或邻近对象之间的信息才是真正重要的(例如在分类问题中)。
- 算法便利性:计算机科学领域对图有深入研究,存在大量成熟的图算法。使用图可以方便地表达对象之间的关系。
- 强调局部结构:许多任务(如分类)只关心局部邻域,而不关心空间中遥远部分发生的情况。K近邻图或Epsilon图恰好编码了这种局部邻域信息。
基于图的机器学习方法应用广泛,例如:
- 聚类:谱聚类这一著名的聚类算法完全基于图。
- 降维:许多降维技术(如下一讲将讨论的等距映射)基于图结构。
- 半监督学习:许多算法(如标准的标签传播算法)使用这种基于图的框架。
总结

本节课我们一起学习了邻域图。我们首先了解了将数据表示为图的基本动机。然后,详细探讨了构建邻域图的几种主要方法:有向K近邻图、标准(无向)K近邻图、互K近邻图以及Epsilon近邻图。我们通过比较得出结论,标准K近邻图通常是实践中的首选。此外,我们还讨论了为图添加相似性边权重(如高斯核)以增强信息表达的重要性。最后,我们总结了使用图表示数据在稀疏性、算法便利性和捕捉局部结构方面的优势,并列举了其在聚类、降维等任务中的应用。掌握邻域图的构建是理解后续众多图机器学习算法的基础。
30:Isomap算法详解 🗺️




在本节课中,我们将要学习Isomap算法。这是一种在2000年左右发展起来的算法,它和同时期出现的其他多种算法有一个共同的目标:假设数据虽然可能存在于一个非常高维的空间中,但其本质上存在于一个低维结构上,这个结构可以用流形来描述。Isomap以及其他嵌入算法的目标,就是找到数据的这种低维表示,并将数据嵌入到这个低维空间中,同时考虑到数据所具有的流形结构。接下来,我们将探讨其工作原理。
动机:数据的内在低维结构
在许多数据集中,存在一个内在的假设,或者做出这样的假设是合理的:即使数据可能记录在一个非常高维的空间中,数据点之间的结构或关系,可以用一个维度低得多的结构来表示。
以下是几个具体的例子:


- 茶壶数据集:这是一个著名的数据集。幻灯片中间可以看到一个茶壶。数据集的创建者通过围绕茶壶行走,从所有不同角度拍摄图像。这些图像被排列成一个圆圈。虽然每张图像都是茶壶,但视角在每张图像中都不同。如果你想探索这个数据集中图像之间的邻域关系或几何关系,你可以将这些图像排列在一个二维空间(实际上是一个圆圈)上。圆圈上相邻的茶壶图像,其视角几乎相同,可能只相差一两度。本质上,这甚至是一个一维结构,因为你只需要一个参数来描述你在圆圈上的位置。如果你的数据有足够的信息,这个单一参数就足以包含数据集中不同图像之间的邻域结构。这就是我们所说的低维结构。
- 声音记录:例如,你想记录人的声音。一个人的声音特征,如果以声波形式记录,是一个非常非常高维的刺激。但考虑到声音是如何产生的,喉咙里有许多肌肉,可能有20、30、40、50块肌肉参与说话。你可能还需要知道喉咙的尺寸、各种伸长量等。但一旦你知道了所有这些参数,你或许就能相当好地预测我的声音听起来会怎样。因此,你可能不需要5万个参数来描述我喉咙的局部几何形状,也许50个参数就足以大致了解我的声音会是什么样。
- 图像数据库:类似地,如果你考虑图像,比如图像数据库,图像通常以相当高的分辨率记录,可能有100万或1000万像素。但如果你有一个图像数据库,你可能不需要1000万个参数来描述所有这些图像,这听起来太多了。也许存在一个内在的结构。
流形与嵌入的直观理解
我经常使用“流形”这个词,可能很多人不知道它是什么。这里有一个初步的图示。
直观地说,流形类似于你在左图中看到的东西,它是一个低维物体。比如一个二维物体(也可以是更高维),就像一张嵌入到更高维空间中的纸。它不一定是线性嵌入的。如果你有一张纸,当然可以把它放在三维空间中,它仍然是平的,所以与这张纸的二维表示没有区别。但如果这张纸像图中所示的地形一样有些褶皱,这就是我们所说的流形。

从抽象的角度来看,我们的想法是假设我们正在查看的数据集具有这样的流形结构,即描述该数据集所需的参数数量远低于该数据集所在空间的维度。在这个特定的图中,为了引入一些符号,这个数据集的内在维度是2,它就像一个平面,是一个二维的东西。但在本例中,它存在于一个三维空间中,所以这个数据集的外在维度是3。
现在,基于流形的算法或嵌入算法的目标是:假设你的数据具有这样的形状。你从这个流形上采样点,比如获取手部图像或茶壶图片,从而得到单个数据点。然后,你希望“展平”这个流形。在理想情况下,你会发现描述这些数据点的结构是二维的,然后你想找到一个二维表示,它能展现出这种结构,并丢弃所有不需要的额外信息和维度。从这个意义上说,它与PCA或MDS类似,是一种降维技术:从用非常高维空间表示的对象开始,发现哪些参数可能不那么重要,然后嵌入到低维空间,并尝试恢复数据集中仍然重要的信息。
Isomap算法的核心思想

现在,我们来看看Isomap算法的直觉。
在一个小的局部区域内,流形上点之间的距离大约与空间中的欧几里得距离一致。事实上,如果你有数学背景,你可能会意识到这或多或少是流形定义的一部分:流形的定义是,局部上你可以用低维欧几里得空间的局部映射来描述流形,但全局上你需要将所有映射粘合在一起才能得到完整的图像。



回到这个图,局部来看,例如在这个S形物体中绘制的这些小矩形中,每个矩形都几乎是平的,看起来就像一个平面,即使整个图形是S形的。这个物体的局部区域看起来像一个二维平面。这意味着,如果两个点彼此非常接近,那么当我们测量这些点之间的距离时,我们可以简单地取它们的坐标并计算欧几里得距离(在外在空间中给出)。这个距离与这两个点沿着这个流形结构所具有的距离是一致的。
然而,如果我观察这两个相距较远的蓝色点,如果我简单地取这两个蓝色点的坐标并计算欧几里得距离(同样是在这个外在的周围空间中),那么这个距离将计算两点之间的最短路径,即图中蓝色虚线所示。这不再描述流形结构,因为如果我沿着流形内部行走,我的距离会更长。

关键点在于:在一个小的局部区域,数据点之间的欧几里得距离(正如我们在高维空间中给出的那样)大约与沿着流形的内在距离一致。对于大距离,这并不成立。这是算法的关键。

测地线距离与“展开”流形


让我们看一个具体的例子。假设我们有一个卷起来的纸片,我们想把它展平。如果你现在计算这个蓝点和那个蓝点之间的距离,并且简单地使用欧几里得距离,你会得到一个比沿着流形行走的距离短得多的距离。沿着流形行走的距离被称为测地线距离。




另一个例子是地球。将地球视为三维空间中的一个物体。我们取德国和澳大利亚在这个三维空间中的坐标,并计算欧几里得距离,你会计算穿过地球的距离。这可能并不能真正代表地球表面发生的情况,因为在地球上,我们需要绕地球表面行走。这就是测地线距离,即在你当前考虑的物体表面上行走时,两点之间可以实现的最短距离。



现在的想法是:如果你想展平这个流形。最终,我们想要找到一个算法来发现数据的二维结构(在这个特定例子中),我们想要展开这种卷起来的纸片。为了能够展开它,我们需要知道在展开这种卷曲结构后,距离应该是多少。如果你想知道,在我们展开数据结构后,这两个点之间的红色距离是多少,那么这由在原始数据空间中沿着流形表面行走来表示。





因此,直觉是:如果我们想实现这种流形的展开,我们首先需要估计点之间的测地线距离是多少?例如,这条红线和这条蓝线有多长?一旦我们知道了所有这些,我们就可以尝试在二维空间中找到数据点的嵌入,以实现这些距离,这将是算法的结果。



Isomap算法的步骤

这就是Isomap算法的直觉。我们需要做的第一件事是发现流形中可能的测地线距离。
现在,我们第一次应用邻域图。想法如下:假设我们从这个卷起来的纸片上采样了一些点(顺便说一下,这在流形文献中通常被称为“瑞士卷”数据集)。假设我们的数据存在于这样一个瑞士卷上,我们有一些样本点(这里用颜色编码以便更好区分)。现在的关键是,例如,最顶部的这个红点实际上离这些浅蓝点相当远,因为如果你沿着流形行走,你需要走完流形内部的整个回路。这与简单地取这个红点和这个浅蓝点之间的欧几里得距离绝对不同,因为后者只是测量这条直线距离,而不是沿着流形的距离。我们想找到一种方法来测量沿着流形的距离,因为我们不知道这个流形结构。我们只有数据点的坐标。我们可能拥有图像,它们可能是1000x1000像素的图像,我们想发现这种结构。我们该怎么做呢?


右边的图展示了想法:我们要做的是在我们的数据点上构建一个邻域图。通常,人们使用K近邻图。你取所有数据点,将每个点连接到它的K个最近邻,其中K是一个需要仔细选择的参数。假设在这个图像中,K可能是5左右。这是来自瑞士卷数据点的K近邻图。关键是要选择足够小的K,使得我们沿着流形连接邻域,但不会在流形的不同层之间建立连接。我们不希望有一条从这个红点到那个浅蓝点的边,因为这会引入一个在流形上不存在的“捷径”。我们希望K的选择使得所有在流形上是邻居的点都被连接起来,但我们不会在流形的不同部分之间引入捷径连接。
假设你能做到这一点,最终会得到一个类似这样的图。现在你想估计一个点与流形上远处另一个点之间的距离。技巧是,我们现在可以沿着图行走,并尝试计算图中最短的路径距离。本质上,在高层次上,你想知道这个红点和那个浅蓝点之间的测地线距离。为了找到流形上的测地线距离,你现在进行所有这些小的局部步骤。你沿着图的边行走,并尝试找到这个邻域图中的最短路径距离。
现在,流形的直觉又回来了:因为图中这些局部边确实很短,所以如果我们现在计算这样一条边的长度,我们可以简单地使用数据点的欧几里得坐标,计算周围空间中的欧几里得距离,而无需做任何特殊处理。我们只需取原始的高维坐标,计算局部距离,即使这是周围空间中的距离,它也与我们在流形上也会有的距离一致。这对于所有边都是成立的,因为图中的边是短线段。对于这些短线段,欧几里得距离信息是准确的。因此,你可以将欧几里得距离作为权重放在你的K近邻图上,然后计算最短路径距离。现在,当你沿着这个最近邻图行走时,例如,要从这个顶部点走到这个底部浅蓝点,你会发现你需要绕着整个螺旋走一圈,距离会相当长。
这就是你在Isomap算法中应该做的:为所有点对构建最近邻图,计算最短路径距离。这个最短路径距离的长度,就是你作为流形中测地线距离的近似值。然后,你可以使用某种MDS算法,将数据嵌入到一个能正确表示这些距离的低维结构中。

算法总结与数学保证
现在,我认为我们已经看到了Isomap算法的大部分组成部分。以下是它的实际工作原理:

- 输入:给定抽象的数据点和一个距离函数。通常,我们不是从R^d中的点开始,而是从任何东西开始,比如分子、文本、图像。我们有一个评估点之间距离的函数。我们希望至少在局部尺度上,这个距离函数是有用的。全局尺度上的距离是否描述得很好并不那么重要,但局部上它应该有意义。
- 构建K近邻图:为某个需要仔细固定的参数K构建一个K近邻图。边由距离加权。这是本章邻域图规则的一个例外:在所有其他算法中,你会用相似性对边进行加权,但这里我们要计算最短路径距离,所以我们把边的长度作为放在边上的权重。这个想法是图中的这些边编码了局部距离。
- 计算测地线距离:在K近邻图中,我们现在计算所有点对之间的最短路径距离D_sp(最短路径),并将它们放入一个矩阵中。这个矩阵现在就是我们想要在找到低维结构或低维嵌入时恢复的全局距离矩阵。
- 应用多维缩放:现在,我们简单地使用多维缩放,以这个距离矩阵D_sp作为输入。你可以决定使用哪种多维缩放变体,概念上没有区别。你总是想解决这个问题:给定一个距离矩阵,找到数据点的低维嵌入,使得这些距离得以保留。这确实是一个概念上非常简单的算法。




从数学角度来看,我也觉得它非常优美,因为你真正利用了流形的这种定义,将其编码到最近邻图中,然后使用经典的多维缩放或度量嵌入技术进行嵌入。
Isomap算法的另一个优点是,你实际上可以在某些情况下给出强有力的数学保证,证明该算法确实有效。在原论文中,作者证明了以下类型的陈述:


- 如果数据点是从一个“好的”流形上均匀采样的(“好的”意味着它可以被放入一个平坦的空间,曲率不能太强,边界良好等),并且如果点的数量N趋于无穷大,同时选择K与log(N)同阶,那么K近邻图中的最短路径距离会收敛到流形上的测地线距离。
- 然后,第二步是,一旦你知道你对测地线距离有了一个好的估计,你需要说明在什么情况下MDS能恢复正确的嵌入。如果你能使流形变平,这就是成立的。事实上,从数学角度来看,这对流形来说是一个非常强的条件,大多数流形都不是平坦的。但至少你可以正确估计这个特定流形上的测地线距离。
历史背景与意义
一点历史:正如开头所说,流形方法在2000年左右及其后大约五年非常流行。Isomap是最早出现的算法之一,还有拉普拉斯特征映射、局部线性嵌入或最大方差展开等,它们都共享这种Isomap哲学。
或许也可以展望一下为什么这种流形方法在当时非常流行和强大。人们想知道,为什么有可能对非常高维的对象进行推断,而且这种推断仍然有效?如果你考虑由数百万参数描述的图像之类的东西,从统计感觉上你会说,如果你只有几百张图像,每张图像需要100万个参数来描述,怎么可能从100张图像中学到东西?参数太多了,我不可能仅仅从100张图像中学习100万个参数,所以这应该注定失败。那么,为什么机器学习有效呢?

你可以做出一些解释其为何有效的假设或原因。其中之一就是这种流形假设,即:我们可以学习,是因为原则上,数据的维度,即使它可能由一百万个参数表示,实际上我们并不需要这一百万个参数,我们只需要20个。然后突然间,如果你有100个点,20维可能仍然有点稀疏,但也许你能看到,如果你有更少的数据点,并且它们本质上并不生活在太高维的空间中,那么至少从概念上你可以理解为什么机器学习可能有意义,为什么原则上应该有可能在有限的数据集上工作并发现有趣的现象。

我们将在课程后面看到的另一个机制是稀疏性。稀疏性是你可以做出的另一大类假设。如果你假设你的数据生活在一个100万维的空间中,但对于每个数据点,只有50个维度具有非零的实际值,这是假设你需要更少的参数来描述数据的另一种方式。然后从统计的角度来看,你再次处于更安全的一边,或者至少你可以从概念上理解为什么原则上可能对这些数据集进行推断。
因此,流形假设(这是我们在Isomap中利用的)和稀疏性(我们将在课程后面看到)是人们(至少是隐含地)做出的两大类假设,以解释为什么机器学习在有限样本上有效,而不仅仅是在N趋于无穷大的极限情况下有效。
总结

本节课中,我们一起学习了Isomap算法。我们从数据可能具有内在低维流形结构的动机开始,通过茶壶、手部图像等例子建立了直观理解。我们介绍了流形的概念,区分了内在维度和外在维度。Isomap算法的核心思想是:局部欧氏距离近似于流形上的内在距离,而全局距离则需要用测地线距离来近似。算法通过构建K近邻图来估计测地线距离(图中最短路径距离),然后使用多维缩放在低维空间中嵌入数据点以保持这些估计的距离。我们还简要讨论了算法的数学保证和历史背景,认识到流形假设是解释高维数据上机器学习为何可行的重要原理之一。
31:t-SNE 📊




在本节课中,我们将要学习一种用于降维和数据可视化的算法——t-SNE。我们将了解它的核心思想、工作原理、优势以及在使用时需要特别注意的局限性。











之前我们已经介绍过多种降维或嵌入算法,它们都旨在将数据嵌入到欧几里得空间中,同时尽可能保留数据的某些特性。例如,主成分分析(PCA)试图保留数据中尽可能大的方差;多维缩放(MDS)则力求在平均意义上保持数据点之间的距离结构;随机投影提供了点对距离的近似保证;而流形恢复方法则假设数据位于低维流形上,并试图“展开”这个流形。本节中,我们来看看一个目标完全不同的算法:t-SNE。

t-SNE 的核心思想 🎯
t-SNE 的主要目标不是恢复流形结构或精确保持距离,而是揭示数据中的聚类结构。它旨在找到一个低维嵌入(通常是二维),使得如果原始数据中存在清晰的聚类,那么在嵌入空间中这些聚类能够被清晰地分离和展示出来。当然,为了实现这一目标,算法会牺牲许多其他的几何特性。
以下是关于 t-SNE 的一些重要文献:
- 原始论文:van der Maaten & Hinton (2008),《Visualizing Data using t-SNE》。
- 在线教程:Distill.pub (2016),提供了一个非常清晰的解释和可视化示例。
- 实践指南:Kobak & Berens (2019),探讨了如何在实际中更好地使用 t-SNE。
- 理论分析:Linderman & Steinerberger (2019), Arora et al. (2018) 等,对 t-SNE 的理论性质进行了研究。
算法原理 ⚙️


t-SNE 是 t-分布随机邻域嵌入 的缩写。它是一种非线性降维方法,通常用于数据可视化或探索,而不是作为分类等任务的数据预处理步骤,因为它会严重破坏数据的全局几何结构。





其基本思想非常简单:
- 在高维输入空间:为每个数据点
i定义一个相似性分布P。这通常是一个以点i为中心的高斯核函数,其带宽σ_i针对每个点单独调整,使得该点与大约k个最近邻点具有较高的相似度。这个分布经过归一化,因此对于每个点i,∑_j p_{j|i} = 1。注意,p_{j|i}通常不等于p_{i|j}。 - 在低维输出空间:我们有一组嵌入点
y_i。同样为它们定义一个相似性分布Q,但这里使用自由度为1的 t 分布(即柯西分布)作为核函数。其定义为q_{ij} = (1 + ||y_i - y_j||^2)^{-1} / (∑_{k≠l} (1 + ||y_k - y_l||^2)^{-1})。t 分布具有重尾特性,对异常值更鲁棒。 - 优化目标:我们希望输出空间的相似性分布
Q尽可能接近输入空间的相似性分布P。衡量两个分布差异的指标是 Kullback-Leibler 散度。t-SNE 通过梯度下降法最小化所有数据点上的 KL 散度之和C = ∑_i KL(P_i || Q_i),来找到最优的嵌入点{y_i}。










如何选择高斯核的带宽(σ)?

带宽 σ_i 的选择至关重要,它通过一个叫 困惑度 的参数来控制。困惑度可以连续地衡量“有效近邻数量”。对于每个点 i,算法通过二分搜索调整 σ_i,使得该点相似性分布 P_i 的熵的 2^H(P_i) 次方等于用户设定的目标困惑度值。直观理解就是,为每个点选择 σ_i,使其与大约 k(困惑度)个最近邻点相似。
梯度下降的物理解释
KL 散度的梯度可以分解为吸引力和排斥力两部分。相似的点(p_{ij} 大)在嵌入空间中被拉近(吸引力),而所有点之间都存在轻微的排斥力,防止它们重叠。最终的嵌入结果是这些力达到平衡的状态。




t-SNE 的优势与效果 ✨



t-SNE 在实践中非常流行,因为它在许多情况下能产生视觉效果极佳、能清晰分离已知类别(如果存在)的图。与 PCA 或 MDS 相比,t-SNE 通常能更好地展现数据的聚类结构。有理论结果表明,对于具有良好分离的球形簇的数据,t-SNE 能够以高概率恢复出这种聚类结构。
重要注意事项与局限性 ⚠️
尽管 t-SNE 很强大,但其结果对参数极其敏感,且会严重扭曲数据,因此在解读时必须非常谨慎。
以下是使用和解读 t-SNE 图时需要牢记的关键点:
1. 参数敏感性
t-SNE 的结果严重依赖于众多参数的选择,包括:
- 初始化:通常使用 PCA 或 MDS 的结果作为初始嵌入,而非完全随机初始化。
- 困惑度:最重要的参数之一,控制每个点的局部邻域大小。
- 优化参数:学习率、迭代次数、早停策略、动量、早期放大技术等。
不同的参数组合会产生外观迥异的嵌入图。用户可能会不断调整参数,直到看到符合自己预期的图,这可能导致确认偏误。
2. 聚类大小无意义
在 t-SNE 图中,一个簇的视觉大小(所占面积)不能反映原始高维空间中该簇的实际大小或方差。算法会调整尺度,使得不同密度区域的点在其局部邻域内具有相似的距离,从而导致簇的大小信息失真。
3. 簇间距离无意义
在 t-SNE 图中,两个簇之间的距离(即它们在二维图上的分离程度)不能可靠地反映它们在原始高维空间中的相似性或差异性。一个遥远的簇在原始空间中可能并不特别不同,反之亦然。因此,不能根据图中簇的远近来判断它们的相关性。
4. 随机噪声可能呈现虚假结构
即使输入数据是完全随机的噪声,t-SNE(尤其是在低困惑度下)也可能产生看似有聚类结构的图。因此,图中看到的“簇”不一定代表数据中真实存在的结构。












5. 拓扑结构可能不被保留
t-SNE 可能会保留也可能不会保留数据的某些拓扑特性(例如,一个点是否在另一个点的“内部”或“环绕”关系)。这取决于参数设置,并且无法保证。









总结与最佳实践 📝



本节课我们一起学习了 t-SNE 算法。它是一种强大的数据探索和可视化工具,能有效揭示数据中潜在的聚类结构。
核心要点总结:
- 目标:通过匹配高维(高斯相似性)和低维(t-分布相似性)的概率分布,实现强调聚类结构的降维可视化。
- 优势:常能产生清晰分离已知类别的美观可视化图,有助于形成关于数据结构的假设。
- 核心局限:结果对参数敏感;簇的大小、簇间的距离、拓扑结构等信息均不可靠;可能从噪声中产生虚假模式。
最佳实践建议:
将 t-SNE 视为探索性数据分析的工具,用于生成关于数据结构的假设,而非验证假设的证据。当你从 t-SNE 图中获得新见解时,必须通过独立于可视化工具的其他方法(例如,基于领域知识的实验、统计检验或其他机器学习模型)去验证或证伪这些假设。永远不要仅凭一张 t-SNE 图就得出最终的科学结论。
32:聚类简介 🧩
在本节课中,我们将要学习数据聚类这一领域。聚类是无监督学习中最重要的领域之一,其目标是在没有标签信息的数据中发现内在的组别结构。我们将概述什么是聚类问题、不同类型的聚类问题,并在后续课程中讨论解决这些问题的各种算法。
什么是数据聚类?🔍
上一节我们介绍了聚类的基本概念,本节中我们来看看其具体定义和目标。

在数据聚类中,我们通常给定一组数据点 x1, x2, ..., xn,但不像监督学习那样拥有任何标签信息。聚类的目标是在没有外部指导的情况下,发现数据中自然存在的组别。

例如,你可能希望发现某种疾病的不同亚型、识别不同类型的客户,或者区分不同的鸟类物种。你总是假设数据中存在一些“组”,组内的数据点彼此之间比组间的数据点更为相似,而算法需要自行发现这些组。
聚类的应用场景 📊
以下是聚类算法的一些典型应用场景:
- 歌曲流派分类:在推荐系统中,将歌曲分类到不同的流派。
- 客户细分:发现不同类型的客户群体。
- 癌症分型:基于基因表达数据区分不同类型的癌症。
- 蛋白质功能发现:发现具有相似功能的蛋白质。
聚类的两大目的 🎯
聚类主要服务于两个目的,它们在性质和评估方式上非常不同。
1. 探索性数据分析
许多人提到聚类时首先想到的就是这个目的。例如,研究蛋白质时,你怀疑存在某些功能群组但不完全确定。聚类算法可以告诉你哪些蛋白质看起来相似,可能具有相同功能。作为专家,你可以验证算法找出的这组蛋白质是否确实功能相似,并可能发现一个你之前未考虑过的新蛋白质(比如第11号),它可能与你已知的其他蛋白质功能相似。
这被称为探索性数据分析:你需要一个工具,能够以某种方式向人类呈现数据,使你能够开始观察数据并形成关于数据的假设。这通常与可视化相结合,通过将数据以组的形式呈现,帮助你看出哪些点属于一起,哪些点彼此不同。
2. 数据压缩

出于统计或计算原因,你可能希望压缩数据。例如:
- 分组分析:针对不同类型的癌症,你希望完全分开处理,对每种类型运行独立的分析。
- 代表性抽样:如果你有数百万客户,但只能运行一个处理1000个客户的复杂算法。你可以随机抽样,但这可能漏掉某些重要的小群体。更好的方法是先运行聚类算法找出所有子群,然后从每个客户群中选取几个代表(极端情况下每个群只选一个),再在这些代表上运行你的算法。



在数据压缩场景中,评估算法参数相对容易。例如,先选取客户代表运行分类算法,然后检查准确率,甚至可以使用交叉验证来设置聚类算法的参数。


然而,在探索性数据分析场景中,评估聚类质量通常非常困难。要进行妥善评估,可能需要让人类专家参与模拟研究,判断哪种聚类更好,或者验证哪种假设更可能成立,这非常复杂。这也是聚类领域有些难以捉摸的原因之一——虽然有大量理论分析,但并没有一个放之四海而皆准的“最佳”标准。

聚类算法实例展示 🖼️
以下是几个聚类算法的应用实例:

- 基因表达数据聚类:数据集中,行对应不同的基因,列对应基因的不同测量值。目标是根据基因在特定条件下的活跃程度对基因进行聚类。
- 蛋白质相互作用网络聚类:网络中的顶点是蛋白质,如果两个蛋白质倾向于相互作用,则它们之间存在边。目标是找到功能子群,即将图分割成不同的部分,使得不同部分之间的连接很少,而同一部分内部的连接很多。
- 公司邮件通信分析:分析公司内部人员之间的邮件流量,可以发现经常互相发送邮件的群体(如项目团队),甚至可能发现团队内部沟通不畅的问题。
- 图像分割:例如,将图像的前景与背景分离,或者找出图像中的不同物体(如苹果、馅饼、钱包、汽车)。

扁平聚类与层次聚类 🌳
之前提到的例子(如寻找两类客户或两类癌症)属于扁平聚类。在这种方法中,我们假设存在一个“正确”的聚类数量 K,然后尽可能好地将数据空间划分成这 K 个簇。
然而,还存在完全不同的聚类问题,即层次聚类。它认为数据无法仅用一个特定的聚类来描述,而是存在一个演化的层次结构。
例如,在哺乳动物遗传距离的树状图中,最精细的分辨率在右侧,显示了猫、家鼠、大鼠和负鼠等不同物种。其中一些物种属于更大的类别,例如大鼠和家鼠比较相似,它们共同构成了啮齿动物分支。此外,还有灵长类动物等分支。你可以得到一个从粗略到精细的完整层次结构。
另一个应用是文本主题分类:例如,有关于体育和政治的文本。在政治内部,可能有德国政治和外交政治;在体育内部,可能有足球、网球等。这样就形成了一个从粗粒度到细粒度的完整主题层次,这就是层次聚类。
聚类的典型方法与挑战 ⚙️

在非常高的层面上,解决聚类问题的典型方法如下:
你需要定义什么是“簇”。一种常见的思路是:属于同一簇的点,其距离应该非常小;而属于不同簇的点,其距离应该很大。或者也可以用相似性来表述:同一簇中的蛋白质应该非常相似,而不同簇中的蛋白质应该彼此不相似。
许多聚类算法需要定义一个可以优化的目标函数。机器学习最终几乎总是解决一个优化问题,聚类也是如此。我们定义一个优化准则,例如:
- 我们希望簇内点的平均距离很小,因为希望同一簇内的点紧密聚集。
- 我们希望簇间点的平均距离很大,因为希望不同簇彼此远离。
然后可以构建一个目标函数,例如将簇间平均距离除以簇内平均距离,并最大化这个比值(或最小化其倒数)。
当然,这种方法存在几个大问题:
- 目标函数的选择:根据选择的目标函数不同,你会得到非常不同的聚类结果。需要记住,聚类目标函数只是你真正想做的事情的一个代理。并没有一个“最佳”的聚类目标函数,根据你的问题,可能某个目标函数比另一个稍好一些,但其中也存在很多任意性。是使用上述表达式,还是使用它的平方,或是其他度量?有无数种选择,并且通常不存在一个“最好”的选择。
- 优化难度:与这些目标函数相关的另一个问题是,它们通常是NP难的,非凸且形状任意。聚类最终试图解决的是一个离散划分问题。例如,如果你想找到两个簇并有一个目标函数,你可以尝试所有将
n个点分成两簇的不同方式,但存在2^n种可能性。对于许多算法和目标函数来说,没有有效的方法可以避免遍历这些指数级多的划分,因此运行时间是指数级的。
对于许多算法,通常有两种应对策略:
- 直接尝试最小化目标函数,最终陷入局部最优,并希望这个局部最优对于你的应用来说“足够好”。
- 寻找一个松弛形式,解决某个更容易的相关问题。
在实践中,这两种方法都有应用。
总结 📝

本节课中我们一起学习了数据聚类的基础知识。我们了解到,聚类是无监督学习中的核心领域,旨在发现无标签数据中的内在分组结构。我们探讨了聚类的两大主要目的:探索性数据分析和数据压缩,并了解了它们在评估上的差异。我们还看到了聚类在基因分析、网络研究、商业和图像处理等多个领域的应用实例。最后,我们区分了扁平聚类和层次聚类,并讨论了通过定义和优化目标函数来解决聚类问题的通用方法及其面临的挑战(如目标函数选择的任意性和优化问题的NP难性质)。在接下来的课程中,我们将深入探讨各种具体的聚类算法。
33:K-means聚类 🧮
在本节课中,我们将要学习第一个聚类算法:K-means算法。这是一个非常经典且应用广泛的算法,虽然原理简单,但常被用作性能基准。我们将从标准K-means算法开始,了解其目标、工作原理、优缺点以及一些变体。
算法目标与参数
上一节我们介绍了聚类的基本概念,本节中我们来看看K-means算法的具体目标。
我们被给定一组存在于欧几里得空间 R^d 中的 n 个数据点。我们希望将它们分成 K 个不同的簇。K 是一个需要提供给算法的参数。这个参数通常不容易设定,但有时也并非至关重要。目前我们假设我们知道要寻找多少个簇,例如10个,这个数字就是 K。
该算法的进行方式是,我们希望为每个簇构建一个代表,这个代表本质上是该簇的中心。这些中心在下文中被称为 M_1 到 M_K(M代表均值)。为了找到这些中心,我们观察一个特定的成本函数。

我们观察每个特定的簇(簇的索引在此求和中用小写 k 表示,求和从 k=1 运行到大写的 K,即簇的数量)。我们查看它的均值 M_k,然后对于所有属于该特定簇 C_k 的点 i,我们测量该点与簇均值之间的平方距离。然后我们对所有这些平方距离求和,这就是成本函数。

我们的想法是希望最小化这个成本函数,既包括簇的均值,更重要的是包括点到簇的分配。最终我们希望实现的是,将我们的空间划分为 K 个组,使得这个全局目标函数尽可能小。
算法流程与演示
上一节我们介绍了算法的目标函数,本节中我们来看看如何通过迭代来优化它。

通常用于最小化此目标函数的算法是Lloyd算法。这是一个非常古老的启发式算法,旨在尽可能优化我们刚才看到的目标准则。

它的工作原理如下。我们通常从一组初始中心开始,例如,简单地从数据集中随机选择 K 个点。然后我们重复两个步骤直到收敛:
- 给定当前的中心,为数据集中的每个点检查哪个中心是当前所有中心中最近的,并将每个点分配给最近的中心。
- 一旦我们有了分组,我们就重新分配中心,将中心移动到这些组的均值位置。
以下是算法步骤的简要说明:
- 初始化:随机选择 K 个数据点作为初始簇中心。
- 循环直到收敛:
- 分配步骤:将每个数据点分配给距离最近的簇中心。
- 更新步骤:将每个簇的中心重新计算为该簇所有点的均值。
让我们通过一个简单的演示来理解。我们首先看到一个初始数据集,它可能具有或多或少的清晰簇结构。我们有三个初始中心,用红色的菱形标记,它们是从现有数据集中随机选择的数据点。


在左侧面板中,我们总是看到算法当前或上一步的结果,在这个案例中是初始步骤。现在我们总是执行两个步骤。首先,中心是固定的,我们将每个数据点分配给其最近的中心。在中间面板中,对于每个菱形中心,我们分配点。例如,所有绿色的点是离这个中心最近的,红色的点是离那个中心最近的,黑色的点是离另一个中心最近的。这是while循环的第一步。
第二步是,我们现在可以重新分配数据的中心。例如,在黑色类中,中心从之前的位置移动了一点,新的中心就是所有黑点的均值。绿色点的新中心是所有绿点的均值,红色点的新中心是所有红点的均值。这是while循环的一次迭代,现在我们继续。
我们执行更多步骤。再次,这里你总是看到上一步的情况和下一步的情况。现在又到了更新簇分配的步骤,即点的颜色。我们检查例如,在这个图像中这个黑点,在之前的图像中它是黑色的,在这个图像中它变成了红色,因为它现在离红色簇中心比离黑色簇中心更近,所以它改变了颜色。因此,从左图到中图,我们根据谁离哪个中心最近来改变点的颜色,然后从中图到右图,我们再次稍微移动中心,使它们真正成为特定类的均值。
然后我们继续。我们可以看到,这已经非常接近收敛了。我们可以再继续几次,然后算法就收敛了。在y轴上,我有一个不同的图,这是每一步之后目标函数的值。我们可以看到,开始时并不好,它下降得很快,在这里我们已经几乎看不到图中发生任何变化,而且目标函数基本上已经收敛,在这里它最终收敛了,算法达到了一个局部最优并停止。
让我们尝试在另一个数据集上再次运行算法,也许初始化不像这里那么好。在这个模拟中,我只是随机生成数据点。这里我们有一个特定的例子。如果你看这个数据集,你可能会说有两个簇,也许上面这里有一组,然后下面这里有另一组。同样,我们在开始时选择了三个随机中心,它们现在都恰好位于图的底部区域。
现在我们运行K-means步骤。我们在这里看到的是我们的初始数据集。在中间,我们看到点对这个初始数据集的分配。这里我们只有几个红点,它们是离底部这个中心最近的,然后是一些更多的绿点,它们离这个中心更近,然后我们有黑点,它目前拥有大多数点。因此,从左到右,我们基本上只是将颜色分配给数据点,然后从中到右,我们需要移动簇的中心,现在我们看到一些事情发生,特别是在黑色簇中,中心显然不是所有黑数据点的中心,如果你计算所有黑数据点的中心,它位于这里,这就是我们现在在右侧看到的情况。类似地,在底部和绿色部分,类的中心移动了一点,但不多。

现在让我们进行算法的另一次迭代。左侧是之前我们有的分配。现在,我们重新分配颜色。我们现在看到绿色延伸到这里,红色延伸到这里,仅仅因为这些数据点,由于黑色簇的中心向上移动了很多,所以这些处于绿色和黑色边界的数据点现在倾向于被分配给绿色,因此发生了变化。然后,我们再次开始移动簇中心,从中到右,我们迭代这个步骤,我只需让它运行几次,直到算法收敛。我只需要继续按按钮让它继续。它收敛得有点慢。现在,它已经收敛了。也许我们先看看结果,这是聚类算法的最终结果。
如果你让我将这个数据集分成三个簇,我不确定这是否真的是你真正想找到的,但这就是K-means算法在这里找到的结果。也许还需要说,这个数据结构并没有清晰的簇结构,那么算法找到哪种结果通常取决于算法本身,有时有用,有时不那么有用。这就是聚类的难点。但无论如何,这是我们得到的结果。至少,分离这个密集的黑色组是有意义的,这也是我一开始猜到的,然后剩下的组被分成两部分,事情就是这样发生的。
如果你再看目标函数的值,我们现在看到它用了更多步骤,将近20步才收敛,但它确实收敛了。通常情况总是这样,开始时聚类质量有相当陡峭的提高,目标函数变得越来越小,然后在最后逐渐趋于平缓,可能总有一两个点被移动,中心只移动一点点,需要一点时间才能收敛,但它总是收敛。
我们再做一个K-means的演示。我尝试找一个我认为在某些方面有用的例子。这个不是有用的。这个可能至少是一个有趣的例子,可以看到发生了什么。在左侧,我们再次看到原始数据集,用三个中心初始化,因为我们告诉算法要找三个中心。我们看到第一次分配,一半的数据分配给红色中心,然后一些点给黑色,一些给绿色。在下一步,簇中心被移动,也许我们现在简单地快速浏览一下,看看它最终是如何收敛的。
那么它找到的最终结果,至少从我的角度来看是有意义的,如果你让我找三个类,它找到了这个红色组、绿色组和剩下的黑色组。所以这似乎有道理。再看目标函数,它是单调递减的,用了七步。这就是K-means算法的本质。
算法形式化描述与性质
上一节我们通过演示直观了解了算法流程,本节中我们来看看其形式化描述和理论性质。
这是形式化的K-means算法,如果你用伪代码写出来。我们数据的输入由欧几里得空间 R^d 中的 n 个点和我们想要找到的簇的数量 K 组成,K 是一个输入参数。我们随机初始化第一组中心。我们稍后会讨论如何做到这一点,但简单地说,我们随机选择 K 个数据点。
然后我们有一个while循环,一直运行直到收敛。在while循环中,我们有两个步骤:将数据点分配给最近的簇中心(这总是从左图到中图,我们改变数据点的颜色),标准如果你正式写下来是这个,但我想这很清楚,对于每个数据点,你检查它是更接近簇中心 M_k 还是更接近 M_l,然后你将它分配给最近的那个。一旦分配完毕,你重新计算数据,通过在每个簇中简单地计算该簇中数据的均值来得到新的簇中心,然后迭代直到收敛,然后根据你的喜好输出簇本身或簇中心。
当你设计一个算法,它有一个while循环并且说“直到收敛”,你总是需要问自己,它是否总是终止,或者它可能无限运行?在这种情况下,它总是终止,证明简洁而优雅。陈述是:给定任何空间 R^d 中的有限点集 n,那么K-means算法在有限次迭代后终止。
证明概要如下:在while循环的每次迭代中,目标函数严格减小,所以它变得越来越小,它不能增加。如果你记得在演示中,我们也总是看到它是单调递减的。这里的陈述是,这总是发生。这不仅仅是巧合,我们碰巧有这些好例子,而是总是发生。并且它是严格减小的,所以不能说保持不变,它总是需要减小。然后我们只有有限多个可以检查的划分。我们有 n 个数据点,如果我们有 K 个类,原则上可能有 K^n 个划分。最迟在我们看过所有这些不同的划分之后,算法就不可能再继续了。因为当然,要增加,它需要在while循环的每次迭代中选择一个不同的划分,关键是现在我们不可能说,我们现在有某个特定的划分,我们迭代几步,然后又回到这个完全相同的划分,这不可能发生。因为在每一步,目标函数都必须严格减小,因为它不能保持不变,也不能再次增加,所以它不可能从这里开始减小,然后突然回到之前一个更大的值。所以每个划分最多被访问一次。我们只有有限多个划分,所以算法必须终止。
这当然只是一个证明概要,如果你想,你可以尝试正式地完善它,这并不难,但你需要做一些工作,特别是第一步,证明目标函数确实减小,但这并不困难。
现在,第一个问题是,如果你有一个算法,它是否终止?我们已经看到答案:是的。第二个问题是,当它终止时,解有多好?我一开始就暗示过,许多聚类问题是NP难的,我们稍后会看到K-means也是其中之一。所以原则上,我们可能会陷入困境。我的意思是,我们收敛到一个局部最优。但这个局部最优可能非常非常糟糕。对于这个局部最优离全局最优有多远,没有任何保证,我们无法给出任何保证。我有一个非常简单的例子来说明这一点。


这是一个玩具例子,但它说明了一个观点。我们只有四个点位于实线上,所以我们的数据是一个一维数据集,包含点 x1, x2, x3, x4。这些点之间的距离,如图中所示,简单地命名为 A, B, C。现在,根据我如何初始化数据点,可能会发生不同的事情。假设我想找到三个簇。假设我通过随机选择数据点来初始化,我碰巧选择了这三个蓝色的数据点。这就是我所说的初始化1。现在会发生的是,算法在一步内收敛到一个解,其中点 x1 和 x2 各自保持自己的簇,然后 x3 和 x4 被分配到一个联合簇中。现在,这个特定聚类的目标函数是:这里 x1 和 x2,它们不会产生任何误差,因为点与簇均值之间的距离是0。这里,点产生一个小误差,正好是 (C/2)^2 乘以2,因为我们有两个点,每个点距离簇中心 C/2,然后我们平方距离,但我们有两个点,所以目标函数的值是这个。
现在,假设我们采用不同的初始化,这个初始化2,我们有初始簇中心 x1, x3, x4。然后我们收敛到一个不同的解,现在点 x1 和 x2 被分配到同一个簇,目标函数的值现在是 A^2/2。当然,如果你想构造一个任意糟糕的例子,你可以通过选择大的 A 和小的 C 来玩弄 C 和 A,这个因子可以如你所愿地糟糕。
所以,你可以看到,K-means算法根据初始化的不同,会陷入不同的局部最优。它们可能离全局最优任意远。所以没有任何保证。
初始化策略与改进
上一节我们看到初始化对结果影响巨大,本节中我们来看看一些常见的初始化策略和改进方法。
就像许多局部搜索算法一样,它本质上是一种启发式方法。也许不是真正的局部搜索启发式,但你可以这么说。也许有些人会这样称呼它,也许有些人不会。无论如何,它是一种试图找到良好最优解的启发式方法。许多这样的启发式方法总是依赖于初始化有多好。
在这种特定情况下,有两种非常常见的方法来初始化你的数据(你的簇中心):要么你随机选择数据点作为簇中心,这是大多数工具箱也做的标准做法;然后有一种好得多的方法,称为“最远优先”启发式方法。
它的工作原理如下。你先随机选择一个数据点。现在你查看所有其他数据点,并计算所有其他数据点到你已经拥有的那个点的距离。然后你根据距离成比例地选择下一个簇中心。因为你想实现的目标,也许我在这里画个图,这样更容易理解。
假设我们有一些数据点。现在假设我们想要聚类我们的数据点,我们选择第一个初始中心,比如我们选择这个红色的点。现在我们想要实现的是,在初始化中,空间被合理地覆盖得比较好,我们不希望所有中心都位于同一个角落。所以我们现在想做的是,红点位于左上角,那么也许我们应该选择下一个点,它应该位于数据集的右下角。我们做的是,计算所有其他数据点到红点的距离。然后根据你的实现,你要么选择距离你已经拥有的点最远的数据点,也许是这个点。或者有时你也随机选择,然后你随机选择另一个数据点作为新的簇中心,但你增加这些点距离越远的概率。这些选项都是可能的。
一旦你找到了两个簇中心,也许我试着擦掉这些红线。现在我们有这两个簇中心。现在再次,要选择第三个簇中心,你现在计算所有点到你已经拥有的这两个点的距离。所以你要计算。比如说,如果你想知道这个点是否是一个好的新簇中心,你计算这个点到你已经有的簇中心的距离,然后取这两个距离中的最小值,并使其尽可能大。

这就是我们在这张幻灯片上看到的,如果你现在看幻灯片。所以,S 将是我们想要拥有的初始中心集合,我们用一个特定的数据点初始化它,只要我们还 没有K 个中心,我们就按如下方式进行:对于每个还不是中心的数据点 x,我们计算 x 到集合 S 的距离,这基本上是最小值。对于所有像你计算 x 到所有其他 s 的距离,你取最小值,这就是 x 到集合 S 的距离。现在你以与这个距离成比例的概率选择下一个中心。
如果你想使用一个好的初始化,这通常是你应该使用的。事实上,如果你采用这种启发式方法,得到的算法通常被称为 K-means++ 算法,并且它具有相当强的近似保证。事实上,这在大约10年前被证明,参考文献稍后会在幻灯片中给出。
还有更多选择中心的方法,你也可以说通过使用不同的聚类算法来初始化,或者也许你有一些背景知识,已经告诉你数据中已经有10个类,你还想再找5个,那么当然你要做的是,对于你已经有的前10个簇,你会选择它们的中心作为你的初始中心,然后选择5个更多,并让算法运行。所以如果你有先验知识,你当然可以通过初始化你的数据(你的簇)来利用它。

由于它是一种局部搜索启发式方法,并且如此强烈地依赖于初始化,你通常要做的是将算法重新启动几次,比如10次、20次,使用不同的初始中心,然后在得到的所有结果中,选择成本函数最小的那个。这是标准程序。当你使用工具箱时,你还需要检查这是否隐式发生,或者你是否需要显式地做,如果工具箱没有隐式地做,你应该总是这样做,至少重复10次,我的意思是你不需要重复一千次,但说10次,这通常更好。
算法细节与变体
上一节我们讨论了初始化和重启,本节中我们来看看算法的一些细节和重要变体。
有一些细节现在不那么重要,但我仍然想提一下。在算法过程中,可能会发生一个中心失去其所有数据点的情况。例如,在重新分配数据点的步骤中,可能有一个中心,该中心不是一个数据点,因为记住,一步之后,中心实际上是数据的均值,所以它并不像一个实际的数据点,它只是空间中的一个点,可能发生所有曾经属于这个特定中心的点在下一步被分配给其他人,那么这个簇就是空的。现在,你要么可以接受你拥有的簇比你希望的少一些的事实,要么可以尝试,我的意思是,通过随机选择一个新的数据点并说这是一个新的中心点来创建一个新簇,然后你继续运行算法,你可以重新启动你的算法。我的意思是,有数百万种启发式方法可以使用,事实上并不那么重要,我认为最常见的是简单地将一个新的数据点重新分配为簇中心,然后再继续。
与所有搜索启发式方法一样,你当然可以尝试进行一些后处理以进一步改进结果。正如我所说,你可以非常频繁地重新启动,一旦你有了最终结果,你也可以开始查看相邻的簇并交换单个点,看看是否能改善你的结果。你也可以完全移除一个簇,引入一个新的数据点作为簇中心,并让算法继续运行,希望能找到更好的结果,你可以合并簇并引入一个全新的簇中心,所以有数百万种事情可以做,你可以将一个簇分成几部分。所有这些启发式方法,我认为对于K-means来说并不特别常见,通常你只是重新启动几次,然后对你得到的结果感到满意。
我有一张幻灯片,也给你一个关于K-means算法的略微不同的视角。我介绍它的方式是,我说我们有这个迭代过程,通过它我们尝试重新分配簇中心,然后我们想要解决的全局目标函数是这个最小化到簇中心距离的成本函数。就是底部这个。
也存在一个不同的表述,更符合我在聚类介绍中所说的,我常说通常你做的是查看点与簇之间的簇内距离和簇间距离,你说簇内距离应该小,簇间距离应该大。现在你可以看到,在K-means的特殊情况下,问题可以用簇内距离来表述。也就是说,你可以说:考虑找到数据的一个划分的问题,使得簇内距离最小化。簇内距离本质上是同一簇内所有点之间的平方距离。
命题说:优化这个第一个目标函数的问题(你说你想找到一个划分,最小化这个平方欧几里得范数下的簇内距离)等价于我们开始时的问题,即找到这些簇中心并最小化到簇中心的距离。证明,我没有在幻灯片上。它真的很基础,只是对不同表达式进行变换。我想每个人都应该能做到,但有点冗长,需要一两页才能从第一个表述到第二个。我想强调的是,在这一点上,这并不完全明显,因为在第一个表述中,我们与簇中心无关。至少乍一看,通过找到这些类中心,这确实是这里发生的事情,这似乎是合理的,但并不完全明显。
特别是,也许转到下一张幻灯片,从这个关于簇均值的表述中,我们可以看到K-means算法产生的是一个Voronoi划分。Voronoi划分就像你在这张图片上看到的,黄点是簇中心。然后簇边界是分段线性的。因为在这个簇均值表述中,对于每个点,你检查这个点是离这个中心更近还是离另一个中心更近?因此,两个簇之间的分隔线在这里是一条线,或者在更高维空间中是一个超平面,它是一个线性分离面。像这样的东西被称为Voronoi图。从簇均值的表述来看,这很明显会发生。但从这个表述来看并不明显,因为原则上,你也可以想出其他几何对象,这些对象可能甚至能找到比簇均值更好的划分。
但正如命题所说,情况并非如此。现在,看这张图,这也告诉你一些关于算法局限性的信息,所以你需要,我的意思是,优点和缺点。我认为我甚至在下一张幻灯片上有它。
这样做的一个优点是所有簇边界都是线性的,你已经在脑海中开始思考为什么这可能是一个优点,我稍后会揭示一点。但我想你可能已经能猜到了。另一件事是,你对K-means算法构建的簇的形状有了一些直觉。也就是说,它们是这种凸对象。我回到图上。它们总是凸的,因为Voronoi划分总是有像这个划分中的所有单元都是凸的。这也告诉你,也许你能解决哪种聚类问题,以及哪种问题你可能无法解决。
这里我有几个例子。例如,如果我们有三个,比如说,很好地分开。我们用三个中心初始化K-means,那么K-means有相当高的可能性会找到正确的簇。如果我们有一个像这里这样的数据集,我们用两个中心初始化,K-means永远不会成功,因为你可能,我的意思是,在这个图中,它应该是两个新月形数据集,但你可能希望这个新月是一个簇,那个新月是另一个簇,这不会发生。因为这些形状不是凸形状。类似地,在这里,在左下图中,如果你想在这个数据集中找到两个簇,它通常会分割这些非常长的细长簇,并试图使其更紧凑。像这里的这些环,它会再次以完全任意的方式分割,你可能不会得到结果,至少也许这是你想找到的,你现在可以辩论这个数据集的好聚类是什么,以及是否存在一个好的聚类。但简单来说,这就是K-means在这个数据集中可能会找到的。这种几何直觉有助于解释你的结果是否真的是你想找到的,或者是否可能完全不是你想要的。
我已经说过,从计算复杂度的角度来看,优化K-means启发式方法是NP难的。现在在理论计算机科学中,你可以开始辩论我真正想在这个陈述中输入的所有变量是什么,例如,你可以说也许它更容易,比如如果我有K和任意值,也许很难,但也许如果我只想找两个簇,就没那么难,这不是真的,它很难,也许如果我在二维空间中更容易,例如,由于某些几何原因,事情发生得更好,情况也并非如此。所以无论你看到问题的哪种变体,它都将是NP难的。
有一件事让我困惑了很长时间,直到我理解它。这有点奇怪,因为有几何结果表明,只有多项式数量的不同Voronoi划分,比如如果我给你d维空间中的n个点,原则上可以从n个点构造出的Voronoi划分只有多项式数量,并且是点数的多项式。所以你可能会想,为什么算法可能是指数级的,如果只有多项式多种可能性需要我查看。是的,原则上,如果你能以某种有效的方式枚举所有这些多项式数量的Voronoi划分,那么查看所有这些多项式数量的Voronoi划分并简单地计算它们的成本并找到最小的那个的算法当然是简单的多项式。这里的诀窍是,不存在任何有效的算法可以让你枚举所有这些多项式数量的Voronoi划分。这是我花了一段时间才真正理解它意味着什么的事情,所以你可能也想考虑一下,想想这到底意味着什么,为什么一个问题即使只有多项式多种可能的解决方案,也可能是NP难的。
所以如果你想看这里,我的意思是,有数百万篇参考文献,这里有一篇,例如,即使你有,嗯,这是平面K-means问题,我认为他们指的是二维K-means问题,那仍然是NP难的,这篇论文中也有很多参考文献。
还有另一个复杂性概念,我只想在这里提一下,但我也觉得很有趣。那就是平滑复杂性。现在如果你考虑计算复杂性,我希望你们都知道有一个NP难问题的定义,对吧?你查看最坏情况的实例,并想说在最坏情况下,不存在多项式时间算法。现在,如果你做这些证明,并且如果你对理论计算机科学有点了解,经常发现一个问题具有非多项式的最坏情况复杂性,你经常做的是构造一个问题的实例。这个实例非常难解决,并且你可以证明原则上,你不能用有效的算法解决它。通常这些手工构造的实例是非常对称的东西。例如,对于K-means,你可以说我取一个等距的圆上的点,然后我试图找到最好的聚类,但不知何故它不存在,或者不,对于K-means来说这是一个不好的例子,但无论如何,我的意思是,通常你有这些非常手工设计的问题,这些问题通常非常对称,以使问题极其困难。
现在在理论计算机科学中,人们长期以来一直在思考是否有其他更适应现实情况的计算复杂性概念,因为外面有很多问题,最著名的是解决,嗯,所以这是第一个。Cook定理证明的NP难问题,大约在1970年被证明,这是第一个被证明是NP难的问题,但在实践中,人们可以在非常非常多的点上解决实例,所以不知何故,这种最坏情况的复杂性并不能反映在实践中,通常在典型例子中它相当快。现在有很多方法可以让你摆脱这个陷阱,你可以说我只考虑平均情况复杂性,这在某些情况下很好。例如,在快速排序中,你有一个算法,其平均情况复杂性非常好,还有其他算法。所以,平均复杂性试图或向你展示,至少在最坏情况和平均情况之间存在一些差异。
但也有一个不同的概念,这是我很喜欢的一个,那就是平滑复杂性。平滑复杂性本质上直观地说如下。假设你在外面有一些数据点。你可以构造一个应该很难的例子。但现在我们只看这个例子的复杂性,如果我被允许用某个epsilon值摆动所有参数。例如,如果你想找一个聚类问题。有人给你一组点,但现在你被允许用某个epsilon摆动它们,然后应用算法。然后你检查,比如,在我应用了这个epsilon摆动之后,这个算法的复杂性是什么?现在的诀窍是,这种epsilon摆动通常会打破对称性,突然使之前困难的问题变得容易。我们认为这是看待复杂性的好主意的原因是,我们说,嗯,在实践中,如果我给某人一个数据集,当然,没有手工构造的对称性,总是有测量误差等等。所以想法是,如果我查看来自某个实际应用的数据,这种摆动,嗯,无论如何已经在后台发生了。如果现在复杂性非常好,那么我可以非常确定,我在外面看到的所有问题的复杂性都很好。
这个概念被称为平滑复杂性,因为我们有这个epsilon平滑。它首先被应用于线性规划,我认为,人们证明线性规划原则上是NP难的,但平滑复杂性是多项式的,这是第一个可以展示为什么线性规划(应该是NP难的)但到处都在使用,我们也已经在使用它,以及为什么这实际上在实践中有效的证明之一。
好的,这是对幻灯片上一行内容的长篇介绍。现在你可以证明的是,K-means算法确实具有多项式平滑复杂性。这在2009年被证明,大约10年前,在FOCS(计算机科学基础会议)上,这是理论计算机科学两个非常好的会议之一,FOCS和STOC。
另一个从理论计算机科学角度来看有趣的结果几乎同时出现,2007年出现在SODA(离散算法研讨会)上,这是算法方面最好的会议之一。这个结果是存在一个常数因子近似。所以如果我们在理论计算机科学和计算复杂性中,我的意思是,我们可以查看最坏情况的复杂性,并问它是否是NP难的。然后如果它是难的,我们也可以问,嗯,也许找到最好的全局最优解很困难,但也许找到一个近似解并不那么困难。给出对这个最优解的近似保证,然后高效地解决问题。
这可以被证明适用于K-means,得到的算法是K-means++,我已经提到过它。所以本质上,他们证明的是,你考虑用于初始化的最远优先规则。然后你可以证明,你找到的期望目标值(在这种初始化的期望上)最多比最优解差一个 log K 的因子。在许多应用中,K 通常被视为常数,所以我们可以被视为常数。因此,我们对解有一个常数因子近似,这意味着该算法以高概率或至少以期望找到其目标函数仅比最佳目标函数或你能找到的最佳解差一个常数因子的解。
算法变体与总结
上一节我们讨论了算法的理论性质,本节中我们来看看其他重要的变体并对K-means进行总结。
K-means算法还有许多其他变体,你可能想知道的最重要的一个叫做K-medoids。这是在你使用的数据不是存在于欧几里得空间,而是存在于更一般的度量空间中时使用的。也许你可能想考虑一下。如果你想在任意度量空间而不是欧几里得空间中应用K-means,有什么困难?也许甚至暂停视频一分钟,试着思考一下,如果我只有点和点之间的距离,但它们没有任何欧几里得表示,为什么应用K-means很困难?我希望你已经看到了。所以问题是,K-means有两个步骤,分配数据点很简单,但然后计算数据集的均值当然是你只能在向量空间中做的事情,你可以在度量空间中计算点的均值,这个对象可能不存在,甚至可能没有一个点在你认为这个均值应该在的位置。所以通常你做的变体叫做K-medoids。
所以你只允许中心是数据点,在开始时你像以前一样随机初始化,选择中心,然后重新分配簇点,现在在你需要移动簇均值的步骤中,你尝试将其移动到簇中最好的数据点,所以不是计算数据的均值,而是说对于簇中的所有点,如果我计算簇中所有其他点到这个点的距离,平方并求和,哪个点给出最好的值,然后这就是你计算的下一个簇中心。
其他变体包括加权K-means,你为单个数据点设置权重,例如,因为你认为某些数据点比其他数据点更重要。它们存在一个K-means的常见版本,我们不会在讲座中讨论它,也许我们会在作业中讨论。我的意思是,如果你愿意,你也可以阅读这篇论文,这是在2004年发表的,当时所有这些算法都很流行。今天仍然在使用,也是一个相当流行的算法。
然后是所谓的软K-means,如果你不想要一个为每个点确定性地说明,嗯,你在这个簇,你在另一个簇的分配。你也可以尝试生成一个软输出,它说,嗯,以某种可能性,比如0.8,我认为这个点在这个簇中,但有一个小的可能性0.2,这个点在另一个簇中,这被称为软聚类。你也可以用K-means做到这一点。
最后,还有。所谓的EM算法,期望最大化算法。这是K-means的广义版本。或者也许应该说,K-means是EM算法的简化版本,它使高斯混合模型拟合数据,也有这种迭代,你有期望和最大化,在一步中你尝试最大化数据的似然,在期望步骤中你做这种取期望,然后你像在K-means中一样再次迭代。这也是一个你可能想看的算法,或者也许你已经在其他讲座中见过它了。

那么关于K-means算法的总结是什么?你将簇表示为数据中心。你写下目标函数,它本质上编码了每个人离簇中心有多远。这导致了一个非凸的、难以处理的优化问题,通常是NP难解决的。存在一个简单的启发式方法来解决它,称为Lloyd算法。有许多许多变体,但原始版本通常效果相当好。这个算法真的非常容易实现,并且使用非常广泛。也许是我的个人观点,所以K-means作为基线可能很好。总的来说,并且,如果你处于这种想要找到许多簇的环境中,例如,找到你的数据的代表,那么它效果很好。例如,你有一百万客户,你想找到1000个代表性客户。那么K=1000。在这样设置中,簇边界到底在哪里,哪个客户离哪个更近,可能不那么重要,你只是想以某种均匀间隔的距离找到某种空间覆盖,K-means将实现这一点。通常,如果你为少量簇做某事,特别是如果簇的数量可能不是凸的,就像我们在前几张幻灯片上看到的那些图像,那里有这种新月形物体,对于这类应用,我认为K-means通常过于简单,你当然可以将其作为基线运行,但然后你应该转向更可靠的方法,这些方法更专门用于任意形状的小簇,例如我们稍后将在本讲座中看到的谱聚类。
34:层次聚类的连接算法 🌳
概述
在本节课中,我们将要学习层次聚类算法,特别是连接算法家族。我们将了解它们如何构建一个嵌套的聚类层次结构,而不是像K均值那样产生一个固定数量的“扁平”聚类。
上一节我们介绍了K均值算法,它是一种产生扁平聚类的简单算法。本节中我们来看看另一类算法,它们旨在解决层次聚类的问题。

层次聚类的目标 🎯
层次聚类的目标是生成一个类似树状图的层次结构。树状图通常从上到下阅读,它由一系列嵌套的聚类组成。较小的聚类可以合并形成较大的聚类。
例如,在一个动物数据集中,最细的粒度可能是每个物种(如大鼠、家鼠)作为自己的聚类。然后可以将它们合并,形成更大的聚类,如啮齿动物。树状图中连接线的长度试图指示不同物种从总聚类中分离出来的时间点。
连接算法简介 🔗
解决层次聚类问题的标准策略是连接算法家族。它们遵循一个非常简单、自底向上的聚合策略。
算法从一个状态开始,其中每个数据点都是自己的聚类。然后,算法持续合并最接近的聚类,直到所有点最终合并成一个大的聚类。
为了说明这个过程,假设我们有一个包含八个点的简单数据集。最简单的算法是单连接算法。在初始状态,每个点是一个聚类。单连接算法会找到距离最近的两个点(或聚类)并将它们合并。在下一次迭代中,它再次检查当前所有聚类,并合并距离最近的两个。这个过程持续进行,直到所有点合并为一个聚类。
定义聚类间的距离 📏
要形式化地描述算法,需要定义一个关键概念:两个不同聚类之间的距离。有三种流行的定义方式。
以下是三种主要的距离定义方式:
- 单连接距离:计算两个聚类中所有点对之间的距离,并取最小值。
- 公式:
d_single(C1, C2) = min_{x in C1, y in C2} d(x, y)
- 公式:
- 完全连接距离:计算两个聚类中所有点对之间的距离,并取最大值。
- 公式:
d_complete(C1, C2) = max_{x in C1, y in C2} d(x, y)
- 公式:
- 平均连接距离:计算两个聚类中所有点对之间的距离,并取平均值。
- 公式:
d_average(C1, C2) = mean_{x in C1, y in C2} d(x, y)
- 公式:

连接算法流程 📝
连接算法的输入是一个数据点之间的距离矩阵,以及一个用于计算聚类间距离的函数(如上述三种之一)。
算法流程如下:
- 初始化:将每个数据点初始化为一个单独的聚类。
- 循环合并:当聚类数量大于1时,重复以下步骤:
a. 在所有当前聚类中,找到距离最近的两个聚类(使用定义的距离函数)。
b. 将这两个聚类合并为一个新的聚类。 - 输出:输出整个合并过程中产生的层次结构(树状图)。
算法间的直观差异 🤔
单连接和完全连接算法在行为上有直观的差异。
单连接算法倾向于产生细长的链状聚类,因为它只关心两个聚类间最近的点。即使两个聚类主体相距较远,只要存在一对非常接近的点,它们就可能被较早地合并。
完全连接算法则倾向于产生更紧凑、更球状的聚类,因为它考虑的是两个聚类间最远的点。这使得它更抗拒将离群点或松散连接的子聚类过早地合并进来。

平均连接算法的行为介于两者之间。

实践观察与局限性 ⚠️
从实践和演示中我们可以观察到连接算法的一些特点和局限性。
连接算法,尤其是单连接算法,对离群点非常敏感。此外,这些算法是启发式的,且合并操作不可撤销。一旦两个聚类被合并,即使后续发现这不是最优选择,也无法撤销。

从理论角度看,连接算法试图估计所谓的“密度树”。密度树是连接概率密度函数众数的一种树结构。然而,在实践中,估计密度本身就很困难,尤其是在高维空间中,这导致单连接算法在高维数据中表现不佳,容易受到各种效应的影响。
历史背景与总结 📚
单连接及其相关算法历史悠久。有趣的是,它们与最小生成树算法密切相关,单连接算法实际上会生成一个最小生成树。

总结一下,本节课我们一起学习了层次聚类中的连接算法。我们了解了其自底向上的聚合流程,定义了三种计算聚类间距离的方法(单连接、完全连接、平均连接),并通过直观比较和演示观察了它们的行为差异。最后,我们讨论了这些算法在实践中的局限性,如其对离群点的敏感性和在高维数据中的挑战。尽管这些算法简单且常用,但了解其优缺点对于在实际应用中选择合适的聚类方法至关重要。
35:谱图理论
在本节课中,我们将要学习谱图理论的基础知识。谱图理论是理解现代聚类算法(如谱聚类)的关键数学工具。我们将从图拉普拉斯矩阵的定义和性质开始,逐步探索其谱(特征值和特征向量)如何揭示图的结构特性,特别是连通分量和聚类结构。

图拉普拉斯矩阵的定义

上一节我们介绍了谱图理论的目标,本节中我们来看看其核心工具——图拉普拉斯矩阵。首先,我们考虑一个无向图,其边权重非负。以下是定义该矩阵所需的几个基本矩阵。
- 权重矩阵 W:也称为邻接矩阵,其元素
W_ij表示顶点i和j之间的边权重。若无边,则W_ij = 0。通常假设没有自环,即对角线元素为0。 - 度矩阵 D:这是一个对角矩阵。对于顶点
i,其度d_i定义为与其相连的所有边的权重之和,即d_i = Σ_j W_ij。度矩阵D的对角线元素即为各顶点的度,非对角线元素为0。
基于以上两个矩阵,我们定义非归一化图拉普拉斯矩阵 L:
L = D - W
这个矩阵是对称的,并且其对角线元素是顶点的度,非对角线元素 (i, j) 是 -W_ij。
图拉普拉斯的关键性质
定义了图拉普拉斯矩阵后,我们来看看它的一个核心代数性质,这个性质是后续所有分析的基础。
对于任意向量 f ∈ R^n(其中 n 是图的顶点数),图拉普拉斯矩阵的二次型可以表示为:
f^T L f = (1/2) * Σ_{i,j=1}^n W_ij (f_i - f_j)^2
证明概要:
- 根据定义
L = D - W,代入二次型:f^T L f = f^T D f - f^T W f。 - 展开第一项:
f^T D f = Σ_i d_i f_i^2。 - 展开第二项:
f^T W f = Σ_{i,j} W_ij f_i f_j。 - 利用度
d_i = Σ_j W_ij,将第一项重写为(1/2) Σ_i d_i f_i^2 + (1/2) Σ_j d_j f_j^2。 - 合并所有项,得到
(1/2) Σ_{i,j} W_ij (f_i^2 - 2f_i f_j + f_j^2)。 - 化简即得
(1/2) Σ_{i,j} W_ij (f_i - f_j)^2。
这个性质非常重要,因为它将矩阵的代数运算与图上函数的几何变化联系了起来。我们可以将向量 f 视为定义在图顶点上的一个函数(f_i 是顶点 i 的函数值)。那么,f^T L f 的值就度量了函数 f 在图上沿着边变化的“平滑度”。当相连顶点间的函数值差异很大时,该项值就大;当函数在紧密连接的顶点集上取值相近时,该项值就小。这也解释了为何称 L 为“拉普拉斯”矩阵,因为它在离散图上起到了连续空间中拉普拉斯算子(度量函数变化率)的作用。
图拉普拉斯的谱性质
理解了关键性质后,我们进一步探索图拉普拉斯矩阵的特征值和特征向量(即其“谱”)所具有的性质。
对于一个无向、边权非负的图,其非归一化图拉普拉斯矩阵 L 具有以下性质:
L是对称半正定矩阵。L的最小特征值是 0,对应的特征向量是常数向量1(所有元素为1)。- 所有特征值都是非负实数,可以按递增顺序排列:
0 = λ_1 ≤ λ_2 ≤ ... ≤ λ_n。
简要说明:
- 对称性源于图是无向的。
- 半正定性由关键性质直接得出,因为
(1/2) Σ W_ij (f_i - f_j)^2 ≥ 0。 - 将常数向量
1代入L * 1,利用D*1得到度向量,W*1也得到度向量,相减即为0,故1是特征值0对应的特征向量。 - 由于矩阵半正定,所有特征值 ≥ 0,而我们已经找到一个0特征值,所以最小特征值为0。
谱与图连通分量的关系
图拉普拉斯最引人注目的性质之一,是其谱与图的几何结构(连通分量)直接相关。
设图 G 有 k 个连通分量,则:
- 图拉普拉斯矩阵
L的特征值 0 的几何重数(即对应特征空间的维数)等于k。 - 特征值 0 的特征空间由一组基张成,这组基中的每个向量都是某个连通分量的指示向量。即,对于第
m个连通分量,其指示向量在属于该分量的顶点处取值为1,在其他顶点处取值为0。
证明思路(归纳法):
- 基础情况 (k=1):图是连通的。假设
f是特征值0的特征向量,即Lf = 0。根据关键性质,f^T L f = 0意味着对所有边(i, j),要么W_ij = 0(无边),要么f_i = f_j。由于图连通,所有顶点通过路径相连,因此所有f_i必须相等。故特征空间是一维的,由常数向量张成,这也等价于该连通分量的指示向量(归一化后)。 - 归纳步骤 (k>1):图由
k个互不连通的子图(连通分量)组成。此时,邻接矩阵W和度矩阵D(以及L)都具有分块对角形式。每个对角块对应一个连通分量的拉普拉斯矩阵L_m。根据基础情况,每个L_m有一个特征值0,对应特征向量是该分量的常数向量。在整个矩阵L中,这些特征向量“拼接”起来(在其他块位置补0),就形成了k个线性无关的、特征值为0的特征向量,它们正是各连通分量的指示向量。
重要启示:理论上,通过计算图拉普拉斯矩阵的特征值和特征向量,我们可以:
- 通过特征值0的重数知道图中有多少个连通分量。
- 通过特征值0对应的特征向量(的某种基)直接读出哪些顶点属于同一个连通分量。
这为基于谱方法的聚类(谱聚类)提供了核心思想:即使图不是完全断开,而是存在“近似连通分量”(即簇),其特征向量也能近似地揭示这种结构。
归一化图拉普拉斯
在实际应用中,特别是谱聚类中,经常使用归一化版本的图拉普拉斯矩阵,以消除顶点度分布不均的影响。主要有两种形式:
-
对称归一化图拉普拉斯:
L_sym = D^{-1/2} L D^{-1/2} = I - D^{-1/2} W D^{-1/2}
其中D^{-1/2}是对角矩阵,其第i个对角元素为1/√(d_i)。 -
随机游走归一化图拉普拉斯:
L_rw = D^{-1} L = I - D^{-1} W
矩阵D^{-1} W可以解释为图上随机游走的转移概率矩阵。
这两种归一化拉普拉斯具有与非归一化版本类似的性质:
- 它们共享相同的非零特征值。若
λ是L_rw的特征值,对应特征向量为u,则λ也是L_sym的特征值,对应特征向量为D^{1/2} u。 - 对于连通图,
L_rw的最小特征值是0,对应特征向量是常数向量1。L_sym的最小特征值也是0,对应特征向量是D^{1/2} * 1。 - 特征值0的重数同样等于图的连通分量数,其特征空间也由各连通分量的指示向量(对于
L_rw)或其变换(对于L_sym)张成。
Cheeger 常数与谱的联系
为了更深入地理解谱如何反映聚类结构,我们引入一个纯几何的量——Cheeger常数(或等周常数),它衡量了将一个图“切开”成两部分的最佳代价。

对于图的一个顶点子集 S,定义:
- 体积 vol(S):
S中所有顶点的度之和,vol(S) = Σ_{i∈S} d_i。它衡量了集合S的“大小”。 - 割 cut(S):连接
S与其补集S^c的所有边的权重之和,cut(S) = Σ_{i∈S, j∈S^c} W_ij。它衡量了将S从图中分离出去的“代价”。
集合 S 的 Cheeger 常数 定义为:
h(S) = cut(S) / min(vol(S), vol(S^c))
图的 Cheeger 常数 h_G 是所有可能子集 S 中 h(S) 的最小值:
h_G = min_{S ⊂ V} h(S)
直观理解:h_G 小的图,意味着存在一种划分,使得分割开的两个部分内部连接紧密(体积大),但彼此之间连接稀疏(割小)。这正是“聚类结构好”的体现。
Cheeger 常数与图拉普拉斯的第二小特征值 λ_2(对于连通图,λ_1=0,λ_2 > 0)有深刻联系,这由 Cheeger 不等式 描述:
对于连通的无向图,有:
λ_2 / 2 ≤ h_G ≤ √(2 * λ_2)
意义:
- 这个不等式在
λ_2和h_G之间建立了双向约束。 - 它表明,一个图的
λ_2小,当且仅当其 Cheeger 常数h_G小。 - 因此,第二小特征值
λ_2的大小可以作为图是否存在明显聚类结构的一个谱标志:λ_2很小,意味着图容易地被分成两个内部连接良好、彼此连接较少的子图(即有一个“好”的割)。这为谱聚类算法(下节课内容)提供了理论依据:寻找拉普拉斯矩阵的前几个特征向量,就近似于在寻找使 Cheeger 割最优的指示向量。
证明思路(上界部分):
利用瑞利商原理,λ_2 可以表示为一个优化问题的最小值。通过巧妙地构造一个与最优 Cheeger 割 S* 相关的测试向量(类似于 S* 的指示向量),并将其代入瑞利商,可以证明得到的值不大于 2h_G,从而得出 λ_2 ≤ 2h_G。下界的证明更为复杂,但思想类似。
总结

本节课中我们一起学习了谱图理论的基础知识。我们从定义非归一化和归一化的图拉普拉斯矩阵开始,揭示了其关键二次型性质,该性质将代数运算与图上函数变化的平滑度联系起来。我们深入探讨了图拉普拉斯谱的基本性质,并发现了其最核心的结论:特征值0的重数等于图的连通分量数,且对应的特征空间能直接给出各分量的指示信息。最后,我们通过引入 Cheeger 常数及其与第二小特征值 λ_2 的不等式关系,建立了图的几何聚类结构与谱特性之间的深刻联系,这为理解谱聚类算法的工作原理奠定了坚实的理论基础。
36:谱聚类(非归一化情况)🔍
在本节课中,我们将要学习一种现代聚类算法——谱聚类。谱聚类可用于对图进行聚类,以发现图中的强连接子集或社区。我们将从直观理解开始,逐步推导其数学原理和算法步骤,并最终理解其为何在实践中表现良好。
概述 🌐
谱聚类是一种基于图论的聚类方法。其核心思想是:如果数据点自然地形成一个图(例如社交网络),或者我们可以通过相似度函数构建一个图(例如K近邻图),那么一个好的聚类应该对应于图中的一个“切割”,这个切割满足两个条件:1)被切割的边(即连接不同簇的边)尽可能少;2)切割后形成的两个子图(簇)大小相对平衡。本节课我们将重点介绍谱聚类的基础版本——非归一化谱聚类。

从最小割到平衡割 ✂️
上一节我们介绍了谱聚类的目标。本节中我们来看看实现这一目标的最初思路及其局限性。
计算机科学家首先想到的可能是最小割问题:在图论中,找到一个切割,使得被切断的边数(或边权重之和)最小。最小割问题有高效的(多项式时间)算法。
然而,最小割存在一个严重问题:它倾向于将图中一个孤立的点或一个非常小的子图与其余部分分开,而不是找到我们期望的、规模合理的簇。如下图所示,最小割(绿色虚线)会切掉一个单独的点,而不是我们期望的将图分成两个较大子图的红色切割。
因此,我们需要寻找一个能同时考虑切割大小和簇的平衡性的准则。
定义目标:比率割 📏

为了克服最小割的缺陷,我们引入一个平衡项。假设我们将图的顶点集 ( V ) 划分为两个不相交的子集 ( A ) 和 ( B )(即 ( A \cup B = V, A \cap B = \emptyset ))。
- 切割准则:衡量被切断的边的数量或权重之和。
[
\text{Cut}(A, B) = \sum_{i \in A, j \in B} w_{ij}
]
其中 ( w_{ij} ) 是顶点 ( i ) 和 ( j ) 之间的边权重(对于无权图,( w_{ij} \in {0, 1} ))。

- 平衡准则:衡量两个子集的大小是否均衡。我们使用比率割中定义的平衡项:
[
\text{Balance}(A, B) = \frac{1}{|A|} + \frac{1}{|B|}
]
其中 ( |A| ) 表示集合 ( A ) 中顶点的数量。可以证明,当 ( |A| = |B| ) 时,这个值最小;当其中一个集合非常小时,这个值会变得很大。
我们将这两个准则结合起来,定义比率割目标函数:
[
\text{RatioCut}(A, B) = \text{Cut}(A, B) \cdot \left( \frac{1}{|A|} + \frac{1}{|B|} \right)
]
我们的目标是找到划分 ( A, B ),使得 ( \text{RatioCut}(A, B) ) 最小化。这个目标同时鼓励小的切割和平衡的簇大小。
然而,最小化比率割是一个NP难问题,无法高效求解。这就需要我们寻找一种近似的、可高效计算的解决方案。
谱聚类的推导:从离散到连续 🧮
上一节我们定义了理想但难解的目标。本节中我们来看看如何通过巧妙的数学变换和松弛,得到一个可高效求解的近似算法。
首先,我们考虑一个简化情况:寻找一个完美平衡的切割(即 ( |A| = |B| ))。我们引入一个簇指示向量 ( \mathbf{f} = (f_1, ..., f_n)^T \in \mathbb{R}^n ),其定义如下:
[
f_i = \begin{cases}
+1, & \text{如果顶点 } i \in A \
-1, & \text{如果顶点 } i \in B
\end{cases}
]
一个关键的观察是,切割大小可以用图拉普拉斯矩阵来表示。回忆上一讲的内容,对于无向图,其(非归一化)图拉普拉斯矩阵定义为 ( L = D - W ),其中 ( W ) 是邻接矩阵,( D ) 是对角度矩阵(( D_{ii} = \sum_j w_{ij} ))。可以证明:
[
\text{Cut}(A, B) = \frac{1}{4} \sum_{i,j} w_{ij} (f_i - f_j)^2 = \frac{1}{2} \mathbf{f}^T L \mathbf{f}
]
此外,完美平衡的条件(( |A| = |B| ))等价于指示向量各元素之和为零:( \sum_i f_i = 0 )。
因此,最小化完美平衡割的问题可以重写为:
[
\min_{\mathbf{f}} \mathbf{f}^T L \mathbf{f} \quad \text{满足} \quad f_i \in {+1, -1}, \quad \sum_i f_i = 0
]
这仍然是一个NP难问题,因为约束 ( f_i \in {+1, -1} ) 是离散的。
现在,我们进行关键的松弛步骤:我们放宽这个离散约束,允许 ( f_i ) 取任意实数值。为了避免平凡解(例如 ( \mathbf{f} = \mathbf{0} )),我们同时要求向量具有单位范数(( |\mathbf{f}| = 1 ))。松弛后的问题变为:
[
\min_{\mathbf{f}} \mathbf{f}^T L \mathbf{f} \quad \text{满足} \quad \sum_i f_i = 0, \quad |\mathbf{f}| = 1
]
条件 ( \sum_i f_i = 0 ) 等价于要求 ( \mathbf{f} ) 与全1向量 ( \mathbf{1} ) 正交(即 ( \mathbf{f}^T \mathbf{1} = 0 ))。
根据瑞利商原理,在约束 ( |\mathbf{f}|=1 ) 且 ( \mathbf{f} \perp \mathbf{1} ) 下,最小化 ( \mathbf{f}^T L \mathbf{f} ) 的解 ( \mathbf{f}^* ) 正是图拉普拉斯矩阵 ( L ) 的第二小特征值对应的特征向量(因为最小的特征值总是0,对应的特征向量是 ( \mathbf{1} ))。

最后,为了从连续解回到离散的簇分配,我们简单地检查松弛解 ( \mathbf{f}^* ) 各个分量的符号:
[
\text{簇分配: } \begin{cases}
\text{若 } f_i^* > 0, & \text{则顶点 } i \in A \
\text{若 } f_i^* < 0, & \text{则顶点 } i \in B
\end{cases}
]
重要说明:上述推导始于完美平衡割,但可以证明,完全相同的算法(取 ( L ) 的第二小特征向量并按符号划分)也是原始比率割目标的一个松弛解。因此,这个算法被称为非归一化谱聚类。
算法步骤与示例 🚀

上一节我们完成了理论推导。本节中我们来看看具体的算法步骤,并通过示例直观理解其工作原理。

非归一化谱聚类(用于两个簇)的算法步骤如下:
- 输入:相似度矩阵或图的邻接矩阵 ( W )。
- 计算图拉普拉斯矩阵:( L = D - W ),其中 ( D ) 是对角度矩阵。
- 计算特征向量:计算 ( L ) 的第二小特征值对应的特征向量 ( \mathbf{f} )。
- 生成簇:根据 ( \mathbf{f} ) 各分量的符号进行划分。
- 若 ( f_i > 0 ),则将顶点 ( i ) 归入簇 ( A )。
- 若 ( f_i < 0 ),则将顶点 ( i ) 归入簇 ( B )。
直观理解:在理想情况下(例如两个完全分离的簇),第二小特征向量在同一个簇内的所有顶点上取值相同(例如全正或全负),在不同簇间取值符号相反。因此,按符号划分能完美恢复聚类。在实际数据中,特征向量能近似保持这一性质,从而得到良好的聚类结果。


扩展到多个簇 🔢
到目前为止,我们只讨论了如何找到两个簇。本节中我们来看看如何将谱聚类推广到寻找 ( k ) 个簇。
思路是使用多个特征向量,而不仅仅是第二个。具体步骤如下:
- 输入:相似度矩阵 ( W ),簇的数量 ( k )。
- 计算图拉普拉斯矩阵:( L = D - W )。
- 计算特征向量:计算 ( L ) 的前 ( k ) 个最小特征值对应的特征向量 ( \mathbf{v}_1, \mathbf{v}_2, ..., \mathbf{v}_k )(忽略第一个全1向量 ( \mathbf{v}_1 ))。
- 构建特征向量矩阵:将这些特征向量作为列,形成一个 ( n \times k ) 的矩阵 ( V ):
[
V = [\mathbf{v}_2, \mathbf{v}3, ..., \mathbf{v}] \in \mathbb{R}^{n \times k}
] - 谱嵌入:将矩阵 ( V ) 的每一行 ( \mathbf{y}_i \in \mathbb{R}^k ) 视为原始顶点 ( i ) 在新的 ( k ) 维空间(称为谱嵌入空间)中的表示。
- 在嵌入空间中进行聚类:对新的数据点 ( { \mathbf{y}i }^n ) 运行标准的 ( k )-均值算法,得到最终的 ( k ) 个簇。

原理:在理想情况下(图由 ( k ) 个互不连接的组件构成),前 ( k ) 个特征向量正好是各个组件的指示向量。此时,属于同一个组件的所有顶点在谱嵌入空间中的坐标完全相同(例如都是 ( (1,0,0,...,0) )),不同组件的顶点坐标不同。因此,在嵌入空间中,数据点会形成 ( k ) 个紧密的团块,即使简单的 ( k )-均值算法也能轻松将其分开。对于真实数据,这种结构虽然不完美,但通常仍能保持,使得后续聚类变得容易。
总结与回顾 🎯
本节课我们一起学习了非归一化谱聚类。我们从图聚类的直观目标出发,指出了最小割算法的缺陷,并引入了结合切割大小与簇平衡性的比率割目标。由于该目标直接优化是NP难的,我们通过引入簇指示向量、利用图拉普拉斯矩阵的性质,并对离散约束进行松弛,将其转化为一个求解矩阵特征向量的问题。最终得到的算法简洁而强大:通过计算图拉普拉斯矩阵的特征向量,并将数据点嵌入到由这些特征向量张成的空间中,再使用 ( k )-均值完成聚类。

谱聚类的优势在于它能发现非凸形状的簇,并且通常对初始化和数据分布不敏感。尽管存在理论上的反例表明松弛解可能不是最优解,但在实践中,谱聚类通常能产生非常出色的聚类结果。在下一讲中,我们将探讨谱聚类的其他变体,如归一化谱聚类,它们在某些情况下可能具有更好的性质。
37:谱聚类(归一化与正则化)🎯
在本节课中,我们将要学习谱聚类的归一化版本和正则化版本。上一节我们介绍了未归一化的谱聚类,本节中我们来看看如何通过归一化和正则化来改进算法,使其在实践中表现更优、更稳定。

概述
谱聚类的核心目标是将图划分为平衡的簇。上一讲我们考虑了未归一化的谱聚类版本,它基于Ratio Cut准则,旨在寻找一个割(cut)较小且两个簇大小(size)大致平衡的划分。其中,簇的大小定义为簇内顶点的数量。
归一化谱聚类
现在,我们将探讨另一种称为归一化谱聚类的变体。它之所以被称为“归一化”,是因为它最终会使用图的归一化拉普拉斯矩阵。实际上,出于理论上的诸多优势,在实践中应始终使用归一化版本。



归一化割准则
在上一讲中,我们使用Ratio Cut准则推导了未归一化谱聚类。现在,我们定义一个略有不同的准则来讨论簇的平衡性,称为归一化割(Normalized Cut)。
以下是归一化割准则的定义:
归一化割(Normalized Cut) 定义为:
NCut(A, B) = cut(A, B) * (1/vol(A) + 1/vol(B))
其中:
cut(A, B)衡量簇A和簇B之间边的数量或权重,我们希望它小。vol(A)是簇A的体积(volume),定义为簇A中所有顶点的度之和。公式为:
它衡量了与簇A相关的所有边的总权重。vol(A) = Σ_{i∈A} d_i = Σ_{i∈A} Σ_{j∈V} w_{ij}
与Ratio Cut使用顶点数量不同,归一化割使用簇的体积来衡量其大小。体积考虑了簇内部的连接紧密程度:一个内部连接更紧密的簇会拥有更大的体积。这通常能更好地反映我们对“簇”的直观理解。
算法推导与实现
与未归一化情况类似,我们可以通过松弛法将最小化归一化割的问题转化为一个特征值问题。推导过程非常相似,只是公式更长。
最终,我们会得到随机游走拉普拉斯矩阵的特征向量。具体步骤如下:
- 输入:图的权重(或邻接)矩阵
W。 - 计算度矩阵
D,其中D_{ii} = Σ_j w_{ij}。 - 计算对称归一化拉普拉斯矩阵
L_sym = I - D^{-1/2} W D^{-1/2}。 - 计算
L_sym的前k个最小特征值对应的特征向量(k为期望的簇数)。 - 关键转换:将这些特征向量转换为随机游走拉普拉斯矩阵的特征向量。转换公式为:将
L_sym的每个特征向量v乘以D^{-1/2},即u = D^{-1/2} v。 - 构建谱嵌入:将这些转换后的特征向量作为列,构成矩阵
U。数据点i的嵌入是矩阵U的第i行。 - 聚类:在嵌入空间中对这些行向量运行K-means算法,得到最终的簇划分。
注意:许多论文和实现会省略第5步的转换,直接使用 L_sym 的特征向量。但从理论上看,这不是最佳选择,因为它不会得到理想的指示向量形式。建议进行此转换。
为何选择归一化版本?
关于哪种谱聚类算法更好,曾有过长期讨论。从学习理论的角度可以证明,未归一化谱聚类在数据点增多时,可能收敛到我们不希望的平凡解。而归一化版本则没有这个问题,它至少具备收敛到正确解的潜力。因此,在实践中应优先使用归一化谱聚类。
正则化谱聚类
现在,我们转向谱聚类的最后一个主题:正则化谱聚类。当图的度分布非常不平衡时(例如社交网络中少数节点拥有极高连接度),标准谱聚类算法可能倾向于识别离群点而非平衡的划分。
正则化方法
一个简单而有效的解决方案是向图的拉普拉斯矩阵引入一个正则化项。具体操作如下:
我们不直接使用原始邻接矩阵 W,而是使用一个正则化后的矩阵 Ŵ:
Ŵ = W + (τ / n) * J
其中:
τ是一个小的正则化参数。J是一个所有元素都为1的矩阵。n是顶点数。
然后,基于这个新的矩阵 Ŵ 计算其对应的度矩阵 Ď 和拉普拉斯矩阵(可以是未归一化或归一化版本)。
正则化的效果与高效计算
理论证明,这种正则化能显著提高算法的稳定性,减少其对离群点或“悬挂集”的敏感性,从而更可能发现数据中真实的、平衡的簇结构。
然而,Ŵ 矩阵是稠密的,即使 W 原本是稀疏的,这会给大规模计算带来挑战。幸运的是,我们可以利用矩阵的特殊结构来高效计算。例如,在计算归一化拉普拉斯矩阵与向量的乘积时,可以将其分解为稀疏矩阵运算和一个可解析处理的偏移项之和,从而避免显式构造稠密矩阵。

总结与历史回顾
本节课中我们一起学习了谱聚类的归一化与正则化版本。
- 归一化谱聚类使用归一化割准则和归一化拉普拉斯矩阵,相比未归一化版本具有更好的理论性质和实际效果。
- 正则化谱聚类通过向邻接矩阵添加一个常数项来进行正则化,能有效处理度分布不平衡的图,提高聚类稳定性,并且存在高效的计算方法。
谱聚类的思想早在1970年代就被发现,但在2000年代初由几篇关键论文(如Shi & Malik, Meila & Shi, Ng et al.)独立推动后才变得非常流行。它能够发现任意形状的簇,是现代聚类算法中至关重要的一员。即使其基本原理已较为成熟,该领域至今仍非常活跃,在计算与统计的权衡等方面持续产生新的研究。
实践建议:
- 优先使用归一化谱聚类。
- 在处理真实世界数据(尤其是度分布不平衡的图)时,考虑使用正则化谱聚类。
- 精心构建相似性图(例如K近邻图)并选择合适的参数,这对谱聚类的成功至关重要。
38:统计学习理论——收敛性与一致性 📚










在本节课中,我们将开始学习一个新的章节:统计学习理论。我们将探讨机器学习算法的理论基础,特别是关于算法收敛性和一致性的核心概念。我们将重点关注二元分类问题,并理解在何种条件下,算法能够从有限的数据中学习到接近最优的模型。














统计学习理论概述 🎯





统计学习理论旨在回答关于机器学习算法的一些根本性问题。这类似于计算机科学中关于可计算性和计算复杂性的研究。在统计学习理论中,我们关心:







- 哪些学习任务在原则上是可解的?
- 哪些假设是算法成功所必需的?
- 如何量化算法的性能保证?
- 特别是在关键应用(如医疗或自动驾驶)中,我们如何评估算法出错的概率?





与统计学类似,我们希望为基于随机数据得出的结论提供置信度保证。然而,机器学习中的保证通常不如传统统计学中的那么强,因为我们通常对数据分布做出更少的假设。更少的假设意味着需要考虑更多潜在情况,因此我们的保证也相应减弱。



最终,许多理论保证是一致性陈述,其形式通常是:随着样本数量 n 趋于无穷大,算法学习到的模型风险将收敛于最优风险。我们或许还能讨论收敛速度,但通常无法像统计学那样给出“在95%概率下此结论正确”的强保证。







尽管如此,学习理论至关重要,因为它揭示了机器学习算法的构建原则、算法成功的原因以及可能导致算法失效的因素。











二元分类的基本框架 🔍





上一节我们介绍了统计学习理论的目标。本节中,我们来看看其标准框架,重点关注二元分类问题。




我们假设训练数据是从某个未知的潜在概率分布 P 中独立同分布(IID)采样得到的。目标是学习一个确定性函数 f,它接收输入点并预测正确的标签(+1 或 -1)。我们通过损失函数来衡量成功与否,并关注期望损失(或风险),即在整个数据空间上的平均损失。




在分类理论中,我们通常关注 0-1 损失函数,它直接衡量分类是否正确:
L(f(x), y) = 0 if f(x) = y else 1








以下是该框架的几个关键假设:








- 不对数据分布
P做假设:这是与许多统计学方法的核心区别。我们不假设数据服从正态分布等特定形式,因为现实数据(如图像像素、客户数据)的分布通常未知且复杂。这种“无分布”的哲学确保了理论保证适用于广泛的实际情况。 - 学习目标是确定性函数:尽管真实世界的标签可能不是输入的确定性函数(例如,身高1.7米的人可能是男性或女性),但我们学习的模型
f会对每个输入给出一个确定的预测。 - 数据是独立同分布(IID)的:这是一个非常强的假设。在实践中,数据可能随时间变化(如垃圾邮件分布)或具有顺序依赖性(如不同时段的客户)。尽管如此,IID 假设为我们提供了一个理论基线,有助于理解算法成功所需的最基本条件。
- 分布
P在训练时是未知的:这正是机器学习的核心挑战。







在这个框架下,我们定义几个重要概念:
f*:贝叶斯最优分类器,即在已知分布P的情况下能达到最小可能风险的分类器。这是我们学习的终极目标,但它是未知的。f_F:在给定函数类F中,针对分布P能达到最小风险的最优函数。f_n:学习算法在观测了n个数据点后所选择的函数。










一致性定义 📐



上一节我们建立了学习问题的基本框架。本节中,我们来定义衡量算法成功与否的核心概念:一致性。
一致性描述了当训练样本量增加时,算法性能的渐近行为。以下是三种重要的一致性定义:
- 关于函数类
F和分布P的一致性:如果算法选择的函数f_n的真实风险R(f_n)依概率收敛到函数类F中的最优风险R(f_F),则称该算法是一致的。用公式表示为:
∀ε > 0, P( |R(f_n) - R(f_F)| > ε ) → 0 as n → ∞
这种一致性主要关注估计误差,即由于使用有限样本而非整个分布所带来的误差。

- 贝叶斯一致性:如果算法选择的函数
f_n的真实风险R(f_n)依概率收敛到贝叶斯最优风险R(f*),则称该算法是贝叶斯一致的。公式为:
∀ε > 0, P( |R(f_n) - R(f*)| > ε ) → 0 as n → ∞
这同时考虑了估计误差和近似误差(即函数类F本身与贝叶斯最优分类器之间的差距)。







- 普遍一致性:如果算法对所有可能的概率分布
P都具有上述的一致性(或贝叶斯一致性),则称之为普遍一致。这是我们最期望的性质,因为我们并不知道真实的数据分布。













经验风险最小化与收敛问题 ⚙️







上一节我们定义了一致性。本节中,我们来看看实现学习的具体算法及其面临的挑战。







许多学习理论结果关注的经验风险最小化(ERM)算法。其思想是,在给定函数类 F 中,选择在训练集上损失(即经验风险 R_n(f))最小的函数 f_n:
f_n = argmin_{f ∈ F} R_n(f)






我们希望 f_n 的真实风险 R(f_n) 也能很小。一个自然的想法是借助大数定律:对于任意固定的函数 f,其经验风险 R_n(f) 会随着样本量增加而收敛到真实风险 R(f)。这可以通过霍夫丁不等式等浓度不等式来严格证明。






然而,关键问题在于:对于依赖于数据而选出的函数 f_n,大数定律是否仍然保证 R_n(f_n) 收敛到 R(f_n)?答案是否定的。








以下是一个反例:
- 数据空间:
X = [0, 1], 真实规则:x < 0.5则y = -1,否则y = +1。 - 数据从
[0,1]上的均匀分布中采样。 - 定义算法:对于训练集中出现过的点,直接输出其训练标签;对于其他点,一律预测为
-1。 - 结果:该函数的经验风险
R_n(f_n) = 0(完美拟合训练集),但其真实风险R(f_n) = 0.5(对一半的测试集分类错误),且不随n增大而改变。






问题根源在于,当函数 f_n 本身依赖于所有训练数据时,用于计算经验风险的损失值就不再是相互独立的随机变量,因此大数定律的条件被破坏。










一致性的关键:一致收敛 ✅






上一节我们看到,简单地应用大数定律不足以保证学习算法的成功。本节中,我们引入解决该问题的核心概念:一致收敛。







为了确保算法选择的函数 f_n 的性能可靠,我们需要一个更强的条件:对于函数类 F 中的所有函数,其经验风险都必须同时、一致地接近其真实风险。即,我们希望以下事件发生的概率很高:
sup_{f ∈ F} | R_n(f) - R(f) | ≤ ε
其中 sup 表示上确界。这意味着在整个函数类 F 上,经验风险与真实风险之间的最大偏差被控制在 ε 以内。





如果一致收敛成立,那么无论学习算法最终选择了 F 中的哪个函数 f_n,我们都能保证其经验风险 R_n(f_n) 是其真实风险 R(f_n) 的良好估计。进而,通过最小化经验风险选出的函数,其真实风险也会很小。








回到之前的反例,可以验证该反例中的函数类(一个包含所有可能“查找表”函数的巨大集合)不满足一致收敛条件。这给了我们希望:一致收敛可能正是我们需要的正确框架。






我们正式定义:如果对于任意 ε > 0,都有
P( sup_{f ∈ F} | R_n(f) - R(f) | > ε ) → 0 as n → ∞
则称大数定律在函数类 F 上一致成立。













一致收敛与一致性的关系 🔗






上一节我们定义了一致收敛。本节中,我们来探讨它与算法一致性之间的深刻联系。






首先,一致收敛是经验风险最小化算法具有一致性的充分条件。具体来说,如果一致收敛成立,那么对于 ERM 算法选择的函数 f_n,其真实风险 R(f_n) 接近最优风险 R(f_F) 的概率可以被一致收敛的概率所控制。证明思路是利用三角不等式,将我们关心的风险差 R(f_n) - R(f_F),分解并放缩为两个形如 |R(f) - R_n(f)| 的项之和,而这两项都可以被一致收敛的上确界所控制。







更重要的一个结果是,一致收敛同时也是必要条件。这是一个由 Vapnik 和 Chervonenkis 在 1971 年证明的深层定理。该定理表明,对于任意函数类 F,经验风险最小化算法具有一致性的充要条件就是一致收敛成立。





这一定理将算法性能的保证问题,转化为了对函数类 F 本身性质(即是否满足一致收敛)的研究。然而,直接验证或计算 sup_{f ∈ F} | R_n(f) - R(f) | 的收敛性通常非常困难。






因此,接下来的核心问题是:如何判断一个给定的函数类 F(例如,支持向量机所用的函数类)是否满足一致收敛? 答案是研究函数类的容量度量。这将是下一讲的主要内容。












总结 📝


本节课我们一起学习了统计学习理论中关于收敛性与一致性的基础知识。
我们首先了解了统计学习理论的目标,即从理论上分析机器学习算法的可学习性、所需假设和性能保证。接着,我们回顾了监督学习(特别是二元分类)的标准框架及其核心假设,其中最重要的包括不对数据分布做先验假设,以及数据独立同分布的假设。








我们定义了三种一致性:关于函数类的一致性、贝叶斯一致性和普遍一致性,它们描述了算法在样本量趋于无穷时的渐近性能。






然后,我们指出了经验风险最小化算法面临的核心挑战:对于数据依赖的函数,大数定律并不直接保证其经验风险是真实风险的良好估计。我们通过一个反例说明了这一点。







为了解决这个问题,我们引入了一致收敛的概念。它要求整个函数类中所有函数的经验风险都一致地逼近其真实风险。我们证明了,一致收敛是经验风险最小化算法取得一致性的充分必要条件(Vapnik-Chervonenkis 定理)。









最后,我们指出,为了将理论应用于实践,需要工具来刻画函数类的复杂程度,以判断其是否满足一致收敛。这引出了对函数类容量度量(如 VC 维、Rademacher 复杂度等)的研究,这将是后续课程的重点。
39:有限函数类的统计学习理论 📊
在本节课中,我们将要学习如何为有限函数类证明一致大数定律。我们将从一个直观的数学推导开始,理解如何将单个函数的集中不等式推广到整个函数类,并最终得到一个可用于指导学习算法设计的泛化界。
概述
上一节我们介绍了,为了证明一个分类算法是一致的,我们需要证明一致大数定律。该定律表明,对于给定函数类中的所有函数,当样本量 n 趋于无穷时,真实风险与在特定样本上测量的经验风险之间的偏差会趋于0。然而,上一节末尾的表达式看起来相当复杂。本节中,我们来看看如何证明这样的定律。我们将从有限函数类(即函数类中只有有限个函数)的情况开始。
从单个函数到有限函数类
以下是证明的核心思路:我们无法将标准大数定律直接应用于依赖于数据选择的函数(如经验风险最小化选择的函数)。为了规避这个问题,我们转而考虑函数类中所有函数偏差的上确界。
我们首先回顾一个已知的工具:霍夫丁不等式。对于任何不依赖于数据的固定函数 f,其经验风险 R_emp(f) 与真实风险 R(f) 的偏差可以被概率性地界定。
霍夫丁不等式:
P(|R_emp(f) - R(f)| > ε) ≤ 2 * exp(-2nε²)
这个界限很好,因为它随着样本量 n 以指数速度衰减。然而,问题在于我们不能直接将这个界限应用于基于样本数据选择的函数 f_n。
现在,我们考虑一个有限函数类 F,它包含 M 个函数,记作 {f1, f2, ..., fM}。我们想要界定的是最坏情况下的偏差概率:
P( sup_{f ∈ F} |R_emp(f) - R(f)| > ε )
以下是推导这个界限的步骤:
-
用有限和表示上确界:由于函数类只有
M个元素,上确界等价于遍历所有函数的最大偏差。
sup_{f ∈ F} ... = max_{i=1,...,M} ... -
将“最大值”转化为逻辑“或”:最大值超过
ε,意味着至少有一个函数的偏差超过ε。这可以用逻辑“或”运算来表示。
P( max_i |...| > ε ) = P( ∪_{i=1}^M { |..._i| > ε } ) -
应用并界(Union Bound):一组事件并集的概率小于等于这些事件概率之和。这是一个宽松但始终成立的界限。
P( ∪_{i=1}^M A_i ) ≤ Σ_{i=1}^M P(A_i)
将其应用于我们的情况,得到:
P( sup_{f ∈ F} |R_emp(f) - R(f)| > ε ) ≤ Σ_{i=1}^M P( |R_emp(f_i) - R(f_i)| > ε ) -
对每一项应用霍夫丁不等式:现在,求和中的每一项
P( |R_emp(f_i) - R(f_i)| > ε )都涉及一个固定的、独立于数据的函数f_i。因此,我们可以对每一项应用霍夫丁不等式。
Σ_{i=1}^M P(...) ≤ Σ_{i=1}^M 2 * exp(-2nε²) = 2M * exp(-2nε²)
至此,我们得到了有限函数类的关键概率界限。
泛化界定理及其解释
将上述概率界限重新表述,我们得到以下定理。
定理(有限函数类的泛化界):
假设函数类 F 是有限的,包含 M 个函数。对于任意 δ ∈ (0, 1) 和任意 ε > 0,有以下结论成立:
以至少 1 - δ 的概率,对于 F 中的所有函数 f,其真实风险 R(f) 满足:
R(f) ≤ R_emp(f) + √( (log(2M) + log(1/δ)) / (2n) )
这个定理的另一种等价形式(通过设定 δ = 2M exp(-2nε²) 并反解 ε 得到)更常用:它以高概率 (1-δ) 保证了所有函数的真实风险都被其经验风险加上一个偏差项所界定。
让我们来解析这个偏差项 √( (log(2M) + log(1/δ)) / (2n) ):
- 容量项
log(2M):这衡量了函数类的复杂度或“大小”。即使函数数量M很大,由于其对数形式,这项的增长也被控制得很慢。这直观地告诉我们,只要函数类的规模没有指数级地超过数据量,我们就可以控制过拟合。 - 置信项
log(1/δ):这反映了我们想要的置信水平。如果我们希望结论更可靠(即δ更小),那么偏差界限就会变宽,这是合理的——为了涵盖更极端的小概率事件,我们需要更保守的估计。 - 样本量
n:样本量n出现在分母。随着n增大,整个偏差项以O(1/√n)的速度减小,意味着估计越来越精确。

定理的启示:
- 一致性条件:为了使偏差项随
n→∞而趋于0(从而获得一致性),我们需要(log M)/n → 0。这意味着函数类的规模M可以随n增长,但至多只能以低于指数级的速度增长(例如,多项式增长是允许的)。 - 权衡:定理揭示了模型复杂度(
log M)、样本量 (n) 和置信水平 (δ) 之间的经典权衡。更复杂的模型(更大的M)需要更多的数据来达到相同的精度。
示例:网格上的分段常数函数
为了具体理解这个定理,我们考虑一个例子。假设数据空间 X = [0, 1],我们在 [0, 1] 区间上设置一个均匀的网格,将其分为 K 个单元格。
我们的函数类 F_K 由所有在每个网格单元格上为常数(0或1) 的分段常数函数组成。这是一个有限函数类,因为每个单元格可以独立地取0或1,所以总函数数量 M = 2^K。
现在,我们可以应用上述泛化界。偏差项变为:
√( (log(2 * 2^K) + log(1/δ)) / (2n) ) = √( ( (K+1) * log 2 + log(1/δ) ) / (2n) )
一致性分析:
- 如果网格数
K是固定常数,那么当n → ∞时,偏差项显然趋于0。因此,经验风险最小化在这个函数类上是一致收敛的。 - 如果网格数
K随n增长(即K = K(n)),那么为了保持一致性,我们需要偏差项趋于0。这要求(K(n) * log 2) / n → 0,即K(n)的增长速度必须比n慢(例如,K(n) = √n或K(n) = log n是可行的,而K(n) = n则不行,因为(n)/n → 常数 ≠ 0)。
这个例子很好地展示了如何利用泛化界来指导模型选择:即使我们允许模型复杂度(网格数 K)随数据增加而增加,也必须控制其增长速度,才能保证学到的模型能够泛化。
总结与展望
本节课中我们一起学习了如何为有限函数类建立统计学习理论的基础。
- 我们通过并界技巧,将针对单个固定函数的霍夫丁不等式,推广到了整个有限函数类。
- 我们得到了一个关键的泛化界,它用经验风险、函数类容量 (
log M)、样本量 (n) 和置信水平 (δ) 来界定真实风险。 - 我们通过一个分段常数函数的例子,演示了如何使用这个界来分析学习算法的一致性,并理解模型复杂度与样本量之间的权衡。
然而,这个理论有一个明显的局限:它只适用于有限函数类。对于大多数现代机器学习模型(如神经网络、决策树等),其假设空间通常是无限的。直接将 M 视为无穷大会导致界限失去意义。

下一节我们将探讨,如何通过组合数学工具(如VC维、Rademacher复杂度等)来度量无限函数类的“有效大小”,从而将泛化理论推广到更一般的情况。这些工具将使我们能够证明形式类似但适用范围更广的泛化界限。
40:打散系数 📊

在本节课中,我们将学习统计学习理论中的一个核心概念——打散系数。我们将探讨如何利用这个组合度量来评估函数类的“容量”,并推导出无限函数类的泛化误差界。理解打散系数是理解机器学习算法何时能够有效泛化的关键一步。
回顾与问题设定
上一节我们介绍了统计学习理论的基本框架,本节中我们来看看如何将其扩展到无限函数类。
我们关注一个使用 N 个数据点进行学习的算法,该算法会选择一个函数,记作 f_N。我们关心的是这个函数的真实风险 R(f_N),并希望将其与函数类 F 中可能的最佳函数 f* 的风险进行比较。我们想知道风险偏差 R(f_N) - R(f*) 大于某个值 ε 的概率。

通过一些变换,我们将问题转化为研究一致收敛:即对于函数类 F 中的所有函数,其经验风险与真实风险之间的最大偏差超过 ε 的概率。对于有限函数类(包含 M 个函数),我们得到了一个形如 M * exp(-2nε²) 的界。这个界表明,函数类的规模 M 至关重要。
然而,当函数类包含无限多个函数时,上述证明方法失效。这就需要引入新的概念——打散系数。
打散系数的定义
打散系数是一个组合度量,用于衡量一个函数类在有限样本上的“表达能力”或“容量”。
假设我们有一个包含 n 个点的样本 {x₁, ..., xₙ},以及一个函数类 F。我们首先定义函数类在样本上的限制:


F|_{x₁,...,xₙ} = { (f(x₁), ..., f(xₙ)) | f ∈ F }
这个集合包含了所有函数在这个有限样本上可能产生的标签组合(例如,在二分类中为 -1/+1 或 0/1 的序列)。由于只有 n 个点,每个点有两种标签,所以最多有 2ⁿ 种可能的标签组合。
打散系数 N(F, n) 定义为:对于任意大小为 n 的样本,函数类 F 所能实现的不同标签组合的最大数量。它衡量的是函数类在 n 个点上“打散”(即实现所有可能标签组合)的能力。

打散系数示例
以下是几个计算打散系数的简单例子,以帮助理解。
示例1:一维阶跃函数
- 数据空间: 实数轴 ℝ
- 函数类 F: 所有从 0 跳变到 1 的阶跃函数,形式为 f(x) = I(x ≥ a),其中 a ∈ ℝ。
- 目标: 计算 N(F, 3)。
我们考虑任意三个数据点。通过移动跳变点 a,我们可以实现部分标签组合,但无法实现“0, 1, 0”这样的模式(因为阶跃函数只能从0变到1一次)。对所有8种可能的标签组合进行枚举后,发现只有4种可以被实现。
因此,N(F, 3) = 4。
示例2:二维线性分类器(正半平面)
- 数据空间: 二维平面 ℝ²
- 函数类 F: 所有将平面分为上下两部分的直线,下半部分标记为0,上半部分标记为1。
- 目标: 估计 N(F, 5)。

通过尝试不同的5个点集,我们发现:
- 在某些点集配置下(如所有点几乎共线),只能实现少数几种标签。
- 存在一种点集配置(例如,5个点处于“一般位置”,没有三点共线),我们可以实现多达6种不同的标签组合。
- 可以证明,对于任意5个点,无法实现超过6种标签组合。
因此,N(F, 5) = 6。
示例3:二维圆形分类器
- 数据空间: 二维平面 ℝ²
- 函数类 F: 所有圆,圆内为一类,圆外为另一类。
- 目标: 思考 N(F, n) 如何随 n 增长。
这个例子更复杂,但思路相同:寻找一个 n 个点的配置,使得通过调整圆心的位置和半径,能够实现尽可能多的标签组合。这个最大数量就是 N(F, n)。
基于打散系数的泛化界

引入打散系数的目的是为了得到无限函数类的泛化误差界。以下是核心定理:
定理:设 F 为任意函数类,对于任意 ε > 0,有以下概率界:
P( sup_{f ∈ F} |R(f) - R_n(f)| > ε ) ≤ 2 * N(F, 2n) * exp(-nε²/4)
其中 R(f) 是真实风险,R_n(f) 是基于 n 个样本的经验风险。
这个界在形式上与有限函数类的界(M * exp(...))非常相似,只是将函数数量 M 替换为了打散系数 N(F, 2n)。这直观上是合理的,因为打散系数衡量了在 2n 个点(源于后续证明中的“影子样本”技巧)上,函数类表现出的有效函数数量。
更常用的等价形式是:以至少 1 - δ 的概率,对于所有 f ∈ F,有:
R(f) ≤ R_n(f) + √( (2 log(2N(F, 2n)) + log(2/δ)) / n )

证明思路与影子样本技巧
证明的关键在于处理真实风险 R(f),它依赖于整个数据分布,难以直接分析。我们采用对称化技巧:

- 引入影子样本:假设我们除了训练样本 S(大小为 n)外,还有另一个从相同分布中独立抽取的“影子样本” S‘(大小也为 n)。
- 替换风险差:可以证明,我们关心的风险偏差概率 P(sup |R(f) - R_n(f)| > ε) 可以被 2 * P(sup |R_n'(f) - R_n(f)| > ε/2) 所界定,其中 R_n‘ 是在影子样本上计算的经验风险。
- 关键观察:现在,表达式 sup |R_n'(f) - R_n(f)| 只依赖于两个有限的点集 S 和 S‘(共 2n 个点)。函数 f 在这 2n 个点上的取值是有限的,其不同行为的数量正好由打散系数 N(F, 2n) 所界定。
- 化为有限类问题:至此,问题被简化为一个在最多 N(F, 2n) 个“有效函数”上的有限函数类问题,可以沿用霍夫丁不等式和联合界进行推导,最终得到上述定理中的界。
一致收敛与一致性条件
根据之前的学习,我们知道经验风险最小化(ERM)的一致性(即当样本数 n → ∞ 时,学得函数的风险收敛到最优风险)等价于一致收敛(即上述定理中的概率上界趋于0)。
观察我们的泛化界,一致收敛成立的条件是:
(log N(F, 2n)) / n → 0 (当 n → ∞ 时)
这意味着打散系数 N(F, n) 的增长速度必须慢于指数增长。如果 N(F, n) 以 2ⁿ 这样的指数速度增长,那么 log N(F, n) ~ n,上述条件不满足,我们就无法保证ERM的一致性。这对应了函数类“容量”过大,可能导致严重的过拟合。


因此,多项式增长的打散系数是保证学习过程具有一致性的一个关键条件。


总结与展望
本节课中我们一起学习了:
- 打散系数 N(F, n) 的定义:它衡量一个函数类在 n 个点上能产生多少种不同的标签模式,是函数类容量的组合度量。
- 如何通过对称化技巧和影子样本,将无限函数类的泛化分析问题,转化为受打散系数限制的有限问题。
- 得到了基于打散系数的泛化误差界,该界在形式上与有限函数类的界类似。
- 推导出保证学习算法一致性的条件是 log N(F, n) / n → 0,即打散系数需亚指数增长(通常为多项式增长)。

打散系数是一个强大的理论工具,但其主要缺点是对于复杂的函数类往往难以计算。我们需要对所有可能的 n 点配置考虑其最大可实现标签数。在下一讲中,我们将介绍一个更易于处理和分析的容量概念——VC维,它能够为许多实用的函数类给出打散系数的上界,从而更方便地应用于理论分析和推导。
41:统计学习理论与VC维 📊

在本节课中,我们将要学习统计学习理论中的一个核心概念——VC维。我们将从定义开始,通过具体例子理解其含义,并最终了解它如何帮助我们推导出泛化误差界,从而保证学习算法的有效性。
定义与核心概念
上一节我们介绍了粉碎系数,作为处理无限函数类并改进泛化界的一个工具。然而,粉碎系数通常难以计算。本节中,我们来看看一个不同的工具,它被称为VC维,由Vapnik和Chervonenkis发明。这是另一个组合工具。
我们直接开始定义。给定一个数据空间 X 和一个函数类 F。我们说一个函数类 粉碎 一组数据点,如果这个函数类能够在该组点上实现所有可能的标签分配。


对于一个包含 n 个点的数据集,有 2^n 种不同的二元标签分配。如果函数类能实现所有这些标签,即当我们观察函数类限制在这些数据点上时,存在所有可能的函数(共 2^n 个),那么我们就说该函数类粉碎了这个数据集。
现在,我们定义函数类的VC维。与粉碎系数不同,VC维是一个不依赖于样本数量 n,而只依赖于函数类本身的量。
函数类的VC维定义为:存在一个能被该函数类粉碎的样本的最大数据点数量。其公式化定义是:
VC维 = max { n | ∃ 一个包含 n 个点的数据集 S ⊆ X,使得 F 能粉碎 S }
如果这个最大值不存在,我们就说VC维是无限的。

让我们消化一下这个定义,并在脑海中与粉碎系数进行对比。第一个重要区别是,粉碎系数依赖于一个特定的样本大小 n,而VC维通过考察不同大小的样本,摆脱了这种依赖。当我们找到一个特定大小的数据集无法再被粉碎时,我们就停止,并找到了VC维。
计算VC维的示例

让我们通过一些例子来理解如何计算VC维。
示例1:实轴上的区间指示函数
- 数据空间 X: 实数轴 ℝ
- 函数类 F: 所有闭区间 [a, b] 的指示函数(在区间内为1,区间外为0)。
以下是确定其VC维的步骤:
- 我们从小的点集开始尝试。
- n = 2: 考虑实数轴上的任意两个点。我们可以通过选择包含或不包含这些点的区间,轻松实现所有四种标签组合((1,1), (1,0), (0,1), (0,0))。因此,我们找到了一个能被粉碎的2点数据集,所以VC维 至少为2。
- n = 3: 考虑实数轴上的任意三个点(按顺序排列)。现在存在一种标签组合我们无法实现:中间的点标记为0,两端的点标记为1(即模式 1, 0, 1)。因为任何区间如果要包含两端点,就必须包含中间点。因此,不存在一个能被该函数类粉碎的3点数据集。
- 结论:该函数类的VC维为 2。
示例2:平面上的轴平行矩形
- 数据空间 X: 平面 ℝ²
- 函数类 F: 所有轴平行矩形的指示函数(矩形内为1,矩形外为-1)。

以下是确定其VC维的步骤:
- n = 4: 我们可以找到一个能被粉碎的4点数据集:例如,四个点分别位于一个矩形的四个角上。通过调整矩形的位置和大小,我们可以实现所有16种标签组合(例如,只包含对角两点、包含相邻三点等)。
- n = 5: 可以证明,对于任何5个点的集合,都无法被轴平行矩形类粉碎。直观上,对于任意5个点,总能找到一个点不是“极端点”(即不是最左、最右、最上或最下的点),而某些标签组合(例如,只给这个内部点标记为1,其他标记为-1)是无法实现的。
- 结论:该函数类的VC维为 4。
示例3:具有d个顶点的凸多边形
- 数据空间 X: 平面 ℝ²
- 函数类 F: 所有具有d个顶点的凸多边形的指示函数。
- 结论:该函数类的VC维为 2d + 1。证明思路是:将 2d+1 个点均匀放在一个圆上,可以构造多边形来实现这些点的任意标签组合(下界)。同时,可以证明 2d+2 个点无法被粉碎(上界)。
示例4:正弦波函数类
- 数据空间 X: 实数轴 ℝ
- 函数类 F: 所有形式为 sin(ωx) 的函数(通过阈值化得到二元分类)。
- 结论:该函数类的VC维是无限的。因为对于任意数量的点 n,我们都可以选择一个频率足够高的正弦波,使其在这些点上产生任意我们想要的0/1模式。
实践中的重要VC维结果
以下是一些在实践中非常重要的函数类的VC维:
- ℝ^d 中的线性分类器(超平面):VC维 = d + 1。
- 具有间隔 ρ 的线性分类器:如果数据点位于一个半径为 R 的球内,则VC维 ≤ min( d, ⌈R²/ρ²⌉ )。这表明,较大的分类间隔对应于较小的VC维,这是一个好现象,通常意味着更好的泛化能力。
Sauer-Shelah 引理与泛化界

我们为什么要研究VC维?它听起来像一个组合工具,但似乎不能直接用来证明泛化界,因为它并不直接计算函数的数量。
关键在于一个非常深刻且重要的组合引理——Sauer-Shelah 引理。
Sauer-Shelah 引理:假设一个函数类 F 具有有限的VC维 D。那么,对于任意大小为 n 的样本,其粉碎系数(即函数类在样本上能产生的不同分类结果的数量)满足以下上界:
粉碎系数 ≤ Σ_{i=0}^{D} C(n, i) ≤ (e * n / D)^D
其中 C(n, i) 是组合数。特别地,当 n > D 时,这个上界是 O(n^D),即关于 n 是多项式增长,而不是指数增长。
这个引理的意义非常重大。它意味着,一旦样本数量 n 超过了VC维 D,函数类在样本上的表现能力就会从潜在的指数增长急剧转变为多项式增长。
有了这个引理,我们就可以将其代入之前基于粉碎系数的泛化误差界定理中。

基于VC维的泛化界:设 F 是一个VC维为 D 的函数类。那么,以至少 1 - δ 的概率,对于所有 f ∈ F,其真实风险 R(f) 与经验风险 R_n(f) 的偏差满足:
R(f) ≤ R_n(f) + O( √( (D * log(n/D) + log(1/δ)) / n ) )
这个结果的核心在于,当VC维 D 是有限常数时,随着样本量 n 趋于无穷,误差项 O(√(...)) → 0。这直接意味着经验风险最小化(ERM)是(一致)学习的。

更一般地,可以证明一个函数类能够被ERM一致学习,当且仅当它的VC维是有限的。这为学习理论提供了一个清晰而优美的刻画。

样本复杂度估计

我们经常想知道,为了达到特定的精度 ε,需要多少样本。

从上面的泛化界出发,如果我们希望误差项小于 ε,可以解出所需样本量 n 的阶。忽略常数和对数项,我们得到:
n ~ O( D / ε² )



这个估计告诉我们:
- 所需样本量与VC维 D 成线性关系。因此,在选择模型复杂度时,VC维是一个重要的考量因素。
- 所需样本量与期望精度 ε 的平方成反比。要获得更高的精度(更小的 ε),需要显著增加样本量。
总结


本节课中我们一起学习了VC维这一统计学习理论的核心概念。
- 我们首先定义了粉碎和VC维,并通过多个例子(如区间、矩形、多边形、正弦波)学会了如何计算或估计一个函数类的VC维。
- 接着,我们了解了Sauer-Shelah引理,它揭示了有限VC维的函数类,其表达能力在样本量超过VC维后仅呈多项式增长,这是证明泛化界的关键。
- 然后,我们推导出了基于VC维的泛化误差界,并认识到有限VC维是经验风险最小化算法能够成功(一致)学习的充要条件。
- 最后,我们基于泛化界推导了样本复杂度的简单估计,即所需样本量大致与VC维成正比,与期望误差的平方成反比。

VC维将函数类的复杂性转化为一个单一的数字,为理解机器学习模型的容量和泛化能力提供了强大的理论工具。
42:统计学习理论与Rademacher复杂度 📊
在本节课中,我们将要学习统计学习理论中的一个核心概念——Rademacher复杂度。我们将了解它如何作为衡量函数类“容量”或“复杂度”的一种新工具,并理解它相较于之前学习的组合度量(如VC维)的优势。

概述



上一节我们介绍了如何通过组合度量(如打散系数和VC维)来计算二元分类的泛化界。这些度量告诉我们,如果函数类的VC维是有限的,或者其打散系数呈多项式增长,那么学习算法就是一致的。



然而,这些组合度量可能存在一定的局限性。它们主要衡量函数类的大小,但并未考虑底层的概率分布。例如,可能存在一种情况,虽然一个学习算法的VC维是无限的(即对于任意n,都能找到一个可以被“打散”的点集配置),但这个配置在实际数据分布中出现的概率极低,以至于它可能并不真正影响算法的性能,算法可能仍然是一致的。



这种感觉催生了一种新的解决方案,即Rademacher复杂度。它是一种不同的度量方式,能够将数据分布纳入考量。


Rademacher复杂度的定义




Rademacher复杂度同样是一个依赖于函数类 F 和样本大小 n 的函数,记作 R_n(F)。



它的定义如下:

- 首先,我们固定一个样本大小
n。 - 我们引入
n个独立的随机变量σ_1, ..., σ_n,它们服从二元均匀分布,即像抛硬币一样,以等概率取+1或-1。这相当于为我们的数据点随机分配标签。 - 对于函数类
F中的任意一个函数f,我们计算表达式(1/n) * Σ_{i=1}^{n} σ_i * f(x_i)。- 在二元分类中,
f(x_i)和σ_i都取值于{-1, +1}。 - 如果
σ_i和f(x_i)符号相同(预测正确),则该项为+1。 - 如果符号相反(预测错误),则该项为
-1。 - 因此,这个求和本质上衡量了函数
f对由σ给出的随机标签的拟合程度。
- 在二元分类中,
- 我们取函数类
F中所有函数的上确界(supremum),即寻找最能拟合当前这组随机标签σ的那个函数:sup_{f∈F} (1/n) Σ_{i=1}^{n} σ_i * f(x_i)。 - 最后,我们对这个上确界取期望。这个期望既针对数据点
x_i(服从某个概率分布P),也针对随机标签σ_i。

以下是Rademacher复杂度的正式公式:
R_n(F) = E_{x_i ~ P, σ_i} [ sup_{f∈F} (1/n) Σ_{i=1}^{n} σ_i f(x_i) ]

直观理解:我们有一个数据集,并为其分配随机标签。然后,我们衡量函数类 F 中是否存在某个函数能非常好地拟合这组随机标签。如果存在,这个“拟合优度”的值就会进入上确界。接着,我们对所有可能的数据集(来自分布 P)和所有可能的随机标签取平均(期望)。

Rademacher复杂度的优势



Rademacher复杂度与打散系数或VC维做着类似的事情:它衡量一个函数类能够表达数据所有可能标记方式的“能力”。但它有两大关键优势:


- 结合了数据分布:通过引入对数据点
x_i的期望,Rademacher复杂度将底层概率分布P纳入了考量。那些出现概率极低、几乎无关紧要的数据点配置,在计算期望时贡献很小,因此不会过度影响复杂度的值。这使得度量更加精细和实际。 - 更易于分析:与纯粹的组合对象相比,Rademacher复杂度是一个概率统计对象。分析这类包含随机变量和期望的表达式,可以更多地利用概率论、统计学和泛函分析中的成熟工具(例如链式方法),对理论研究者而言,这通常比处理组合问题更得心应手。

基于Rademacher复杂度的泛化界


虽然详细证明基于Rademacher复杂度的泛化界超出了本课程的范围(其证明比VC维或打散系数的证明复杂得多,涉及大量概率论技巧),但我们可以了解其基本形式。


一个典型的泛化界定理可能如下所示:
定理:以至少 1 - δ 的概率,对于函数类 F 中的所有函数 f,其真实风险 R(f) 满足:
R(f) ≤ R_n(f) + 2 * R_n(F) + √( log(1/δ) / (2n) )

公式解读:
R(f):函数f的期望风险(泛化误差)。R_n(f):函数f在大小为n的训练集上的经验风险。R_n(F):函数类F的Rademacher复杂度。√( log(1/δ) / (2n) ):置信项,与之前VC维泛化界中的形式一致,由我们想要的置信水平δ决定。



这个公式的结构与我们之前看到的泛化界非常相似:真实风险被经验风险、一个衡量函数类容量的项以及一个置信项所界定。关键区别在于,容量项从之前的组合度量(如 √( log( ShatterCoeff ) / n ))替换为了Rademacher复杂度 R_n(F)。




关于泛化界的重要总结


在本节最后,我们强调关于泛化界的几个核心要点:


- 目标:泛化界旨在证明学习算法何时是一致的。
- 核心关注点:我们目前讨论的所有泛化界,其核心都是控制估计误差。它们陈述的是:对于一个给定的函数
f,其经验风险R_n(f)会接近其真实风险R(f)。这解决了由于我们只有有限样本(而非全体数据空间)所带来的不确定性(即过拟合风险)。 - 不涉及近似误差:泛化界不对函数
f的真实风险R(f)本身的大小做出保证,也不保证R(f)是否接近最优的贝叶斯风险。即使R(f)和R_n(f)都很高(由于模型偏差大,近似误差高),泛化界仍然可能成立(即两者接近),但这样的学习算法可能毫无用处。因此,泛化界排除了因采样效应导致的过拟合,但并未解决因模型选择不当导致的欠拟合问题。 - 最坏情况保证:这类泛化界通常是最坏情况下的界。它们在最坏的数据概率分布
P和最坏的函数f ∈ F上成立。这是一种悲观的保证,但能提供强有力的、无需额外分布假设的算法性能担保。当然,也存在其他非最坏情况下的保证,但需要不同的分析工具。 - 容量度量多样性:存在许多不同的方式来度量函数类的“容量”。我们只介绍了其中几种(有限函数类大小、打散系数、VC维、Rademacher复杂度)。学习理论界还研究了其他方法,如样本压缩、最小描述长度原则等。如需深入了解,需要查阅专门的文献和书籍。
本节课总结
本节课我们一起学习了统计学习理论中的Rademacher复杂度。



- 我们首先回顾了基于组合度量(VC维)的泛化界的潜在不足,即它们忽略了数据分布。
- 接着,我们详细定义了Rademacher复杂度
R_n(F),它通过引入对数据和随机标签的期望,将概率分布信息融入了对函数类复杂度的衡量。 - 我们看到了基于Rademacher复杂度的泛化界基本形式,其结构类似但容量项更为精细。
- 最后,我们总结了泛化界的核心目的是控制估计误差,提供最坏情况保证,并且是学习算法一致性理论的重要组成部分。


Rademacher复杂度是一个强大的理论工具,使得对许多复杂函数类(如 Lipschitz 函数类、神经网络等)进行泛化分析成为可能,在现代统计学习理论中占有重要地位。
43:正则化的一致性 📈





在本节课中,我们将探讨如何控制机器学习中的近似误差,并介绍两种实现一致性的理论方法:结构风险最小化和正则化。我们将看到,通过精心设计学习过程,可以使模型在样本量趋于无穷时,收敛到理论上的最优分类器。




上一节我们介绍了泛化误差可以分解为估计误差和近似误差,并且泛化界已经为我们处理了估计误差。本节中,我们来看看如何处理近似误差。

我们将讨论两种不同的方法。这里我们只做简要介绍,目的是展示如何从原理上为这类问题建立理论边界。





方法一:结构风险最小化 🏗️


第一种方法被称为结构风险最小化,它基于嵌套的函数类。




其核心思想是:对于一个较小的固定函数类,我们可能有一个如泛化界所述的泛化保证。但我们最终的目标是逼近贝叶斯风险。因此,我们可以逐渐增大函数类的规模,使得最终贝叶斯最优分类器也包含在我们的函数类中。




从概念上讲,我们希望考察一系列嵌套的函数空间,记为 F₁ ⊂ F₂ ⊂ F₃ ...。我们让函数空间随着样本量 n 的增长而缓慢扩大。




然后,我们希望证明:如果函数空间的规模以某种方式依赖于数据点的数量 n,我们确实可以获得一致性(即收敛到贝叶斯分类器),并且近似误差会变小,最终趋近于零。


正如所说,我们将考察两种实现此目标的不同方法:结构风险最小化和实践中更常用的正则化。




结构风险最小化的原理




让我们先探讨结构风险最小化,这是一种理论上可行的方法。据我所知,它在实践中几乎从未被使用,但至少可以用它来证明某些定理。

现在,我们考虑一个如上一张幻灯片所示的嵌套函数空间序列:F₁, F₂, ...,它们彼此包含,因此函数空间在增长。




我们现在要做的是联合选择。我们观察到一个样本,现在希望选择一个函数类,并在该类中选择一个函数,以便很好地拟合我们的数据。




这与经验风险最小化不同。在经验风险最小化中,我们只关注当前函数的经验风险。而现在,我们同时考虑函数空间的容量项。具体做法如下:



我们希望基于数据构造一个分类器 f_n。



以下是我们要考察的项:首先,我们选择一个函数类 F_M。然后,我们考察该类中的函数。我们既看函数的经验风险,同时也看该函数类的容量项。




这并非正则化,因为它不直接涉及我们选择的函数,而是通过我们当前考察的函数空间进行一种更隐式的正则化。



现在,你要做的是联合最小化这两个量。你同时选择索引 M 和函数空间 F_M 中的函数 f,使得以下两项之和尽可能小:



min_{M, f ∈ F_M} [ R_emp(f) + Capacity(F_M) ]



这是一个相当直接的过程,至少在理论上是如此。在实践中很难,因为容量项(如增长系数)通常很难计算。但在理论上可以做到。



这里的容量项来自泛化界,例如,可能是 log( ShatteringCoefficient(F_M) ) / n。



那么,如果你的嵌套函数空间最终覆盖了所有函数(或所有可测函数)的空间,你就可以确信,至少当样本量增长、F_M 也随之增长时,原则上可以实现贝叶斯一致性。




我不想深入证明细节。事实上,只要你有这个容量项,它并不比经验风险最小化困难多少。本质上,你只需要权衡 M 和 f 这两个项,就可以证明它是可行的。

方法二:正则化 ⚖️
现在,我想看看第二种方法——正则化,因为这才是实践中真正发生的情况,并且证明正则化有效更为重要。

再次回顾一下,它是如何工作的?至少在正则化的初始设定中,我们没有这些嵌套的函数空间。我们有的是一个正则化项:λ * Ω(f),其中 λ 是权衡常数,Ω 是衡量函数复杂度的某种度量。



在最简单的情况下,你仍然可以想象类似嵌套函数类的东西。例如,考虑线性正则化项的情况:你进行线性分类或线性回归,正则化器使用你权重的范数。那么你可以说,所有范数小于等于1的函数构成一个空间 F₁,然后所有范数小于等于2的线性函数构成空间 F₂,依此类推 F₃, F₄。这样,你仍然可以构造一个嵌套的函数空间序列。



嗯,这种嵌套是通过这个正则化项发生的。这只是为了建立直觉,并非实践中发生的情况,但通过这种方式,你或许能理解其中的原理。


正则化一致性的证明思路



现在你需要为正则化方法证明一致性。我在这里只给你一个概览,展示它是如何工作的。我非常喜欢这个证明,因为它很优雅,但我不想详述所有细节。




首先,如果你想证明贝叶斯一致性,你需要确保最终所有函数的空间能够逼近你空间中任何想要的函数。也就是说,如果你忽略正则化器,只看所有函数,该空间应该在连续函数空间中稠密。一个这样的空间例子是通用核函数的线性组合。

现在你要做的是考虑一个正则化常数序列 λ_n,其中你驱动 λ_n → 0 当 n → ∞,并且需要以某种足够慢的速率进行,我稍后会讨论。让我们先回到正题。
我们现在做的是设定这个正则化常数。如果 n 很小,我们可能需要较强的正则化,因此正则化常数 λ 应该较大,否则我们会过拟合,测试误差会很差。
但是,随着我们看到越来越多的样本点,最终我们几乎看到了一切,那么我们就可以只看数据点,甚至不再需要使用正则化,因为我们在数据点上测量的结果将非常接近测试误差,几乎没有差别。
最终,我们希望达到一种情况,即我们找到具有最小测试误差的函数。如果这个正则化常数 λ 不趋于0,这意味着即使 n 趋于无穷,也可能存在一个偏移,因为我们选择的函数并非具有最佳风险,尽管从另一个角度看它可能不错,但我们的空间中可能存在一个具有更好风险的不同函数。
因此,为了实现普遍的贝叶斯一致性,你需要随着 n 趋于无穷而缓慢地将这个常数 λ_n 驱动到0。这样,最终当你看到非常多、非常多的数据点时,你几乎忽略了这个正则化部分,只关注训练误差。因为你看到了数十亿的训练点,这没问题,因为训练误差将接近测试误差。
这就是我们这里的情况。我们将这个正则化常数记为 λ_n,因为它依赖于 n,并且需要满足 λ_n → 0 当 n → ∞。
现在,如果你想证明这个陈述,我们知道(这只是我们脑海中的构想,并非显式操作):你定义函数类 F_n,它由所有满足 λ_n * Ω(f) ≤ 常数 的函数组成。观察到如果 λ_n → 0,为了使乘积小于常数,这个 Ω(f) 可以缓慢地趋于无穷。所以,从另一个角度看也是如此:如果你的正则化常数变小,你被允许选择更复杂的函数。最终,如果 λ_n → 0,你也被允许选择一个非常复杂、具有很大正则化项的函数。这只是你需要贯穿证明的一个构造。


现在,你本质上希望回到传统学习理论中已知的东西,即增长系数。现在你选择 λ_n 以足够慢的速度趋于0,使得函数类的 log( ShatteringCoefficient(F_n) ) / n 也趋于0。这个 log( ShatteringCoefficient ) / n → 0 的假设,正是我们之前从增长系数角度实现一致性所需要的条件。



现在的想法是,正则化器在某种意义上也告诉了我们有多少个函数,这现在被转化成了这个对数增长系数。如果你以适当的方式权衡这些常数,将会发生什么?

一方面,这样做确保了我们不会过拟合,因为我们非常缓慢地将 λ_n 驱动到零。然后我们有了 log( ShatteringCoefficient ) / n → 0,我们知道这控制了估计误差部分,这是第一个陈述:估计误差将趋于0,我们不会过拟合。这很好。



另一方面,为什么我们的近似误差会趋于0?如果 λ_n → 0,那么函数类 F_n 将逼近整个函数空间 F。这正是我刚刚说过的:因为如果 λ * Ω(f) 的乘积需要小于一个常数,你求解 Ω(f),那么正则化器被允许趋于无穷。所以最终,函数空间收敛到整个函数空间,然后近似误差也最终趋于零,因为我们越来越接近我们寻找的真实函数——贝叶斯最优分类器。
总结与历史回顾 📜
本节课中,我们一起学习了如何通过结构风险最小化和正则化两种理论方法来控制近似误差,并实现学习算法的一致性(即当样本量无限增大时,模型风险收敛到贝叶斯风险)。
最后,我想以学习理论的简史来结束本次课程。这一切都关乎普遍一致性。在很长一段时间里,人们要么没有考虑这个问题,要么没有工具来证明它。第一个证明存在实际一致学习算法的定理是Stone在1977年关于最近邻分类器的定理。后来在机器学习理论中使用的组合工具(如VC维)也是在20世纪70年代发明的。统计社区也在更早的时候,特别是在回归以及后来转向分类方面,证明了许多结果。我认为,当所有这些学习理论变得真正明晰、工具被磨砺和发展并真正应用于学习理论时,是在20世纪90年代。到那时,许多证明已经建立并记录下来。
从我的角度来看,这种传统的学习理论(如泛化界等)现在已经非常清楚了。社区在研究不同的问题,但这个领域已经相当成熟。当然,可能还存在未解决的问题,但从概念上讲,我认为很多事情已经很清晰了。其他领域,如在线学习,现在我认为也有很多东西被很好地理解了;无监督学习仍然存在许多开放问题;当然,还有关于深度神经网络的大开放问题。
44:统计学习理论回顾奥卡姆剃刀与展望




在本节课中,我们将回顾奥卡姆剃刀原则,并将其与统计学习理论的核心思想进行对比和联系。我们将探讨“简单性”与“函数空间大小”之间的关系,并展望当前深度学习理论面临的挑战。



回顾奥卡姆剃刀原则




在本课程的最初阶段,我们曾讨论过一个例子。我们有一些数据点,并提出了两个可能拟合这些数据的函数。当时我们提到,奥卡姆剃刀原则被许多人认为是一个有用的指导原则。



我们当时有一组黑色的数据点。我们猜测了两种不同的方式来拟合数据:这里的红线是猜测1,这里的红线是猜测2。问题是,应该优先选择两个函数中的哪一个?


当时的论点是,如果没有额外的先验知识,也许第一个函数更好一些,因为它没有做太多“奇怪”的事情。第二个猜测的函数有很多“摆动”。除非有充分的理由相信这些摆动是存在的,否则为什么不简单地使用线性函数呢?因为它看起来更简单。这种寻找简单函数的原则被称为奥卡姆剃刀。






通常这也被称为简约原则。在教科书、维基百科等地方,你经常会看到类似的说法:当从一组其他方面等效的模型中进行选择时,应该优先选择更简单的模型。除非有充分的理由使用更高次数的多项式函数,否则应该始终使用线性函数。


以下是常见的直观论证,试图证明这一点:
奥卡姆剃刀帮助我们剔除那些并非真正需要用来解释现象的概念、变量或结构。通过这样做,开发模型将变得更容易,并且引入不一致性、模糊性和冗余的可能性更小。





当然,从高层次的角度来看,这一切都很有道理。但现在我想回过头来问,这真的是学习理论告诉我们的吗?


学习理论的核心信息





在学习理论中,核心信息是我们关注函数空间的大小。在我们看过的所有泛化界中,没有任何地方涉及函数是简单还是复杂,或者我的空间是否包含简单或复杂的函数。




如果我有一个由10个函数组成的函数空间,问题不在于这些函数是否简单。我只需要计算这些函数的数量,也许需要找出用这些函数可以实现多少种不同的标记。但这与函数是否简单无关,与它是低次多项式函数还是高次多项式函数无关。


现在的问题是,这是否存在矛盾?或者这也许只是看待同一事物的两种不同方式。这确实是个问题。



思考与两种观点


我想请你花几分钟时间思考一下:你认为我们在学习理论中证明的内容与奥卡姆剃刀相矛盾吗?或者并不矛盾?无论你怎么想,都请尝试找到一个好的理由来支持你的观点。



我想提供两种解释。


第一种观点是,这确实与简单性无关。正如我前面提到的,考虑一个例子:你有一个函数类,包含10个简单函数和10个非常复杂的函数。对于估计误差来说,这并没有太大区别。因此,如果我们只是想证明一个泛化界,我们并不真正需要函数简单这个事实。从这个角度看,简单性似乎并不是我们真正追求的东西。





第二种观点则试图调和这两种不同的方法。事实上,由许多简单函数组成的函数空间,其大小通常小于由许多复杂函数组成的函数空间。




我想用一个简单的例子来说明这一点。假设在一个非常简化的设置中,我们只有10个数据点,我们的函数只是二元标记(+1, -1)。原则上,我们的函数空间由 2^n 个函数组成。


那么,我们什么时候会称这些函数简单,什么时候称它们复杂呢?通常,如果一个函数存在易于描述的模式,我们可以描述这个函数的样子,我们就称它为简单函数。例如,你可以说前几个点都是0,然后其他几个点都是+1。或者你有某种方式来描述函数空间的简单性。

反过来,如果你像抛硬币一样随机分配函数标签,可能就没有可以利用的底层模式来描述这些函数,这就会是一个复杂函数。如果你了解一点数据压缩,这就像是数据压缩的核心:一个标记序列是简单的,如果我能用一种简单的方式描述它。这意味着我可以压缩它。如果一个序列难以压缩,我本质上需要写出它在每个特定点上的函数值。但我可以压缩它,并用更简单的方式表达它。



从这个意义上说,如果你有一个可以用少量参数描述的函数类,那么这个函数类往往很小。反之,如果你有奥卡姆剃刀意义上简单的函数,比如低次多项式,那么与之相关的函数空间往往很小。因为如果它太复杂,我们就无法用如此简单的方式描述它。




这里再举一个关于多项式的例子。假设我们有一个变量的多项式,并且系数来自一个离散的有限集合。我们的函数看起来像 Σ a_k * x^k。如果我们看1次多项式,我们只有200个这样的多项式。如果多项式是2次,我们已经有 200^2 种选择,因为我们需要选择两个参数。如果次数增加,我们会有越来越多的参数。因此,我们看到,在这个特定例子中,我们空间中函数的数量随着“复杂度”急剧增长。所以,1次多项式(线性函数)的空间比5次多项式的空间小得多。




关于压缩,我已经举过例子了。一个包含少量函数的空间可以用少量比特表示,也许它只是一个查找表。如果你有5个函数,你可以直接写下来并查找每个函数的作用。现在,如果你有一个由简单函数组成的空间,你也可以用少量比特来表示它,例如,只需编码一个参数。如果你有一个复杂函数的空间,函数可以在所有特定数据点上做任何事情,比如你可以任意标记数据点,那么你就无法压缩这个函数空间,你的函数空间中会有多得多的元素。




当然,这是一个直观的论证,但你可以让它更精确。我在这里不想深入,但这只是为了调和奥卡姆剃刀和学习理论。



结论与联系




那么,我们现在能说什么?我们能得出的直观结论是什么?



- 简单函数的空间通常较小。
- 复杂函数的空间往往较大。 当然,我仍然可以构造一个由10个非常复杂的函数组成的空间,但通常情况下,你不会只挑选五个复杂函数,而是拥有一个充满复杂函数的完整空间,那么这个空间往往会很大。




学习理论告诉我们,应该优先选择小的函数空间,至少如果我们想让估计误差变小的话。



我认为这是幻灯片上的关键原因、关键句子:这通常会导致选择简单函数的空间。因此,如果你尝试观察实践中出现的函数空间,比如线性函数、多项式、核函数,那么当你看的函数在另一种意义上是简单的时候,这些空间往往很小。



在这种情况下,奥卡姆剃刀和学习理论几乎是相同的。如果你愿意,有一个完整的学习理论分支建立在这种压缩原理之上,那就是最小描述长度原则。大约10年前这个理论相当流行,阿姆斯特丹的Peter Grünwald在这个领域有一整本书。


总结对比




那么,底线是什么?我们现在如何比较奥卡姆剃刀和学习理论?
我认为,控制泛化的量并不是函数的简单性,它不直接是函数的简单性,而是函数空间的大小。但是,简单函数的空间往往较小,然后这些空间就是学习的好候选。
我喜欢这样总结:奥卡姆剃刀稍微偏离了重点。我的意思是,它几乎说对了,它说我们需要关注简单函数的空间。学习理论说,是的,这很好,但原因不在于函数简单,不在于你剔除了所有可能不必要的概念等等。原因更多地隐藏在这些统计原理中。而这些简单函数的空间,也是学习理论会认为是好的函数空间。
从这个意义上说,奥卡姆剃刀可能不是使其正确的原则,但当奥卡姆剃刀成立时,或者当函数空间简单时,它们往往能很好地泛化。因此,在这个意义上,奥卡姆剃刀可能是对真实情况的一个很好的初步近似。你需要记住,奥卡姆(Occam)是大约13世纪的一位修道士,这远在统计学或科学原理出现之前。所以我认为它是一个非常好的初步代理标准,但从学习理论的角度来看,它并不完全正确,但非常接近正确。
展望:学习理论与深度学习
现在,这算是学习理论章节的结束。也许让我们简要谈谈展望。显然,我们只触及了表面。你可以有关于学习理论的完整课程,也有关于学习理论的会议,而我们只看了一个非常经典的体系:二元分类,以及一些像支持向量机这样的算法。
这部分学习理论无法描述的一个大事是为什么深度网络能工作。这对学习理论领域的许多人来说一直是个谜团。大约在2012、13、14、15年,人们开始意识到神经网络有多好,同时也发现标准学习理论无法应用于这类算法。

以下是几个原因,当然,关于这个话题我可以再讲一整节课,但我只想给你一些展望。

你可以证明的是,由深度网络诱导出的函数类具有非常高的容量。如果你尝试计算深度网络的打散系数,它总是 2^n。换句话说,你可以训练一个神经网络,给定一些图像,你为图像分配随机标签,并且你可以训练神经网络完美地拟合这些随机图像。事实上,这在2017年左右的一篇论文中已经做到了,我认为是Joshua Benjio和其他作者完成的,论文标题类似“我们需要学习理论的新工具”,因为看,深度神经网络可以拟合我放在数据集上的所有标记。这是对理论上已被证明的事情的实证证明:神经网络背后的函数类容量如此之大,以至于所有标准学习理论给出的界都是平凡的,它们不会收敛到零。



特别是,在实践中,深度网络被训练到完全过拟合数据。这不像在机器学习早期你会做的事情,你甚至可能真的停止你的算法。我的意思是,即使你的算法已经达到训练标签正确,你可能仍然继续训练你的算法。显然,性能仍在提高。所以,从学习理论的角度来看,我们完全在做错误的事情:我们过拟合了,特别是对这个特定的数据集。但尽管如此,这些深度神经网络确实很好,在许多情况下,它们确实能很好地泛化。



所以问题真的是:这里发生了什么?



我想说明的一点是,这并不意味着标准学习理论是错误的。这只是意味着,我们用于标准学习理论的工具,并不是解释深度网络为何工作的正确工具。如果你尝试将学习理论的工具应用于深度网络,你会得到平凡的界。然而,这并不告诉你神经网络不能工作,你只是需要一个不同的工具箱。

在过去的五年左右,学习理论领域的许多人都在研究这个领域,这是一个非常开放的领域。如何从理论角度证明,你需要什么样的学习理论来理解为什么神经网络能工作?我认为,这不仅仅是因为人们喜欢证明定理,这里有一个非常根本的问题。理解导致神经网络学习的原理可能会产生许多积极影响:它可能首先向我们展示它们在哪些情况下学习,也许在哪些情况下不学习;也许一旦我们知道使这些东西学习的关键标准是什么,我们就可以再次简化神经网络;也许其他东西遵循类似的原则,但实现起来要简单得多。因此,许多人试图理解这一点。

我认为共识是,目前还没有解决方案,所以这确实是一个广泛开放的研究领域,至少在2020年是这样。也许明年有人会找到突破,但现在仍然是开放的。



我认为该领域的一个关键信念是,我们优化这些算法的方式(例如随机梯度下降)在神经网络为何工作或不工作方面起着重要作用。有很多有趣的结果。例如,有很多结果表明,在某些情况下,可能甚至没有那么多局部最优,每个局部最优已经是一个全局最优。这可能解释了为什么神经网络在随机梯度下降方面不会陷入局部最优,而是会陷入一个非常好的、可能是全局最优的点。


也有更多从统计学角度出发的观点。我只想给你一个我喜欢的论文的预告,那就是Mikhail Belkin和其他合著者去年在PNAS上发表的关于双下降曲线的论文。我想简要解释一下这篇论文的关键思想。





在左边的图中,x轴是函数空间的容量(即函数类有多大),y轴是真实误差(风险,潜在的测试误差)。这和我们课程开始时说的完全一样,你有一个U形曲线:一开始,如果函数空间太小,你会严重欠拟合,因为你的函数类甚至没有拟合数据的潜力;然后,如果你增加函数类的大小,它会变得更好,因为你可以有更小的近似误差;但最终它会再次增加,因为你的估计误差变大,因为你有可能过度拟合数据,以至于最终无法泛化。这是机器学习理论的传统观点。


这里的虚线可能是训练风险。如果你训练一个分类器,当然你可以训练得越来越多,得到更小的训练误差,我的函数类越高,训练误差就越小。诀窍是,你可以在训练误差为零时停止训练,因为那时你已经处于过拟合状态,所以你需要在某个点之前停止,秘密总是:什么是好的停止点?


这是传统的观点。现在是新的观点。在这张图的左边部分,我们看到的和之前完全一样。但现在我们看到,如果我们继续训练我们的网络,如果我们继续增加函数类,会发生什么。观察结果是,首先有这个U形,但然后有一个特定的点。例如,在神经网络中,如果你继续训练,你会越来越过拟合。然后突然间,测试误差再次下降。这完全是出乎意料的。在学习理论中,你会说,只要你延长x轴,它就会单调增加。但在实践中观察到的并非如此,这现在被称为双下降曲线。这在几篇论文中都有描述,特别是这里引用的这篇。


所以你首先有第一次下降,然后是第二次下降,即双下降。这里发生的是Mikhail Belkin称之为插值区域,因为你有一个真正插值数据的函数类,意味着你的训练误差为0。插值是指你试图找到一个恰好穿过给定数据点的函数。这就是神经网络中发生的情况。然后在实践中可以观察到,对于某些算法,你有这种W形下降。




当然,这并不是对你可能提出的任何算法都成立。有很多算法,这条曲线会持续上升。但有些算法,其中包括深度网络,你可以观察到这种现象。



现在的想法是:这里发生了什么?在这个区域,函数类的大小是指数级的。学习理论会告诉你,如果你只是在这个特定函数空间区域进行经验风险最小化,并选择任何训练误差为0的函数,那么你就会过拟合。这个说法仍然成立。


但现在发生的是,当然,像深度网络这样的函数不会出去查看函数空间,并以某种方式进行经验风险最小化,即它只是选择任何训练误差为0的函数。因为容量如此之大,所以有很多很多训练误差为0的函数。现在,深度网络使用特定的优化算法(随机梯度下降,带有许多启发式方法等)来选择函数。目前的一个猜想是,这种优化工作的方式通过某种魔力,使得深度网络选择的函数仍然能够泛化。



所以这与学习理论并不矛盾。学习理论只是说,外面有很多函数,如果你选择任何训练误差为0的函数,它们中的大多数会非常糟糕,我们无法泛化。现在的说法是,是的,这是真的。但成功的算法有某种特定的方式来选择函数,而且目前还很不清楚这种方式是什么。但出于某种隐藏的秘密,它们设法选择了一个训练误差为0且性能良好的函数。



因此,从容量的角度来看,即使空间具有巨大的容量,算法实际考虑的函数空间的实际容量要小得多,因为直观上,通过随机梯度下降,你无法达到这些函数中的许多,它只是你的空间中可能被随机梯度下降选择的一小部分函数子集。这就是它可能仍然有效的原因。



对于一些特定的函数空间和优化算法,至少在一些简化的情况下,已经证明了一些初步结果。现在,当然,问题是,你能为深度网络证明这一点吗?或者为哪些深度网络证明?真正控制它的量是什么?真的是我们使用随机梯度下降的关键吗?或者真正关键的要素是什么?就像在支持向量机的统计体系中,关键之一是核的边际,如果你有一个通用核,那非常重要。那么,真正使这些网络成功的关键要素是什么?



所以这是一个非常非常有趣的研究领域,而且仍然非常开放。



课程总结
在本节课中,我们一起回顾了奥卡姆剃刀原则,并将其核心思想“选择简单模型”与统计学习理论的核心“控制函数空间大小以保障泛化”进行了深入对比。我们发现,虽然两者出发点不同,但在实践中,简单函数的空间往往较小,因此奥卡姆剃刀可以看作是学习理论的一个良好近似和实用启发式原则。





最后,我们展望了当前学习理论在解释深度学习成功时所面临的挑战。传统的基于容量的理论无法解释深度神经网络的泛化能力,而“双下降曲线”等现象指出了优化算法在隐式选择函数时的重要性。理解深度学习的泛化原理,是机器学习理论一个活跃且开放的前沿领域。
45:机器学习与社会:总体辩论 🧠⚖️






















在本节课中,我们将要学习机器学习技术在社会应用中所引发的广泛讨论。我们将概述公众辩论中的核心议题,包括机器学习的潜在益处与风险,并探讨作为研究人员应如何参与和思考这些社会性问题。





















在之前的许多课程中,我们一直在讨论机器学习的技术层面。我们研究了算法,探讨了分类、回归、聚类等机器学习问题,并讨论了如何解决这些问题、这些问题的特点以及我们能提供何种保证。











现在,我们希望转向一个完全不同的主题:当机器学习被部署到社会和日常生活的应用中时,会发生什么?
你们中的许多人可能已经意识到,关于人工智能(或更具体地说,机器学习)在社会应用中的潜在利弊,存在着一场非常激烈且批判性的辩论。如果你打开报纸,会看到许多报道,有些描述了伟大的突破,例如在医学领域出现可能拯救生命的新AI应用;另一些则可能是关于AI使用的非常负面的故事;还有一些是温和的报道。人们确实在批判性地思考:AI的好处是什么?坏处是什么?作为一个社会,我们想要什么,又不想要什么?
我认为,作为机器学习研究者,参与到这场辩论中,并形成自己对哪些应用是好的、有用的,以及哪里可能是我们不应跨越的红线的看法,是极其重要的。同时,我们也需要积极参与到社会的讨论中,因为我认为,对于非计算机科学家或机器学习专家的普通人来说,真正理解机器学习的能力以及其局限性是非常困难的。



为了向你们展示这场辩论的一些方面,我打算用接下来的几节课来讨论几个主题。首先,我想概述一下这场总体辩论,即那些你可能被问到的关键问题是什么。然后,我将讨论算法公平性,这是一种技术上的尝试,旨在至少部分地纠正机器学习的一些不良应用。我还想谈谈机器学习对能源的使用,因为这也是一个经常出现的话题。最后,我们还将讨论可解释性。这些都将在接下来的几节课中进行。












现在,我想从这场批判性辩论开始。首先,我们来看看在机器学习与社会这一背景下经常被讨论的普遍议题是什么。我没有在这里列出参考文献,如果你需要,可以访问我的网页。我曾举办过几次关于AI伦理、机器学习伦理、AI哲学的研讨会,那里有非常详尽的文献列表。你可以查看我过去讲座的教学页面,找到2017年和2018年的两次研讨会,并查阅其中的文献列表。













我现在要做的是,仅仅强调这场辩论的某些方面。因此,幻灯片内容并不全面,许多幻灯片上没有太多文字,因为我试图口头解释。这绝对不是一场完整的辩论,而只是对可能出现的各类问题的一个引子。





当涉及到关于AI或机器学习在社会中的辩论时,你首先会注意到的一个重要现象是,在这些公开辩论中,人们总是使用“人工智能”这个术语,而不是“机器学习”。我认为这是因为“人工智能”听起来比“机器学习”酷得多,也显得更花哨。但我觉得这也掩盖了许多方面,特别是它暗示了所有算法都是智能的。这至少是我个人不相信的观点。因此,对我来说,在公共环境的辩论中,始终谈论“机器学习”是很重要的,因为它是我们解决某些问题的技术方案,但它与智能无关。如果辩论变得过于激烈,人们开始想象机器人接管世界,那么谈论“机器学习”而不是“人工智能”或许有助于缓和一下论调。这只是我个人的观点。我希望你们在看完所有这些幻灯片后,能形成自己的观点。
那么,机器学习有哪些潜在的好与坏的用途呢?我想你们中的大多数人可能都知道,但也许在开始这场辩论时,思考一下哪些是好或坏的应用仍然是有帮助的。
以下是机器学习的一些有问题的应用,至少我认为大多数德国人会认为这些应用是不可取的。我知道在不同国家情况可能不同,但我只能代表德国人发言,我在这里是德国人,所以我认为这是我们可能会相信的观点。



- 虚假视频和虚假新闻:你可以使用深度网络生成几乎无法与真实视频区分的虚假视频,并编造关于政治家从未说过的话的新闻故事。如果最终你无法再信任新闻页面,或者人们试图扰乱你获取的标准新闻,这当然是对民主的威胁。
- 用户画像与信息茧房:这是经常出现的关键词之一。例如,当你在互联网上,在Facebook上输入搜索查询时,你只会得到你可能喜欢的那种结果。因此,很容易陷入一个信息茧房,在那里你只看到自己的观点,并认为这就是全部,但实际上外面还有很多很多不同的观点。你可能会被完全误导的帖子所困,这些帖子只来自某个非常小的社区,而大多数人想的完全不同,但你不会注意到,因为你再也看不到这些结果了。
- 社会信用评分:正如在中国所使用的那样,至少在德国,我们会发现这是非常不可取的。这是一种监控技术,试图观察人们去哪里、做什么,然后本质上根据他们的行为来提升或不提升某些人。这绝对是我们在德国不愿意容忍的事情。
- 预测性警务:这是一种技术,你挖掘所拥有的不同数据集,以帮助警察或情报部门在社区中部署更多警力,因为你认为该地区可能发生更多犯罪;或者你可以试图跟踪某些人,因为你认为他们最终可能是恐怖分子。这可能是一种在许多国家使用的技术,但问题在于红线在哪里,什么是允许的,什么是不允许的,这至少在德国是一场激烈的辩论。
- 保释决策的自动系统:保释在德语中意味着“审前释放”。有一个自动系统,当某人因某项罪行被指控入狱后,来到法官面前,法官需要决定是将其保释以等待审判,还是需要继续关押在监狱中。这类目的会使用自动工具。当然,这些工具会对人们的生活产生巨大影响,因为本质上,如果工具自行决定,它们将决定某人是否从监狱释放。这是一个我们许多人会认为非常成问题的决定,将这样的决定交给一个自动系统。
- 自动武器:这当然是大多数德国人不愿意拥有的东西。但现实是,许多国家正在开发或已经拥有这类武器,而AI肯定参与其中,例如,你需要进行图像识别来确定射击目标。











所以,这些都是AI的用途,至少它们带有相当负面的含义。现在,你可以开始对每一点进行更细致的辩论,但我不想在这里这样做。我只是想提及这些关键词,因为如果你参与这样的辩论,这些话题都会出现。



当然,我在上一张幻灯片上展示的是机器学习那种极端负面的含义。也有一些更温和的应用,许多人——我的意思是它们在某些地方被使用,但许多人仍然对这些系统有强烈的保留意见。






- 大学录取:你有某个人的简历和用户资料,你想决定是否录取这个人进入某所大学。然后你计算这个人整体成就的自动分数,这个分数试图预测你是否会成为这所大学的成功人士,然后基于这个预测,你被录取或不被录取。
- 工作申请的自动筛选:正如在许多大公司中使用的那样。
- 信用评分:你有一个自动系统,我认为至少在德国我们有这个,它被称为“Schufa”计算机评分,根据你过去的金融交易记录来判断你是否值得信赖。然后基于这个分数,如果你申请新的信贷,你会得到或得不到。当然,这个分数至少是试图从过去的数据中学习,来预测你个人是否会偿还贷款。这又是一个决定,也许不是生死攸关,但仍然是一个重大决定,关乎你是否能获得贷款来买房。问题是,这样的决定是否应该由机器做出。











如果你转向技术方面,当然也有很多机器学习的应用会引发问题,比如自动驾驶汽车。德国是一个充满汽车的国家,以其汽车工业为傲,当然这些公司都在致力于自动驾驶汽车。另一个问题是,如果我们拥有所有这些自动驾驶汽车,会发生什么?有许多明显的伦理问题,比如如果发生事故,谁负责?还有所有这些讨论,比如“道德机器”,我们稍后会谈到一点,就像在这些分类场景中,你真的不知道汽车处于什么情况,已经无法做任何有用的事情了,你必须决定是向左开撞死一个行人,还是向右开撞死一个骑自行车的人。汽车应该做什么决定?程序员如何告诉汽车它应该采取这个决定?
这算是负面或批判性的一面,但当然,AI和机器学习也有积极的一面。
- 医疗领域:我认为机器学习可以产生非常积极影响的明显领域之一是医疗领域。有很多例子,我只想强调一个,人们制作了一个可以检测皮肤癌的小应用程序。假设你住在某个偏远地区,也许在一个医生不多的国家,然后你想,“哦,我手臂上这块奇怪的皮肤是什么?可能是皮肤癌吗?”你用移动设备拍下这块皮肤的照片,发送到应用程序,应用程序会告诉你这很可能是皮肤癌,或者很可能不是。这类应用程序也有很多伦理问题,但潜在地,它们也有可能实现一些好的事情。我们需要谨慎地部署它们。我知道这里有很多需要考虑的事情。但原则上,我认为这是我们会说至少是试图用AI做一些好事的积极尝试。同样,对于个性化医疗等,你需要一个自动工具来建议给某个病人使用某种药物组合,这对人类来说太复杂了,但也许一个自动系统和机器学习算法可以解决这个问题。
- 自动机器翻译或语音合成:我认为大多数人会同意这是机器学习取得的一件积极的事情。几年前还没有任何有用的机器翻译服务,现在至少在德国,如果我想把一段文本从德语翻译成英语,我会去DeepL,粘贴在那里,它几乎是完美的。它出来的效果如此之好,真是令人惊讶。同样,假设你去某个你不会说当地语言的国家度假,也许我去日本,我一点日语都不懂,我想问路,然后我可以用德语对着手机说话,手机会把它翻译成日语,然后读出日语问题。这是一个很酷的应用,它确实实现了在以前不可能的地方进行交流。
- 科学应用:我认为至少我自己觉得非常积极的是,如果你想想科学中的应用,比如计算机科学之外的许多其他科学领域,事实上大多数其他科学领域都不是计算机科学,它们产生大量数据,通常如何评估这些数据并不那么明显。可能像物理学中那样,他们有大型对撞机,产生海量数据,需要从中找到有趣的事件。你可以尝试为此目的使用机器学习。同样,在地球科学等其他领域,你也有很多数据,你可能也有模型,但现在你可以将模型与机器学习结合起来,对某些事情进行预测。
- 流程优化:机器学习至少有可能产生一些积极影响的最后一个领域是流程优化。你可以想象一个由某种机器算法优化的生产线,因为你可以预测哪种机器可能很快就会出故障,所以你可以在它坏掉之前修理它。你也可以在能源领域,例如,你可以预测德国北部将有多少风能,也可以预测德国其他地区在接下来几分钟内将使用或需要多少电力,然后你可以以一种更高效的方式输送电力。如果你有这种智能电力设备,你也可以关掉洗碗机,因为如果现在每个人都做饭导致用电高峰,你可以预测到这一点并关掉你的洗碗机,因为也许它现在完成还是10分钟后完成并不那么重要。




所以,这些都是可能对我们生活和社会产生良好影响的应用。














现在我们已经看到,机器学习有这些潜在的非常坏的影响,也有这些潜在的非常好的影响。现在你需要定位自己。这里还有更多关键词:能源,我已经提到了一点,但不是在当前这个背景下。当然,机器学习也使用能源,如果你想想所有这些,比如我们大楼里已有的计算集群,然后在更大的规模上,如果许多机器学习研究者都在许多GPU上进行训练,这会消耗大量能源,我们稍后会讨论这个问题。所以问题真的是:考虑到气候危机,我们需要不惜一切代价减少能源使用,我们能否负担得起?或者我们是否愿意负担得起?我认为这是我们始终需要问的问题。这是一个决定。









好的,在关于人工智能的辩论中,你总会听到的最后一点,特别是当你谈论人工智能而不是机器学习时,是超级智能的方面。那么,在我们不远的未来,是否可能出现智能机器人,它们可能在积极的愿景中帮助我们,或者另一方面,可能接管人类甚至毁灭人类?这些智能存在,机器人,无论你想怎么称呼它们,我们能创造它们吗?或者我们正在创造它们吗?这也是一个经常出现的问题,当然会引发许多情绪和猜测。













我为什么要告诉你们所有这些事情?你们正在上一门机器学习课程,你们是学生,你们年轻,你们将参与这些辩论,特别是在图宾根,但我想在世界其他地方也是如此。我认为,我们作为研究者参与到这些辩论中,真的非常重要。我们不能仅仅让记者和政治家来谈论人工智能或机器学习。我们是这里的专家,我们需要与他们交谈,参与讨论,试图了解人们的恐惧是什么,我们能否为此做些什么,或者也许有很多方面我们无能为力,或者我们需要做出一些决定。我的意思是,这是一场需要在机器学习研究者和整个社会之间进行的辩论。













以下是一些你可能被问到的问题,如果你参加小组讨论,或者甚至只是在你的合租公寓里,你和一些艺术学生合租,晚上你们进行讨论,那么这类问题可能会出现。











- 鉴于机器学习可能被用于所有这些负面的事情,你如何还能证明从事AI或机器学习工作是合理的? 然后你可以插入当前与你交谈的人心中最喜欢的负面事情。你会遇到这个问题,至少在公共场合,最好在发生之前有一些答案。
- 鉴于存在气候危机,而AI消耗如此多的能源,你如何还能证明从事AI工作是合理的? 我们如何能负担得起?我们需要降低我们的能源消耗。
- 更极端的问题是:我们甚至还能控制AI研究吗? 超级智能会发生吗?我们甚至能阻止它吗?或者它会自动发生?研究是不可阻挡的吗?它已经被发明了吗?我们可能只是不知道?或者它将被发明?我们能控制它吗?这些问题也会出现。





特别是在图宾根,关于研究和公共领域与公司研究之间的紧张关系,也有很大的讨论。在图宾根,我们有一个叫做“网络谷”的倡议,这是一个将公共研究和公司结合起来的大型倡议。你可能被问到的问题是:你认为在公共研究机构任职的同时为一家工业公司工作,这是合理的吗? 或者像亚马逊或博世这样的工业公司有第二份附属关系?这类问题背后的论点通常是,机器学习研究,即使是由大学公共领域支付的,也主要受工业利益支配,研究不再存在,所有研究者都被工业界收买,研究对他们重要的问题,但可能不是对社会重要的问题。本质上,研究自由已经丧失。这类假设是你在图宾根的辩论中会遇到的东西,这类事情会出现,同样,你需要对这些领域形成自己的看法。我有我的观点,我不会在这些视频中陈述它。但重要的是你要形成自己的观点。







所以,这就是幻灯片的内容。你需要形成自己的观点。正如我所说,我现在要给你一些关键词,说明将会出现哪些主题。我已经提到了一些介绍性的主题,现在我想更详细地探讨一下。但可以肯定的是,我的幻灯片不提供答案。我不想说服你接受我所有的观点,你需要基于此形成自己的观点,我只是想给你关键词和文献提示,这样你就可以开始深入研究,并最终希望形成自己的观点。











- 算法伦理:这是一个原则上已经存在较长时间的领域,不仅仅是为AI研究或AI辩论而发明的,但现在该领域的主要话题是AI研究。算法伦理领域处理的问题是:哪些应用适合使用算法,哪些可能不适合,而需要人类来做决定? 信息过滤就是这样一个领域。或者,例如,基于一个人的图像来检测其性取向,或者至少尝试这样做,这是可以接受的吗?下一个问题是:我们能否对抗算法中的偏见? 我们将在下一节课中看到,许多机器学习算法有非常强的偏见,因为这些偏见存在于数据中。我的意思是,偏见有很多原因,但其中之一是因为偏见存在于数据中。例如,如果你分析文本,当然会发现过去50年来文本中存在的刻板印象,我们稍后会讨论这篇题为“Man is to Computer Programmer as Woman is to Homemaker”的论文。问题是:我们能否对抗所有这些存在的偏见? 下一个领域总是关于决策的透明度。如果我们有一个算法,它做了一个影响我们自己的决定,我想知道为什么。如果银行不给我贷款,我想知道银行给我一个不给我贷款的理由,这个理由最好不要是“因为你是女性”。所以我们需要一个系统,如果我们想部署这些系统,同时能够生成解释,说明系统为什么会做出某个决定,这非常重要。当然,如果你只想到神经网络或带有高斯核的支持向量机,这并不那么明显,如何给一个非机器学习专家解释系统为什么会得出某个决定。但这是算法伦理的一个方面。最后一个总是非常重要的问题是:谁对算法做出的决定负责? 谁负有责任?例如,在自动驾驶汽车的情况下,这确实是一个关键问题。如果发生事故,谁负责?是汽车吗?但汽车不是人。是程序员吗?如果是,是哪个程序员?是部署汽车的公司吗?我的意思是,或者没有人负责?所以这些都是非常困难的问题,当然需要回答。研究这类问题的领域就是算法伦理领域。
- 道德机器:作为外行,你总是认为道德机器是试图将一些伦理规则编程到汽车中。正如我在这张幻灯片上所写的,你能在这些机器中嵌入一些道德价值观吗? 如果能,如何嵌入?以及嵌入哪些价值观?通常,这个领域最终会陷入这些奇怪的“电车难题”情境,这些情境在哲学中已经被讨论了100年,但现在在自动驾驶汽车的案例中又被重新讨论。典型的情况总是汽车遇到一个关键的交通状况,事故不可避免,汽车需要决定,例如,是应该撞死三位老太太,还是应该撞死一个小孩,因为如果它向左开,一种情况会发生;如果它向右开,另一种情况会发生。那么它应该怎么做?我总是觉得这些辩论有点可笑,因为在哲学中也没有解决方案,我们自己也不知道如何解决这个问题。但这仍然是一场经常发生的辩论,如果有人问你对此有何看法,你应该有一个可以陈述的观点。
- 经济与公共福利:当然,机器学习已经并将对经济和公共福利产生影响。被大量讨论的一件事是,机器学习可能会让许多人失去工作。例如,如果卡车司机被取代,因为突然间我们有了安全的自动驾驶卡车,那么所有这些卡车司机就没有工作了。这也可能很容易发生在呼叫中心的人员身上,因为现在有了自动语言系统,至少在某种程度上,你可以自动化与机器交谈,而不是与人交谈。但这也可能发生在医疗助理或律师身上,因为在所有这些领域,至少对于这些人员需要做的标准常规事务,都有软件解决方案。现在问题当然是,如果发生这种情况,我的意思是,所有这些人都失去工作了吗?如果是,速度有多快?如果这一切明天就发生,我们将面临一个巨大的问题。例如,如果10年后没有卡车司机了,那么这些人应该做什么?如果这在未来50年内发生,也许这不是一个大问题,因为我的意思是人们会变老,一些卡车司机会退休,也许之后不会有那么多新的卡车司机加入。所以这完全是一个时间尺度的问题。问题是,这是一个活跃的辩论,我的意思是,这场辩论已经进行了近10年。但问题是,你真的认为会发生什么? 当然,另一个方面是,我的意思是,关于经济当然有很多很多方面。当然,所有好的事情,比如在图宾根,人们非常关注汽车工业,你能促进汽车工业吗?因为许多工作依赖于汽车工业,当然机器学习可能有助于推动那里,这至少是一些人可能觉得有吸引力的东西。另一件事是,再次,如果人们失去工作,谁来支付所有这些税款?在极端情况下,如果许多人失去工作,这可能意味着从长远来看,你也可以将其视为一个美好的场景:机器人为我们做所有的工作,但那时谁来支付税款?国家需要建学校的钱从哪里来?所以,关于潜在的AI使用会带来什么后果,对经济和公共福利会发生什么,有所有这些讨论。这只是再次强调这场讨论的存在。如果你感兴趣,也许可以查看我之前提到的文献列表。
- 科学哲学与技术决定论:另一个大问题总是关于科学哲学和技术决定论的问题。这总是像这样的问题:我们真的能控制AI研究吗? 这实际上是困扰许多人的事情,这种想法认为,地平线上可能出现智能机器人,我们甚至可能无法阻止使它们成为可能的研究。这是一个对许多人来说非常重要的问题。那么,我们能控制AI研究吗? 如果我们在某个时候得出结论,比如你作为AI研究者,你需要形成自己的观点,什么是红线,我们不应该跨越。从事AI工作是否可以?如果不行,那么你可能会停止,但你的邻居可能不会停止。那么,作为一个社会,如果我们得出结论认为我们应该在这一点上停止,有一条我们不应该跨越的红线,我们能做到吗?同样,这是一个非常重要的话题。这些辩论在许多科学领域都曾有过,我们在核武器领域有过,在基因编辑技术领域有过,抱歉我忘了那个词,在生物信息学领域。这些都是历史上也存在过的辩论,有200年前的例子,你想想有人发明了某样东西,社会是否必然需要采纳它?这就是关于技术决定论的问题:我们能停止AI研究吗? 同样,如果你想深入了解这场辩论,请查看文献列表。
- 未来场景:当然,在这种背景下也总是被讨论的是,假设AI研究继续下去。那么你可以提出不同的场景。可能有一个伟大的场景,我们说在不久的或更远的未来,有智能机器人,它们为我们做所有的工作,我们根本不需要工作,我们都获得无条件基本收入,我们可以把时间花在我们喜欢的事情上,我们可以和家人在一起,等等。我们拥有无限的自由时间,机器人将做所有让我们烦恼的事情。这是非常积极的一面。消极的一面当然是,智能机器人将接管世界,根据你想走多远,人类可能成为奴隶或被压迫,甚至人类可能被消灭。即使这些非常极端的场景可能不会发生,仍然可能因为机器人在做许多事情上如此出色,我们失去了生活的意义。因为机器人更好,它们当然可以更安全地开车,它们可以比我们更好地做家务,但这甚至发生在艺术或音乐领域。我的意思是,它们可以生成绘画或创作音乐,编写音乐作品,而且它们做得比我们更好。那么,我们为什么还要存在于世界上呢?当然,这是两个极端点,但这就是你将在辩论中遇到的。同样,如果你想了解更多,我敦促你查看文献。
- 监管:下一个问题,更像是政治问题,也可能是社会问题:我们应该并且能够监管AI的使用吗? 那么,什么是好的监管?例如,如果你考虑人脸检测的例子,在哪些情况下我们认为人脸检测可能是可以的?有这样的情况吗?还有其他我们认为不可以的情况吗?如果我们有这种区分,我们如何制定法律并实施一些监管,以禁止某些关于人脸检测的事情,并允许其他一些事情?然后,这种监管应该在哪个层面发生?应该只在德国或你自己的国家吗?也许应该在欧盟层面,如果你在欧洲?应该是全球性的监管吗?那么,会是哪些议会来推动这些监管?这些监管应该有多大的约束力?只是举一些例子,让你思考那些在监管某些AI使用方面似乎成功的过程。我认为一个好的例子是欧洲的《通用数据保护条例》,它至少规定了关于解释权等内容。在我看来,这改变了很多AI研究,也改变了机器学习研究,它推动了可解释机器学习领域的发展,因为突然间公司必须遵守这种解释权。当然,我的意思是,并不清楚如何做到这一点。所以这促进了这个领域的大量研究。另一个例子是,例如,旧金山在2019年禁止其警察和其他机构使用人脸识别系统。这是一个非常本地化的解决方案,但也许比没有好。再次,我认为这是一个非常重要的话题。如果你对政治感兴趣,如果你想塑造你生活的社会,理解这种监管会是什么样子,以及如果你认为这种监管是必要的,或者你想影响它的方式,你需要与哪些人交谈,这可能是重要的。
- 总结与呼吁:再次,我想我已经说过很多次了,但你可能注意到,这对我来说真的非常重要。我认为你们需要思考所有这些问题,因为AI将改变世界,这是毫无疑问的。它已经带来了一些变化,还有更多的变化即将到来。你们将参与其中,如果你们工作,我的意思是,即使你们在计算机科学领域工作,但特别是在机器学习领域工作,你们将被问到:你们在这其中的角色是什么?你们认为这是一个好的角色还是坏的角色?你们的责任是什么?你们如何履行你们的责任?在图宾根尤其如此,我们也有强烈的公开辩论,但我认为在世界其他地方也是如此。所以我认为你们思考这些问题并形成自己的观点是很重要的。我真的很遗憾这是一门在线课程,而不是真正的讲座,因为我本来很乐意在讲座中与你们在小组中更详细地讨论所有这些问题,但这是不可能的。所以你们可能只是想这样做,比如在家里和你的同事谈谈。但要努力形成自己的观点。我认为这真的非常重要。























本节课中,我们一起学习了机器学习技术在社会应用中所引发的广泛辩论。我们概述了公众讨论中的核心议题,包括潜在的益处(如医疗、翻译、科学)与风险(如虚假信息、监控、偏见),并探讨了算法伦理、道德机器、经济影响、技术决定论和监管等关键概念。最重要的是,我们认识到作为机器学习的研究者和学习者,积极参与社会讨论、形成独立见解并承担相应责任是至关重要的。
46:机器学习与社会中的(不)公平性 🧠⚖️





在本节课中,我们将要学习机器学习算法在社会应用中可能产生的不公平性。我们将通过多个现实案例,探讨偏见如何产生、为何难以避免,以及公平性定义的复杂性。
上一节我们介绍了机器学习在社会中的一般性讨论。本节中,我们将聚焦于一个核心议题:机器学习算法的公平性。
一个重要的参考资料是 Solon Barocas、Moritz Hardt 和 Arvind Narayanan 的在线书籍草稿《Fairness and Machine Learning》。在后续内容中,我将称其为“公平ML书籍”。此外,在具体的幻灯片中,我也会引用其他相关文献。
为什么机器学习会不公平?🤔
让我们从一个简单的案例开始:信用评分。机器学习系统被用来预测某个人在银行申请贷款时是否会按时还款。
我们假设构建一个简单的线性模型。每个人由一组特征描述,例如:收入、年龄、教育程度、住址、子女数量等。我们使用历史训练数据来训练一个线性模型,以预测某人是否会还款。


结果发现,个人的邮政编码(住址)与其是否会还款的事实高度相关,因此它是一个强有力的预测因子。



这意味着,仅仅因为你居住在一个平均收入较低的地区(由邮政编码指示),你获得贷款的难度就会增加。更严重地说,你可能需要为你的“不良”邮政编码做出补偿,例如,需要比居住在富裕社区的人拥有更高的收入。


这里已经可以看到系统存在某种不公平性:仅仅因为你所在的社区平均收入较低,你就会处于不利地位。当然,这可能导致种族歧视。例如,在一个城市中,低收入人群(通常是黑人)集中居住在某个社区,而白人居住在另一个富裕社区,那么黑人仅仅因为“错误的”邮政编码就会受到歧视。




信用评分案例中还存在许多其他问题,我们稍后会再讨论。
平权行动:公平性的另一面 ↔️
信用评分的例子中,我们认为肤色不应影响贷款决策。但这里有一个相反方向的例子:平权行动。

2014-15年,哈佛大学发生了一起诉讼案,学生抱怨其录取规则高度不公平。引用如下:“种族在录取决定中扮演重要角色。考虑一个亚裔美国男性申请者,他并非弱势群体,且其他特征使其拥有25%的录取概率。”




仅仅将申请者的种族改为白人,而保持其他所有特征不变,其录取概率会增加到36%。改为西班牙裔,录取概率增加到77%。改为非裔美国人,录取概率增加到95%。

他们的论点是:一个人由特征向量描述。如果你只改变种族这一个特征(可能只是100个特征中的一个),就会显著改变该人的录取机会,他们认为这不公平。




更形式化地看,论点是:在给定其他特征条件下,如果你是亚裔美国人,被录取的概率小于你是白人的概率,而后者又小于你是西班牙裔或非裔美国人的概率。


提出诉讼的人认为这非常不公平。但从另一个角度看,我们可以称之为公平。这实际上是一场关于平权行动的辩论,类似于我们经常讨论的性别失衡问题,例如是否应强制公司让更多女性担任高级管理职位,或者是否应推动大学或公司提拔少数族裔。
哈佛大学对此的回应是:如果哈佛停止将种族作为录取决策的一个考量因素,并采用原告建议的种族中立方案,其结果将是一个无法实现哈佛所追求的多样性和卓越性的班级。
他们明确表示,他们确实希望将种族纳入考量。这与信用评分案例相反,在信用评分中,考虑种族可能对黑人不利,因此可能不公平。但在这里,哈佛希望明确考虑种族,因为他们希望对黑人群体采取平权行动,因此不能忽略个人的种族。
2019年10月,法官裁定哈佛的做法是合法的。引用如下:“与最高法院的要求一致,哈佛已证明其在录取决定中将种族作为一个加分项或考量因素。哈佛已证明,不存在可行且可用的种族中立替代方案,能在保持其学术和其他形式卓越标准的同时,实现足够多元化的学生群体。根据法院首选的模型,处境相似的亚裔美国人和白人申请者之间的录取机会没有统计学上的显著差异。”
因此,结论是,在这个案例中,平权行动是合法的。这恰恰展示了关于公平性的一般性辩论。在机器学习中,可能存在许多隐性偏见(如信用评分案例所示),也可能存在系统设计者有意为之的显性偏见。但在所有这些情况下,你都需要思考这是否真的是你想要的结果。
更多不公平性案例 📋
以下是更多机器学习可能产生不公平性的案例。
亚马逊配送案例:亚马逊使用数据驱动系统来确定提供免费当日达服务的社区。2016年的一项研究发现,这些社区的人口构成存在显著差异。在美国许多城市,白人居民生活在符合条件社区的可能性是黑人居民的两倍以上。这有点像信用评分中的邮政编码例子。亚马逊通过某种方式(具体不详)决定在哪些社区提供当日达服务,结果发现这主要发生在白人社区,而非黑人社区。这当然是一场灾难,可能并非亚马逊的本意,它只是算法产生的结果,但也许他们在部署之前就应该考虑到这一点。
道路坑洼检测案例:波士顿市曾有一个众包项目,通过智能手机应用收集道路坑洼数据。当你开车经过坑洼时,手机会震动,应用记录并发送数据给市政府以便修复。这听起来是个无辜的好主意。但问题在于,某些区域有更多开车并拥有昂贵手机的人,而其他区域可能汽车或手机较少。因此,在汽车和手机更多的区域,报告的坑洼更多,修复也更多。这可能导致,例如,老年人比例较高的区域(智能手机较少)道路坑洼更多。同样,低收入区域也可能有更多坑洼,因为人们甚至可能负担不起汽车。

招聘工具案例:亚马逊在发现性别偏见后,停止使用了一个招聘算法。工程师用于创建算法的数据来自亚马逊过去10年收到的简历,这些简历主要来自白人男性。算法被训练识别简历中的词汇模式,并以公司以男性为主的工程部门为基准。结果,AI软件惩罚了任何包含“女子”一词的简历,并降低了就读女子学院的女性的简历评分。这个想法很自然:扫描简历并预测某人过去是否会被雇佣。你拥有过去的雇佣数据记录和人们的简历,可以看到某人是否曾被雇佣。当时,决策是由人力资源部门的人做出的。现在,你想根据新的简历预测此人是否应被雇佣或邀请面试。当然,过去的数据中可能存在许多偏见,特别是过去大多数员工是男性。那么,基于这些历史数据训练的系统将延续同样的偏见。因此,过去的偏见将在未来延续。

奥地利就业机构案例:2019年,奥地利就业机构计划使用自动工具对失业人员进行分类。该工具根据个人数据(如就业历史、教育、年龄等)定义三类:找到新工作的机会高、中、低。一旦有了这种分类,就可以决定将更多资金投入高机会群体(认为更有希望)或低机会群体(认为他们更需要)。但首先需要进行分类。问题在于,与亚马逊招聘工具类似,就业历史中所有过去的偏见将被延续。例如,在这个特定案例中,已证明女性和老年人在算法评估中得分更差。同样的情况也可能发生在外国人身上,因为过去外国人的资质可能不如奥地利白人,那么过去的偏见将自动存在于工具中。对于一个新来的外国人,仅仅因为他/她来自外国,就会被分类为找到新工作的机会较低。

词嵌入中的偏见 🔤

词嵌入是语言学和文本分析中非常流行的工具。一个非常流行的算法叫做 Word2Vec。输入本质上是大规模文本语料库中的词语共现。你想做的是将词语嵌入到欧几里得向量空间中(通常是300维左右)。目标是含义相似的词被映射到相近的位置。
人们发现了一个非常酷的现象,称为词语类比。例如,你可以检查“法国”和“巴黎”的嵌入向量。也许法国在这里,巴黎在这里。然后你看“英格兰”的嵌入向量,也许英格兰在这里。你会发现,从国家到首都的向量是相似的。例如,从法国到巴黎的向量,如果你从英格兰开始加上相同的向量,就会到达伦敦。这很有趣,人们对此进行了很多讨论。
现在你可以开始玩偏见游戏了。人们首先尝试用这些向量造句:“伦敦之于英格兰,如同巴黎之于法国”。然后你可以开始玩:你固定一个词X,然后寻找性别刻板印象。你总是问这个问题:“男人之于X,如同女人之于Y”。然后观察Y是什么。
举个例子,你固定“电脑程序员”这个词,然后说:“男人之于电脑程序员,如同女人之于___”。你计算输出:取“男人”的向量,计算从“男人”到“电脑程序员”的向量差,然后加到“女人”的向量上,检查你最终到达的词Y。你会发现:“男人之于电脑程序员,如同女人之于家庭主妇”。你已经可以看到性别刻板印象:男人是技术专家(电脑程序员),女人应该是家庭主妇(做饭)。



你可以继续玩这个游戏,结果非常惊人:
- 男人之于外科医生,如同女人之于护士。
- 男人之于才华横溢,如同女人之于可爱。





你可以看到所有这些性别刻板印象。当然,这些刻板印象存在于过去的文本数据中,它们并非凭空产生。你获取大量文本(不知道这里用了哪些语料库),它本身就包含了所有这些偏见。也许你不该称之为偏见,这只是过去的情况,但现在我们认为这不合适。我们会问,为什么女人不能是电脑程序员?特别是作为计算机科学家,你可能会这么想。你不希望这些偏见或过去发生的历史事件出现在你的预测系统中,影响未来。


但你可以看到,如果你不试图抵消这些影响,它们总是存在于你的数据中。过去的文本数据反映了当时的社会状况,你不可能将其完全剔除。但如果你使用这样的词嵌入进行其他分析,你需要意识到其中存在这些偏见。


COMPAS 风险评估系统:一个深入案例 ⚖️🔍




我想更详细讨论的最后一个例子是 COMPAS 系统,我在课程开始时提到过它。COMPAS系统在全美范围内用于决定候审被告是否因过于危险而不能被保释。对于本讲座中的德国参与者,“保释”意味着“暂时释放”。某人正在等待法庭审判,目前被关押在监狱中。问题是,由于需要收集证据或其他原因,审判可能要在六个月后才进行。那么,你是需要在监狱中等待直到对你的案件做出判决,还是可以被保释?

COMPAS工具的作用是分配一个1到10的分数。这个分数表示该人再次犯罪的可能性(即“再犯”)。分数基于许多因素,包括年龄、性别和犯罪历史,但不包括种族(至少种族不是该工具的显性特征)。解释是:分数越高,该人被认为风险越高,因此更可能被关押;分数越低,风险越低,更可能被释放。
2015年左右,关于COMPAS的例子引发了非常激烈的辩论。我想向你展示两种观点:蓝色观点认为COMPAS分数没有偏见,红色观点则认为它有偏见。


让我们从第一种观点开始。设计该分数的人提出的问题是:它是否对种族(黑人)有偏见?是否对黑人不公平?他们的观点是:不,它没有偏见。他们的论点是:如果你有一个特定的分数S(系统分配给你的1到10之间的分数),那么无论你的种族是白人还是黑人,再犯的概率大致相同。所以,对于每个分数值S,我们检查:给定某人的分数是8,其再犯概率是多少?这个概率对于白人和黑人是相同的。因此他们说,这对白人和黑人没有偏见。这听起来很有道理,至少在初次阅读时,你会觉得这听起来没有偏见。


用图表展示:X轴是风险分数(1到10),Y轴是再犯概率。有两条曲线,黑人和白人的曲线,一条蓝色一条红色。你可以看到这些曲线几乎重叠在一起。这个图表表明,如果你看红线和蓝线,它们是相同的,所以这个分数对种族没有偏见。他们的论点是:当法官看到被告的风险分数时,法官不需要考虑种族,因为风险分数与种族无关。法官可以只关注这个分数(也许还有其他信息),而不是种族,来最终决定是否释放此人。这是一种观点。你读到这里会觉得有道理。

现在看另一种观点。这是批评该系统的人提出的观点,他们说:这些分数高度偏见。他们的论点是:在那些最终没有再犯的被告中,黑人被归类为中高风险的可能性是白人的两倍多(42%对22%)。用公式表示:P(高风险分数 | 没有再犯,种族=黑人) >> P(高风险分数 | 没有再犯,种族=白人)。现在他们观察的是不同的概率:他们看的是获得高风险分数的概率,条件是此人没有再犯。然后他们比较黑人和白人,发现黑人的这个概率要高得多。因此,黑人往往被分配更高的分数,被认为风险更高,因此他们必须留在监狱的可能性也更高。如果你读到这里,你会说,哇,这真的不公平。




我认为关键点在于,我们有两种不同的观点:蓝色观点说它公平,你觉得有道理;红色观点说它不公平,你也觉得有道理。现在,我们如何调和这两者?他们只是采用了两种不同的衡量公平性的方式。根据你如何衡量公平性,你会得出不同的结论。
这里有一个很好的图表(参考文献在幻灯片底部),它将这两者结合在一起。我来解释一下这个图表。图中,左侧的两个条形属于黑人群,右侧的两个条形属于白人群。X轴总是这个分数,“低”意味着被分配了低分(被认为风险低,可能被释放),“中/高”意味着被分配了中高分(可能不被释放)。Y轴是直方图,计算落入每个类别的人数。例如,我们看到在黑人群中,被归类为低风险的人大约有800人(在这个特定数据集中),然后有大约300-400人属于浅蓝色部分(表示再犯)。哦,抱歉,我忘了解释颜色。这里的黑色(实际上是深色)表示该人没有再犯,浅蓝色表示该人再犯了。所以本质上,所有数据都总结在这个图表中。
现在我们需要看看如何推导出这两种观点。
蓝色观点(认为算法公平)说的是:在每个风险类别内,再犯被告的比例大致相同,与种族无关。在图中,这意味着我们取两个人群的“低”条形(黑人的低条形和白人的低条形)。现在我们看条形顶部(浅蓝)和底部(深蓝)之间的比例。再犯者的比例在两个条形中大致相同。同样,如果你看右侧的“中/高”条形,比例也大致相同。这就是为什么持蓝色观点的人说这是一个公平的分数。
红色观点(认为算法非常不公平)看的是别的东西。他们的论点是:没有再犯的黑人被告被预测为比没有再犯的白人被告风险更高。在图中,你现在看那些没有再犯的人(总是条形底部的深色部分)。你检查没有再犯的人的比例:在黑人群中,58%的人被归为“低”,42%被归为“中/高”。而在白人群中,78%没有再犯的人被归为“低”,只有22%被归为“中/高”。现在,如果你看这两个类别在白人和黑人群中的比例,你会发现,在白人群中,大多数没有再犯的人也最终进入低风险类别;而在黑人群中,许多本应进入低风险部分的人却进入了高风险部分。这就是为什么这个算法不公平的观点。
现在问题是,这怎么可能发生?为什么根据不同的观点,你会得出不同的结论?你需要查看数据来理解这一点。在原始数据中,黑人被告的再犯率高于白人。因此,一个在准确性上完美的分类器,将更可能将黑人被告分类为中高风险。因为黑人被告的再犯率更高(58%),而白人群体的再犯率较低(33%)。所以,如果你使用算法工具,它通常会将黑人被告置于更高的风险类别。

现在,最大的问题是(这是一场漫长的辩论,我认为没有最终结论):谁是对的?这公平吗?它真的取决于你的观点。两种观点都有正式的理由支持。对我来说,我甚至不想给出最终答案,即我认为哪种情况公平或不公平,或者我更偏向蓝色还是红色观点。我认为在这个特定案例中重要的是:我们是否认为算法的结果是公平的,实际上取决于我们衡量公平性的方式,也取决于我们衡量算法成功的方式。






特别是对于这些数据,不可能构建一个非平凡的、对这两种公平性概念都公平的分类器。我们将看到,问题在于存在许多关于什么是公平的不同定义,而且它们通常是互斥的。所以,如果你有非平凡的数据,你可能对一种衡量标准是公平的,但对另一种衡量标准则不公平。



从我的观点来看,这个困境没有技术解决方案。首先,社会(在这个案例中)必须决定哪种公平性概念是我们希望遵守的。这个决定需要在机器学习之外做出,或者由社会,或者由其他相关方决定。一旦做出决定,我们作为机器学习从业者可以说:好的,如果你追求这种特定的公平性概念,我们可以尝试纠正;或者我们也可以尝试纠正另一种公平性概念。但你需要告诉我们你希望实现哪种公平性概念。当然,这是一个非常强烈的声明,因为我认为在社会中,哪种概念更受欢迎也并非显而易见。两种观点至少都有一些支持或反对的理由。


我不想评论我认为这里的解决方案是什么。我只是想强调,这些公平性概念彼此不相容,并且不是由技术人员来决定,而是需要其他人来决定你在这里希望遵守哪种公平性概念。在幻灯片底部,你可以看到关于这个话题的许多文献提示。如果你在谷歌上搜索“COMPAS”,你会找到更多资料,你可以尝试形成自己的观点。



最后一点旁注,还有一些更明显的问题我甚至还没有触及。例如,一个棘手的问题是:你如何知道一个人是否再犯?当然,你只能知道那些被释放出狱的人的情况。所以这又是一个有偏的衡量方式,因为你查看的是历史数据:某人被释放,然后你看他/她是否再犯。对于那些没有被释放的人,你甚至无法知道他/她是否会再犯。因此,这绝对是一种高度有偏的衡量某人是否会再犯的方式,因为你只能看到那些被释放的人。



关键要点与总结 🎯



这结束了我关于不公平性案例的部分。我想讨论一下第一个关键要点。

第一个也是最重要的要点是: 各种偏见会以隐性的方式进入机器学习系统。每当你构建自动分类系统时,有数百万个来源可能导致偏见进入你的数据。我们将在接下来的几张幻灯片中更系统地讨论这一点。



其次, 在大多数这些系统中,设计系统的人并非有意造成不公平。例如,进行信用评分的人、开发COMPAS的人,或者奥地利就业机构,我相信他们并非故意试图对某部分人群不公平。所以,这并不是他们故意以某种方式构建系统。这只是应用机器学习时产生的结果。如果你不特别小心,不公平的系统就会出现。




第三, 有些系统,如哈佛录取案例,是人们主动试图在系统中引入有意偏见的例子(例如平权行动)。
第四,不存在唯一的公平性定义。 在讲座的下一部分,我们将看到一些正式定义。存在许多定义(至少有10种),而且它们通常是互斥的。如果你对一种定义是公平的,那么你对另一种定义可能就是不公平的。哪种公平性定义是合适的,实际上取决于你当前正在看的应用。可能有些应用适合一种公平性概念,但其他应用可能适合完全不同的概念。因此,当你有一个应用时,你总是需要考虑,对于你的特定应用,你希望采用哪种公平性(或不公平性)概念。特别是,这不应由你决定,而应由社会或使用该系统的人、那些必须承受你的系统后果的相关方来决定。
第五, 当我们希望拥有一个公平的系统时,通常同时意味着我们需要放弃系统的精确性或某些其他性能指标。例如,如果你希望更公平,你可能可以设计算法以达到比当前更高的公平性,但也许你的分类准确率会下降。因此,将系统训练导向特定的公平性方向,总是意味着你在这里增加了某个方面,但可能会在其他地方(例如准确率)降低性能。同样,这是一个辩论点:多少公平性的增加可以证明多少准确率的下降是合理的?同样,这是一个决定,你可以指出它的存在,但最终,使用该系统的人、社会或相关方需要决定。
第六, 很明显但我想重复的是:公平性标准是来自社会的要求。你不能说“我不关心社会,我不关心公平性,我只想要准确率最高的系统”,因为你不是做决定的人,至少当你的系统在社会背景下使用时。会有来自用户的要求,你需要尽可能确保满足这些特定要求。

第七, 很难想出一个没有任何歧视性行为的机器学习应用。这是我想强调的一点。如果你想要更多例子,可以看看开头提到的公平性书籍草稿。无论你提出什么应用,如果你盯着它看足够长的时间,你都会看到歧视性行为。这总是会发生。在下一讲中,我们将讨论所有这些不公平性产生的根源。


最后, 这确实是一个问题,而且始终是一个问题。每当你设计一个在社会背景下使用的系统时,你都需要考虑这个公平性方面。从技术角度来看,令人烦恼的是,不会有简单的解决方案,你也不会在不与社会讨论每个人都偏好哪种解决方案的情况下,独自找到简单的解决方案。有些事情我们可以做,我们将在下一讲中看到。但社会和你必须共同讨论,哪种解决方案是每个人都更喜欢的。



本节课中,我们一起学习了机器学习中公平性的重要性、偏见产生的多种途径、公平性定义的复杂性及其社会依赖性。 理解这些是开发负责任且合乎伦理的AI系统的第一步。
47:机器学习与社会中的公平性形式化方法







在本节课中,我们将要学习机器学习系统在社会应用场景中产生偏见的多种来源,并探讨几种形式化的公平性定义。理解偏见的根源和不同的公平性准则是设计更公平算法的重要基础。


概述:偏见的来源




在上一讲中我们看到,几乎所有部署在社会环境中的机器学习应用都存在某种形式的偏见。现在,我们想讨论这些偏见可能来自哪些不同的源头。首先理解偏见的来源至关重要,这有助于我们后续开发一些工具,以尝试减少机器学习应用中的偏见。
第一个偏见来源是数据和测量。









数据与测量中的偏见





以下是数据中不公平性的两个主要概念,它们通常源于数据中的少数群体。


如果你有一个由大多数群体和少数群体组成的人群,通常会发生的情况是,这个少数群体在你的数据中没有得到很好的代表。这主要有两个不同的原因。





少数群体代表性不足



首先,仅仅因为少数群体规模太小。当你试图衡量一个系统的测试准确率时,这个少数群体可能仅仅淹没在结果不准确的那一小部分中。
假设你的人群中有1%是某个特定的弱势群体,你想确保你的分类算法对这个弱势群体是公平的。但现在它只占你人群的1%。如果你在其余人群上训练系统,分类准确率可能是92%。如果系统对这个1%的少数群体完全不准,你的准确率可能从92%降到91%。这只是下降了1%,很难从数据中测量出来。因此,你的整个系统可能对这个少数群体完全错误,但你甚至没有意识到,因为这个少数群体太小了。
所以,如果你有一个少数群体,你可能需要为这个特定的少数群体独立测试你的算法,而不是只看由大多数人群主导的整体准确率。
抽样偏差
另一件事是,这些少数群体本身已经很小,但由于你可能存在的抽样偏差,他们甚至可能相对于人口统计数据而言代表性更低。例如,一个少数群体可能占人口的1%,但在你的特定样本中,可能只占数据的0.01%,因为你从这个人群中抽取了太多样本。这可能由于许多结构性原因而发生。


当然,我之前提到的问题在这种情况下会更严重,因为在你的测试数据中,你不仅拥有与人口规模相对应的少数群体的小部分,而且来自这个特定群体的测试点数量可能更少。



抽样偏差是你可能总是会遇到的问题。你的数据收集可能存在人口统计、地理、行为或时间上的偏差。某些群体会被过度代表或代表不足。除非你尝试获取分层样本之类的方法,否则至少很难避免这些偏差。通常情况下,你都会遇到这些偏差。


我想展示一个具体的例子,这又是关于犯罪和犯罪统计的。犯罪记录只来自警察观察到的犯罪。当然,如果犯罪发生但没人注意到,它就不会进入统计数据。现在,警察部门倾向于向他们认为犯罪风险高的地区派遣更多警力。但是,因为该地区有更多警察,他们可能会观察到该地区更多的犯罪,仅仅是因为有更多警察可以观察到。所以,即使警察认为城市的某个区域犯罪率高,派遣了更多人,观察到了更多犯罪,但实际情况可能是在这个特定区域犯罪并没有更多,只是因为原则上可以有更多警察监视并发现犯罪。从这个意义上说,你会存在抽样偏差,这当然不是故意的,但可能对你的城市中不同区域产生非常强烈的偏见。
同样的情况也发生在许多案例中。例如,在线客户,早上和晚上的客户不同。如果我在期中左右评估我的课程,那么那些因为觉得课程太糟糕而已经离开的人,就不再是评估的一部分了。所以,我认为最差的评价,比如最差的部分或最差的评论,甚至没有进入我的评估。存在许多这样的偏见。或者在COMPAS的例子中,我之前提到过,如果你想计算某人是否会再犯的分数,当然你只能观察到这个人是否被释放。如果这个人没有被释放,我们甚至无法衡量这个人是否会再犯。
除了抽样偏差之外,你的数据中可能还存在预先存在的偏见。
数据中的既有偏见



我们已经看到了一些例子,比如文本中的性别角色,如果我们看词嵌入的例子,或者过去的招聘数据,这些数据可能存在问题,因为女性过去往往工作较少,或者外国学生往往资格较低。在这种情况下,你的数据中存在这些历史偏见,如果你想应用机器学习,很难将这些偏见从数据中去除。



测量中的偏见



然后,还有许多不公平性来源于测量。我们需要问自己的问题是:我们测量哪些特征?以及我们如何测量这些特征?



这听起来很天真,但事实上,在社会学等领域,这也是一个被广泛讨论的问题。你定义特征的方式也是你思考某些类别的方式。例如,在美国,通常根据种族收集统计数据,你通常会被问到诸如非裔美国人、西班牙裔、亚裔等类别。然后性别类别可能是自我认同的男性、自我认同的女性。当然,问题在于,如果你测量这类统计数据,首先,人们可能不会如实回答。例如,如果有人问我问卷中的种族,我倾向于不回答。如果我必须回答,那么我可能只是随机选择。可能存在一些类别,人们甚至无法如实回答,因为你被迫选择一个标签,而这些标签没有一个适用于你。执行这些分类会使它们变得规范化。因此,我们测量一个概念的方式改变了我们思考该概念的方式。所以,通过选择特征,我们当然影响了我们建模问题的方式。




这种测量选择可能会系统性地偏袒或损害你人群中的某些群体,即使你并非有意如此,但这仅仅因为这种测量方式对你人群中的某些部分不公平。这又是经常会发生的事情。因此,你需要非常仔细地思考你采取哪种测量方式,以及通过采取这些测量方式可能引入哪种偏见。
另一件事不仅是输入特征的测量,还有目标特征的测量。
目标变量的测量问题
最终,机器学习总是试图优化某个标准。你想学习一个函数来拟合某个目标变量。
在社会背景下,这个目标值通常定义得不是很好。这很困难。你如何衡量你想衡量的东西?通常,你无法真正衡量你感兴趣的东西,你只能选择一个非常、非常粗略的代理变量来衡量你想衡量的东西。
这里有几个例子。
例如,你想评估某人是否应该在工作中得到晋升。你的目标变量是“好员工”,但你如何衡量一个员工何时是好员工?如果你想根据员工的过往记录进行训练,你如何定义这个目标变量?特别是,你可以做的一件事是查看过去的数据,也许员工曾被经理评估过。然后你可以把这些分数作为代理变量。但当然,这个经理可能也有偏见,也许他不喜欢女性,那么根据你的经理,所有女性的分数都较低,这种偏见当然会传递到你的未来数据中。
一个招聘的例子。你可能不依赖绩效评估,比如你想为销售工作招聘或晋升某人。你可能不依赖报告,而只是说“我采用一些客观数字,我只检查这个人完成了多少销售额”。这听起来很客观,但当然,这取决于特定的客户情况和环境。可能有客户比其他客户反应更积极,有些地区销售东西更容易,有些工作条件容易表现出色,有些则很难表现出色。例如,如果你评估一所学校,想根据有多少高中文凭从该校毕业来判断这是否是一所好学校,这当然很大程度上取决于学校所在的城市区域、它收到了多少钱、学校的人口、学校有哪些老师等等。所有这些因素都会影响你的标准。因此,客观地衡量你真正感兴趣的东西确实很难。


另一个例子是计算机视觉。曾经有这些系统,或者我认为它们现在仍然存在。人们玩了很多这类计算机视觉任务。例如,有一个系统应该对个人外貌吸引力进行排名。你展示一个人的照片,你想说这个人是否有吸引力。现在发生的情况是,训练数据通常包括你有一些图片,你展示给一些人,这些人按照1到10的等级评价吸引力。这就是你的训练数据。但发生的情况是,大多数评估这些数据、生成训练数据的人都是男性,他们是白人。当然,系统输出的结果是肤色较浅的人被认为更有吸引力。但这当然是错误的,这只是因为我们生成这些目标值标签的方式存在强烈的偏见。



另一个例子是医疗系统。这是一个引用,来源在下一张幻灯片。医疗系统依靠商业预测算法来识别和帮助有复杂健康需求的患者。作者在下一张幻灯片引用,他们表明一个影响数百万患者的广泛使用的算法表现出显著的种族偏见。在给定的风险评分下,黑人患者比白人患者病情严重得多,证据是未受控制的疾病迹象。所以,这里发生的情况是,有一个自动系统试图预测风险评分,有点像COMPAS。在给定的风险评分下,黑人患者比白人患者病情严重得多。这意味着,为了获得相同的治疗,黑人患者需要比白人患者病得更重才能得到治疗。纠正这种差异将使接受额外帮助的黑人患者比例从17%增加到46%。这种偏见之所以产生,是因为算法预测的是医疗成本,而不是疾病。这就是代理变量的问题。预测疾病很难,但你可以预测医疗成本。然而,不平等的就医机会意味着我们在黑人患者身上花费的医疗费用少于白人患者。因此,尽管医疗成本在某些预测准确性指标下似乎是健康的一个有效代理变量,但出现了巨大的种族偏见。我们建议,选择方便、看似有效的地面真相代理变量可能是许多情境下算法偏见的重要来源。





所以,这里再次看到,我们有一个医疗系统,根据你如何衡量系统的成功以及你采用哪些变量,你会得出完全不同的结论和不同的偏见。


公平性定义





现在,我们仍然在公平性这一章。公平性不是一个技术要求,而是来自社会的要求。我的结论是,关于公平性的一切都不简单。存在这些不同的公平性概念,它们彼此之间并不兼容。数据包含错误,目标变量包含测量中的错误或偏见,很难去除这些偏见,并且很难想象在社会背景下有任何应用不包含这些偏见。
现在我想做的是,向你展示机器学习系统中最流行的一些偏见定义。你将再次看到这些定义,我将大量依赖《公平机器学习》这本书。如果你喜欢,可以更仔细地阅读。这些只是概述幻灯片,我只是想让你熟悉这些概念,而不深入探讨技术细节。
基本设置
我们的设置是什么?我们的数据由特征组成,比如描述人的特征:年龄、性别(如果性别不被视为敏感属性)、子女数量、收入等等。所以你有一些描述一个人或你当前观察对象的特征。


然后,在文献中,总是有一个被称为“受保护属性”或“敏感属性”的东西。在我的幻灯片中,我总是称之为A。这个属性可能是你想要纠正或试图尽可能公平对待的属性。例如,你想在种族方面保持公平,或在性别或其他你想到的类别方面保持公平。



现在,根据应用的不同,这个受保护属性可能是已知的,也可能是未知的。在一些应用中,它是一个显式特征;在另一些应用中,它不是显式特征。




然后我们假设我们有一个真实的目标变量。这里我们并不真正讨论这是否是一个代理变量,我们只是简化设置,说我们确实可以衡量我们系统的成功,并由这个变量Y来衡量。




我们的目标是学习一个分类器,它接受输入。有时包括特征和敏感属性,有时不包括敏感属性,这取决于应用。所以你获取特征,并想预测结果,即目标变量Y。



为了使下一张幻灯片的阐述非常简单,我们总是假设受保护属性是二元的,例如男性/女性,白人/黑人。这当然是一个很强的简化,但在幻灯片上处理起来更简单。我们还假设真实结果也是二元的,例如被大学录取或不被录取,被释放或不被释放等等。



为了在思考这些类别时心中有数,我们简单回顾一下不同例子中的这些变量是什么。





在COMPAS例子中,X是人的特征,比如犯罪记录、教育程度、人的过往历史等。A是表示人是白人还是黑人的特征。这是我们不想使用的敏感属性。Y是描述一个人是否会再犯的标签变量,这里我们只是假设我们知道真实情况,尽管在实践中可能很难知道。Y_hat是系统的预测,即系统认为这个人是否会再犯。




我想在这里再次强调这一点,但之后我们会忘记这一点。这里的一切都是非常粗略的代理变量。描述人的实际数据X,正如我们之前概述的,存在数百万个测量偏差。敏感属性通常甚至不为人知,如果是关于性别的,它们可能被错误报告,或者可能只是从其他东西推断出来,因为我们不知道它。分类器很难理解。我们无法真正论证它。Y通常是我们要衡量的变量的一个粗略代理。当然,所有这些都发生在背景中。但现在,让我们看看问题本身。




当我们忘记这些偏见,并仍然尝试在理想情况下(当我们知道变量且没有测量偏差等)创建一个公平的分类器时,如果我们不能,那么在这种更复杂的情况下我们注定要失败;如果能,那么看看它是如何工作的会很有趣。




公平性度量




现在我们需要衡量公平性的概念。正如我们所见,有许多不同的概念,它们并不兼容。这就是我现在想向你展示的。



第一个公平性概念,我几乎总是称之为“天真”的公平性概念,通常被称为人口统计均等。在《公平机器学习》一书中,它被称为“独立性”,但我更喜欢人口统计均等,我认为这是更常见的术语。




形式上,人口统计均等定义如下:系统预测结果为+1的概率,在敏感属性为+1的条件下,应该与在敏感属性为0的条件下系统预测结果为+1的概率相同。




所以,独立于其他一切,两个群体应该有相同的成功率。这里Y=1总是表示成功,例如你被大学录取或被释放出狱。现在,例如,被大学录取的概率应该独立于你的种族是黑人还是白人。


这里的例子是相同的:公司中应该晋升相同比例的男性和女性。我再次写下了变量:你是否是男性或女性是敏感属性A,你是否被晋升是变量Y_hat。





或者在COMPAS例子中,应该释放相同比例的白人和黑人。




我上一张幻灯片上的定义依赖于我们拥有二元变量的事实。你可以有一个更通用的定义,也适用于更一般的上下文。这个定义简单地说,随机变量Y_hat和A需要是独立的,这通常用正交符号表示。因此,从统计或随机性的角度来看,如果你将这两者视为随机变量,根据两个独立随机变量的定义,它们应该是独立的。




现在,这个人口统计均等假设,或者如果你想追求人口统计均等,这是一个非常、非常强的假设。因为通常,如果你想要预测变量和敏感属性是独立的,当然你也希望预测变量和真实变量彼此非常接近,所以这本质上意味着只有当真实变量和这个变量A彼此独立时,这才有效。这是一个非常强的假设。




因此,每当你有一个例子,其中你想预测的东西和你想要保护的属性之间存在相关性时,人口统计均等就不会很好地工作。




也许你可以试着想一些例子,放松一分钟,试着想出一个这确实有问题的例子。




机会均等


下一个公平性概念被称为机会均等。在《公平机器学习》一书中,它通常被称为“分离”。本质上,机会均等有时也被称为“机会平等”,如果你只考虑一个方向。





本质上,你想说所有群体经历相同的假阳性率和相同的假阴性率。所以,它不像人口统计均等那样关注获得良好待遇的绝对人数或绝对比例,而是关注那些应该获得良好待遇但实际上没有获得的人。



用数字表示,你想要的是:再次,敏感属性A为0或A为1。现在你看,例如,真实标签为+1的人群,例如,这是根据真实知识会告诉你,如果拥有它,这个人在你的大学会成功的人群。现在你希望,在所有白人(A=1)中,那些真实情况是能在大学成功但被你的预测器拒绝(Y_hat=0)的人,这种情况发生的概率应该与你不是白人而是黑人(A=0)时相同。所以你观察真实值为成功(Y=1)但被你预测为不成功(Y_hat=0)的人群,这是假阴性率,你希望这个比率在黑人群体和白人群体之间是相同的。





反之亦然,如果你预测某人会成功(Y_hat=1),即使那个人在真实情况下并不成功(Y=0),这就是假阳性。同样,假阳性率在两个群体中应该相同。


有时,你只关心积极的情况,那么它通常被称为机会平等。你想说,白人和黑人群体,如果你有能力完成大学教育,那么你也应该被录取。如果不是这样,那就不好了。所以你希望白人和黑人拥有相同的机会。




这就是它被称为这种方式的原因。





这里我再次举例说明这些变量如何定义:在具有获得理学硕士学位潜力的学生中,真实标签Y是+1(这是你不知道的真实潜力),被硕士项目录取的可能性(被录取是变量Y_hat=1,这是你的预测)对于男性和女性应该是相同的(由A=0或A=1编码)。


再次,COMPAS例子相同:在不再次犯罪的人中,获得保释的可能性对于白人和黑人应该是相同的。




再次,如果你没有二元变量,你可以有一个更通用的定义。现在这是一个条件独立陈述:你说在随机变量Y的条件下,两个随机变量Y_hat和A应该彼此独立。


这听起来相当不错的另一个概念。这里可能有一点令人失望:假设我们有一个完美的分类器,总是预测完美的标签。那么这意味着假阴性和假阳性率都将为0。那么,当然,根据这个定义,这个分类器是完全公平的。这当然是定义的结果,并且完全合理。但这让你怀疑,至少在特定应用中,这是否真的是我们想要的公平性概念。但尽管如此,我们现在已经看到了预测均等和机会均等,它们只是两种不同的公平性概念。





预测均等




现在我们来看预测均等。在《公平机器学习》一书中,这被称为“充分性”。



预测均等准则是另一个概念。你看,所有这些定义都是关于我把哪些变量放在条件中,以及我实际看哪些变量。




预测均等现在看的是以下内容:例如,真实情况是某人能够上大学的概率,在条件“这个人是白人且系统预测该人将在大学成功”下,应该与将“白人”换成“黑人”标签时相同。对于所有Y值都是如此。所以,如果系统的预测是Y_hat,那么真实值为Y的概率对于白人和黑人应该是相同的。




再次,你可以写出更通用的定义,这意味着现在你有一个不同的条件独立陈述:现在你以预测变量为条件,并且希望真实变量独立于敏感属性。




这本质上是COMPAS陈述中的第一个观点:如果COMPAS系统预测分数Y_hat,那么实际再犯的可能性对于黑人和白人应该是相同的。




有一个稍微更通用的概念与此密切相关,这个概念被称为校准。这是不仅在机器学习中使用,而且在许多不同科学领域或社会科学中使用的概念,每当你试图提出分数时,如果它们预测正确的概率,你就称这些分数是校准的。定义如下:




假设一个分数应该预测某个概率,比如一个人再犯的概率。然后我们说这个分数满足按组校准,如果对于所有分数值Y和所有敏感群体A,我们具有以下属性:系统预测分数Y,然后真实分数实际为Y的概率应该是Y。所以你预测了正确的概率,如果你在模拟中评估它,比如你说某人再犯的概率是30%,你对500万人取平均并检查他们是否再犯,你应该看到30%的人。这应该独立于Y成立,但当然,按组校准的方面是,这不仅适用于整体群体,而且对每个群体单独成立。




现在你可以证明,在一切都是二元的简单情况下,预测均等和校准之间存在某些关系。它们几乎相同,但如果你想要更复杂的关系,你可以查阅《公平机器学习》或相关论文。



评估公平性的基线




当你查看不同的公平性概念,特别是考虑对你的算法进行公平性评估时,你可能总是想考虑两个极端情况。评估它们的公平性,因为这总是你可能想要查看的基线。




第一个你应该检查的基线是常数分类器。你简单地让每个人上大学,无论特征是什么,无论性别是什么,无论种族是什么,你让每个人上大学。所以,Y_hat应该总是1,无论输入是什么。特别是,输出Y_hat独立于其他一切。然后你得到,这个分类器是最大程度公平的,它满足人口统计均等和机会均等。



当然,这是实现公平分类器的一种天真方式。实践中的问题是,这个分类器可能准确率非常差,因为它只是让每个人上大学,无论这个人是否有能力上大学,这当然不是你想要的,准确率真的很差,但公平性是完美的。


因此,每当你提出一个应该生成公平分类器的算法时,你应该与这个分类器进行比较。你能实现的公平性概念是什么?在这种情况下你能获得的准确率是多少?现在,如果你的算法只是比这个稍微准确一点,但公平性更差,那么也许它真的不是你想要的。





另一个极端情况是,如果你预测敏感属性,这是负面的极端情况。假设你有一个特定的应用,但让我们尝试从你的数据中预测敏感属性是什么。本质上,Y_hat需要恰好为1当且仅当A为1。那么Y的输出与敏感属性完全相同,那么这个分类器是最大程度不公平的,无论是在人口统计均等还是机会均等方面。





所以,正如我所说,每当你玩算法并尝试评估公平性和准确率时,使用这两个极端情况,只是为了感受这些数字意味着什么,非常公平或非常准确意味着什么?




公平性概念的不可能性
现在,关于所有这些公平性概念的一个令人烦恼的事情是,存在一些不可能性结果。直观上,所有这些结果都表明,除非你的数据是平凡的,否则你无法同时满足所有这些标准的公平性。通常,当你满足其中一个公平性概念时,你无法满足其他公平性概念。
这里我只想给你陈述,你可以在《公平机器学习》中查阅,或者如果你想知道,可以查看接下来几张幻灯片引用的论文。


例如,假设敏感属性A和真实变量Y不是彼此独立的,那么人口统计均等和机会均等不能同时成立。




或者,假设Y是二元的,A不独立于Y,且Y_hat不独立于Y,那么人口统计均等和预测均等不能同时成立。




第三个,假设A、预测变量Y_hat和真实变量Y的联合分布中的所有事件都有正概率,并且假设A不独立于Y,那么机会均等和预测均等不能同时成立。


还有一个,假设Y不独立于A,并且假设Y_hat是二元的且具有非零假阳性率,那么预测均等和机会均等不能成立。




再次,正如我所说,你可以在《公平机器学习》中查阅,或者使用Kleinberg等人关于风险确定中固有权衡的论文。关于这方面的文献还有很多。底线很简单:需要有人决定我们想要实现哪种公平性概念,我们只能拥有一种概念,而不能同时拥有另一种概念。




顺便说一下,如果你有多个敏感属性,同样的情况也可能成立。例如,如果你有性别和种族,并且你想对所有属性都公平,那可能也有问题。



其他公平性概念





还有更多的公平性概念,我只想简单提及而不给出正式定义,因为它们更复杂。有一种叫做个体公平性。在那里,你不谈论人群,所以你不说女性与男性,本质上你谈论个体,这个概念说,两个相似的个体应该受到相似的对待。

有一系列论文由试图推广这种个体公平性的人撰写。在实践中,再次,很难使用,因为它始于一个问题:相似性的概念是什么?根据你使用的相似性概念,你最终会得到完全不同的公平性概念,这在输入空间和目标空间都是如此,所以在我看来真的不那么明显。






还有另一个概念甚至更复杂,我不想深入讨论,因为它需要更多关于因果关系的背景知识。有一种叫做反事实公平性。本质上,这里只是几个例子,它计算任何变量的分布,如果某些其他变量不同,其他条件不变。例如,如果某个人是黑人而不是白人,但其他一切都相似,结果会是什么?或者在这里,你可以问,如果这个人没有工作,他/她是否会毕业?所以你可以问,反事实总是意味着你试图生成实际上不是真实数据的数据,它是反事实的,它与事实相反。所以事实上发生了其他事情,但你论证如果这个特征不同会发生什么,然后你可以基于这类反事实陈述建立公平性概念,并使用大量的因果关系框架。如果你感兴趣,有很多关于这方面的论文,这里有一篇你可以开始阅读,可能还有更多。
公平性概念的多样性
现在我们已经看到了几个标准,有很多标准,这里只是我从《公平机器学习》书中摘取的一个表格,存在许多、许多更多的标准,这不需要你阅读,只是为了展示有很多标准。而且,根据定义这些标准的社区不同,它们也有不同的名称。例如,这里有很多定义,它们在《公平机器学习》书中都对应于“独立性”,它被称为统计均等、群体公平、人口统计均等、条件统计均等、Darlington准则4等等。所以同一个标准有很多名字。根据你的来源,这些名字都不同。所以目前的文献确实有点混乱。


因此,每当你阅读一篇关于公平性的论文时,你首先需要弄清楚他们在这篇论文中使用的确切公平性概念是什么,以及它与你对不同公平性概念的理解有何关联,你对这个公平性概念的名称是什么,以便了解这里发生了什么。





所以,底线,我已经说过很多次了,但我想再重复一次:一个唯一的公平性标准根本不存在。


总结与反思





公平性是一个来自社会的概念,它不能总是通过统计标准以令人满意的方式计算。我们在这里尝试的是,我们定义了所有这些条件独立的概念,例如,你有某些变量,另一个变量以这个变量为条件,然后其他两个变量是独立的。这当然是对我们作为社会可能认为公平的东西的粗略近似。

统计学只能对某些讨论做出这么多贡献,可能还有许多其他东西我们根本无法用这种统计概念来捕捉。






这些标准中的每一个都有一些应用,在这些应用中,这确实是一个理想的标准,这一点非常合理。但每个标准也有很多严重的缺点,并且未能捕捉到其他一些问题的重要方面。如果你想知道更多,我认为我们在过去的讨论中已经了解了要点,你可以查阅《公平机器学习》以获取更多讨论,甚至更多文献。



这一切都是消极的一面。另一方面,我总是喜欢指出的一点是:我们要与什么比较?比如,我们构建一个系统来决定某人是否应该留在监狱里。但现在我们与一个由法官简单地决定某人是否应该留在监狱里的系统进行比较。当然,我的意思是,法官也有他或她的偏见,可能并非没有偏见,不同的法官有不同的偏见,有些法官可能有非常强烈的偏见,有些可能有你可能会称之为更温和的偏见。但很难想象这里有一个没有任何偏见的人。



因此,我们比较的基线总是人。人作为决策者,他们也不公平。所以我认为,在关于公平性的辩论中,记住这一点并说“是的,也许某个算法在某些方面不公平,但也许至少将它与某个法官或其他系统的不公平性进行比较会很有趣”,或者“如果是关于奥地利的就业机构,在这个就业机构工作的人有多不公平?也许两个系统的公平性甚至没有太大不同,或者我们可以设计一个我们认为至少比坐在那里做这些决定的一些人更公平的系统”,但这当然不是显而易见的。





这在这张幻灯片上总结了一下。我觉得这很有趣,因为现在发生的情况是,我们至少有了离散的、粗略的公平性定义。这是以前没有真正存在的,正如你所见,它存在于文献中,但也许人们没有这么意识到。现在你可以开始将这些技术系统与人类系统进行比较。我的意思是,如果你愿意,你现在可以开始设计研究,比如某个法官在多大程度上存在偏见。所以,我无法真正在这里标记的底线是,或者你可以查看某些情况下的过去决策,现在你可以尝试以量化机器学习算法不公平性的相同方式来量化不公平性。然后你可以开始比较它,如果对于不同的不公平性概念,人类往往比算法更不公平,那么也许你是好的,因为算法至少比人类好一点,即使它可能不完美。



但我觉得这很有趣,它打开了一扇讨论的大门,我认为这在几年前是不可能的。



本节课总结




在本节课中,我们一起学习了机器学习系统中偏见的主要来源,包括数据代表性不足、抽样偏差、既有偏见和测量偏差。我们深入探讨了几种形式化的公平性定义:人口统计均等、机会均等、预测均等和校准。我们了解到这些定义彼此之间往往不兼容,存在固有的权衡,并且没有唯一的“正确”公平性标准。最后,我们认识到,虽然算法可能存在偏见,但将其与同样存在偏见的人类决策者进行比较,为评估和改进社会决策系统提供了新的视角和可能性。
48:算法公平性的技术途径 🧠⚖️


在本节课中,我们将要学习如何从技术层面提升机器学习算法的公平性。我们已经了解到有多种不同的公平性定义,并且它们彼此之间并不完全兼容。现在,让我们从积极的一面出发,探讨如果我们从一开始就知晓公平性的要求,或者在尝试解决问题时,我们能在多大程度上改进特定的公平性指标。我们将分析不同的技术途径,看看哪些方法有效,哪些可能无效。
概述 📋





提升算法公平性主要有三种技术途径:预处理、训练中处理和后处理。本节课程将逐一简要讨论这三种方法。



三种主要技术途径 🛠️

上一节我们介绍了多种公平性概念,本节中我们来看看如何从技术上改进它们。原则上,有三种主要方法被用于或尝试用于提升特定系统的公平性。



以下是三种主要的技术途径:



- 预处理:尝试修正数据中固有的偏见。
- 训练中处理:尝试训练一个同时满足准确性和特定公平性标准的分类器。
- 后处理:在模型训练完成后,尝试修正算法的偏见。

接下来,我们将详细探讨每一种方法。



1. 预处理方法 📊



第一种方法是尝试对数据进行预处理。具体来说,就是尝试修正数据中固有的所有偏见。其基本原理是:如果我们的数据中存在大量偏见(例如语言偏见或就业历史偏见),那么如果我们不消除这些偏见,事后将很难进行纠正。

简单移除敏感属性



第一个天真的尝试是:我们只需从数据中移除敏感属性(如种族),一切问题就都解决了。例如,如果你想预测信用评分,只需不使用种族信息,一切就会顺利。


然而,正如我们已经讨论过的,这种方法几乎是不可能的。因为有太多代理变量与敏感属性(如种族)高度相关。

仅仅移除种族信息是行不通的。算法会简单地找到下一个与种族密切相关的变量并使用它。因此,即使种族不是算法的显式变量,它仍然会被隐式地使用。所以这种方法不会成功。



这里再次以邮政编码为例。邮政编码可能充当这样的代理变量。那么,即使你移除了种族信息,你的算法对于黑人群体可能仍然非常不公平。
识别与移除偏见特征的困难





下一个问题是,在许多情况下,歧视性特征或数据中的这些偏见甚至难以把握。机器学习就是寻找不同变量(如输入变量与输出变量)之间的关系。有些关系是我们非常希望发现的,而另一些关系则是我们根本不想看到的。
例如,在医疗案例中,吸烟与否与是否患癌之间存在关联,这是我们希望在数据中找到的相关性,因为人们甚至相信这两者之间存在因果关系。




然而,还有其他模式,比如女孩喜欢粉色而男孩喜欢蓝色衣服,这可能是你不想发现的,因为它会加剧性别刻板印象。但你如何告诉算法呢?关于一个人的特征有数百万个,例如,穿粉色衣服的人更可能是女孩,穿蓝色衣服的人更可能是男孩。数据中存在数百万个这样的关联,因此很难指定所有这些偏见的来源,这基本上是不可能的。
事实上,正如我在本幻灯片底部所写的,甚至可能所有人类都无法就哪些变量或关联是我们希望发现的、哪些我们认为是偏见、哪些我们不认为是偏见达成一致。


如果我们作为人类甚至无法达成共识,那么告诉算法应该做什么就有些困难了。






移除所有相关变量的后果

接下来你可以做的是:既然不能简单地移除种族信息就认为万事大吉,那么为什么不也移除邮政编码、就业历史、教育程度等所有可能与种族相关的变量呢?然后我使用剩余的所有变量来预测,例如,某人是否会偿还贷款。



问题是,如果你这样做,在许多情况下,你可能会移除许多(如果不是全部)重要变量。因为你想要预测的目标与敏感属性之间可能并非完全独立。只要这两个概念之间存在任何依赖关系,当你移除所有这些属性后,分类器将无法正常工作,你无法获得高准确率。它可能完全公平,但准确率太低,以至于你根本不会再使用这个分类器。
这还只是针对一个敏感变量的情况。如果你有更多敏感变量,比如性别和种族,你最终将没有任何变量可用。




无法访问敏感属性的问题
下一个问题可能是,你甚至可能无法访问敏感属性,因此你甚至无法计算相关性。因为也许一开始就有人足够小心地移除了敏感属性,然后你得到的数据集没有显式的敏感属性。为了能够进行预处理,你首先需要预测敏感属性,然后计算你预测的属性与其他变量之间的相关性,再移除这些变量。这将是一团糟。当然,这可能是你最不想做的事情:有人移除了敏感属性,而你的算法第一步就是尝试预测敏感属性,这完全是不明智的。因此,这将是一种复杂的方法。


使用不同的数据表示





还有其他方法,比如你说:也许问题在于我们拥有所有这些基于特征的描述,而这些特征中的许多都可能与敏感属性相关。所以也许我们应该简单地使用不同的数据表示。我们也许不应该使用基于特征的表示。


而是应该尝试提出基于相似性的数据。例如,你可以说,我用一组原型来表示我的人群。
然后将每个人或每个数据点表示为这些原型的加权线性组合。
然后我在这个基础上训练我的算法。





希望这样,因为那时我只有距离函数,也许这个距离函数与敏感属性的关联不大。




但这在大多数情况下是行不通的。有一些论文表明,在大多数情况下它都不会成功。我认为其中一个问题已经在于:你将使用哪种距离函数?而距离函数可能已经隐式地编码了敏感属性。


例如,可能即使你无意如此,但黑人彼此之间非常相似,白人彼此之间也非常相似,而他们之间却没有相似性。那么,算法将再次产生偏见。


小结


在我看来,以上都是关于预处理的内容。我并不十分确信预处理真的能有所帮助,也许它能帮上一点点忙。但据我所知,在大多数应用中,预处理并不会成为解决机器学习算法不公平问题的方案。


2. 训练中处理方法 🧑🏫



接下来你可以做的是:也许我无法消除数据中的不公平,但我可以迫使我的算法找到一个更公平的解决方案,也许比最准确的解决方案更公平。所以我将其推向一个可能准确性稍低但最终更公平的解决方案。
标准监督学习框架



这里我们处于一个标准的监督机器学习设置中。我们想要学习一个函数,我们有一个想要最小化的风险函数,这基于某个损失函数。



在某个函数空间上,就像标准的设置一样,如果我们愿意,可以有一个正则化项。所以我们处于标准的监督分类设置中。
引入公平性约束




现在,额外增加一个标准,即我们分类器的公平性。为简单起见,假设我们有两个敏感群体,称为 A=0 和 A=1。


假设我们追求人口统计均等,你可以用所有其他公平性概念做同样的事情,但为了具体起见,我们以人口统计均等为例。现在你要做的是定义一个特定函数的不公平性。


通过简单地测量这些本应相等的概率,并检查它们的差异。人口统计均等意味着无论 A 是 1 还是 0,你都希望某个事件(如正类或负类,或者如果你有一个分数)发生的概率相同。

然后你测量它发生在白人群体中的概率和发生在黑人群体中的概率,取差值,这就是你衡量不公平性的方式。0 表示完全公平,偏离 0 越多,你的分类器就越不公平。



经验不公平性



现在你定义这个不公平性的经验版本,它不看真实总体,而是看你在样本上可以测量的值。


所以你查看所有敏感属性 A 为 1 或 A 为 0 的人,测量这些群体中分类器预测为正的频率,这就是你的不公平性标准。


优化问题


现在你可以提出一个优化问题,它有两个目标。有两种方法可以做到这一点。第一种是:我们希望最小化标准的正则化风险,同时要求不公平性低于某个阈值。你只需说,社会告诉你,我们只愿意容忍例如 10% 的人口统计均等不公平性。例如,被提拔的男性和女性人数差异不应超过 10%。



那么这就是你的容忍度,这是你添加到优化问题中的一个约束。



另一种方式(我认为幻灯片上没有)是,当然你也可以将不公平性本身作为一个正则化项添加进去。你可以有另一个权衡常数 ν 乘以 F 的不公平性,然后尝试同时优化所有标准。那么你就不只有两个目标(即小的经验风险和良好的正则化或函数复杂度小),第三个标准将是良好的不公平性,即公平。
优化问题的挑战


现在你可能会想一下,这是否是一个简单的优化问题。




答案很明显,这是一个困难的优化问题,因为这里的不公平性标准是离散的。
你只是简单地计算有多少白人和黑人获得了贷款,这是一个离散变量,所以不公平性是离散的,这总是难以优化的。




实践中的解决方案与局限

现在的问题是,如何在实践中做到这一点。许多出版物中已经推广的标准解决方案是使用凸松弛。


所以,不是使用这个不公平性标准,而是提出一个导致凸问题的松弛。

然后你解决这个凸问题,你就满意了。
然而,我们在今年的一篇 ICML 论文中发现,事实上,尽管你可以解决优化问题(或者更容易,因为问题是凸的),但从这些方法中得到的实际公平性标准往往也很差。
这就是我们在论文中展示的。然后我们提出了另一种方法,我不认为这是故事的结局,通过这种方法你可以获得公平性的保证,但我们方法的缺点是,我们不再能保证准确性。现在有一些算法可以达到良好的准确性但可能不公平,我们现在可以提出一个真正公平的算法,但我们至少不能保证准确性。在实践中,你可以尝试所有这些方法。
我认为,无论是我们的论文还是迄今为止的任何其他论文,都不是故事的结局。
但至少在我看来,这似乎是推动算法走向公平解决方案的最有希望的方法。
如果你想看一些参考文献,下面有一些。
3. 后处理方法 🔄
第三件你可以做的事情是尝试事后修正模型。现在的场景是,我们可能有一家公司训练了一个分类器,比如德国的 Schufa(信用评估机构),它预测信用评分。但他们训练分类器的方式是保密的。我确信 Schufa 永远不会告诉我们他们是如何得出评分的,判断你是否有资格获得贷款。同样,对于 COMPAS 评分,我认为这也不会被公开。
但现在假设我们拥有这个私有的、训练机器学习算法的系统,我们发现它不公平,我们认为也许我们可以事后处理它,至少让结果变得稍微公平一些。
所以我们想事后修正它。现在,我们有哪些选择?


本质上,我们只能访问分类器的预测结果和敏感属性。我们甚至可能看不到输入数据,因为这又是该公司的私有知识。


所以本质上,如果一切都是二元的,我们只有两个预测值 Ŷ(+1 和 0),以及两个敏感属性值 A(+1 和 0)。现在的问题是,你能否在事后修正一些东西。



当然,这是一个非常天真的情况,可能存在介于一无所知和全知之间的更多中间情况,但这是你只看到预测输出的极端情况。问题是,你能否构建一个派生分类器,它只以 Ŷ 和 A 作为输入,产生一个新的输出,这个新输出称为 Ỹ。


构建后处理分类器


现在你可以做的是定义这些量 P(Ỹ=1 | Ŷ=y, A=a),即给定旧分数为某个值且旧敏感属性为某个值时,新分数为 1 的概率。你可以查看 Ŷ 和 A 所有取值下的这些分数。


现在你可以尝试构建一个后处理的 Ỹ,它以 Ŷ 和 A 作为输入,产生一个新的输出。
使得概率以某种方式安排,使得分类器可以被认为是公平的。





你可以做到这一点,有一种方法在参考文献中有所描述,我将在下一张幻灯片中列出。



它是一个线性规划,这很容易,你可以解决它,然后会有一个解决方案,并且该解决方案将使用随机化。


随机化与准确性权衡
最终,对于特定的一部分人群,你只需以某种概率使用随机预测,然后最终结果是公平的。



显然,与此同时,分类器的准确性会下降,因为至少理论上你可以想到这样的场景:生成这个隐藏模型的公司花了大量时间来获得最佳准确性,而现在你要改变分类器,准确性很可能会下降而不是上升。所以你将降低准确性,但会增加系统的公平性。




连续分数的情况


现在,如果你想要预测的函数不仅仅是二元标签,而是像连续变量、连续分数这样的东西,你也可以这样做。


例如,你需要查看分类器的 ROC 曲线。我知道在这门课中我们还没有真正定义 ROC 曲线,这将在接下来的几节课中讲到。


但如果你知道,或者在本学期末回到这节课来看。这里,ROC 曲线,你检查两个分类器的 ROC 曲线,一个用于 A=0 的群体,另一个用于 A=1 的群体。在两条 ROC 曲线匹配的地方,当然,就是你拥有相同类型的真阳性、假阳性等指标的地方。


然后这就是你要追求的目标。


如果曲线不相交,你仍然有办法可以做到,如果你想做,那么你需要再次使用随机预测器,你可以查看这篇论文,就是这里这篇,由 Hardt、Price 和 Srebro 撰写的关于“机会均等”的论文(NIPS 2016)。



总结与权衡 🤔


到目前为止,我们已经看到了三种不同的方法,我们刚刚看了这些方法组,通过它们可以尝试提高公平性。回顾一下,它们是:通过预处理,我们试图使数据更公平;通过训练,我们试图实现一个从一开始就满足特定公平性概念的分类器;通过后处理,我们或许能够再次补救一些不公平性,或者以更高的准确性(实际上是更低的准确性)为代价,为算法带来更多的公平性。



这最后一句“以准确性为代价”,正是我现在想简要讨论的权衡。
准确性与公平性的权衡




在准确性和公平性之间存在明显的权衡,因为公平的分类器试图优化两个不同的目标:分类器的公平性和分类器的准确性。



当然,如果你试图同时优化两者,那么原则上,准确性只能下降。因为如果你只看准确性,你会找到最准确的分类器。如果你现在说这个分类器不公平,选择另一个,那么准确性很可能会下降,至少它永远不会上升,但很可能会下降。


因此,你必须做出选择,你必须决定你愿意放弃多少准确性。



通过增加公平性。这听起来很抽象,但准确性的选择可能意味着你给一个可能无法偿还贷款的人发放了信贷,这对那个家庭来说可能是一场灾难;你可能录取了一个最终可能无法获得学位的人上大学,这对这个人来说也是一场灾难。所以这不仅仅是关于准确性的抽象概念,这些确实存在社会成本。


但另一方面,也有社会效益,即你拥有了更多的公平性。


现在,同样没有唯一的解决方案。需要作为设计者(即最终使用系统的人,而不是机器学习者)来感受你可以放弃多少准确性。


为了获得你想要的公平性。当然,这又是这些几乎不可能做到的事情之一。你该如何在这里提出一个权衡?但我认为这里发生的事情只是非常清楚地指出了问题所在。




以及如果你想要至少有一个完美的标准来定义你的分类器应该有多准确和多公平时,你需要能够解决哪些问题。我认为这恰恰凸显了整个领域有多么困难,因为这是一些迄今为止我们从未能够通过其他手段(包括机器学习)解决的问题,但机器学习使其中一些问题变得更加明确。
随机化的必要性


另一个已经被多次指出的见解是,公平的分类器可能需要随机化。



例如,我们看到了这个例子,我们在事后调整分类器,如果你想在这里实现公平,它只能通过随机化来实现。但现在这又是这样一件事:如果你有一个理论结果告诉你,在这个场景中实现公平分类器的唯一方法是使用随机分类器,所以它至少对某一部分人群做出随机决策,这会让你思考。可能有一些应用场景,随机化也许不那么重要。
我不知道,比如税务公司,问题是你要检查哪些纳税人,你可能会随机分配你要检查的人,也许那时你运气不好,你的纳税申报被检查了,但也许这不是什么坏事。但是假设,你以随机的方式决定是否释放某人出狱,我的意思是,从伦理原则出发,你永远无法证明这是合理的,你根本不能在这种场景中使用随机分类器。





但如果你想拥有一个公平的分类器,在某些场景下你就需要这样做。所以,你再次面临社会认为可接受的事物之间的这种紧张关系。社会告诉你很多不同的事情:你的分类器应该是公平的,但它不应该是随机的。然后我们可以说,对不起,我们不能同时满足所有这些要求,你需要决定,然后我们才能尝试去做。

反馈循环


我想在这里简要提到的另一件事,只是让你意识到,就是每当你尝试进行这种公平分类时,将机器学习系统应用于社会时,会产生许多反馈循环。





例如,有一种常被称为“自我实现的预言”的现象。我之前已经举过例子:假设你有一个预测性警务系统,它说在这个区域我认为会发生更多犯罪,所以你在这个区域部署更多警察,然后他们会观察到更多犯罪,仅仅因为现在有更多警察。统计数据被更新,统计发现这个特定区域的犯罪甚至更多,所以你派遣更多警察,观察到更多犯罪。戏剧性的是,因为这些系统被持续使用,这也进入了你的数据。所以当你明年训练时,你会看到在这个你已经部署了很多警察的特定区域,犯罪率甚至增加了,所以你将要派遣更多警察。


你可以看到这会导致什么结果。所以,即使一开始你城市这些不同区域的犯罪率可能没有差异。
仅仅通过使用机器学习工具,你突然开始引入偏见,而这些偏见可能会由于反馈循环而加剧。
还有其他机制可能导致这种情况发生。这只是需要非常清楚的一点:通过使用机器学习工具,你生成了明年将用作训练数据的数据,而这当然与你去年使用的工具不是独立的。



所以,当谈论机器学习中的偏见时,请记住这一点,这是一种非常强烈的偏见来源,也可能产生非常坏的影响。






是的,我已经在这里提到了这个。你可以再看一些论文,关于这个有很多文献。


最终讨论 💭



那么,最终的讨论是什么?公平。我的意思是,这不是一个新话题。公平性在伦理学、社会学以及许多涉及决策和影响人类的领域中一直是一个长期的辩论。也有很多关于社会选择等的讨论,甚至在计算机科学中,也有许多领域从理论或技术角度处理不同的公平性概念。

我的看法是,对于这个公平性问题,不会有技术性的解决方案。



你需要做出许多不同的决定,社会也会提出许多不同的要求。


不同的要求和不同的决定会导致不同的解决方案。
这些解决方案可能具有不同的准确性,它们可能……许多这些解决方案在许多方面可能不同,最终,没有技术解决方案来决定哪一个是最好的。最终,社会必须决定。
我的看法也是,大多数这些问题最终无法通过技术解决方案来解决。
你可以让你的算法更公平一点,但最终它不会完全公平。即使你修正了一种公平性概念,比如你想实现人口统计均等,如果你试图以这种方式调整算法,使其真正符合人口统计均等,那么你的准确性将会变得非常低,以至于没有人会使用那个算法。再次强调,这里社会必须决定它认为可以接受的权衡是什么。
我认为我们在这里的角色是真正解释所有这些权衡,哪些是所有重要的变量,并勾勒出可能的场景。也许你可以说,如果这是你的场景,这将是我的解决方案;如果那是你的场景,那将是我的解决方案;这些将是后果。现在,我们可以继续决定,在最终,哪个解决方案是最可取的。
本节课中我们一起学习了提升算法公平性的三种主要技术途径:预处理、训练中处理和后处理。我们探讨了每种方法的原理、挑战和局限性,并认识到在准确性与公平性之间存在着根本性的权衡。最终,公平性问题的解决不仅依赖于技术进步,更需要社会共识和价值判断。
49:可解释机器学习 🤖

在本节课中,我们将要学习可解释机器学习。当机器学习算法应用于医疗、金融等社会领域时,其决策过程往往像一个“黑箱”,这带来了信任和问责的问题。本节课将探讨为什么需要解释机器学习模型,并介绍几种主流的解释方法。
概述 📋
机器学习算法的解释,特别是其决策结果的解释,在将机器学习应用于社会或医疗等关键领域时至关重要。例如,一个辅助诊断系统向医生提供建议时,医生需要理解系统为何做出特定诊断,才能建立信任并进行合理性检查。同样,在银行拒绝贷款申请时,申请人也有权获得解释。欧盟的《通用数据保护条例》甚至将“解释权”纳入法规。因此,研究如何让机器学习模型变得可解释,已成为一个活跃且重要的领域。
为什么需要可解释性? 🏥🏦
在医疗场景中,医生需要理解辅助系统的决策逻辑,以判断其建议是否合理,并建立对系统的信任。如果系统只是一个无法理解的“黑箱”,医生将难以采纳其建议。
在社会场景中,例如银行审批贷款,如果申请被拒绝,申请人理应获得解释。这不仅关乎公平,也符合法规要求。欧盟《通用数据保护条例》规定,在自动化决策过程中,控制者(即算法运行方)应向数据主体(即决策对象)提供有关所涉逻辑的“有意义的信息”。

解释的目标包括:
- 建立理解:让用户明白模型是如何工作的。
- 建立信任:例如,让医生信任诊断建议。
- 进行合理性检查:确保模型没有做出完全荒谬的决策。
- 提供抗辩可能:如果用户不同意决策,可以基于解释进行反驳。



然而,许多复杂的机器学习模型(如深度神经网络、支持向量机)本身并不易于解释。因此,我们需要专门的方法来为这些模型的预测提供解释。




主要的解释方法 🛠️
目前存在多种为机器学习提供解释的机制。上一节我们介绍了可解释性的重要性,本节中我们来看看几种主流的方法。以下是几种常见的解释方法:


- 基于示例的解释
- 基于特征的解释
- 反事实解释
- 局部解释
接下来,我们将逐一简要介绍。




基于示例的解释 👥
这种方法通过寻找相似案例来解释当前决策。其核心思想是:在训练集中找到与当前数据点最相似的样本,然后用这些相似样本的决策结果来解释当前点的决策。

例如,在贷款审批中,可以告诉申请人:“您的申请被拒绝,因为您的资料与另一位申请人X非常相似,而X的申请也被拒绝了。” 虽然这可能不是最令人满意的答案,但它提供了一种基于邻域推理的解释。
在医疗领域,这种方法也很有用。医生可以被告知:“当前患者的症状与另一位患者Y非常相似,Y接受了A治疗方案并康复,因此建议对当前患者也采用A方案。” 这是一种简单直观的解释机制。


基于特征的解释 🔍
这种方法通过识别对模型决策最重要的特征来进行解释。决策树和线性模型天然适合这种方法。
在决策树中,模型的结构本身就能提供解释。决策树从根节点开始,根据最重要的特征进行分裂,直到叶节点给出预测。医生可以沿着从根节点到特定诊断叶节点的路径,查看模型使用了哪些特征(如年龄、血压)进行判断,从而理解决策逻辑。

在线性模型中,每个特征都有一个权重系数。权重绝对值大的特征对最终决策的影响更大。我们可以通过以下公式来理解:
预测结果 = w1 * 特征1 + w2 * 特征2 + ... + wn * 特征n + b
其中,w1, w2, ..., wn 是权重,b 是偏置项。通过查看权重最大的几个特征,我们可以告诉医生:“模型虽然考虑了100个特征,但最终决策主要基于年龄、血压等前五个特征。” 医生可以据此判断模型的推理是否合理。



反事实解释 🔄
反事实解释试图回答这样一个问题:“需要改变什么,才能得到不同的结果?” 它与因果推理理论相关。
例如,在贷款审批中,反事实解释可能是:“如果您的年收入再增加500欧元,您的贷款申请就会被批准。” 这种解释指出了为获得理想结果所需做出的最小改变,为用户提供了明确的行动指引。

复杂模型的局部解释 🧩


对于像深度神经网络这样高度复杂的模型,很难用一个简单的全局模型(如线性模型)来准确解释其所有行为。然而,局部解释提供了一种解决方案。其核心思想是:虽然全局决策函数可能非常复杂,但在单个数据点附近的小范围内,可以用一个简单的模型(如线性模型)来很好地近似它。


假设我们有一个在高维空间中学习的复杂函数 f(x)(例如神经网络)。我们想解释对于某个特定输入 x0 的预测 f(x0)。


局部解释方法(如 LIME)的步骤如下:
- 固定关注点:确定需要解释的特定数据点
x0。 - 局部采样:在
x0附近采样生成一系列新的数据点。 - 查询黑箱:用复杂模型
f为这些采样点做出预测。 - 拟合简单模型:用一个可解释的简单模型(如线性回归)去拟合这些采样点及其对应的预测值。这个简单模型只在
x0的局部有效。 - 提取解释:使用简单模型(如线性模型的权重)来解释
x0处的决策。权重高的特征被认为是该预测的关键原因。

LIME算法的优势在于其“模型无关性”。它不需要了解原始复杂模型 f 的内部结构,只需要能够输入数据并获取预测结果。这使得它可以用于解释任何黑箱模型。

为了更直观地理解,考虑一个一维的例子。假设蓝色曲线代表复杂的预测函数 f(x),红色点 x0 是我们想解释的点。LIME会在 x0 附近采样(灰色点),然后用一条红色的直线(线性模型)去局部拟合这些点。这条直线的斜率就提供了在 x0 处的局部解释。
研究表明,LIME所识别出的重要特征,通常与复杂函数 f 在 x0 处的梯度方向高度相关,这从理论上支持了其有效性。





LIME的应用实例:图像识别 🖼️

LIME最著名的应用领域之一是图像分类。对于一张被神经网络分类为“草莓”的图片,LIME的工作流程如下:

- 生成超像素:将图像分割成多个连续的“超像素”块。
- 局部扰动:通过保留或隐藏某些超像素块来生成大量局部扰动的图像。
- 获取预测:用原始神经网络对这些扰动图像进行分类。
- 拟合解释模型:训练一个简单的模型(如线性模型),来学习“哪些超像素块的存在与否”与“预测为‘草莓’的概率”之间的关系。
- 可视化结果:将权重最高的超像素块(即对“草莓”分类贡献最大的图像区域)高亮显示出来。



最终,我们可以得到像示例中那样的图片:原始图片旁边,高亮出了草莓所在的区域。这直观地告诉用户:“模型认为这些区域是判断它为草莓的关键。”





在医疗影像分析中,这种方法尤其有价值。如果系统在CT扫描中标记出疑似肿瘤区域,医生可以要求系统给出解释。系统可以高亮出它做出该判断所依据的影像区域,帮助医生进行聚焦审查和验证。



总结与展望 🌟




本节课我们一起学习了可解释机器学习。我们首先探讨了在医疗、金融等关键领域,模型解释对于建立信任、满足法规和实现公平至关重要。接着,我们介绍了四种主要的解释方法:
- 基于示例的解释:通过相似案例进行类比。
- 基于特征的解释:利用决策树或线性模型的自身结构。
- 反事实解释:指明为改变结果所需的最小变动。
- 局部解释:针对复杂黑箱模型,在其预测点附近用简单模型进行局部近似,以提供解释,其中LIME是一个代表性算法。


可解释机器学习是一个连接技术、伦理与哲学的交叉领域。它不仅受到数据保护法规的推动,也源于我们对透明、可信人工智能的内在需求。目前,该领域仍有广阔的研究空间,未来必将持续发展,涌现出更多新方法,使机器学习在深刻影响社会的同时,也能被社会所理解和信任。
50:机器学习与社会的能源足迹 🔋





在本节课中,我们将要学习人工智能,特别是人工智能研究,所消耗的能源。我们将通过具体的数字来理解能源消耗的规模,并将其与日常生活中的其他能源消耗进行比较,以获得直观的感受。课程将首先介绍能源计量单位,然后分析欧洲人均能源足迹,接着探讨家庭设备与计算设备的能耗,最后聚焦于AI研究的能耗及其影响。


能源计量单位 📏




上一节我们介绍了课程的主题。本节中,我们来看看如何衡量能源消耗。为了理解能源消耗的规模,我们需要一个直观的计量单位。




在物理学中,有两个基本单位:
- 功率:衡量能量使用的速率,单位是瓦特。公式为:
功率 = 能量 / 时间。 - 能量:衡量总消耗量,单位是千瓦时,这通常出现在电费账单上。







为了帮助理解,我们可以用水管来类比:
- 千瓦时 相当于从水管中流出的总水量(升)。
- 瓦特 相当于水管的粗细,它决定了单位时间内能流过多少水。










为了将所有能源消耗(如汽车、飞机、食物)放在一个可比较的尺度上,我们采用一个特殊的单位:千瓦时/天。这个单位的灵感来自于大卫·麦凯的著作《可持续能源——事实与真相》。












这个单位的定义是:假设一个40瓦的老式白炽灯全天24小时开启,它每天消耗的能量大约是1千瓦时。计算如下:
1000 瓦时 / 24 小时 ≈ 41.7 瓦。因此,一个40瓦的灯泡全天运行,其功率消耗约为 1 千瓦时/天。







通过这个单位,我们可以将各种能耗转化为“相当于全天运行一个多少瓦的设备”,从而获得更直观的感受。

















欧洲人均能源足迹 🏠









了解了计量单位后,本节我们来看看一个普通欧洲人的典型能源消耗构成。以下数据来源于大卫·麦凯的著作,它列出了主要的能源消耗类别及其占比。









以下是各类别的能耗分解(以“千瓦时/天”和等效的“持续运行功率”表示):
- 驾车:假设日均驾驶50公里,约占能源足迹的20%。相当于 40 千瓦时/天 或持续运行一台 1600 瓦 的设备(如一台大功率电水壶)。
- 航空旅行:每年一次洲际航班往返,约占能源足迹的20%。相当于 30 千瓦时/天 或持续运行一台 1200 瓦 的设备。
- 食物:生产我们所吃的食物所需的能源,约占10%。相当于 15 千瓦时/天 或持续运行一台 600 瓦 的设备。
- 供暖与制冷:在欧洲,这是最大的能源消耗项之一,约占37%。相当于 37 千瓦时/天 或持续运行一台 1500 瓦 的设备。
- 物品制造:生产我们消费的所有物品(如电脑、汽车、报纸)所消耗的能源,总计约占30%。







这些是平均值,个人情况会有所不同,但它们提供了能耗数量级的基本概念。















家庭与计算设备能耗 💻








上一节我们了解了宏观的能源足迹。本节中,我们具体看看家庭中常见设备以及计算设备的能耗,并找出那些容易被忽视但消耗巨大的“能源黑洞”。










以下是常见设备的功率范围及其影响:
- 冰箱:旧冰箱功率可达150瓦,新冰箱可低至20瓦。一台150瓦的旧冰箱持续运行,其能耗约占你驾车能耗的10%。
- 供暖循环泵:旧泵功率约150瓦且常年在冬季持续运行,非常低效。新型高效泵功率约50瓦。
- 灯泡:老式白炽灯功率40-100瓦。新型LED灯功率仅3-15瓦,节能约90%。
- 卤素射灯:过去流行的天花板卤素射灯功率可达500瓦,极其耗能,可更换为约30瓦的节能型号。
- 计算与网络设备:
- LED显示器:约50瓦。
- 小型电脑(如Mac Mini):60-85瓦。
- WiFi路由器:约10瓦。
- 手机充电器:空载时(未连接手机)功耗仅0.012瓦,充电时也不到1瓦。与冰箱等设备相比,其能耗微乎其微。








关键结论:真正影响你能源足迹的是那些24小时不间断运行的设备。例如:
- 一台60瓦的网页服务器全年不间断运行,消耗约 1.5 千瓦时/天,这相当于你食物能耗的10%。
- 一个10瓦的WiFi路由器全年不间断运行,累积的能耗也相当可观。










因此,重要的节能措施是:不用时请关闭这些设备(如夜间或离家时关闭WiFi路由器)。相比之下,拔掉手机充电器对个人能源足迹的影响很小。此外,交通(尤其是航空旅行)是最大的能源消耗项之一,一次洲际飞行就可能增加20%的能源足迹。




















AI研究的能源消耗 🤖
现在,让我们将焦点转向人工智能研究本身的能源消耗。本节中,我们来估算一下训练AI模型所需的计算能耗。
以下是基于典型硬件和任务的估算:
- 单GPU功耗:约300瓦。
- 单CPU满载功耗:约100瓦。











一个计算示例:假设使用10块GPU训练一个深度神经网络,持续一周。
- 总能耗计算:
10 GPU * 300瓦 * 24小时/天 * 7天 = 504,000 瓦时 = 504 千瓦时。 - 如果将此能耗分摊到一年中,相当于每天 1.4 千瓦时。这大约是一个欧洲人食物能耗的10%。








如果一位研究者进行10周这样的训练,那么其计算能耗将与全年的食物能耗相当。因此,AI研究的计算能耗是显著的。






对AI研究者的建议:
- 负责任地使用计算资源:在将代码部署到GPU集群进行长期训练前,务必先在小型实例上充分测试和调试。
- 先规划,后实验:盲目尝试所有想法会浪费大量能源。花时间思考实验设计的合理性。
- 保持理性的比较:虽然AI训练耗能,但参加国际会议的航班能耗通常远高于此。例如,飞往美国参加会议的往返航班,其个人能耗占比可能远超数周GPU训练的能耗。这引发了关于减少学术飞行、更多采用线上会议的思考。










全球视角:从全球范围看,数字技术的能耗总量巨大。例如(基于2017年估计):
- 谷歌全球年用电量约为 6 太瓦时。
- 比特币挖矿年用电量约为 20 太瓦时。
作为对比,德国全年发电量约为 250 太瓦时。虽然数字技术的能耗规模显著,但尚未达到国家总发电量的级别。

















AI的节能潜力与个人行动 🌱







上一节我们讨论了AI的能耗问题。本节中,我们来看看AI是否也能帮助节能,并总结个人可以采取的有效行动。









AI确实在某些领域具有节能潜力:
- 智能电网管理:预测供需,优化电力调度。
- 精准农业:优化灌溉、施肥,减少资源浪费。
- 高效生产:优化工业生产线,降低能耗。








然而,目前这些应用大多处于愿景或早期阶段,其所能实现的节能规模,与AI及整个数字技术领域当前消耗的能源相比,可能尚未形成平衡。因此,声称“AI耗能但未来能省更多”目前更像是一种说辞,而非已实现的成果。










本节课的最终总结与个人行动指南:








本节课中我们一起学习了如何量化并理解能源消耗,特别是AI研究的能耗。主要要点如下:










- AI研究的能耗不容忽视:计算(GPU训练)和学术旅行(飞行)是两个主要来源。应负责任地使用计算资源,并尽可能减少不必要的飞行,多采用线上会议。
- 理解公共讨论的语境:当公众讨论“AI能耗”时,往往指的是包括视频流媒体、云服务在内的整个数字技术产业的能耗,而不仅仅是AI研究。
- 个人可以采取高效节能行动:关键在于关注数量级。最有效的个人行动包括:
- 避免飞行:尤其是长途休闲旅行和可避免的短途学术飞行。
- 减少驾车:在可能的情况下使用公共交通,选择高效的小型车辆。
- 更换老旧高耗能设备:特别是那些24小时运行的设备,如冰箱、灯泡、供暖泵。
- 关闭不用的常开设备:如WiFi路由器、网页服务器。
- 投资房屋节能:良好的隔热、使用太阳能等。这更多是为了地球而非短期经济回报。









希望本课程能帮助你建立起对能源消耗的直观认识,并在研究和生活中做出更明智的决策。
51:低秩矩阵补全算法 🧩








在本节课中,我们将要学习低秩矩阵补全问题及其算法。这是一个在推荐系统(如Netflix电影推荐)中非常经典的问题,其核心目标是根据一个大型矩阵中少量已知的条目,来估计所有未知的条目。






问题引入:Netflix挑战赛








上一节我们介绍了低秩矩阵补全的背景。本节中我们来看看一个著名的实际应用案例。




考虑Netflix的场景:你有许多用户和许多电影。某些用户观看了电影并给出了评分。你可以尝试将所有评分存储在一个矩阵中。










- 矩阵的行对应用户。
- 矩阵的列对应电影。
- 矩阵中的条目
M[i, j]表示用户i对电影j的评分。





然而,这个矩阵的绝大部分是空的,因为大多数用户没有看过大多数电影。矩阵补全问题的目标就是估计所有缺失的条目。例如,为了向用户推荐一部新电影,我们需要预测该用户对所有未观看电影的潜在评分。










十多年前,机器学习社区有一个非常著名的挑战赛——Netflix挑战赛。其数据包含约2万部电影、50万用户和约10亿个评分。这意味着只有大约1% 的矩阵条目是已知的。比赛的目标是设计一个算法,其预测缺失条目的效果比Netflix自己的算法好至少10%,优胜者将获得100万美元的奖金。这成为了机器学习社区的一个历史性事件。







问题的一般形式化











现在让我们回到矩阵补全的一般性问题设定。







我们有一个未知的 m × n 矩阵 M(例如,m个用户,n个电影)。我们只能观察到该矩阵的一部分条目。在后续讨论中,我们做一个重要假设:被观测条目的位置是随机选取的。这类似于标准分类任务中,我们假设训练样本是从底层分布中随机抽取的。这个假设排除了对抗性设置,使得问题有可能被解决。






我们的目标是估计所有未知的条目。







在深入算法之前,思考一下这个问题的可解性非常重要。如果我们对底层矩阵 M 不做任何假设,例如它的每个条目都是独立随机生成的(如抛硬币),那么无论我们观察到多少条目,都无法对未观察到的条目做出任何推断。因此,我们需要一个归纳偏置,即对矩阵 M 的结构做出假设,以限制解的搜索空间,防止过拟合。







核心假设:低秩性






本节我们将介绍解决矩阵补全问题的核心假设。
该领域普遍使用的假设是:我们寻找的矩阵具有低秩。从理论角度看,低秩矩阵的集合比高阶矩阵的集合更小。从实践角度看,这个归纳偏置往往效果很好。





我们可以做一个合理性检查:随机生成的矩阵通常具有很高的秩(其特征值遵循半圆律),因此不会被低秩模型很好地近似。这与我们的直觉一致,即完全随机的矩阵无法被补全。

现在让我们形式化地定义矩阵补全问题。

我们用 Ω 表示观测到的条目索引集合 (i, j)。对于这些索引,我们知道其值 M[i, j]。






我们想要找到一个矩阵 X,使得:
X在观测位置上的条目与已知值尽可能一致。X的秩尽可能低。









这可以写成以下优化问题(精确恢复版本):
最小化 rank(X)
约束条件:P_Ω(X) = P_Ω(M)
其中 P_Ω 是到观测条目集合 Ω 上的投影算子。








更常见的是考虑近似恢复的版本,例如正则化形式:
最小化 ||P_Ω(X) - P_Ω(M)||_F^2 + λ · rank(X)
其中 ||·||_F 是Frobenius范数,λ 是正则化参数。









然而,矩阵的秩函数是不连续且非凸的,导致上述优化问题是NP难的。微小的扰动可能使矩阵的秩发生剧烈变化,这使得基于梯度的优化方法非常困难。







从硬阈值到软阈值









由于直接优化秩是NP难问题,我们需要寻找高效的启发式算法。首先介绍一种简单方法。






硬补全算法 是一种迭代方法:
- 初始化:对未知条目进行随机猜测,填充矩阵。
- 迭代直至收敛:
a. 对当前矩阵进行奇异值分解。
b. 只保留前r个最大的奇异值及其对应的奇异向量,重构一个低秩矩阵X_k。
c. 将X_k在观测位置Ω上的值替换为真实观测值,得到新的填充矩阵,进入下一轮迭代。


这个方法有时有效,但并不完全令人满意。问题的核心在于秩约束太“硬”。我们需要找到一个更“软”的替代函数来度量矩阵的复杂性。


这让我们回想起在Lasso回归中处理稀疏性的方法。我们希望找到一个系数向量,其中大部分系数为零。衡量稀疏性最直接的方法是计算非零系数的数量(l_0 范数),但这导致非凸优化。实践中,我们使用 l_1 范数作为凸松弛,它通常能产生稀疏解。








类似地,对于矩阵的低秩性,我们可以进行类比。一个矩阵的秩等于其奇异值向量中非零元素的个数(即奇异值向量的 l_0 范数)。受Lasso启发,一个自然的凸松弛是使用奇异值向量的 l_1 范数。







核范数:秩的凸松弛










本节我们引入核范数,作为矩阵秩的凸松弛。




给定矩阵 X,令 σ(X) = [σ_1, σ_2, ..., σ_r] 为其奇异值向量。矩阵的秩是 ||σ(X)||_0。我们将其松弛为 l_1 范数,即所有奇异值之和:
||X||_* = σ_1 + σ_2 + ... + σ_r
这个范数被称为矩阵的核范数 或迹范数。可以证明,核范数是矩阵秩的最紧凸松弛。



利用核范数,我们将原来的NP难问题转化为凸优化问题:
最小化 ||P_Ω(X) - P_Ω(M)||_F^2 + λ ||X||_*
现在的问题是:我们能否为这个问题找到高效的算法?考虑到实际应用(如Netflix)中矩阵规模巨大(百万×百万),算法的效率至关重要。


软补全算法
现在,我们介绍一个高效且具有理论保证的算法——软补全算法。其核心组件是软阈值操作。
软阈值操作 定义如下:对于矩阵 Z,进行奇异值分解 Z = U diag(d) V^T,其中 d = [d_1, d_2, ...] 是奇异值向量。给定阈值参数 λ > 0,软阈值操作 S_λ(Z) 生成一个新矩阵,其奇异值为 [s_λ(d_1), s_λ(d_2), ...],其中软阈值函数为:
s_λ(x) = sign(x) · max(|x| - λ, 0)
这意味着:
- 所有绝对值小于
λ的奇异值被置为0。 - 所有绝对值大于
λ的奇异值向零收缩λ。

软阈值操作总是降低矩阵的核范数,并且通常会降低矩阵的秩(通过将小奇异值置零)。





一个关键结论是:对于完全已知的矩阵 Z,优化问题 最小化 ||X - Z||_F^2 + λ ||X||_* 的全局最优解恰好就是一次软阈值操作的结果:X^* = S_λ(Z)。
基于这个结论,我们可以设计处理部分观测矩阵的算法。




软补全算法 流程如下:
输入:部分观测矩阵 P_Ω(M),一组递减的阈值参数 λ_1 > λ_2 > ... > λ_K。
- 初始化
X^old = 0。 - 对于每个
λ_k(从大到小):
a. 重复:
i. 构造矩阵Z = P_Ω(M) + P_{Ω^⊥}(X^old)。即将观测值固定在正确位置,未知位置用当前估计X^old填充。
ii. 对Z应用软阈值操作:X^new = S_{λ_k}(Z)。
iii. 如果X^new与X^old足够接近,则跳出内循环;否则令X^old = X^new,继续迭代。
b. 得到对应于λ_k的解。 - 输出一系列对应于不同
λ_k的解。



算法解释:
- 内循环(固定λ):在每次迭代中,它将观测值“钉”在正确位置,然后对当前完整矩阵进行软阈值降秩估计,并迭代此过程直至收敛。这可以看作是在强制满足观测约束和追求低核范数之间进行迭代权衡。
- 外循环(递减λ):从一个较大的
λ(对应更强的低秩约束,更容易优化)开始,然后逐渐减小λ(放松约束,追求更精确的拟合)。这是一种路径追踪策略,提高了算法的稳定性和效率。
该算法可以证明,对于合适的参数选择序列,其解会收敛到全局最优解。更重要的是,该算法可以高效实现,即使对于像Netflix那样大规模(亿级条目)的矩阵,也只需数小时即可完成。实现的关键在于利用矩阵的结构:P_Ω(M) 是稀疏的(仅少数观测值),而中间估计矩阵 X 是低秩的,可以利用高效的稀疏+低秩矩阵运算。
实践表现与总结

最后,我们来看看软补全算法在实践中的表现,特别是Netflix数据上的结果。






下图展示了在Netflix数据上,硬补全与软补全算法的比较:
- 左图:横轴是所用模型的秩(或对应的复杂度),纵轴是均方根误差。实线表示测试误差,虚线表示训练误差。可以看到,两种方法都能显著降低误差(随机猜测的误差约为2,而算法能达到约0.95)。软补全(红色)的测试误差略优于硬补全(绿色)。
- 右图:展示了训练误差与测试误差的关系。虚线表示Netflix官方算法的性能。软补全算法可以达到甚至略微超越这个基准性能。








本节课中我们一起学习了低秩矩阵补全问题及其核心算法。我们从Netflix挑战赛的实际问题出发,形式化了矩阵补全任务,并指出其需要低秩假设才可求解。由于直接优化矩阵秩是NP难问题,我们引入了核范数作为其最紧凸松弛。在此基础上,详细介绍了软补全算法,该算法基于软阈值操作,通过迭代地在观测约束和低核范数目标之间进行优化,能够高效地求解大规模矩阵补全问题,并具有理论收敛保证。实践表明,该算法在真实数据集上表现优异。
52:低秩矩阵补全理论
在本节课中,我们将探讨低秩矩阵补全算法的理论基础。上一节我们介绍了算法的实践表现,本节中我们来看看其背后的理论保证。
理论直觉的建立
首先,我们尝试建立一些关于矩阵补全所需观测条目数量的直觉。
考虑一个任意的矩阵 Z。为简化起见,假设它是一个方阵,即 P × P 矩阵。假设我们均匀随机地观测到这个矩阵的 n 个条目。问题是:为了成功(至少近似地)重建这个矩阵,我们大概需要观测多少个条目?
以下是几个需要考虑的基本限制条件:
- 空行/空列问题:如果矩阵的某一行或某一列没有任何被观测到的条目,那么我们将无法对该行或列做出任何预测。这就像一个用户没有提供任何评分,或者一部新电影无人观看。
- 参数数量问题:假设矩阵是低秩的,秩为 r。一个 P × P 的秩 r 矩阵,本质上可以由 r 个向量(例如奇异向量)描述,每个向量有 P 个元素。因此,我们需要估计大约 r × P 个参数。
基于以上两点,一个合理的直觉是,我们需要观测的条目数量 n 至少要与 P log P(确保覆盖所有行列)和 r × P(估计参数)同阶。
相干性条件
然而,仅凭秩和大小不足以完全描述问题的难度。考虑以下极端矩阵:
[[1, 0, ..., 0],
[0, 0, ..., 0],
...,
[0, 0, ..., 0]]
这个矩阵的秩为1,看似简单。但如果我们随机采样条目时恰好错过了左上角那个关键的“1”,我们就无法恢复原始矩阵。问题在于,这个矩阵的信息高度集中在少数条目上。
这种现象由“相干性”这一概念来刻画。它衡量了矩阵的奇异向量(或特征向量)与标准基向量的对齐程度。
相干性的定义
设 U 是 R^d 空间的一个子空间,P_U 是到该子空间上的投影算子。子空间 U 相对于标准基 {e_i} 的相干性 μ(U) 定义为:
μ(U) = (d / dim(U)) * max_i ||P_U(e_i)||^2
其中,dim(U) 是子空间 U 的维度。
直观理解:我们计算每个标准基向量投影到子空间 U 上的长度,并取最大值。这个值越大,说明子空间越与某个坐标轴对齐,相干性越高,矩阵补全越困难。
相干性的例子
- 高相干性(难):上面例子中的单元素矩阵,其相干性为1(最大值)。
- 低相干性(易):所有元素都为1的矩阵,其奇异向量是均匀的,相干性为 1/P(最小值)。
- 随机低秩矩阵:通过 Z = U V^T(其中 U, V 是 P × r 的随机矩阵)生成的矩阵,通常具有较低的相干性,特别是当秩 r 较小时。
核心结论:相干性低意味着矩阵的所有条目重要性相当,随机采样效果较好;相干性高意味着信息集中在少数条目,随机采样容易错过关键信息。
理论恢复保证
基于相干性等概念,可以推导出严格的矩阵补全理论保证。这些定理通常具有以下形式:

精确恢复定理
假设一个 n1 × n2 的矩阵 M 的秩为 r,其行空间和列空间的相干性以常数 μ0 为界,且矩阵最大元素值以 μ1 为界。若我们均匀随机观测到 m 个条目,且 m 满足:
m ≥ C * (μ0, μ1) * r * max(n1, n2) * log^2(max(n1, n2))
那么,通过求解核范数最小化问题(例如软填充算法),能以至少 1 - n^{-3} 的高概率唯一且精确地恢复出原始矩阵 M。
近似恢复定理
在存在噪声(观测值为 M + 噪声)的情况下,也有类似的近似恢复定理。若观测条目数 m 满足类似条件:
m ≥ C * r * (n1 + n2) * log(n1 + n2)
则恢复矩阵 M_hat 与真实矩阵 M 的Frobenius范数误差有上界,且该误差随观测条目数增加而减小。
定理的启示:
- 所需观测条目数 m 的量级约为 r × P × log P,这与我们最初的直觉一致。
- 常数 C 依赖于相干性 μ。相干性越低,常数越小,所需样本越少。
- 在最优情况下(低相干性、低秩),我们仅需远少于矩阵总元素数 P^2 的观测值即可恢复。
- 在最坏情况下(高相干性),可能需要观测几乎全部元素(量级为 P^2),此时矩阵补全失效。
数值模拟验证
理论需要实践的检验。我们通过模拟来验证上述理论行为。
实验设置

- 生成真实矩阵:创建秩为 r 的 P × P 随机矩阵 Z。常用方法是生成两个 P × r 的随机高斯矩阵 U 和 V,然后令 Z = U V^T。
- 采样观测值:从 Z 中均匀随机选取一定比例(如20%, 60%)的条目作为观测值。
- 矩阵补全:使用算法(如软填充)从观测值中恢复矩阵 Z_hat。
- 评估:
- 无噪声精确恢复:重复实验多次,计算能精确恢复(Z_hat == Z)的比例。
- 有噪声近似恢复:向 Z 添加高斯噪声得到 Z_noisy,从 Z_noisy 的部分观测中恢复,计算相对误差:
平均误差(||Z_hat - Z_noisy||_F) / 噪声标准差。
模拟结果分析
以下是模拟结果的关键发现:
- 无噪声精确恢复:
- 成功率随缺失比例增加而下降。
- 成功率随矩阵真实秩 r 增加而显著下降(问题变难)。
- 一个反直觉的现象:对于固定的秩 r,矩阵维度 P 越大,成功率反而越高。可能的解释是:需要估计的参数为 rP,而总信息源(矩阵元素)为 P^2,其比值 r/P 随着 P 增大而减小,意味着每个参数分摊到的信息更多。

- 有噪声近似恢复:
- 恢复误差随缺失比例增加而增加。
- 恢复误差随矩阵真实秩 r 增加而增加。
- 误差曲线在“最优可能误差”(相对误差≈1)附近变化,当问题变难(高缺失、高秩)时,误差会显著偏离该基准。
文献与历史背景
低秩矩阵补全是一个相对年轻的领域:
- 奠基工作:Fazel 等人的博士论文将核范数作为秩的凸松弛,是关键的第一步。
- 理论突破:Candès, Recht, Tao 等人在2009年前后的一系列 seminal 论文,给出了基于相干性等概念的严格恢复保证。
- 应用背景:著名的 Netflix 推荐系统竞赛(2006-2009年)极大地推动了该领域的发展。
- 总结性著作:《Statistical Learning with Sparsity》(2015年)等书籍对其进行了系统总结。
总结

本节课中我们一起学习了低秩矩阵补全的理论基础。我们首先建立了关于所需观测数量的直觉,然后引入了关键的相干性概念来刻画问题的难易程度。基于此,我们介绍了精确恢复和近似恢复的理论保证定理,其核心结论是:在低相干性和低秩的有利条件下,仅需 O(rP log P) 量级的随机观测即可恢复矩阵。最后,我们通过数值模拟验证了理论预测的趋势,并讨论了该领域的历史发展脉络。这些理论不仅优美,也为实际应用提供了坚实的指导。
53:压缩感知 📡




在本节课中,我们将要学习一个非常有趣且实用的概念——压缩感知。我们将探讨它如何让我们用远少于传统方法的数据量来记录和重建信号,例如图像或音频。
概述

传统的信号采集方式(如手机拍照)会先记录一个高分辨率的原始信号,然后再进行压缩。压缩感知的目标是绕过这个“先记录后压缩”的步骤,直接在采集时就获得信号的压缩版本。这在存储空间有限或采集过程昂贵(如医学核磁共振成像)的场景下具有巨大价值。
什么是压缩感知?
现在,考虑你手机中的相机。这类相机通常的工作方式是拥有许多不同的光传感器,每个传感器在图像的特定位置记录某种颜色的光强度。相机会首先以原始格式存储图像,该格式为每个像素值记录该像素中不同光线的数量。

然后,通常作为第二步,你会压缩这些图像,例如将其转换为JPEG文件。你从一个可能是10兆字节的文件开始,最终得到一个500千字节的文件,但观察这两个图像,你几乎看不出它们之间的明显差异。
这里我们有一个例子。在左侧,我们看到一个原始图像。然后我们进行小波压缩(一种特定的图像压缩方式)。在右侧,你看到的是压缩后的同一图像。观察它,你至少从视觉上看不出左右两侧图像之间的巨大差异,然而存储这些图像所需的大小却截然不同。

现在的想法是,有时你的记录设备本身没有太多内存。假设在手机的早期,我们没有120GB的存储空间,手机上的存储空间非常小,但你仍然想记录一张图像。当你记录图像时,它很大,但压缩后会更小。因此,真正理想的是我们可以省略“先获取这个大图像,然后再压缩它”的步骤,直接在记录图像时生成这个压缩版本。

实现这一点的领域被称为压缩感知。“感知”意味着我们采集信号,无论是图像信号还是某种音频信号,或其他类型的应用。你想采集一个信号,但希望以一种直接获得压缩版本的方式进行,而不是先获取完整细节。

这有很多应用,比如我刚才提到的:你可以有一个存储空间或电量很小的相机,你仍然想存储图像,你无法负担存储一个1000万像素的图像,但你最终仍想获得一张好图像。另一个应用来自医学领域,例如核磁共振成像。其工作方式是将人放入扫描仪,然后核磁共振扫描身体的特定部位。但扫描需要很长时间,因为你需要为不同的切片进行多次扫描,因此扫描一个人可能轻松花费15到20分钟。同样,你最终会得到一个非常庞大的数据文件。如果你能加速这个过程,说“我不需要感知图像的某些方面”,那将非常棒。也许这比以“笨拙”的方式扫描所有内容更快,而是尝试实现一种巧妙的扫描,最终直接得到一个压缩的图像。
压缩感知的设定
现在,其设定如下。通常,我们假设我们想要观察一个在 R^D 空间中的向量。通常,这个向量也不是稀疏的,比如一张图像。如果我们基于像素编码图像,那么图像本身并不稀疏。它会告诉我们每个特定像素的光强度。
然而,其基本假设是,可能存在一个不同的基,在这个基下,我们可以用稀疏的方式表示我们的图像。例如,这可以是一个小波基。因此,如果我们用小波基编码图像,也许我们只需要大约200个小波系数,就可以编码一个原本需要1000万像素的图像。当然,这是一种有损压缩,但可能在视觉上看不出任何损失。
现在的技巧是,当然,如果我们知道数据在其中是稀疏的那个基,我们就知道这个变换,那么技术上我们就可以完成从非稀疏信号到稀疏信号的转换。但通常,如何做到这一点并不明确。特别是,我们希望避免获取这个完整信号的步骤。现在的技巧是,我们想要发明一个基,使得所有稀疏的图像都能以一种有用的方式被压缩。
我们将使用以下符号,并尽量在所有幻灯片中保持一致:
- D 始终是原始空间的维度。
- S 是信号的稀疏度。即,在这个有趣的基中,如果你用这个基表示图像,有多少个条目是非零的。
- K 是我们实际希望实现的测量次数,希望它也很低。

显然,仅从定义来看,我们总是有 S ≤ K ≤ D。


单像素相机示例 🎥
在深入理论之前,我想用一个非常酷的例子来说明这在实践中是如何工作的,即单像素相机。与记录数百万像素的标准相机不同,然后应用像JPEG这样的压缩算法。现在我们要做的是构建一个每次只能记录一个特定像素的相机。
在每一个时间点,我们只有一个可以记录光量的传感器,但我们想用这种相机感知整个场景。我们不想以将相机移动到场景中所有不同位置并“愚蠢地”记录数百万像素的方式来做,而是希望有一种更高效的方式。

下图展示了它的工作原理。想象一下,在图像的顶部,有一个光电二极管,这是你可以记录的那个像素。在插图的左侧,你看到一个场景,这是我们想要拍照记录的场景。


关键部分是这里的阵列。这个阵列是一个由许多微小镜子组成的微型设备。这些镜子可以以某种方式打开或关闭,使得镜子将场景中对应于镜子特定部分的光反射到光电二极管,或者不反射。本质上,在图像中,例如,黑色方块表示镜子是打开的,因此它会将来自场景的任何光反射到光电二极管;而白色部分则不会向光电二极管反射任何光。
现在你看到的是,我们有一个随机的镜子位置组合,其中一些镜子位置被打开,一些被关闭。因此,光电二极管记录到的本质上是来自这些黑色镜子的所有信号的总和。你可以将其视为:你有一个场景,你随机打开和关闭一些像素,然后对已打开的像素的强度求和。这就是你记录的内容。
好的,这是第一次。你首先这样做一次,你有一个固定的镜子布局,对你的场景拍照,你得到一个数值,对应于描述这个图像的一个数字,即这些随机选择的像素的总和。

现在,技巧当然是,我们再次这样做。现在我们取一个不同的黑白组合。现在我们选择这些镜子被打开和关闭的不同随机位置。再次,光电二极管记录针对这种特定镜子布局我们获得的总强度。
现在我们重复这个过程多次。现在的问题是,假设我们这样做100次,所以我们有100张“图像”,每张图像对应一个数字。现在的问题是,基于我们记录的这100个数字,我们能否重建原始图像?答案将是肯定的。


为了给你一些数字,这里图像的分辨率是64x64,由4096个像素组成。在这个我们将要看到的特定例子中,我们选择 K = 1600,所以我们进行1600次测量。我们用这些镜子的随机布局重复这个测量过程1600次,然后我们将重建图像。你可以看到,从我们实际进行的1600次测量到原始图像格式,我们节省了大约一半的存储空间。对于这个玩具例子来说,这并不十分令人印象深刻,但我仍然觉得它非常令人印象深刻,因为它是这样的:
在左侧,你有一个64x64像素空间中的原始足球灰度图像。在右侧,你现在可以看到由这个单像素相机拍摄的1600次测量重建的图像。我觉得这非常酷,因为它为许多应用打开了大门,并且它确实有效这一事实也令人着迷和惊讶。


工作原理的文字描述

让我们回到文字描述来理解其工作原理。其工作方式是,你有一个细菌大小的微小镜子阵列,用于获取入射光的随机样本。每个镜子可以以两种方式之一倾斜:要么将光反射到光电二极管,要么远离它。因此,光电二极管接收到的光是所有打开的镜子的图像的线性组合,只是一个数字。传感器接收到的光是许多像素的加权平均,即所有被打开的像素。


一个镜子配置 w_i 产生我们信号的一个线性测量(线性是因为它是像素的线性组合)。现在我们重复这个过程 K 次,因此我们得到 K 个不同的测量值 w_1 到 w_K。下一步是我们希望能够重建原始图像。
现在,我们将在本讲座过程中推导的理论结果是:通过采集大约 S log(D/S) 次快照(每次快照我们取一个不同的随机镜子选择),单像素相机能够获取一张可识别的图片,其分辨率可与 D 像素相媲美。
这里有趣的是,K 大约是 S log(D/S)。S 是我们需要假设可以实现的稀疏度。log(D/S) 可能并不大。所以本质上,它几乎是线性的,只比 S 大一点点。S 是你能实现的最佳稀疏度,这是我们需要代入算法的假设。假设是:我们可以在一个稀疏度为 S 的基中表示它。那么,我们只需采集比 S 多一点的快照,就可以恢复它。这真的很酷。
概念性视角

现在让我们从更概念性的角度来看待这个问题。我们将设计 K 个不同的线性测量,称为 w_1 到 w_K。在这个例子中,这是通过特定的硬件完成的,但这就是感知方法。重要的是,我们在看到信号之前就构造了这些测量。我们可能先绘制所有镜子的随机布局,但这不是说我们先以某种高分辨率看到图像,然后由巨型计算机告诉我们放置镜子的最佳方式;我们放置镜子一次,然后才看到信号。这很重要。我们想要的是,我们选择 K 种不同的布局,但只要满足某些假设,它就应该对所有传入的信号都有效。

因此,我们首先设计线性测量,然后“自然”在 R^D 高维空间中选择一个未知信号 x(其中 D 很大)。现在我们直接接收测量结果,在幻灯片上称为 x̃_1 到 x̃_K,这只是原始信号与感知设备的线性组合。这导致 K 个测量值,形成一个 K 维向量空间中的向量。然后我们应该从我们采集的测量值 x̃ 中重建原始图像 x。正如我在幻灯片末尾所说,目标是设计一组单一的测量向量,使其对所有信号都工作良好,这样无论传入的信号是什么,我们都能很好地重建信号。
矩阵表述与核心问题
这是另一种描述方式,现在用矩阵表述。同样,我们有信号 x。我们无法直接测量 x,但我们可以测量它的压缩版本,这现在被编码到一个矩阵 W 中。本质上,我们将所有这些向量 w_1 到 w_K 堆叠起来,将它们放入一个称为大写 W 的矩阵中。因此,我们得到的是一个测量值 x̃,它是 W 乘以 x,现在存在于一个低维空间 R^K 中,并且 K 远小于 D。这个矩阵 W 是在我们看到数据之前选择的,所以我们选择矩阵 W 一次,然后持续用它来记录数据,然后我们想从这个低维表示中重建高维信号。

现在这里有一个问题给你。现在我们有了这个方程:x̃ = Wx。我们想重建 x。那么你认为解决这个问题的自然方法是什么?也许花几分钟思考一下。你会如何解决它?然后可能有什么问题?
也许你已经找到了解决方案。解决这个问题的朴素方法是说:我们有一个线性方程组 x̃ = Wx,我们直接解它。我们知道 x̃,我们知道 W,所以我们解出 x。然而,我们将遇到的问题是这个线性系统是完全欠定的。我们有 K 个方程(即我们进行的测量),但我们有 D 个未知数(所有原始变量)。K 远小于 D。那么这个系统就有很多很多解,无限多个解。我们不知道应该选择哪一个。除非我们做出任何假设,否则我们无法摆脱这个困境。我们有一个线性方程组,它是欠定的,有无穷多个解。如果我们没有任何归纳偏置,不知道选择这些解中的哪一个,那么它将无法工作。
归纳偏置:稀疏性假设
现在,有趣且酷的见解是,我们可以选择什么样的归纳偏置来使这件事成功。我们将要做的归纳偏置是:我们正在寻找的信号是稀疏的。我们已经看到了许多在矩阵问题上施加归纳偏置的不同方式,例如说矩阵是低秩的。对于一个向量,施加归纳偏置的一种自然方式是:向量是稀疏的,这个向量的大多数条目应该是零。
核心定理

现在,这是我们想要看的第一个定理,我们将在本讲座中推导它。


定理:固定信号长度 D(高维空间的维度)和稀疏度级别 S。令 W 是一个 K × D 矩阵,其中 K 选择为我们之前看到的数量级,即 S log(D/S)。该矩阵的每个条目都独立地从标准正态分布中选择。那么,在矩阵 W 的选择上,以高概率发生以下情况:每个 S-稀疏的信号都可以从感知方程 x̃ = Wx 中高效地恢复。我们如何恢复它?我们可以通过求解一个优化问题来恢复它,即最小化 x 的 L1 范数,并满足线性系统被满足的约束。

这个定理做出了三个非常有趣的陈述:
- 感知矩阵 W:我们可以将其选择为一个随机矩阵,其中条目独立地从正态分布中抽取。这很好,它应该让你想起我们在之前一节课中看到的东西,即 Johnson-Lindenstrauss 引理。在某种意义上,这个矩阵生成 K 个随机投影,而随机投影具有某些良好的数学性质。
- 测量次数 K:我们需要大约 S log(D/S) 次感知。这几乎是信号稀疏度 S 的线性关系。这很有意义,因为如果你想恢复一个有 S 个非零项的向量,你很难想象在不进行至少 S 次单独测量的情况下恢复这样的向量。
- 重建算法:一旦我们进行了压缩感知并记录了信号,我们如何重建原始信号?定理说算法是:你只需在满足线性系统的条件下,最小化向量的 L1 范数。

这个定理基本上涵盖了我们想要的一切。现在我想逐步推导这个定理的背景。

为什么是 S log(D/S)?
在深入之前,这里有一个问题:你认为 S log(D/S) 好吗?我已经给出了答案,我认为它非常好。让我解释一下原因。



我们正在寻找一个长度为 D 的向量,它有 S 个非零分量。我们知道非零分量的数量,但我们不知道这些非零分量在哪里。那么,这些分量可能位于多少个不同的子集中?在所有 D 个位置中,有 C(D, S) 个大小为 S 的子集。原则上,要完美解决这个问题,朴素的方法是尝试所有这些 C(D, S) 个子集,然后尝试通过让这些子集非零而其他所有都为零来重建。当然,这是朴素的方法。有一个更高效的算法,你可以证明这个算法需要大约 log C(D, S) 次尝试。这个参数类似于基于比较的排序的下界论证。最终结果是 log C(D, S) 大约是 S log(D/S)。这确实是一个有意义的数字。
证明的关键步骤

现在,让我们看看证明这个定理的关键步骤是什么。
- 第一步:如果我们选择的矩阵具有某种称为限制等距性质 的特性,那么任何 S-稀疏向量都可以从其压缩图像中恢复(至少通过一种低效的算法,即最小化 L0 范数的算法)。
- 第二步:然后,非常令人惊讶的是,我们可以通过最小化 L1 范数 而不是 L0 范数 来同样好地做到这一点。L1 范数 非常好,这是我们过去已经多次看到的相同论点,例如在 Lasso 中,我们说用 L1 范数 约束解决回归问题,而不是用 L0 范数 约束。在矩阵补全中,我们说用核范数(迹)代替矩阵的秩。在这种情况下,我们甚至可以证明,从 L0 到 L1,我们不会丢失任何东西,我们仍然可以找到最优解。这很酷,而且可以证明它是有效的,这令人惊讶。
- 第三步:现在我们说,如果我们有这样一个具有限制等距性质的矩阵 W,那么通过最小化 L1 范数,我们实际上可以写出一个有效的算法。最后一个隐藏的部分是:我们如何构造这样的矩阵 W?答案将是:我们可以简单地使用一个条目从正态分布中抽取的随机矩阵,这将完成这项工作。

现在让我们深入每个步骤。
第一步:限制等距性质
首先,我们想定义这些 RIP 矩阵。

定义:一个矩阵 W 被称为满足 ε-2S 限制等距性质,如果对于所有稀疏度至多为 S 的非零向量 x,都有:
(1 - ε) ≤ ||Wx||^2 / ||x||^2 ≤ (1 + ε)
观察:在理想情况下,你希望 W 可能像单位矩阵一样,对你的向量不做任何改变,那么你在这里实现的最佳比率是 1。现在,当我们进行感知时,我们允许从 1 偏离一点,但不超过 ε。这需要对所有稀疏度至多为 S 的向量都成立。显然,如果我们想将其用于任何向量,这个性质不可能成立。问题是,如果我们限制自己到一个小的向量子集,即稀疏向量,我们能否证明或找到一些满足这个性质的矩阵?直觉是,这有点像 Johnson-Lindenstrauss 引理,当我们对这个向量应用这个矩阵时,这个向量的范数不会改变太多。


第二步:从 L0 到 L1 最小化

现在我们可以证明的第一个定理是:一旦我们有了这些 RIP 矩阵,那么如果我们能优化 L0 范数,我们就可以实现压缩感知。当然,这是一个理论陈述,因为实际上这行不通。但我们还是从一个理论结果开始。

定理:假设我们有一个对于某个 ε < 1 满足 ε-2S RIP 的矩阵。现在我们有一个稀疏度至多为 S 的向量 x。我们通过取 Wx 来压缩这个向量 x,最终得到一个向量 x̃。现在我们想从 x̃ 重建向量 x。我们通过求解最小化问题来实现:最小化向量的 L0 范数,并满足该向量满足线性方程组的约束。那么,从这个算法得到的结果恰好与我们的原始信号 x 一致。

我们可以用反证法证明这个定理。假设重建的向量 x' 与原始向量 x 不一致。根据 x' 的定义,我们知道 x' 是在线性系统约束下最小化 L0 范数 的向量。当然,原始向量 x 满足它。但我们在这个优化问题中找到的向量是那个具有最小 L0 范数 的向量。因此,通过这个构造,我们知道这个向量的 L0 范数 只能小于或等于真实向量的 L0 范数。我们知道真实向量的 L0 范数 以 S 为界。所以特别地,x 和 x' 中非零系数的数量之差最多为 2S。现在的技巧是,我们将这个 RIP 性质应用于这个差向量 z = x - x'。同时观察到 Wz = 0,因为两个向量 x 和 x' 都满足线性系统。现在,通过 RIP 性质,我们得到 0 = ||Wz||^2,并且 (1 - ε) ||z||^2 ≤ ||Wz||^2 ≤ (1 + ε) ||z||^2。由于 Wz = 0,这意味着 (1 - ε) ||z||^2 ≤ 0,这要求 ||z||^2 = 0,因此 z = 0,即 x = x'。这与假设矛盾。因此,重建是精确的。

正如我所说,这个定理立即给出了重建向量的第一个算法,但当然,它在实践中不起作用,因为它是一个离散优化问题。下一步将是用 L1 范数 代替 L0 范数。


第三步:L1 最小化的等价性

结果,正如我所说,我发现非常令人惊讶和美妙的是,当我们使用 L1 范数 而不是 L0 范数 时,我们可以得到相同类型的保证。


定理:在与前一定理相同的假设下,我们现在可以断言,无论我们在这里左侧最小化 L0 范数 还是在右侧最小化 L1 范数,都没有什么区别,我们将找到优化问题的相同解。这真的很酷。


这非常棒,因为现在定理为我们提供了一种相当高效的方法来精确地从压缩感知中重建原始信号,我们需要解决的优化问题是一个线性规划问题。这是我们知道的可以在多项式时间内完成的事情。
第四步:构造 RIP 矩阵


现在我们需要看看如何实际构造这些 RIP 矩阵,答案是随机矩阵具有这种 RIP 性质。


定理:令 S 为整数,我们有参数 ε 和 δ。我们选择 K 为一个常数乘以我们经常看到的数字,即 S log(D/S) / ε²。现在,我们选择 W 为 R^(K×D) 中的一个矩阵,其中 K 按照前面所示选择,每个条目从均值为 0、方差为 1/K 的正态分布中抽取。那么,在随机矩阵的选择上,以至少 1 - δ 的概率,这个矩阵是 ε-S RIP。需要注意的是,随机性在于矩阵的选择,通常你只做一次。所以你选择矩阵,然后以高概率,你拥有这个性质。


更一般地,如果你使用任何 D × D 正交基 U(可能执行基变换),那么矩阵 W·U 也是 ε-S RIP。


更多直觉与应用场景



现在让我们尝试建立更多的直觉。压缩感知在信号在某个已知基中稀疏时具有优势。测量是昂贵的,比如在医学领域的 MRI 扫描中。但接收端的计算是廉价的,因为在接收端你需要重建信号。我们寻找的场景是你有一个廉价的传感设备(比如一部低成本手机),你进行这些 K 次测量,然后你可以将它们带回实验室,你有足够的时间来解决这个最小化 L1 范数 并带有线性约束的优化问题。我们需要确保在最终进行评估的接收端,计算应该是廉价的,或者我们应该有能力解决这个优化问题。

现在的技巧是,每个测量都是信号的一小部分随机线性组合。但因为我们知道底层信号可以被压缩,在这种假设下,我们仍然有足够的测量来重建信号。这是主要的故事。这种重建是通过一个非线性过程工作的,这也许也很重要,因为线性过程行不通,那将只是求解这个欠定的线性系统。所以我们有这个非线性过程,即解决这个优化问题。

与香农采样定理的关系

也许听众中有些人知道一些信息论。有一个定理与此相关,如果你知道那个定理,你需要意识到这里发生了什么,即香农采样定理。香农是 essentially 发明信息论和该领域许多基本定理的人。
定理:如果你有一个时变信号,其频率不超过 B Hz,那么可以通过以 1/(2B) 秒的规则间隔对信号进行采样来完美重建它。所以我们有 2B 个规则间隔的样本。如果我们假设信号中没有高于 B Hz 的频率,那么我们可以重建图像。如果我们的信号确实有高于此的频率,那么以这个速率采样就不能唯一地重建它。然后你会观察到这种混叠现象,即有两个不同的信号具有相同的样本,你无法区分它们。
这似乎与我们之前所说的有些矛盾。但是,关键在于:在压缩感知中,我们做出了比香农定理更强的假设。可实现的分辨率不是由我们拥有的最大频率数控制的,而是由信号的信息内容,即信号的稀疏性控制的。这是香农原始定理中没有的假设。如果我们知道在可能发生的 D 个频率中,实际上只有 S 个发生,那么我们可以从更少的测量中重建信号。也许比较一下:这里我们说我们有 D 个频段。如果我们以这个速率采样,那么我们可以重建。现在我们得到的陈述是:如果你知道这些频段中的大多数是空的,我们可以比香农定理给出的更高效地采样。这真的很棒。

总结

本节课中,我们一起学习了压缩感知。我们了解到,通过假设信号在某个变换域中是稀疏的,并利用随机线性测量,我们可以用远少于传统采样定理要求的测量次数来采集信号。关键在于,重建过程不是简单地求解线性方程,而是通过求解一个 L1 范数最小化 的优化问题来实现,这鼓励了解决方案的稀疏性。我们看到了单像素相机等实际应用,并理解了其背后的核心理论支柱:限制等距性质和随机矩阵的优良特性。压缩感知是一个强大且优雅的框架,它在资源受限的传感场景中具有巨大的实用价值。
54:机器学习流程 - 数据、预处理与学习 📊

在本节课中,我们将要学习如何将机器学习算法应用于现实世界。我们将探讨从原始数据到最终模型的完整流程,重点关注数据收集、预处理、问题设定和评估等关键步骤。与之前讨论的理想化场景不同,现实中的数据往往不完美,处理流程也更为复杂。
在上一部分课程中,我们花了大量时间研究特定的机器学习算法。


我们假设了一个相当理想化的场景:我们被给予一个精心收集的数据集,它由点 (X_i, Y_i) 组成,其中 i 从 1 到 n,这些点是从我们的底层分布中独立同分布采样得到的。一切都很完美,我们只需要解决这个特定的分类问题就完成了。
然而,在现实生活中,机器学习看起来非常不同。通常,数据不会以如此干净的形式出现。首先,你需要记录它。你需要思考如何记录、记录什么、存在哪些偏见。你需要决定使用哪种机器学习算法,以及如何评估它。然后,你还需要考虑如何处理你的结果,以及它们是否真的很好或很差。



在本节及后续课程中,我想至少介绍这个流程(我称之为处理链)的一些方面。




这个流程是从原始数据到机器学习(甚至到后处理)。首先,我想概述一下有哪些步骤,然后我会深入探讨其中一些步骤。对于这些步骤,我不会进行完整的处理,只是强调一些可能顺利或出错、你可能需要考虑的方面。请记住,所有这些都仅限于我们在本课程中讨论的算法框架,即机器学习的统计方法。如果你从事深度学习、概率模型或强化学习,情况又会有所不同。所以,这里的内容是特别针对我们本课程讨论的内容量身定制的。







让我们首先看看,当你想要解决一个机器学习问题时,可以想象或预期的高级步骤有哪些。


为了具体说明,假设你是一位想要使用机器学习的科学家。例如,你是一位地球科学家,想使用机器学习来预测某个特定地点土壤的某种性质。







可能存在这样一种情况:你可以自由地按意愿收集数据,但也可能有很多限制。也许你不能在你想要的每个特定地点都挖洞,而且挖洞也很昂贵。所以,你可能在数据收集方面有很多限制。





因此,数据收集是复杂的,然后你想使用机器学习。



也许是为了解决一个预测问题,但这只是一个更大问题的方面,即你想要解决一个科学问题,你想理解一些东西,你想在科学领域学到新知识。





另一个应用领域可能是工业应用。例如,你的老板过来说,你需要构建一个机器学习系统来帮助提高其在线业务的客户满意度。那么,你又会面临许多不同的要求。也许你的数据无法收集,后台有一些数据,但这些数据最初并不是为了你要使用的目的而收集的,这会带来许多不同的复杂性。

因此,当我们在接下来的课程中讨论这些内容时,请记住,时不时地问问自己,这些内容如何应用于科学应用或工业应用。






所以,无论何时进行机器学习,通常都会涉及几个步骤。这里,我先给你一个高级概述,然后我们将深入探讨。





第一步:收集数据 📥

第一步当然是收集数据。



可能是你有目的地收集数据,也可能是你只需要使用一些现有的、最初并非为此特定目的收集的数据,但现在你想重新利用它。无论你如何操作,数据通常都会包含许多抽样偏差,也可能涉及公平性方面的偏差(正如我们在公平性课程中看到的),还可能包含许多失真、缺失值等。数据收集的许多方面已经非常困难。

第二步:预处理数据 🧹

然后你需要预处理数据。这是第二步。这意味着你可能需要清理数据。可能有一些数据点完全错误。你的设备可能出现了故障。客户可能随机回答了问题或给出了随机答案。可能存在缺失值。你需要进行标准化。你可能想要压缩数据,或者因为数据太多而进行子采样。




你可能想使用聚类将数据集分割成不同的部分,分别进行处理。

降维,所有这些方面通常都属于预处理的范畴。




第三步:设定学习问题 🎯



然后你需要设定学习问题。首先,这意味着你真的需要明确你想要算法解决什么问题。所以,你到底想设定什么样的分类问题。




标签是什么?通常有很多不同的方式来设定这样的问题。所以,算法应该预测的目标变量到底是什么?你将使用哪种损失函数?哪种算法?哪种相似性函数?


你如何融入你可能拥有的先验知识?例如,在科学背景下,你可能知道一些描述地球在某个地方如何移动的微分方程。



你可能还需要考虑学习算法的归纳偏差,并看看是否匹配。例如,如果你应用一个具有稀疏性归纳偏差的学习算法,你的数据真的稀疏吗?这有意义吗?这些都是你需要问的问题。



第四步:评估结果 📈


然后你需要评估你的结果。这显然意味着你可能想将其与基线进行比较,看看你的学习算法是否真的做了有用的事情。你还需要对数字有感觉。例如,准确率为70%,在你的当前背景下,这是高还是低?随机猜测会是多少?另一个基线会是多少?准确率需要达到多少,应用才能带来一些好处,而不是不使用它或做一些非常简单的事情?







这不仅关乎准确率,还可能涉及许多其他维度。例如,你可能想从机器学习的公平性以及算法结果的角度来评估你的算法。在评估算法时,可能还有许多其他标准需要考虑。




当然,也有许多不同的工具可以用来进行评估。你可以查看这里的曲线,可以查看ROC曲线。我们将讨论许多工具。

第五步:后处理阶段 🔄


最后是后处理阶段。例如,在科学背景下,你可能想要解释你的结果,因为对于科学家来说,最终目标从来不仅仅是预测雨林中某个特定地点的二氧化碳含量。

这只是你以后用于其他目的的指标。

所以问题是,根据你的机器学习结果,从科学角度你能学到什么?后处理还涉及这样一个事实:如果你想在工业或社会环境中部署机器学习算法(甚至不需要是工业界,可能是政府机构),部署这个算法会有什么后果?会有什么社会影响?




使用这个新工具可能会带来哪些你没有预见到的副作用?但你可能至少需要认真思考一下。




思考你至少能想到的副作用。最后,所有这一切都不是一个线性过程。不是你收集一次数据、预处理一次、应用机器学习然后评估就结束了。这是一个循环。这个循环可能非常非常长。解决一个机器学习问题可能不是一周左右就能完成的。所以,你可能需要反复调整,在这里试试,在那里试试。



所以这一切并不简单。至少如果你的问题不直接,大多数问题都是如此。现在我想做的是深入探讨这些步骤中的每一个。我绝不会给你一个可以做的事情的全面列表,我只是开始列出一些我想到的方面。但你也可能需要考虑到,我并不是真正的机器学习实践者,我是一个理论研究者。我没有设置大规模机器学习问题的工业经验。所以这些是我想到的事情,这只是为了鼓励你思考在你的特定机器学习应用中可能存在的问题,可能有一些额外的事情需要考虑,而这些可能不在我的幻灯片上。所以这不是一个全面的列表,只是一个表明有很多事情需要做的列表。



深入探讨:准备数据 🛠️
让我们从准备数据的方面开始。




数据获取与训练/测试分布差异
这里的重点是,正如我所说,机器学习始于获取好的数据。


你的算法结果显然只能和你的数据一样好,这一点很清楚。

通常,当你开始为机器学习应用收集数据时,收集数据的阶段往往与你应用数据的阶段不同。例如,你可能需要问自己:潜在的测试用例真的以所有多样性覆盖在训练数据中了吗?


如果你想分类数字。

在你的数字分类中,所有数字真的都是直立的吗?你想通过邮政服务使用手写数字识别。在我的训练集中,所有图像都是非常漂亮、直立的数字。在我的测试数据中也会是这样吗?

如果不是,你可能需要添加一些不同方向的数字。你的训练集对测试用例有代表性吗?所以,你的训练输入分布是否与测试输入分布大致相同?情况往往并非如此。例如,如果你想预测某些客户是否喜欢某个产品,而你用学生做问卷调查。当然,你并没有覆盖你所有的客户。


一个简单的不同情况是抽样偏差,就像在期中评估中。我们通常会对课程进行评估,你会得到所有的问卷,我们收集意见。在大多数情况下,它们并不真的差。但这也许并不奇怪,因为那些在期中之前就不喜欢这门课的学生已经离开了。所以,存在强烈的抽样偏差,偏向于正面评价。至少,我的意思是,至少存在一种偏差,我们现在可以开始争论它在哪里伤害我们。如果你现在需要基于这个期中评估来预测一门课的辍学率,也许解决这个问题并不容易,因为你已经失去了一半的数据。


更微妙的是信用评分规则,这是另一个例子。我想我们可能在关于社会影响的课程中提到过这个例子,但如果没有,也许你想再听一遍这个例子。


信用评分规则,我想你们都知道,通常银行会应用这些规则。客户来申请房屋贷款,然后银行需要决定是否给予客户贷款。所以,银行内部想要预测客户是否能够偿还贷款。

现在,当然,他们可以在哪些数据上训练算法?他们只能在那些他们给予了贷款的客户数据上训练算法。


这是这种情况的图示。我们有所有潜在的客户。

这是这里的绿色集合。这些是我们想要预测是否值得给予贷款的所有客户。


现在的问题是,我们并没有收集所有潜在客户的数据。银行有什么数据?在过去,银行决定给某些客户贷款。这是这里的顶部箭头。对于那些客户,银行知道他们是否偿还了贷款。然而,还有一大群客户一开始就没有获得贷款。

对于这些客户,银行没有任何数据。他们不知道,也许其中一些客户本来可以很好地偿还贷款,而另一些也可能像银行认为的那样无法偿还。



所以,如果我们现在只在这个训练群体上训练我们的机器学习算法。


这个群体中存在非常强烈的偏差,偏向于那些银行在历史数据中一开始就认为值得贷款的人。这绝不是一个有代表性的样本。所以,作为机器学习从业者,在这一点上,你需要问自己如何抵消这种特定效应。可能有很多不同的方法,我不想讨论所有方法。你可以尝试收集额外的数据,尝试进行随机实验,尝试后处理你的数据并纠正这些效应。我的意思是,有很多不同的事情,但你至少应该意识到这些数据不具有代表性。



从原始数据到训练数据


下一步通常是,一旦你有了原始数据,你需要将其转换为我们所说的训练数据。


通常,这其中涉及相当多的决策。例如,这里我有一个面部检测和图像的例子。所以,当你使用面部检测时,问题很简单:这里有一张图像。机器学习算法需要回答的问题是:这张图像上是否有人脸?现在你有训练数据,你有带人脸和不带人脸的图像。但你到底用什么作为训练数据?你是使用整个图像,还是以滑动窗口的方式使用图像的小部分,所以你总是看小部分,然后分类这个小部分是否包含一张脸的一部分?这些图像块应该有多大?你使用图像的哪种表示?你使用基于像素的表示吗?哪种颜色空间?哪种分辨率?我的意思是,你有数百万个选择要做。这些选择肯定会影响你的学习算法。你如何处理不同的亮度?有些图片可能是在晚上拍的,有些是在早上或正午的阳光下拍的。它们具有非常不同的特征。你想把它们都放在你的训练集中吗?测试集中也都有吗?或者测试集可能不同?很多设计决策。
数据清理:缺失值与异常值


下一步,数据清理,缺失值,异常值。



数据通常包含异常值。这里有一个定义。嗯,这是一个伪定义。异常值是一个与其他观测值差异如此之大的观测值,以至于引起怀疑它是由不同机制产生的。






可能是这样:如果你在物理学中,有一个测量设备,也许设备坏了,由于某种原因没有记录正确的结果。或者你询问人们,你做一个众包实验,你想知道人们是否在随机点击。所以,如果有人只是随机点击,可能就会出现异常值。测量失败可能有很多很多原因。




但许多机器学习算法深受异常值的影响。我的意思是,只需考虑主成分分析。如果你有一些异常点,你的结果看起来会非常不同。






现在的问题是,我们想移除异常值吗?或者我们对它们做什么?


所以,在某些情况下,你可能想移除异常值,有数百万种异常值检测算法。我不想推荐任何特定的算法,因为这真的取决于你的数据。但这里有一些。只是关键词:经典统计或基于模型的方法,你所做的是拟合,比如说,特别是如果你有来自物理设备的测量值,例如,你可以说我的测量误差是正态分布的,所以你要做的是将高斯混合模型拟合到你的数据。




然后,异常值是在这个模型下概率非常低的点。比如说,你拟合了一个正态分布,点在这里。这个正态分布生成这个数据点的可能性非常非常小,以至于你会说这个数据点是异常值,你可能想移除它。




然而,对于机器学习,这通常不起作用,因为正如你所知,我们至少在我们的课程中,通常不对数据做概率假设。其他课程会讨论,但我们的课程不会。所以,通常你会做的是无模型方法,你说我想拟合一个集合到我的数据,这个集合包含我的大部分数据集,现在不在集合中的所有东西,我简单地将其视为异常值。所以,形式上,你想拟合一个尽可能小但包含大部分数据点的集合S。然后你必须找到这样一个集合S,同样,有很多很多不同的方法可以使用,这就定义了异常值。




我的意思是,只是一个例子,单类支持向量机,就像在我们见过的算法背景下,但还有很多很多。



这里真正重要的是,当你谈论异常值检测和移除异常值时,没有对错之分。我的意思是,首先,根据不同的定义,一个点在一个定义中被认为是异常值,在另一个定义中则不是。所以,没有唯一的方法来说某个东西是异常值。另一件需要注意的事情是,异常值并不总是坏的、不受欢迎的。有时这些异常值也是真正重要的点,你绝对不应该移除。例如,在一个医学例子中,可能有一组病人,他们中的大多数反应相似,这是主要病人群体。然后有一个病人反应完全不同。现在你当然可以说,嗯,他是个异常值,我不再考虑他了。但也许这是一个你以前没有观察到的非常重要的案例。这绝对是你应该非常仔细注意的事情,并决定你需要做什么,比如这个病人有什么特别之处,为什么治疗没有效果。如果你一开始就丢弃异常值,特别是如果你盲目地这样做,那么这些信息就完全消失了。特别是在医学领域,比如说你想测试一种新的疫苗,比如COVID疫苗(既然我们说到这个),有人死了,他可能是个异常值,因为其他一万人都没有死,但这个人是你真正感兴趣的,因为你想知道如果接种这种疫苗,有多少人会死亡。所以,这里有一个一般性的建议:如果人们慷慨地移除异常值,要保持怀疑。通常,嗯,如果有些事情是明显的异常值,那就去做,但如果不是,也许尝试仔细设计你的算法。也许运行一次带异常值,一次不带异常值,以确保你真的知道你在做什么。




缺失值

下一个总是会出现的问题是缺失值。在许多情况下,数据不完整。现在的问题是,你做什么?通常,在统计学或经济学或任何你研究这类问题的地方,会区分两种不同的情况。可能存在随机缺失的数据。所以,有时测量设备出错,数据缺失,由于某种原因根本没有被记录。但这只是随机发生的。也许这不是什么大问题。但也可能存在非随机缺失的数据,即值系统地不在你的数据集中。例如,一个愚蠢的例子,假设你进行人口调查,有一个问题:你赚多少钱?有些人可能根本不想说他们赚多少钱。也许他们赚得太多,不想写在问卷上,或者他们因为赚得太少而感到羞愧,所以也不想写。然后,也许中等收入范围的人会写数字。但两个极端都会缺失。这不是随机的。所以你不能简单地,如果你现在说通过取这个中间范围的平均值来估算这些值,你当然是在做完全愚蠢的事情。同样,没有标准的解决方案。当然,你可以尝试丢弃损坏的条目。如果只有少数条目。再次问自己,你丢弃的是否重要,是否实际上是重要的证据。你可以尝试估算缺失值。有很多方法,而且一些算法实际上也可以处理某些值缺失的事实。你可能也想使用这些算法之一。




特征、相似性函数与距离函数

接下来你可能需要做的是定义特征、相似性函数、距离函数等等。



特征,我的意思是,我在课程中可能已经提到过几次的一般经验法则:如果你有一个基于特征的分类问题,你想根据水果味道好坏来分类水果。只需包含尽可能多的特征。所有你能想到的特征,然后看看算法会从中得出什么。所以这是我的第二点:不要害羞,包含特征。如果有疑问,包含特征,许多监督算法如支持向量机擅长找出哪些特征真正重要。当然,并不总是如此。还要确保你选择的特征不是完全愚蠢的。所以,如果你想将文本分类到不同的主题。如果你使用词袋模型,那绝对是我们会说有意义的,因为如果文本是关于体育的,它包含的单词与关于政治的文本不同。但字母袋就不合理,如果你说这个文本有这么多A和这么多B,重要的信息并没有编码在这里。虽然这对于文本、单词和字母来说是显而易见的,但在其他应用中往往不那么明显。选择特征可能是一个非常棘手的问题。在过去,在深度神经网络出现之前,整个计算机视觉社区都忙于尝试为物体检测构建非常好的特征。所以那里的问题是,当然,通常你不能,至少在当时,物体检测并不成功,如果你将原始像素值输入你的算法,你需要构建所有这些提取边缘的特征,例如,或者SIFT特征,人们尝试提取许多不同的局部统计量。这超出了你花10分钟思考问题会自然想到的特征。我的意思是,现在对于图像来说,这不再那么重要了,因为深度网络的工作方式非常不同,它们处理原始图像,但在那时,真的有一个整个社区忙于尝试识别好的特征。


一个重要的话题是处理分类特征。所以有时,回到这个水果味道好坏的例子,你当然可以有很多数值特征,比如食物有多大,食物的重量是多少等等。所以这些是实数值。但你也可能有离散特征,比如它长在树上还是不长在树上,或者我不知道。例如,这里我有一个例子。你也可能有离散类别,比如对于书籍,它是侦探小说、小说还是儿童读物。所以这些是离散特征,但不是连续数字。如果你同时拥有这些东西。那么如何编码通常很重要。在这个幻灯片上关于书籍的具体例子中,如果你天真地不加思考地去做,你会说,嗯,我只是给每个类别一个数字。侦探小说是1,小说是2,儿童读物是3,依此类推。然而,现在会发生的事情真的很糟糕。因为,如果你有一个机器学习算法,例如,你有一个以这种方式编码这些特征的特征向量,然后你使用一个核算法。它将根据特征的距离来计算不同向量之间的相似性。所以,根据这个距离函数,侦探小说比侦探小说更接近小说,而不是更接近儿童读物。但这并不是当你简单地给所有这些类别随机数字时想要编码的。而机器学习算法会解释这些距离。所以这真的不是一个好主意。所以你通常做的是使用二进制编码,对于每个类别,你引入一个是/否特征。所以你说,是侦探小说吗?是或否(0或1)。是小说吗?0或1。是儿童读物吗?0或1。然后至少你的向量变得很长,而且非常稀疏,因为也许你有20个不同的类别,其中19个是0,每个向量中有一个是1。但至少它们以相同的对称方式被对待。


有时,下一个问题是,当你的特征向量非常稀疏时,你做什么?这也是你可能遇到的问题,因为我的意思是,你可以简单地观察到你的向量大部分是空的,然后有一些非零条目。对于许多算法来说,这是一个问题。但显然,特征向量经常是稀疏的。例如,如果我们使用词袋方法进行文本分析,我们的字典中有10000个单词,但文本只有300个单词。那么这个特征向量将是稀疏的。现在,你可以做很多不同的事情。首先,你可以降维,使用主成分分析或奇异值分解等。


你也可以尝试通过构建这些特征的连接特征来减少特征数量。例如,你可以用包含两个特征之和的一个特征替换两个特征,或者两个特征的逻辑析取或合取。但然后也有花哨的方法,但我不认为这个特定的方法非常流行,但你可以尝试找到一些哈希函数,比如先应用一个哈希函数,然后将一个很长的稀疏特征向量哈希到一个短得多的、不再稀疏的向量,然后在这个较短的向量上使用机器学习。



一旦你有了特征,你可能想定义相似性或核函数或距离函数。



这又是机器学习经常出错的关键之一。



本质上,所有机器学习算法都使用这个原则。


在输入空间中相似的点在输出空间中也应该获得相似的标签,或者应该在输出空间中属于同一个聚类。所以这种相似性的编码真的有很大的影响。这也是你可以向机器学习算法提供先验知识的地方。例如,如果你想分类蛋白质,使用氨基酸串之间的距离作为距离函数可能不是一个好主意。





因为这并不是真正决定蛋白质化学功能的东西。你可能需要以某种复杂的方式在三维结构中描述蛋白质,然后计算两个蛋白质之间的距离,因为这将表达对某种蛋白质功能重要的东西。所以这真的至关重要,这是专家知识、领域知识需要融入的地方。如果你是一个机器学习从业者,你需要与领域专家交谈,以找出什么是真正重要的东西,需要考虑的特征和相似性函数,以纳入领域专家认为好的相似性函数。


好的,我想在核方法或基于距离/相似性的方法中,你可以融入知识,你需要确保输入空间中的相似点在输出中获得相似的输出。

这是生物信息学的另一个例子,如果你想将蛋白质分类为可成药的或不可成药的,二维结构并不重要,你需要观察蛋白质三维形状中的这些口袋,你需要描述这个小口袋,你需要找出这个其他分子是否可以结合到这个蛋白质的特定口袋。





药物可以结合到这个蛋白质的特定口袋。





我想我已经提到过这个了。


另一件事,我的意思是,这听起来很愚蠢,但这些事情总是发生。如果你想定义两个手写数字之间的相似性,写数字的笔的颜色并不重要,是绿色、红色还是蓝色,这没关系。重要的是哪些像素有颜色,哪些没有颜色。所以你必须确保,如果你有两个相似的数字,但用不同的颜色书写,这个距离函数不会输出很大的距离。





减少训练点数量
下一个问题,我应该减少训练点的数量吗?有时你拥有的数据集太大,所以如果你想使用核方法,并且有数百万个数据点,你的方法是计算一百万乘一百万数据点的核矩阵,祝你好运,这至少在你的笔记本电脑上无法完成。你现在可以花费大量精力尝试将其放在集群上以分布式方式处理,比如将矩阵的不同部分放在不同的节点上等等,这将非常复杂。



有时,简单地子采样你的数据是个好主意,因为数据可能足够强,即使你在较小的数据集上工作。

通常,你可以使用一些方法进行子采样,即从原始数据中随机选择一个点的子集。你可能想重复几次。但这种方法的优点是,数据的分布至少与原始数据集的分布相同。然而,你可能丢失了一些异常值,如果你的数据集中有小群体,例如少数群体,如果你使用这种特定方法,他们可能会丢失。


另一种通常采用的方法是某种向量量化。你做的是运行一个算法从数据集中选择代表性点,通常使用K均值。你有你的数据,你使用一个大的K值运行K均值。所以,你有一百万个数据集,现在你想选择1000个代表性客户。所以你用1000运行K均值。





对于一千个聚类。然后你在新的数据上,在代表点上工作。这里发生的是,这是你可以证明的,我们在我过去的一些论文中也研究过。这种方法会引入分布的失真,所以分布不再相同。




应用K均值后,数据分布不再相同。



因为发生的是,你给异常值区域赋予了更多的权重。因为K均值仍然会,如果有一个异常值,K均值会在其上放置一个中心。在极端情况下,假设你有很多数据点集中在某个地方,比如在原点附近的高斯分布中,然后你有几个异常值。现在如果你用k=1000运行K均值,可能所有这些异常值都会得到一个中心。因为K均值不给它们一个中心的成本会非常高,因为这个异常值距离会进入成本函数。


所以这个算法所做的是,更多的权重会转移到空间中你原本权重较少的区域。这也是需要注意的事情,但这仍然是一种经常采用的方法。

降维


现在,你可以做的是使用降维。




我们已经看到了许多降维方法。通常,我的意思是,你可以使用无监督降维,这是我们在过去的课程中已经讨论过的,将在下一张幻灯片上总结。但我们也可以使用有监督降维,这实际上被称为特征选择。


所以无监督降维是像PCA或SVD,或者如果你喜欢,核PCA之类的东西,这是一种被许多数据集使用的现成方法。


在许多数据集中,人们只是现成地使用PCA来去除一些数据维度。


你也可以使用像ISOMAP或Johnson-Lindenstrauss随机投影等方法。这些并不那么流行,我的意思是,理论上它们总是很好,但在实践中,至少据我所知,它们并不非常流行。同样,有很多方法,你可能想尝试它们,特别是如果你知道你的数据集的结构,例如,
55:分类器评估 📊
在本节课中,我们将要学习如何评估机器学习分类器的性能。我们将从最基础的混淆矩阵开始,逐步介绍一系列评估指标,如准确率、精确率、召回率,并深入探讨ROC曲线和AUC等概念。最后,我们将讨论在研究和实践中如何公平、全面地比较不同分类器。
混淆矩阵:评估的基石
上一节我们介绍了机器学习流程的各个阶段,本节中我们来看看如何评估分类器的结果。理解分类器性能的第一步是构建混淆矩阵。
混淆矩阵是用于总结分类模型预测结果的表格,特别适用于二分类问题。它将真实类别与预测类别进行交叉对比。
以下是混淆矩阵的四个核心组成部分:
- 真正例:样本真实类别为正,且被模型正确预测为正。其数量记为 TP。
- 假负例:样本真实类别为正,但被模型错误预测为负。其数量记为 FN。
- 真负例:样本真实类别为负,且被模型正确预测为负。其数量记为 TN。
- 假正例:样本真实类别为负,但被模型错误预测为正。其数量记为 FP。
此外,我们定义:
- P = TP + FN,即所有真实的正例总数。
- N = FP + TN,即所有真实的负例总数。
核心评估指标
基于混淆矩阵中的这些数字,我们可以定义多种衡量分类器性能的指标。
以下是几个最常用的评估指标:
- 错误率:被错误分类的样本比例。公式为
(FP + FN) / (P + N)。这对应我们之前学过的0-1损失。 - 准确率:被正确分类的样本比例。它是错误率的反面,公式为
1 - 错误率或(TP + TN) / (P + N)。 - 真正率 / 灵敏度:在所有真实正例中,被正确找出的比例。公式为
TP / P。 - 假正率:在所有真实负例中,被错误预测为正的比例。公式为
FP / N。 - 真负率 / 特异度:在所有真实负例中,被正确找出的比例。公式为
TN / N。
在信息检索等领域,以下两个指标尤为重要:
- 召回率:等同于真正率,即
TP / P。关注的是模型找出正例的能力。 - 精确率:在所有被模型预测为正的样本中,真正为正的比例。公式为
TP / (TP + FP)。关注的是模型预测结果的准确性。
ROC曲线与AUC:处理不平衡数据
当数据集中正负样本数量极不平衡时(例如信息检索中相关结果远少于不相关结果),仅靠准确率评估会失效。此时我们需要同时关注真正率和假正率。
ROC曲线(接收者操作特征曲线)是一种强大的可视化工具,它描绘了当分类器的决策阈值变化时,真正率与假正率之间的权衡关系。
考虑一个依赖于阈值 θ 的分类器,例如一个可移动的超平面。对于从负无穷到正无穷的每一个阈值 θ,我们计算对应的(假正率, 真正率),并在二维平面上描点,连接起来就形成了ROC曲线。
一个理想的分类器,其ROC曲线会紧贴左上角(真正率高,假正率低)。而一个随机猜测的分类器,其ROC曲线是一条从(0,0)到(1,1)的对角线。曲线越靠近左上角,分类器性能越好。
在实践中,不同分类器的ROC曲线可能相互交叉,难以直观判断优劣。于是人们引入了AUC指标。
AUC是ROC曲线下的面积。它是一个介于0和1之间的标量值,试图用一个数字来概括分类器的整体性能。AUC越大,通常认为分类器平均性能越好。
然而,将复杂的ROC曲线形态压缩为单一数字可能会丢失重要信息。例如,如果应用中更关心低假正率区域的性能,那么即使两个分类器的AUC相同,它们的实际价值也可能不同。
多分类评估与结果呈现
对于多分类问题,虽然可以扩展上述指标,但解释起来更加复杂。一个更直观的方法是直接查看混淆矩阵,分析哪些类别容易被混淆。
在学术论文中,常见的一种做法是使用大型表格,在多个标准数据集上比较不同分类器的平均错误率和标准差,并将最优结果加粗。
这种大型表格对人类读者极不友好,难以解读。应优先使用图表来呈现结果。仅在经过长时间思考,确信没有更好的可视化方法时,才考虑使用表格。
如何公平地比较分类器?
声称一个分类器“全面优于”另一个分类器通常是值得怀疑的。“没有免费午餐”定理指出,不存在在所有问题上都最优的算法。
因此,科学的比较应侧重于分析分类器的优缺点和适用场景。
以下是进行公平比较的一些指导原则:
- 针对特定任务:明确分类器要解决的具体问题类型。
- 多样化测试:在多种条件下测试(如不同维度、数据量、噪声水平),同时使用模拟数据和真实数据。
- 公平实现:以最佳方式实现所有参与比较的分类器,例如使用原作者提供的实现或精心调参,避免因实现差异导致不公平。
- 使用统计检验:可考虑使用统计检验(如t检验、置换检验)来评估性能差异的显著性,但需注意其假设前提。
- 诚实报告:不仅报告算法表现良好的情况,也应报告其失效的场景,这对实际应用至关重要。
超越准确率:全面的评估视角
评估分类器时,不应只局限于准确率。一个全面的评估框架还应考虑以下方面:
- 计算效率:模型训练和预测的速度。
- 存储成本:模型本身的大小。
- 易用性:是否需要专家调参,能否被非专业人士使用。
- 公平性与社会影响:模型决策是否存在偏见,及其部署后可能产生的社会伦理影响。
实践指南与总结
最后,我们总结一些解决机器学习问题的高级指南:
- 建立基线:首先尝试简单的方法(如K近邻),快速建立一个性能基线。
- 融入先验知识:思考如何将你对问题的领域知识融入到学习过程中(通过相似性函数、损失函数或概率模型等)。
- 理解偏差:审视数据收集带来的采样偏差和算法本身带来的归纳偏差,判断它们是否合适。
- 批判性评估:以批判性的眼光彻底评估结果,这是科学精神的核心。
- 动手实验:通过大量实验、可视化和调试来理解数据和算法。
- 避免过度泛化:在解决问题的中间步骤中,尽量避免去解决一个比最终目标更泛化、更困难的问题。
- 考虑部署影响:在部署算法前,充分考虑其社会影响、公平性和法律问题。


本节课中我们一起学习了分类器评估的核心概念与方法。我们从混淆矩阵出发,定义了错误率、准确率、精确率、召回率等关键指标,并深入探讨了用于处理不平衡数据的ROC曲线与AUC。更重要的是,我们认识到评估不应仅限于单一数字,而需从计算、实用、伦理等多角度进行,并且在对分类器进行比较时,应侧重于分析其适用场景与优缺点,而非做出绝对优劣的断言。

浙公网安备 33010602011771号