帝国理工机器学习数学多元微积分笔记-全-

帝国理工机器学习数学多元微积分笔记(全)

机器学习数学:多元微积分:P01:课程介绍与概述

欢迎来到多元微积分入门课程,这是机器学习数学专项课程的第二门课。我们将开启一次微积分的快速导览,特别侧重于交互式动画和实用的编程示例。

我是伦敦帝国理工学院戴森设计工程学院的 Sam Cooper 博士。我将机器学习作为工具,用于表征和设计能源材料。同时,我也是一位在线学习爱好者。

要理解多元微积分,你需要能够应用上一门课程中涵盖的线性代数方法。因此,如果你尚未完成该课程,可能需要先返回学习。

许多重要的机器学习方法,例如神经网络,其核心正是微积分。本课程的目标是让你看清数学原理与实际意义之间的联系。

理想的成果是,在你完成本专项课程后,能够有足够的信心立即投入到众多优秀的在线应用机器学习课程中去。

我们将通过建立直觉的动画来奠定微积分的基础,以此开始本课程。接着,我们会将这些概念推广到多维系统,你将学习如何在黑暗中“导航”山脉地形。

之后,你将具体学习微积分如何用于训练神经网络,并实际编写一些使用 Python 编程语言实现此过程的代码。

最后,你将与我的同事 David Dye 教授一起,运用你所有的多元微积分技能。他将解释回归的基本原理,然后要求你编写代码,将复杂函数拟合到真实数据中。

衷心希望你能享受这门课程,并期待在论坛中与你交流。

002:欢迎与课程概述

欢迎来到本课程的第一个模块。在本课程中,我们将介绍微积分中的一系列核心概念,这些概念对于学习机器学习至关重要。我们将从最基础的知识开始,但会较快地推进,最终在第五和第六模块中探讨一些有趣的应用。

课程结构与学习方法

本周,我们将重点学习微积分的基本理论,以及一些能够加速计算的实用法则。

在讲解过程中,我将尽可能使用图形化的方式来呈现概念。这样做的目的是让你能够“看到”推导过程,而不仅仅是阅读公式。有时,为了保持直观性,我们可能会略过一些细节。不过,我会提供更严谨描述的链接,供有兴趣深入学习的同学查阅。

就我个人而言,我坚信一个原则:如果我不能把一个概念画出来,那么即使我能写下所有相关方程,我也并未真正理解它。因此,在本课程的测试中,大部分题目将要求你在图形上识别解决方案,而非进行繁琐的代数运算。

总结

本节课中,我们一起了解了本课程的整体结构、学习目标以及以图形化理解为核心的教学方法。希望你能享受这第一个模块的学习过程,并期待在讨论区与大家交流。

003:函数基础

在本节课中,我们将要学习函数的基本概念,了解它在科学和机器学习中的核心作用,并熟悉其数学表示方法。理解函数是学习微积分的重要前提。

什么是函数?🤔

在深入探讨微积分之前,我们首先需要简要讨论一下函数是什么以及我们在何处使用它们。

本质上,函数是某些输入与一个输出之间的关系。例如,如果我有一个用于模拟这个房间温度分布的函数,我可能会输入我感兴趣的特定位置的 X、Y 和 Z 坐标,以及时间 T,然后该函数将返回我在那个特定空间点和那个时间点的温度。

数学符号的挑战与重要性 📝

与数学的许多领域一样,即使概念相当简单明了,符号表示也常常会使事情变得不必要的混乱。在本课程后面我们还会遇到这种情况。

造成这种情况的原因有时是相当随意的历史因素,比如不同的人在不同的时间发明了数学的不同部分。也可能是因为特定的符号风格对于其最初被开发的具体应用来说更为方便。

然而,许多问题似乎源于:为了使用和探索数学有趣的应用,需要你完成大量通常相当枯燥的基础工作。在这方面,数学语言就像学习任何其他语言一样。在学会大量法语词汇和语法(包括其所有的特例和不规则之处)之前,你无法欣赏法语诗歌。可以理解的是,有些人觉得这很令人沮丧。例如,我的法语仍然很糟糕。

更糟糕的是,大多数人甚至没有意识到,在这条代数隧道的尽头,有大量的诗歌在等待着他们。机器学习就是这类诗歌的整个流派,所以请在本专项课程的剩余部分坚持下去,你将准备好欣赏它,甚至自己创作一些。

函数的表示法 📐

我们经常看到诸如 f(x) = x² + 3 这样的表达式。关于这种表示法,唯一值得提一下的是:是的,我承认,你应该以某种方式就知道 f(x) 表示 fx 的函数,而不是 f 乘以 x,这确实有点荒谬。当表达式中出现其他括号项时,有时这会变得真正不清楚。

例如:f(x) = g(h(x) + a)。你可以假设 gha 都不是变量,否则我就必须写成 f(x, g, h, a)。但你只有通过更多上下文解释才能确切知道这里发生了什么。例如,g 是一个应用于 x 的函数吗?这里的 ha 呢?也许它们都只是常数。

不过,你在任何语言中都会面临同样缺少上下文的问题,就像那只著名的熊猫,它去了一家餐馆,吃了饭,开枪,然后离开。(译注:此处引用英文歧义笑话 “eats, shoots and leaves”,原意为“吃嫩芽和树叶”,但断句不同可理解为“吃了饭,开了枪,然后离开”。)它们都很美味。我只能代表数学道歉,并希望用两个事实来安慰你:首先,数学是我日常工作的核心,我自己也常常感到困惑。其次,我仍然热爱它,并且一直在变得更好,就像任何其他语言一样,总能获取缺失的上下文。

选择函数:科学的创造性本质 💡

在接下来的练习中,我将向你展示一些数据,或者向你描述一个概念。你需要选择一个你认为可以用来表示它的函数。

这并非一个困难的练习,但我希望你能理解的是:选择函数是科学的创造性精髓。这个选择候选函数或假说来模拟世界的过程,正是那些伟大的科学天才被人们铭记的原因。

随后是一个可能漫长而艰难的验证这个假说的过程,但如果没有最初那创造性的第一步,就没什么可验证的了。

微积分的作用 🔧

微积分简单地研究这些函数如何随其输入变量变化,它允许你研究和操作它们。但归根结底,它只是一套工具。到本课程结束时,你将亲自使用这些工具来模拟一些真实世界的数据。

总结 📚

本节课中我们一起学习了函数的基本定义,它作为输入与输出之间关系的核心思想。我们探讨了数学符号带来的挑战及其重要性,并认识到选择恰当的数学模型是科学探索中创造性的关键一步。最后,我们了解到微积分是分析和操作这些函数变化的工具集,为后续的深入学习奠定了基础。

004:上升与下降

在本节课中,我们将探索微积分的核心思想:如何描述一个函数与其变量变化之间的关系。我们将通过一个具体的例子——汽车的速度-时间图——来理解导数、加速度以及更高阶导数的概念。

上一节我们介绍了微积分是一套描述函数与变量变化关系的工具。本节中,我们来看看这个定义在具体例子中意味着什么,以及它为何有用。

让我们从一个经典例子开始:一辆汽车的速度与时间关系图。

这张图最明显的信息是汽车的速度并非恒定不变。因为恒定速度在图上会表现为一条平坦的水平线。此外,从零时刻的零速度开始,汽车的速度最初随时间增加,这也就是它在加速。在时间段的末尾,汽车速度显示为快速下降,这意味着它在减速。

这张图蕴含了大量信息,而微积分将允许我们从中提取比单纯速度更多的信息。

正如我们已经提到的,水平线意味着恒定速度。而线条向上倾斜得越陡,加速度就越大。事实上,加速度可以被定义为速度-时间图的局部梯度。显然,加速度本身也是时间的函数。

在我们的例子中,我们将单点处的梯度称为局部梯度。我们可以通过绘制切线来阐明这个概念。切线是一条在一点接触曲线的直线,并且在该点与曲线具有相同的梯度。

在初始加速之后,汽车的速度达到峰值,然后开始再次减速。减速具有负的斜率。

通过记录每个点处这些切线的斜率,我们可以绘制一个全新的图形,它将显示加速度与时间的关系,而不是速度与时间的关系。

在为这个复杂情况绘图之前,让我们先思考一下,对于一辆以恒定速度行驶的汽车,其加速度-时间图会是什么样子。

恒定速度意味着在速度-时间图上我们得到一条平坦的水平线。那么我们可以说它的梯度当然是 0。因此加速度-时间图也将只是一条水平线,但此时加速度等于 0

回到我们更复杂的图形,在尝试绘制之前,先讨论一下我们预期会看到什么。最初,梯度为正且相当恒定,但在峰值处下降到零。随后它在一段时间内变为负值,最后又回到零。

现在让我们看一下叠加在速度-时间图上的加速度与时间关系图。请注意,蓝线的纵轴是速度,单位是距离/时间;而橙线的纵轴是加速度,单位是距离/时间²。因为它们单位不同,我们可以垂直缩放这两条线中的任意一条,其含义仍然相同。不过,图中已对它们进行了缩放,以充分利用可用的绘图区域。

你可以看到,加速度函数为零的点(即它与水平轴相交的点)恰好与速度-时间曲线平坦且梯度为零的点重合,正如我们所预期的那样。

尽管我们将在后续视频中讨论导数的正式定义,但我们刚才所做的正是微积分的精髓:我们取一个连续函数,并通过构造一个新函数(即它的导数)来描述其在每一点的斜率。

原则上,我们可以遵循相同的步骤绘制加速度函数的导数,即简单地取加速度函数在每个点的斜率。这是加速度的变化率,我们也可以将其视为速度的二阶导数,它实际上被称为汽车的加加速度(或急动度)。可以想象汽车在停止和启动时的那种颠簸运动。

你可能以前从未听说过这个概念,但希望仅仅通过告诉你它是加速度曲线的导数,就足以让你大致勾勒出加加速度的图形。

同样非常有趣的是,考虑我们的基线速度函数,并尝试想象这个函数会是哪个函数的梯度,即应用与我们刚才讨论的过程相反的步骤。我们可以将其称为反导数。对于学过微积分的人来说,你可能记得它与被称为积分的东西密切相关。

对于我们正在讨论的这个例子,它将代表汽车距其起点的距离。当你考虑到距离随时间的变化率(即距离-时间图的斜率,也就是单位时间内覆盖的距离)就是速度时,这一点应该更容易理解。

以上就是本视频要讨论的所有分析内容。尽管你还没有学习微积分的正式定义,但你应该已经能够回答接下来练习中的许多梯度类型问题。这将为你开始更正式地思考微分奠定非常坚实的基础。

本节课总结:我们一起学习了如何通过速度-时间图直观理解导数(梯度)的概念。我们看到了加速度是速度的一阶导数,而加加速度(急动度)是加速度的导数,即速度的二阶导数。同时,我们也简要提到了反导数(积分)与距离概念的联系。这些是理解变化率的核心思想。

005:导数的定义

概述

在本节课中,我们将学习导数的正式定义。我们将从直观的“斜率”概念出发,将其转化为精确的数学表达式,并通过几个例子来演示如何使用这个定义计算简单函数的导数。


上一节我们探讨了函数与其斜率(梯度)之间的关系。本节中,我们来看看如何用数学语言正式地定义导数。

我们将把上一节视频中关于斜率的直观理解,转化为可以写下来的数学符号。很多人觉得这部分内容难以理解,我们会尽力让它变得清晰易懂。

我们在上一节提到,水平线的斜率为零,而向上和向下倾斜的线分别具有正斜率或负斜率。我们可以通过线性函数的例子来写下这个概念的定义,因为线性函数上每一点的斜率都相同。

首先,我们任意选择两个点。假设选这里和这里。那么,这条线的斜率等于函数在这段区间内的增量,除以我们所考虑的区间的长度。这个描述通常被简化为“上升量比前进量”,其中“上升量”是垂直方向的增加量,“前进量”是沿水平轴的距离。

所以,上升量在这里,前进量在这里。如果我们的函数是向下倾斜的,并且我们在相同的水平位置选点,那么我们的“前进量”相同,但“上升量”会变成负数。因此,我们的斜率等于上升量除以前进量。

到目前为止都很简单。但这与我们之前看到的更复杂的函数(每一点的斜率都不同)有什么关系呢?现在,这种“上升量比前进量”的斜率会随着我们选择点的位置而变化。

让我们选择一个我们想知道斜率的点,假设它在水平轴上的点 x 处。函数在这一点的值显然是 f(x)。我们将使用与之前相同的逻辑,所以现在需要选择第二个点来绘制我们的“上升量比前进量”三角形。

我们可以称两点之间的水平距离为 Δx。像往常一样,Δ 用来表示某个量的微小变化。这意味着我们的第二个点必须在位置 x + Δx 处。

我们也可以将第二个点的垂直位置写为函数 f 在新位置 x + Δx 处的值,即 f(x + Δx)。因此,我们现在可以基于点 x 和任意第二个点之间的“上升量比前进量”斜率,构建一个在点 x 处近似斜率的表达式。记住,“前进量”是我们的距离 Δx,而“上升量”只是两点的高度差。

这个过程的最后一步是注意到,对于我们展示的这种光滑、连续的函数,当 Δx 变得越来越小时,连接两点的线会越来越接近点 x 处的实际斜率。

我们可以使用极限符号来正式表达这个概念。它表示当 Δx 趋近于 0 时,我们的表达式将给出我们在任意选定点处的斜率函数。我们将其写为 f'(x)df/dx,取决于你更喜欢哪种符号体系。这是一个有点奇怪的概念,因为我们并不是在谈论 Δx 等于 0(除以 0 没有定义),而是指当 Δx 无限接近 0 时的情况。这种“极端”的上升量比前进量的过程就是微分。所以,当你被要求对一个函数求导时,字面意思就是将函数代入这个表达式。

我们可以用几个视频来更严谨地解释这个无限小但非零的 Δx,但现在,不必过于担心。我们已经掌握了足够的知识来继续我们的旅程。

现在让我们将新的导数表达式付诸实践,看看它是否有效。首先,我们应该再次在线性函数上尝试,因为我们知道答案将只是一个常数。

示例 1:线性函数

那么,函数 f(x) = 3x + 2 的斜率是多少?

我们可以立即将其代入表达式:
f'(x) = lim (Δx -> 0) of [ (3(x + Δx) + 2) - (3x + 2) ] / Δx

现在进行代数运算:
= lim (Δx -> 0) of [ (3x + 3Δx + 2) - (3x + 2) ] / Δx
= lim (Δx -> 0) of [ 3x + 3Δx + 2 - 3x - 2 ] / Δx
= lim (Δx -> 0) of [ 3Δx ] / Δx
= lim (Δx -> 0) of 3
= 3

我们线性函数的斜率只是一个常数,正如我们所料。事实上,很多人可能已经知道形如 f(x) = ax + b 的方程的斜率就是 a,但看到这个结果从我们的表达式中出现还是令人安心的。

从这个简单例子中得到的另一个收获是,我们实际上同时微分了两部分:3x 部分和 +2 部分。我们可以分别对它们求导,然后将结果相加,仍然会得到相同的结果。这种方法的可互换性称为和法则,它非常方便。

示例 2:二次函数

现在让我们尝试一个稍微复杂一点的例子。取函数 f(x) = 5x²

我们要做的就是把这个函数代入我们顶部的微分表达式:
f'(x) = lim (Δx -> 0) of [ 5(x + Δx)² - 5x² ] / Δx

现在进行代数运算:
= lim (Δx -> 0) of [ 5(x² + 2xΔx + Δx²) - 5x² ] / Δx
= lim (Δx -> 0) of [ 5x² + 10xΔx + 5Δx² - 5x² ] / Δx
= lim (Δx -> 0) of [ 10xΔx + 5Δx² ] / Δx
= lim (Δx -> 0) of 10x + 5Δx
= 10x

因此,表达式 5x² 的导数就是 10x

我们可以将这个例子中的经验推广为处理 x 的幂次函数的规则。例如,如果我们取函数 f(x) = a * x^b 并将其代入我们的微分表达式,我们会发现导数总是:
f'(x) = a * b * x^(b-1)

原来的指数被乘到前面,然后新的指数比原来少 1。这被称为幂法则。你可以把它和之前看到的和法则一起放入你的微积分工具箱中。

总结

本节课中,我们一起学习了导数的正式定义,它源于“上升量比前进量”的极限概念。我们应用这个定义计算了线性函数 f(x) = 3x + 2 和二次函数 f(x) = 5x² 的导数,并从中引出了和法则幂法则这两个重要的求导规则。你已经看到,对于复杂的表达式,直接使用极限定义求导会非常繁琐。在后续课程中,我们将看到更多像和法则与幂法则这样的规则,它们将帮助我们加快求导过程。然而,在此之前,我们将先看一些具有特殊性质的函数,它们的导数形式很有趣。

006:特殊情况

在本节课程中,我们将学习三个特殊的函数案例。当我们对它们进行微分时,会得到有趣的结果。理解这些特殊情况对于掌握微积分的核心概念至关重要。

示例一:函数 f(x) = 1/x

首先,我们来看函数 f(x) = 1/x。观察其图像可以发现,除了在 x = 0 这个点,函数在所有地方的梯度都是负的。在 x = 0 处,函数值本身是未定义的,因为除以零的操作没有意义,这导致函数在此处不连续。那么,它的梯度情况如何呢?让我们通过微分表达式来探究。

我们将函数代入微分定义式:

f'(x) = lim (Δx→0) [ (1/(x+Δx) - 1/x) / Δx ]

为了计算这个极限,我们需要合并分子中的两个分数。以下是计算步骤:

  1. 首先,将分子中的两个分数通分。
  2. 合并后,分子变为 -Δx,分母为 x(x+Δx)
  3. 此时,整个表达式为 [-Δx / x(x+Δx)] / Δx
  4. 分子和分母中的 Δx 可以相互抵消。
  5. 我们得到:f'(x) = lim (Δx→0) [ -1 / (x² + xΔx) ]
  6. Δx 趋近于0时,xΔx 项变得极小,可以忽略。因此,最终导数为:

f'(x) = -1 / x²

这个导数函数同样是负的,并且在 x = 0 处没有定义。

示例二:指数函数 f(x) = e^x

上一节我们探讨了倒数函数的微分,本节中我们来看看一个性质独特的函数。这个函数有一个特殊的性质:函数值 f(x) 始终等于其自身的梯度值 f'(x)

当然,有一个平凡的函数满足此性质:f(x) = 0。但还有一个更有趣的非平凡解。通过分析可知,满足此性质的函数必须始终为正或始终为负,并且是单调的。唯一满足所有这些条件的函数就是指数函数 e^x,其中 e 是欧拉数(约等于2.718)。

e^x 求导,结果仍然是 e^x

d/dx (e^x) = e^x

这意味着我们可以无限次地对它进行微分,结果永远不变。这种自相似性在数学和科学中非常有用。

示例三:三角函数 sin(x) 与 cos(x)

最后,我们来讨论三角函数。你可能还记得,在直角三角形中,sin(x) 代表对边与斜边的比值。它的图像是一个波浪形。

观察 sin(x) 的图像,我们可以推断其导数的大致形状:它从正梯度开始,逐渐减小到波峰处的0,然后变为负梯度,直到下一个波谷。事实上,sin(x) 的导数正是 cos(x)

d/dx (sin(x)) = cos(x)

那么,对 cos(x) 求导会得到什么呢?结果是 -sin(x)

d/dx (cos(x)) = -sin(x)

如果继续微分下去:

  • 第三次微分得到 -cos(x)
  • 第四次微分则神奇地回到了起点 sin(x)

这种循环模式与指数函数 e^x 的自相似性有内在联系,因为三角函数本质上是指数函数在复数域的一种表现形式。

总结与前瞻

本节课中,我们一起学习了三个微分中的特殊函数案例:

  1. f(x) = 1/x,其导数为 -1/x²,两者在 x=0 处均未定义。
  2. f(x) = e^x,这是一个其导数等于自身的函数。
  3. sin(x)cos(x),它们的导数以四步为一个循环。

需要明确的是,微分的核心概念始终是寻找每一点上“上升比平移”的梯度,即使代数运算有时会显得复杂。

这种实用的微积分观点在我们接下来开始讨论用计算机计算梯度时会再次出现。有时我们可以像目前所有示例一样,找到一个完美的梯度方程。然而,如果我们面对的不是光滑的函数,而只是一系列离散的数据点,似乎就无从微分了。但正如我们将要看到的,我们最根本的“上升比平移”概念将再次发挥作用,帮助我们解决问题。

007:乘积法则

在本节课中,我们将要学习一个用于求导的便捷法则——乘积法则。它可以帮助我们轻松地计算两个函数乘积的导数,而无需每次都使用极限定义。

上一节我们介绍了导数的定义以及求和法则、幂法则。本节中我们来看看如何处理两个函数相乘的情况。

乘积法则的直观理解

虽然可以从代数上推导乘积法则,但直观的理解更有助于我们掌握其本质。让我们通过一个几何例子来建立直觉。

想象一个矩形,其一边的长度是函数 f(x),另一边的长度是函数 g(x)。那么,这两个函数的乘积 f(x) * g(x) 就给出了矩形的面积,我们称之为 A(x)

当我们对 f(x) * g(x) 求导时,我们实际上是在寻找当 x 变化时,矩形面积 A(x) 的变化率。

现在,让我们看看当 x 增加一个微小量 Δx 时,面积会发生什么变化。矩形的长和宽分别变为 f(x+Δx)g(x+Δx)

我们可以将新的矩形划分为四个区域,其中一个是原始面积 A(x)。新增的面积 ΔA 由三个新矩形的面积之和构成。

以下是新增面积 ΔA 的构成:

  • 一个面积为 f(x) * Δg 的矩形(其中 Δg = g(x+Δx) - g(x))。
  • 一个面积为 g(x) * Δf 的矩形(其中 Δf = f(x+Δx) - f(x))。
  • 一个面积为 Δf * Δg 的小矩形。

Δx 趋近于 0 时,所有新矩形都会缩小,但最小的那个矩形 Δf * Δg 会以最快的速度趋近于 0。因此,在求导的极限过程中,我们可以忽略这个小矩形的贡献。

推导乘积法则

基于上述直观理解,我们现在来正式推导乘积法则。

我们想要求 A(x) 关于 x 的导数,即 dA/dx。这等于 ΔA/ΔxΔx 趋近于 0 时的极限。

根据前面的分析,ΔA 近似等于 f(x) * Δg + g(x) * Δf。因此,我们有:

ΔA/Δx ≈ [f(x) * Δg + g(x) * Δf] / Δx

将右边的式子拆分为两个分数:

ΔA/Δx ≈ f(x) * (Δg/Δx) + g(x) * (Δf/Δx)

现在,当 Δx 趋近于 0 时:

  • Δg/Δx 的极限就是 g(x) 的导数,记作 g'(x)dg/dx
  • Δf/Δx 的极限就是 f(x) 的导数,记作 f'(x)df/dx

于是,我们得到了乘积法则的最终表达式:

d/dx [f(x) * g(x)] = f(x) * g'(x) + g(x) * f'(x)

乘积法则总结

本节课中我们一起学习了乘积法则。这个法则为我们提供了一个强大的工具,可以轻松计算两个函数乘积的导数,而无需每次都回到极限定义。

其核心公式是:

若 h(x) = f(x) * g(x),则 h'(x) = f(x) * g'(x) + g(x) * f'(x)

这个法则将在后续处理更复杂函数时变得非常有用。

008:链式法则

在本节课中,我们将要学习本模块的第四个,也是最后一个核心工具——链式法则。在此之前,我们已经学习了求和法则、幂法则和乘积法则。掌握链式法则后,我们的工具箱将足够完备,可以开始处理更复杂、更有趣的问题了。

嵌套函数的概念

有时,我们会将一个函数作为另一个函数的输入。可以想象,描述这种情况可能会有点令人困惑。因此,我们将为每个函数赋予具体的含义,以便更好地理解整个过程。

考虑一个嵌套函数 H(P(M))。这里,函数 H 描述了我的快乐程度,它是关于 P(我当天吃的披萨数量)的函数。而我每天能吃的披萨数量 P,本身又是关于 M(我赚的钱)的函数。

所以,我们最终仍然是将金钱与快乐联系起来,但中间通过“披萨”这个概念来连接。这种嵌套函数的情景在科学和工程中经常出现,用于将一系列概念串联起来。我选择的这个例子,或许也让你了解了我生活中的一些优先事项。

定义我们的函数

首先,我来给出快乐与披萨之间的函数关系,它具有以下多项式形式:

H(p) = - (1/3)p² + p + 1/5

通过绘制函数图像,可以很容易理解它。我们可以看到,虽然在没有披萨的情况下,原则上仍然可能快乐,但我的快乐峰值出现在大约1.5个披萨时。超过这个数量,我的快乐感就会下降;超过大约3个披萨,我的快乐感会迅速变为负值。

接下来是披萨与金钱之间的函数关系:

P(M) = eᴹ - 1

通过观察图像,这个函数也相当直观:如果你没有钱,你就买不到任何披萨;但你拥有的钱越多,你购买披萨的能力就呈指数增长。起初,你可以利用批量折扣;当你变得非常富有时,你可以购买自己的披萨烤箱,甚至建造自己的披萨工厂。

问题的核心:快乐对金钱的变化率

我们想知道的是:考虑到我目前拥有的金钱,如果我的目标是变得快乐,我应该付出多少努力去赚更多的钱?要解决这个问题,我们需要知道快乐相对于金钱的变化率,也就是 dH/dM

对于这个相对简单的例子,我们可以直接将披萨-金钱函数 P(M) 代入快乐-披萨函数 H(p) 中,得到复合函数 H(P(M)),然后直接对这个复合函数进行微分。

然而,链式法则为我们提供了一种更优雅的方法。重要的是,即使对于复杂的函数,直接代入可能不可行,链式法则仍然有效。

链式法则的引入与理解

考虑 HP 的导数 dH/dP,以及 PM 的导数 dP/dM

你会注意到,在这种将导数表示为商的特定符号约定下,这两个量的乘积看起来正好会给出我们想要的函数 dH/dM

事实上,这是一种非常合理的思考方式。这种方法被称为链式法则,因为在某种意义上,我们正在建立导数关系的链条。这虽然不能算作一个正式的推导,但已经足够让你有效地使用链式法则了。

应用链式法则

现在,让我们将这个法则应用到我们的函数上。

首先,分别对两个函数求导:

  • dH/dP = 1 - (2/3)P
  • dP/dM = eᴹ

然后将它们相乘很简单。不过,我们需要记住,如果我们不希望披萨 P 出现在最终的表达式中,那么我们需要将 PM 表示的表达式代入。

以下是计算步骤:

  1. 计算导数乘积:dH/dM = (dH/dP) * (dP/dM) = [1 - (2/3)P] * eᴹ
  2. 代入 P = eᴹ - 1dH/dM = [1 - (2/3)(eᴹ - 1)] * eᴹ
  3. 整理项:dH/dM = eᴹ - (2/3)eᴹ(eᴹ - 1) = eᴹ - (2/3)e²ᴹ + (2/3)eᴹ
  4. 合并同类项:dH/dM = (5/3)eᴹ - (2/3)e²ᴹ
  5. 提取公因子:dH/dM = (1/3)eᴹ (5 - 2eᴹ)

最终,我们得到了视频开始时看到的表达式:

dH/dM = (1/3)eᴹ (5 - 2eᴹ)

链式法则的意义与图像分析

至此,我们完成了计算。不要忘记,对于这个简单的例子,与先代入再微分相比,链式法则并没有为我们节省大量时间,但不要被此迷惑。链式法则的神奇之处在于,对于一些实际应用,我们可能没有函数的解析表达式,但我们可能仍然拥有其导数。因此,能够简单地使用链式法则将它们组合起来就变得非常强大。

在结束之前,让我们快速看一下我们的金钱-快乐函数及其导数在图像上的表现。

如图所示,如果你身无分文,赚钱确实非常值得;但获得更多钱的收益(尤其是在你已经有足够披萨之后)会急剧下降,并迅速变为负值。

总结

本节课中,我们一起学习了本模块的第四个也是最后一个工具——链式法则。我们了解了嵌套函数的概念,学习了如何通过将中间变量的导数相乘,来求复合函数关于最终自变量的导数。链式法则在处理复杂函数关系时尤为强大。现在,我们的工具箱已经完备,在下一个视频中,我们将通过一个例子综合运用所有这些法则。

009:驯服野兽

在本节课中,我们将学习如何运用已掌握的四条求导法则,对一个看起来复杂的函数进行求导。这个函数本身不描述任何熟悉的事物,因此我们将完全依赖数学工具来解决问题。希望通过这个例子,你能获得信心去应对后续练习中的问题。

问题概述

考虑一个看起来相当复杂的函数:
F(x) = sin(2x⁵ + 3x) / e⁷ˣ

求导的核心思想——和、积、链式法则——在于将函数分解成易于处理的部分。因此,我们首先要做的是分解这个函数。

第一步:将分式改写为乘积

虽然函数当前以分式形式表达,但我们可以通过将分母移至分子并赋予其-1次幂,将其重写为一个乘积:
F(x) = sin(2x⁵ + 3x) * e⁻⁷ˣ

这里我们没有使用专门的“商法则”,因为你可以通过将分式转化为乘积来避免记忆额外的公式。

接下来,我们将F(x)拆分为乘积的两个部分,并分别对它们求导,以便稍后应用乘积法则。

第二步:对第一部分 G(x) 求导

第一部分是 G(x) = sin(2x⁵ + 3x)。这是一个三角函数作用于多项式,是应用链式法则的典型场景。

以下是应用链式法则的步骤:

  1. 将函数拆分为两个部分:

    • 外层函数:G(u) = sin(u)
    • 内层函数:u(x) = 2x⁵ + 3x
  2. 分别求导:

    • G'(u) = cos(u)
    • u'(x) = 10x⁴ + 3 (应用了幂法则与和法则)
  3. 应用链式法则组合:

    • dG/dx = (dG/du) * (du/dx) = cos(u) * (10x⁴ + 3)
  4. 将 u 代回原表达式:

    • G'(x) = cos(2x⁵ + 3x) * (10x⁴ + 3)

至此,我们已经完成了对G(x)的求导,并用到了链式法则、和法则与幂法则。

第三步:对第二部分 H(x) 求导

第二部分是 H(x) = e⁻⁷ˣ。这同样需要应用链式法则。

以下是具体步骤:

  1. 将函数拆分为两个部分:

    • 外层函数:H(v) = eᵛ
    • 内层函数:v(x) = -7x
  2. 分别求导:

    • H'(v) = eᵛ
    • v'(x) = -7
  3. 应用链式法则组合:

    • dH/dx = (dH/dv) * (dv/dx) = eᵛ * (-7)
  4. 将 v 代回原表达式:

    • H'(x) = -7 * e⁻⁷ˣ

现在,我们得到了乘积两部分各自的导数表达式。

第四步:应用乘积法则

我们已经有了 F(x) = G(x) * H(x),以及它们的导数 G'(x)H'(x)。现在可以应用乘积法则来得到最终答案。

乘积法则公式为:(u*v)’ = u’v + uv’

将其应用于我们的函数:
F'(x) = G'(x) * H(x) + G(x) * H'(x)

代入我们求得的表达式:
F'(x) = [cos(2x⁵ + 3x) * (10x⁴ + 3)] * [e⁻⁷ˣ] + [sin(2x⁵ + 3x)] * [-7 * e⁻⁷ˣ]

可以提取公因子 e⁻⁷ˣ 进行整理:
F'(x) = e⁻⁷ˣ * [ (10x⁴ + 3) * cos(2x⁵ + 3x) - 7 * sin(2x⁵ + 3x) ]

总结与思考

本节课中,我们一起学习了如何综合运用求导法则来驯服一个看似复杂的函数。我们首先将分式转化为乘积,然后对两部分分别应用链式法则求导,最后使用乘积法则组合得到最终结果。

在微积分中,像我们刚才处理的这种起初看起来很可怕的函数,只要掌握了正确的工具(分解与组合的法则),往往很容易被驯服。反之,一些看似简单的函数偶尔也会变成“野兽”,但这正是学习的乐趣所在。

程序员界有一句名言:“过早优化是万恶之源。” 在数学推导中也同样适用:在确定自己已经完成所有核心步骤之前,不要过早地花费大量时间去整理和美化表达式。

希望你能跟上这个例子,并有信心将我们学到的四条法则应用到其他问题中。祝你狩猎愉快!😊

010:模块一总结与展望

在本节课中,我们将总结模块一的核心内容,并展望后续课程的学习方向。

模块一的学习到此结束。希望熟悉高中数学的学员能通过本模块进行有效的复习。对于微积分的新学员,祝贺你们坚持完成了第一个模块的学习。

在接下来的课程中,我们将把对函数的分析扩展到多元系统,并将微积分应用于一些有趣的数据分析问题。

然而,我们在本模块中学到的基本思想,例如 lim (Δy/Δx) 这一核心运算,将贯穿我们后续的所有学习内容。

因此,如果你对目前的学习感到满意,那么你已经具备了顺利完成后续课程的坚实基础。

我们模块二再见。😊


总结:本节课中我们一起学习了模块一的结束语,明确了极限变化率等核心概念是后续多元微积分与机器学习应用的基础,并对下一模块的学习内容进行了展望。

011:欢迎来到模块2 🎉

在本模块中,我们将学习多元微积分。我们将把梯度的概念推广到多变量系统,并学习如何运用微积分在高维空间中导航。

欢迎来到本微积分课程的模块2。正如我在第一个模块结束时提到的,如果你已经理解了微分的核心概念,那么从这里开始,我们所增加的内容在很大程度上都将是这个核心思想的延伸,以及一些有趣的应用。

本课程的标题是“多元微积分”。因此,你将不会感到意外,我们现在要将梯度的概念推广到多变量系统。“多变量”和“多元”这两个词通常可以互换使用,在本模块中我无疑会同时使用它们。然而,这两个术语之间存在一个细微差别,这涉及到是存在多个输入变量、多个输出变量,还是两者兼有。但对于我们在此学习的微积分而言,这个区别并不关键,我们可以将其留给统计学家去仔细推敲。

现在,有了多于一个的变量可供操作,我们将能够运用微积分来帮助我们在高维空间中导航。希望在本模块结束时,我们能找到一些“宝藏”。

那么,我们开始吧。

机器学习数学:多元微积分:P12:变量、常量与上下文

在本节课中,我们将学习多元微积分的基础。我们将从理解变量与常量的概念开始,并探讨它们如何依赖于问题的上下文。接着,我们将学习如何对包含多个变量的函数进行求导,这个过程被称为偏微分


在第一模块中,我们首先建立了导数与函数在每个点处梯度的直观联系。

随后,我们介绍了四个实用法则来加速求导过程。

然而,之前我们研究的所有例子都只涉及单一变量。

现在,我们需要探讨当我们将相同的概念应用于包含多个变量的系统(即多元系统)时会发生什么。

但在开始之前,我们首先需要讨论什么是变量。

之前,我们展示过一些问题的例子,其中一个变量是另一个变量的函数,即 Y = f(X)

但反之则不一定成立,例如,不能说 X = g(Y)

以车辆速度为例,速度显然是时间的函数,因为在每个特定时刻,车辆只能有一个速度。

然而,我们不能说时间是速度的函数,因为车辆可能在不同的时刻以相同的速度行驶。

因此,我们通常将速度称为因变量,因为它依赖于时间。在这个特定上下文中,时间可以被视为自变量

通常,在初次学习微积分时,你会处理包含变量和常量的函数,然后对因变量(如速度)关于自变量(如时间)进行求导。

然而,什么被标记为常量或变量可能比想象中更微妙,这需要你理解所描述问题的上下文。

让我们继续使用汽车的示例来探讨这一点。

考虑以下高度简化的表达式,它将汽车引擎产生的力 F 与其质量 M、加速度 A、空气阻力 D 和速度 V 联系起来。

如果你在驾驶汽车,你可以通过踩油门踏板来调整力,从而改变速度和加速度。

但质量和阻力是汽车设计的固定特性。

这意味着,我们会将力称为自变量,因为你直接控制它;而速度和加速度则是因变量,因为它们是你所施加力的结果。

在此上下文中,你的质量和阻力系数显然是常量

然而,如果你是一名汽车设计师,正在为新车队设计每个发动机的尺寸,也许你的市场调研已经给出了特定的加速度和速度目标。

那么在此上下文中,力仍然是自变量,但速度和加速度现在成了常量,而质量和阻力则变成了变量,你可以通过重新设计汽车来调整它们。

我们将这些容易混淆的、可调整的设计常量称为参数。我们通常认为调整它们是在探索一系列相似的函数,而非将它们本身视为变量。但这主要是工程上的区分,数学家通常不会为此困扰。

在本课程后面你将看到,当我们用函数拟合数据时,正是通过调整拟合函数的参数来寻找最佳拟合,这意味着我们需要对这些参数进行求导。

这其中仍有逻辑可循,但我的建议是不要过于担心。这里的关键要点是,原则上,你可以对任何项关于任何其他项进行求导。所以,当原本你认为的常量突然开始变化时,不要感到意外。


现在让我们看一个不同的例子。假设你想制造一个金属罐,因此需要理解各个关键设计参数之间的关系。

我们可以首先通过分解面积来为罐子的空质量 M 写出一个合理的近似公式。

顶面和底面的圆形面积各为 πR²

当我们展开罐身时,得到一个矩形,其宽度必须等于圆的周长,即 2πR,我们称高度为 H

取这些面积并乘以厚度 T,我们得到罐子中金属的总体积。最后,将其乘以金属的密度 ρ,就得到其质量。

因此,我们可以说质量 M 等于这两个小圆的面积(πR² × 2)加上中间矩形的面积(周长 2πR 乘以高度 H)。这两部分都将乘以厚度 T 和密度 ρ

我将其写成这种展开形式是为了方便后续计算。在这一点上,我们应该将什么标记为常量或变量呢?除了 π(在这个宇宙中绝对是常量)之外,其他都不完全明确。

原则上,我们可以改变半径、高度、壁厚,甚至材料的密度。那么,让我们来求罐子质量关于其中每一个量的导数。

计算这些导数时,我们只需在关于某个特定变量求导时,将其他所有变量视为常量。

从一个简单的开始,尝试对 H 求导。所以 ∂M/∂H 将等于 2πRTρ

因为第一项不包含变量 H,并且我们将所有其他项视为常量,就像上一模块一样,常量求导结果为零,因此我们忽略它。而对于第二项,它包含 H,并且只是乘以了一些常量,所以求导后只剩下这些常量。

从这个表达式可以看出,关于 H 的偏导数甚至不再包含 H,这是可以预期的,因为当其他条件保持不变时,质量将随高度线性变化。

请注意,我们不再使用上一模块中求导时使用的普通符号 d,而必须使用花体的偏微分符号 ,这表示你对一个多变量函数进行了求导。

现在让我们求关于其他变量的偏导数,从 R 开始。

∂M/∂R 将等于:这里有一个 项,求导得 2R,所以是 4πRTρ;而这一项只包含一个 R,所以 R 消失后得到 2πHTρ

接下来,我们对变量 T 求导。∂M/∂T 将等于:这里只有一个 T,所以很简单,是 2πR²ρ + 2πRHρ

最后,只剩下 ρ 了。所以 ∂M/∂ρ 将等于 2πR²T + 2πRHT

尽管这是一个相当简单的例子,但偏微分基本上就是这样了。它并不比我们在上一模块遇到的单变量微积分更复杂,唯一的区别是,在进行每次求导时,你必须仔细注意哪些量被视为保持不变。


我希望这个关于多元微积分的简短介绍能帮助你认识到,这个概念并不可怕。偏微分本质上就是将一个多维问题,在分别考虑每个变量时,假装它只是一个标准的一维问题。

我期待在本模块后续内容中,向你展示我们可以用这个概念来做的一些非常了不起的事情。到时见。

013:偏微分与全微分

在本节课中,我们将学习更复杂的偏微分计算,并引入一个重要的新概念——全微分。我们将通过一个具体的例子,逐步掌握如何对多变量函数求偏导,以及当所有变量都依赖于另一个参数时,如何计算总导数。

回顾与引入

上一节我们介绍了偏微分的基本思想,即将其视为单变量微分方法的简单扩展。本节中,我们将探索一些更复杂的偏微分例子,并构建一个称为函数全微分的工具。

让我们直接从一个比上次更复杂的问题开始。

复杂函数的偏微分

考虑一个三元函数:
F(x, y, z) = sin(x) * e^(y * z^2)

我们将分别求出该函数对每个变量 x, y, z 的偏导数。

x 求偏导

由于指数项 e^(y * z^2) 不包含 x,我们可以将其视为常数。同时,我们知道 sin(x) 的导数是 cos(x)

因此,对 x 的偏导数为:
∂F/∂x = cos(x) * e^(y * z^2)

y 求偏导

此时,sin(x) 项不包含 y,可视为常数。对于指数项 e^(y * z^2),我们可以应用链式法则,或者记住指数函数求导的结果是乘以指数内部的导数。

指数 y * z^2y 的导数是 z^2

因此,对 y 的偏导数为:
∂F/∂y = sin(x) * e^(y * z^2) * z^2

z 求偏导

同样,只有指数项包含 z。类似于对 y 求导,我们只需乘以指数对 z 的导数。

指数 y * z^2z 的导数是 2 * y * z

因此,对 z 的偏导数为:
∂F/∂z = sin(x) * e^(y * z^2) * 2 * y * z

引入全微分

现在我们已经得到了三个偏导数,接下来引入一个新概念:全微分

想象一下,如果变量 x, y, z 本身都是另一个参数 t 的函数,具体关系如下:
x = t - 1
y = t^2
z = 1 / t

我们想要求的是函数 Ft 的导数 dF/dt

方法一:直接代入法

一种简单的方法是直接将 x, y, zt 表示,代入原函数 F,然后对 t 直接求导。经过化简,我们可以得到结果 sin(t-1) * e

然而,在更复杂的场景中,如果变量很多,需要微分的表达式可能会变得异常复杂,甚至可能没有简洁的解析表达式。

方法二:链式法则(全微分)

另一种方法是利用链式法则的逻辑来解决这个问题。函数 Ft 的总导数,等于 F 对每个中间变量的偏导数,乘以该中间变量对 t 的导数,然后求和。

全微分的公式如下:
dF/dt = (∂F/∂x)*(dx/dt) + (∂F/∂y)*(dy/dt) + (∂F/∂z)*(dz/dt)

我们已经有了 Fx, y, z 的偏导数。现在只需要求出 x, y, z 各自对 t 的导数。

以下是各变量的导数:
dx/dt = 1
dy/dt = 2t
dz/dt = -t^(-2) (因为 z = 1/t = t^(-1)

现在,将所有项代入全微分公式。最初的表达式看起来会有些复杂,但将 x, y, z 全部用 t 表示并化简后,你会发现第二项和第三项完全相同,只是符号相反,因此它们会相互抵消。

最终,我们得到了与直接代入法完全相同的结果:sin(t-1) * e

总结与展望

本节课中,我们一起学习了如何处理更复杂的多变量函数偏微分,并掌握了全微分这一强大工具。全微分允许我们在变量之间存在依赖关系时,高效地计算函数对某个底层参数的总变化率。

希望你现在对偏微分感到比较得心应手,并且能体会到全微分函数的实用性。你现在已经准备好通过接下来的练习巩固所学知识。掌握这些内容后,我们将能够把偏导数组合成真正有用的工具。

下节课再见。

014:雅可比矩阵

在本节课中,我们将学习雅可比矩阵的概念。雅可比矩阵将线性代数的一些思想引入到多元函数的偏导数中,构建成一个特别有用的工具。

概述

上一节我们介绍了如何对多元函数进行微分,并且了解到它并不比课程开始时遇到的单变量微积分困难多少。本节中,我们将引入雅可比矩阵,它把偏导数构建成一种特别有用的形式。

单变量函数的雅可比矩阵

雅可比矩阵的概念可以应用于多种不同的问题。但在优化和机器学习的入门背景下,有一个特定场景经常出现,那就是多元单值函数的雅可比矩阵。

简而言之,如果你有一个包含多个变量的函数,即 F(x1, x2, x3, ...),那么它的雅可比矩阵就是一个向量,其中每个元素依次是 F 对每个变量的偏导数。按照惯例,我们将其写为行向量而非列向量,这在本课程后续部分会变得更清晰。

一个简单的例子

让我们从一个简单明了的函数开始,看看构建雅可比矩阵是多么直接。

考虑函数:
F(x, y, z) = x²y + 3z

要构建雅可比矩阵,我们只需逐一求出该函数的所有偏导数:

  • ∂F/∂x:当我们对 x 求导,并将其他变量视为常数时,得到 2xy
  • ∂F/∂y:对 y 求导,得到
  • ∂F/∂z:对 z 求导,得到 3

现在,将它们组合起来,我们就得到了雅可比矩阵 J
J = [2xy, x², 3]

雅可比矩阵的几何意义

这告诉了我们什么?我们现在有了一个向量的代数表达式。当我们给定一个具体的 (x, y, z) 坐标时,这个向量会指向该函数在该点处最陡峭的上坡方向

对于这个特定函数,其向量在 z 方向有一个恒定的分量 3,它不依赖于所选的位置。例如,在点 (0, 0, 0),我们的雅可比矩阵是:
J(0,0,0) = [0, 0, 3]
我们可以看到,雅可比矩阵是一个长度为3的向量,直接指向 z 方向。

可视化理解

本课程后面将讨论的一些数值方法需要在数百个维度上计算雅可比矩阵。然而,即使对于我们刚刚解决的这个三维例子,图形表示也已经相当困难。

因此,我们现在将降到二维,以便真正看清发生了什么。但为了让事情更有趣,我们将看一个特别复杂但相当有吸引力的函数。

以下是我们要绘制的方程(此处仅作展示):
F(x, y) = sin(x² + y²) / (x² + y² + 1) + 0.5 * cos(2x) * sin(2y)

尽管这个函数有点复杂,但仅用我们目前所学的工具,我们确实可以计算出它的偏导数。不过,通过繁琐的计算你不会学到新东西。相反,我将以图形方式向你展示结果。

这是一个函数图,x 轴水平,y 轴垂直,颜色表示 z 值,明亮区域表示高值,黑暗区域表示低值。由于这个特定函数的性质,我知道在所示区域之外不会发生任何有趣的事情,所以我们现在可以忽略它。

虽然这个图相当清晰,但我们对梯度的直觉在这种格式下有些欠缺。所以,让我们暂时将其变为三维图,其中 z 值也通过高度来表示。

正如我们在视频开头所说,雅可比矩阵是一个向量,我们可以为这个图上的每个位置计算它,它指向最陡峭的上坡方向。此外,坡度越陡,该点处雅可比矩阵的模长就越大。

请记住这个三维空间的图像,现在我们回到二维。与其显示我用来绘制图形的所有网格点,不如转换为等高线图。就像真实山脉的地图一样,我们将在相同高度(对我们来说就是相同 z 值)的区域绘制线条。

这消除了图中的大量杂乱信息,这对于我想展示的最后一步很有用:在我们的等高线图上添加许多雅可比向量。

然而,在我这样做之前,让我们看看下面这四个点,并凭直觉猜猜哪个点的雅可比矩阵模长最大。

叠加雅可比向量场后,我们可以看到它们都明确指向上坡方向,远离低矮的黑暗区域,朝向高耸的明亮区域。同时,我们看到在等高线紧密堆积的地方(例如A点),我们找到了最大的雅可比向量;而在山峰顶部、山谷底部,甚至广阔的平原上,我们的梯度(也就是雅可比矩阵)都很小。

总结

本节课中,我们一起学习了雅可比矩阵。我们了解到,对于一个多元函数,其雅可比矩阵是一个由所有一阶偏导数组成的行向量。它在几何上代表了函数在某一点处梯度的方向和大小,指向函数值增长最快的方向。通过清晰的二维示例,我们希望你能建立起对雅可比矩阵的直观理解,以便在后续课程中面对更高维度的问题时,能够信任数学计算的结果。

机器学习数学:多元微积分:P15:雅可比矩阵的应用

在本节课中,我们将学习如何将雅可比的概念从向量推广到矩阵,这将使我们能够描述向量值函数的变化率。在此之前,我们先通过将目前所学的雅可比知识应用于另一个简单系统来进行回顾。

回顾:从雅可比向量场理解函数

考虑函数 F(x, y) = e{-(x2 + y^2)}。利用偏导数的知识,我们可以很容易地求出它的雅可比向量。这次我们将采取与上次相反的方法:先观察雅可比向量场,再尝试理解原函数的样子。

以下是构建理解的关键步骤:

  • 计算特定点的雅可比向量:首先,计算点 (-1, 1) 处的雅可比向量。将坐标代入雅可比表达式并简化后,我们得到一个直接指向原点的向量。
  • 观察远离原点的点:接着,计算点 (0, 2) 处的雅可比向量。我们得到一个更小的向量,但同样指向原点。
  • 分析原点本身:最后,计算原点 (0, 0) 处的雅可比向量,得到零向量。这表明函数在该点是平坦的,意味着该点可能是最大值、最小值或鞍点(我们将在后续课程中介绍)。通过观察完整的雅可比向量场,可以清楚地看出原点就是这个函数的最大值点。

现在,让我们回到用颜色图表示的这个函数,其中较亮的区域代表较高的 F 值。最终,我们可以移除向量场,在三维空间中观察这个函数,其形状应该符合我们的预期。

从向量到矩阵:构建向量值函数的雅可比矩阵

上一节我们通过雅可比向量场直观地理解了标量值函数。本节中,我们将构建雅可比矩阵,用于描述那些以向量为输入,同时也以向量为输出的函数。

考虑两个函数:

  • u(x, y) = x + 2y
  • v(x, y) = 3y - 2x

我们可以将它们视为两个向量空间:一个包含坐标为 (u, v) 的向量,另一个包含坐标为 (x, y) 的向量。XY 空间中的每个点都对应 UV 空间中的一个位置。当我们在 XY 空间中移动时,在 UV 空间中对应的路径会截然不同。

当然,我们可以分别为 u 和 v 构建行向量形式的雅可比。然而,由于我们将 u 和 v 视为单个向量的分量,更合理的做法是将这些向量作为行堆叠起来,形成一个矩阵,从而扩展我们的雅可比概念。

雅可比矩阵的结构如下:

J = [ ∂u/∂x  ∂u/∂y ]
    [ ∂v/∂x  ∂v/∂y ]

应用示例:计算线性变换的雅可比矩阵

现在,让我们将这个方法应用到我们的示例函数上,看看会得到什么。

我们有:

  • u(x, y) = x + 2y
  • v(x, y) = 3y - 2x

计算各偏导数:

  • ∂u/∂x = 1
  • ∂u/∂y = 2
  • ∂v/∂x = -2
  • ∂v/∂y = 3

因此,雅可比矩阵为:

J = [ 1   2 ]
    [ -2  3 ]

这个雅可比矩阵不再包含任何变量,考虑到 u 和 v 都是 x 和 y 的线性函数,梯度处处恒定,这正是我们所预期的。同时,这个矩阵就是从 XY 空间到 UV 空间的线性变换矩阵。

例如,如果我们对向量 [2, 3]^T 应用此变换:

[ u ]   = [ 1   2 ] [ 2 ] = [ 1*2 + 2*3 ] = [ 8  ]
[ v ]     [ -2  3 ] [ 3 ]   [ -2*2 + 3*3 ]   [ 5  ]

非线性函数与雅可比行列式的几何意义

以上例子虽然清晰,但实际中遇到的函数大多是非线性且复杂得多的。不过,它们通常仍然是光滑的,这意味着如果我们足够地“放大”观察,空间的每个微小区域都可以近似看作是线性的。

因此,通过累加空间中每个点处雅可比行列式的贡献,我们仍然可以计算一个区域在经过变换后的大小变化。雅可比行列式 det(J) 给出了局部面积(或高维体积)的缩放因子。

一个经典的例子是笛卡尔坐标系和极坐标系之间的转换。

从极坐标 (r, θ) 到笛卡尔坐标 (x, y) 的变换关系为:

  • x = r cos θ
  • y = r sin θ

我们可以构建其雅可比矩阵并计算行列式:

J = [ ∂x/∂r   ∂x/∂θ ] = [ cosθ   -r sinθ ]
    [ ∂y/∂r   ∂y/∂θ ]   [ sinθ    r cosθ ]

det(J) = (cosθ)*(r cosθ) - (-r sinθ)*(sinθ) = r(cos²θ + sin²θ) = r

结果是 r,而不是关于 θ 的函数。这告诉我们,当我们沿着半径 r 远离原点移动时,空间的微小区域会按 r 的比例缩放。这一点在我们观察下面的动画时,会显得非常直观。

总结

本节课中,我们一起学习了雅可比矩阵的应用。我们首先通过一个标量值函数的例子,回顾了如何从雅可比向量场理解函数形态。接着,我们将概念推广到向量值函数,学习了如何构建雅可比矩阵来描述从输入向量空间到输出向量空间的变换。最后,我们探讨了雅可比行列式在非线性变换和坐标变换中的几何意义,它给出了局部区域的缩放因子。希望你现在能够自信地在练习中为自己构建雅可比向量和矩阵,更重要的是,你对这个概念背后的直观理解正在逐步形成。

016:优化与雅可比矩阵直觉

在本节课中,我们将学习雅可比矩阵在优化问题中的作用,并通过一个生动的类比来建立直观理解。我们将了解为什么找到函数的最大值或最小值(即优化)在复杂情况下会变得困难,以及雅可比矩阵如何为我们提供指引。

雅可比矩阵与梯度回顾

上一节我们介绍了雅可比矩阵,它描述了多变量系统的梯度。对于一个标量值多变量函数 f(x, y),其雅可比矩阵是一个行向量,它指向斜率增加最快的方向,其长度与局部陡峭程度成正比。

公式:对于一个函数 f(x, y),其雅可比矩阵(梯度)为:
J = [∂f/∂x, ∂f/∂y]

什么是数学优化?

本节中,我们来看看数学中的“优化”意味着什么。在日常生活中,优化意味着让事物变得尽可能好。在数学中,优化的含义基本相同,大量研究致力于寻找使系统达到最大值或最小值的函数输入值。

现实世界中数学优化的例子包括:

  • 规划繁忙城市的路线。
  • 安排工厂的生产计划。
  • 制定股票交易的选择策略。

简单与复杂的优化问题

如果我们回到上一节看到的最简单函数,并想找到最大值的位置,我们可以通过解析方法求解:先构建雅可比矩阵,然后找到使其等于0的x和y值。

然而,当函数变得更复杂时,寻找最大值或最小值会变得棘手。即使我们仍然有一个解析表达式,可以找到雅可比矩阵的一般表达式,但仅仅将其设为0不仅复杂得多,而且可能还不够,因为此类函数可能有多个梯度为0的位置。

全局与局部极值

假设函数的所有最大值和最小值都在我们观察的区域内,那么仅通过查看函数的曲面图,就能非常清楚地看到最高的峰和最深的谷在哪里。

以下是关于极值点的分类:

  • 我们称所有的峰为最大值。其中,最高的单峰A被称为全局最大值,而在C和E处的几个峰被称为局部最大值
  • 同样,我们称所有的谷为最小值。其中最深的点D被称为全局最小值,而在点B处的是一个局部最小值

这一切看起来相当直接。

“夜间登山”的优化挑战

但是,这里有一个非常重要、可能因为过于明显而被忽略的点。想象你站在有山有谷的曲面上,试图爬到最高峰。这没问题,我们只需环顾四周,找到那座最高的山,然后径直走过去。

但如果我们是在夜间行走呢?这非常类似于我们没有函数解析表达式的情况。我们无法绘制整个函数图来观察。也许每个数据点都是一次耗时的超级计算机模拟结果,或者是一次真实世界实验的结果。

这些“夜间”场景在优化中非常常见,并且可能极具挑战性。不过,如果我们幸运的话,可能会发现使用“手电筒”能看到周围路标上绘制的雅可比向量,每个路标都会指示“山峰朝这个方向”。

我们必须记住,尽管所有雅可比向量都指向上坡方向,但它们不一定指向最高峰的顶部。你可能会发现自己走向了C或E处的某个局部最大值。更糟糕的是,当你到达那里时,会发现所有的路标都直接指向你所在的位置。

引入“沙坑”类比

这个夜间登山的类比常用于讨论优化问题,但它也有一些误导性的特征。例如,在实际评估函数时,你可以通过“瞬移”有效地尝试地图上的许多不同点,而无需评估中间的所有位置,并且无论点之间相距多远,计算成本本质上相同。所以我们并不是真的在“行走”。

因此,我们将切换到另一个类比:一个底部不平整的沙坑。在接下来的练习中,你将尝试通过用长棍测量不同点的深度,来找到沙坑的最深点。

这是一个很深的沙坑。一旦你将棍子插到底部,就无法将其向侧面移动。你只能把它拔出来,再尝试另一个地方。

同样关键的是,就像我们的夜间行走场景一样,你无法知道坑底的峰谷是什么样子,因为沙子挡住了视线。

当你完成练习时,我希望你能开始体会到优化问题的一些微妙之处,并 hopefully 带着一些新的问题离开。

本节课中,我们一起学习了雅可比矩阵在优化中的指引作用,区分了全局极值与局部极值,并通过“夜间登山”和“沙坑探测”的类比,理解了在实际(尤其是无解析表达式)情况下寻找最优解所面临的挑战。这些直觉将为后续的实际优化算法学习打下基础。

下次见,祝你在沙坑中探索愉快!

机器学习数学:多元微积分:P17:海森矩阵

在本节课中,我们将学习一个与多元系统相关的重要概念——海森矩阵。它是雅可比矩阵的自然延伸,用于收集函数的所有二阶偏导数,帮助我们分析函数在某一点的曲率特性,例如判断该点是局部极大值、极小值还是鞍点。


上一节我们介绍了雅可比矩阵,它包含了函数的所有一阶偏导数。本节中,我们来看看如何将这些概念扩展到二阶导数,从而引入海森矩阵。

海森矩阵可以看作是雅可比矩阵的简单扩展。对于雅可比矩阵,我们将一个函数的所有一阶偏导数收集到一个向量中。现在,我们将把所有二阶偏导数收集到一个矩阵中。对于一个包含 n 个变量的函数,其海森矩阵 H 的一般形式如下:

H =
[
\begin{bmatrix}
\frac{\partial^2 f}{\partial x_1^2} & \frac{\partial^2 f}{\partial x_1 \partial x_2} & \cdots & \frac{\partial^2 f}{\partial x_1 \partial x_n} \
\frac{\partial^2 f}{\partial x_2 \partial x_1} & \frac{\partial^2 f}{\partial x_2^2} & \cdots & \frac{\partial^2 f}{\partial x_2 \partial x_n} \
\vdots & \vdots & \ddots & \vdots \
\frac{\partial^2 f}{\partial x_n \partial x_1} & \frac{\partial^2 f}{\partial x_n \partial x_2} & \cdots & \frac{\partial^2 f}{\partial x_n^2}
\end{bmatrix}
]

使用简写符号会非常方便。求二阶偏导数的方法很简单:先对第一个变量求偏导,再对第二个变量求偏导。海森矩阵是一个 n × n 的方阵,其中 n 是函数中变量的个数。


现在让我们通过一个快速示例来理解如何计算海森矩阵。通常,先找到雅可比矩阵,再对其中的每一项进行微分来求海森矩阵会更简单。

考虑函数:f(x, y, z) = x²yz

以下是计算步骤:

首先,我们构建该函数的雅可比矩阵 J,它包含所有一阶偏导数。

J = [ ∂f/∂x, ∂f/∂y, ∂f/∂z ] = [ 2xyz, x²z, x²y ]

接着,我们基于雅可比矩阵的每一项,再次对每个变量求偏导,从而得到海森矩阵 H

H =
[
\begin{bmatrix}
\frac{\partial (2xyz)}{\partial x} & \frac{\partial (2xyz)}{\partial y} & \frac{\partial (2xyz)}{\partial z} \
\frac{\partial (x²z)}{\partial x} & \frac{\partial (x²z)}{\partial y} & \frac{\partial (x²z)}{\partial z} \
\frac{\partial (x²y)}{\partial x} & \frac{\partial (x²y)}{\partial y} & \frac{\partial (x²y)}{\partial z}
\end

\begin{bmatrix}
2yz & 2xz & 2xy \
2xz & 0 & x² \
2xy & x² & 0
\end{bmatrix}
]

需要注意的一点是,如果函数是连续的(没有突然的阶跃变化),海森矩阵总是关于主对角线对称的。这意味着,一旦计算出右上角的区域,左下角的区域可以直接对应写出。


为了可视化海森矩阵的作用,我们回到二维空间来考虑一个简单例子。

考虑函数:f(x, y) = x² + y²

计算其雅可比矩阵和黑塞矩阵都很简单。雅可比矩阵为 J = [ 2x, 2y ]。在点 (0, 0),梯度向量为 [0, 0]。但如何知道这个点是极大值还是极小值呢?

这时我们可以查看海森矩阵。对于此函数,海森矩阵为常数矩阵:

H =
[
\begin{bmatrix}
2 & 0 \
0 & 2
\end{bmatrix}
]

其行列式 det(H) = 2*2 - 0*0 = 4

海森矩阵的强大之处在于:

  1. 如果其行列式为正,则我们处理的是极大值或极小值。
  2. 然后,我们查看海森矩阵左上角的第一个元素 H[1,1](即 ∂²f/∂x²)。
    • 如果这个值也为正,我们得到的是一个极小值(如此例所示)。
    • 如果这个值为负,我们得到的是一个极大值

现在,稍微修改我们的函数,考虑:f(x, y) = x² - y²

重新计算雅可比矩阵和海森矩阵行列式。雅可比矩阵为 J = [ 2x, -2y ],在 (0,0) 点梯度也为零。海森矩阵为:

H =
[
\begin{bmatrix}
2 & 0 \
0 & -2
\end{bmatrix}
]

其行列式 det(H) = 2*(-2) - 0*0 = -4,为负数。

这次,海森矩阵行列式为负,表明我们处理的既不是极大值也不是极小值。在 (0,0) 点,梯度为零,但函数在一个方向上是下降的,在另一个方向上是上升的。我们称这种特征点为鞍点。在寻找最优解(峰值)时,鞍点也会造成很多困惑。


在本节课中,我们一起学习了海森矩阵的概念、计算方法和核心应用。我们了解到,海森矩阵汇集了函数的二阶偏导数信息,通过分析其行列式和左上角元素,可以有效地判断函数临界点的类型(局部极小值、局部极大值或鞍点)。这为我们分析和优化多元函数提供了一个强有力的工具。在本课程的最后一个模块中,你还将看到海森矩阵在优化问题中的另一种应用方式。

018:现实是残酷的

在本节课中,我们将探讨将多元微积分应用于现实世界优化问题时面临的挑战。我们将了解高维度、计算成本、函数不连续性以及数据噪声如何影响我们的方法,并介绍一种名为“有限差分法”的数值技术来应对这些挑战。

从理想世界到现实世界

在前面的模块中,我们讨论了如何将二元函数视为地形景观,并学习了如何构建雅可比向量,该向量能告诉我们空间中每一点梯度的方向和大小。上一节我们添加了判断临界点类型的工具,以便在梯度为零时确认所处位置的特征。

这些概念对于理解优化问题非常有用,也让你看到了学习多元微积分的价值。然而,本节我们将回顾现实系统的两个特征,这些特征我们之前一直有意避开了。

现实世界的挑战

以下是现实世界优化问题中常见的几个挑战:

  • 高维度问题:对于许多优化应用,例如训练神经网络,你需要处理远超两个维度的问题,可能是数百甚至数千维。这意味着我们无法再绘制出漂亮的地形表面并进行“爬山”。尽管所有数学原理仍然适用,但我们现在必须依靠二维的直觉来引导我们,并相信数学计算。

  • 计算成本与未知函数:即使你面对的是一个二维问题,通常也可能没有一个完美的解析函数来描述它,并且计算每个点的值可能非常昂贵。因此,尽管原则上可以绘制图形,但你可能无法承担所需的超级计算时间或实验室人力来完整地填充它。

  • 函数的不连续性:我们目前处理的所有函数都是平滑且行为良好的。然而,如果我们的函数包含像不连续性这样的尖锐特征,这无疑会使“地形导航”变得更加混乱。

  • 数据的噪声:有多种因素可能导致函数值存在噪声。可以想象,除非我们小心处理,否则噪声可能会使我们的雅可比向量变得毫无用处。

如何应对未知函数?

上述讨论引出了本节的第二个核心话题,也是一个你可能一直在思考的问题:如果我们连想要优化的函数都没有,我们究竟该如何通过偏导数来构建雅可比矩阵呢?

这是一个极好的问题,它将我们引向另一个庞大的研究领域——数值方法。许多问题要么没有简洁的显式公式答案,要么虽然有公式,但直接求解需要耗费无限长的时间。为了对抗宇宙的这种“嘲弄”,我们发展了一系列技术来生成近似解。

有限差分法

一种与我们讨论雅可比矩阵特别相关的方法,实际上将我们带回了本课程最初的几节关于导数定义的讲座。我们最初使用基于有限区间计算的“上升/前进”来近似导数,然后观察当这个区间趋近于零时会发生什么。

有限差分法所做的,就是接受我们无法计算出空间中每一个点的函数值。因此,我们将仅利用已有的点,基于这些点来构建梯度的近似值。

在下面展示的一维函数例子中,我们已经计算了许多点,但这对于高维场景显然不切实际。

因此,我们将这个逻辑再推进一步:如果我们从一个初始位置出发,并希望近似雅可比矩阵,我们只需依次近似每个偏导数。

  • X 方向迈出一小步,可以计算 X 方向的近似偏导数。
  • Y 方向迈出一小步,则得到 Y 方向的近似偏导数。

公式表示为:
∂f/∂x ≈ (f(x+Δx, y) - f(x, y)) / Δx
∂f/∂y ≈ (f(x, y+Δy) - f(x, y)) / Δy

使用有限差分法的注意事项

以下是使用此方法时需要牢记的两点:

  • 步长选择:我们的“一小步”应该取多大?这需要权衡。如果步长太大,由于此时原因应该很明显,你会得到一个很差的近似值。但如果步长太小,我们可能会遇到一些数值问题。请记住,当计算机计算某点的函数值时,它只将其存储到一定的有效数字位数。如果你的点过于接近,计算机可能根本检测不到任何变化。

  • 处理噪声数据:正如前面提到的,如果数据有噪声怎么办?针对这种情况,人们开发了许多不同的方法,但也许最简单的一种是使用几种不同的步长计算梯度,然后取某种平均值。

总结

本节课我们一起学习了将多元微积分工具应用于现实问题时所面临的限制。我们看到,一旦离开平滑、理想函数的世界,进入充满噪声数据和计算昂贵函数的现实世界,情况就开始变得复杂而有趣。我们介绍了有限差分法作为一种数值技术,它允许我们在没有解析函数的情况下,通过计算函数在邻近点的值来近似梯度。理解这些挑战和应对方法是成功应用优化算法(如机器学习中的梯度下降法)的关键。下次见!

019:总结与展望

在本模块中,我们共同学习了多元微积分的基础概念,包括偏导数、梯度以及如何利用它们来理解和优化多维空间中的函数。


课程的第二模块到此结束。希望你现在对多元微积分有了相当的信心,并且能够在未来独立探索多维的超曲面与“坑洼”。

上一节我们介绍了梯度下降等优化概念,本节中我们来看看接下来的学习方向。

在下一个模块中,我们将讨论多元链式法则,以及它如何帮助你优化神经网络中的权重参数。

届时再见。


本节课中我们一起学习了多元微积分的关键工具,为理解更复杂的机器学习优化算法奠定了坚实的数学基础。下一个模块,我们将把这些工具应用于实际的神经网络优化问题中。

020:多元链式法则 🧮

在本节课中,我们将要学习如何将单变量链式法则升级,使其能够处理多元函数。我们将回顾前两个模块的核心内容,并引入新的工具来应对高维空间中的导数计算。

概述

在前两个模块中,我们学习了如何对单变量和多变量函数进行微分,并理解了微分过程的本质。我们还掌握了一些快速计算导数以及在多维空间中导航的有用工具。本节中,我们将重点介绍多元链式法则,并探讨其在实践中的应用。

回顾与过渡

上一节我们介绍了单变量和多变量微分的基本概念。本节中,我们来看看如何将这些概念结合起来,形成强大的多元链式法则。

核心概念:多元链式法则

多元链式法则允许我们计算复合函数的导数,其中函数本身可能依赖于多个变量。其核心思想是,一个变量的微小变化会通过多个路径影响最终输出。

以下是其基本形式。假设有一个函数 f(x, y),其中 xy 本身又是另一个变量 t 的函数,即 x = g(t)y = h(t)。那么 f 关于 t 的全导数公式为:

df/dt = (∂f/∂x) * (dx/dt) + (∂f/∂y) * (dy/dt)

这个公式表明,t 的变化通过 xy 两条路径影响 f,总的影响是每条路径贡献的加权和。

应用场景

多元链式法则在机器学习中非常有用,尤其是在神经网络的反向传播算法中。在反向传播中,我们需要计算损失函数相对于网络中每一个参数的梯度。网络中的每一层都可以看作是一个函数,其输入是前一层的输出,而参数则是该函数的变量。链式法则使我们能够高效地将误差从输出层逐层传递回输入层。

总结

本节课中我们一起学习了多元链式法则。我们理解了它是单变量链式法则在多维空间中的自然扩展,其核心公式描述了变量通过多条路径对最终结果的影响。掌握这个工具对于理解机器学习中复杂的优化过程至关重要。

021:多元链式法则

概述

在本节课程中,我们将学习多元链式法则的通用形式。我们将从一个具体的例子出发,将其推广到任意多个变量的情况,并引入更简洁的向量记法。理解这个通用形式对于处理复杂的机器学习模型至关重要。

回顾:全导数

在上一模块中,我们学习了全导数的概念。它描述了当一个多元函数 F(x, y, z) 的每个变量 x, y, z 本身又是另一个变量 t 的函数时,如何计算 Ft 的导数。

其表达式为:
dF/dt = (∂F/∂x)(dx/dt) + (∂F/∂y)(dy/dt) + (∂F/∂z)(dz/dt)

这种方法允许我们分步计算,而不是一开始就代入所有函数关系,计算机非常擅长高效地处理这种分步问题。

推广到 n 维情况

现在,我们将这个概念进行推广,并简化其记法。

假设我们有一个 n 元函数 F,其变量为 x1, x2, x3, ..., xn。我们可以将其简洁地写作 F(x)。这里,粗体的 x 表示一个由 n 个变量组成的序列,我们可以更方便地将其视为一个 n 维向量:
x = [x1, x2, ..., xn]^T

同样,向量 x 的每一个分量 xi 本身都是另一个变量 t 的函数。我们的目标是求 Ft 的导数 dF/dt

构建通用链式法则

为了建立连接 Ft 的表达式,我们需要以下两组导数:

  1. F 对每个变量 xi 的偏导数:∂F/∂xi
  2. 每个变量 xit 的导数:dxi/dt

我们可以将这两组数分别存储在两个 n 维向量中:

  • 梯度向量:∇F = [∂F/∂x1, ∂F/∂x2, ..., ∂F/∂xn]^T
  • 导数向量:dx/dt = [dx1/dt, dx2/dt, ..., dxn/dt]^T

我们的目标是求这两个向量中对应位置元素乘积之和。这正是线性代数中点积(内积) 运算的定义。

因此,多元链式法则的通用形式可以优雅地表示为:
dF/dt = ∇F · (dx/dt)

或者更明确地写为:
dF/dt = Σ (∂F/∂xi)(dxi/dt),其中求和 i1n

工具列表更新与总结

至此,我们得到了多元链式法则的通用形式。我们可以将其加入我们的数学工具列表。

实际上,虽然我们在上一个模块已经实践过具体例子,但值得指出的是,我们之前学到的所有其他求导法则(如乘积法则、商法则)本身就适用于多元问题,无需修改。

本节课中,我们一起学习了如何将全导数的概念从三维推广到任意维,并引入了向量点积来简洁地表示多元链式法则 dF/dt = ∇F · (dx/dt)。这个强大的工具将帮助我们在后续课程中高效地处理更复杂的多变量函数求导问题。

022:更多多元链式法则

在本节课中,我们将继续学习多元链式法则。我们将首先回顾并补充一个关于雅可比矩阵的细节,然后探讨当链式法则涉及两个以上环节时,如何将其推广到多元函数的情况。通过具体的例子,我们将看到线性代数与多元微积分是如何紧密结合的。

回顾与补充:雅可比矩阵与链式法则

上一节我们介绍了多元链式法则的紧凑形式。现在,我们来补充一个你可能已经注意到的细节。

如果我们有一个函数 f(x),其中 x 是一个向量,且 x 的每个分量都依赖于标量 t,我们可以将其简洁地写作 x(t)。我们也有多元链式法则的紧凑形式与之对应。

你可能已经注意到,偏导数向量 ∂f/∂x 与我们上一个模块中遇到的雅可比向量完全相同,只是我们将其写成了列向量而非行向量。根据线性代数的知识,我们可以说 ∂f/∂x 必须是 f 的雅可比矩阵的转置。

最后需要认识到,对两个列向量进行点积运算,等同于用一个行向量乘以一个列向量。因此,我们最终可以看到,我们的老朋友——雅可比矩阵,为我们提供了多元链式法则最便捷的表示形式。

公式表示:
df/dt = (∂f/∂x)^T · (dx/dt) = J_f(x) · (dx/dt)

其中,J_f(x) 是函数 f 关于 x 的雅可比(行)向量。

链式法则的多环节推广

接下来我们将看到,链式法则对于两个以上的环节同样适用。我们先通过一个简单的单变量例子来开始,在这个例子中,我们在 ft 之间加入另一个函数。

假设:

  • f(x) = 5x
  • x(u) = 1 - u
  • u(t) = t^2

我们有了三个函数,通过一个额外的步骤将 ft 分离开。当然,我们可以直接将每一步代入,找到 f 作为 t 的直接函数表达式:f(t) = 5(1 - t^2) = 5 - 5t^2。然后直接求导:df/dt = -10t

或者,我们可以应用两步链式法则:
df/dt = (df/dx) * (dx/du) * (du/dt)

代入各项:
df/dt = 5 * (-1) * (2t) = -10t

我们再次得到了相同的答案。由此可见,这种方法适用于单变量函数链,并且可以扩展到 ft 之间任意多个中间函数。

多元情况下的多环节链式法则

那么多元情况呢?链式法则在这里同样有效,但我们只需要注意一些额外的细节。

让我们考虑函数 f( x( u(t) ) )。其中:

  • 函数 f 以向量 x 作为输入。
  • x 是一个向量值函数,它又以向量 u 作为输入。
  • u 也是一个向量值函数,它以标量 t 作为输入。

最终,我们仍然是将标量输入 t 与标量输出 f 联系起来,但这次是通过两个中间的向量值函数 xu

如果我们想求 f 关于 t 的导数,我们基本上可以写出与单变量情况相同的表达式,只是现在其中几项是向量或矩阵。

我们已经知道:

  • 对标量值函数 f 关于其输入向量 x 求导,得到的是雅可比行向量 ∂f/∂x
  • 对向量值函数 u 关于标量变量 t 求导,得到的是导数列向量 du/dt

那么中间项 ∂x/∂u 呢?对于函数 x,我们需要找到它的两个输出变量分别关于两个输入变量的导数。因此,我们总共会得到四项,正如我们在上一个模块中所见,这四项可以方便地排列成一个矩阵。我们仍然称这个对象为雅可比矩阵。

现在我们可以说,f 关于 t 的导数是 f 的雅可比矩阵、x 的雅可比矩阵和 u 的导数向量的乘积。请注意,这些向量和矩阵的维度(如下图所示)使得这个运算是可行的,并且最终会返回一个标量,正如我们所期望的那样。

公式表示:
df/dt = (∂f/∂x) * (∂x/∂u) * (du/dt)
其中:

  • (∂f/∂x)1 x n 的行向量(雅可比)。
  • (∂x/∂u)n x m 的矩阵(雅可比)。
  • (du/dt)m x 1 的列向量。

总结

本节课中,我们一起学习了多元链式法则的更多内容。我们首先明确了偏导数向量与雅可比矩阵转置之间的关系,使链式法则的表达更加统一。接着,我们探讨了链式法则如何推广到包含两个以上环节的情况,无论是单变量还是多元函数。关键在于,每一步的导数都用一个合适的线性代数对象(标量、向量或矩阵)来表示,并确保它们的维度在连续相乘时是兼容的。希望你现在开始看到线性代数与多元微积分的各个线索是如何交织在一起的。

机器学习数学:多元微积分:P23:简单神经网络

在本节课中,我们将学习人工神经网络的基本概念,并了解多元链式法则在使其运作中的关键作用。我们将从最简单的网络结构开始,逐步构建更复杂的模型,并学习相关的数学表示方法。


概述

神经网络是强大的数学函数,广泛应用于图像识别、语言翻译等领域。本质上,它是一个将输入变量(可以是向量)映射为输出变量的函数。本节将介绍其基本构成,包括神经元、权重、偏置和激活函数,并展示如何用线性代数简洁地表示多层网络。


从单个神经元开始

上一节我们介绍了多元微积分的基础。本节中,我们来看看如何将这些概念应用于神经网络。

最简单的神经网络接收一个标量输入 a0,并输出一个标量 a1。其函数形式如下:

公式: a1 = σ(w * a0 + b)

在这个公式中:

  • a0a1 被称为活动值
  • w 是一个权重
  • b 是一个偏置
  • σ 是一个激活函数

激活函数 σ 模拟了生物神经元在输入总和超过阈值后被“激活”的特性。一个具有这种阈值特性的常见函数是双曲正切函数 tanh

公式: tanh(x) = (e^x - e^{-x}) / (e^x + e^{-x})

tanh 函数属于具有特征性 S 形的函数家族,称为 sigmoid 函数,这就是我们用 σ 表示它的原因。


增加输入神经元

目前我们的网络只有两个标量参数 wb,功能有限。为了增加复杂性,我们首先为输入层添加更多神经元。

如果我们添加第二个输入神经元,输出 a1 的公式需要包含两个输入。我们将输入分别记为 a0_0a0_1

公式: a1 = σ(w_0 * a0_0 + w_1 * a0_1 + b)

网络中的每个连接都关联一个权重,我们可以在图中将其标出。

添加第三个输入节点 a0_2 遵循相同的逻辑,只需将该项加入求和。

公式: a1 = σ(w_0 * a0_0 + w_1 * a0_1 + w_2 * a0_2 + b)

随着输入增多,表达式变得冗长。我们可以将其推广到 n 个输入。

使用求和符号表示:
公式: a1 = σ( Σ_{i=0}^{n-1} (w_i * a0_i) + b )

更简洁的方法是使用向量。我们构建一个权重向量 w 和一个输入向量 a0,然后计算它们的点积。

公式: a1 = σ( **w** · **a0** + b )
代码(Python示例):

import numpy as np
a0 = np.array([a0_0, a0_1, ..., a0_n-1]) # 输入向量
w = np.array([w_0, w_1, ..., w_n-1])     # 权重向量
b = 0.5                                  # 偏置标量
z = np.dot(w, a0) + b                    # 加权和加偏置
a1 = np.tanh(z)                          # 应用激活函数,例如 tanh

增加输出神经元

现在,让我们将相同的逻辑应用到输出层。为网络添加第二个输出神经元。

我们将两个输出值记为 a1_0a1_1。现在连接数量翻倍,每个连接有自己的权重,每个输出神经元有自己的偏置。

这可以用一对方程来描述,每个方程对应一个输出:

公式:
a1_0 = σ( w_00 * a0_0 + w_01 * a0_1 + ... + w_0{n-1} * a0_{n-1} + b_0 )
a1_1 = σ( w_10 * a0_0 + w_11 * a0_1 + ... + w_1{n-1} * a0_{n-1} + b_1 )

同样,我们可以用更紧凑的向量和矩阵形式来表示这两个方程:

公式: a1 = σ( W · a0 + b )

其中:

  • a1 是一个包含 [a1_0, a1_1]^T 的列向量(输出)。
  • W 是一个 2 x n 的权重矩阵,每一行对应一个输出神经元的权重向量。
  • a0 是包含 n 个输入的列向量。
  • b 是一个包含 [b_0, b_1]^T 的偏置列向量。

单层神经网络的通用形式

以下是具有 n 个输入和 m 个输出的单层神经网络的通用方程:

公式: a^{[1]} = σ( W · a^{[0]} + b )

在这个方程中:

  • a^{[0]} ∈ ℝ^n 是输入向量。
  • W ∈ ℝ^{m x n} 是权重矩阵。
  • b ∈ ℝ^m 是偏置向量。
  • a^{[1]} ∈ ℝ^m 是输出向量。
  • σ 是激活函数,现在按元素应用于向量(即对向量的每个分量独立应用)。

这个方程封装了所有权重和偏置的作用。


引入隐藏层

神经网络的最后一个关键部分是,在输入和输出之间通常存在一层或多层神经元,我们称之为隐藏层

隐藏层的行为方式与我们目前所见完全相同,只是它的输出成为下一层的输入。

对于一个具有一个隐藏层的网络,计算过程如下:

  1. 计算隐藏层的活动值:a^{[1]} = σ^{[1]}( W^{[1]} · a^{[0]} + b^{[1]} )
  2. 将隐藏层的输出作为最终输入层的输入:a^{[2]} = σ^{[2]}( W^{[2]} · a^{[1]} + b^{[2]} )

通过这种方式,我们可以堆叠任意数量的层,构建一个前馈神经网络。所有的线性代数工具都已就位,用于计算这种网络的输出。


总结

本节课中,我们一起学习了简单神经网络的基本构建块。

  • 我们从单个神经元及其数学表示 a1 = σ(w*a0 + b) 开始。
  • 然后,我们扩展到了多个输入,并学会了使用向量点积 σ( **w** · **a0** + b ) 进行简洁表示。
  • 接着,我们增加了多个输出,引入了权重矩阵 W 和偏置向量 b,得到了通用形式 a^{[1]} = σ( W · a^{[0]} + b )
  • 最后,我们了解了如何通过添加隐藏层来构建更深层的前馈网络。

然而,让网络执行图像识别等有趣任务,关键在于教会它所有正确的权重和偏置。这涉及到“训练”网络,而这正是我们下一节视频将要探讨的内容,届时我们将引入多元链式法则来发挥关键作用。

024:更多简单神经网络

在本节课中,我们将学习如何利用多元链式法则来迭代更新神经网络中所有权重和偏置的值,从而使网络能够根据一组训练样本来学习对输入数据进行分类。

上一节我们介绍了神经网络的概念,并推导了描述带隐藏层的全连接前馈网络所需的代数。本节中我们来看看如何应用多元链式法则。

网络训练与反向传播

当我们说训练一个网络时,通常指的是使用某种带标签的数据,即匹配的输入和输出对。

例如,如果我们构建一个网络来识别人脸图片并预测其是否快乐,那么对于训练数据,每个输入可能是图像中单个像素的强度,而与之配对的输出则仅说明该图像是否包含人脸以及是否是快乐的脸。

经典的训练方法被称为反向传播,因为它首先查看输出神经元,然后反向通过网络。

网络结构与目标

如果我们从选择一个简单的结构开始,例如这里展示的具有四个输入单元、隐藏层三个单元和输出层两个单元的结构。

我们试图做的是找到18个权重和5个偏置,使得我们的网络能够最佳地将训练输入与其标签匹配起来。最初,我们会将所有权重和偏置设置为随机数。因此,最初当我们向网络传入一些数据时,得到的输出将是毫无意义的。然而,我们可以定义一个成本函数。

成本函数简单地是期望输出 y 与我们未经训练的网络当前给出的输出之间差值的平方和。

成本函数与梯度下降

如果我们专注于某个特定权重与由此产生的成本函数之间的关系,它可能看起来像这样:如果权重太大或太小,成本就高;但在一个特定值上,成本处于最小值。

基于我们对微积分的理解,如果我们能够以某种方式计算出成本 C 相对于变量 W 在某个初始点 W0 处的梯度,那么我们就可以简单地朝相反方向移动。

例如,在图中所示的点上,梯度为正,因此增加 W 也会增加成本,所以我们应该减小 W 来改进我们的网络。

然而,值得注意的是,我们的成本函数可能看起来更像这条波动的曲线,它有几个局部最小值,导航起来更复杂。此外,这个图只是孤立地考虑我们的一个权重,但我们真正想做的是找到多维超曲面的最小值,就像我们在上一个模块中看到的二维例子一样。

构建雅可比矩阵

因此,也像上一个模块一样,如果我们想向山下走,就需要通过收集成本函数相对于所有相关变量的偏导数来构建雅可比矩阵。

应用链式法则

既然我们知道了目标,我们只需要再看一下我们简单的两节点网络。

此时,我们可以立即为成本相对于权重或偏置的偏导数写出链式法则表达式。我高亮了 a1 项,它连接了这两个导数。

然而,利用一个额外的项通常很方便,我们称之为 Z1,它将保存我们的加权激活加上偏置项。这将允许我们单独考虑对我们恰好选择的特定S型函数进行微分。

因此,我们必须在导数链中包含一个额外的链接。

我们现在有了两个链式法则表达式,它们是在二维 W-B 空间中导航以最小化这个简单网络对于一组训练样本的成本所必需的。

显然,当我们添加更多神经元时,事情会变得稍微复杂一些,但从根本上说,我们仍然只是应用链式法则将每个权重和偏置与其对成本的影响联系起来,最终使我们能够训练我们的网络。

总结与展望

在接下来的练习中,我们将学习如何将简单情况下的方法扩展到多层网络。但我希望你已经享受了看到微积分在行动中的乐趣。下次见。

025:模块三总结与展望 🎓

概述

在本节课中,我们将对多元微积分课程的第三个模块进行总结,并展望后续的学习内容。我们将回顾已掌握的核心工具,并了解它们如何与机器学习技术相结合。


模块三总结

上一节我们介绍了多元微积分中的一系列核心概念。本节中,我们来对整个模块进行总结。

多元微积分的第三个模块到此结束。

现在你应该开始认识到,微积分和线性代数对于深入理解机器学习技术都非常重要。

你的工具箱中已经拥有了许多强大的工具。

你几乎已经准备好将它们付诸实践。


下一模块展望

以下是关于下一个学习模块的简要介绍。

下一个模块将研究幂级数。

这将把我们带回到模块一中提到的“增量近似”方法,并帮助我们解决一些遗留问题。

到时再见。😊


总结

本节课中我们一起学习了多元微积分第三模块的完结,认识到微积分与线性代数对机器学习的重要性,并预览了下一模块关于幂级数的学习内容。

026:泰勒级数简介

在本模块中,我们将学习如何对一个复杂函数,通过一系列更简单的函数来构建其近似。我们将要探讨的具体方法被称为泰勒级数,这将需要你运用迄今为止学到的所有微积分技能。

泰勒级数的核心思想

上一节我们介绍了本模块的目标。本节中,我们来看看泰勒级数的核心思想。泰勒级数的基本概念是,如果我们知道一个函数在某一点的值及其所有阶导数的值,我们就可以在该点附近用多项式来近似这个函数。

从单变量到多变量

到目前为止,我们主要处理的是单变量函数。然而,在机器学习中,我们经常需要处理具有多个输入的函数。幸运的是,泰勒级数的概念可以推广到多变量函数。当我们考虑多变量情况时,雅可比矩阵和海森矩阵将再次出现。

以下是泰勒级数展开的关键组成部分:

  • 函数在点 a 的值f(a)
  • 一阶导数(梯度):提供了函数在 a 点的最佳线性近似。
  • 二阶导数(海森矩阵):描述了函数的曲率,用于构建二次近似。
  • 高阶导数:提供更精细的局部信息,使近似更精确。

总结

本节课中,我们一起学习了泰勒级数的基本目标:用多项式序列逼近复杂函数。我们了解到,这不仅适用于单变量函数,还可以通过雅可比矩阵(一阶)和海森矩阵(二阶)等工具扩展到多变量函数。这展示了微积分中不同概念是如何联系在一起的,为后续构建具体的近似方法奠定了基础。

机器学习数学:多元微积分:P27:构建近似函数

在本节课中,我们将要学习泰勒级数,这是一种用于构建函数近似的方法。我们将从一个烹饪鸡肉的例子开始,直观地理解为什么需要近似,以及如何通过简化复杂的现实问题来获得一个实用的模型。


概述:为什么需要近似函数?

泰勒级数是用于构建函数近似的一系列方法之一。在深入数学细节之前,有必要先讨论一下拥有一个近似函数在何时会很有用。

一个令人印象深刻的例子与烹饪鸡肉有关。想象一下,你可以写出一个函数,描述鸡肉的质量 M 与其在烤箱中达到完美熟度所需时间 T 之间的关系。

显然,要使这样的函数存在,我们需要做出许多假设。例如,这只适用于某种特定类型、预热到特定温度的烤箱,并且鸡肉的形态是整只而非切块的。此外,鸡肉的热传导特性几乎肯定会随其质量以高度非线性的方式变化。

让我们来看一个具有上述部分特征的示例函数。一方面,烹饪时间 T 可能对许多会因情况而异的参数非常敏感。另一方面,如果我们想卖一本好的食谱书,我们就必须务实并简化这个“怪物”,因为人们通常不想在做饭时解复杂的方程。


第一步:做出关键假设

那么,我们该怎么做?首先,我们需要做出两个假设:一个关于烤箱,另一个关于鸡肉。

  1. 我们假设购买你食谱的每个人都拥有足够相似的烤箱,因此可以认为它们的行为基本相同。
  2. 我们假设每个人烹饪的鸡肉,其热传导特性作为质量的函数也足够相似,因此在每种情况下都可以认为是相同的。

这允许我们移除两个本身可能依赖于许多其他变量的、潜在的问题项。但我们仍然面临一个相当复杂的函数。


第二步:可视化与聚焦

接下来,我们将查看这个函数的图像。我已经在向你展示我认为这个系统中相关的信息了,例如,我没有展示质量超过4公斤或负质量鸡肉的烹饪时间。

事实上,我现在要更进一步:考虑到超市里一只典型的鸡肉大约重1.5公斤,让我们聚焦在这个区域,并构建一个形式为 y = Mx + C 的简单直线近似。


第三步:应用泰勒级数进行线性近似

通过使用我们将在后续视频中学到的泰勒级数方法,我可以推导出一个函数,使其在图像中某一点处具有与原函数相同的高度和斜率。

这条直线在感兴趣点附近的区域是对原函数相当合理的近似。但是,当你离该点越远,近似效果就会变得很差。不过,这本食谱并不是为烹饪巨型或微型鸡的人准备的,因此我们最终能够以一个更易于接受的格式写下表达式:

T ≈ 50 × M (kg) + 15*

所以,如果你想烤一只2公斤的鸡,大约需要 115分钟


总结与预告

在接下来的几个视频中,我们将更详细地探讨泰勒级数,并学习如何推导更高阶的项。虽然我不知道世界各地的著名厨师在写食谱时是否 knowingly 在使用泰勒级数近似,但我愿意相信他们是这么做的。

本节课中,我们一起学习了构建函数近似的动机,并通过一个烹饪案例,了解了如何通过做出合理假设、聚焦关键区域,并应用泰勒级数来获得一个简单实用的线性近似模型。

028:幂级数

在本节课中,我们将要学习幂级数的基本概念,特别是泰勒级数如何通过不断增加项来逼近一个函数。我们将从一个直观的图形化理解开始,为后续的正式数学推导打下基础。


上一节我们介绍了微分的概念,本节中我们来看看如何用一系列简单的多项式项来近似复杂的函数。

泰勒级数也被称为幂级数。这是因为它们由系数和x的递增幂次组成。我们可以用一个简单的通用表达式来表示一个幂级数:

G(x) = a + Bx + Cx² + Dx³ + ...

这个表达式可能包含无限多项,具体取决于我们所考虑的函数。

在下一个视频中计算泰勒级数时,我们将逐项构建它。每增加一项都会改进近似的精度。在许多情况下,我们会看到系数中出现的规律,这幸运地省去了我们计算无限多项的麻烦。然而,泰勒级数的许多应用只利用级数的前几项,希望这对于特定应用来说足够近似。

从仅有一项开始,我们称这些表达式为零阶、一阶、二阶和三阶近似等。总的来说,这些级数的短片段被称为截断级数

以下是构建近似的过程:

  • 零阶近似:仅包含常数项 a。它是一条通过目标点的水平线。
  • 一阶近似:包含常数项和一次项 Bx。它是一条在目标点处与函数有相同斜率的直线。
  • 二阶近似:包含到二次项 Cx²。它是一个抛物线,在目标点处与函数有相同的曲率(二阶导数)。

让我们通过观察一个任意但相当复杂的函数来开始。假设我们有一个形状如下的函数。我们只关注这条曲线上的一个特定点。然后,我们将开始构建我们的近似函数,试图让它越来越像我们所选的点。

所以,由于我们通用幂级数的第一项只是一个数字 A,并且我们现在忽略所有其他项,我们知道我们的初始近似必须只是一个通过相同点的数字。因此,我们可以直接在我们的图上添加零阶近似函数。它看起来像一条水平线。显然,这在近似红色曲线方面做得并不好。

现在让我们转到一阶近似。这个近似也可以有一个梯度。如果我们想在这个点匹配我们的函数,它应该具有相同的梯度。所以我们可以得到一条更像直线的近似。显然,在我们点附近的区域,我们的近似有了一些改进,尽管仍有很大的改进空间。

当然,我们可以继续到二阶函数,正如我们所见,它是一个抛物线。尽管在这一点上,绘图变得有点困难,匹配二阶导数也不容易,但它可能看起来像一条弯曲的曲线。因此,我们可以在目标点附近得到一个更好的拟合。

希望在不深入数学细节的情况下,你现在能够在接下来的练习中将一些未知函数与它们对应的截断泰勒级数近似匹配起来。在下一个视频中,我们将详细推导这些项,但我希望这个活动能帮助你最终不忘记我们试图实现的目标。


本节课中我们一起学习了幂级数(泰勒级数)的核心思想:通过不断增加多项式项(从常数项,到一次项,再到二次项...)来逐步逼近一个复杂函数在某一点附近的行为。我们了解了零阶、一阶和二阶近似在图形上的表现,并引入了“截断级数”的概念。下一节我们将学习如何具体计算这些项的系数。

029:幂级数推导

概述

在本节课中,我们将学习如何推导函数的幂级数表示。其核心思想是,我们可以使用一个包含x的递增幂次的级数来重新表达函数。我们将通过图形化的方式,逐步构建对任意函数的近似,并最终推导出通用的幂级数公式。

幂级数概念

为了预热,我们可以看一个令人惊叹的例子:函数 e^x。我们可以将其重新表达为以下级数:

1 + x + x²/2! + x³/3! + ...

这非常不可思议。通过本视频的学习,你将理解如何为许多其他有趣的函数构建类似的级数。

泰勒级数方法

泰勒级数方法告诉我们:如果我们知道函数在某一点的所有信息(“所有信息”指的是函数在该点的值、一阶导数、二阶导数、三阶导数等),那么我们就可以利用这些信息来重构函数在其他所有点的值。

因此,如果我知道函数在某一点的所有信息,我就知道了它在所有点的信息。然而,这仅适用于一类我们称之为“表现良好”的函数,即连续且可以无限次求导的函数。幸运的是,我们认识很多这样的函数,所以这确实是一个非常有用的工具。

图形化解释

接下来,我们将尝试通过图形来解释这个概念。我们来看一个任意函数 f(x) 的图像,它看起来像这样。我们将构建一系列逐步改进的近似。

零阶近似

我们的第一个近似,称为 g₀(x),将只使用函数的一个信息:我们感兴趣的点(此处设为 x=0)的函数值。

可以想象,如果我们的近似函数只基于这一个值,那么它显然无法捕捉像原函数这样复杂的形状。事实上,它只能是在点 f(0) 处的一条水平线。

我们可以画出这个一阶近似,并写出计算 g₀(x) 的表达式:

g₀(x) = f(0)

我们称之为零阶近似。显然,它并不好,但请注意,由于这条线是平的,它实际上甚至不是x的函数。

一阶近似

我们可以做得更好。现在来求一阶近似 g₁(x)。为此,我们将使用两个信息:函数在 x=0 处的值,以及函数在 x=0 处的梯度值,我们称之为 f'(0)

利用这些,我们可以构建另一条直线,形式为 y = mx + c,其中垂直轴截距 c 就是 f(0),而斜率 m 则用 f'(0) 代入。现在我们可以画出函数的一阶近似,它在 x=0 点具有与 f(x) 相同的函数值和梯度。

我们也可以写下它的表达式:

g₁(x) = f(0) + f'(0) * x

很明显,在 x=0 附近,g₁(x)g₀(x) 能更好地近似 f(x),但仍然不够好。

二阶近似

快速进入二阶近似 g₂(x)。我们将使用三个信息:f(0)f'(0) 和二阶导数 f''(0)

为了能利用这三个信息,我们需要一个二次方程。因此我们可以写成:

y = A x² + B x + C

对这个式子求两次导:

y' = 2A x + B
y'' = 2A

我们希望这个近似函数在代入点 x=0 时,其各项性质与 f(x) 相同。

  1. 首先,对于二阶导数:在 x=0 处,我们希望 y'' 等于 f''(0)。由于 y'' = 2A 不含 x,因此系数 A 简单地等于:
    A = f''(0) / 2
    
  2. 其次,对于一阶导数:我们希望 y' 在 x=0 处等于 f'(0)。代入 x=0,y' = B,因此:
    B = f'(0)
    
  3. 最后,对于函数值:我们希望 y 在 x=0 处等于 f(0)。代入 x=0,y = C,因此:
    C = f(0)
    

现在,我们有了方程的所有三个系数。我们可以回到图像,加上我们的二阶近似。由于它包含 项,将是一条抛物线。

请注意,每次更新近似时,它与 f(x) 匹配的区域都会扩大一点。

三阶近似

让我们再深入一步,求三阶近似。我们可以写出:

y = A x³ + B x² + C x + D

根据从前三步已经看到的情况,我们只需要找到系数 A,因为 B、C、D 将与 g₂(x) 中的相同。

现在对这个式子求三次导:

y'   = 3A x² + 2B x + C
y''  = 6A x + 2B
y''' = 6A

显然,我们希望近似函数的三阶导数在 x=0 处等于原函数 f(x) 的三阶导数 f'''(0)

x=0y''' = 6A,因此:

f'''(0) = 6A
A = f'''(0) / 6

最后,我们可以将这个三阶近似添加到图中,并写出它的表达式。

你现在可以看到,近似不仅显著改善,而且我们可以逐项添加更高阶的项,并且在每种情况下,低阶项都保持不变。

构建通用表达式

我们现在想构建一个通用表达式,使得低阶项保持不变,从而无需逐步推导就能写出四阶近似。

注意到三次项前面的系数 1/6,是因为对三次项求了三次导数。当我们对 x⁴ 求三次导时,前面会得到 4 × 3 × 2,导致系数为 1 / (4 × 3 × 2),即 1/24

运算 4 × 3 × 2 有一个名字,叫做 4的阶乘,记作 4!。事实上,所有项都可以被认为前面有一个阶乘,甚至是 0!(由于某些原因,它等于1)。

随着这最后一块拼图就位,我们现在可以说,近似中的第n项就是:

[ f⁽ⁿ⁾(0) / n! ] * xⁿ

因此,完整的幂级数可以写成如下形式:

f(x) ≈ Σ [n=0 到 ∞] [ f⁽ⁿ⁾(0) / n! ] * xⁿ

麦克劳林级数与泰勒级数

虽然我们在这里写出的式子确实算作泰勒级数,但由于我们特指在 x=0 点展开的情况,我们通常称这种情况为麦克劳林级数。所以,你还得再等一个视频才能看到完整形式的泰勒级数表达式。

总结

本节课中,我们一起学习了如何推导函数的幂级数(麦克劳林级数)表示。我们从图形化构建零阶、一阶、二阶和三阶近似开始,理解了每增加一阶信息(导数)如何改进对原函数的近似。最终,我们推导出了通用的第n项公式 f⁽ⁿ⁾(0) xⁿ / n!,并将其求和得到完整的幂级数表达式。这个工具允许我们仅通过函数在某一点的值和所有阶导数值,来重构整个“表现良好”的函数。

在本模块的其余部分,我们将把幂级数的概念应用到一些有趣的案例中,并将其推广到更高维度。在更高维度中,我们将不再是构建近似曲线,而是构造近似超曲面。下次见。

030:幂级数细节

在本节课中,我们将学习泰勒级数。我们将从回顾麦克劳林级数开始,然后将其推广到围绕任意点展开的泰勒级数,并最终得到其通用公式。

从麦克劳林级数到泰勒级数 🚀

上一节我们介绍了如何将函数 e^x 表示为幂级数。本节中我们来看看,当我们对这个级数逐项求导时会发生什么。

对多项式逐项求导并不困难。有趣的是,对于 e^x 的导数,这个无限长的级数保持不变,这与我们对 e^x 导数的预期一致。

现在,我们终于可以引出泰勒级数了。从根本上说,我们应用的是与之前推导麦克劳林级数相同的逻辑。麦克劳林级数表明,如果你知道一个函数在 x=0 处的所有信息,你就可以重构它在任何地方的信息。泰勒级数则指出,x=0 这个点并没有什么特殊性。因此,泰勒级数认为,如果你知道函数在任意一点的所有信息,你就可以重构该函数在任何地方的信息。这是一个微小但重要的改变。

围绕任意点展开 🔍

让我们再次以函数 e^x 及其前四个近似函数为例。利用我们对麦克劳林级数的理解,我们可以将其重写为简洁的求和符号形式,这样我们就可以根据需要,构建任意精度的多项式近似函数。

那么,如果我们现在不想围绕 x=0 展开,而是想从点 x=p 开始展开呢?首先,让我们看看在该点的前四个近似函数。

描述这些近似的表达式仍然需要函数在该点的值及其所有导数值。但我们如何调整通用方程,以允许在任意展开点 x=p 进行展开呢?

显然,零阶项很简单,它是一条水平线,处处使用 f(p) 的值。但如果我们仔细研究一阶近似,这应该能给我们足够的启示,以便处理所有其他高阶项。

推导一阶近似 📐

我们本质上是要在点 P 处构建曲线的切线。所有直线都具有 y = mx + c 的形式。现在,让我们利用所有可用信息来推导它。

假设我们有一个待处理的函数。点 P 的坐标是 (p, f(p))。我们想构建一个一阶近似函数,它有一个 y 轴截距和一个梯度,看起来会像一条经过该点的直线。

这条绿色直线的方程为 y = mx + c。我们立即知道 m 是这条直线的梯度,而函数在该点的梯度就是 f'(p)。因此,我们可以写成 y = f'(p) * x + c。剩下的就是求 c

为了求 c,我们需要知道直线上的一个点 (x, y)。我们知道点 (p, f(p)) 在直线上。将其代入方程:
f(p) = f'(p) * p + c

整理求 c
c = f(p) - f'(p) * p

c 代回通用方程:
y = f'(p) * x + [f(p) - f'(p) * p]

最后,将 f'(p) 提取出来因式分解,得到一个简洁的形式:
y = f'(p) * (x - p) + f(p)

这个结果表明,当我们围绕点 P 构建近似时,在使用梯度项 f'(p) 时,我们不是直接将其应用于 x,而是应用于 (x - p)。你可以将 (x - p) 理解为距离点 P 有多远。

构建泰勒级数公式 🧩

现在,我们可以写出函数 f(x) 在点 P 处的前两个近似函数:零阶和一阶。

回想上一节视频中的麦克劳林级数。为了将其转换为泰勒级数,我们只需要用 f''(p) 代替 f''(0),并用 (x-p) 代替 x。但请注意,系数 1/2 仍然保留。

以下是前几项:

  • 0阶近似f(p)
  • 1阶近似f(p) + f'(p)(x-p)
  • 2阶近似f(p) + f'(p)(x-p) + (1/2!) f''(p)(x-p)²

现在,我们可以看看麦克劳林级数的简洁求和符号,并将其全面升级为更通用的泰勒级数形式。当然,如果我们决定设 p=0,那么两个表达式将变得完全相同。

泰勒级数通用公式 ✅

我们现在得到了完整的一维泰勒级数表达式,它允许我们方便地将函数重新表达为多项式级数。

泰勒级数公式如下:

f(x) = Σ [n=0 到 ∞] ( f⁽ⁿ⁾(p) / n! ) * (x - p)ⁿ

其中 f⁽ⁿ⁾(p) 表示函数 f 在点 pn 阶导数。

在本模块的剩余部分,我们将运用这个结果,并将其扩展到高维空间。下次见。

总结 📝

本节课中我们一起学习了泰勒级数。我们从逐项求导幂级数的有趣现象出发,回顾了麦克劳林级数围绕 x=0 展开的局限性。通过推导围绕任意点 p 的一阶近似(切线),我们引入了 (x-p) 项。最终,我们将麦克劳林级数推广为更通用的泰勒级数公式,该公式利用函数在某一点 p 的各阶导数信息,来近似函数在该点附近的行为。

031:04_01_06

在本节课程中,我们将通过两个有趣的示例来检验对幂级数的理解。我们将首先构建余弦函数的麦克劳林级数展开,然后分析一个更具挑战性的函数 1/x 的泰勒级数。通过这两个对比鲜明的例子,我们将直观地看到幂级数如何逼近“表现良好”的函数,以及它在处理“表现不佳”的函数时会遇到哪些困难。

示例一:余弦函数的麦克劳林级数展开 🌟

上一节我们介绍了幂级数和泰勒级数的基本概念。本节中,我们来看看如何将其应用于一个经典函数——余弦函数。

余弦函数是“表现良好”函数的典范,它在任意点都连续,并且无限次可微。由于我们要构建的是麦克劳林级数,我们需要找出函数在 x = 0 处的所有信息。

以下是求导过程:

首先,我们对 cos(x) 进行多次求导,会得到一个循环模式:

  • f(x) = cos(x)
  • f'(x) = -sin(x)
  • f''(x) = -cos(x)
  • f'''(x) = sin(x)
  • f''''(x) = cos(x)

x = 0 处计算这些导数值:

  • f(0) = cos(0) = 1
  • f'(0) = -sin(0) = 0
  • f''(0) = -cos(0) = -1
  • f'''(0) = sin(0) = 0
  • f''''(0) = cos(0) = 1

从幂级数的角度看,这意味着每隔一项的系数为零。这些零值出现在奇数次求导时,因此所有 x 的奇数次幂(如 x^1, x^3, x^5 等)都不会出现在级数中。x 的偶数次幂都是偶函数,像余弦函数一样关于 y 轴对称。

现在,我们可以将上述值代入麦克劳林级数的一般表达式,并写出前几项:
cos(x) ≈ 1 + 0*x + (-1)*x^2/2! + 0*x^3/3! + 1*x^4/4! + ...
化简后得到:
cos(x) ≈ 1 - x^2/2! + x^4/4! - x^6/6! + ...

我们可以用一个简洁的求和符号来完整描述这个级数,而无需写出所有项:
cos(x) = Σ_{n=0}^{∞} [(-1)^n / (2n)!] * x^{2n}

注意,这个表达式甚至不直接包含“余弦”,所有必要的信息都通过 (-1)^n 来捕捉,它负责在正负号之间交替。

完成理论推导后,我们可以让计算机绘制出这个精度不断提高的麦克劳林级数序列。从 y=1 的水平线开始,随着项数的增加,近似曲线会逐渐逼近真实的余弦曲线。

需要注意的是,在距离 x=0 点较远的区域,近似会迅速失效并变得毫无用处。当我们使用16阶近似时,在图表所示的区域内已经拟合得非常好,但在此坐标轴稍远的范围,函数值也会变得非常大。因此,在使用级数近似时,必须清楚其有效的定义域。

示例二:函数 f(x) = 1/x 的泰勒级数展开 ⚠️

在第二个例子中,我们将分析函数 f(x) = 1/x。这是一个简单函数,但在 x=0 处存在间断点。这绝对不是一个“表现良好”的函数。

事实上,它的表现如此之差,以至于当我们试图构建零阶近似(即在某点求函数值)时,如果选择 x=0,会立即遇到问题,因为需要计算 1/0,这是未定义的。计算机可能会返回 NaN(非数字)。

因此,我们需要尝试不同的策略。显然,在 x=0 处我们不会有好结果,那么为什么不尝试其他点呢?让我们看看 x=1 这个点。它至少通过了第一项测试——可以在该点计算函数值。然而,离开 x=0 意味着我们现在需要使用更一般的泰勒级数,而不是麦克劳林级数。

我们现在需要找出函数的几个导数,看看是否能发现规律。

以下是求导过程:

  • f(x) = x^{-1}
  • f'(x) = -x^{-2}
  • f''(x) = 2x^{-3}
  • f'''(x) = -6x^{-4}

x=1 处计算这些导数值:

  • f(1) = 1
  • f'(1) = -1
  • f''(1) = 2 = 2!
  • f'''(1) = -6 = -3!

我们得到了一系列阶乘项,就像最初推导幂级数公式时一样。

现在将这些值代入泰勒级数公式,阶乘项会相互抵消,最后只剩下 (x-1)^n 项的和,并带有交替的符号:
1/x ≈ 1 - (x-1) + (x-1)^2 - (x-1)^3 + ...

这可以简化为一个简洁的求和符号表示:
1/x = Σ_{n=0}^{∞} (-1)^n (x-1)^n,其中 |x-1| < 1

同样,我们将这个公式交给计算机,让它绘制出一系列从 x=1 处函数高度开始的、精度不断提高的近似曲线。

这个特定的例子有几个非常有趣的特征,揭示了幂级数更普遍的性质:

  1. 近似曲线完全忽略了垂直渐近线,直接穿过了它。
  2. x < 0 的区域,函数完全不被这些近似所描述。
  3. 虽然对于较大的 x 值,近似在逐渐改善,但你可以看到级数的“尾巴”在剧烈摆动,因为每一项的符号在正负之间来回翻转。

总结与展望 🔄

我希望这两个例子清楚地展示了泰勒级数如何成功地重建像 cos(x) 这样表现良好的函数,同时也说明了它在处理像 1/x 这样表现不佳的函数时为何会陷入困境。

随着本节视频接近尾声,让我们回顾一下这两个近似序列的动态过程。

在下一节视频中,我们将简要讨论函数线性化的含义,并看看这与我们目前所学的泰勒级数分析有何关联。到时见。

032:线性化

在本节课中,我们将基于已学的泰勒级数知识,将其重新表述,以帮助我们理解近似计算中的预期误差。

概述

我们将学习如何将泰勒级数改写为更实用的形式,用以分析一阶近似(线性化)的误差,并理解数值方法(如前向差分法)的精度。

从泰勒级数到线性化

上一节我们介绍了泰勒级数。本节中,我们来看看如何将其改写,以突出“变化量”的概念。

以函数 f(x) 在点 p 附近的一阶近似为例,原始的泰勒展开式为:
f(x) ≈ f(p) + f'(p) * (x - p)

这个表达式表明:从高度 f(p) 出发,当你远离点 p 时,高度的变化量等于你移动的距离乘以函数在 p 点的梯度。这本质上是将“梯度 = 上升量 / 移动距离”重新排列为“上升量 = 梯度 × 移动距离”。

由于我们总是用这个近似来估算点 p 附近的函数值,因此可以引入更清晰的符号:

  • 将距离 (x - p) 记作 Δx,代表一个远离 p 点的小步长。
  • 那么 x 就可以表示为 p + Δx
  • 最后,为了符合常规写法,我们将所有 p 替换为 x。这并不改变概念,只是改变了符号。

经过这些符号替换,一阶近似公式变为:
f(x + Δx) ≈ f(x) + f'(x) * Δx

相应地,完整的泰勒级数也可以改写为以 xΔx 表示的形式:
f(x + Δx) = f(x) + f'(x)Δx + (f''(x)/2!)Δx^2 + (f'''(x)/3!)Δx^3 + ...

近似误差分析

现在我们有了一个方便的形式来讨论近似。一个关键问题是:当我使用一阶近似而不是原函数时,预期的误差有多大?

观察图像可以发现,白色曲线(原函数)与绿色直线(一阶近似)之间的差距随着远离点 x 而增大。

分析误差的一种方法是:我们知道函数可以由这个无穷级数精确表示。因此,虽然我们无法计算所有项,但我们知道在使用一阶近似时,我们忽略的第一项(即第二项)包含 Δx^2

这意味着,如果 Δx 是一个小数,那么 Δx^2 就是一个更小的数,Δx^3 则小到可以忽略不计。

因此,我们可以重写一阶近似,加入一个误差项:
f(x + Δx) = f(x) + f'(x)Δx + O(Δx^2)

这里的 O(Δx^2) 表示误差的量级与 Δx^2 成正比。我们也称这个近似是二阶精确的。

这个过程——取一个函数并忽略 Δx 的高阶项——被称为线性化。原因现在很清楚了:我们将一个可能非常复杂的函数,用一条直线(线性函数)来近似。

与前向差分法的联系

本节最后分享的观点可能最有趣,因为它将我们带回了课程开始时遇到的“上升量/移动距离”近似。

绿色直线是函数在点 x 处的一阶泰勒近似,也就是曲线在 x 点的切线。现在,我们添加另一条线:它使用“上升量/移动距离”方法,利用距离 xΔx 的另一个点来近似 x 点的梯度。

我们在课程开始时用这种前向差分法来帮助建立导数的定义,并注意到当 Δx 趋近于0时,近似变得精确。

然而,如果 Δx 不趋近于0,第二个点与 x 保持一个有限的距离,会发生什么?你计算出的梯度将包含误差。

我们可以再次利用完整的泰勒级数来估算这个误差的大小。通过一些代数变换,我们可以重新排列级数,将梯度项 f'(x) 分离在等式左边:
f'(x) = [f(x+Δx) - f(x)] / Δx - (f''(x)/2!)Δx - (f'''(x)/3!)Δx^2 - ...

由于级数是无穷的,这仍然是 x 点梯度的精确表达式。但等式右边看起来非常可疑:它很像“上升量/移动距离”表达式([f(x+Δx) - f(x)] / Δx),再加上一系列高阶项。

我们注意到,第一个高阶项包含 Δx。因此,我们可以将它们全部归并,并得出结论:在两个具有有限间隔的点之间使用“上升量/移动距离”方法,会给出一个梯度近似值,其误差与 Δx 成正比(或更高阶)。

换句话说,前向差分法是 一阶精确的。

总结

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

  1. 将泰勒级数重写为使用 Δx 的形式,以便于分析变化和近似。
  2. 理解了一阶近似(线性化)的误差量级为 O(Δx^2),即二阶精确。
  3. 分析了数值微分方法(如前向差分法)的误差,并得出其为一阶精确(误差为 O(Δx))的结论。

虽然花这么多功夫只是为了理解近似中的误差似乎有些奇怪,但当我们要求计算机进行数值求解(而非解析求解)时,这成为一个极其重要的概念。它帮助我们选择合适的方法并理解结果的可靠性。

033:多元泰勒公式

概述

在本节课中,我们将学习如何将一维的泰勒级数推广到多元函数,即多元泰勒公式。我们将看到,它能够用简洁的向量和矩阵形式,近似计算多元函数在某点附近的值,并理解其几何意义。


从一维到多维的推广

上一节我们介绍了幂级数的概念,以及如何用它来近似函数。我们还看到了如何用幂级数来估计使用这些近似时产生的误差大小,这在应用数值方法时非常有用。

本节中,我们将非常简要地探讨本主题的最后一个想法:将我们目前所见的一维幂级数升级到更一般的多元形式。

为了回顾上一视频的符号选择,我们看到了泰勒级数可以有两种等价的表达形式:一种强调在点P处构建函数的近似,另一种强调使用该函数来评估距离点P一小段距离Δx的其他点。为了确保你能看出它们是相同的,我们可以将前四项并排写出以进行清晰比较。

在本视频中,我们将继续使用Δx符号,因为它更紧凑,这在处理更高维度时会很方便。

我们不会详细推导多元泰勒级数,因为本视频主要希望你能了解多维幂级数的样子,包括其方程形式和图形表示。


二维情况与几何直观

考虑到我们的一维表达式,让我们从二维情况开始,其中F现在是两个变量X和Y的函数。因此,我们截断的泰勒级数表达式将使我们能够近似计算函数在附近点 (X + Δx, Y + Δy) 的值。

让我们来看一个简单的二维高斯函数,许多人在学习统计学中的正态分布时可能对它很熟悉。这是一个性质良好、在点(0,0)处有简单最大值的函数。

在一维分析中,我们的幂级数会给出一个一维函数的表达式。然而,在二维情况下,我们的幂级数当然会给出一个二维函数,我们更直观地称之为一个曲面。

与一维情况类似,我们的零阶近似就是函数在该点的值,并应用到所有地方。这意味着在二维中,这只是一个平坦的曲面。

因此,在峰值处的零阶近似看起来像这样。而在钟形侧面某点的零阶近似看起来则更像这样。

这相当直接。现在让我们思考一阶近似,再次类比一维情况。一阶近似应该有一个高度和一个梯度。因此,我们仍然期望得到一个直的曲面,但这次它可以有角度。

如果我们在峰值处计算它,这不会是一个很有趣的情况,因为这是一个驻点,梯度为0。然而,让我们再次看看斜坡侧面的点。

在此处取一阶近似,会给我们一个在该点具有相同高度和梯度的曲面。

最后,让我们看看这两个点的二阶近似。我们现在期望某种抛物面。然而,如果我在峰值处计算它,似乎什么也没出现,但那只是因为我们是在钟形曲线内部创建了一个抛物线,所以我们需要从下方观察才能看到它。

最后,如果我们在钟形曲线侧面的点绘制二阶近似,你可以看到我们最终得到某种有趣的鞍形函数。但即使肉眼观察,也能清楚地看到该点的梯度和曲率匹配得很好,尽管这个近似显然在点周围一个相当小的区域之外没有用处。


多元泰勒公式的表达式

我们现在来看看如何写出这些函数的表达式。

如果我们想在点 (x, y) 处构建二维函数F的泰勒级数展开,然后用它来评估函数在点 (x + Δx, y + Δy) 的值,我们的零阶近似只是一个平坦的曲面,其高度与函数在展开点的高度相同。

一阶近似包含了两个方向上的梯度信息。我们再次考虑“上升量等于梯度乘以移动量”的概念。

为了紧凑起见,这里我使用带下标的偏导符号来表示对某个变量的导数。

如果我们现在看二阶近似,可以看到系数 1/2 仍然保留,与一维情况相同,但现在我们有三个项,它们都是二阶导数。第一项对x求导两次,第二项对y求导两次,中间项则分别对x和y各求导一次。

当然,还有更高阶的项,但我们已经有了足够多的项来理解它。

让我们再看一下一阶项。它是各一阶导数与步长乘积的和,但这应该会让你想起我们对雅可比矩阵的讨论。因此,我们实际上可以将其重新表达为雅可比矩阵乘以一个包含Δx和Δy的向量,我们可以将其写为 Δx,其中粗体x表示包含这两个项的向量。

最后,如果我们以同样的方式看待二阶项,并注意到这些二阶导数可以收集到一个矩阵中,我们之前将其定义为海森矩阵。那么,为了得到我们需要的和,我们现在必须用我们的Δx向量乘以海森矩阵,然后再乘以Δx向量的转置。就是这样。


总结

本节课中,我们一起学习了多元泰勒公式。我们现在有了一个简洁、紧凑的二阶多元泰勒级数展开表达式

f(x + Δx) ≈ f(x) + J(x) Δx + (1/2) Δx^T H(x) Δx

这个表达式汇集了我们微积分和线性代数的许多技能,并运用了我们在课程早期定义的雅可比矩阵海森矩阵的概念。

尽管在本视频中我们一直在讨论二维情况,但我们的J、H和Δx项实际上可以包含任意数量的维度。因此,这个公式可以立即从二维推广到多维超曲面,这非常酷。

034:总结与展望 🎯

在本节课中,我们将总结多元微积分模块四的核心内容,并展望后续课程中即将学习的实际应用。

模块四总结 📚

上一节我们介绍了多元微积分中的核心工具。本节中,我们来看看本模块的最终成果。

本模块的课程到此结束。你现在已经掌握了所有必要的工具,可以进行一些真正有用的工作。

后续内容展望 🚀

以下是关于后续课程的核心介绍。

在接下来的两节课中,David将引导你学习一种将函数拟合到数据的方法。该方法将大量运用微积分知识。

具体而言,该方法将包括:

  • 运用所有四个节省时间的求导法则的多元形式。
  • 实际应用雅可比矩阵。

课程结束语 ✨

本节课中我们一起学习了多元微积分模块四的完结,并了解了如何将这些数学工具应用于实际的机器学习问题——即函数拟合。

祝你学习顺利。我将在整个课程结束时再与你交流。😊

035:牛顿-拉夫森法

在本节课中,我们将学习如何使用微积分与向量结合来求解方程。我们将从一个简单但强大的方法开始:牛顿-拉夫森法。该方法仅需计算函数值及其梯度,即可迭代地逼近方程的解。

从问题出发:拟合模型参数

假设我们有一个身高分布数据,其均值为 μ,标准差为 σ。我们希望找到一个模型(例如高斯分布)来拟合这些数据,这样我们就不必处理所有原始数据点,而只需使用包含两个参数 μσ 的模型。这能让我们更快地进行计算和预测。

那么,如何找到模型的最佳参数 μσ 呢?我们将定义一个衡量模型与数据拟合程度的表达式,然后观察这个“拟合优度”如何随着拟合参数 μσ 的变化而变化。本质上,我们是在求解一个以拟合参数为变量的方程。

牛顿-拉夫森法原理

为了理解如何求解,我们首先看一个简单的一维例子。考虑方程:
y = x³ - 2x + 2
其导数为:
dy/dx = 3x² - 2

假设我们不知道这个函数的图像,也无法计算每个点的值(或者函数维度太高无法可视化),但我们想求解方程 y = 0 的解,即:
x³ - 2x + 2 = 0

我们从某个初始猜测值开始,例如 x₀ = -2

以下是牛顿-拉夫森法的核心步骤:

  1. 在初始猜测点 xᵢ 计算函数值 f(xᵢ) 和梯度(导数)f'(xᵢ)
  2. 利用当前点的梯度信息,沿切线方向外推至 y=0 的轴,得到一个新的猜测值 xᵢ₊₁
  3. 将新猜测值作为起点,重复上述过程。

更新猜测值的公式为:
xᵢ₊₁ = xᵢ - f(xᵢ) / f'(xᵢ)

迭代过程演示

让我们通过一个表格来演示这个过程:

迭代次数 (i) 猜测值 (xᵢ) 函数值 f(xᵢ) 梯度 f'(xᵢ) 新猜测值 xᵢ₊₁
0 -2.000 -2.000 10.00 -1.800
1 -1.800 -0.232 7.720 -1.770
2 -1.770 -0.005 7.399 -1.769
3 -1.769 ~2.3e-6 7.393 -1.769

可以看到,仅仅经过三次迭代,我们就得到了一个非常接近真实解(约 -1.769)的值。这种方法非常高效,我们不需要绘制整个函数图像或进行大量计算,只需要能够计算函数值及其导数即可。

方法的优势与潜在问题

牛顿-拉夫森法是一种迭代法,对于求解高维或复杂函数的根非常有效。然而,它并非总是完美工作。

以下是可能遇到的问题:

  • 循环震荡:如果初始猜测不当,算法可能会在两个值之间循环,永远无法接近真实解。例如,从 x=0 开始,可能会在 01 之间震荡。
  • 梯度接近零:如果当前猜测点非常靠近函数的极值点(梯度 f'(xᵢ) ≈ 0),那么更新公式中的除法会使下一步的猜测值变得非常大,导致算法发散。

总结与直观比喻

本节课我们一起学习了牛顿-拉夫森法。这是一种利用梯度信息逐步逼近方程解的强大迭代方法。

可以将其想象成在浓雾中下山:你知道当前的海拔高度(函数值)和脚下的坡度(梯度),但看不见整座山的全貌。你根据当前的坡度决定下一步的方向,迈出一步后,再次测量新的高度和坡度,如此反复,直到抵达目的地(解)。关键在于,你不需要了解整个地形(函数全局图像),只需要局部信息即可引导你前进。

在下一个视频中,我们将探讨如何将这个方法应用到多变量情况,这将会涉及到梯度向量的概念,以及如何在等高线图上“下山”。

036:梯度下降

概述

在本节课中,我们将学习如何将求解单变量函数极值的牛顿法思想,推广到多变量函数。我们将引入梯度向量这一核心概念,并利用它来寻找多变量函数的最快下降方向,最终介绍一种名为“梯度下降”的优化方法,该方法在机器学习中用于寻找模型参数的最佳拟合值。


我们已经介绍了使用梯度迭代求解单变量函数零点的牛顿法。本节中,我们来看看如何将其推广到多维函数,即多变量函数,并学习如何使用梯度来寻找此类函数的最大值和最小值。未来,这将使我们能够优化、找到我们试图拟合的函数参数的最佳值。

假设我有一个函数 F = x²y。这个函数的图像如下所示:当x很大且y为正时,函数值变得很大且为正;当y为负时,函数值为负。

如果沿着y轴看,我们得到一条直线的投影。如果旋转视角沿着X轴看,对于正的Y,我们得到一个向上的抛物线。


对于负的Y,则得到一个向下的抛物线。函数在两个坐标轴上的值都为零。

在Matlab底部,我使用了surfc函数来绘制函数值为常数的等高线,就像地形图中的等高线一样。本视频中我们要回答的问题是:如何找到下山最快的路径?

之前,你已经学会了如何求函数关于每个坐标轴的偏导数。通过将其他变量视为常数来对函数F求导,就可以找到∂F/∂x。

以函数 F(x, y) = x²y 为例。

  • ∂F/∂x 等于对x求导,将y视为常数,结果是 2xy
  • ∂F/∂y 等于对y求导,将x²视为常数,结果是

现在,我们可以将这两个偏导数写成一个向量,称之为F的梯度(gradient of F),记作 grad F∇F

梯度向量就是将偏导数作为分量写成的向量:
∇F = [∂F/∂x, ∂F/∂y]

梯度是一个结合了线性代数与微积分的强大向量。如果我们沿着一个小向量 r = [dx, 0] 移动,那么 ∇F · r 的结果是 (∂F/∂x)*dx + 0。这表示我们沿着X轴移动了dx距离。因此,梯度与一个向量的点积,会给出该向量在X和Y方向上分别由∂F/∂x和∂F/∂y贡献的变化量,它告诉我们函数值下降了多少。重要的是要记住,梯度是在空间中的某个特定点 (a, b) 处计算的。

接下来,如果我们想知道沿着某个任意方向的单位向量移动时,函数会变化多少。我们称该单位向量为 ,其分量为 [C, D],且满足 C² + D² = 1

那么变化量 D 为:
D = (∂F/∂x) * C + (∂F/∂y) * D
这其实就是 ∇F · r̂。我们称之为方向梯度

另一个问题是:这个方向梯度的最大值是多少?已知 ∇F 是一个向量,我们将其与单位向量 点积。问题在于,给定 是单位向量,点积的最大值是多少?

点积公式为 |∇F| |r̂| cosθ,其中 |r̂|=1。因此,最大值出现在 cosθ = 1,即 θ = 0 时,这意味着 ∇F 方向平行。

所以,为了找到方向梯度的最大值,我们希望 是梯度向量归一化后的版本。我们可以进行计算:
∇F · (∇F / |∇F|) = (∇F · ∇F) / |∇F| = |∇F|² / |∇F| = |∇F|

因此,方向梯度能取到的最大值就是梯度向量的大小 |∇F|。这也就是我们能获得的最陡峭的梯度大小。

另一个问题是:梯度指向哪个方向?这一点不太直观,但梯度指向最陡上升的方向,垂直于等高线。

想象你在一个雾天爬山,你只能看到周围局部区域。如果你想下山,你不会沿着等高线走,而是会直接下山。如果等高线是这样的,下山的方向与等高线成90度角。根据定义,∂F/∂x为正表示你在上山。所以实际上,∇F 指向最陡的上山方向,而 -∇F 则指向最陡的下山方向。

现在,如果我们有一个数据科学问题,想要最小化数据值与模型拟合值之间的差异,那么我们需要找到函数的最低点(这个函数可以理解为“误差”或“不良度”)。我们想找到不良度最小化的点,即最佳点。

类似于牛顿法,我们可以利用梯度从某个试验点出发,向解的方向移动。但在牛顿法中,我们寻找的是零点;而在这里,我们不知道函数的最小值是多少,就像我们在山上但不知道山谷的海拔一样。

在所谓的梯度下降法中,我们采取一系列小步下山。具体来说,如果我们从某个位置 S_n 开始,那么下一个位置 S_{n+1} 由下式给出:
S_{n+1} = S_n - η * ∇F(S_n)
其中 η 是一个小的正数,称为学习率。

在图上,这看起来就像是沿着下山方向(蓝色小箭头)走一小步,然后重新评估梯度,再走下一步,如此重复一系列下山步骤。

如果我们步幅过大而“ overshoot ”(越过最低点),这也没关系,因为梯度会引导我们回到最小值附近。注意,当我们接近极值点时,梯度会变平缓,步长也会因为梯度变小而自动减小。这是一个相当不错的方法,有很多方式可以增强它,但这是主要思想。它非常强大且简单。

需要注意的另一件事是,在“地形”中可能存在多个局部最小值。那么我们可能会被困在其中一个里面。当然,我们找到哪一个取决于我们的起始点。我们一次只能找到一个,而不会发现其他的。所以在一般情况下,这种方法存在一些问题。但尽管如此,这仍然是一个非常简洁的方法——就是简单地沿着下山方向走小步。这可能是现实世界中大多数数值优化采用的主要方式。


总结

本节课中,我们一起学习了梯度向量 ∇F,它将微积分和向量结合起来,让我们迈出了向量微积分的第一步。这使我们能够找到一种方法,利用梯度在多变量情况下逐步逼近问题的最优解,这种方法被称为梯度下降

037:约束优化

概述

在本节课中,我们将要学习如何求解带有约束条件的函数最值问题。上一节我们介绍了梯度下降法,本节中我们来看看当我们需要在某个特定路径(例如一条线或一个圆)上寻找函数的最大值或最小值时,该如何处理。这种方法被称为拉格朗日乘数法

从梯度到约束优化

我们之前了解到,梯度向量 grad F 指向函数 F 增长最快的方向,并且垂直于函数的等高线。基于此,我们发展出了寻找多元函数最小值和最大值的方法——梯度下降法。

现在,我们考虑一个不同的问题:如果我们想找到函数 F(x, y) 的最大值或最小值,但要求点 (x, y) 必须位于某个特定的路径上(例如一个圆),该怎么办?这被称为约束优化问题。

拉格朗日乘数法的核心思想

拉格朗日是一位法国数学家。他观察到,当函数的等高线恰好与约束路径相切时,我们就找到了该路径上的最大值或最小值点。

以下是其原理的直观解释:

  • 当等高线值略小时,它可能完全不会与路径相交。
  • 当等高线值略大时,它可能与路径相交于两个点。
  • 当等高线值恰好使得等高线与路径相切于一点时,该点就是路径上的极值点(最大值或最小值)。

关键在于,在切点处,函数 F 的等高线的法线方向(即 grad F 的方向)与约束路径 G 的法线方向(即 grad G 的方向)是共线的(方向相同或相反)。因此,我们可以建立方程:

grad F = λ * grad G

其中,λ 是一个标量,被称为拉格朗日乘子。这个方程,连同约束方程 G(x, y) = constant,构成了我们求解问题所需的方程组。

实例解析:圆上的最值

让我们通过一个具体例子来应用这个方法。考虑函数 F(x, y) = x²y。我们想找到该函数在圆 x² + y² = a² 上的最大值和最小值。

第一步:建立方程组

根据拉格朗日乘数法,我们需要解以下方程组:

  1. 梯度相等grad F = λ * grad G
  2. 约束条件G(x, y) = a²

首先计算梯度:

  • grad F = (∂F/∂x, ∂F/∂y) = (2xy, x²)
  • grad G = (∂G/∂x, ∂G/∂y) = (2x, 2y),其中 G(x, y) = x² + y²

因此,方程组为:

  1. 2xy = λ * 2x
  2. x² = λ * 2y
  3. x² + y² = a²

第二步:求解方程组

以下是求解步骤:

  1. 由方程 (1):2xy = 2λx。假设 x ≠ 0,两边除以 2x,得到 y = λ

  2. λ = y 代入方程 (2):x² = (y) * 2y = 2y²。所以 x² = 2y²,即 x = ±√2 * y

  3. x² = 2y² 代入约束方程 (3):2y² + y² = a² => 3y² = a² => y = ± a / √3

  4. 根据 x = ±√2 * y,我们可以得到四组解:

    (x, y) = ( √2 * (a/√3),   a/√3 )
    (x, y) = ( √2 * (a/√3),  -a/√3 )
    (x, y) = (-√2 * (a/√3),   a/√3 )
    (x, y) = (-√2 * (a/√3),  -a/√3 )
    

第三步:计算函数值并判断最值

现在,我们将这四组解代入原函数 F(x, y) = x²y 来计算函数值:

  • 对于 ( √2*a/√3, a/√3 )F = (2a²/3) * (a/√3) = (2a³)/(3√3)
  • 对于 ( √2*a/√3, -a/√3 )F = (2a²/3) * (-a/√3) = -(2a³)/(3√3)
  • 对于 (-√2*a/√3, a/√3 )F = (2a²/3) * (a/√3) = (2a³)/(3√3)
  • 对于 (-√2*a/√3, -a/√3 )F = (2a²/3) * (-a/√3) = -(2a³)/(3√3)

因此,在圆 x² + y² = a² 上:

  • 最大值(2a³)/(3√3),在点 (±√2*a/√3, a/√3) 处取得。
  • 最小值-(2a³)/(3√3),在点 (±√2*a/√3, -a/√3) 处取得。

从图像上看,两个位于上半圆(y为正)的点是最大值点,两个位于下半圆(y为负)的点是最小值点。这验证了我们的计算结果。

总结

本节课中我们一起学习了拉格朗日乘数法。这种方法利用梯度向量的几何性质,将“在约束路径上求函数极值”的问题,转化为求解一个由 grad F = λ * grad G 和约束方程 G(x,y)=c 构成的方程组。这是一个非常强大且实用的工具,在机器学习中,当模型参数需要满足某些特定关系(如总和为1、位于某个范围内)时,经常会用到约束优化技术。

038:总结与展望

在本节课中,我们将总结本周学习的向量微积分核心内容,并展望下一个模块的主题。我们重点回顾了如何将多元微积分与线性代数结合,以解决优化问题。

本周内容回顾

上一节我们介绍了向量微积分的整体框架。本节中,我们来看看本周所学的具体方法。

本周,你将迄今为止所学的所有多元微积分知识,与向量和线性代数结合起来,学习了向量微积分。

我们共同研究了优化问题,即如何求解方程和优化函数。例如,优化一个函数对某些数据的拟合度。

牛顿-拉夫森法

我们从牛顿-拉夫森法开始。该方法利用梯度来估计从当前猜测值到下一个猜测值(即方程的解)所需的步长。

然后我们不断重复这个过程,直到我们对解的估计收敛到一个满意的结果。

多元函数的梯度

接着,我们探讨了如何在多元情况下求梯度。

我们定义了梯度向量 grad。该向量垂直于等高线,其各元素等于函数沿每个坐标轴的偏导数,即 ∂f/∂x∂f/∂y 等。其大小由各元素平方和的开方给出。

梯度下降法

随后我们发现,可以利用梯度沿山坡向下走,通过每次向下迈出一小步,来寻找函数的最小值(山谷)。

这非常巧妙,因为这意味着我们不需要处处评估函数然后寻找最小值,也不需要利用代数求解函数。只要我们能够计算梯度和拥有一个初始估计值,我们就可以沿着山坡向下走,直到抵达山谷底部。

这种梯度下降法可能是现存最强大的寻找最小值的方法。

拉格朗日乘数法

最后,我们学习了如何在约束条件下解决问题。

我们发现,这需要将目标函数的梯度与约束条件的切线方向相关联,即令两个梯度向量相等,然后求解由此产生的联立方程组。这就是拉格朗日乘数法。

总结与展望

综上所述,这非常巧妙。宏观来看,我们已经学会了如何优化函数,并且将自身从纯粹的代数领域,带入了利用计算机解决问题的领域。

在下一个模块中,我们将继续学习如何使用所谓的最小二乘法,将函数拟合到数据上。

039:简单线性回归

在本节课中,我们将应用多元微积分的知识来学习如何将函数拟合到数据上。这是数据分析中的一项核心技能,能帮助我们理解数据、进行统计检验,并将数学工具应用于现实世界。

数据准备 📊

在开始数学建模之前,首先需要处理原始数据。以下是数据准备的关键步骤:

  • 数据清洗:处理缺失值、零值、重复项和无效数据。一个常见的方法是标记所有数据点,以便在重新排序后能恢复原状,然后排序并识别异常值,最后决定是删除还是用合理值替换它们。
  • 数据探索:清洗完成后,可以开始绘制图表、计算平均值和标准差等,以初步了解数据特征。
  • 培养数据直觉:深入理解你的数据至关重要,就像了解一位朋友。随着数据积累和变化,这种直觉能帮助你敏锐地察觉其中的模式与异常。

完成上述步骤后,你可能会得到类似下图的散点图。数据点大致呈直线分布。你可以根据对数据生成过程的物理理解,或者基于数据的外观(例如看起来像一条直线),来选择一个合适的模型进行拟合。


建立模型与定义目标 🎯

上一节我们讨论了数据准备,本节我们将具体看看如何为数据拟合一条直线。

我们可以用直线模型 y = m*x + c 来拟合数据。其中,m 是斜率,c 是截距。这两个参数构成了我们的参数向量 A。图中展示了对该数据的最优拟合直线,其斜率 m 为 2.15,截距 c 为 0.3。数据集的几何中心由 x 的平均值 y 的平均值 ȳ 表示。

为了找到最优的 mc,我们首先定义残差 rᵢ,即每个数据点的观测值 yᵢ 与模型预测值 ŷᵢ = m*xᵢ + c 之间的差值:

公式: rᵢ = yᵢ - (m*xᵢ + c)

接着,我们定义一个衡量整体拟合优度的指标 χ²(卡方),它是所有残差平方的和:

公式: χ² = Σᵢ (rᵢ)² = Σᵢ [yᵢ - (m*xᵢ + c)]²

对残差进行平方可以确保正负偏差不会相互抵消,并且会对远离直线的点施加更大的惩罚。我们的目标就是找到使 χ² 值最小的 mc,这是一个最小化问题。

可视化损失函数与求解思路 🗺️

理解了拟合目标后,我们可以可视化 χ² 如何随 mc 变化。下图是 χ² 关于 mc 的等高线图。

图中 χ² 的最小值出现在 m ≈ 2.15c ≈ 0 附近。离这个点越远,χ² 值越大,拟合越差。注意,这个“山谷”是倾斜的,这意味着斜率 m 和截距 c 之间存在权衡:如果直线变陡(m 增大),为了更好拟合,截距 c 就需要变小,模型实际上是围绕数据质心 (x̄, ȳ) 旋转的。这个平缓的山谷对于梯度下降类算法可能是个挑战,容易快速下到谷底,但精确找到最低点则较难。

不过,这个问题整体上只有一个明显的最小值,因此是可解的。但通过穷举计算(如图中绘制等高线图需要约20万次计算)效率太低。更高效的方法是找到 χ² 的梯度为零的点:

核心条件: ∇χ² = 0

对于这个简单线性回归问题,我们可以直接求出解析解。本视频将展示这一过程,后续课程则会介绍梯度下降法等数值方法,以处理更复杂、无法显式求解的情况。

推导解析解 📝

现在,我们通过求解 ∇χ² = 0 来得到 mc 的解析解。我们需要分别对 mc 求偏导数并令其为零。

m 求偏导:
∂χ²/∂m = Σᵢ 2 * [yᵢ - (m*xᵢ + c)] * (-xᵢ) = -2 Σᵢ xᵢ(yᵢ - m*xᵢ - c)

c 求偏导:
∂χ²/∂c = Σᵢ 2 * [yᵢ - (m*xᵢ + c)] * (-1) = -2 Σᵢ (yᵢ - m*xᵢ - c)

令这两个偏导数等于零,并整理方程组(忽略常数因子-2),我们得到:

  1. Σᵢ (yᵢ - m*xᵢ - c) = 0
  2. Σᵢ xᵢ(yᵢ - m*xᵢ - c) = 0

由第一个方程,并利用平均值定义 ȳ = (Σ yᵢ)/Nx̄ = (Σ xᵢ)/N,可以推导出截距 c 的表达式:

公式: c = ȳ - m * x̄

这表明最优拟合直线必然穿过数据的质心 (x̄, ȳ)。将 c 的表达式代入第二个方程,经过代数运算(此处省略详细步骤),可以解出斜率 m

公式: m = Σ[(xᵢ - x̄)(yᵢ - ȳ)] / Σ[(xᵢ - x̄)²]

此外,我们还可以估计参数的不确定性(标准差):

公式:
σ_m² = (χ²/(N-2)) / Σ[(xᵢ - x̄)²]
σ_c² = σ_m² * [ (Σ xᵢ²)/N ]

在报告拟合结果时,同时给出参数值及其不确定性至关重要。

结果验证与重要警示 ⚠️

让我们回到拟合结果。下图再次展示了拟合直线。

尽管数据存在噪声,我们得到的斜率 m = 2.15 ± 0.09 精度很高(不确定度约5%)。始终应该将拟合结果与原始数据绘制在一起进行视觉检查,这能帮助发现潜在问题。著名的安斯库姆四重奏(Anscombe‘s quartet)完美地阐释了这一点。

这四组数据拥有完全相同的统计特征(均值、最佳拟合直线、参数不确定性等),但数据分布截然不同。只有左上角的数据适合用直线拟合。右下两组数据明显需要用曲线拟合,而左下组数据中存在一个强影响力的离群点。这警示我们,不能仅仅依赖 χ² 等数值指标,可视化检查必不可少。

优化参数化:消除相关性 🔄

回顾之前 χ² 的倾斜山谷图,它揭示了 mc 之间的相关性。这种相关性也体现在 c 的不确定性公式 σ_c 依赖于 m 上。我们可以通过重新参数化来消除这种相关性。

定义新的变量:x’ = x - x̄,即使用相对于质心 的偏差。此时,模型变为:
y = m * (x - x̄) + b
其中,新的常数项 b 恰好等于 ȳ。在这个参数化下:

  • 常数项 b 不再依赖于斜率 m
  • b 的不确定性 σ_b 也不再包含来自 m 的贡献。
  • 此时 χ² 关于 mb 的等高线图将不再是倾斜的,而更接近圆形,使优化问题在数学上更“良态”。


总结 📚

本节课我们一起学习了简单线性回归的核心内容:

  1. 目标:通过最小化残差平方和 χ²,找到数据的最佳直线拟合。
  2. 方法:推导并求解了模型参数 m(斜率)和 c(截距)的解析解,并了解了如何估计其不确定性。
  3. 关键步骤:数据可视化检查至关重要,安斯库姆四重奏展示了仅依赖统计数字的风险。
  4. 优化技巧:通过将数据中心化(减去均值),可以消除拟合参数之间的相关性,简化问题。

我们定义的核心拟合优度估计量 χ² 在未来处理更复杂的模型时将继续发挥重要作用。在接下来的课程中,我们将探索如何将这些思想扩展到拟合更复杂的函数以及多元回归等情况。

040:一般非线性最小二乘法

在本节课中,我们将学习如何拟合一个任意复杂的函数到数据上,这被称为非线性最小二乘法。我们将从定义拟合优度参数开始,推导出用于寻找最优参数的梯度下降更新公式,并通过一个具体例子来理解整个过程。最后,我们会总结关键步骤,为后续的编程实践打下基础。

上一节我们介绍了线性回归的基本概念。本节中,我们来看看当模型本身相对于参数是非线性时,应如何进行拟合。

假设我们有一个关于变量 x 的函数 y,该函数包含 M 个参数 a_K(其中 K 从 1 到 M)。例如,函数可以是 y(x) = (x - a1)² + a2。请注意,这个函数对于参数 a1 是非线性的,因为加倍 a1 并不会使函数值加倍。因此,我们需要使用非线性最小二乘法。

现在,我们希望将这些参数 a_K 拟合到一些观测数据上。我们拥有 n 个数据点,每个点由一对 (x_i, y_i) 组成,并且每个 y_i 都有一个关联的不确定性 σ_i。不确定性越大,表示对该数据点的置信度越低。

为了量化拟合的好坏,我们定义一个拟合优度参数 χ²(卡方)。

以下是 χ² 的计算公式:

χ² = Σ_{i=1}^{n} [ (y_i - y(x_i; {a_K})) / σ_i ]²

这个公式对每个数据点的模型残差(观测值与预测值之差)进行平方,并用其不确定性 σ_i² 进行加权。这样,不确定性大的数据点在总和中的权重就小,对整体拟合的影响也较小。如果我们不知道 σ_i,可以简单地将它们全部设为 1。

我们的目标是找到一组参数 {a_K},使得 χ² 的值最小。在一般情况下,χ² 达到最小值的条件是它的梯度为零(∇χ² = 0)。然而,对于非线性模型,我们通常无法直接解析求解这个方程。

因此,我们转而使用最速下降法来数值求解。这个方法通过迭代的方式,沿着 χ² 下降最快的方向更新参数,逐步逼近最小值点。

最速下降法的核心是参数更新公式。我们将参数表示为一个向量 a,更新规则如下:

a_next = a_current - λ * ∇χ²(a_current)

其中,λ 是一个常数(学习率),它控制着每次更新步幅的大小。我们不断迭代,直到梯度 ∇χ² 接近零(找到最小值),或者 χ² 值不再显著变化,或者达到预设的迭代次数上限。

为了执行更新,我们需要计算梯度 ∇χ²,即每个参数 a_K 的偏导数 ∂χ²/∂a_K

以下是梯度的计算公式:

∂χ²/∂a_K = -2 * Σ_{i=1}^{n} { [ y_i - y(x_i) ] / σ_i² } * [ ∂y(x_i) / ∂a_K ]

计算这个梯度需要我们知道模型函数 y(x) 对每个参数 a_K 的偏导数 ∂y/∂a_K

将梯度表达式代入更新公式,并合并常数项,我们得到最终的非线性最小二乘最速下降更新公式:

a_next = a_current + λ' * Σ_{i=1}^{n} { [ y_i - y(x_i) ] / σ_i² } * [ ∂y(x_i) / ∂a_K ]_current

其中 λ' 是包含了常数因子后的新学习率。注意,偏导数 ∂y/∂a_K 需要在当前的参数值 a_current 处进行计算。

这个公式看起来复杂,但在具体例子中应用起来很简单。以上面提到的函数 y = (x - a1)² + a2 为例:

  • ∂y/∂a1 = -2*(x - a1)
  • ∂y/∂a2 = 1

将这些具体的导数代入上面的更新公式,就可以进行迭代计算了。

以上就是使用最速下降法进行一般非线性最小二乘拟合的基本原理。它适用于拟合参数呈非线性的任意模型。存在比最速下降法更复杂、更高效的优化算法,我们将在后续内容中简要提及。

本节课中我们一起学习了非线性最小二乘法的核心思想。我们定义了衡量拟合好坏的 χ² 统计量,并推导出通过最速下降法最小化 χ² 的参数迭代更新公式。关键在于计算模型函数对每个参数的偏导数。在接下来的练习中,你将有机会亲自编写代码实现这个过程,并将其应用于具体的数据拟合问题。

041:实践中进行最小二乘回归分析

在本节课中,我们将对数据的最小二乘回归拟合进行总结,并探讨如何在实践中使用 MATLAB、Python 或 R 等计算工具来完成这项工作。

上一节我们介绍了如何构建梯度下降法来最小化平方和,并解决了示例问题。在深入探讨之前,我们还需要做一些补充说明。

🧠 非线性最小二乘求解器

在实际应用中,存在大量用于求解非线性最小二乘问题的算法。

我们可以观察到,如果对 χ² 进行泰勒级数展开,其第二项(二阶导数)就是海森矩阵。海森矩阵提供了关于梯度(即雅可比矩阵的梯度)的曲率信息。

因此,我们可以像牛顿-拉夫森法那样,直接求解雅可比矩阵为零的点。使用海森矩阵会比单纯的梯度下降算法更快。本质上,我们会利用海森矩阵来预估梯度下降中应采取的步长。

然而,问题在于海森矩阵通常不够稳定,尤其是在远离最小值点时。

以下是几种常见的优化算法:

  • 列文伯格-马夸尔特方法:在远离最小值时使用最速下降法,当接近最小值时(根据 χ² 是否改善的标准)切换到使用海森矩阵。
  • 高斯-牛顿法BFGS法:这两种方法以及其他许多算法,要么直接使用海森矩阵,要么在迭代过程中逐步构建海森矩阵的信息。

根据收敛情况,不同的方法可能各有优劣。

🛡️ 鲁棒拟合简介

鲁棒拟合是另一个你应该了解的主题,以备后续查阅。

回顾安斯康姆四重奏,我们看到左下角的数据集存在一个明显的离群点。一个真正鲁棒的拟合方法应不受此类数据点的影响。

一种鲁棒拟合的方法是,不再最小化最小二乘,而是最小化绝对偏差平方偏差。这样不会给远离直线的点赋予过高的权重,从而能得到视觉上看起来更合理的拟合线。

💻 现实世界中的实践方法

现在,让我们来看看如何在现实世界中完成这项工作。

在 MATLAB 中

操作很简单。你只需使用屏幕顶部的“导入数据”选项卡导入数据,然后切换到“应用程序”选项卡并启动“曲线拟合”应用程序。你甚至可以符号化地定义自己的算法,需要选择一个初始猜测值,应用程序就会为你拟合函数。或者,你也可以使用预置的函数,这些函数已知其雅可比矩阵,因此会更快、更高效。

在 Python 中

在科学 Python(SciPy)模块集中,操作几乎同样简单。scipy.optimize 模块包含一个名为 curve_fit 的最小二乘曲线拟合优化器(视频下方提供了链接)。

伴随本视频,我们为你准备了一个 SciPy 拟合数据的示例,以便你了解如何使用它。它非常出色,拟合效果很好。拟合过程仅需三行代码(此处加粗显示):两行定义函数,一行执行拟合。其余代码用于绘图、导入数据等。实际上,SciPy 中的这套例程是现代版 MINPACK 的实现,后者是由 Jorge Moré 在 1980 年发布的一套 FORTRAN 例程,并在《Numerical Recipes》一书中描述。现在做这些事情变得异常简单。

在 R 语言中

与 Python 类似,在 R 统计编程语言中,也有用于将模型非线性最小二乘拟合到数据的优化器。如果你喜欢用 R 处理数据,同样可以轻松完成所有这些工作。

📝 动手练习:拟合高斯分布

现在,我希望你编写一个 Python 代码块来拟合此处所示的高斯分布。

你需要提供一个初始猜测值。我们为你提供了人口身高分布的输入数据集,这就是我们在这两门课程中一直以示意图方式讨论的最终身高分布数据集。

你会发现,此处的平均身高 B 约为 178 厘米,该分布的特征宽度 C 约为 11 厘米。

此时,思考为什么需要初始猜测值很有用。如果我们从平均值为 100 厘米开始猜测,模型曲线将与数据完全不重叠。因此,当我们对 B 做微小调整时,χ² 不会有变化,导致 χ² 关于均值 B 的梯度为 0。算法将不知道朝哪个方向前进,我们无法得到有意义的雅可比矩阵或梯度值,因此算法无法找到最小值。

在进行任何数据拟合时,想出一个好的初始猜测方法至关重要。在这个例子中很简单,例如选择最大值所在的位置。同样重要的是,要将拟合结果与数据进行比较,并判断你是否相信最终的拟合。

🎯 总结

在本视频中,我们结束了关于结合使用向量和多元微积分来优化函数以及将数据拟合到函数的讨论。最终,计算变得非常简单,我们只需几行 Python、MATLAB 或 R 代码即可拟合函数。

但经过所有这些工作,你现在对这些算法底层的运作原理有了一定的理解。这意味着,当算法出错时(例如雅可比矩阵无意义),你将能更好地找出修复方法。同时,你也掌握了学习本机器学习专项课程下一门课程所需的全部数学知识。

042:课程总结

在本课程中,我们学习了多元微积分在机器学习中的核心概念与应用。现在,让我们一起来回顾整个学习旅程。

课程回顾

上一节我们探讨了回归的实际应用,本节我们将对整个课程内容进行总结。

我们快速地从导数的定义开始,探索了多维的“山脉”地形,训练了神经网络,并最终通过实践看到了回归的应用。

核心收获

以下是本课程希望您掌握的关键要点:

  • 理解基础与语言:掌握微积分的基本原理和专业术语。
  • 建立应用直觉:对微积分在机器学习中的可能应用场景形成直观认识。

总结

在本节课中,我们一起学习了多元微积分的基础知识及其与机器学习的联系。虽然本课程未涵盖传统微积分课程的所有细节,但旨在为您打下坚实的根基。

恭喜您坚持完成了这门机器学习多元微积分的入门课程,也感谢您在论坛中的积极参与。教授大家是一种荣幸,祝您在机器学习数学专项课程的下一个阶段一切顺利。

posted @ 2026-03-26 12:23  布客飞龙III  阅读(9)  评论(0)    收藏  举报