凯尔大学机器学习优化方法笔记-全-

凯尔大学机器学习优化方法笔记(全)

001:动机与历史背景 🚀

在本节课中,我们将学习优化方法的基本概念,了解其历史背景、核心动机以及在不同领域的广泛应用。优化是寻找最佳决策的科学,它在工程、机器学习乃至日常生活中都扮演着关键角色。

动机与历史背景

优化是一门古老的学科,其应用可以追溯到几个世纪前。本节我们将回顾几个关键的历史案例,以理解优化问题是如何被提出和解决的。

早期应用:高斯与最小二乘法

第一个在数学意义上使用优化和机器学习的例子可以追溯到19世纪初。1801年,朱塞佩·皮亚齐发表了对新发现的小行星(或矮行星)谷神星的观测数据。他记录了谷神星在不同日期的位置,但随后谷神星在视野中消失了。天文学家面临的关键问题是:能否预测其轨道,以便在其再次进入地球视野时重新定位?

著名数学家卡尔·弗里德里希·高斯解决了这个问题。他从观测数据出发,计算出了一个能预测谷神星新位置的模型。众所周知,所有行星都围绕太阳做椭圆轨道运动。问题在于,地球本身也在绕太阳做椭圆运动,因此从地球视角看,谷神星的运动轨迹显得有些不规则。

高斯通过计算,将一个模型拟合到这些带有噪声的观测数据上。为此,他发明了一种我们今天称为最小二乘法的方法。这是优化领域的一个重要工具。总的来说,他将拟合观测数据或模型参数以良好表示给定观测数据的过程,我们今天称之为经验风险最小化,这也是机器学习研究的一个类别。

许多机器学习技术实际上是解决优化问题的算法。有时这是显式的,有时则隐藏在背景中。理解这一视角有助于我们直观地理解这些工具的作用。

20世纪的应用:斯蒂格勒饮食问题

时间推进到20世纪初,美国军方希望开发低成本饮食方案以维持士兵生存。核心问题是:如果我们知道士兵每天所需的营养(如卡路里、蛋白质、钙等),如何以尽可能便宜的组合食材来喂养他们,同时保证士兵存活?

当时已有各种食材及其营养成分的列表(例如,肉类、牛奶、谷物等含有多少蛋白质和钙)。此前有人尝试解决这类优化问题,并公布了每年成本约100美元的饮食方案(在20世纪30年代初)。

乔治·斯蒂格勒从数学角度处理了这个问题。他将其视为我们今天所称的线性优化问题:寻找不同食材的线性组合,使其恰好满足士兵所需各类营养的最低要求。斯蒂格勒与九名职员(手工进行计算)共同工作了120天,提出了一个非常接近全局最优解的方案(今天看来其中有一些小错误),成本约为每年40美元。

他们的方案比之前公布的结果改进了两倍多。该方案包含大量小麦粉、牛奶、卷心菜、菠菜和干芸豆。如果允许包含肉类(肝脏富含铁),方案会有所不同。如今,这类线性优化问题可以在毫秒内解决,而当年却需要120天。这展示了如何将一个具有重要实际意义的问题(喂养数十万士兵成本高昂)转化为数学模型并求解。

然而,该方案存在一个无法在数学模型中捕获的约束:它从未被应用,因为每天吃同样的食物(主要是豆类)会严重影响士气。乔治·丹齐格在一篇论文中幽默地回忆了他在开发优化算法时,让妻子每天用计算机结果为他做饭的经历。

工程中的优化问题

总的来说,优化已成为一种工具,不仅用于计算最优饮食,还广泛应用于工程等多个领域,以寻求最佳解决方案。

工程师们尤其常用优化。一个常见的优化问题是最小化成本。例如,图中是一座跨越河流的桥梁。绿色向下的箭头代表载荷(如重力、火车通行等)。桥梁必须至少承受这些载荷。问题是:在满足载荷要求、不坍塌的前提下,我们如何使桥梁最轻、最具成本效益?这里存在性能约束:最便宜的方案是没有桥梁,但我们有约束条件(必须承受给定载荷)。计算这样的桥梁将是练习中的一个例子。

第二类优化问题是最大化性能。例如,图中是一项研究,旨在寻找将卫星送出太阳系尽可能远的轨迹。他们有一定预算的燃料装载到火箭和卫星上。问题是:在给定燃料预算下,最佳轨迹是什么?他们是否可以借助太阳引力弹弓等效应,为卫星提供尽可能大的速度?这里是在一定成本约束下最大化性能,这在工程中也很常见。

我们也可以在这两者之间进行权衡,即成本-性能权衡。这里的关键问题是:如何进行权衡?是否涉及某个权重参数α,让我们可以权衡成本与性能?

动态优化与控制

到目前为止,我们看到的问题大多是静态的:我们审视问题或世界,将其转化为优化问题,求解并应用,然后结果就固定了。

但有些领域需要非常快速地做出决策,其中之一就是控制领域(在德国称为 Regelungstechnik)。例如,图中是一个倒立摆。在视频中,摆锤被摆动起来并保持直立。可以想象,人类甚至无法摆动起摆锤,更不用说保持其直立了,但计算机可以。为此,计算机每秒多次求解一个优化问题,以计算其最佳动作。计算机求解其最佳动作的问题,然后执行前几步,接着等待或接收额外输入(当然存在扰动实际行为的外部随机输入)。这是一个循环:控制器或计算机接收关于当前系统状态(如不同角度和速度的位置)的新测量值,然后进行优化,应用结果,接着循环继续,接收新测量值、进行新优化、应用结果……这每秒发生数百到数千次,因此我们感知为流畅的行为。这就是最优控制所做的,其科学术语是模型预测控制:我们有一个可用于预测未来的模型,然后可以在模型模拟中优化我们的行动,并将其应用回现实世界。

另一个例子是小型无线电控制车辆的自主控制。如图所示,汽车在弯道漂移,始终行驶在完美路线上。这是可能的,因为它能提前规划,知道弯道何时到来,并根据汽车自身及其环境的当前状态进行持续优化。

这类优化问题也将在本课程的实际练习中解决。

计算机视觉中的优化

我们将在课程后期看到的另一个领域是计算机视觉。这可能看起来不直观,但计算机视觉中解决的许多问题也是优化问题,或者可以表述为优化问题。

第一个要讨论的是立体匹配。立体匹配的问题是:当你拍摄两张相距几厘米的照片时(就像人眼相距几厘米),能否通过两幅图像之间像素的偏差,计算出图像中物体的距离?为此,我们定义一个所谓的能量函数。能量函数描述了你计算的深度图像(模型预测)与两幅图像之间的偏差有多接近。我们需要最小化这个能量函数,试图找到能量最小的配置。这源于物理学,系统也试图进入最小能量状态。我们通过求解优化问题来达到最小能量状态。如图所示,该场景的深度被很好地恢复了。这是一个非常著名的例子(日本浅草寺)。

另一个例子是图像去噪。我们可以用类似的方式构建一个能量函数,最小化它,然后恢复出一幅更接近我们预期的、隐藏在噪声图像背后的真实图像。

最后一个例子是图像去模糊。这看起来可能也不直观,但我们实际上可以逆转应用于图像的模糊操作。请注意,不要将其与一些不切实际的电影场景混淆(如FBI或CIA可以无限放大像素化图像并找出帮派面孔)。如果图像是像素化的,恢复任何信息都非常困难。但如果图像是模糊的,这通常是一个可逆操作。我们可以找出图像被模糊的操作,然后应用逆操作。图像去模糊也将是本课程结束时,你将能够自己实现的一个例子。

自然界中的优化

正如我们目前所见,优化都是人造模型和解决的人造问题。但优化也相当自然地发生在物理世界中。有一些例子表明,自然界在没有人类参与或发明的情况下进行着优化。

例如,光总是走最快的路径。根据光在特定材料中的传播速度,它会选择略有不同的路径。这被称为费马原理,在吸管插入玻璃杯的图像中可以很好地看到这一点。

另一个例子是肥皂膜。如果你创造一个肥皂泡或肥皂膜,它会恢复到最小表面积的形状,因为存在表面张力,它希望减少到最小表面积。例如,弗雷·奥托在他著名的慕尼黑奥林匹克公园设计中就运用了这一原理。实际上,这是一个相当困难的优化问题,而自然界“不假思索”地就做到了。

最后一个例子是蛋白质折叠的能量最小化。例如,你体内的蛋白质(如DNA)会以自由能最小化的方式折叠。它希望进入一个所有能量都已耗散的非常稳定的状态。问题在于,蛋白质有许多不同的折叠方式,而自然界找到了一种达到这种最小能量状态的方法。对人类来说,这实际上非常困难。因此,有一些大型计算程序,人们试图找出某些蛋白质的实际折叠方式以表征其特性。他们需要多年的CPU时间来计算一种蛋白质,因为可能的折叠方式太多了。而自然界却相当轻松且快速地做到了这一点。因此,优化每天都在你身边发生,它实际上是我们可以利用的一个原理。

课程全景图

现在,让我们看看本课程的整体概况。这张幻灯片基本上包含了整个课程,即我们将在未来讲座中看到的所有内容。

我们感兴趣的是优化某个目标函数,这里称为 f(x)。优化可以表述为最小化或最大化,两者是等价的,因为我们可以取函数的负值来在最小化和最大化之间切换。通常,如果没有应用示例强烈建议我们要最大化某物,我们会看到最小化。这里的符号表示返回最小化 f 的参数,即最小值点是 x*。对于这个输入,f 达到其最低点。

凸性背后的思想是:如果一个函数是凸的,那么它只有一个最小化点(如果是严格凸的,则最小化点是唯一的)。在本课程的最后,我们将看到一些不同的例子,但主要处理凸优化问题,因为它们具有可以被我们开发的算法利用的良好性质。

我们关心凸性,因为它只有一个最小化点,并且当我们想要找到这个最小化点时,我们可以简单地“下山”。图中左侧是一个凸函数,这是我们希望拥有的。右侧是一个非凸函数。可以想象,我们需要从定义域中采集更多样本才能找到最小值。你会发现,凸性在这里看起来很简单,但如果你进入高维问题,许多问题可以用凸函数表达。并且有一大堆技巧,可以用凸优化问题来近似最初可能非凸的现实生活优化问题,同时还能给出我们距离原始非凸优化问题的实际解有多近的界限。

因此,凸性是关键。我们将在今天的课程中看到凸性更数学化、更正式的定义。

优化问题存在一个层次结构。最初看到的斯蒂格勒饮食问题是一个所谓的线性规划问题,这是今天我们已知的最简单的优化问题之一。沿着层次结构向上,线性优化问题仍然被包含在内,但我们扩展了可能的优化问题的空间。最后,我们到达所谓的锥优化问题,这是本课程结束时将达到的层次。锥优化问题包含其下所有层次(如半定规划、二阶锥规划、二次规划等)。这些术语听起来可能很难,但你将在本课程中逐步学习它们。最后,在课程结束时,我们也会对非凸优化问题做一个小展望。

所开发的求解技术尽可能多地利用问题的结构。对于最简单的LP问题,我们可以利用最多的结构,设计出最快的求解算法。沿着层次结构向上,可利用的结构越来越少,因此算法通常也会变慢。但算法每年都在变得更快,过去25到30年发生了巨大的发展。我们今天比几年前快了多个数量级。这意味着,一些应用领域可能开发的许多专门求解技术,今天已经完全被我们将在课程后期看到的一些通用优化工具所取代。

图中显示了优化软件效率的爆炸式增长。这来自IBM的软件包CPLEX。该图表始于20世纪90年代初。蓝色柱状图表示版本间的改进,即从IBM CPLEX的一个软件版本到下一个版本,算法在基准问题上的速度提升了多少。基准问题显然包含非常困难的问题。令人惊讶的是,多年来,他们有时有3倍、5倍,甚至近10倍的速度提升。这是累积的,你必须将这些速度提升相乘才能得到累积加速。在大约10年的时间里,仅算法方面就有30,000倍的加速。此外,20世纪90年代的硬件也变得更好了,大约有1,000倍的提升。这意味着总体上有3,000万倍的加速。

这意味着,在21世纪初几秒钟内可以解决的问题,在20世纪90年代初需要数月甚至数年才能解决。一些科学领域和工程实践在跟上这一潮流方面有些滞后,但现在许多人发现,如果他们使用商业和开源的优化软件包,许多几年前完全无法解决的问题,今天可以相当高效地解决。

在本节课中,我们一起学习了优化方法的基本动机和历史背景。我们看到了从高斯的最小二乘法到斯蒂格勒饮食问题,再到现代工程、控制和计算机视觉中的广泛应用。优化不仅是寻找最佳决策的数学工具,也是自然界和许多技术领域的核心原理。理解优化问题的基本形式(如最小化目标函数 f(x))和凸性的重要性,为我们后续深入学习具体的优化算法和应用奠定了坚实的基础。

002:课程组织 📚

在本节中,我们将了解本课程的整体组织架构,包括课程大纲、学习资源以及本课程在凯尔大学课程体系中的定位。

课程大纲概览

以下是本课程涵盖的14个主要主题,每个主题都配有相应的实践练习环节。

  • 第1-4周:优化基础模块:我们将学习优化的主要构建块,包括核心算法以及处理不同约束或条件的方法。
  • 第5周:实践案例:本节将完全专注于实际应用案例,包括机械设计中的电机预测控制和金融领域的股票投资组合优化。
  • 第6周及以后:进阶主题:我们将学习自动微分以简化数学计算负担,从向量空间的新视角看待优化问题,并优化之前学到的工具以解决大规模问题,例如来自计算机视觉或机器学习的高维优化问题。

学习资源与形式

课程将以视频形式录制,并与幻灯片一同提供。此外,我们还会提供习题集和Jupyter笔记本。

在Jupyter笔记本中,会预设一些问题,但关键部分需要由你完成。例如,你的任务可能是实现一个在课程中见过的小算法,或是解决某个优化问题。

携带笔记本电脑参加练习课是有益的,但不是强制要求。我们期望你能完成这些练习,因为大量的学习和实际应用理解将来源于此。

主要参考书目

本课程内容主要参考并受以下两本书籍启发:

  • 《Optimization by Vector Space Methods》 (David Luenberger著):这是一本较为经典的著作,因其写作年代计算能力有限,故更侧重于对优化问题的解析性思考。
  • 《Convex Optimization》 (Stephen Boyd与Lieven Vandenberghe著):这是一本现代经典教材,被广泛引用,是该领域的必备参考书。

不需要购买这些书籍来跟上课程。它们仅作为深入学习的参考资料。

凯尔大学内的优化相关课程

在凯尔大学,优化并非仅在本课程中涉及。其他科学领域也关注此主题:

  • 运筹学:源自工程与经济系,主要研究组织或商业背景下的优化问题。
  • 自然启发式优化方法:由IFB开设,更接近计算机科学,但仍属经济与工程系。
  • 数学系的优化理论:与数学系的课程相比,本课程的不同之处在于,数学课程会更深地探讨证明,但不会涵盖同样广泛的应用工具。本课程会在证明相关时进行讲解,但在许多领域仅提供证明参考,重点是理解“为什么”,并实现重要的算法。

此外,电气工程等工程领域也有大量涉及优化的课程,例如Oman教授的讲座。

本课程的独特视角

综上所述,凯尔大学存在多个涉及优化的课程背景。而本课程将采取一个非常独特的视角:我们将专注于机器学习和工程领域的应用,并以此作为学习动机,理解为什么我们需要特定的算法改进,例如,为了能够扩展到我们想要解决的有趣问题。


本节课中,我们一起了解了《机器学习优化方法》课程的组织结构、学习资源、参考书目以及它在更广泛学术背景下的定位。下一节,我们将开始深入课程的第一个核心主题。

003:符号与分析回顾 📚

在本节课中,我们将回顾本课程将使用的基本数学符号,并重温一些重要的分析学概念。这并非完整的数学课程,而是旨在帮助大家回忆和统一后续学习中将用到的记法与基本原理。

数学符号约定 📝

以下是本课程中使用的数学符号惯例。如果你在理解某个公式时遇到困难,可以回到本节查看符号定义以获取帮助。

  • 标量:使用小写斜体字母表示,例如 a
  • 向量:使用小写粗体字母表示,例如 x
  • 矩阵:使用大写粗体字母表示,例如 A
  • 集合:使用大写字母表示,例如 A
  • 元素:小写字母 a 属于集合 A,记作 a ∈ A
  • 子集与运算:我们可以定义子集、并集()、交集()以及空集()。
  • 集合构造:一个重要的记法是 {x | x² = 1},这表示所有满足 x² = 1x 构成的集合,即 {1, -1}

此外,幻灯片中会使用一些缩写来简化文本,例如“当且仅当”缩写为“iff”,“右手边”和“左手边”缩写为“RHS”和“LHS”。在视频讲解中,这些都会得到详细说明。

导数概念回顾 🔄

上一节我们介绍了基本符号,本节中我们来看看第一个需要回顾的数学概念:导数。

对于定义在实数集开子集 X ⊆ ℝ 上的函数 f: X → ℝ,如果以下极限存在,则称 f 在点 x 处可导,其导数定义如下:

f'(x) = lim_{h→0} (f(x+h) - f(x)) / h

直观理解是,在点 x 处向前移动一个微小步长 h,观察函数值的变化率。当 h 无限趋近于0时,该变化率的极限值即为导数。

例如,对于函数 f(x) = 2x + 3x²,其导数为 f'(x) = 2 + 6x。你可以尝试自行推导验证。

梯度:多维度的导数 📈

当函数的输入不再是单一实数,而是多维向量时(即 f: ℝⁿ → ℝ),我们需要引入梯度的概念。梯度是优化方法在多维空间中的核心。

x 是一个列向量(记作粗体 x),则函数 f(x) 的梯度是一个向量,其每个分量是 f 对相应输入变量的偏导数:

∇f(x) = [∂f/∂x₁, ∂f/∂x₂, ..., ∂f/∂xₙ]ᵀ

有时函数有多个输入向量,例如 f(x, y)。此时,我们可以单独对其中一个向量求梯度,记作 ∇ₓ f(x, y),表示仅对变量 x 求导。

从几何视角看,在函数图像上的某一点 x,梯度向量指向该点处函数值增长最快的方向,其反方向则是下降最快的方向。它定义了该点处的一个切平面。

海森矩阵:二阶导数 📊

除了衡量瞬时变化率的一阶导数(梯度),我们还需要衡量变化率如何变化的二阶导数,其表现形式是海森矩阵

对于函数 f: ℝⁿ → ℝ,其海森矩阵 H(x) 是一个 n×n 的矩阵,其第 (i, j) 个元素是函数对 xᵢxⱼ 的二阶偏导数:

H(x)ᵢⱼ = ∂²f(x) / (∂xᵢ ∂xⱼ)

由于求导顺序通常不影响结果(克莱罗定理),海森矩阵是对称矩阵,即 H(x) = H(x)ᵀ

海森矩阵在泰勒展开中扮演关键角色。函数 f 在点 x 附近的二阶泰勒近似为:

f(x + d) ≈ f(x) + ∇f(x)ᵀ d + (1/2) dᵀ H(x) d

其中 d 是一个微小位移向量。一阶项(梯度)构成了一个切平面,而二阶项(海森矩阵)则描述了这个切平面的弯曲程度,像一个“碗”的形状。

海森矩阵的正定性至关重要。如果海森矩阵在某个点是正定的,那么该点附近的二阶近似像一个开口向上的碗,该点可能是一个局部极小点。反之,则可能是一个局部极大点或鞍点。我们将在后续课程中深入探讨这一点。

延伸学习资源 🔗

如果你想更深入地复习或觉得以上内容有些生疏,以下资源可能会有所帮助:

  • 3Blue1Brown的“微积分的本质”系列视频:在YouTube上,该系列通过出色的可视化直观地解释了微积分核心概念。
  • 《向量微积分、线性代数和微分形式》(作者:Hubbard & Hubbard):这本书的前几章对分析学基础提供了比本课程更深入的回顾。

总结 📌

本节课中我们一起学习了机器学习优化方法所需的数学基础。我们统一了标量、向量、矩阵和集合的书写规范,回顾了导数、梯度和海森矩阵的核心定义与几何意义。理解这些概念是后续学习梯度下降、牛顿法等优化算法的基石。请确保你熟悉这些符号和概念,以便顺利跟进后续课程。

004:凸性 🧠

在本节课中,我们将学习凸性,这是本课程所讨论的优化问题中最重要的性质之一。我们将首先了解集合的凸性,然后深入探讨函数的凸性。

集合的凸性

上一节我们介绍了优化问题的基本形式,本节中我们来看看凸性的概念。集合的凸性定义非常简单。

对于一个集合,如果取集合中的任意两点,连接这两点的线段上的所有点都仍然包含在该集合内,那么这个集合就是凸集。

下图展示了一个非凸集合的例子。因为线段中间有一个点位于集合外部,这违反了凸集的定义。

对于任意一个集合,我们可以构造它的凸包。凸包是指包含原集合中所有点的最小凸集。例如,图中所有黑色小点,其凸包就是围绕它们的最小凸多边形。

函数的凸性

了解了集合的凸性后,我们转向函数的凸性。关于函数凸性有几个等价定义。

第一个定义是:函数的上境图必须是一个凸集。上境图是指函数图像上方的所有点构成的集合。如果这个集合是凸的,那么该函数就是凸函数。图中展示了一个非凸函数的上境图,因为连接两个点的线段有一部分落在了上境图外部。

第二个等价定义是詹森不等式。它要求对于函数上的任意两点 xy,以及任意介于0和1之间的参数 α,连接 (x, f(x))(y, f(y)) 的线段上的点,其函数值必须大于或等于该点处原函数的值。用公式表示为:
f(αx + (1-α)y) ≤ αf(x) + (1-α)f(y)

第三个条件是针对二阶可微函数的:如果函数 f海森矩阵处处是半正定的,那么该函数是凸的。这对应着函数图像像一个开口向上的“浴缸”形状。

以上三个条件是等价的,满足其一则必满足其他。

次梯度

次梯度是一个在凸优化中频繁出现的概念。对于凸函数 f 上的一点 x,沿着梯度方向(或某个特定方向)可以画出一条切线,这条切线被称为次梯度。凸函数的特性是,整个函数图像都位于其次梯度的上方。这也是它被称为“支撑梯度”的原因。

即使函数在某些点不可微,我们仍然可以定义一组次梯度集合,集合中的每一个向量都满足“处处在函数下方”的条件。

如何判断函数的凸性?

我们已经知道了凸性的定义,但如何快速判断一个函数是否处处凸呢?逐一检查每个点是不现实的。

幸运的是,存在一些已知的“乐高积木”式的基本函数,它们本身是凸的(或凹的),并且通过特定的组合规则,可以构造出新的凸函数,而不会丢失凸性。

以下是几个重要的基本凸函数和凹函数“积木块”:

已知凸函数:

  • 仿射函数aᵀx + b (其中 a 是固定向量,b 是标量)
  • 负熵x log x (定义域 x > 0
  • 二次型xᵀPx (其中矩阵 P 是半正定的,记作 P ≽ 0
  • 范数:任何范数 ||x||(如欧几里得范数、最大值范数)都是凸函数。

已知凹函数:

  • 幂函数xᵀ (其中 p ∈ [0,1]x ≥ 0
  • 对数log xx > 0
  • 平方根√xx ≥ 0
  • 负定二次型xᵀPx (其中矩阵 P 是半负定的,记作 P ≼ 0
  • 最小值函数min(x) 是凹函数。

凸性的组合规则

有了基本积木块,我们来看看如何组合它们。主要规则是关于复合函数 h(x) = f(g(x)) 的:

  • 如果外层函数 f非递减的,内层函数 g 是凸的,那么复合函数 h 是凸的。
  • 如果外层函数 f非递增的,内层函数 g 是凹的,那么复合函数 h 也是凸的。

这些规则为我们提供了一种通过观察函数结构来判断其凸性的强大工具。但请注意,这些规则是充分条件而非必要条件。有些函数不符合这些规则,但仍然是凸的。

实例分析

现在,让我们运用所学知识来分析两个函数。

例1:f(x, y) = (x - y)² + 1 - max(x, y)

我们可以将其分解为树状结构:

  1. (x - y) 是仿射函数(凸)。
  2. (x - y)² 是凸函数的平方(凸,因为平方函数在非负区间非递减)。
  3. max(x, y) 是最大值函数(凸)。
  4. 1 - max(x, y) 是常数减去一个凸函数。因为 1 - z 关于 z 是线性递减的,而 max(x,y) 是凸的,所以这部分是的。
  5. 最后,将凸函数 (x - y)² 与凹函数 1 - max(x, y) 相加。两个函数的和,如果一个是凸的,另一个是凹的,则无法直接判断整体凸性。需要更精细的分析(例如求二阶导数)。仅凭组合规则无法断定此函数整体凸性,但可以分析各部分。

例2:f(X) = max( log( (aᵀX + b)² ), 2||X||₁³ )

我们同样进行分解:

  1. aᵀX + b 是仿射函数(凸)。
  2. (aᵀX + b)² 是凸函数的平方(凸)。
  3. log( (aᵀX + b)² ):对数函数 log(z) 是凹函数且递增。当内层 z = (aᵀX+b)² 是凸函数时,根据规则(凸且非递增对凹函数),复合结果无法直接判定。实际上,log 是凹函数,log(凸函数) 不一定是凸或凹。
  4. ||X||₁ 是L1范数(凸)。
  5. 2||X||₁ 是凸函数的正常数倍(凸)。
  6. (2||X||₁)³:三次方函数 在整个实数域上既不是凸函数也不是凹函数。
  7. 最后,取 log(...)(...)³ 两者的最大值。由于其中一个分量(三次方项)既非凸也非凹,因此整体函数 f(X) 既不是凸函数,也不是凹函数

总结

本节课中我们一起学习了凸性这一核心概念。我们首先从集合的凸性入手,理解了凸集的定义。然后重点学习了函数的凸性,掌握了其三种等价定义:上境图、詹森不等式和海森矩阵半正定。我们还引入了次梯度的概念,它对于理解非光滑凸函数至关重要。

为了实际应用,我们介绍了一系列已知的凸函数和凹函数作为“基本构建模块”,并学习了保持凸性的函数组合规则。最后,通过两个实例分析,我们实践了如何运用这些规则和模块来分解和判断复杂函数的凸性。记住,这些组合规则是判断凸性的有力工具,但并非唯一方法。

006:线性代数复习 🧮

在本节课中,我们将复习线性代数的基本概念,这些概念是后续课程的基础。我们将从斐波那契数列的计算问题入手,逐步展示如何运用线性代数知识,将算法的运行时间从指数级优化到常数级。这为我们理解后续更高效的优化算法(如牛顿法)奠定了数学基础。

线性代数基础回顾

上一节我们介绍了课程的整体安排,本节中我们来看看线性代数的基础知识。这些概念在机器学习和工程优化中至关重要。

向量与矩阵表示

在数学表示中,我们通常用粗体小写字母表示列向量。例如,一个列向量 v 可以表示为:

v = [1; 2; 3]

其转置 v^T 则是一个行向量:

v^T = [1, 2, 3]

在编程语言Julia中,我们可以直观地表示和操作它们:

v = [1; 2; 3]  # 列向量
v_row = [1 2 3] # 行向量,或使用 v' 进行转置

矩阵与向量乘法

矩阵 A 与列向量 v 的乘法规则是:将矩阵的每一行视为一个行向量,分别与列向量 v 进行点积运算,结果构成新的列向量。
公式表示为:A * v
在Julia中,乘法运算同样直接:

A = [1 2 3; 4 5 6; 7 8 9]
v = [1; 0; -1]
result = A * v

行向量 u^T 与矩阵 A 的乘法规则是:将矩阵的每一列视为一个列向量,分别与行向量 u^T 进行点积运算,结果构成新的行向量。
公式表示为:u^T * A
Julia代码示例如下:

u_row = [1 0 -1]
result_row = u_row * A

矩阵与矩阵乘法

两个矩阵 AB 相乘时,需要满足维度匹配条件:若 An x k 矩阵,则 B 必须是 k x m 矩阵。结果是一个 n x m 矩阵。
其运算规则是:结果矩阵中第 i 行第 j 列的元素,等于 A 的第 i 行与 B 的第 j 列的点积。
公式表示为:(AB){ij} = A · B_{:j}
矩阵乘法满足结合律 (AB)C = A(BC),但不满足交换律,即 AB ≠ BA 在一般情况下成立。

从斐波那契数列看算法优化 🐇

现在,让我们运用这些线性代数知识来解决一个经典问题:高效计算斐波那契数列。我们将看到数学如何带来巨大的性能提升。

问题定义与初始方案

斐波那契数列的定义是一个递归序列:F(0)=1, F(1)=1,且对于 k>=2,有 F(k) = F(k-1) + F(k-2)
一个直接的递归实现代码如下:

function fib_recursive(k)
    if k < 2
        return 1
    else
        return fib_recursive(k-1) + fib_recursive(k-2)
    end
end

这种方法的问题是运行时间呈指数级增长,计算 F(50) 就需要数十秒,效率极低。

优化一:线性时间复杂度

第一种优化是使用记忆化或迭代法,避免重复计算。
以下是迭代方法的实现:

function fib_linear(n)
    f = ones(n+1) # 初始化数组,F(0)=F(1)=1
    for i in 3:n+1
        f[i] = f[i-1] + f[i-2]
    end
    return f[n+1]
end

这种方法将运行时间降低到了线性级 O(n)

优化二:对数时间复杂度

我们可以将斐波那契数列的递推关系转化为矩阵运算。定义向量 x_k = [F(k+1); F(k)],则递推关系可以写为:
x_{k+1} = A * x_k
其中矩阵 A 为:

A = [1 1; 1 0]

因此,要计算 F(n),我们只需要计算:
x_n = A^n * x_0,其中 x_0 = [1; 1]
计算矩阵的 n 次幂可以通过快速幂算法实现,其运行时间为对数级 O(log n)

function fib_log(n)
    A = [1 1; 1 0]
    x0 = [1; 1]
    x_n = A^n * x0  # Julia 支持矩阵的幂运算
    return x_n[1]
end

优化三:常数时间复杂度

对于对称矩阵 A,我们可以进行特征分解
A = C * Λ * C^{-1}
其中,Λ 是一个对角矩阵,其对角线元素是 A 的特征值。
那么,A^n 可以简化为:
A^n = C * Λ^n * C^{-1}
由于 Λ 是对角矩阵,计算 Λ^n 只需要对其对角线上的每个元素(标量)进行 n 次幂运算,这可以在常数时间内完成。
对于斐波那契矩阵,其特征值为 (1±√5)/2。利用这个性质,我们可以推导出斐波那契数列的闭式解(比奈公式):

F(n) = (φ^n - ψ^n) / √5,其中 φ = (1+√5)/2, ψ = (1-√5)/2

这样,我们就能在常数时间 O(1) 内计算出任意项。

function fib_constant(n)
    φ = (1+√5)/2
    ψ = (1-√5)/2
    return round((φ^n - ψ^n) / √5)
end

以下是不同算法的时间复杂度对比总结:

  • 递归法:指数时间复杂度 O(2^n)
  • 迭代/记忆化:线性时间复杂度 O(n)
  • 矩阵快速幂:对数时间复杂度 O(log n)
  • 闭式解:常数时间复杂度 O(1)

总结与过渡

本节课中我们一起学习了线性代数的核心概念,包括向量、矩阵及其运算,并通过斐波那契数列这个生动的例子,见证了如何运用矩阵分解等数学工具将算法效率从指数级提升到常数级。这个过程中,特征分解矩阵幂运算的简化是关键思想。

下一节,我们将把这些强大的数学工具应用到优化领域,学习牛顿法。你将看到,通过利用目标函数的二阶导数信息(以海森矩阵形式表示),牛顿法能够比上节课所学的梯度下降法收敛得更快,这背后的原理与我们今天学习的矩阵运算密切相关。


延伸阅读:如果你想进一步巩固线性代数知识,推荐以下资源:

  • 3Blue1Brown 的“线性代数的本质”系列视频:提供出色的可视化直观解释。
  • 《线性代数及其应用》(David C. Lay 著):教材前几章提供了扎实的形式化基础。

007:牛顿法 🚀

在本节课中,我们将学习牛顿法,这是一种比梯度下降法更快的优化算法。我们将了解其基本原理、推导过程、收敛速度,并理解其优缺点。

上一节我们介绍了梯度下降法,本节中我们来看看牛顿法。

牛顿法的基本思想 💡

梯度下降法的核心思想是沿着当前点的梯度方向(即最陡下降方向)移动,以找到函数的最小值。然而,牛顿法采用了不同的策略。

牛顿法的核心思想是,我们不仅希望“下山”,更希望直接找到梯度为零的点。对于一个无约束且严格凸的目标函数,其全局最小值点处的梯度恰好为零。因此,寻找最小值点等价于寻找梯度函数的零点。

从求根到优化 🔄

寻找函数零点(求根)的问题,早在数百年前就已被研究,其经典方法是牛顿法。

牛顿法是一种迭代方法。它从一个初始点开始,通过一系列步骤逼近函数的根。其过程是:在当前点 x_k 处,对函数 f(x) 进行线性化(即使用其切线),然后找到该切线与x轴的交点,并将该交点作为下一个迭代点 x_{k+1}

以下是牛顿法求根的核心迭代公式:

x_{k+1} = x_k - f(x_k) / f'(x_k)

其中,f'(x_k) 是函数在 x_k 处的导数。

牛顿法通常收敛速度很快,尽管在某些情况下可能发散,但本节课我们暂不讨论发散的情形。

应用于优化问题 ⚙️

现在,我们将牛顿法应用于优化问题:寻找目标函数 F(x) 的梯度为零的点(即最小值点)。

为此,我们使用牛顿法来逼近梯度 ∇F(x) = 0 的解。此时的迭代公式变得稍微复杂一些:

x_{k+1} = x_k - [∇²F(x_k)]⁻¹ ∇F(x_k)

其中:

  • ∇F(x_k) 是函数在 x_k 处的梯度(一阶导数向量)。
  • ∇²F(x_k) 是函数在 x_k 处的海森矩阵(二阶导数矩阵)。
  • [∇²F(x_k)]⁻¹ 是海森矩阵的逆。

公式中的 d_k = - [∇²F(x_k)]⁻¹ ∇F(x_k) 给出了搜索方向。与梯度下降法类似,我们可以在此方向上应用线搜索来进一步优化步长。

与需要130步的梯度下降法相比,牛顿法在上图的例子中仅用一步就达到了最小值点附近,速度提升了130倍。然而,牛顿法的每次迭代计算成本更高,因为需要计算并求逆海森矩阵。对于高维问题,求逆可能变得计算困难。

公式推导 📝

牛顿法的优化公式是如何从求根公式演变而来的呢?其动机源于对目标函数的二阶泰勒展开。

我们在当前点 x_k 对目标函数 F(x) 进行二阶泰勒展开:

T(x) = F(x_k) + ∇F(x_k)^T (x - x_k) + 1/2 (x - x_k)^T ∇²F(x_k) (x - x_k)

这个展开式在 x_k 处的一阶和二阶导数与原函数 F 相同,因此是原函数的一个良好局部近似。

牛顿法的策略是:在每一步,我们寻找使得这个二次近似模型 T(x) 的梯度为零的点,并将其作为下一个迭代点。即求解 ∇T(x) = 0

计算 T(x) 的梯度并令其为零:

∇T(x) = ∇F(x_k) + ∇²F(x_k) (x - x_k) = 0

通过线性代数变换,解出 x

x = x_k - [∇²F(x_k)]⁻¹ ∇F(x_k)

这就得到了牛顿法的迭代公式。

超线性收敛速度 ⚡

关于牛顿法的收敛速度,有一个非常重要的定理,即康托罗维奇在20世纪40年代证明的牛顿法超线性收敛定理。

该定理指出,如果函数 F 二阶可微,其海森矩阵正定,且梯度的变化率(由利普希茨常数界定)有上界,那么只要初始点足够接近最小值点,牛顿法就能以 双对数级别 的速度收敛。

收敛的复杂度阶为 O(log log(1/ε)),其中 ε 是允许的误差。这意味着,如果我们将误差要求提高1000倍,可能只需要增加一两次牛顿迭代。这种超线性收敛区域就像最小值点周围的一个“球”,一旦进入这个球,牛顿法能在极少的几步内达到机器浮点数所能表示的精度极限。


本节课中我们一起学习了牛顿法。我们了解到,牛顿法通过利用目标函数的二阶导数(海森矩阵)信息,能够比只利用一阶导数的梯度下降法更快地收敛到最小值点。其核心步骤是求解当前点处二次近似模型的极小值。虽然每次迭代计算成本较高,但其卓越的收敛速度(尤其是接近解时的超线性收敛)使其在许多中低维优化问题中非常有效。理解牛顿法为后续学习处理高维问题的拟牛顿法等优化算法奠定了基础。

008:模型拟合作为优化问题 📊

在本节课中,我们将学习如何将模型拟合问题转化为优化问题。我们将从概率分布拟合入手,然后探讨回归模型,并了解如何通过选择损失函数和添加正则化来训练模型,防止过拟合。

上一节我们介绍了牛顿法,它显著提升了梯度下降的收敛速度。本节中,我们来看看如何将模型拟合问题形式化为优化问题。

概率分布拟合 📈

首先,我们不再局限于上一讲中的点预测模型。有时,我们不仅需要点预测,还需要处理不确定性,即使用概率分布模型。凸优化的概念也常常适用于处理概率分布。

概率分布族

以下是两种常见的概率分布族,它们都带有可调整的参数。

  • 泊松分布:这是一个离散分布,用于描述在固定时间间隔内独立事件发生的次数(例如,商店一小时内到达的顾客数)。其参数向量 θ 只有一个元素 k,它代表了事件发生的平均速率。
  • 正态分布:这是一个连续分布,有两个参数:均值 μ 和标准差 σ。正态分布在自然界中广泛存在,根据中心极限定理,许多独立随机变量之和会趋近于正态分布。

最大似然估计

假设我们有一个独立同分布的数据集 D = {x₁, x₂, ..., xₙ},我们想找到一个参数为 θ 的概率分布 P_θ(x) 来最好地描述这些数据。

为此,我们定义似然函数
L(θ) = ∏_{i=1}^{n} P_θ(x_i)

似然函数衡量了在给定参数 θ 下,观察到当前数据集的概率。θ 的值越大,说明该分布越可能产生我们观察到的数据。我们的目标是找到使似然函数最大化的 θ

然而,直接最大化似然函数在计算上可能遇到问题,因为许多小于1的概率相乘会得到一个极小的数值。因此,我们通常转而最大化对数似然函数,或等价地,最小化负对数似然函数。对数运算不改变函数的凸性,且能将连乘转化为连加,更易于处理。

NLL(θ) = -∑_{i=1}^{n} log(P_θ(x_i))

应用示例:碳定年法 🏺

在考古学中,碳定年法通过测量文物中碳14原子的衰变数量来估算其年龄。由于每个原子的衰变是独立的,在固定时间内观测到的衰变次数服从泊松分布。

通过测量得到一系列衰变计数的观测数据,我们可以构建负对数似然函数,并优化参数 k。找到最优的 k* 后,即可根据碳14的半衰期公式推算出文物的可能年龄。

回归模型拟合 📉

现在,我们转向机器学习中常见的另一类问题:回归。回归问题属于监督学习,我们拥有带标签的输入-输出数据,目标是学习一个模型,能够根据输入预测输出。

模型类型

回归模型主要分为两大类:

  • 参数化模型:模型具有固定数量的参数,复杂度有界。例如线性回归、多项式回归。
  • 非参数化模型:模型的复杂度(或参数数量)可以随着数据量的增加而增长。例如核回归、K近邻回归。这类模型通常需要更高的计算和存储成本。

本节课我们更关注参数化模型,它们又可分为线性和非线性模型。

线性回归

在线性回归中,我们通常使用一组基函数的线性组合来构建模型。模型形式如下:

M_θ(x) = ∑_{j=1}^{m} θ_j * φ_j(x)

其中,φ_j(x) 是基函数(例如多项式 x^j、高斯函数等),θ_j 是对应的权重参数。

模型训练的目标是找到参数 θ,使得模型预测值 M_θ(x_i) 与真实观测值 y_i 尽可能接近。这通过最小化一个损失函数来实现。

损失函数的选择

损失函数衡量模型预测的误差,其选择是一个独立于模型族的设计决策。常见的损失函数有:

  • 均方误差L(θ) = (1/n) ∑ (y_i - M_θ(x_i))^2
    • 优点:处处可微,优化方便。
    • 缺点:对异常值敏感。
  • 绝对误差L(θ) = (1/n) ∑ |y_i - M_θ(x_i)|
    • 优点:对异常值更鲁棒。
    • 缺点:在误差为零处不可微。
  • Huber损失:在误差较小时使用均方误差,误差较大时使用绝对误差。它结合了前两者的优点,既在零点附近可微,又能抵抗异常值。

过拟合与正则化

在选择模型时,一个重要问题是模型复杂度(例如,多项式的阶数)。如果允许的基函数过多(模型过于复杂),虽然模型在训练数据上的误差可以降得很低,但它可能会学习到数据中的噪声或偶然特征,导致在未见过的测试数据上表现很差,这种现象称为过拟合

为了防止过拟合,常见的做法是使用正则化。我们在原始的损失函数中添加一个惩罚项,用于抑制模型参数变得过大。例如,在均方误差的基础上加入L2正则化(也称为岭回归):

L_reg(θ) = (1/n) ∑ (y_i - M_θ(x_i))^2 + μ * ∑ θ_j^2

其中,μ 是正则化强度超参数。通过调整 μ,我们可以在模型对训练数据的拟合程度和模型本身的复杂度之间进行权衡。较大的 μ 会迫使参数值变小,从而倾向于选择更简单的模型,有助于提升泛化能力。

总结 🎯

本节课我们一起学习了以下内容:

  1. 回顾了线性代数中将在本课程中反复出现的重要概念。
  2. 看到了牛顿法相比梯度下降法带来的巨大速度提升。
  3. 深入探讨了模型拟合的多个方面:
    • 如何通过求解优化问题(最大似然估计)将概率分布拟合到观测数据。
    • 如何通过定义和选择合适的损失函数,将回归模型的训练表述为一个优化问题。
    • 了解了当模型复杂度较高时,如何通过向损失函数添加正则化惩罚项来防止过拟合,从而在模型精度和简单性之间取得平衡。

009:不等式约束优化

在本节课中,我们将学习不等式约束优化的基本概念与求解方法。课程将从拓扑学的基本定义开始,逐步深入到不等式约束问题的定义、求解方法(内点法),并探讨其与线性规划的联系,最后展望软等式约束,为下一讲做铺垫。

拓扑学基本概念 🔵

上一节我们介绍了课程的整体安排,本节中我们来看看一些必要的拓扑学基本概念。拓扑学是数学的一个分支,这里我们仅介绍后续优化方法中需要用到的基础定义。

开集与闭集

以下是开集与闭集的核心定义。

  • 开集:一个集合是开集,如果对于集合内的任意一点,你都能找到一个以该点为中心、半径为 ε 的小球(或邻域),使得这个小球完全包含在该集合内部。这意味着开集不包含其“边界”。
    • 公式表示:设集合 P 是开集,当且仅当 ∀ x ∈ P, ∃ ε > 0, 使得 { y | ||y - x|| < ε } ⊆ P。
  • 闭集:一个集合是闭集,如果它的补集(即所有不在该集合中的点构成的集合)是一个开集。闭集包含其所有“边界点”。
    • 公式表示:设集合 P 是闭集,当且仅当 P 的补集 P^C 是开集。

开集和闭集之所以重要,主要有两点原因:首先,它们与函数连续性的定义有关;其次,它们关系到极限点的性质。在迭代优化算法中,我们通过一系列迭代点逐步逼近最优解。闭集有一个很好的性质:它包含其内部所有收敛序列的极限点。

极限点示例

为了理解极限点的概念,我们来看一个例子。

考虑点列 P_n = 1/n,其中 n 从 1 开始递增,得到序列 1, 1/2, 1/3, ...。现在假设我们的集合 P 是开区间 (0, 1](即 0 不在集合内,1 在集合内)。显然,序列中的所有点 P_n 都属于集合 P。然而,这个序列的极限是 0,而 0 恰好位于 P 的边界上,并且不在 P 内。这就构成了一个反例:序列中的所有点都在 P 内,但其极限点却在 P 外。

集合运算性质

了解了基本定义后,我们来看看对开集和闭集进行并集与交集运算时,结果会如何变化。

以下是开集的运算性质。

  • 有限交:有限个开集的交集仍然是开集。
  • 任意并:任意多个(包括无限个)开集的并集仍然是开集。

需要注意的是,“有限交”只对有限个开集成立。为什么不能保证无限个开集的交集仍是开集呢?请看以下反例。

构造一系列开集 A_n = (-1/n, 1/n),即从 -1/n 到 1/n 的开区间。当 n 趋于无穷大时,这个区间会越来越小,无限趋近于 0。如果我们取所有这些开集的交集(即 n 从 1 到无穷大),那么唯一一个同时属于所有 A_n 的点就是 0。而单点集 {0} 是一个闭集。这就证明了无限个开集的交集不一定是开集。

以下是闭集的运算性质。

  • 任意交:任意多个(包括无限个)闭集的交集仍然是闭集。
  • 有限并:有限个闭集的并集仍然是闭集。

同样,“有限并”只对有限个闭集成立。无限个闭集的并集不一定是闭集。反例:考虑闭集 B_n = [1/n, 1 - 1/n]。当 n 增大时,这些集合逐渐填充 (0, 1) 区间,但始终不包含端点 0 和 1。这些闭集的无限并集是开区间 (0, 1),这是一个开集。

开与闭的非互斥性

开集和闭集并非完全互斥的性质。一个集合可以同时是开集和闭集(例如空集),也可以既不是开集也不是闭集(例如半开半闭区间 [0, 1))。此外,还存在一些集合,其内部可能是“空”的,这引出了闭包和内部的概念。

闭包与内部

为了更精确地描述集合的边界性质,我们引入闭包和内部的概念。

  • 闭包:集合 P 的闭包,记作 cl(P),是包含 P 的最小闭集。你可以把它想象成给 P 加上其所有边界点。
  • 内部:集合 P 的内部,记作 int(P),是包含于 P 的最大开集。你可以把它想象成从 P 中去掉其所有边界点。

一个集合的内部可能是空的。例如,单点集 {1} 的内部是空集,因为无法围绕这个点画出一个完全包含在集合内的小球。由离散点(如自然数集)构成的集合,其内部也是空集。另一个重要例子是低维空间嵌入到高维空间的情况,例如在二维平面中,约束在直线 y=x 上的所有点构成的集合。虽然这条直线上点很多,但在二维平面中,你无法围绕其中任意一点画出一个完全落在该直线上的二维圆盘,因此该集合在二维空间中的内部是空集。

在优化问题中,如果我们施加了等式约束(如 x=y),那么可行解集就可能具有空内部,这会对许多优化算法的应用产生影响。

本节课中,我们一起学习了拓扑学中开集、闭集、闭包和内部的基本概念,并通过例子理解了极限点和集合运算的性质。这些概念是理解后续约束优化问题,特别是处理具有“空内部”可行域问题的基础。下一节,我们将正式进入不等式约束优化的定义与意义。

010:不等式约束 🧩

在本节课中,我们将要学习如何处理带有不等式约束的优化问题。我们将从一个现实的投资分配例子出发,理解不等式约束的直观意义,然后学习如何将这类约束优化问题转化为我们熟悉的、可以使用梯度下降或牛顿法等算法求解的形式。

从投资问题引入不等式约束 💰

上一节我们介绍了无约束优化问题,本节中我们来看看当问题存在限制条件时该如何处理。让我们从一个投资分配的例子开始。

假设你有一笔资金(例如500万欧元)可以用于多项投资,比如投资初创公司、为公司做广告宣传,或者为房屋安装节能隔热材料。在这些例子中,一个合理的假设是回报函数是凹函数

凹函数体现了“收益递减”原则。以安装房屋隔热材料为例:第一次安装10厘米隔热层会显著提升能效,带来可观的回报。但在此基础上再增加10厘米,虽然能效仍会提升,但其带来的额外节能收益通常不如第一次那么显著。因此,回报随投资金额增加而增加,但增速逐渐放缓,函数图像呈凹形

由于我们的目标是最大化回报,而我们的算法擅长最小化凸函数,因此我们可以取回报函数的负值。这样,最大化凹回报函数的问题,就等价于最小化一个凸函数的问题。

最优资源分配问题 📊

那么,如何在各项投资之间分配资金呢?如果没有限制,拥有无限资金就无需过多思考。但现实中,我们的资源是有限的,必须进行分配。这个问题被称为最优资源分配问题

我们可以用数学形式来描述它,构建一个带约束的优化问题:

  • 目标:最大化总投资回报。
  • 约束1:总投资额不能超过总预算(例如500万欧元)。
  • 约束2:每项投资金额不能为负(即不能通过贷款等方式进行“负投资”)。

用公式表示如下:

最大化:∑ᵢ Rᵢ(xᵢ)
约束条件:
    ∑ᵢ xᵢ ≤ B   (预算约束)
    xᵢ ≥ 0      (非负约束)

其中,Rᵢ(xᵢ) 是第 i 项投资的回报函数(凹函数),xᵢ 是投入第 i 项的资金,B 是总预算。

在这个问题中,∑ᵢ xᵢ ≤ B 就是一个典型的不等式约束。它要求左侧的和小于或等于右侧的常数。即使取等号,这也被称为不等式约束。

约束优化的一般形式 🔧

一般来说,约束优化意味着我们对所考虑的解决方案集合施加了限制。

此前,我们在 Rⁿ 空间中进行(无约束)优化,所有解都是可行的。现在,我们引入约束,定义了一个可行域 X,它是 Rⁿ 的一个子集,可能更小且结构更复杂。

我们的核心思想是:将这个要求解必须位于集合 X 中的约束优化问题,转化为一个无约束形式等价表示,从而能够运用前面学过的梯度下降、线搜索、牛顿法等算法进行求解。

对于不等式约束,这正是本节课要学习的内容。

约束类型与规范形式 📐

除了不等式约束,优化问题中还可能存在等式约束。为了给出完整的图景,我们先进行对比,再深入细节。

以下是两种基本约束类型:

  • 不等式约束g(x) ≤ 0
  • 等式约束h(x) = 0

我们可以组合多个约束。就像课程开始时讨论的集合交集一样,如果一个问题同时有不等式约束和等式约束,那么可行解必须同时满足所有约束,即位于所有约束条件定义的集合的交集之中。

由此,我们可以得到约束优化问题的规范形式,这种形式将在后续课程中反复使用:

最小化:f(x)
约束条件:
    gᵢ(x) ≤ 0,  i = 1, ..., m
    hⱼ(x) = 0,  j = 1, ..., p

其中,f(x) 是凸函数,gᵢ(x) 是凸函数(这能保证不等式约束定义的集合是凸集),hⱼ(x) 是仿射函数。我们首先将分别学习处理不等式和等式约束的方法,之后会将它们结合起来,以求解这种一般规范形式的约束优化问题。

在本课程中,我们始终确保处理的是凸优化问题。这意味着,当我们把所有约束条件结合起来,构造出满足所有约束的可行解集 X 时,我们希望这个集合 X 本身也是凸集。凸集的性质对于保证优化问题的良好性质和求解效率至关重要。

总结 🎯

本节课中我们一起学习了不等式约束优化问题的引入与基本形式。我们从投资分配的例子理解了不等式约束的现实意义,并学会了如何用数学公式描述这类问题。我们明确了约束优化的目标是定义可行域,并将其转化为可求解的形式,同时了解了包含不等式与等式约束的规范形式。在接下来的课程中,我们将深入探讨求解这些约束的具体方法。

011:内点法 🧮

在本节课中,我们将要学习内点法。内点法是解决不等式约束优化问题的主要方法之一。

概述

上一节我们介绍了处理约束问题的基本思路。本节中我们来看看如何通过内点法,将带有不等式约束的优化问题转化为一系列无约束问题来求解。其核心思想是使用一个可微的“障碍函数”来近似不可微的指示函数,从而允许我们使用梯度下降或牛顿法等熟悉的算法。

从指示函数到障碍函数

首先,我们回顾指示函数的定义。对于一个集合 X,其指示函数 I_X(x) 定义为:

I_X(x) = 0, 如果 x ∈ X
I_X(x) = +∞, 如果 x ∉ X

利用指示函数,我们可以将一个约束优化问题:

minimize f(x), subject to x ∈ X

转化为一个等价的、形式上的无约束问题:

minimize f(x) + I_X(x)

然而,这个转化并不实用,因为指示函数在边界处不可微,会导致梯度无法计算,使得基于梯度的优化算法失效。

为了解决这个问题,我们引入对数障碍函数来近似指示函数。对于一个不等式约束 g(x) ≤ 0,其对数障碍函数定义为:

-(1/t) * log(-g(x))

其中,t > 0 是一个参数。这个函数在 g(x) < 0 的区域(即约束内部)是定义良好且可微的。当 x 接近约束边界(即 g(x) → 0⁻)时,-log(-g(x)) → +∞,从而形成了一个“软”的障碍。参数 t 控制着障碍的“硬度”:t 越大,障碍函数越接近真实的指示函数。

序列无约束最小化技术

直接使用一个固定的、很大的 t 会遇到数值问题。内点法的标准做法是采用序列无约束最小化技术。

其算法流程如下:

以下是算法的主要步骤:

  1. 选择一个初始的可行内点 x₀(即满足所有 g_i(x) < 0)和一个较小的初始 t₀ > 0
  2. 对于 k = 0, 1, 2, ... 进行外循环:
    • 以当前点 x_k 为起点,使用牛顿法或梯度下降法等求解以下无约束问题(内循环):
      minimize f(x) + φ(x)
      其中 φ(x) = - (1/t_k) * Σ log(-g_i(x)) 是对数障碍函数。
    • 将内循环求得的解记为 x_{k+1}*。
    • 增大障碍参数,例如 t_{k+1} = μ * t_k,其中 μ > 1(常用 10 或 20)。
    • x_{k+1} = x_{k+1}*,作为下一轮外循环的起点。
  3. t_k 足够大,解足够接近原始约束问题的最优解时,算法终止。

通过逐步增大 t,我们使得障碍越来越“硬”,解也越来越逼近约束边界上的真正最优解。理论(如自协调函数理论)可以指导如何最优地增大 t 以保持牛顿法的超线性收敛速度。

实例:广告资源分配问题

让我们通过一个具体例子来理解内点法的应用。假设一家公司有 500 万欧元广告预算,需要在电视和报纸两种渠道分配,目标是让尽可能多的人至少看到一次广告。

以下是问题建模:

  • 决策变量x₁(电视广告次数),x₂(报纸广告次数)。
  • 目标函数(最大化):总覆盖人数。
    • 电视:R_TV(x₁) = 40 * (1 - 0.98^x₁) (百万)
    • 报纸:R_Paper(x₂) = 20 * (1 - 0.80^x₂) (百万)
    • 总人数:f(x) = R_TV(x₁) + R_Paper(x₂)
  • 约束条件
    1. 预算约束:200,000 * x₁ + 100,000 * x₂ ≤ 5,000,000 (简化后:2x₁ + x₂ ≤ 50
    2. 非负约束:x₁ ≥ 0, x₂ ≥ 0

这是一个最大化凹函数的问题,可以转化为最小化 -f(x)。我们为其添加对数障碍函数:

minimize -[R_TV(x₁) + R_Paper(x₂)] - (1/t)[log(50 - 2x₁ - x₂) + log(x₁) + log(x₂)]

通过内点法求解(例如,从 t=0.1 开始,逐步增大到 t=100),我们得到最优解约为 x₁ ≈ 18.7, x₂ ≈ 12.4,此时预计覆盖约 3138 万人。

寻找初始可行点

内点法需要一个严格可行的初始点(所有约束 g_i(x) < 0)。对于复杂问题,这可能并不容易。我们可以通过求解一个辅助的“阶段一”问题来寻找。

以下是构造“阶段一”问题的方法:

  1. 任选一个初始点 x₀(可能不可行)。
  2. 引入一个松弛变量 s,构造新问题:
    minimize s
    subject to g_i(x) - s ≤ 0, for all i
    s ≥ 0 (通常隐含在障碍函数中处理)
  3. 初始时,设 s₀ 为所有约束违反值的最大值,即 s₀ > max_i g_i(x₀),这样 (x₀, s₀) 对新问题是可行的。
  4. 用内点法求解这个新问题。
    • 如果最终得到 s < 0,则对应的 x 就是原问题的一个严格可行内点。
    • 如果 s > 0*,则原问题不可行(没有满足所有约束的点)。
    • 如果 s = 0*,则原问题可行,但最优解可能在边界上,此时需要特别处理。

总结

本节课中我们一起学习了内点法。我们从指示函数出发,认识到其不可微性带来的困难,进而引入可微的对数障碍函数进行近似。通过序列无约束最小化技术,逐步收紧障碍,我们能够有效地求解带有不等式约束的凸优化问题。最后,我们还探讨了如何通过求解一个辅助问题来获得内点法所需的初始可行点,并分析了一个广告预算分配的实际案例。内点法是现代优化工具箱中处理不等式约束的强大且实用的方法。

014:更多线性代数知识

在本节课中,我们将学习一些关键的线性代数概念,这些概念对于理解后续的等式约束优化至关重要。我们将回顾线性方程求解、矩阵行列式、矩阵正定性以及向量空间的基、秩和零空间等概念。

上一节我们介绍了无约束优化的基本方法,本节中我们来看看解决优化问题时需要用到的一些核心线性代数工具。

线性方程求解

我们经常需要求解形如 Ax = b 的线性方程组。其中 A 是一个矩阵,b 是一个向量,我们需要找到满足等式的向量 x

最直接的方法是计算矩阵 A 的逆矩阵 A⁻¹,然后得到解 x = A⁻¹b。但这要求矩阵 A 必须是可逆的。

在实际的数值计算中,更稳健的方法是将其转化为一个优化问题来求解:

\min_x \|Ax - b\|

Ax - b 的范数为零时,我们便得到了精确解。数值求解库通常会处理以下三种情况:

  • 存在唯一解:优化问题会返回使范数为零的 x
  • 存在无穷多解:优化问题会从所有解中,返回范数最小的那个 x
  • 无解:优化问题会返回使范数最小的 x,即最接近的解。

许多求解器会利用矩阵的特殊结构(如稀疏性、三角性)来提高效率。例如,牛顿法中求解步长方向 d 的方程 H(x)d = -∇f(x),本质上就是一个需要求解的线性方程组。

以下是一个混合颜料的具体例子:

假设我们有两种颜料:波尔多红(含80%红,20%蓝)和靛蓝(含10%红,90%蓝)。我们希望混合出紫罗兰色(含50%红,50%蓝)。设混合时波尔多红的比例为 x₁,靛蓝的比例为 x₂,则可建立方程:

\begin{bmatrix} 0.8 & 0.1 \\ 0.2 & 0.9 \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} = \begin{bmatrix} 0.5 \\ 0.5 \end{bmatrix}

使用求解器(如Julia中的反斜杠运算符 \)可得解:x₁ ≈ 0.57, x₂ ≈ 0.42。即需要约57%的波尔多红和42%的靛蓝。

思考题:如果我们想混合出纯蓝色颜料(100%蓝,0%红),即求解 Ax = [0, 1]ᵀ,是否可行?可能会遇到什么问题?

矩阵的行列式

对于一个方阵 A,其行列式 det(A) 的几何意义是由其列向量张成的平行多面体的“有向”体积。

行列式的重要性质包括:

  • det(AB) = det(A) det(B)
  • det(Aᵀ) = det(A)
  • A 可逆,则 det(A⁻¹) = 1 / det(A)

行列式是否为零与矩阵的可逆性紧密相关:

  • det(A) ≠ 0,则矩阵 A 可逆,其列向量线性无关。
  • det(A) = 0,则矩阵 A 不可逆(奇异),其列向量线性相关。

在牛顿法中,我们需要计算海森矩阵 H(x) 的逆,这就要求 H(x) 的行列式非零,即 H(x) 必须是可逆的。

矩阵的正定性

对于一个对称矩阵 A ∈ ℝⁿˣⁿ,其正定性定义如下:

  • 正定:对于所有非零向量 x ≠ 0,都有 xᵀAx > 0。记作 A ≻ 0
  • 半正定:对于所有非零向量 x ≠ 0,都有 xᵀAx ≥ 0。记作 A ≽ 0

类似地,可以定义负定和半负定。

单位矩阵 I 是正定矩阵。在优化中,我们有时通过给海森矩阵加上一个倍数 λI 来确保其正定性,从而保证算法稳定。

从几何上看,如果函数在某点 x 处的海森矩阵 H(x) 是正定的,那么函数在该点的二阶泰勒展开近似是一个向上开口的“碗状”曲面,表明该点是一个局部极小值点。

基、秩与零空间

这些概念对于处理带有等式约束的优化问题至关重要。

假设我们有一组列向量 {a₁, a₂, ..., aₙ},每个向量 aᵢ ∈ ℝᵐ。如果这些向量线性无关,那么它们构成了 ℝᵐ 中一个 n 维子空间的一组。该子空间中的所有向量 x 都可以表示为这些基向量的线性组合:x = Σ bᵢaᵢ

现在考虑一个矩阵 A ∈ ℝᵐˣⁿ,其列向量即为 a₁, a₂, ..., aₙ

  • 列空间/值域:所有形如 Axx ∈ ℝⁿ)的向量构成的集合。其维度称为矩阵 A,记作 rank(A) = k。它等于 A 中线性无关列向量的最大数目,且 k ≤ min(m, n)
  • 零空间:所有满足 Ay = 0 的向量 y ∈ ℝⁿ 构成的集合。

一个重要定理是:零空间的维度 = n - k,即列数减去矩阵的秩。

在Julia中,可以方便地计算这些值。例如,对于一个 2×4 的矩阵 A,其秩可能为2(最大可能值)。计算其零空间,会得到一组基向量,这些向量与 A 相乘结果为零。

本节课中我们一起学习了线性方程求解、行列式、矩阵正定性以及基、秩和零空间等核心线性代数概念。下一节,我们将利用这些工具,正式引入等式约束优化问题。

015:等式约束

概述

在本节课中,我们将学习带有等式约束的优化问题。我们将从一个历史案例——最优运输问题出发,理解等式约束的形式化表达,并探讨如何将其转化为标准形式的线性规划问题。我们将重点关注线性等式约束,以确保解空间的凸性,这是后续算法有效应用的前提。

历史背景:最优运输问题

上一节我们介绍了无约束和不等式约束优化。本节中,我们来看看等式约束。历史上,等式约束优化源于一些重要的应用问题,如今它们被归为最优运输问题。

以下是两个在历史上几乎同时期被提出的例子:

  • 康托维奇问题:在第二次世界大战期间,一位红军将军希望以最小的代价将士兵从兵营运送到前线阵地。兵营有不同数量的士兵,前线阵地有不同的人员需求,目标是找到运输成本最低的方案。
  • 希区柯克问题:一个农民合作社希望将农产品运送到不同市场。每个农民生产不同作物,每个市场有不同需求,目标同样是满足所有市场需求的同时,最小化运输成本。

这两个问题本质上是相同的,只是应用场景不同。在20世纪40年代,这类问题激发了广泛的研究兴趣。本课程将以康托维奇问题作为主要示例。

问题形式化:矩阵表示

现在,我们来看如何将上述运输问题形式化为一个优化问题。

假设我们有三个兵营(B1, B2, B3),士兵数量分别为60,000, 90,000和150,000。有三个前线阵地(P1, P2, P3),需求分别为120,000, 100,000和80,000。

我们可以用一个3x3的矩阵 M 来表示运输方案,其中元素 M[i, j] 表示从第 i 个兵营运送到第 j 个阵地的士兵数量。所有 M[i, j] 必须大于等于零。

同时,我们有一个成本矩阵 C,其中 C[i, j] 表示运送单位士兵从兵营 i 到阵地 j 的成本。

于是,优化问题可以表述为:寻找矩阵 M,在满足以下约束的前提下,最小化总运输成本。

目标函数(总成本)
总成本 = Σ_i Σ_j (C[i, j] * M[i, j])

约束条件

  1. 兵营供给约束(行和):从每个兵营运出的士兵总数必须等于该兵营的初始人数。
    • 对于兵营 B1:M[1,1] + M[1,2] + M[1,3] = 60,000
    • 对于兵营 B2:M[2,1] + M[2,2] + M[2,3] = 90,000
    • 对于兵营 B3:M[3,1] + M[3,2] + M[3,3] = 150,000
  2. 阵地需求约束(列和):运送到每个阵地的士兵总数必须等于该阵地的需求。
    • 对于阵地 P1:M[1,1] + M[2,1] + M[3,1] = 120,000
    • 对于阵地 P2:M[1,2] + M[2,2] + M[3,2] = 100,000
    • 对于阵地 P3:M[1,3] + M[2,3] + M[3,3] = 80,000
  3. 非负约束M[i, j] >= 0 对所有 i, j 成立。

这是一个线性规划问题,因为目标函数和所有约束(除了非负约束)都是线性的。

转化为标准形式:向量表示

为了便于算法设计和理论分析,我们需要将上述矩阵形式的问题转化为更标准的优化问题形式。

我们不再使用矩阵 M,而是将其列向量依次堆叠,形成一个9维的决策向量 x
x = [M[1,1], M[2,1], M[3,1], M[1,2], M[2,2], M[3,2], M[1,3], M[2,3], M[3,3]]^T

同样,将成本矩阵 C 也按相同顺序堆叠成9维成本向量 c

此时,目标函数可以简洁地写为:
最小化 c^T * x

接下来处理等式约束。每个约束(如 M[1,1] + M[1,2] + M[1,3] = 60,000)都可以表示为一个向量 a_kx 的内积等于一个标量 b_k。例如,对于第一个兵营的约束,对应的向量 a_1M[1,1], M[1,2], M[1,3] 对应的位置为1,其余位置为0。

将所有6个等式约束对应的向量 a_k 作为行,可以组合成一个6x9的矩阵 A,将所有右侧常数 b_k 组合成一个6维向量 b。于是,所有等式约束可以合并为:
A * x = b

最后,非负约束保持不变:
x >= 0 (这里指向量的每个分量都大于等于0)

至此,我们得到了线性规划的标准形式:

最小化 c^T * x
满足 A * x = b
且 x >= 0

线性等式约束与凸性

我们刚刚看到,标准形式中的等式约束是线性的(A * x = b)。为什么我们只考虑这种形式的等式约束呢?

考虑一个非线性等式约束,例如 x_1^2 = 1。它的解是 x_1 = 1x_1 = -1。这两个解之间的连线上的点(例如 x_1 = 0)并不满足原等式。因此,满足该约束的解集 {1, -1} 不是凸集

本课程讨论的优化算法(如后续的梯度方法、内点法等)通常依赖于解空间的凸性来保证收敛到全局最优解。如果我们允许非线性的等式约束,解空间可能变得非凸,导致算法失效或只能找到局部最优解。

因此,在本课程中,我们只考虑线性等式约束。线性等式约束 A * x = b 定义了一个仿射子空间(或线性流形),它是一个凸集。任意两个满足该约束的解的线性组合(只要系数和为1)仍然满足该约束。多个线性等式约束的交集,即多个超平面或平面的交点,仍然是一个凸集(可能是一个点、一条线或一个平面)。

如上图所示,在二维空间中,两个线性等式约束(两条线)的交点是一个点(凸集)。在高维空间中,多个等式约束的交集可能是一个点、一条线、一个平面或更高维的仿射子空间,它们都是凸的。

总结

本节课中,我们一起学习了带有等式约束的优化问题。

  1. 我们从最优运输问题的历史案例入手,理解了等式约束在实际问题中的来源。
  2. 我们学习了如何将这类问题形式化为一个线性规划问题,并使用矩阵和向量进行表示。
  3. 我们探讨了将问题转化为标准形式最小化 c^T*x, 满足 A*x=b 且 x>=0)的过程,这为应用通用优化算法奠定了基础。
  4. 最后,我们强调了只考虑线性等式约束的重要性,因为它保证了解空间的凸性,这是本课程后续许多优化算法能够正确有效工作的关键前提。

下一节,我们将开始探讨如何求解这种带有线性等式约束(和不等式约束)的优化问题。

017:拉格朗日乘数法 🧮

在本节课中,我们将学习一种处理等式约束优化问题的重要方法——拉格朗日乘数法。与上一节介绍的约束消除法不同,该方法通过增加问题的维度来寻找最优解。

概述

到目前为止,我们已经学习了约束消除法,它通过降低优化问题的维度来求解。但还存在另一种截然不同的技术,它反其道而行之,即增加优化问题的维度。本节将详细介绍这种方法——拉格朗日乘数法。

问题引入与拉格朗日函数

假设我们有一个简单的优化问题:最小化目标函数 f(x) = x₁² + 3x₂²。若无约束,其最优解显然是 (0, 0)。但现在我们添加一个等式约束:x₁ + 2x₂ - 1 = 0。这意味着所有可行解都必须位于这条直线上。最优解 x* 也必须落在这条线上,并且是满足约束条件下目标函数值最小的点。

现在,我们引入拉格朗日乘数法。其核心是构造一个拉格朗日函数。拉格朗日函数是一个扩展的优化问题。对于原始问题 min f(x) 和等式约束 h(x) = 0,拉格朗日函数 L 定义为:

L(x, λ) = f(x) + λ * h(x)

这里,我们引入了一个新变量 λ,称为拉格朗日乘子。拉格朗日函数在原始目标函数的基础上,加上了拉格朗日乘子 λ 与等式约束函数 h(x) 的乘积。

求解方法:梯度为零

我们的目标是求解这个扩展后的优化问题。最优解出现在拉格朗日函数的梯度为零的点。回忆牛顿法,它在无约束凸问题中寻找梯度为零的点,该点即为极小值点。

在这里,我们采用类似的思路,但寻找的是拉格朗日函数 L 关于所有变量(包括 xλ)的梯度为零的点。我们可以定义一个扩展向量 z = [x; λ],然后要求 ∇ₓL = 0∇λL = 0

让我们通过之前的小例子来具体求解。

首先,计算拉格朗日函数关于 x 的偏导数并令其为零:
∂L/∂x₁ = 2x₁ + λ = 0
∂L/∂x₂ = 6x₂ + 2λ = 0

由此可得:2x₁ = -λ6x₂ = -2λ,简化后得到 x₁ = 3x₂

接着,计算拉格朗日函数关于 λ 的偏导数并令其为零:
∂L/∂λ = x₁ + 2x₂ - 1 = 0

有趣的是,这恰好就是我们原始的等式约束。通过构造拉格朗日函数,对其关于 λ 求导,我们正好恢复了等式约束条件。

现在,将 x₁ = 3x₂ 代入等式约束 x₁ + 2x₂ - 1 = 0,可以解析求解:
3x₂ + 2x₂ = 1 => 5x₂ = 1 => x₂ = 1/5
x₁ = 3*(1/5) = 3/5

因此,解析解为 x = (3/5, 1/5)*,这与我们在图中看到的最优点一致。

几何直观解释

为什么这种方法有效?我们可以从几何角度理解。

在等高线图上,目标函数 f(x) 的梯度 ∇f 指向函数值增加最快的方向。在满足等式约束的直线上任取一点,其梯度方向通常不与约束线垂直。

约束线本身有一个法向量方向(与线垂直的方向)。对于约束 x₁ + 2x₂ = 1,其法向量为 (1, 2)

拉格朗日函数关于 x 的梯度为 ∇ₓL = ∇f + λ * ∇h。其中 ∇h 正是约束的法向量。λ 是一个缩放因子。

关键点在于:在最优点 x* 处,目标函数的梯度 ∇f 与约束的法向量 ∇h 是平行的(方向相同或相反)。此时,我们可以通过选择合适的 λ 值,使得 ∇f + λ∇h = 0。这意味着,在约束线上,你无法通过沿切线方向移动来改善目标函数值,因为任何微小的移动要么违反约束,要么不会降低函数值(梯度在约束方向的分量为零)。因此,该点就是约束下的最优点。

这是一种非常巧妙的方法,它通过增加问题维度(引入 λ),将一个带等式约束的问题转化为一个高维无约束问题,从而可以再次应用牛顿法等寻找梯度为零的点。

方法推广与数值求解

上述概念可以推广到更一般的情况。假设有多个等式约束:Ax = b,其中 A 是 m×n 矩阵。那么拉格朗日函数变为:

L(x, λ) = f(x) + λᵀ(Ax - b)

这里 λ 是一个 m 维向量。我们需要求解的条件是扩展的梯度为零:
∇ₓL = ∇f(x) + Aᵀλ = 0
∇λL = Ax - b = 0

在使用牛顿法数值求解时,我们需要计算扩展的梯度向量和黑塞矩阵。幸运的是,如果已知原始目标函数的梯度 ∇f 和黑塞矩阵 ∇²f,以及矩阵 A,我们可以快速构造出扩展系统的梯度 G 和黑塞矩阵 H

G = [∇f(x) + Aᵀλ; Ax - b]
H = [[∇²f(x), Aᵀ]; [A, 0]]

现在,问题变成了一个 (n+m) 维的无约束问题,这很方便。但需要注意,这个扩展后的拉格朗日函数关于 (x, λ) 不再是凸函数(尽管关于 x 是凸的,关于 λ 是线性的)。然而,牛顿法仍然适用,因为它旨在寻找梯度为零的驻点(这里是一个鞍点)。梯度下降或线搜索法则可能不适用,因为它们试图最小化函数,而我们现在寻找的是鞍点。

以下是针对我们小例子的数值求解步骤概要:

  1. 定义目标函数 f(x) = x₁² + 3x₂²,其梯度 ∇f = [2x₁; 6x₂],黑塞矩阵 ∇²f = [[2, 0]; [0, 6]]
  2. 定义等式约束 x₁ + 2x₂ = 1,写成矩阵形式 A = [1, 2]b = [1]
  3. 构造拉格朗日函数 L(x, λ) = x₁² + 3x₂² + λ*(x₁ + 2x₂ - 1)
  4. 构造扩展梯度 G(z) 和扩展黑塞矩阵 H(z),其中 z = [x; λ]
  5. GH 代入牛顿法迭代公式。
  6. 数值求解的结果将与解析解 (3/5, 1/5) 一致。

历史背景与应用

拉格朗日乘数法由约瑟夫-路易·拉格朗日提出。他在1788年出版的《分析力学》中引入了这一方法。这一成果影响深远,其价值在于“提出了一种通用方法,使得每个力学问题都可以表述为一个单一的代数方程。任何机械系统(例如太阳系)的完整历史都可以浓缩成一句话。”

这是一个在数值计算机出现前150年就发明的强大工具,最初作为分析工具用于变分法等领域,求解结果甚至是函数而非有限维向量。它在物理学、经济学、工程学和计算机科学中都有广泛应用。近几十年来,随着数字计算机的发展,拉格朗日乘数法在数值优化中也变得极其重要。

总结

本节课我们一起学习了处理等式约束优化问题的第二种关键技术——拉格朗日乘数法。

  • 我们首先通过一个简单例子引入了该方法,并展示了如何构造拉格朗日函数。
  • 我们理解了最优解对应于拉格朗日函数梯度为零的点,并给出了该条件的几何解释:在最优点,目标函数的梯度与约束的法向量平行。
  • 随后,我们将方法推广到具有多个等式约束的一般情况,并给出了数值求解所需的扩展梯度与黑塞矩阵公式。
  • 最后,我们简要回顾了该方法的历史背景和广泛的应用领域。

拉格朗日乘数法通过增加问题维度,优雅地将等式约束问题转化为无约束问题,为使用牛顿法等成熟算法铺平了道路。在接下来的课程中,我们将看到如何将拉格朗日乘子法与内点法结合,以解决同时包含等式和不等式约束的凸优化问题,从而形成一个完整的求解框架。

018:拉格朗日量与线性规划

在本节课中,我们将学习如何将拉格朗日方法应用于具有等式约束的线性规划问题,并探讨其中可能遇到的困难及其解决方案。我们还将简要介绍后续课程中将涉及的三个应用实例。

概述

上一节我们介绍了处理等式约束的两种方法:约束消除法和拉格朗日法。然而,当我们将拉格朗日法与处理不等式约束的内点法结合,用于求解线性规划问题时,会遇到一些数值上的困难。本节将详细分析这些困难,并介绍克服它们的关键思想,为后续学习更高效的通用求解器奠定基础。

拉格朗日法应用于线性规划的困难

我们曾认为,将处理等式约束的拉格朗日法与处理不等式约束的内点法结合是简单的。思路是构造一个包含原始目标函数和对数障碍函数的新目标函数 \(\tilde{f}(x)\),然后将其代入拉格朗日函数 \(\tilde{\mathcal{L}}(x, \lambda)\) 中,通过迭代求解并收紧障碍参数 \(t\) 来逼近最优解。

然而,对于线性规划问题,这种方法存在一个根本性问题。原始目标函数 \(f(x)\) 是线性的,其海森矩阵(二阶导数矩阵)处处为零:

\[\nabla^2 f(x) = 0 \]

这意味着海森矩阵不可逆。虽然加入对数障碍项后,\(\tilde{f}(x)\) 的海森矩阵在对角线上会有非零项,但当迭代点远离障碍边界时,这些项的值会非常小,导致整个拉格朗日函数的海森矩阵 \(\nabla^2 \tilde{\mathcal{L}}(x, \lambda)\) 在数值上仍然接近奇异(不可逆)。这使得我们无法直接应用牛顿法等需要求逆海森矩阵的优化算法。

鞍点问题与优化方法

拉格朗日函数的优化目标是一个鞍点,而非最小值点。例如,函数 \(f(x, y) = xy\)\((0,0)\) 处有一个鞍点。对于凸优化问题,其拉格朗日函数存在唯一的鞍点,且该点对应原问题的最优解。理论上,牛顿法可以收敛到梯度为零的鞍点。

但由于上述海森矩阵不可逆的问题,我们无法直接使用牛顿法。因此,需要寻找替代的优化策略。

以下是解决此问题的几个关键思路:

1. Uzawa 方法

Uzawa 方法将联合优化问题分解为两个交替进行的步骤:

  • 第一步:固定拉格朗日乘子 \(\lambda\),仅对原始变量 \(x\) 最小化拉格朗日函数 \(\mathcal{L}(x, \lambda)\)。由于固定 \(\lambda\) 后,\(\mathcal{L}\) 关于 \(x\) 是严格凸的,这一步可以高效完成。
  • 第二步:根据当前等式约束的违反程度更新拉格朗日乘子 \(\lambda\)。违反程度越大的约束,其对应的 \(\lambda\) 分量更新幅度越大。

虽然这种方法能保证收敛,但收敛速度通常较慢。

2. 增广拉格朗日法

为了克服海森矩阵奇异性问题,增广拉格朗日法在标准拉格朗日函数中增加了一个惩罚项:

\[\mathcal{L}_{\rho}(x, \lambda) = f(x) + \lambda^T (Ax - b) + \frac{\rho}{2} \|Ax - b\|^2_2 \]

其中 \(\rho > 0\) 是一个惩罚参数。这一项在原问题可行解处(\(Ax-b=0\))值为零,因此不改变最优解。但其二阶导数 \(\rho A^TA\) 为正半定矩阵,加入到拉格朗日函数的海森矩阵中,可以使整体矩阵 \(\nabla^2 \mathcal{L}_{\rho}\) 变得正定,从而可逆。

然而,如果 \(\rho\) 值需要取得非常大才能保证数值稳定性,它可能会“淹没”原始目标函数 \(f(x)\),导致收敛速度变慢。

3. Powell 方法(结合 Uzawa 与增广拉格朗日)

Powell 方法巧妙地结合了上述两种思想。它不再使用单一的标量惩罚参数 \(\rho\),而是为每个等式约束分配一个独立的权重 \(\rho_i\),构成一个对角矩阵 \(D\)。优化过程交替进行:

  1. 固定 \(\lambda\)\(D\),最小化增广拉格朗日函数 \(\mathcal{L}_D(x, \lambda)\)
  2. 根据约束违反情况,自适应地调整各个 \(\rho_i\)(增大违反严重约束的权重)。
  3. 更新拉格朗日乘子 \(\lambda\)

这种方法能更精细地控制不同约束的惩罚力度,避免单个大 \(\rho\) 值带来的问题,提高了稳健性和效率。

与内点法结合及现状

我们可以将 Powell 方法中的目标函数 \(f(x)\) 替换为包含对数障碍项的 \(\tilde{f}(x, t)\),从而同时处理等式和不等式约束。通过迭代求解(不断增大障碍紧度参数 \(t\)),最终能收敛到原问题的最优解。

尽管这种结合了 Uzawa 思想、增广拉格朗日法和内点法的框架在概念上是完备的,并且是许多现代优化求解器(如 LANCELOT, IPOPT)的核心基础,但其早期版本的收敛速度可能较慢,且需要大量启发式策略来调整参数。

现代高性能求解器正是在这些基本构件之上,通过数十年的理论改进和算法工程(如更高效的线性系统求解、更好的步长选择和参数更新策略),才实现了对百万变量级别大规模问题的快速求解。在后续课程中,我们将逐步揭示这些改进是如何实现的。

总结

本节课我们一起学习了将拉格朗日法应用于线性规划时遇到的数值困难,即海森矩阵的奇异性问题。我们介绍了解决这一问题的三个核心思想:Uzawa 的交替优化方法增广拉格朗日法的惩罚项,以及结合二者的 Powell 方法。这些方法构成了处理等式与不等式约束的通用凸优化求解器的基础框架。尽管早期方法在速度上有所不足,但它们指明了方向,现代高效求解器正是沿着这个方向,通过持续的理论与算法创新而发展起来的。

019:机械桁架设计 🏗️

在本节课中,我们将学习如何将优化方法应用于一个经典的工程问题:机械桁架设计。我们将了解桁架的基本概念,学习如何将物理平衡条件转化为数学约束,并最终构建一个可求解的优化问题,以找到最轻量化的桁架结构。

什么是桁架?

想象一下桥梁或电力塔,你在日常生活中可能每天都能见到桁架。桁架是一种由刚性梁在节点处连接而成的机械结构,通常呈规则的网格状。右侧的桥梁或某些齐柏林飞艇类型的船体,其外壳就是由桁架构成的。在过去的约150年里,我们学会了如何建造这些结构,以及如何计算和设计它们。如今,这些结构很少倒塌,部分原因在于我们能够精确计算桁架内部的应力,并能预测其在风或振动等条件下的行为。

历史背景与发展

历史上,一位重要人物是Luian Street。在20世纪60年代,他与其他人共同创立了设计优化这一科学学科,旨在根据需求和约束条件,综合出最佳设计方案。他们从简单的桁架结构(例如一个五杆塔结构)开始,并编写了优化程序。起初,硬件速度很慢,但随着计算机性能的提升和方法的改进,到了80年代,当计算机足够快以解决有趣的问题时,相关公司成立,工具也发展为具有图形用户界面,并能与计算机辅助设计工具集成。如今,许多结构的创造都离不开计算机的帮助。

桁架优化问题设定

我们将要优化的桁架结构基于几个简化假设。我们考虑一个由一组梁(绿色部分)相互连接而成的桁架。连接点称为节点。其中一些节点承受外部载荷(例如重力)。此外,还有悬臂点,即桁架与地面、墙壁或固定点连接的点。

我们的目标是找到一个尽可能轻的桁架结构。我们假设所有节点的x和y坐标是固定的,这意味着当我们添加载荷时,桁架结构不会移动。我们还假设桁架本身的重量可以忽略不计。

平衡条件与力的分解

接下来,我们需要考虑所谓的平衡条件。沿着梁的方向有力作用。当梁在节点处交汇时,沿梁方向的力必须精确抵消。这些力可以是正的(拉力)或负的(压力),但总和必须为零。在真实的桁架结构中,情况就是如此,否则结构会加速移动。

为了计算沿梁方向的力在x和y方向上的分量,我们需要使用三角函数正弦和余弦。具体来说,x方向的分力是梁上力的标量乘以角度的余弦值。我们可以用向量形式更简洁地表示:如果用一个向量 Db 表示梁的方向,那么x方向的分力就是 Db 在x方向的分量除以其欧几里得范数(长度)再乘以梁上的力标量。y方向同理。

根据牛顿第三定律,两个物体之间的力大小相等、方向相反,必须相互抵消。因此,在考虑所有力(包括外部载荷)后,每个节点在x和y方向上的合力必须为零。

优化目标与问题构建

我们希望最小化桁架的重量,使其仍能承受给定载荷。单根梁的重量由其横截面积决定,因为节点位置固定,梁的长度已知。梁的重量是体积(长度乘以横截面积)乘以取决于材料(例如钢材类型)的常数因子。

我们知道,对于沿梁方向的特定力(拉力或压力),至少需要多大的横截面积才能安全承受。因此,我们最小化重量或横截面积,使其恰好满足要求。根据文献,存在一个因子δ,梁的质量可以表示为:
质量 = 长度 × |力| × δ
其中,|力| 表示力的绝对值。因子δ综合了文献中关于所需横截面积与力之间的线性关系知识。

因此,问题转化为:在所有梁上寻找一组力,使得整个桁架满足所需的平衡条件,同时最小化总质量。这看起来像一个带有等式约束的线性规划问题,但存在一个挑战:绝对值项。

处理绝对值项的技巧

绝对值项在零点没有定义的梯度,这给优化带来了困难。为了将其转化为可求解的凸优化问题,我们使用一个技巧。

原始问题是最小化 |f(x)|。我们引入一个额外的变量 s,并希望 s 恰好等于 |f(x)|。为此,我们向优化问题中添加两个不等式约束:
s ≥ f(x)s ≥ -f(x)
同时,我们最小化 s

以下是其工作原理的分析:

  • 情况1:f(x) > 0。约束 s ≥ f(x) 是起作用的,而 s ≥ -f(x) 自动满足。由于我们最小化 s,最优解 s* 将被“推”至 f(x)
  • 情况2:f(x) < 0。约束 s ≥ -f(x) 是起作用的,而 s ≥ f(x) 自动满足。最小化 s 会迫使 s* 等于 -f(x)

因此,在这两种情况下,最优解 s* 都等于 |f(x)|。关键在于优化器必须对 s 施加最小化的压力。

完整的优化问题表述

利用上述技巧,我们可以陈述计算桥梁最小重量设计的完整优化问题。这是一个线性问题,因为δ是固定的,梁的长度也是固定的。我们需要对所有梁求和,并通过添加额外的变量和约束来处理绝对值。

优化变量是梁力的两倍(因为引入了额外的 s 变量)。等式约束是节点数的两倍(每个节点的x和y方向平衡条件)。

设计空间与实例

让我们看一个例子。假设一座桥梁需要跨越80米。我们将设计空间定义为一个18x7的节点网格,并以规则方式用梁连接。桥梁在六个红色标记的悬臂点处与地面连接。中心蓝线是道路或铁轨所在,火车在此行驶。我们假设在中心线上的每个节点施加一个20吨(20,000千克乘以重力常数)的载荷,方向向下(y方向负向)。

问题是:在仍能承受此载荷的前提下,每根梁可以做到多轻?

通过计算优化(如今计算机可以快速求解线性问题),我们得到了最优结果。这个桥梁设计类似于现实中的许多桥梁,看起来是一个自然的解决方案。这座桥的重量为3000吨。此时,桥梁自身的重量已不可忽略,我们需要将其纳入优化中。在练习中,你将学习如何做到这一点,基本思路是将梁的重量均匀分配到其连接的节点上,作为额外的外部载荷。

等式约束的矩阵形式与稀疏性

一个相关的观察是等式约束的矩阵形式。我们可以将所有等式约束组合成一个大的矩阵方程 Ax - b = 0。矩阵 A 具有非常有趣的结构:它是高度稀疏的,即大多数元素为零。存在专门的方法来利用这种稀疏性,从而在计算速度上获得数量级的提升。在后续课程中,我们也将学习如何自己利用这一事实。


本节课中,我们一起学习了如何将机械桁架设计问题转化为一个可求解的优化问题。我们从桁架的基本概念和历史发展讲起,明确了优化目标和简化假设。核心在于建立力的平衡条件,并将其转化为数学约束。我们遇到了绝对值项带来的挑战,并学习了通过引入辅助变量和不等式约束将其转化为线性规划问题的技巧。最后,我们看到了一个具体的桥梁设计实例,并了解了等式约束的稀疏矩阵特性,这为高效求解大规模问题提供了可能。通过这个过程,我们看到了优化方法在解决实际工程问题中的强大应用。

020:股票市场投资 📈

在本节课中,我们将学习如何将投资组合选择问题构建为一个优化问题。我们将从理解股票价格变化的基本概率模型开始,逐步引入现代投资组合理论的核心思想,并最终学习如何通过优化方法在风险与回报之间找到最佳平衡。


概述与背景

上一节我们介绍了优化问题的一般形式。本节中,我们将来看一个具体的应用实例:股票市场投资。

股票价格随时间变化,看起来似乎是随机的。下图展示了几家科技公司过去几年的股价走势(已归一化)。我们关心的不是绝对价格,而是价格的变化。

观察每日股价变化的直方图,可以发现它类似于一个概率分布。这意味着我们可以用概率论的工具来分析和预测股价行为。然而,过去的表现并不能完美预测未来,尤其是在发生金融危机等重大事件时。

“有效市场假说”认为,所有已知信息都已反映在股价中,因此无法通过分析公开信息持续获利。但现实中,由于信息不对称、分析能力差异以及政府干预(如量化宽松)等因素,通过股票投资获利仍然是可能的。

我们面临的核心问题是:如何选择最优的投资组合?即,应该购买哪些股票,以及如何将这个问题表述为一个优化问题。


效用函数与风险厌恶

在深入讨论投资组合之前,我们需要理解一个关键概念:效用函数。我们并非完全理性的决策者,只关心期望收益。相反,我们对风险的承受能力会影响决策。

丹尼尔·伯努利曾用一个例子说明:一个穷人获得一张彩票,有50%概率赢得20000达克特,50%概率一无所获。这张彩票的期望价值是10000达克特。但如果有人出价9000达克特现金购买这张彩票,穷人应该卖掉它吗?伯努利认为应该卖掉,因为从身无分文到拥有9000达克特所带来的生活改善(效用),远大于从9000达克特增加到10000达克特(或20000达克特)的改善。这引出了边际效用递减的概念。

现代“前景理论”通过实验研究了人们的真实决策行为,发现效用函数通常呈S型曲线:

  • 盈利时:函数是凹的。赢得50欧元比赢得5欧元更开心,但开心程度并非10倍。
  • 亏损时:函数是凸的,且人们对损失的感受比同等盈利更强烈。

这意味着我们在投资决策中,必须将个人对风险的厌恶程度考虑进去。


现代投资组合理论

现代投资组合理论由哈里·马科维茨于20世纪50年代提出。其核心思想是:将股价变化建模为所有股票的联合概率分布,并将投资决策表述为一个在投资风险回报之间进行明确权衡的优化问题

为了应用该理论,我们首先需要回顾一些概率论的基本定义。


概率论基础定义

以下是理解后续内容所需的核心概念:

  • 随机变量: 用带下划线的字母表示,例如 R。它代表从一个潜在概率分布中抽取的样本。
  • 均值(期望值): 随机变量的平均结果。记为 μ_R
    • 公式μ = E[R]
  • 方差: 衡量随机变量围绕其均值波动的程度。
    • 公式σ²(R) = E[(R - μ_R)²]
  • 标准差: 方差的平方根,与原始随机变量具有相同的物理单位,更易于解释。
    • 公式σ(R) = sqrt(σ²(R))
  • 协方差: 衡量两个随机变量一起变动的趋势。
    • 公式σ²(A, B) = E[(A - μ_A)(B - μ_B)]
    • 注意:一个随机变量与自身的协方差就是其方差:σ²(A, A) = σ²(A)
  • 相关性: 标准化后的协方差,取值范围在-1到1之间,更易于理解。
    • 公式ρ(A, B) = σ²(A, B) / (σ(A) * σ(B))
    • ρ(A, A) = 1;若A与B独立,则 ρ(A, B) = 0

对于多元高斯(正态)分布,其整个分布完全由均值向量和协方差矩阵决定。如果我们有n个随机变量(例如n支股票),可以将其组合成向量 Y。其高斯分布定义为:

  • 均值向量μ (维度 n x 1)
  • 协方差矩阵Σ (维度 n x n),这是一个对称矩阵,对角线元素是各变量的方差,非对角线元素是变量间的协方差。

应用于股票数据

现在我们将这些概念应用于股票市场历史数据。

首先,对于每一支股票,我们需要从历史数据中估计其每日价格变化的平均回报(均值)风险(方差)。我们通常假设每日价格变化是独立同分布(IID)的样本,尽管这在实际时间序列中并不完全成立。

  • 估计均值: 使用K个历史样本(例如过去5年的每日数据)计算样本平均值。
    • 公式\bar{y} = (1/K) * Σ_{i=1}^{K} y_i
  • 估计方差: 使用样本方差作为无偏估计。
    • 公式s² = (1/(K-1)) * Σ_{i=1}^{K} (y_i - \bar{y})²
    • 分母使用 K-1 而非 K 是为了得到无偏估计(证明略)。

下图展示了从标普500指数中随机选取的100支股票的风险(年化标准差)与回报(年化期望收益)关系。每个点代表一支股票。

我们偏好位于左上角的股票(高回报、低风险)。但问题在于,我们如何组合多支股票来构建一个整体表现更优的投资组合?


投资组合的均值与方差

一个投资组合 w 是一个向量,w_i 表示投资于第i支股票的资金比例。它满足:

  • w_i ≥ 0 (暂不考虑做空)
  • Σ_{i=1}^{n} w_i = 1

设所有股票的联合分布均值为向量 μ,协方差矩阵为 Σ。那么,投资组合的总体表现也是一个随机变量,其均值和方差计算如下:

  • 投资组合的期望回报
    • 公式μ_p = w^T μ = Σ_{i=1}^{n} w_i μ_i
  • 投资组合的方差(风险)
    • 公式σ_p² = w^T Σ w = Σ_{i=1}^{n} Σ_{j=1}^{n} w_i w_j σ²(i, j)

这个方差公式至关重要。它表明,投资组合的风险不仅取决于各股票自身的风险(方差),还取决于股票之间的协方差。如果两支股票负相关,那么它们的价格变动趋势相反,组合起来可以降低整体风险。这就是分散化投资的力量。


马科维茨投资组合选择

基于以上分析,马科维茨提出了三种等价的优化问题表述形式,以找到最优投资组合 w

  1. 在最小收益约束下最小化风险

    • 目标min_w (w^T Σ w)
    • 约束w^T μ ≥ μ_min, Σ_i w_i = 1, w_i ≥ 0
    • 解读: 我要求投资组合的年化收益至少达到 μ_min,在此条件下,尽可能降低风险。
  2. 在最大风险约束下最大化收益

    • 目标max_w (w^T μ)
    • 约束w^T Σ w ≤ σ_max², Σ_i w_i = 1, w_i ≥ 0
    • 解读: 我能承受的最大风险(方差)为 σ_max²,在此条件下,尽可能提高收益。
  3. 明确的风险回报权衡

    • 目标max_w ( w^T μ - q * (w^T Σ w) )
    • 约束Σ_i w_i = 1, w_i ≥ 0
    • 解读: 参数 q ≥ 0 代表投资者的风险厌恶系数。q 越大,表示越厌恶风险,优化时会更倾向于降低方差。

这三个问题都是凸优化问题(假设 Σ 是正定矩阵),可以用我们之前学过的算法求解。通过改变参数(μ_min, σ_max²q),我们可以得到一系列最优投资组合,它们构成了所谓的有效前沿——即在给定风险水平下能提供最高回报,或在给定回报水平下具有最低风险的所有投资组合的集合。

在上图中,绿色的 “+” 点就位于有效前沿上。通过优化,我们可以找到比单一股票更优的风险回报组合。


总结与局限

本节课中,我们一起学习了如何将股票投资问题构建为优化问题。我们从股价的概率模型出发,引入了效用函数和风险厌恶的概念,并详细阐述了马科维茨的现代投资组合理论。该理论的核心是通过优化方法,利用股票间的协方差关系,在期望回报与风险之间寻找最佳平衡点,从而构建出位于“有效前沿”上的投资组合。

重要提示:现代投资组合理论是一个强大的基线模型,但它基于一些简化假设(如股价变化服从高斯分布、基于历史数据估计参数等)。现实中的专业交易员会使用更复杂的模型,考虑非高斯分布、做空、交易成本、多期策略以及融入对未来市场的前瞻性判断。

因此,学习本课内容并不能让你立即成为专业投资者,但它为你提供了一个坚实的理论基础和分析框架,使你能够更理性地思考投资决策,并理解分散化投资降低风险的数学原理。在运用任何模型进行真实投资前,都必须充分意识到其假设和局限性。

021:模型预测控制 🎯

在本节课中,我们将学习模型预测控制的基本概念。这是一种通过求解优化问题来控制物理系统(如机器人或化工设备)行为的方法。我们将从一个简单的倒立摆例子入手,理解如何将控制问题转化为优化问题,并实时求解以引导系统达到期望状态。


从空间与时间到控制问题

上一节我们讨论了股票市场投资这个关于“时间序列”的优化问题。现在,我们来看一个同时涉及“空间”和“时间”的优化应用:控制。这对于机器人学或任何需要控制物理系统的领域都至关重要,因为我们希望系统能按照非自然的方式运行。本节课的核心例子是我们在第一讲中提到的倒立摆


控制论简史 📜

现代控制理论起源于20世纪40年代的控制论。诺伯特·维纳是控制论之父,他在其著作《控制论:或关于在动物和机器中控制和通信的科学》中提出了这一概念。控制论研究的是能够接收、存储和处理信息,并利用这些信息进行控制的系统。早期的控制论融合了多个领域,包括技术科学、心理学和人类学。在美国发展的同时,德国也有一批学者独立地进行了类似研究。

有趣的是,早期人工智能的一些研究者也来自控制论社区。在著名的达特茅斯会议之后,人工智能逐渐成为一个独立的领域。20世纪40年代至50年代的梅西会议汇集了众多著名学者,如约翰·冯·诺依曼、诺伯特·维纳,以及神经网络发明者皮茨和麦卡洛克,还有信息论之父克劳德·香农。会议甚至引入了“反馈”这个词,如今已广泛应用于各个领域。


控制问题的高层概述

为了进行控制,我们首先需要对时间进行离散化处理,即设定固定的时间步长(例如100毫秒)。

一个系统(如化工厂、电机或倒立摆)的状态由一个向量 x(t) 描述。系统状态从一个时间步演化到下一个时间步,由一个状态更新函数 F 决定。这个函数不仅依赖于前一状态 x(t),还依赖于我们选择的控制输入 u(t)

我们通过一个观测器 H 来获取系统状态的部分或变换后的信息 y(t)。然后,一个控制策略 π 会根据观测值 y(t) 来决定施加何种控制输入 u(t)

整个过程可以总结为以下公式:

x(t+1) = F( x(t), u(t) )
y(t) = H( x(t) )
u(t) = π( y(t) )

通过精心设计观测器 H 和控制策略 π,我们可以改变系统的自然行为,使其按照我们的期望运行。


倒立摆示例 🤖

我们以倒立摆为例。它由一个质量为2千克的摆锤、一个质量为8千克的小车和一根0.5米长的杆组成。系统状态向量 x 包含四个分量:

  1. 摆杆角度(偏离垂直向上的角度)
  2. 小车位置(水平轴上的坐标)
  3. 摆杆角速度
  4. 小车速度

我们只能通过向小车施加电压(控制输入 u)来使其加速,从而间接影响摆杆的运动。系统的动力学由一组物理微分方程描述。在计算机科学中,我们可以使用仿真来模拟其行为,而无需搭建实体。


系统动力学的离散化与线性化

为了将控制问题转化为优化问题,我们需要能够预测未来多个时间步的系统状态。一个简单的方法是欧拉法,它假设在每个离散时间步内速度恒定。更精确一点的方法是韦莱特法,它利用当前时间步的加速度信息来改进预测。

为了简化优化问题的求解,我们通常会在每个时间步对系统动力学进行线性化。例如,当摆杆角度接近π(垂直向下)时,复杂的动力学方程会大大简化。这样,状态更新就可以写成矩阵与向量的乘法形式:

x(t+1) = A * x(t) + B * u(t)

其中,矩阵 AB 在每一步可能不同,取决于当前的线性化点。

通过堆叠多个时间步的状态更新方程,我们可以描述系统在未来一段时间内的演化,并将这些方程作为优化问题的等式约束


模型预测控制的核心 🧠

模型预测控制 的核心思想是:在每个控制周期,我们都在一个有限的预测时域内求解一个优化问题。

优化问题的目标是:在满足系统动力学(即状态更新等式约束)的前提下,最小化一个代价函数。这个代价函数通常权衡两方面:

  1. 系统状态代价:衡量系统状态与期望状态的差距。
  2. 控制代价:衡量所施加控制量(如能量消耗)的大小。

优化问题的数学描述如下:

minimize   Σ [ 状态代价(x(t)) + 控制代价(u(t)) ]
   u, x
subject to x(t+1) = A(t) * x(t) + B(t) * u(t),  for t = 0, ..., T-1
           x(0) = x0 (已知初始状态)

我们求解这个优化问题,得到未来一系列时间步的最优控制序列 {u(0), u(1), ..., u(T-1)}

然而,MPC只实施序列中的第一个控制动作 u(0)。然后,系统向前运行一个时间步,我们获取新的状态测量值,将预测时窗向前滑动,并基于新的初始状态重新求解整个优化问题。这种“滚动优化”的策略使MPC能够处理模型误差和外部干扰。


MPC的应用与展望

MPC自20世纪70年代被提出以来,已广泛应用于汽车、航空、化工等慢速或快速系统中。如今,它正与神经网络等现代方法结合,应用于自动驾驶等安全关键领域。MPC的强大之处在于它能以严谨的优化框架处理多变量、带约束的控制问题。

在课程提供的倒立摆仿真中,你可以看到MPC控制器如何成功地“摆起”并稳定倒立摆。在后续练习中,你将有机会亲自为其他系统设计MPC控制器。


总结

本节课我们一起学习了模型预测控制。我们从控制论的历史讲起,理解了控制问题的基本框架。然后,以倒立摆为例,详细阐述了如何将连续的系统动力学离散化线性化,从而构建一个可在每个时间步实时求解的优化问题。MPC通过滚动时域优化,结合预测与反馈,实现了对复杂系统的有效控制。这种方法融合了空间与时间的优化,是工程领域一项强大而实用的技术。

023:太空任务规划 🚀

在本节课中,我们将学习如何将优化方法应用于一个经典工程问题:太空任务规划。我们将模拟一个简化的场景,即从地球发射一枚火箭,使其飞掠火星,然后返回地球。通过这个过程,你将理解如何将复杂的物理系统建模为可优化的数学问题。


任务背景

上一节我们介绍了优化方法的基本概念,本节中我们来看看一个具体的应用:太空任务规划。

假设你读过或看过《火星救援》,其中一名宇航员被困火星。他能够进入火星轨道,但无法返回地球。因此,我们需要发射一枚火箭前往火星接他回家。为此,火箭需要飞掠火星,并尽可能接近火星表面而不撞击它。

为了简化问题,我们假设火箭必须降低成本,且不能在地球轨道外携带燃料。因此,火箭需要在地球轨道获得初始速度,然后进入弹道轨迹。此后,火箭将像炮弹一样运动,受到太阳系内不同行星引力的影响。我们只需设定其初始速度和方向,使其进入一条能前往火星并返回地球的弹道轨迹。同时,地球和火星也在运动,所有行星和太阳的引力都在起作用。核心问题是:应向哪个方向发射火箭,才能成功接回宇航员?

你的任务是设计这条轨迹。

历史背景与理论

在20世纪60年代,NASA的工程师们(其中许多是黑人女性,她们的贡献在电影上映时得到了认可)使用早期IBM计算机进行了类似的轨迹计算。她们使用的许多技术与我们将要使用的类似。如今,技术已大大进步,但本例中的简化方法仍然是现实且具有教育意义的。

要优化轨迹,首先需要描述行星的运动。这引出了N体问题:描述N个(N>2)通过引力相互作用的天体的运动。庞加莱已证明,该问题不存在封闭形式的解析解,只能进行数值近似。

描述天体运动的理论历经数百年发展:

  • 哥白尼首先提出地球并非宇宙中心。
  • 开普勒指出行星绕太阳的轨道是椭圆形的。
  • 笛卡尔认为只有接触的物体才能相互作用,并假设存在“以太”作为行星相互作用的介质。
  • 伽利略引入了所有物体都受引力加速的观点。
  • 牛顿最终用万有引力定律和微积分解决了这一问题。

建立数学模型

现在,我们来看牛顿的万有引力理论,以及如何数值求解N体问题。

首先,我们有一组天体(行星、太阳)以及我们关心的火箭。每个天体由其质量 m、位置向量 p 和速度向量 v 描述。在物理学中,速度是位置对时间的导数:v = ṗ

此外,我们还需要考虑加速度 a,它由引力产生。所有行星都会相互吸引,引力大小取决于它们之间的距离。距离通常用欧几里得范数(2-范数)||p_i - p_j|| 计算,不考虑相对论。

两个天体之间的引力由以下公式给出:
F_ij = G * (m_i * m_j) / ||p_i - p_j||^2
其中 G 是引力常数。结合牛顿第二定律 F = m * a,我们可以计算出一个天体受到的加速度。

为了简化讲解和绘图,本课程仅考虑二维近似。但无论是2D向量还是3D向量,方程和代码在形式上是完全相同的。

数值模拟行星运动

为了数值模拟行星的运动,我们像上一讲处理现代巡航控制一样,将时间域离散化。同样,我们使用欧拉方法在离散时间步长间进行前向模拟。

对于所有行星(或我们考虑的子集),我们知道它们的质量、到太阳的距离、速度以及初始位置。这样,我们就可以开始数值模拟太阳系中行星的运动了。

在Julia语言中,实现如下:

# 定义运动天体的结构体
struct MovingBody{T}
    position::Vector{T}
    velocity::Vector{T}
    mass::T
end

# 定义模拟函数
function simulate_trajectory(bodies::Vector{MovingBody{T}}, dt, steps) where T
    # ... 初始化位置和速度数组 ...
    for step in 1:steps
        # 1. 计算所有天体间的引力加速度
        accelerations = compute_accelerations(bodies)
        # 2. 使用欧拉法更新每个天体的位置和速度
        for i in 1:length(bodies)
            bodies[i].velocity += accelerations[i] * dt
            bodies[i].position += bodies[i].velocity * dt
        end
        # 记录状态...
    end
    return trajectories
end

我们定义了一个包含位置、速度和质量的结构体 MovingBody。注意,这里使用了泛型类型 T,通常可以是 Float64,但之后我们可以方便地替换为对偶数,以便进行自动微分。

模拟函数首先遍历所有行星计算加速度,填充一个大的加速度矩阵,然后使用欧拉算法更新每个行星的位置和速度。

定义优化目标(损失函数)

我们不仅想模拟行星运动,还想让火箭朝正确的方向发射。为此,我们需要一个损失函数来评估某个发射方向的好坏。

回顾目标:首先,火箭要飞掠火星;然后,返回地球。

我们将火箭添加到模拟的天体列表中。火箭的初始位置设在地球位置附近,并带有微小偏移。其初始速度为地球速度加上一个由参数 θ 控制的偏移速度 Δv。这个 θ(或 Δv)就是我们要优化的变量。

然后,我们进行前向模拟。在模拟循环的每一步,我们记录火箭到火星的距离和火箭到地球的距离。

模拟结束后,我们得到两个数组,分别记录了每个时间步下火箭到火星和地球的距离。接着:

  1. 找出火箭最接近火星的时间步。
  2. 考虑所有在飞掠火星之后的时间步,找出火箭返回时最接近地球的距离。

我们最小化的损失函数由两部分组成:

  • 火箭在全程中到火星的最小距离
  • 火箭在飞掠火星后到地球的最小距离

这个目标函数是合理的,因为只有当火箭精确到达火星并随后精确返回地球时,该损失函数的值才为零。

利用自动微分进行优化

现在,我们有了一个以向量 θ 为输入、返回损失值的目标函数

利用自动微分,我们可以简单地调用 gradient(trajectory_loss, θ) 来计算损失函数关于 θ 的梯度。这个梯度指明了 θ 应向哪个方向调整才能改进(降低)损失值。

使用前面幻灯片中的示例代码,这可以开箱即用,无需手动推导复杂的导数。

下图展示了不同 θ 值对应的损失函数曲面(由于我们假设了2D世界,θ 是二维向量,便于绘图)。可以看到,这是一个高度非凸的函数,甚至存在一些尖锐的峰。这些峰通常对应着火箭被某颗行星引力弹弓效应甩出太阳系的情况。

对于这种复杂的优化地形,我们可以:

  1. θ 的可能空间上使用规则网格进行密集搜索,但这在更高维空间中会非常昂贵。
  2. 更有效的方法是:首先在较粗的网格上选取一些初始点,然后利用我们可用的梯度信息,从这些初始点出发执行梯度下降。这样能快速改进解的质量,并且对初始网格的精细程度不那么敏感,因为梯度下降会引导我们走向初始点附近更好的解。

在练习中,你将实现这个过程,并看到火箭飞行和行星运动的动态图表。


总结

本节课中,我们一起学习了如何将机器学习中的优化方法应用于太空任务规划这一复杂工程问题。我们首先回顾了相关的天体力学历史和N体问题,然后建立了描述行星和火箭运动的数值模型。通过定义以飞掠距离为目标的损失函数,并将火箭的发射参数作为优化变量,我们成功地将问题转化为一个数学优化问题。最后,我们探讨了如何利用自动微分计算梯度,并使用梯度下降法在这个非凸的损失函数景观中寻找最优的发射方案。通过这个实例,你看到了优化技术解决实际跨学科问题的强大能力。

024:人工神经网络 🧠

在本节课中,我们将学习人工神经网络的历史、基本原理以及如何利用自动微分技术来训练它们。我们将从神经网络的生物学起源开始,逐步了解其数学模型的发展,并最终看到如何通过现代优化方法(如随机梯度下降)来高效地训练复杂的神经网络模型。

神经网络的历史起源

上一节我们介绍了自动微分在复杂优化问题中的应用。本节中,我们来看看人工神经网络这一重要领域是如何发展起来的。

神经网络的概念起源于自然界。对于科学界而言,最早描述神经元的是西班牙研究人员卡哈尔和戈尔季。他们发现,通过特定的染色技术,可以在显微镜下观察到神经组织和大脑中的神经元与突触。

一旦能够观察到一个现象,就可以描述它。他们是第一批能够描述神经元的人,这开启了一整个科学学科。

德国研究人员瓦尔德迈尔并未有新的发现,但他利用自己在科学界的声望,推广了卡哈尔和戈尔季的发现。他们两人在1906年共同获得了诺贝尔奖。卡哈尔关于神经元发现的诺贝尔奖演讲非常值得一读。

神经元并非独立存在,它们通过突触相互连接以传递信号。谢灵顿在19世纪末也描述了神经元放电的现象。然而,理解大脑如何学习花费了更长的时间。

我们一直知道大脑在学习。今天普遍使用的理论来自赫布,称为“赫布学习”。该理论认为“一起放电的神经元会连接在一起”。这意味着如果突触同时被激活,它们之间就有建立连接的倾向。如果突触被频繁使用,连接就会变得更加强大。赫布学习是解释人类和动物大脑如何工作和学习的生物学理论。

人工神经网络的早期模型

随着计算机的出现,人们开始尝试复制大脑的功能。人工神经网络在20世纪40年代由麦卡洛克和皮茨提出。

他们将每个神经元描述为一个数学函数,该函数根据接收的输入具有两种状态:0或1,即放电或不放电。

最初,他们考虑了兴奋性输入和抑制性输入。区别在于:如果任何抑制性输入是活跃的,神经元就会停止活动。对于兴奋性输入,它们需要达到一个特定的阈值(称为θ)。兴奋性输入的总和需要大于θ,神经元才会激活并再次放电。

对于麦卡洛克和皮茨而言,重要的是他们只考虑二进制信号。这里的输入X和Y是仅包含二进制输入的向量,所有值要么是0,要么是1。

大约15年后,人们发明了感知机。感知机以实数作为输入,然后构建输入的加权和(使用某个权重向量W)。同样,如果输入足够大(大于某个阈值),神经元就会激活。

这里的输入可以是实数。然而,神经元的输出是二进制的,存在一个跳跃,激活函数是离散的,输出要么是0,要么是1。

当时人们也对大脑如何与环境互动感兴趣,例如发送给肌肉的信号和从传感器接收的信号。有一篇著名的论文《青蛙的眼睛告诉青蛙的大脑什么》,麦卡洛克和皮茨也是该论文的核心作者。他们发现,青蛙的眼睛已经进行了大量的预处理,使其能够对飞过的苍蝇做出快速反应。他们发现,传输到大脑的并非原始信号,而是在眼睛之后直接发生了预处理。在当时,他们几乎被嘲笑,不得不逐个展示实验才被接受。

大约在同一时期,康奈尔大学研究感知机的人们已经构建了第一个感知机。他们使用光电二极管作为输入,接收20x20的图像(即400个像素输入)。如果你放大这张图片,会看到很多电缆,当时的一切几乎都是模拟的。他们使用电位计来改变权重等。在20世纪50年代,他们已经开始基于神经网络(当时称为感知机)进行物体检测。

研究的停滞与复兴

1969年,明斯基和佩珀特出版了一本书,展示了感知机的一些问题,一切研究都停滞了。

例如,感知机无法解决一些非常简单的基准问题,如异或问题。当时他们只研究单层感知机(没有隐藏层),而今天我们有深度神经网络。他们证明了这些单层感知机非常弱,无法解决一些基准问题。他们甚至对多层感知机持悲观态度。今天我们知道深度神经网络效果很好,但在当时,他们对多层感知机持悲观态度。

这基本上使神经网络的研究停滞了好几年。当时科学界也存在争论,明斯基和佩珀特属于希望进行符号人工智能研究的一派,即操作世界的符号表示,而不是亚符号的数值表示。当时他们占了上风,他们的书取得了巨大成功,人们随后摒弃了神经网络的想法,资金主要流向了符号社区的专家系统和逻辑推理系统。

反向传播算法与神经网络的现代化

然而,从那时起我们学到了很多,并且实现了从赫布学习(自然界的方式)到反向传播的跨越。

对于感知机,最大的挑战始终是如何训练它们。我们将在后面的讲座中看到感知机是如何训练的,但理解上的一个巨大飞跃发生在20世纪80年代,当时反向传播算法被广泛传播。人们之前就知道它,但直到80年代才被广泛传播。

反向传播算法的核心思想是将先前感知机神经网络中的阶跃函数替换为连续函数。

对于感知机,输出是0或1,因此这里有一个阶跃函数。显然,阶跃函数是不可微的。一个突破性的想法是使用Sigmoid函数来代替阶跃函数。

这里定义的Sigmoid函数是一个可微函数。通过缩放Sigmoid函数,我们可以使其看起来非常接近阶跃函数,但它仍然是可微的。这与对数障碍法的思想类似,我们也可以缩放对数障碍,使其越来越接近指示函数。这里我们是在近似阶跃函数,从0跳到1。通过缩放,我们可以定义逼近阶跃函数的程度。

有了Sigmoid激活函数,我们可以得到可微的神经元,然后将神经元耦合起来形成一个更大的神经网络。

这里我们看到一个神经网络,有绿色的输入层,蓝色的隐藏层(“隐藏”意味着它不直接与输入或输出连接),以及一个输出层。显然,我们还可以有更多的隐藏层。

我们假设网络是全连接的,这意味着层之间的所有节点都相互连接,并且有一个权重因子来描述这里的连接。

这可以通过矩阵乘法来描述。如果我想从绿色输入计算隐藏层接收到的信号,我只需要将输入向量X乘以一个大矩阵W,该矩阵代表了全连接层中的所有连接。除此之外,我们还在上面加上一些偏置。你可以将其视为神经元的默认状态,或者神经元最终激活需要多少“说服”。

因此,第一个隐藏层的输出就是输入乘以我们的大矩阵再加上向量,然后将整个结果送入Sigmoid函数。这里的粗体Sigmoid函数表示对每个元素应用Sigmoid,因此这里也会返回一个相同维度的向量。

然后,我们可以对第二层重复这个过程,再次乘以代表全连接的大矩阵,然后再加上另一个向量。这里的B2将只是一个单元素向量。

这就是全部原理。这些就是神经网络。还有不同的激活函数,不仅仅是Sigmoid,也可以使用其他函数。但基本上,神经网络是一个大型数学函数,它将输入(可能是高维的)映射到输出(输出也可能是多维的)。例如,在分类问题中,如果我想要不同类别的概率,那么我可以有多个输出神经元,每个输出神经元代表检测到某个类别的概率。

神经网络的训练与损失函数

现在我们有了一个大型数学函数,我们想用它进行回归或分类。为了训练,我们还需要一个损失函数。

这里的符号与第一和第二讲中的符号完全相同。我们有一个模型,该模型依赖于参数向量θ。在我们的例子中,参数向量包含定义神经网络突触的所有矩阵和向量。这个模型参数向量可能非常大,根据我们考虑的矩阵维度,其中可能有数百万个参数。

我们有一个仅依赖于这个参数向量的模型。现在我们迭代数据,并计算数据集中每个元素产生的损失,这就是损失函数。为了优化模型参数,我们希望对损失函数关于模型参数的梯度进行梯度下降步骤。

这里我们有损失函数,我们计算损失函数关于模型参数的导数,得到一个非常高维的梯度,然后我们沿着这个非常高维梯度的负方向前进一步。

在神经网络中,你可能听说过著名的反向传播算法。反向传播算法实际上归结为就是自动微分。

我们今天所做的就是,当遇到神经网络时,或者在TensorFlow中拥有神经网络的图表示时,我们将使用反向模式自动微分来获得关于模型参数的梯度。然后我们反复进行梯度下降步骤,随着时间的推移改进模型参数,以获得训练良好的模型,使其能够执行我们要求的分类任务。

长话短说,从20世纪40年代到今天,我们有很多历史,将近80年。今天我们可以将其归结为一些非常简单的东西,实际上可以放在一张幻灯片上,我们稍后会看到。

随机梯度下降与优化技巧

但我们需要更多的技巧,其中最重要的一个叫做随机梯度下降。

对于火箭轨迹的优化,我们可以进行网格搜索,然后通过额外的梯度下降来改进网格搜索的解决方案。

对于神经网络,这将复杂得多。因为当我们有数百万个参数,并且处于一个百万维空间时,我们完全无法进行网格搜索。我们正在优化一个非常非凸的函数,这会带来问题。在如此高度非凸的函数中,我们很快就会陷入一个不太好的解。

我们将进行梯度下降步骤,最终陷入局部最小值或梯度为零的鞍点。多年来,人们尝试过并陷入局部最小值,无法取得很好的效果。

这里我们看到最近一篇出版物中典型神经网络损失函数的图。这是投影到3D空间以便绘制,但即使在3D空间中,你也能看到它是高度非凸的,有许多峰和谷,并且有一个非常尖锐的最小值。如果我们从一个稍微不同的随机初始点开始,可能会错过这个尖锐的最小值,因此我们需要应用很多技巧来找到它。

二阶方法也不是很有帮助。因为牛顿法寻找驻点,它喜欢接近驻点,但我们想逃离鞍点。我们想找到最小值,而我们有许多不感兴趣的鞍点。此外,牛顿法要求我们计算海森矩阵,当我们有百万个模型参数时,海森矩阵将有一百万乘以一百万个条目,使用二阶方法在计算上不可行或不经济。

但有改进的方法,可以找到更好的解决方案,同时避免过拟合。神经网络中的过拟合是一个大问题,因为如果我们的模型中有数百万个参数,在某些情况下,我们可能只是死记硬背训练数据。然后,就像一个鹦鹉学舌重复句子而不理解一样,神经网络可能只是在训练数据上重复一个学到的答案,而没有真正泛化。因此,过拟合也是神经网络中的一个问题,但有些技术同时帮助我们找到更好的解决方案(获得更低的损失)并避免过拟合。

最重要的一个技术叫做随机梯度下降。

在随机梯度下降中,我们在训练步骤的迭代之间随机改变损失函数。我们多次重复训练,每次考虑一个稍微不同的损失函数,通过依赖训练数据的不同子集来实现,这些子集称为小批量。

SGD算法在右侧列出。它接收神经网络(或一般形式的模型)、训练数据、一些初始模型参数化、学习率η、批量大小B以及我们想要使用的训练迭代次数K作为输入。

然后,在每次迭代中,我们从训练数据中随机选择一个大小为B的子集,并用它来计算梯度。显然,梯度取决于我使用的训练数据,每次我选择不同的元素集合,因此在我的梯度上得到扰动或随机变化。但在期望上,我仍然会得到正确的损失函数。

这帮助我跳出局部最小值,绕过鞍点。我就像在这个损失函数中蜿蜒前进,越来越接近一个好的解。

这就是随机梯度下降。此外还有其他技巧,例如,即使没有海森矩阵,我也可以改进简单的梯度下降,可以考虑一种叫做“动量”的方法。这里我们也遇到了涅斯捷罗夫,这位著名的学者改进了内点法中的障碍方法。事实证明,同样的涅斯捷罗夫对于神经网络也极具影响力和重要性,通过他的梯度下降动量或结合梯度下降的思想。

最后但同样重要的是“丢弃法”,通过随机禁用一些神经元,我也可以从一个训练迭代到下一个改变拓扑结构或损失函数,这也有助于我收敛和避免过拟合。

神经网络的应用与实现

解释了很多,但我们能用这个做什么呢?我们可以近似连续的数学函数,也可以做更有趣的事情,例如检测图像上的手写字符。这是Yann LeCun在80年代还在美国AT&T工作时进行的一项著名应用。他们提出了卷积神经网络的想法。我们今天不深入细节。但这减少了处理图像数据时所需的模型参数数量。今天,Yann LeCun创建的MNIST数据集基本上已经解决了。以今天的计算机,解决MNIST任务没有太大困难。

一个完整的光学字符识别引擎需要更多的工作,因为我首先需要知道字符在哪里,然后才能分类,首先必须围绕每个字符绘制边界。但使用神经网络识别字符,就像是这样一个光学字符识别引擎内部5%的工作。有不同的方法可以不使用神经网络,但这种方法被证明非常成功。实际上,在练习中,我们打算仅使用自动微分技术从头开始构建一个MNIST求解器。

首先,让我们看看如何将神经网络与自动微分结合使用。首先我们定义一些需要的额外函数,这里是Sigmoid函数和Softmax函数。Softmax函数对于用神经网络训练分类器很重要,我们将在练习中看到更多细节,因为这里已经讲得够长了。

然后我们有一个神经网络。这里可能50行代码。这就是可以用来分类MNIST字符的整个神经网络。

这里的输入是我们的参数向量θ(包含神经网络的所有参数)以及图像。这个图像是一个20x28的矩阵,但我们将其重塑为一个向量。θ向量也被重塑。首先,我们从θ中提取第一个矩阵W1(根据公式)以及向量B1,然后我们可以定义第一层的数学函数。我们对第二层和第三层也这样做,然后将它们一个接一个地组合起来。在这大约50行代码中,我定义了一个神经网络。这是一个相当简单的全连接神经网络,但这是一个功能完整的神经网络,实际上足以在一定程度上解决MNIST分类任务。

现在很酷的是,我可以直接使用自动微分来获得我的神经网络和损失函数关于模型参数的梯度,用于随机梯度下降训练,以改进参数。你在这张幻灯片上看到的,包括加载MNIST数据,足以解决MNIST问题。这向你展示了自动微分的一些威力,它简化了很多工作,并且允许我们对整个算法进行微分。

如果我有一个非常复杂的模拟,可能无法在数学上定义导数,但有了自动微分,我甚至不需要更改代码,我可以直接使用对偶数来获得梯度。

总结

本节课中我们一起学习了以下内容:

  • 我们看到了自动微分,以及如何在不进行数学推导的情况下获得导数,以及如何通过运算符重载来实现它。我们在Julia语言中看到了这一点,它在C++中同样有效,Python中也有提供此功能的包。
  • 然而,使用对偶数时,如果我们要微分的算法中有复杂的控制流,我们必须小心,因为在条件分支中可能存在实际上没有导数的情况,但根据我们在控制流中采取的实际路径,对偶数无论如何都会给出一个导数。
  • 然后,我们使用自动微分来优化两个高度非凸函数的例子,并且不得不引入额外的技巧来获得好的解。
    • 对于往返火星的空间任务规划,我们必须进行领域网格扫描,然后基于这些初始起点进行梯度下降。
    • 对于神经网络的另一个想法是使用随机梯度下降,即随机扰动我们的目标函数(损失函数),以绕过鞍点和逃离局部最小值。
  • 我们看到,反向传播或神经网络的训练算法实际上只是反向模式自动微分的应用。

希望你能相信,如果你未来从事机器学习工作,或者留在工程领域,这将为你的工具箱增加一些非常有用的东西,因为它消除了对数学导数的需求,而我们常常要么没有它们,要么有点懒惰。现在我们可以推导任何算法,只需要对边缘情况稍微小心一点。

本节课到此结束,下周第七讲我们将学习向量空间,到时见。

025:向量空间 🧮

在本节课中,我们将学习向量空间的基本概念。向量空间是线性代数和许多机器学习优化方法的基础。我们将从定义开始,逐步探讨其性质,并通过实例加深理解。

向量空间的定义

上一节我们介绍了课程背景,本节中我们来看看向量空间的具体定义。向量空间是一个包含元素的集合,并定义了加法和标量乘法运算,且这些运算满足一系列公理。

以下是构成向量空间必须满足的公理:

  • 交换律:对于集合中的任意元素 xy,有 x + y = y + x
  • 结合律:对于加法和标量乘法,结合律均成立。即 (x + y) + z = x + (y + z),且 α(βx) = (αβ)x
  • 分配律:标量乘法对向量加法可分配,即 α(x + y) = αx + αy;标量加法对向量乘法也可分配,即 (α + β)x = αx + βx
  • 零向量存在:存在一个特殊的零向量 0,使得对于任意向量 x,有 x + 0 = x
  • 单位标量乘法:对于任意向量 x,有 1 * x = x
  • 标量零乘法:对于任意向量 x,有 0 * x = 0(这里的 0 是标量零,结果是零向量)。

这些公理是抽象的,不依赖于向量是否为几何对象。集合中的元素可以是数字、函数或其他数学对象。

向量空间示例与辨析

理解了定义后,我们通过几个例子来辨析哪些集合构成向量空间。

  • 示例一:全体实数向量:集合 X = ℝⁿ(所有n维实向量)是一个向量空间。我们可以验证它满足所有公理。
  • 示例二:三维空间中的平面:集合 M = { (x, y, 0) | x, y ∈ ℝ }(即三维空间中z坐标为0的平面)是一个向量空间。它满足所有公理。
  • 示例三:平移平面:集合 X = { m + p | m ∈ M },其中 M 是上一个例子中的平面,p 是一个固定的非零向量。这个集合 X 不是一个向量空间,因为它不包含零向量。
  • 示例四:锥集:对于集合 M ⊆ ℝⁿ,定义 X = { αm | α ≥ 0, m ∈ M }。这样的 X 称为锥集。锥集通常不是向量空间,因为如果取 α = -1,元素 -m 可能不在 X 中,违反了向量空间对标量乘法的封闭性。

函数构成的向量空间

向量空间的概念可以扩展到函数。考虑由正弦和余弦函数线性组合构成的所有函数集合:

X = { f: ℝ → ℝ | f(t) = a sin(t) + b cos(t), 其中 a, b ∈ ℝ }

在这个空间中,向量的“加法”定义为函数的逐点相加 (f+g)(t) = f(t) + g(t),“标量乘法”定义为函数的逐点缩放 (αf)(t) = α * f(t)。零向量是恒为零的函数 f(t) = 0。可以验证,该集合满足所有向量空间公理,因此 X 是一个向量空间。

线性代数概念的推广

对于一般的向量空间,线性代数中的许多核心概念依然适用。

  • 线性组合:向量 v 是向量 v₁, v₂, ..., vₖ 的一个线性组合,如果存在标量 α₁, α₂, ..., αₖ,使得 v = α₁v₁ + α₂v₂ + ... + αₖvₖ
  • 线性无关:一组向量是线性无关的,如果其中任何一个向量都不能表示为其他向量的线性组合。
  • 基与维数:向量空间的一组基是一组线性无关的向量,并且空间中的任何向量都可以表示为这组基的线性组合。基中向量的个数称为空间的维数。

例如,在上述函数空间 X 中,函数 f₁(t) = sin(t)f₂(t) = cos(t) 就是一组基。因为任何 f(t) = a sin(t) + b cos(t) 都可以由它们线性表出,且 sin(t)cos(t) 是线性无关的。因此,空间 X 的维数是 2

需要注意的是,也存在无限维的向量空间,例如所有连续函数构成的空间。

总结

本节课中我们一起学习了向量空间的核心概念。我们首先给出了向量空间的抽象定义及其必须满足的公理。然后,我们通过几何向量、平移平面、锥集以及函数空间等多个例子,辨析了向量空间的条件。最后,我们了解到线性组合、线性无关、基和维数等线性代数概念可以自然地推广到一般的向量空间,这为后续学习更复杂的空间(如巴拿赫空间、希尔伯特空间)奠定了基础。理解向量空间是掌握许多机器学习优化算法中数学工具的关键第一步。

026:范数与巴拿赫空间 🧮

在本节课中,我们将学习向量空间中的一个核心概念——范数,并由此引出更完整的数学结构——巴拿赫空间。我们将了解如何定义向量间的“距离”,以及这种结构如何为优化算法的收敛性提供理论基础。

范数:定义与性质

上一节我们介绍了向量空间的基本概念。本节中,我们来看看如何为向量空间引入“长度”或“距离”的概念,这通过定义范数来实现。

一个赋范向量空间本质上是一个向量空间,并额外配备了一个实值函数,该函数将每个向量映射到一个实数,我们称之为范数。范数必须满足以下三条公理:

  1. 非负性:对于任意向量 x,其范数 |x| ≥ 0,且 |x| = 0 当且仅当 x 是零向量。
  2. 三角不等式:对于任意向量 xy,有 |x + y| ≤ |x| + |y|
  3. 齐次性:对于任意标量 α 和向量 x,有 |αx| = |α| |x|

一旦定义了范数,它自然导出一个距离函数。对于两个向量 xy,它们之间的距离可以定义为 d(x, y) = |x - y|。这个距离函数同样满足非负性、对称性和三角不等式。

常见的范数示例

以下是几种在 R^m 空间中常见的范数,它们都属于 p-范数 家族:

  • 曼哈顿范数 (p=1):向量的各分量绝对值之和。\|x\|_1 = |x_1| + |x_2| + ... + |x_m|
  • 欧几里得范数 (p=2):我们熟悉的向量长度。\|x\|_2 = sqrt(x_1^2 + x_2^2 + ... + x_m^2)
  • 最大值范数 (p→∞):向量分量中绝对值的最大值。\|x\|_∞ = max(|x_1|, |x_2|, ..., |x_m|)

不同p值对应的“单位圆”(即所有满足 |x|_p = 1 的点构成的集合)形状各异。例如,p=2时是标准的圆形,p=1时是菱形,p→∞时是正方形。这说明了范数的选择是一种设计决策,但后续在赋范空间中发展的理论结果通常独立于具体的范数选择。

序列收敛与柯西序列

有了距离的概念,我们就可以严格定义序列的收敛。设 {x_n} 是赋范空间 X 中的一个序列。我们说该序列收敛于极限 y,如果当 n 趋于无穷时,距离 |x_n - y| 趋于 0。更精确地说,对于任意小的正数 ε,总存在一个索引 N,使得对于所有 n > N,都有 |x_n - y| < ε

与收敛紧密相关的另一个概念是柯西序列。一个序列 {x_n} 被称为柯西序列,如果对于任意小的正数 ε,总存在一个索引 N,使得对于所有 m, n > N,都有 |x_m - x_n| < ε。直观上,这意味着序列中的项彼此之间越来越接近。在赋范空间中,每个收敛序列必然是柯西序列。

完备性与巴拿赫空间

并非所有柯西序列都收敛。如果一个赋范空间 X 中的每一个柯西序列,其极限点也都在 X 内,那么我们称这个空间是完备的。一个完备的赋范向量空间就称为巴拿赫空间

让我们看一个不完备空间的例子:考虑定义在区间 [0,1] 上的连续函数空间 C[0,1],并赋予最大范数 |f| = max_{t in [0,1]} |f(t)|。我们可以构造一个连续函数序列 {f_n},它们逐渐逼近一个阶梯函数。这个序列是一个柯西序列,但其极限(阶梯函数)不是连续函数,因此不在原空间 C[0,1] 中。所以,C[0,1] 在这个范数下不是巴拿赫空间。

为什么完备性重要?压缩映射原理

完备性(即成为巴拿赫空间)是许多优化算法收敛性证明的关键前提。一个核心工具是巴拿赫不动点定理(或称压缩映射原理)。

设 S 是巴拿赫空间 X 的一个子集,映射 F: S → S 是一个压缩映射,即存在常数 α ∈ [0, 1),使得对于所有 x, y ∈ S,有:
\|F(x) - F(y)\| ≤ α \|x - y\|

该定理指出:如果 F 是一个压缩映射,那么它在 S 内存在唯一的不动点 x(即满足 F(x) = x* 的点)。并且,从任意起点 x_0 ∈ S 开始,通过迭代公式 x_{k+1} = F(x_k) 生成的序列都将收敛到这个不动点 x*。

在优化算法的语境下(如梯度下降法),我们可以将迭代更新步骤视为一个映射 F。证明该算法收敛到最优解,常常需要证明在最优解附近,这个映射 F 满足压缩映射的条件,并且解空间具有完备性。幸运的是,我们通常处理的有限维空间 R^m 在任何范数下都是完备的(即巴拿赫空间),因此我们无需额外证明这一点,可以直接应用相关理论。

总结

本节课中我们一起学习了:

  1. 范数的定义及其三条公理,它为我们提供了衡量向量“长度”和“距离”的工具。
  2. 常见的p-范数家族,包括曼哈顿范数、欧几里得范数和最大值范数。
  3. 序列收敛柯西序列的严格数学定义。
  4. 完备性的概念以及巴拿赫空间(完备的赋范空间)的定义。
  5. 完备性的重要性,特别是通过巴拿赫不动点定理(压缩映射原理),它为迭代优化算法(如梯度下降)的收敛性提供了理论基础。对于有限维空间,完备性是自动满足的。

028:投影应用

在本节课中,我们将学习如何利用最小范数投影来解决一系列实际问题。我们将看到,投影的概念不仅适用于几何向量空间,还能应用于函数空间和优化问题,为解决复杂挑战提供了强大的工具。

从特征脸到罪犯识别

上一节我们介绍了如何计算最小距离和投影。现在,我们来看看第一个应用实例:特征脸。

特征脸是一种历史悠久的计算机视觉技术,用于人脸识别。其核心思想是将人脸图像投影到一个由“特征脸”张成的低维子空间上,从而用少量系数描述一张人脸。

以下是其工作原理:

  1. 首先,从大量人脸图像中计算出一张“平均脸”。
  2. 通过特征分解等方法,得到一组“特征脸”(E1, E2, ...),它们构成了一个正交基。
  3. 对于任何新人脸图像,先减去平均脸,然后将其投影到特征脸张成的子空间上。
  4. 投影得到的系数向量(例如100维)就是该人脸的紧凑描述符。

通过比较数据库中所有人脸描述符与新输入人脸的描述符(例如使用最近邻查找),可以快速判断该人是否已在数据库中存在。尽管如今有更先进的方法,但特征脸清晰地展示了如何在高维向量空间(如图像像素空间)中利用投影进行高效计算。

用多项式逼近正弦函数

现在,让我们切换视角,看一个通过设计内积来解决优化问题的例子:用多项式函数逼近正弦函数。

计算机直接计算正弦函数可能耗时且不精确。我们的目标是找到一个多项式,使其在某种度量下尽可能接近正弦函数。我们定义函数空间 H 为区间 [0, 1] 上所有满足 ∫₀¹ f(t)² dt < ∞ 的连续函数。在该空间上定义内积为:
<f, g> = ∫₀¹ f(t)g(t) dt
对应的范数为 ||f|| = sqrt(<f, f>)

正弦函数 g(t) = sin(πt)H 的一个元素。同时,所有最高 n 次的多项式构成了 H 的一个子空间 P_n。我们的问题转化为:在子空间 P_n 中,找到在给定范数下最接近 g(t) 的多项式 f_n。这本质上就是函数 g 到子空间 **P_n` 的投影。

通过选择多项式基(如 1, t, t², ...),利用格拉姆-施密特正交化获得正交基,再求解法方程,即可得到最佳逼近多项式的系数。有趣的是,许多计算机数学库中的 sin 函数内部正是通过类似方法计算的多项式来逼近的。

带等式约束的二次优化

接下来,我们看一个更接近传统优化问题的例子,并展示如何用投影得到闭式解。

考虑以下优化问题:
最小化 xᵀQx
约束条件为 Ax = b
其中 Q 是一个正定矩阵。

首先,等式约束 Ax = b 定义了一个线性簇 V。其次,目标函数 xᵀQx 定义了一个内积 <x, y>_Q = xᵀQy 及其对应的范数 ||x||_Q = sqrt(xᵀQx)

于是,原优化问题可以重新表述为:在线性簇 V 中,找到在 ||·||_Q 范数下最接近零向量的点 x*

求解步骤如下:

  1. 找到任意一个满足 Ax = b 的点 v
  2. 找到矩阵 A 的零空间 N(A),它张成的子空间 H 是线性簇 **V` 平移过原点的版本。
  3. 在由内积 <·,·>_Q 定义的 H 空间中,计算向量 vH 的投影 h
  4. 最优解为 x* = v - h

这种方法为这类特殊的二次规划问题提供了闭式解,无需使用梯度下降等迭代方法。一个经典应用是“门海”芯片的布局设计,即在满足输入/输出端口位置约束下,最小化晶体管间连线的总长度(或能量),这正好符合上述问题形式。

共轭梯度法

最后,我们简要介绍共轭梯度法,它是一种利用正交性来加速优化的迭代算法。

在标准梯度下降中,搜索方向(负梯度)可能产生“之”字形路径。共轭梯度法在每一步对梯度进行修正,使其与之前所有搜索方向关于 Q 内积正交(共轭)。这样,在 n 维空间中,对于二次优化问题,最多只需 n 步即可收敛到精确解。

虽然牛顿法一步即可解决二次问题,但需要计算并求逆海森矩阵。共轭梯度法避免了这一开销,并且对于非二次问题也常常表现良好。其核心思想正是利用了在由问题结构定义的内积空间中的正交性。

总结

本节课我们一起学习了向量空间、范数、巴拿赫空间和希尔伯特空间的核心概念。重点掌握了如何利用内积定义的正交性,通过格拉姆-施密特算法和法方程来计算最小范数投影。

我们看到了投影的多种应用:

  • 在图像空间中进行人脸识别(特征脸)。
  • 在函数空间中用多项式逼近复杂函数(逼近正弦函数)。
  • 求解带等式约束的二次优化问题,并获得闭式解。
  • 构建更高效的优化算法(共轭梯度法)。

这些例子表明,投影是一个基础而强大的工具,能够将高维问题简化、将复杂函数近似,并为特定优化问题提供优雅的解决方案。

029:拉格朗日对偶性 🧩

在本节课中,我们将要学习优化理论中的一个核心概念——对偶性。我们将从拉格朗日对偶性入手,探讨其对偶问题、强弱对偶性,并通过实例理解其对优化问题的帮助。

课程概述

对偶性通常用于描述一个具有两种等价表示形式的对象,并且可以在两种表示之间转换而不丢失关键信息。在优化领域,计算一个优化问题的对偶问题,可以得到原问题解的一个下界,这有助于我们评估解的质量、实现提前终止,甚至通过暴露额外的结构实现降维和加速收敛。

上一节我们介绍了优化问题的基本形式,本节中我们来看看如何利用对偶性来分析和求解这些问题。

拉格朗日对偶性

拉格朗日对偶性是优化中一种特定的对偶性。为了深入理解,我们将从博弈论的角度来构建这个概念,这能提供一些独特的见解。

博弈论由约翰·冯·诺依曼创立。他关于极小极大定理曾言:“就我所见,没有这个定理就不可能有博弈论。我认为在极小极大定理被证明之前,没有什么值得发表的。” 这一定理在优化中也至关重要。

让我们从第一个等式开始,即极小极大不等式
对于函数 ψ: X × Y → ℝ,有:
sup_{y∈Y} inf_{x∈X} ψ(x, y) ≤ inf_{x∈X} sup_{y∈Y} ψ(x, y)

这里,上确界 sup 和下确界 inf 分别是最大值 max 和最小值 min 算子的推广,关键区别在于 infsup 可以包含趋于极限的值。这个不等式总是成立。

然而,冯·诺依曼发现,如果集合 X 和 Y 是紧致(闭且有界)且的,并且函数 ψ 关于 x 是凸的、关于 y 是凹的,那么上述不等式变为等式,即极小极大定理成立。此时我们可以使用 maxmin

这可以理解为一个两人零和博弈。玩家 X 希望最小化 ψ,玩家 Y 希望最大化 ψ。不等式左边相当于玩家 Y 先行动,右边相当于玩家 X 先行动。定理表明,在所述条件下,行动顺序不影响最终结果,即存在一个鞍点

从博弈到优化

现在,我们将视角转回优化。考虑一个带等式约束的优化问题:
inf_{x∈ℝ^n} f(x) subject to c(x) = 0

我们可以定义一个示性函数 I_X(x),当 x 在可行集 X 内时为 0,否则为 +∞。这样,原约束问题可以等价写为无约束问题:inf_{x∈ℝ^n} f(x) + I_X(x)

一个关键的洞见是,我们可以用另一个表达式替换这个示性函数:
I_X(x) = sup_{y} y^T c(x)
因为如果 c(x) ≠ 0,通过选择 y 可以使上确界趋于 +∞;如果 c(x) = 0,则该项为 0。因此,原优化问题等价于:
inf_{x∈ℝ^n} sup_{y} [ f(x) + y^T c(x) ]

当约束为线性 Ax - b = 0 时,这个形式就变成了我们熟悉的拉格朗日函数 L(x, λ) = f(x) + λ^T (Ax - b)。寻找原问题的最优解等价于寻找该拉格朗日函数的鞍点。

对偶问题与强弱对偶

基于极小极大不等式,我们可以交换 infsup 的顺序,从而定义拉格朗日对偶问题
sup_{λ} inf_{x} L(x, λ) = sup_{λ} q(λ)
其中 q(λ) 称为对偶函数。λ 被称为对偶变量或拉格朗日乘子。

根据极小极大不等式,对于任意 x 和 λ,有:
q(λ) ≤ f(x)
这意味着对偶函数的值总是原问题目标值的一个下界。这被称为弱对偶性。原问题最优值 p* 与对偶问题最优值 d* 之间的差 p* - d* 称为对偶间隙

如果对偶间隙为零,即 p* = d*,则称强对偶性成立。强对偶成立时,我们可以通过对偶问题来求解原问题。

那么,何时强对偶成立呢?斯莱特条件给出了一个充分条件:如果原问题是凸问题(即 f(x) 凸,可行域 X 凸),并且存在一个严格可行的内点(即存在 x 使得所有约束在不等式情况下严格成立),则强对偶成立。

应用实例

以下是两个应用对偶性的例子:

例1:二次规划(强对偶)
考虑问题:min_x (1/2) x^T x subject to Ax = b
其拉格朗日函数为 L(x, λ) = (1/2) x^T x + λ^T (Ax - b)

  1. 首先求解对偶函数 q(λ) = inf_x L(x, λ)。通过令梯度 ∇_x L = 0,得到 x* = -A^T λ
  2. 代入 q(λ),得到 q(λ) = -(1/2) λ^T A A^T λ - b^T λ。这是一个关于 λ 的凹函数。
  3. 求解对偶问题 max_λ q(λ),再次令梯度为零,得到 λ* = -(A A^T)^{-1} b
  4. 由于问题是凸的且满足斯莱特条件,强对偶成立。将 λ* 代回 x* 的表达式,即可得到原问题的最优解 x* = A^T (A A^T)^{-1} b。对偶性帮助我们得到了闭式解。

例2:二元二次规划(弱对偶)
考虑问题:min_x x^T Q x subject to x_i^2 = 1, for all i,其中 Q 正定。
约束 x_i = ±1 使得可行域是一个离散的超立方体顶点集,有 2^n 个点。这不是一个凸集。

  1. 写出拉格朗日函数:L(x, λ) = x^T Q x + Σ_i λ_i (x_i^2 - 1)
  2. 可以重写为 L(x, λ) = x^T (Q + diag(λ)) x - 1^T λ
  3. 对偶函数 q(λ) = inf_x L(x, λ)。为了 q(λ) 不趋于负无穷,需要矩阵 V = Q + diag(λ) 保持正定。
  4. 一种常见的选择是令 λ = -λ_min(Q) * 1,其中 λ_min(Q) 是 Q 的最小特征值。这样可以保证 V 正定。
  5. 此时,q(λ) = n * λ_min(Q)。这给出了原问题最优值的一个下界。虽然只有弱对偶,但这个下界对于指导启发式算法(如搜索离散解)和判断终止条件非常有价值。

总结

本节课中我们一起学习了拉格朗日对偶性的核心内容。我们从博弈论的极小极大定理出发,推导出拉格朗日函数及其对偶问题。我们理解了弱对偶性总是成立,而对偶间隙提供了原问题解的下界。在满足凸性和斯莱特条件时,强对偶性成立,使得我们可以通过对偶问题高效求解原问题。最后,通过两个例子,我们看到了对偶性在获得闭式解和为困难问题提供下界方面的实际应用。对偶性是理解优化问题结构和设计高效算法的重要工具。

030:卡鲁什-库恩-塔克条件 📚

在本节课程中,我们将学习卡鲁什-库恩-塔克条件,这是处理带有不等式约束的凸优化问题的一组重要条件。我们将从回顾凸优化问题的标准形式开始,逐步引入并解释KKT条件的构成及其意义。

凸优化问题回顾

上一节我们介绍了凸优化问题的标准形式。本节中,我们来看看如何将不等式约束也纳入拉格朗日框架。

一个凸优化问题通常包含:

  • 一个凸目标函数 f(x)
  • 一组不等式约束 gᵢ(x) ≤ 0,其中 g(x) 是一个向量函数,包含从 g₁ 到 gₘ。
  • 一组仿射等式约束 hⱼ(x) = aⱼᵀx - bⱼ = 0,可以合并为矩阵形式 Ax - b = 0

对于等式约束,我们构造拉格朗日函数 L(x, λ) = f(x) + λᵀ(Ax - b),并通过令其梯度为零来寻找最优解。

引入不等式约束的拉格朗日乘子

为了处理不等式约束,我们曾使用对数障碍函数法,构造了一个包含障碍项的拉格朗日函数:
L̃(x, λ) = f(x) + λᵀ(Ax - b) - (1/t) Σ log(-gᵢ(x))
其中 t 是缩放因子,控制障碍的“松紧度”。

现在,我们希望为不等式约束也引入拉格朗日乘子,记作 ν(读作“nu”)。首先观察修改后的拉格朗日函数 x 的导数。其中,对数障碍项的导数部分为 -(1/t) * (1/gᵢ(x)) * ∇gᵢ(x)

我们通过一个思想实验来定义新的乘子 νᵢ:令 νᵢ = -1 / (t * gᵢ(x))。这样,导数中与 ∇gᵢ(x) 相乘的项就变成了 νᵢ

互补松弛条件

对于最优解 x,有些不等式约束是“活跃的”(即 **gᵢ(x) = 0**),有些是“非活跃的”(即 gᵢ(x*) < 0)。

  • 对于非活跃约束(gᵢ(x*) < 0),当缩放因子 t 增大时,对应的 νᵢ 会趋近于 0。
  • 对于活跃约束(gᵢ(x*) = 0),gᵢ(x) 趋近于 0,而 t 很大,νᵢ 可能保持为一个有限值。

为了统一处理这两种情况,我们引入一个关键条件:互补松弛条件,即 νᵢ * gᵢ(x) = 0

  • 如果 gᵢ(x) < 0(约束非活跃),则必须有 νᵢ = 0
  • 如果 gᵢ(x) = 0(约束活跃),则 νᵢ 可以取非负值(νᵢ ≥ 0),此时该约束在最优解处可被视为等式约束。

此外,由于原问题要求 gᵢ(x) ≤ 0,且我们定义 νᵢ = -1/(t * gᵢ(x)),要保证该式有意义且与原问题一致,必须要求 νᵢ ≥ 0

KKT 条件

综合以上分析,我们得到完整的卡鲁什-库恩-塔克条件。对于凸优化问题,在最优解 x* 处,存在拉格朗日乘子 λ* 和 ν*,使得以下条件成立:

  1. 平稳性条件:拉格朗日函数的梯度为零。
    ∇f(x) + Aᵀλ + Jᵀ(x = 0
    其中 J(x)g(x) 的雅可比矩阵(即所有 ∇gᵢ(x)ᵀ 堆叠而成的矩阵)。

  2. 原始可行性条件

    • Ax - b = 0* (等式约束)
    • g(x*) ≤ 0 (不等式约束)
  3. 对偶可行性条件ν* ≥ 0

  4. 互补松弛条件:对于所有 iνᵢ* * gᵢ(x*) = 0

当优化问题是凸的,且约束满足某种规范性条件时,KKT条件是取得全局最优解的充分必要条件

KKT 条件的历史与解释

KKT条件由库恩和塔克于1951年发表,最初被称为库恩-塔克条件。后来人们发现卡鲁什在其12年前的硕士论文中已证明了相同结论,故现在统称为卡鲁什-库恩-塔克条件。

KKT条件描述了最优解的性质,但它本身不直接提供迭代求解的更新步骤(如牛顿步长),需要进一步推导算法。

一个理解KKT条件的经典力学比喻如下:
想象几个用弹簧连接的小车被放置在两面墙之间。小车有宽度,不能互相穿透,也不能穿墙。每根弹簧有不同的劲度系数。系统的平衡态是弹簧总势能最小的状态,同时满足小车不重叠的约束。

  • 目标函数:弹簧的总势能。
  • 约束:小车之间的不穿透条件。
  • 拉格朗日乘子 ν:可以理解为保证小车恰好不接触所需的“虚拟接触力”。当两车未接触时,这个力为零(ν = 0,约束非活跃);当两车刚好接触时,这个力为正值(ν > 0,约束活跃),大小刚好抵消使它们穿透的弹簧力。

本节课中,我们一起学习了KKT条件。我们从凸优化问题出发,引入了不等式约束的拉格朗日乘子 ν,并解释了关键的互补松弛条件 νᵢ gᵢ(x) = 0 的含义。最终,我们得到了完整的KKT条件组,它构成了处理带约束优化问题的理论基础,并可以通过一个经典的弹簧小车模型获得直观的物理解释。

031:原始-对偶方法 🧮

在本节课中,我们将学习原始-对偶方法。这是一种用于求解优化问题的迭代算法,它同时更新原始变量和对偶变量,旨在高效地逼近KKT条件所描述的最优解。

理论回顾与算法动机

上一节我们介绍了KKT条件,它从理论上描述了最优解需要满足的约束条件。现在,我们希望基于此理论来构建可计算的算法。

原始-对偶方法基于我们之前见过的拉格朗日函数(包含拉格朗日乘子λ和μ)进行运算。它在单一步骤中同时更新原始变量和对偶变量(μ和λ)。这是一个迭代算法,最终将收敛到满足KKT条件的解。然而,其迭代的中间步骤不一定是对偶可行的。

之前我们看到的算法是交替进行的:先优化x,再优化λ。而原始-对偶方法在一步中完成所有更新,这将对我们的运行时间产生非常积极的影响。

修改的KKT系统与牛顿法应用

存在多种原始-对偶算法,这里我们采用Boyd著作中介绍的一种特定方法。该方法求解一个经过修改的KKT系统。

在这个修改的系统中,我们引入了一个额外的项 1/T。这个项的作用类似于我们在第一个内点法中看到的障碍函数。这里的T会随着时间推移而增大,当T非常大时,修改后的系统将非常接近原始的KKT系统。

现在,我们进入所谓的“残差世界”。对于当前解,残差描述了它与求解这个修改后KKT系统的接近程度。我们希望这个残差达到零。这可以描述为一个求根问题,对此我们可以应用牛顿法。

我们应用牛顿法,并将这个残差函数的雅可比矩阵表示为一个包含所有原始变量和对偶变量的单一变量Z。这样我们就得到了一个可以执行的牛顿步。

我们可以进一步简化这个方程。因为我们可以从第二个方程中解出Δμ(牛顿步要求我们走的步长),并以封闭形式将其代回,从而实质性地降低这个矩阵的维度。这很有意义,因为在牛顿法中,大部分时间都花在求解或甚至求逆这个矩阵的步骤上。

不过,我们不会深入推导这一步,你可以参考Boyd的著作了解具体做法。

算法实现细节与步骤

有了牛顿步之后,我们仍面临几个开放性问题。第一个是公式中仍然存在的参数T,我们需要决定如何随时间增加T。第二个问题是如何确保μ始终大于或等于零,因为这也是KKT条件的要求之一,但它并未包含在残差项中,需要我们单独考虑。

以下是原始-对偶算法的实现方式,其中重复执行的步骤(第3行到第9行)是关键。

首先,我们总是希望关注对偶间隙。从拉格朗日对偶中我们知道,对偶间隙是我们可能距离最优解的最大距离。我们想利用这个对偶间隙,但在原始-对偶算法的中间步骤中,我们无法直接获得它,因为这些步骤不一定可行。

不过,我们可以访问所谓的代理对偶间隙,其公式为 η = x^T μ。如果解是可行的(即Ax - b = 0),那么这就是对偶间隙。实际上,我们将得到一个满足Ax - b = 0的解,因此在极限情况下,代理对偶间隙将完全等于对偶间隙。这也将作为我们停止算法的条件。

以下是算法的主要步骤:

  1. 计算代理对偶间隙:在算法中,我们首先计算这个值。
  2. 收紧障碍参数:代理对偶间隙越小,我们就将障碍参数T设置得越大。这里通常使用一个缩放因子(例如10),具体取决于问题。
  3. 执行步长更新:接着,我们执行牛顿步,这给出了我们想要前进的方向。
  4. 特殊线搜索:我们不能使用通常的线搜索,因为必须额外考虑μ_i保持大于零以及g_i保持小于零的条件。因此,我们采用一个特殊的回溯搜索步骤。这个步骤首先计算一个最大步长α_max,以确保μ_i保持非负。然后,我们取一个严格小于α_max的值,并重复减少步长,直到所有g_i都小于或等于零,同时检查残差是否确实有所改善(即是否更接近零向量)。

我们重复整个过程,直到得到一个足够接近的解:原始和对偶残差都非常接近零,并且对偶间隙η也非常接近零。这里的ε值可以选择得非常小。

算法性能与总结

让我们看看这个方法的收敛速度。下图展示了对随机生成的线性优化问题的测试结果,问题规模从10个不等式约束到1000个不等式约束不等。

结果表明,对于具有10个不等式约束和20个变量的问题,大约需要16-17次迭代。对于具有1000个变量的问题,大约需要30-39次迭代。虽然存在一些标准差,但原始-对偶方法所需的额外迭代次数仅随优化问题中变量和约束数量的增加而近似对数增长。这是非常好的性质。

现在,我们拥有一个扩展性良好、性能可预测的算法,可以预期在特定时间范围内得到结果。这与我们之前在Julia中编写的一些算法相比是一个巨大的进步,那些算法尚未利用对偶理论,表现不太稳定,对某些问题有效而对其他问题则不然。

本节课总结

本节课我们一起学习了以下内容:

  1. 首先,我们了解了极小极大定理,这是博弈论中最重要的定理之一,以及它如何应用于发展拉格朗日对偶理论。
  2. 拉格朗日对偶是一种重写优化问题的等价方式,它让我们能够利用一些额外的问题结构,通过简化、降低维度、为解提供下界等方式来解决问题。
  3. 接着,我们探讨了如何为不等式约束引入额外的拉格朗日乘子μ,以及如何在KKT条件中使用它来描述达到最优性的条件。
  4. KKT条件最终必须成立,但在中间步骤中,我们可以暂时偏离可行性。
  5. 最后,我们学习了一种迭代减少相对于KKT条件误差并逼近它们的算法。该算法在求解凸优化问题时表现出相当好的速度。

原始-对偶算法的一个优点是它在单一步骤中同时更新原始变量和对偶变量,无需在优化原始变量和对偶变量之间交替进行。总体而言,我们获得了一个快速且具有良好预测行为的算法。

今天的课程就到这里。我们虽然只讲了20页幻灯片,但其中一些内容相当密集。下周我们将再次深入机器学习中的具体问题,主题是核方法与支持向量机。

032:线性分类 🎯

在本节课中,我们将学习机器学习中的分类问题,特别是线性分类方法。我们将从分类的基本概念开始,介绍感知器算法,并最终深入到支持向量机(SVM)的原理。这些方法构成了许多现代机器学习应用的基础。

线性分类

上一节我们介绍了课程概述,本节中我们来看看线性分类的基本概念。

分类是许多科学领域的核心任务。历史上,亚里士多德等哲学家就曾尝试对世界万物进行分类,创建了“相互排斥且完全穷尽”的分类法。在现代机器学习中,我们希望通过算法自动完成这一过程。

我们首先关注二元分类问题,即数据只属于两个类别。通常,我们将这两个类别标记为 +1-1。我们的训练数据集 D 包含多个样本,每个样本由一个特征向量 x 和其对应的真实标签 y 组成。

线性分类器通过一个简单的线性函数进行决策:
f(x) = w^T x + b
其中,w 是权重向量,b 是偏置项。分类边界就是 f(x) = 0 这条直线(或超平面)。对于一个新的样本 x,我们根据 f(x) 的符号来预测其类别:

  • f(x) > 0,则预测为 +1
  • f(x) < 0,则预测为 -1

判断一个分类是否正确也很简单。对于一个样本 (x_i, y_i),如果 y_i * (w^T x_i + b) > 0 成立,则说明分类正确。

感知器算法

了解了线性分类的基本形式后,我们来看一个经典的训练算法:感知器。

感知器是一种简单的神经网络,也是训练线性分类器的一种方法。其核心思想是:迭代地修正分类错误的样本

以下是感知器算法的步骤:

  1. 初始化:将权重向量 w 和偏置 b 设置为 0。
  2. 循环:只要数据集中还存在分类错误的样本,就重复以下步骤:
    a. 从所有错误分类的样本中随机选取一个 (x_i, y_i)
    b. 更新参数:w = w + y_i * x_ib = b + y_i

感知器算法有一个重要的性质:如果训练数据是线性可分的,那么该算法保证会在有限步内收敛,找到一个能完美分类所有训练样本的线性分类器。然而,如果数据不是线性可分的,算法将永远不会停止。

此外,线性分类器的决策只依赖于 w^T x + b 的符号,而不关心其具体数值大小。这意味着权重 w 和偏置 b 可以同时乘以任何一个正数 C,而不会改变分类结果。这个性质有助于我们在实际计算中避免数值过大或过小的问题。

从感知器到支持向量机

上一节我们介绍了感知器算法,但它有一个明显的缺点:结果不唯一且可能不鲁棒。

我们以经典的鸢尾花数据集为例。使用感知器算法,每次运行都可能得到不同的分类边界(如下图红线所示)。虽然这些边界都能正确分类训练数据,但它们对数据微小扰动的抵抗能力不同。

我们更希望找到一条“最稳妥”的边界,即让边界离两边的数据点都尽可能远。这个想法催生了支持向量机

支持向量机的目标是找到一个分类边界,使得边界到最近的数据点(即支持向量)的距离最大化。这个距离被称为间隔。最大化间隔能使分类器在面对新数据或噪声时更加鲁棒。

我们首先考虑硬间隔SVM,它要求所有数据都必须被正确分类,且间隔最大。

为了将这个问题形式化,我们需要计算间隔。可以证明,从分类边界 w^T x + b = 0 到任意一个支持向量 x_+ 的距离 ρ 为:
ρ = 1 / ||w||
其中,||w|| 是权重向量 w 的欧几里得范数。

因此,最大化间隔 ρ 等价于最小化 ||w||。同时,我们需要满足所有样本都被正确分类的约束条件。对于一个支持向量 x_+,我们有 w^T x_+ + b = 1;对于另一侧的支持向量 x_-,则有 w^T x_- + b = -1。对于所有其他样本,要求 y_i (w^T x_i + b) >= 1

于是,硬间隔SVM的优化问题可以写为:

最小化: (1/2) * ||w||^2
约束条件: y_i (w^T x_i + b) >= 1, 对于所有 i = 1, ..., m

这里将目标函数写成 (1/2)||w||^2 是为了数学上的便利,它与最小化 ||w|| 是等价的。

这是一个凸优化问题,我们可以用之前学过的优化方法(如梯度下降、二次规划等)来求解。最终,SVM会找到一条位于两类数据“正中间”的分类边界,如图中黑色实线所示,它比感知器得到的边界(红色虚线)具有更大的间隔和更好的鲁棒性。

总结

本节课中我们一起学习了机器学习中线性分类的核心方法。

我们首先介绍了分类问题的背景和线性分类的基本模型。接着,我们学习了感知器算法,这是一种简单直观的线性分类器训练方法,但其结果不稳定。

为了获得更鲁棒的分类器,我们引入了支持向量机的概念。SVM通过求解一个凸优化问题,寻找能够最大化分类间隔的决策边界。我们推导了硬间隔SVM的优化目标 (1/2)||w||^2 及其约束条件 y_i (w^T x_i + b) >= 1

理解线性分类和SVM是进入更复杂分类模型(如非线性SVM)的重要基础。在接下来的课程中,我们将探讨如何利用核函数将SVM扩展到非线性分类问题。

033:基于核函数的非线性分类 🧠

在本节课中,我们将要学习如何将线性分类器(如感知机和SVM)扩展到非线性分类问题。核心思想是通过一个非线性映射,将原始特征空间转换到一个更高维的空间,从而使得数据在新的空间中线性可分。我们将重点介绍“核技巧”,它允许我们在不显式计算高维映射的情况下,高效地进行非线性分类。

线性分类的局限性

上一节我们介绍了线性分类器。然而,线性分类并非总是足够。

存在一些情况,我们也希望进行非线性分类,这会变得稍微复杂一些,但最终我们将得到更强大的分类器。有一些技巧可以用来使非线性分类易于处理且高效。

首先,请看上面的图片。图中红色类别的元素分布在一个圆环上,整个圆环被嵌入一个空间,并被所有蓝色样本包围。这立刻表明,我们无法线性地分离这两类数据。

还有其他例子,线性分离确实非常困难。例如,所谓的“异或”问题。这里我有一个类别分布在两个区域。不过,让我回溯一下,异或问题实际上可以通过线性分类解决。但我的意思是,我们这里的例子应该足以作为动机。我们希望有一个分类器能精确地将蓝色圆圈与红色圆圈分开。通过将整个空间提升到更高维度,这实际上是可以实现的。下图展示了这一点:我们进行一个非线性变换,点最终分布在一个类似浴缸的形状上,然后我们可以在三维空间中找到一个分离超平面,完美地将红点和蓝点分开。

Cover有一个很好的定理指出,在一个复杂的模式分类问题中,当我们将其投射到更高维空间时,通常线性分离的可能性更大。这正是我们在这里使用的原理。

特征空间映射

最初,我们的特征位于一个低维空间,比如实数的n维向量空间 R^n,我们将其映射到一个非常高维的空间 R^M

原则上,我们也可以有不同的输入空间,例如,我们可以有各种图或分子作为输入,这些很难用 R^n 表示。但目前,我们假设所有特征都是实数。

我们希望这种到扩展特征空间的变换是非线性的,并且是单射的。单射意味着什么?想象一下,我有原始空间 X 和扩展特征空间 H。当我取两个不同的样本,将它们从原始特征空间映射到扩展特征空间时,我希望它们在扩展特征空间中处于两个不同的位置。将所有原始样本映射到高维空间的同一点是没有意义的,那对分类器没有帮助。因此,我们希望它是一个线性变换,以帮助找到线性分离,并且希望它是一个单射映射。

下图展示了两个例子。你可以想象许多不同的基扩展是可能的,这也是一种特征工程。你可以想象许多不同类型的基扩展,这里我们看到两个:多项式基扩展和高斯基扩展。稍后我们将看到一些被证明有用且在文献中反复使用的例子。

非线性感知机训练

现在我们可以以非线性方式训练感知机。同样,我们有一个误分类样本的简写符号。

训练算法实际上没有太大变化,唯一改变的是,每次我们查看训练数据中的一个特征向量时,我们首先将其提升到更高维空间(进行基扩展)。同时,我们的权重向量 w 现在变大了,w 现在在 R^M 中,而之前它在 R^n 中。因此,在这里我们也进行扩展。然后,当我们进行分类时,要对一个样本进行分类,我们同样需要将测试样本扩展到高维空间,乘以权重 w 并加上偏移量 b

这个算法运行良好,符合预期。如果我们有无限的计算时间和资源,那么我们可以到此为止。

问题在于我们没有无限的时间和计算资源,并且会很快遇到问题。在神经网络之前,使用了各种不同的分类器,例如在MNIST数据集上。感知机和后来的SVM也应用于MNIST数据集。在那里,我们可用的特征本质上是每个手写数字的28x28灰度图像。

这里我们选择其中一个数字,我们有一个28x28的灰度图像,我们想用它进行分类。现在,如果我们使用多项式基扩展,这会立即从28x28膨胀到超过300,000个参数或特征,这对于单个手写数字来说效率极低。我们很难处理如此高的维度,尤其是在80年代和90年代,人们无法处理那么高的维度。

可以做的事情是降低维度,例如,我取数字并计算左上象限中黑色像素的数量,以得到较低维度的特征向量描述,然后我可以进行提升。但有一个更好的方法,称为核函数。核函数允许我们在非常高维的特征空间中进行精确分类,而无需在那里计算完整的向量。

对偶形式与核技巧

但在应用核函数之前,我们必须修改感知机算法,并以对偶形式重写它。“对偶”一词在计算机科学中被严重重载,对偶感知机与拉格朗日对偶无关,但它是一个既定术语,因此我们在这里使用它。

之前我们有一个大的特征向量或大的权重向量 w,我们在每次迭代中更新它。现在我们不再那样做,取而代之的是,我们为每个训练样本计数,记录我们使用该特定训练样本来寻找完美分离决策边界的线性分类器的次数。

因此,我们有了向量 αα 本质上是一个大向量,它包含自然数,分别记录我使用第一个样本的次数、使用第二个样本的次数等等。当我们遇到误分类样本时,我们只是在这里增加计数器,不做其他事情。因此,我们不再处于 R^M 中,而是这个 α 实际上在 R^D 中,其中 D 是训练数据集的大小。

现在,对于误分类样本的简写,这变得稍微复杂一些,因为本质上我们在这里做的是在每一步重建我们的 ww 是权重向量。同样,当我们现在对每个样本进行分类时,我们再次重建 w。在这种表述中,使用计数训练样本的想法并不是很有帮助,然而,这将使我们能够在未来进行进一步的简化。

现在我们来到核技巧。核技巧说的是,我们首先进行多项式基扩展,然后将这个多项式基扩展放入内积中。这里我们有映射函数 φ,我们首先在更高维基中进行扩展,然后将整个东西代入这个内积中。之前我们只写了 x^T y,这是欧几里得内积。但现在我们稍微推广一下,一般来说,我们也可以在其他希尔伯特空间中,那里有不同的内积,因此我们现在以一般方式书写。

关键的见解是,与其先将所有东西扩展到非常高维的特征空间,然后再将所有东西压缩成一个标量,我们可以走一条捷径。让我们看一个非常小的例子,看一个基于多项式扩展的特定角。首先,我们有一个基扩展,它使用 a1^2a1a2 的乘积、以及 a2^2。然后我可以对两者使用欧几里得内积,得到一个公式,最后我可以简化,最终得到 (a^T b)^2

对于只有两个向量的情况,这还不是一个大的改进。然而,你必须想象当我在 R^100 中有100个特征时会发生什么。当我进行多项式扩展,并考虑每个特征的平方以及任意两个特征的乘积组合时,它会变得非常高维。但最终,我仍然可以将所有东西压缩成这种形状的公式。因此,通过同时考虑基扩展和内积,我有时可以找到不需要进行所有计算的捷径,并立即采用捷径。

甚至有些情况下,我只关注核函数。通过观察核函数,我可以推断出存在某个具有内积的高维基扩展,但我实际上并不太关心。甚至有些情况下,基扩展必须是无限维的,存在一个能给我核函数的基扩展,但它将是无限维的,我实际上无法在计算机中使用它,但核函数立即告诉我捷径是什么,并且这是评估起来越来越高效的工具。

这里有一张图来解释这一点:我可以从原始特征空间通过基扩展到 R^M,然后再压缩回来;或者我立即采用核函数的捷径。

对于核函数,我们将在关于再生核希尔伯特空间的部分中更正式地讨论核是什么。在这里,我们只考虑核函数是对称的。有许多众所周知的核函数。在许多实践中,你采用一个已知性能良好且可能具有你所需属性的现有核函数。

以下是几个常见的核函数:

  • 线性核k(x, y) = x^T y。这很明显。
  • 多项式核k(x, y) = (x^T y + c)^d。这是我们刚才看到的扩展,带有一些常数 c 和次数 d
  • 径向基函数核k(x, y) = exp(-γ ||x - y||^2)。这基本上具有高斯的形状,它本质上给了我两个向量之间的距离度量。

还有其他流行的核函数,我们无法在此列出完整列表,但这只是为了让你理解为什么核函数是有利的,以及为什么我们希望将所有东西都写成可以核化的形式。编写感知机算法的对偶版本的全部目的就是为了能够核化它。

核化感知机

如果我们看感知机算法的原始对偶版本,我们看到基扩展仅用于来自数据的特征向量。这里我们在每种情况下都有基扩展。特征扩展是针对某些数据元素的,我们不做的,例如,是对大权重向量 w 进行特征扩展,这正是我们想要避免的。在进行对偶化之前,我们有一个项是 w^T x,这很难提升到高维空间。但现在在对偶形式中,我们只有来自实际数据的特征被放入基扩展中,现在我们可以利用这一点。

因为现在我们可以进一步转换它,使得我在这里只有两个基扩展的内积,并且我可以用核函数替换它。最初我们有一个看起来更复杂的内积,但仅仅通过观察内积的公理,我们知道我们可以在这里提取出求和、α_jl_j。这导致了一种可以核化的形式。我们在左侧完成了这个操作,再次有了指示哪些是误分类样本的 γ,其他没有太大变化。唯一的区别是,现在在任何地方我们都不需要显式地写出可能非常难以处理的扩展特征空间。

很好,我们正在使用非线性扩展,但实际上不必写出扩展的特征向量,因此我们可以高效或更高效地进行非线性分类。

核化支持向量机

那么接下来呢?我们可以研究对偶间隙,或者释放所有变量,或者尝试遗传算法。或者我们可以尝试支持向量机。让我们选择这个,看看是否也能核化支持向量机,以便我们能够高效地使用非线性分类,并具有最大化或鲁棒化数据到决策边界距离的优势,同时不依赖于训练数据集中数据的顺序。

为了核化支持向量机,我们也必须首先将其对偶化,但这个对偶现在是我们熟悉的拉格朗日对偶。因此,我们有几页前提到的原始SVM问题,我们知道如何构造它的拉格朗日对偶,我们在这里引入一个额外的拉格朗日乘子向量 μ

为了处理不等式约束的附加项,我们也必须稍微转换一下,因为对于不等式约束,我们希望 g_i(x) ≤ 0,所以我们稍微转换一下,得到这个公式。

这里再次,我们希望核化,但我们不想对 w 使用基扩展,所以我们实际上根本不想看到这个 w。现在,通过使用拉格朗日对偶,我们可以简化并摆脱这个 w

首先,对于拉格朗日函数,我们知道我们正在寻找一个鞍点,所以我们可以对 b 求导,也可以对 w 求导,并且我们知道在鞍点结果应为零或零向量。这给了我们两个有趣的结果:例如,我们知道 μ^T l 应该为零,这里 l 我视为所有训练数据标签的列向量。另一件事是,我知道我希望 w 等于这里的这个和。

我们可以将其代入,插回原始对偶中。现在有几个技术步骤,我们不会在幻灯片上完全展示,这些也与考试无关,但在一些技术步骤之后,我可以通过代入这两个结果来简化拉格朗日函数。我们将看到,最终在鞍点处的拉格朗日函数值与 wb 无关。一般来说,拉格朗日函数依赖于 wb,因为它们是拉格朗日函数的参数。然而,当我到达鞍点时,拉格朗日函数的值将独立于 wb,如果我考虑之前的见解。因此,这里我有一个新的拉格朗日函数,在鞍点处仅依赖于 μ

这很棒,因为我现在可以简化拉格朗日对偶的定义。这是原始的拉格朗日对偶,现在我可以省略关于 wb 的下确界部分,因为我知道整个东西独立于 wb,但我仍然需要考虑这些约束。特别是这个约束,在选择 μ 时,我仍然必须牢记它。现在我仍然有选择 μ 的自由。现在我在这里对 μ 进行 Q(μ) 的最大化,这里我需要考虑两个约束:第一个约束是 μ 必须大于零,因为这是针对不等式约束的;第二个是我需要满足 μ^T l = 0

现在这实际上是全部魔法所在。这是硬间隔SVM在对偶形式中的定义,并且由于我们有强对偶性,我们可以证明这给了我完美的结果,我没有对偶间隙。

我们可以再简化一点,通过将这个表达式写成一个大的矩阵乘法来简化。我们构造一个实际上是对称矩阵的矩阵 K。目标函数简化为那个形式,我们知道如何解决二次优化问题。这里的两个约束也不会太困扰我们。我们只需要确保矩阵 K 是半正定的。

有时我们必须检查一个矩阵是否半正定,但对于数值问题,我们可以通过查看特征值来证明矩阵是半正定的,特别是最小的特征值,它必须是正的。但有时最小的特征值非常小,接近零,但由于数值问题最终变为负值,比如 -1e-15 之类的,那么一些算法会拒绝这个矩阵 K。有时我们必须稍微调整一下,帮它一点忙。但一般来说,当我们有这个矩阵 K 并且一切数值精确时,我们只需验证它是半正定的,然后我们知道整个问题是一个凸优化问题,因为这里我有一个凸函数要最小化(或者在这里是负的凸项,但由于我在最大化,所以整体没问题),这是一个我们已经知道如何解决的优化问题。

现在,这也是一个我们可以核化的优化问题版本,因为这里我们只有数据样本或所有样本的特征向量之间的内积。因此,为了从线性分类问题切换到非线性分类问题,我们唯一需要改变的是,在计算这个对称矩阵 K 时,插入我们的核函数。所以这是我们唯一需要添加东西的地方。然后我们得到结果,即 μ 向量。然后这些实际上就是支持向量,因为只有少数几个 μ 是正的,每个 μ 对应一个样本,所有其他的 μ 都为零。现在,当我们对收到的新样本进行实际分类时,我们只需要考虑正的 μ

因此,它是高效的。所以核化对于非线性分类是高效的。一旦我们有了结果,评估也是高效的,因为我们只需要考虑一小部分实际影响我们的样本,即最接近决策边界的支持向量。

在这里,我们可以重建原始项 w^T φ(y),如果我们选择这样做,那么对于基扩展,我们将有一个非常高维的 w',这是我们不想要的,而这里我们将有 y 的基扩展。这本质上就是我们会得到的。通过核化,我们可以获得完全相同的效果。然后 b 也可以被重建,实际上我可以仅从其中一个支持向量重建 b,但这里我求和然后取平均,因为在数值上这样做更稳定一些。

核化SVM示例

这给我们带来了什么?现在我们有了核化SVM,并且我们已经看到了几种核函数。让我们选择两种不同类型的鸢尾花,现在我们有山鸢尾和变色鸢尾,我们有来自Fisher 1936年论文的原始数据。但通过选择这两个物种,我们会发现它们彼此更接近,我们将无法找到一个完美分离这两个类别的线性分类。

因此,我们转向非线性分类,这里使用了一个带有超参数 σ=1 的RBF核。通过将所有东西代入并解决上一张幻灯片的凸优化问题,我们得到一个完美分类这两个类别的分类器。在中间,当两个类别几乎相交时,这里变得有点复杂,决策边界(即当我们把所有东西代入决策公式时恰好为零的边界)变得更加复杂。对于软间隔SVM(我们这里没有展示),我们可以有额外的参数来调整,我们可以在拥有更简单的决策边界和容忍一些误分类训练样本之间进行权衡。

总结

本节课中我们一起学习了非线性分类的核心思想。我们了解到,通过将数据映射到高维空间,可以使原本线性不可分的数据变得线性可分。为了高效地实现这一点,我们引入了核技巧。我们详细探讨了如何将感知机和SVM算法转化为对偶形式,并最终核化它们,从而避免了显式计算高维映射的巨大开销。这使得我们能够利用强大的非线性分类器(如使用RBF核的SVM)来处理复杂的现实世界数据,同时保持计算的可管理性。现在你知道了SVM的工作原理,并且利用本讲座提供的工具,你知道了如何从头开始构建SVM的训练算法并应用它,使其高效运行。实际上,这与你现在通常使用的大型机器学习包没有太大区别,现在你能够从头开始做到这一点,并且在某种程度上,我们也在练习中这样做。

这把我们带到了关于再生核希尔伯特空间的最后一节。

034:再生核希尔伯特空间 🔬

在本节课中,我们将学习一个在机器学习中至关重要的概念——再生核希尔伯特空间。虽然名字听起来复杂,但其核心思想非常强大。我们将从核函数的正式定义开始,逐步理解其性质,并最终揭示“再生”特性的含义。

核函数的正式定义

首先,我们来看看什么是核函数。一个函数 K 被称为核函数,当且仅当它满足以下两个条件:

  1. 它是对称的。
  2. 存在某个希尔伯特空间 H 和一个映射 Φ,使得对于任意输入 xx‘,有:
    K(x, x‘) = <Φ(x), Φ(x‘)>_H

这里的输入空间 X 可以非常广泛。它可以是实数向量空间,也可以是像“红、蓝、绿”这样的类别数据,甚至是图结构等复杂对象。只要我们能定义一个满足上述条件的核函数,就可以在这些数据上应用核方法。

核矩阵及其性质

上一节我们介绍了核函数的定义,本节中我们来看看如何将核函数应用到数据集上。

给定一个数据集,我们可以计算所有数据点对之间的核函数值,从而得到一个核矩阵(或称Gram矩阵)。对于一个包含 n 个点 {y₁, …, yₙ} 的数据集,核矩阵 K 是一个 n × n 的矩阵,其第 i 行第 j 列的元素为 K(yᵢ, yⱼ)

这个矩阵具有一些重要性质:

  • 对称性:由于核函数 K 是对称的,核矩阵 K 也是对称的。
  • 半正定性:如果函数 K 是一个有效的核函数,那么由其构造的核矩阵 K 总是半正定的。这个性质可以在几行内证明。

从核函数到特征映射

我们已经知道,如果有了特征映射 Φ 和希尔伯特空间的内积,就能构造出核函数。但反过来呢?如果我们已经有了一个核函数 K,如何证明存在一个对应的特征映射 Φ 和内积?这是本节的核心。

关键在于一个称为“部分求值”的技巧。对于固定的 y,我们将核函数 K(y, ·) 视为一个单变量函数。这个函数将输入 x 映射到实数 K(y, x)

现在,我们进行一个关键的构造:

  • 特征映射:我们将特征映射 Φ 定义为 Φ(x) = K(x, ·)。注意,映射的结果不再是一个向量,而是一个函数
  • 目标空间:我们进入了一个函数空间,其中的元素是从 XR 的函数。
  • 内积定义:在这个函数空间上,我们定义一个特殊的内积。对于由数据点 xy 生成的两个函数 Φ(x) = K(x, ·)Φ(y) = K(y, ·),它们的内积定义为:
    <Φ(x), Φ(y)> = K(x, y)

然而,仅由有限个数据点生成的函数集合并不构成完整的向量空间。为了得到一个真正的向量空间 G,我们考虑所有这些函数的所有线性组合(即加权和)。这样,G 就包含了所有可能的这类函数,并且对加法和数乘封闭。

最后,我们将上面定义的内积自然地扩展到整个空间 G 上。可以验证,只要原始的核函数 K 是对称且正定的,这样定义的内积就满足希尔伯特空间内积的所有公理(线性性、对称性、正定性)。

再生核希尔伯特空间

上一节我们构造了一个函数空间 G 及其内积,本节我们来理解“再生”特性的含义。

F 是一个由 XR 的函数构成的希尔伯特空间。如果存在一个核函数 K,使得对于任意 x ∈ X,函数 K(x, ·) 都属于 F,并且满足以下再生性质
对于任意 f ∈ F,有 <f, K(x, ·)>_F = f(x)
那么,我们称 F 为一个再生核希尔伯特空间

我们之前构造的空间 G 恰好就是一个RKHS。我们可以简单地证明其再生性质:对于 G 中的任意函数 f(它是基函数的线性组合),将其与 K(x, ·) 做内积,利用内积的线性性和定义,最终结果恰好等于在 x 点处求函数值 f(x)

有一个重要的定理(Aronszajn定理)指出:每一个对称正定的核函数 K,都唯一对应一个再生核希尔伯特空间。 这完美地连接了核函数的代数条件(对称正定)和其背后的几何结构(RKHS)。

核函数的组合规则

既然核函数如此有用,我们自然会问:如何构造新的核函数?以下是几种保持核函数性质的组合规则,可以像“烹饪手册”一样使用:

  • 用一个正常数乘以核函数。
  • 给核函数加上一个常数。
  • 将两个核函数相加。
  • 将两个核函数相乘。
  • 取核函数的正系数多项式。
  • 取核函数的指数函数。

当你在使用支持向量机等算法,并为寻找合适的核函数以刻画决策边界而苦恼时,这些组合规则和“核技巧手册”会非常有帮助。

总结

本节课中我们一起学习了以下核心内容:

  1. 核函数的定义:对称且能表示为某个特征空间内积的函数。
  2. 核矩阵:由数据集计算的核函数值矩阵,具有对称和半正定的性质。
  3. RKHS的构造:通过将数据映射到由核函数本身张成的函数空间,并定义特殊的内积,可以从一个对称正定的核函数构造出唯一的再生核希尔伯特空间。
  4. 再生性质:RKHS的关键特性,即用核函数与空间中任意函数做内积,可“再生”出该函数在特定点的值。
  5. 核函数的组合:可以通过一系列运算(如相加、相乘)从已知核函数构造出新的有效核函数。

核方法使我们能够高效地在高维甚至无限维的特征空间中进行线性分类(如使用支持向量机),从而处理复杂的非线性问题,这是现代机器学习中一项强大的技术。

035:锥优化 🧊

在本节课中,我们将学习锥优化。锥优化是一种强大的数学框架,它能统一描述许多优化问题,包括线性规划、二次规划和半定规划。通过使用锥的概念,我们可以更简洁地表述复杂的优化问题,并利用其结构设计高效的求解算法。


锥的定义与动机

上一节我们介绍了课程概述,本节中我们来看看锥优化的核心概念——锥。

一个集合 K 被称为锥,如果对于集合中的每一个元素 xK,以及任意正标量 α > 0,其缩放后的结果 αx 仍然属于 K。用公式表示为:

∀ x ∈ K, α > 0 ⇒ αx ∈ K

直观上,锥就像一个从原点向外无限延伸的“冰激凌筒”形状。如果锥内任意两点的加权和(权重为正)仍在锥内,则该锥是凸锥。我们主要关注的是正常锥,即同时满足闭集(不包含穿过原点的整条直线)且内部非空的凸锥。

对于正常锥,我们可以定义广义不等式。表达式 x ≼_K y 等价于 y - x ∈ K。这是一种方便的记法,用于表示一个元素属于某个锥。特别地,当锥是非负象限时,这个定义就退化为我们熟悉的向量逐元素不等式。


常见的锥类型

了解了锥的基本定义后,本节我们来看看在锥优化中常用的几种具体锥形。以下是三种最重要的锥:

  • 非负象限锥 (R_+^n):这是最简单的锥,由所有元素非负的向量构成。它对应着线性规划问题。
  • 二阶锥 (Second-order Cone / Lorentz Cone):这个锥由满足特定二次不等式的向量构成。它对应着二次约束二次规划和鲁棒优化等问题。
  • 半正定锥 (S_+^n):这个锥由所有半正定矩阵构成。它对应着半定规划,能够描述更广泛的一类优化问题。

这些锥构成了一个层次结构,越往下,锥所描述的优化问题类别越广泛,但可利用的结构也越多,从而能设计出更高效的算法。


锥规划的标准形式与算法概念

上一节我们介绍了具体的锥类型,本节中我们来看看如何用锥来表述一个优化问题,即锥规划。

锥规划有一个标准形式,类似于线性规划:

最小化 c^T x
约束条件: Ax = b, x ∈ K

其中,K 是一个正常锥。这个形式非常紧凑。事实上,任何一个凸优化问题都可以等价地转化为一个线性锥规划问题。证明思路是利用函数的上图来构造一个特定的锥。虽然这种构造在理论上是完美的,但得到的锥可能非常复杂,没有简洁的表达式,因此对实际算法设计帮助有限。

因此,锥优化的核心价值在于:针对那些具有“好”的锥(如非负象限、二阶锥、半正定锥)的优化问题,我们可以开发出高效、统一的求解算法。许多商业优化求解器(如MOSEK)的核心就是基于锥优化框架。

对于锥规划,我们可以研究其对偶问题,并且通常能得到漂亮的闭式对偶结果。此外,锥还为内点法提供了天然的障碍函数,使得我们可以设计出多项式时间复杂度的算法来求解这些看似复杂的问题。


本节课中我们一起学习了锥优化的基础知识。我们首先定义了锥和正常锥,并介绍了广义不等式的概念。然后,我们探讨了三种最常用的锥:非负象限锥、二阶锥和半正定锥,它们分别对应着不同类别的优化问题。最后,我们介绍了锥规划的标准形式,并理解了所有凸优化问题本质上都是锥规划,但实际中我们更关注那些具有简洁锥形式的、可高效求解的问题。锥优化框架的强大之处在于其统一性和为算法设计提供的清晰结构。

036:常用锥体 🧊

在本节课中,我们将学习锥优化中几种常用的锥体。理解这些锥体是掌握如何将实际问题建模为锥优化问题的关键。我们将依次介绍非负象限锥、二阶锥和半正定锥,并探讨它们各自的应用场景。

非负象限锥 📊

上一节我们介绍了锥的定义和锥优化问题的标准形式。本节中,我们首先来看最基础的一种锥:非负象限锥。

非负象限锥非常容易想象。在一个二维坐标系中,我们有x1轴和x2轴。非负象限锥就是由x1轴和x2轴作为方向,并填充它们之间所有区域的锥体。具体来说,它包含了所有x1和x2都为正数的点。

可以很容易地看出这是一个锥,因为我可以取其中的任意一点,乘以一个正标量,得到的新点的所有坐标分量仍然为正。

实际上,我们可以将任何形如下式的线性规划问题,转化为定义在非负象限锥上的锥优化问题。

首先,我们引入一个松弛变量 z,并要求 z 的所有分量都为正。这样,我就可以用等式约束来替换原来的不等式约束。因为我知道 z 必须是正的,所以这两个问题是等价的。

其次,我的目标变量 x 可能是负的也可能是正的,在开始时我并不知道。为了强制 x 位于非负象限锥中,我将它拆分成两个变量 x1x2,并且要求它们都为正。在所有原来使用 x 的地方,我现在使用 x1 - x2。这样我仍然可以得到和原来一样的解,但现在我所有的目标变量都可以被约束在非负象限锥中。

最后,通过一些额外的组合操作,我可以将这三个部分合并,得到一个在更高维度的非负象限锥中的单一变量 y,从而得到标准锥形式。因此,任何线性规划都可以被重写为标准锥形式,其锥体就是非负象限锥

二阶锥 🍦

现在,我们来看一些之前无法很好求解的优化问题,为此我们需要更高级的锥体,例如二阶锥。

二阶锥也被称为洛伦兹锥或冰淇淋锥。它的定义是:对于一个向量 x,考虑所有满足 t 大于等于 x 的欧几里得范数的 t。公式表示为:

(t, x) ∈ Q^n 当且仅当 t ≥ ||x||_2

下图展示了三维空间中的二阶锥,其中前两个维度是 x 的分量,第三个维度是 t

当我选择 x1x2 时(例如图中红点),t 需要大于等于该点到原点的欧几里得距离,这就精确地给出了这个向上开口的“冰淇淋”锥。

许多应用都属于这个范畴。例如,具有二次约束的凸优化问题可以被重写为二阶锥优化问题。下面的公式展示了这种转换,在本课程中,你不需要记住这个复杂公式,更重要的是知道这种转换是存在的。

一个二次约束的形式是 x^T C^T C x ≤ ...,其中 C^T C 显然必须是半正定的,以确保整个函数是凸的。最终,我们可以将整个问题重新表述为一个带有二阶锥约束的锥优化问题。

现在让我们看一些之前承诺的实际例子。

应用一:全变差去噪

假设你有一个非常嘈杂的数据,如下图中左侧的灰色点所示。这些是时间序列测量值,相当复杂,时不时会出现跳跃或状态的突然切换。我们想要做的是去噪,同时也想看到数据中发生这些跳跃的位置。

一个简单的方法是使用滑动窗口,但滑动窗口通常不能完美反应,我们更希望精确地发现底层过程变化的点。我们可以通过所谓的“全变差”来实现。

全变差是查看一个数据点与其邻居之间绝对距离的总和。对于时间序列去噪,我们设测量值为 y,希望去噪后的序列为 xxy 的维度可以很高。

我们希望 x 接近 y,因此最小化它们之间的平方距离。此外,我们添加全变差项,即相邻数据点绝对距离的和,并乘以一个标量权重 λ。这个权重控制我们对去噪的偏好程度:设为0则完全恢复原始序列,设得越大则越偏好平滑的序列。

这个一维全变差去噪问题可以写成一个锥优化问题。平方距离项保持不变。对于去噪项,即 λ * Σ t_j,其中 t_j = |x_{j+1} - x_j|,我们可以利用第五讲中提到的技巧,用两个不等式约束来精确表示绝对值。

应用二:图像去噪

从一维去噪,我们现在转向图像去噪,即二维域。我们有一幅灰度图像 y,它是一个矩阵。

我们也可以计算全变差,但现在是针对所有像素,考虑每个像素在右和上两个方向上的邻居。总变差是这两个方向上绝对距离平方和的平方根。

类似于一维情况,我们构建优化问题:第一项是去噪图像 x 与原始噪声图像 y 所有像素的平方距离和(即 Frobenius 范数的平方),第二项是全变差项。

我们可以将整个问题重写为一个二阶锥问题,因为对于每个像素,我们都有一个约束,要求其向右和向上的距离 u 与变量 t_ij 满足 (t_ij, u) ∈ Q^3(二阶锥)。我们知道,如果 (u, t) 属于二阶锥,意味着 t 必须大于等于 u 的欧几里得范数。优化器有动力将 t_ij 向下推至尽可能小,因此在最优解处,我们将精确地得到 t_ij = ||u||,这正是该像素处的总变差范数。

现在,我们得到一个非常高维的优化问题。例如,一个200x200的图像意味着一个40000维的优化问题,每个像素对应一个二阶锥约束。这规模很大,因此我们需要高效的算法。如今这类算法已是标准实践,甚至你手机上的相机在暗光拍摄时可能就应用了此类方法来优化噪声图像。

半正定锥 ⬜

最后,我们详细看看三种锥中的最后一种:半正定锥。

对于半正定锥,我们处理的元素实际上是矩阵。我们考虑所有 n x n 对称矩阵构成的向量空间 S^n,但只关注其中的半正定对称矩阵,这就构成了半正定锥。

标准的半正定规划优化问题如下:

最小化 C • X
满足 A_i • X = b_i, i=1,...,m
且 X ≽ 0

其中 C • X 表示矩阵的弗罗贝尼乌斯内积(对应元素相乘之和),类似于线性规划中的 c^T xX ≽ 0 表示 X 属于半正定锥。

同样,半正定锥也有许多实际应用。

应用一:组合优化近似

著名的是,我们可以用 SDP 来近似组合优化问题。在计算机科学中,我们都听说过旅行商问题(NP难问题)。另一个例子是最大割问题:给定一个图,如何划分它使得两个分区之间边的权重最大。这也是一个NP难问题。

对于这个最大割问题,我们可以将其写成一个 SDP 问题来近似求解,并获得一个非常接近最优解的解(接近90%的近似比)。这很好,因为如果我们知道如何快速求解 SDP,就能为许多NP难问题找到一个非常接近最优的解。

应用二:无线传感器定位

另一个具有实际意义的应用是无线传感器定位。想象田野中有许多无线传感器(例如手机),你想根据从它们接收到的信号强度进行精确定位。

如果你有已知位置的基站, triangulation 很容易。但如果我们能考虑网状网络会更好,因为手机之间也能相互看到信号强度,这样我们不仅有到基站的距离,还有传感器之间的距离估计。

我们通过信号强度来估计传感器之间的距离 d_ij。关键问题是如何将所有不同的距离估计组合成所有传感器的位置预测?

我们可以将所有位置向量组合成一个大矩阵,并写下距离方程。通过一些额外的变换,最终得到一个 SDP 问题。这个 SDP 是一个近似,它给出了约束,从而极大地减少了每个传感器可能位置的搜索空间。例如,在 Doherty 的论文中,就使用 SDP 将每个传感器的可能位置空间缩小到一个非常紧的近似范围内。

应用三:盲反卷积

我们看的最后一个半正定规划应用是所谓的“盲反卷积”。

这也是一个计算机视觉应用。假设你有一张模糊的图像,比如用抖动的相机拍摄的照片。其背后的过程是:先有一张清晰的图像,然后对其应用一个模糊核(卷积操作)。卷积操作取一个矩形区域内的像素,通过模糊核将它们组合成一个输出像素。

当我们知道这个模糊核时,可以尝试逆转它,通过一个优化问题来估计原始清晰图像 x,同时希望恢复图像的全变差噪声较低。这被称为“反卷积”。

然而,在许多情况下,我并不知道模糊核,因为我不确切知道相机是如何抖动的。但我仍然可以应用优化,这被称为“盲反卷积”。Ahmed 和 Bent 的一篇著名论文使用凸优化进行盲反卷积,同时估计模糊核和清晰图像。

这是一个非常强大的方法。你可以拿一张模糊的图像(无论是Photoshop的高斯模糊还是相机抖动造成的),并尽可能重建它。通常图像中有足够的有用信息,可以使其再次可读,例如让车牌号变得清晰。这就像一种詹姆斯·邦德式的技术,通过增强坏图像来获取车牌并追踪目标。

许多这类论文最终都会得到一个需要解决的 SDP,然后用标准方法求解。那么问题来了:这些标准方法是什么?我们如何一般性地求解 SDP 或锥优化问题?其中的重要思想是什么?这将是我们后续课程要探讨的内容。

总结 📝

本节课中,我们一起学习了锥优化中三种最常用的锥体:

  1. 非负象限锥:最基础的锥,任何线性规划都可转化为其上的锥优化问题。
  2. 二阶锥:形如冰淇淋锥,可用于处理全变差去噪(一维时间序列和二维图像)等具有二次约束或范数约束的问题。
  3. 半正定锥:处理矩阵变量,用于半正定规划,在组合优化近似、传感器网络定位和图像盲反卷积等领域有强大应用。

理解这些锥体及其应用场景,是将复杂实际问题建模为可高效求解的锥优化模型的第一步。

038:非凸连续优化

在本节课中,我们将学习非凸连续函数的优化。我们将探讨当目标函数不再是凸函数时,优化问题会面临哪些新的挑战,并介绍几种用于解决此类问题的启发式方法。

概述

欢迎来到本系列讲座的最后一讲。今天,我们将扩展视野,探讨之前课程中未涵盖的内容:无梯度和非凸优化。这旨在让大家了解本课程范围之外还有哪些优化方法,我们不会深入每个细节,但会介绍核心概念。

我们将讨论非凸连续函数的优化、混合整数优化、随机优化,并进行快速回顾与展望。

非凸连续目标函数

到目前为止,我们考虑的所有优化问题都是凸的,这为我们带来了许多优势。我们总是可以“走下坡路”,并且确信只有一个满足特定条件(例如,对于无约束优化,梯度在该点为零)的全局最优解。

然而,对于非凸优化,我们无法依赖这些先验知识。因此,我们需要其他概念来思考这类函数。其中一个非常重要的概念是利普希茨连续性

利普希茨连续性

如果一个函数的变化速率存在一个上限,我们称其为利普希茨连续。具体来说,我们观察函数定义域中的两个点。如果函数在这两点之间的距离是有限的,那么函数在这两点处的取值之差也是有限的。

定义:若存在常数 L > 0,使得对于定义域中的所有 x1 和 x2,都有:
|f(x1) - f(x2)| ≤ L * ||x1 - x2||
则称函数 f 是 L-利普希茨连续的。

一个函数如果弯曲程度很小,其利普希茨常数 L 可以很小;而一个弯曲剧烈的函数,其利普希茨常数 L 会更大。

非凸优化的复杂度挑战

现在假设我们有一个非凸但利普希茨连续的函数 f。我们尝试优化它,希望找到一个解,其与最优解的距离小于某个很小的值 ε。

问题是:如果我们使用网格搜索,为了确保我们的解与最优解的距离小于 ε,我们需要对函数 f 进行多少次评估?

我们可以通过一个简单的例子来理解。假设有一个函数几乎是平坦的,只有一个很小的凹陷(深度为 ε)。为了在 N 维空间中找到这个凹陷,我们需要进行网格搜索。所需的评估次数与 (L / (2ε))^N 成正比。

可以看到,当 ε 变小或 L(函数弯曲度)变大时,所需的评估次数会急剧增加。考虑一个简单的 16 维优化问题,设 ε=0.01,L=1,那么需要的评估次数将是一个天文数字。

因此,在一般情况下,非凸函数无法被高效优化,因为其复杂度呈指数级增长。我们看到的这个带小凹陷的测试函数就是一个例子,因为除了凹陷处,其他任何地方都无法提供有用的梯度信息,所以网格搜索是我们能使用的最佳方法。

然而,在实践中,我们通常仍然可以通过依赖问题中仍然存在的某些结构来解决它们。实际问题通常比理论上的最坏情况要“友好”得多。

启发式方法

存在一些启发式方法,在实践中对这类问题表现良好,但它们缺乏严格的理论保证,并且我们可以构造出一些合成例子,使得这些启发式方法表现不佳。

文献中常用一些测试函数来评估这些启发式方法。以下是一些常见的非凸测试函数:

  • Rosenbrock 函数:相对“友好”,其最优解位于一个长而平坦的“山谷”尽头,挑战在于需要沿着梯度很小的山谷行进才能找到最优解。
  • Ackley 函数:高度非凸,拥有许多局部极小值。
  • Griewank 函数:这是一个较新的函数(过去六七年出现),它特别棘手,因为它不是利普希茨连续的(其利普希茨常数趋于无穷大),常被用于测试无导数优化方法。

可以想象,基于梯度的优化方法在处理这些函数时会遇到困难。

差分进化算法

现在,让我们看看最早的启发式方法之一。历史上有很多启发式方法,我们特别选择差分进化算法,因为它相对简单且成功。对于大多数编程语言,你可以直接调用实现此算法的库。对于许多低维度的实际问题,差分进化算法可能足以解决你的问题。

差分进化是一种遗传算法。遗传算法是一个受自然进化启发的启发式方法领域,它遵循“适者生存”的原则:好的解有更高概率产生“后代”,通过混合产生新的变体,从而淘汰差的解,让好的解得以延续。

差分进化算法适用于具有少量不连续性或跳跃、维度较低的函数。通常,它需要边界约束,即定义域是一个高维“盒子”。

算法步骤如下:

  1. 初始化:在定义域内随机生成大量(例如数千个)试验解,构成初始种群。
  2. 变异:从种群中随机选择三个解 x, y, z,通过以下公式组合成一个新的变异解 v:
    v = z + F * (x - y)
    其中 F 是缩放因子。
  3. 交叉与选择:将变异解 v 与当前种群中的某个目标解进行交叉操作,生成试验解 u。如果 u 比目标解更好(函数值更小),则用 u 替换目标解。
  4. 迭代:重复步骤 2 和 3,直到满足终止条件(例如,所有解收敛到同一点)。

由于初始解是随机分布的,这实现了对解空间的探索。在更好的区域,变异解倾向于存活更久,从而逐渐收敛到某个最优解附近。

在 Julia 等语言中,有现成的实现库。你只需要输入你的优化函数和边界约束,无需提供梯度或海森矩阵信息,因此对于某些问题可能相当快。

利普希茨优化

现在,让我们看看另一种利用利普希茨常数信息的算法。假设我们事先知道函数的最大弯曲度(即利普希茨常数 L)。

我们可以为函数构造下界。在左侧图中,蓝线是我们想要优化的非凸函数。我们首先对函数进行两次评估(红点)。利用利普希茨常数 L,我们可以从这些评估点向下画出两条斜率为 ±L 的直线,形成一个“V”形下界。我们知道,函数的任何点都不可能位于这些绿色下界线的下方。

由于我们想要最小化函数,通过几何考虑,我们选择当前下界可能最低的点(即两个“V”形下界交点中最低的那个)作为下一个评估点。得到新评估点后,我们重新绘制利普希茨下界,并重复此过程。

这种方法在一维情况下效果非常好,但在更高维度上效果会变差,因为下界区域会变得复杂,追踪所有可能区域的计算成本也会增加。然而,总的来说,如果有利普希茨常数,这可能非常有效。

但是,它不适用于没有利普希茨常数的函数(例如 Griewank 函数),或者当你不知道常数时(例如,你的函数是一个复杂模拟器,难以进行数学分析)。你可以尝试估计利普希茨常数,但这可能很快变得棘手。

DIRECT 算法(无利普希茨常数的优化)

然而,利普希茨优化有一个缺点:通常,通过理论计算得到的利普希茨常数 L 会非常大,大于实际需要,也大于直观看到的函数弯曲度。这会导致优化过程退化为精细的网格搜索。

那么,当我们既不想使用启发式方法,又不知道利普希茨常数,或者理论常数太大时,我们该怎么办?

Jones 等人在 90 年代的一篇论文提出了解决方案:无利普希茨常数的利普希茨优化。其中提出的算法称为 DIRECT 算法(Dividing Rectangles,划分矩形),这在当时是思维上的一个重大改变。

DIRECT 算法的思路如下:

  1. 我们不再考虑单个评估点和从它们出发的下界,而是将整个解集视为不连续子区域的并集。
  2. 初始时,我们有一个由边界约束定义的大矩形(N 维超立方体)。这个矩形有一个中心点(我们在此评估函数值)和一个“半径”(中心点到矩形内任何点的最大距离)。
  3. 与利普希茨优化不同,DIRECT 算法将这个矩形划分成更小的子区域(例如,每次划分为 3 个子矩形)。
  4. 关键问题是:如何选择要划分的区域?如果我们知道利普希茨常数 L,我们可以计算每个区域的潜在下界(基于中心点函数值和半径),然后选择下界最小的区域进行划分。
  5. 由于我们不知道 L,DIRECT 采用了一种巧妙的方法。它将每个区域表示为一个点,其横坐标是区域的半径,纵坐标是中心点的函数值。通过几何分析,它可以找出对于任何可能的利普希茨常数 L,哪些区域可能包含当前最好的下界(这些点构成了一个帕累托前沿)。
  6. 算法同时划分所有这些“有潜力”的区域,然后在新产生的子区域上重复这个过程。

这样,DIRECT 算法实现了无需事先知道确切利普希茨常数的利普希茨型优化。该算法在许多软件包中都有提供,你可以直接调用并将其应用于你的优化问题,且无需导数信息。

总结

在本节课中,我们一起学习了非凸连续优化的挑战与方法。我们了解到,一般而言,非凸优化问题非常困难,存在指数级复杂度的挑战。然而,通过利用问题结构或使用启发式方法,我们仍然可以在实践中解决许多问题。

我们介绍了两种主要方法:

  1. 差分进化算法:一种受自然进化启发的、无需梯度信息的启发式全局优化方法,适用于低维、有边界约束的问题。
  2. 基于利普希茨性的方法
    • 利普希茨优化:在已知利普希茨常数时非常有效,尤其在一维情况下。
    • DIRECT 算法:无需已知利普希茨常数,通过智能地划分和选择搜索区域来进行优化,是一种更通用的无导数全局优化方法。

这些工具扩展了我们处理复杂、非凸优化问题的能力,是机器学习与工程优化工具箱中的重要组成部分。

040:随机优化 🎲

在本节课中,我们将要学习随机优化。在许多实际场景中,我们无法获得确定性的函数输出,因为评估过程本身可能包含噪声。本节将介绍两种处理此类问题的核心方法:贝叶斯优化和蒙特卡洛树搜索。

概述

上一节我们讨论了确定性函数的优化方法。本节中我们来看看当函数评估存在噪声时,应如何进行优化。随机优化方法允许我们在不确定或嘈杂的环境中寻找最优解,这在机器学习超参数调优和复杂游戏策略搜索中尤为重要。

贝叶斯优化

贝叶斯优化是应用高斯过程来优化噪声函数的一种方法。其核心思想是将我们对目标函数的“认知不确定性”和函数本身的“固有噪声”都建模为一个概率分布。

初始时,我们对函数 f(x) 一无所知,可以为其假设一个先验分布(例如高斯过程)。这个分布有一个均值函数(代表我们对函数值的“最佳猜测”)和一个方差(代表我们的“不确定程度”)。

# 概念性描述:高斯过程先验
# f(x) ~ GP(mean_function(x), kernel_function(x, x'))

通过在不同的输入点 x 评估函数,我们可以获得观测数据。每次评估都会更新我们的后验信念:在评估点附近,不确定性(方差)会减小,我们对函数形状的了解会更加精确。

贝叶斯优化的巧妙之处在于,它使用一个“采集函数”来智能地选择下一个评估点。该函数平衡了“利用”(在预测均值高的区域采样)和“探索”(在不确定性高的区域采样),以期望获得最大的信息增益或找到更优解。

以下是贝叶斯优化的典型步骤:

  1. 建立一个目标函数的高斯过程先验模型。
  2. 使用采集函数(如期望提升EI)选择下一个最有潜力的评估点 x_next
  3. x_next 处评估目标函数(可能得到带噪声的结果 y)。
  4. 将新数据 (x_next, y) 加入观测集,并更新高斯过程后验。
  5. 重复步骤2-4,直到达到预算或收敛。

一个广泛的应用是机器学习中的超参数优化。训练神经网络时,不同的超参数组合(如学习率、 dropout率)会产生不同的性能,但每次训练的结果都有随机性。贝叶斯优化可以高效地在这个嘈杂的搜索空间中找到接近最优的超参数设置。

蒙特卡洛树搜索

刚才我们介绍了在连续空间中的随机优化。现在,我们转向离散或组合设置下的随机优化方法——蒙特卡洛树搜索。该方法因在AlphaGo系统中击败世界围棋冠军而闻名。

MCTS用于模拟具有随机性或对抗性的序列决策过程,例如棋类游戏。它将可能的未来状态表示为一棵树,每个节点代表一个游戏状态,每条边代表一个可能的动作。

MCTS的一个主要优势是它只需要前向模拟,而不需要在树中进行昂贵的回溯。算法总是从根节点(初始状态)开始,模拟到终局,然后根据结果更新路径上节点的统计信息。

MCTS的核心是平衡探索(尝试访问次数少、潜力未知的节点)和利用(频繁访问当前估计价值高的节点)。这种平衡通过一个选择子节点的公式来实现,该公式受到切尔诺夫不等式的启发。

对于节点 i,其价值 Q(i) 通常由两部分组成:

Q(i) = R_i + c * sqrt( ln(N_parent) / N_i )

其中:

  • R_i 是从节点 i 开始所有模拟的平均奖励(利用项)。
  • c 是一个可调常数,控制探索程度。
  • N_parent 是父节点的访问次数。
  • N_i 是节点 i 本身的访问次数(探索项:访问越少,该项值越大)。

以下是MCTS的单次迭代过程:

  1. 选择:从根节点开始,使用上述公式递归地选择子节点,直到到达一个未完全展开的节点(即存在未模拟过的合法动作)。
  2. 扩展:为该节点添加一个或多个新的子节点(对应一个未尝试过的动作)。
  3. 模拟:从新节点开始,使用一个简单的默认策略(如随机策略)快速模拟直到游戏结束,得到一个结果(奖励)。
  4. 回溯:将模拟得到的奖励,沿着从新节点到根节点的路径反向传播,更新路径上所有节点的访问次数 N 和平均奖励 R

通过大量次数的迭代,MCTS能够逐渐将搜索重点集中在更有希望的游戏路径上,同时保持一定的探索性以避免陷入局部最优。AlphaGo的成功正在于将MCTS与神经网络结合:神经网络提供了更精准的初始价值评估和模拟策略,而MCTS则在此基础上进行深入的策略搜索和优化。

总结

本节课中我们一起学习了两种重要的随机优化方法。

  • 贝叶斯优化适用于连续参数空间的噪声函数优化,它利用高斯过程建模不确定性,并通过智能采样高效寻找最优解,常用于超参数调优。
  • 蒙特卡洛树搜索适用于离散序列决策问题,它通过重复的模拟、评估和回溯,在树结构中平衡探索与利用,是复杂游戏AI和序列规划中的强大工具。

这两种方法都展示了在面对不确定性时,通过概率模型和智能探索策略,我们仍然能够进行有效的优化。

posted @ 2026-03-26 12:32  布客飞龙IV  阅读(7)  评论(0)    收藏  举报