DLAI-微积分笔记-全-

DLAI 微积分笔记(全)

001:微积分入门 🧮

概述

在本课程中,我们将学习微积分,特别是导数的概念、工作原理及其在机器学习中的应用。我们还将探讨一些高级技术,如牛顿法。理解这些概念对于掌握机器学习算法的核心原理至关重要。

课程内容介绍

机器学习在很大程度上涉及函数的最小化最大化,这正是本课程的主要应用方向。为此,我们使用导数。事实上,机器学习中的大部分工作都与此相关。

具体来说,在机器学习中,我们通常创建一个成本函数,然后尝试最小化它。这个过程本质上就是微积分。当你训练一个机器学习模型时,你需要计算模型的误差(即它有多“糟糕”),并尝试最小化这个误差。为此,我们使用导数梯度,并教授多种相关技术。

以下是机器学习中微积分的典型应用流程:

  1. 定义成本函数 J(θ)
  2. 计算成本函数关于模型参数 θ 的梯度 ∇J(θ)
  3. 使用梯度下降等优化算法,沿梯度反方向更新参数:θ = θ - α * ∇J(θ),其中 α 是学习率。

通常,实现梯度下降或类似算法的几行代码,实际上就是在运用微积分——某人推导出了导数公式,然后将其转化为代码。因此,理解微积分对于形成关于算法如何工作的良好直觉至关重要。

高维空间中的微积分直觉

对于初学者来说,一个可能显得神秘的地方是:在一维或二维空间中,导数可以理解为斜率。但在机器学习中,我们经常在非常高维的空间中求导,例如成千上万甚至百万维的空间,这很难可视化。

在本课程中,我们将帮助你建立对这些高维空间中微积分操作的直觉。正如在第一门课程中看到的,数据可以是高维的。当你讨论导数时,它可能涉及多个方向,这些方向由长向量长矩阵来捕捉。

我们甚至会探讨二阶导数。二阶导数可以告诉你空间的曲率,它基于二阶导数产生的矩阵(海森矩阵)。这些概念也引向了牛顿法。

高级优化技术:牛顿法

牛顿法是一种非常酷的最小化函数的方法。梯度下降法通常效果很好,但有时梯度下降可能需要数百步才能收敛,而牛顿法可能只需几步就能达到相同的结果。

当然,牛顿法并非适用于所有应用,它通常在参数不是特别多的情况下效果显著。但当它适用时,速度可以非常快。

其核心思想是为你提供一个包含不同技术的工具箱。如果这种方法有效,那就太好了。如果无效,你可以尝试另一种方法。这正是我们在机器学习中常用的方式。

实践环节:代码实验室

本专项课程的一个很酷的特点是提供了大量的Notebook实验。就像在前一门课程中一样,你将能够运行许多代码实验室,实时观察这些概念是如何运作的。

因此,在本课程中,你将学习概念、运行代码实验,并有望获得一些可以在自己的项目中使用的代码片段

总结

本节课我们一起学习了本门微积分课程的概览。我们了解到,微积分(尤其是导数)是机器学习中优化成本函数的核心工具。我们探讨了从一维斜率到高维梯度的概念延伸,并简介了牛顿法等高级优化技术。最后,我们强调了通过代码实验室进行实践的重要性。接下来,让我们深入细节,开始学习这些重要的微积分概念。

002:关于编程经验的说明 🐍

在本节课中,我们将要学习本课程对编程经验的要求,以及如何为课程中的实践环节做好准备。

上一节我们介绍了课程的整体目标,本节中我们来看看完成课程所需的编程技能。

课程设计与编程实践

本课程旨在提供机器学习背后的数学理论基础,并展示这些概念如何应用于实践。这意味着你需要进行一些编程。课程包含计分的编程作业和未计分的编程实验,这些练习专注于应用你正在学习的技能和概念。

编程环境与工具

这些练习使用 Python 编写,并以 Jupyter Notebook 的形式呈现。Jupyter Notebook 是一个基于网页的交互式界面,允许你阅读、运行和编辑这些程序。

所需的Python技能

你不需要成为Python专家即可成功完成练习,但你应该熟悉通常在Python入门课程中教授的概念。

以下是完成本课程练习所需的核心Python技能列表:

  • 数据类型与数据结构:理解如整数、浮点数、字符串、列表、字典等基本类型。
  • 控制流:熟练使用条件语句(if/elif/else)、循环(forwhile)和函数定义(def)。
  • 库的使用:能够导入并使用不同的Python库(例如 import numpy as np)。
  • 代码读写与调试:你应该能够阅读和编辑应用了上述概念的Python代码,编写和调试自己的代码,并偶尔查阅新软件包的文档。

给不同背景学习者的建议

如果你精通另一种编程语言,你应该可以在学习过程中轻松掌握本课程所需的Python知识。

然而,如果你是编程新手,我建议你在开始本课程之前,先学习一门Python入门课程。在接下来的阅读材料中,你将找到一些开始学习Python的优质资源。

本节课中我们一起学习了本课程对编程能力的具体要求。掌握这些基础的Python技能,将帮助你更好地理解数学概念在代码中的实现,从而顺利完成后续的编程作业和实验。

003:导数的直观理解与机器学习动机 🧮

在本节课中,我们将要学习导数的直观概念,并探讨为什么导数在机器学习中至关重要。我们将从速度计的例子开始,逐步了解几种基本函数的导数,并学习如何运用求导法则处理更复杂的函数。最后,我们将通过房价预测和情感分析两个具体例子,揭示导数如何驱动机器学习模型的训练与优化过程。

导数的直观概念

导数是微积分的核心概念之一。我最喜欢的例子是速度。

速度计的例子

你将要学习的第一个例子是速度计的例子。

基本函数的导数

接下来,你将看到数学中几种非常重要且基础的函数,例如:

  • 常数函数
  • 线性函数
  • 二次函数
  • 多项式函数
  • 指数函数
  • 对数函数

你将学习这些函数的导数。

求导法则

为了求出更复杂函数的导数,我们将使用几个法则:

  • 和法则
  • 乘积法则
  • 链式法则
  • 标量乘法法则

导数在机器学习中的重要性

现在有一个问题:为什么导数和微积分在机器学习中如此重要?

其中一个原因是,导数被用来优化函数,特别是用于求函数的最大值和最小值。这意味着寻找一个函数的最大值或最小值。

这在机器学习中非常重要。原因是,当你想要找到以最佳方式拟合数据的模型时,你需要通过计算一个损失函数并使其最小化来实现。

我们将看到几个最小化函数的例子。第一个例子将使用温度的例子。

然后我们将看到其他例子,这些例子实际上会向你介绍机器学习中两个最重要的损失函数:平方损失和对数损失。

机器学习问题实例

让我们从考虑这个问题开始:你有一些房子,每栋房子有不同数量的卧室。第一栋房子有一间卧室,第二栋房子有两间卧室。现在,第一栋房子的价格是15万美元,第二栋是25万美元。

在这个问题中,你希望能够使用房子的卧室数量来预测其价格。

幸运的是,你拥有更多关于给定卧室数量的房屋价格数据,如下表所示。

在这张表中,你有1、2、3、5、6、7、8和10间卧室的房子及其价格,然后还有这栋9间卧室的房子,其价格仍然缺失。

因此,你决定构建一个机器学习模型来帮助你预测这栋有9间卧室的房子的价格。

为了使问题更简单,让我们绘制数据。在下图中,横轴代表卧室数量,纵轴代表房屋价格。

你可以看到,房子在这里用点表示。

模型训练

现在的想法是,机器学习模型接收所有房屋价格的输入数据,并开始一个称为模型训练的过程。

你可以将模型训练阶段视为运行汽车最重要的部分——引擎。模型训练是任何人工智能实验的核心,在这种情况下,它实际上是一个智能引擎,始终在寻找优化的方法,以产生最佳可能的结果。

当我说模型时,在这种情况下,我指的只是一条尽可能接近所有点的直线。

这条线将代表预测价格。因此,当模型训练开始时,它从任意一条随机线开始,其想法是通过调整结果来优化对现有数据点的最佳可能预测。

一旦训练完成,模型就能够为你提供对那栋有9间卧室的房子的良好预测。因此,在这种情况下,预测这栋有9间卧室的房子的价格为95万美元。

这个问题被称为线性回归问题。

另一个例子:情感分析

现在,让我们考虑另一个例子。假设你旅行到一个遥远的星球,并且幸运地遇到了一些外星生命。

你能够与它们互动。第一个外星人说:“act a a”。

假设你有足够的信息知道这个外星人心情愉快。

然后,假设第二个外星人说:“beep, beep”。你知道这个外星人很悲伤。

让我们有更多的数据点。一个外星人说:“act be act”,那个外星人是快乐的。

然后它说:“Act B P Bep”,它是悲伤的。

所以,想法是你不一定想学习外星语言,因为它可能太难,但你希望能够判断一个外星人是快乐还是悲伤。

让我们看一下数据集。这是四个句子:“act act act”,“be peep”,“act beep act” 和 “act be peep peep”。

对于每一个句子,你将收集单词“act”出现的次数和单词“beep”出现的次数。

现在,你还要收集外星人的情绪。因此,这将是一个分类问题。

为什么?因为给定任何句子,其想法是将其分类为快乐或悲伤。由于你将其分类为快乐或悲伤,这被称为情感分析模型。

分类模型的可视化

但用图表表示一切会更清晰。因此,让我们绘制每个句子的图表。在横轴上,你有单词“act”出现的次数;在纵轴上,你有单词“beep”出现的次数。

这次的模型是什么?同样,它将是一条线。假设是这条线,嗯,这条线效果不是很好。模型的想法是能够分类或分开快乐点和悲伤点。

例如,这里有一个更好的模型。当你训练模型时,假设它到达这里的一个理想点,这个理想点将平面分成两个区域:这里用绿色显示的悲伤区域和这里用橙色显示的快乐区域。

其想法是,如果一个新的句子出现,根据它位于哪个区域,模型将预测该句子是快乐还是悲伤。模型可能会犯错,但在大多数情况下,它会做得很好,至少基于它在这个数据集上的表现。

模型背后的数学

那么,模型是如何做到这一点的呢?事实证明,有很多数学在驱动你的模型训练过程。

涉及的一些数学概念包括梯度、导数、优化、损失和成本函数、梯度下降等等。

因此,在本课程中,你将学习模型训练优化及其在数学核心层面的工作原理。在简单的示例中,我们使用了几个模型:我们使用线性回归和分类例子来引出问题。

但你在这里将要学习的技术和概念可以应用于广泛的其他机器学习算法,例如神经网络。


本节课中我们一起学习了导数的直观概念及其在机器学习中的核心作用。我们从速度的例子入手,介绍了基本函数的导数与求导法则。通过房价预测(线性回归)和情感分析(分类)两个生动的例子,我们看到了模型如何通过调整参数(如一条直线)来拟合数据或区分类别,而这个过程的核心正是基于导数(梯度)的优化算法,旨在最小化损失函数。这些基础概念是理解更复杂机器学习模型(如神经网络)的基石。

004:导数动机第一部分

在本节课中,我们将要学习导数的核心概念。导数描述了函数在某一瞬间的变化率,是微积分和机器学习中理解变化趋势的关键工具。我们将通过一个汽车行驶的例子,直观地理解什么是导数以及为什么我们需要它。

什么是导数?🚗

当我想到导数时,首先出现在脑海中的是速度。例如,假设你开车一小时行驶了100公里,那么你的平均速度是每小时100公里。然而,你的速度可能并非恒定不变:你可能起步很快,然后变慢,接着停车,之后又加速,甚至可能在某段时间倒车。因此,平均速度并不能告诉我们某一特定瞬间的速度是多少。这个特定瞬间的速度被称为瞬时速度,而这正是导数的定义:导数是函数的瞬时变化率。在这个例子中,函数是距离,它的导数就是速度。

一个具体的例子 📊

为了更清晰地理解导数的概念,让我们为这个例子添加一些具体数字。

想象你正驾车在一条直路上行驶。你原本有一个显示速度的速度表,但不幸的是它坏了。现在,你有一个应用程序可以告诉你行驶的距离,并且你手上恰好有一个计算器。

你驾驶了一分钟,并生成了一个数值表,记录了你每分钟5秒所行驶的距离。以下是第一个问题。

问题一:汽车是以恒定速度行驶吗?

提示:请查看表格中的距离数值。

答案: 汽车并非以恒定速度行驶。你可以看到,在10秒到15秒这个5秒间隔内,汽车行驶了80米;但在15秒到20秒这个同样为5秒的间隔内,汽车只行驶了63米。这说明从10秒到15秒,汽车的平均速度比从15秒到20秒要快。因此,我们可以得出结论:汽车在这一分钟内的速度并非恒定。

如何计算瞬时速度?❓

很好,你已经确定汽车不是匀速行驶。现在来看第二个问题。

问题二:你能利用这些信息计算出在12.5秒时的瞬时速度吗?

提示:速度等于行驶距离除以所用时间。所以,问题是:你能或不能利用表格中的数据确定12.5秒时的精确速度?

答案: 不能。你无法用表格中给出的数据找到12.5秒时的精确速度。你只能计算出从10秒到15秒这个时间间隔内的平均速度,但你不知道在这个间隔内的具体时刻(比如12.5秒)发生了什么——你可能比平均速度更快,也可能更慢。

然而,有一件事你可以做到:你可以计算出从10秒到15秒这个时间间隔内的平均速度。这就是下一个问题。

计算平均速度 📈

问题三:汽车在10秒到15秒时间间隔内的平均速度是多少?

让我们为表格中的点绘制一个图表,以便观察情况。我们特别放大观察点 (10, 122) 和 (15, 202),因为这两点连线的斜率就是平均速度。

图表如下,这是我们所关注的区间。从10秒到15秒时间间隔内的平均速度,等于图表中连接这两点的直线的斜率。

速度的计算公式是 距离 / 时间,这与计算斜率的公式 上升量 / 前进量 同义。在这里,上升量是距离的变化量,前进量是时间的变化量,因为距离在纵轴上,时间在横轴上。

在15秒时行驶的距离是202米,在10秒时是122米。因此,时间间隔长度为5秒,距离间隔长度为80米。

使用斜率或速度公式,我们得到 80 / 5 = 16 米/秒。穿过这两点的直线斜率为16,这也意味着汽车在这两点之间的平均速度是16米/秒。

寻求更好的估计 🔍

虽然10秒到15秒的平均速度是T=12.5秒时速度的一个不错估计,但我们能否做得更好呢?答案是肯定的。如果我们有更多关于时间点接近t=12.5秒时的距离数据,我们就能得到更精确的估计。

假设我们进行了更精细的测量,每秒记录一次数据。这里你有了更多关于每秒行驶距离的数据,具体是从t=10秒到t=20秒的数据,如下表所示。

问题四:你能利用这些数据,找到汽车在t=12.5秒时速度的更好估计吗?

我们仍然无法找到12.5秒时的精确速度。但是,我们可以通过计算12秒到13秒这个时间间隔内的平均速度,来得到一个比之前更好的猜测值。

我们如何计算呢?如果斜率是距离变化量除以时间变化量,即该区间的速度,那么公式就是:
(13秒时的距离 - 12秒时的距离) / (13秒 - 12秒)

13秒时的距离是170米,12秒时的距离是155米,时间差是1秒。因此,我们得到的斜率是 15米/秒。这就是该区间的速度,并且它是t=12.5秒时瞬时速度的一个更好估计。

通向导数 🎯

请注意,我们仍然没有得到12.5秒时的精确速度估计。为了找到这个估计,你会怎么做?答案就是取越来越小的时间间隔。间隔越精细,估计就越准确。

这正是导数的思想:通过考察函数在某个点附近无限小的变化,来求得该点的瞬时变化率。

而这,就将我们引向了导数,这正是我们接下来要学习的内容。

总结 ✨

本节课中,我们一起学习了导数的动机和基本概念。我们通过汽车速度的例子了解到:

  • 平均速度描述了一段时间内的整体情况。
  • 瞬时速度描述了某一特定时刻的情况。
  • 导数就是函数的瞬时变化率
  • 通过计算越来越小区间内的平均变化率,我们可以无限逼近某一点的瞬时变化率(即导数)。

理解这个从平均变化率到瞬时变化率(导数)的过渡,是掌握微积分核心思想的关键一步。

005:导数与切线

在本节课中,我们将要学习瞬时速度的概念,并理解它如何与导数以及函数图像上的切线斜率联系起来。

概述

上一节我们介绍了如何计算一个时间区间内的平均速度。本节中我们来看看如何定义和估算一个特定时间点的瞬时速度,并揭示其与导数这一核心概念的紧密关系。

瞬时速度的估算

计算一个精确时间点(例如 t = 12.5)的瞬时速度可能很困难,但我们可以通过估算来逼近它。

以下是估算瞬时速度的步骤:

  1. 在目标点(t = 12.5)的右侧选取另一个点。
  2. 计算这两个点之间的平均速度,即距离变化量 Δx 除以时间变化量 Δt,这代表了图中连接这两点的直线的斜率。
  3. 这个平均速度并非 t = 12.5 时的瞬时速度。
  4. 为了获得更接近瞬时速度的估算值,我们可以缩小时间区间。选取一个更靠近 t = 12.5 的点。
  5. 计算这个新区间内的平均速度,即新的 Δx 除以新的 Δt,这对应一条新的、更陡峭的直线的斜率。
  6. 继续将点选得离 12.5 越来越近,甚至近到难以区分。

从极限到导数与切线

当我们想象将右侧的点无限接近 t = 12.5 时,就得到了一个极限。这个极限被记作 dx/dt

这个 dx/dt 正是曲线在 t = 12.5 这一点的切线的斜率。

因此,距离随时间变化的快慢程度,即瞬时变化率,就是该点切线的斜率。

更一般地说,瞬时变化率衡量的是两个变量之间的关系在任意一点变化的快慢程度。

换句话说,想象在极短的时间间隔 dt 内移动了极小的距离 dxdx/dt 就是瞬时变化率,它也被称为导数

一个函数在某一点的导数,就是该点切线的精确斜率。

总结

本节课中我们一起学习了瞬时速度的概念。我们了解到,通过取时间区间平均速度的极限,可以得到瞬时速度。这个极限值就是导数 dx/dt,它在几何上表示为函数曲线在该点切线的斜率。因此,导数本质上是函数在特定点的瞬时变化率。

006:斜率、最大值与最小值

在本节课中,我们将学习导数的一个非常有趣的性质。我们将通过一个具体的例子,探索函数的斜率如何揭示其最大值和最小值的位置。

回顾与观察

上一节我们介绍了导数的概念,它代表了函数在某一点的瞬时变化率,即切线的斜率。现在,让我们回到之前讨论过的汽车距离与时间的表格数据,但这次我们只关注19秒到20秒之间的这一小段。

请注意,在19秒时,距离是265米;在20秒时,距离也是265米。两点间的距离相同,这暗示汽车可能在这个时间间隔内没有移动。我们假设它完全没有移动。

因此,19秒到20秒之间的这段图像看起来是一条水平线。而一条水平线的斜率是0。

以下是计算过程:斜率等于距离的变化量除以时间的变化量。距离的变化量是20秒时的距离减去19秒时的距离,即 265 - 265 = 0。时间的变化量是1秒。所以,斜率是 0 / 1 = 0 米/秒。

分析汽车的运动轨迹

现在,让我们在右侧绘制汽车完整的运动轨迹。首先,汽车向前行驶,然后停止,接着向后行驶,再次停止,又向前行驶,再向后行驶,最后再次向前。

基于这个轨迹,这里有一个问题:在哪些点上,汽车的速度为零?

如果你回答:在任何切线为水平线的点上,因为水平切线的斜率为0,那么你是正确的。这些点就是汽车停止的时刻。总共有五个这样的点。

接下来是另一个问题:汽车在哪个时刻距离起点最远?

答案是图中距离为50米的那个点,因为这是整个图表中能找到的最高距离值。

最大值、最小值与导数的关系

现在,请注意一个有趣的现象:距离最远的点,恰好也是汽车停止的点之一。这并非巧合,因为如果汽车仍在移动,它就有可能走得更远。

因此,汽车距离最远的点,必然是汽车不动的点。这意味着:如果你想找到一个函数的最大值或最小值,它通常出现在导数为零的点上。换句话说,出现在切线为水平线的点上。

总结

本节课中,我们一起学习了导数的一个重要应用。我们通过分析汽车运动的例子,发现函数在达到局部最大值或最小值时,其切线通常是水平的,即该点处的导数为零。这个性质是微积分中寻找函数极值点的核心方法之一。

007:导数及其表示法 📚

在本节课中,我们将学习导数的两种主要数学表示法:莱布尼茨记法和拉格朗日记法。理解这些记法对于后续深入学习微积分至关重要。

导数的概念回顾

上一节我们介绍了导数的核心概念,即函数在某一点的瞬时变化率。本节中,我们来看看如何用数学符号精确地表示导数。

首先,回忆一下斜率是如何计算的。对于一条直线,斜率是垂直方向的变化量除以水平方向的变化量。在距离-时间图中,这表示为 Δx / Δt

当我们想求曲线上某一点的切线斜率时,需要将时间间隔 Δt 取得非常小,直至趋近于零。此时,距离的变化量 Δx 也趋近于无穷小。这个极限状态下的斜率,我们称之为导数,记作 dx / dt。这里的 dxdt 代表在 x 方向和 t 方向上的无穷小变化。

导数的两种表示法

在更一般的情况下,我们通常用 x 表示自变量(横轴),用 y 表示因变量(纵轴)。因此,导数通常写作 dy / dx

假设我们有一个函数 y = f(x)。这个函数的导数有两种等价的表示方式:

以下是两种主要的导数记法:

  1. 拉格朗日记法:记作 f'(x)。这个符号直接表示函数 f 在点 x 处的导数值。
  2. 莱布尼茨记法:记作 dy / dx。它也可以写作 d/dx [f(x)]。在这里,d/dx 可以被看作一个“算子”,当它作用于函数 f(x) 时,就得到了该函数的导数。

记法的选择与应用

在本课程中,我们会根据具体情境的便利性,交替使用 f'(x)dy / dx 这两种记法。它们表达的是完全相同的数学概念。

本节课中我们一起学习了导数的两种标准数学表示法:拉格朗日的 f'(x) 和莱布尼茨的 dy / dx。理解并熟练运用这两种记法,是掌握微积分语言的基础。在接下来的课程中,我们将使用这些工具来计算各种函数的导数。

008:常见导数-线性函数

在本节课中,我们将学习如何计算一些常见函数的导数。我们的目标是能够计算大多数已知函数的导数。我们从最简单的函数开始,包括常数函数、线性函数、二次函数、多项式函数、指数与对数函数以及三角函数。这些函数的导数形式通常非常简洁明了。

常数函数的导数

首先,我们从最简单的线性情况开始,即常数函数,其图像是一条水平线。

这个函数的特点是,在任意点(例如 x0x1)的函数值(高度)始终相同,都等于某个常数 CC 可以是任何数字,如 -17、3.5 等,只要它保持不变。

现在,我们计算该函数在 x0 处的导数。该点的切线斜率与整条线的斜率相同。斜率是 Δy / Δx。由于 y 始终等于 C,所以 Δy 总是 C - C = 0。只要 x0 不等于 x1,分母 Δx 就不为零。因此,这个斜率始终为 0。

我们得出结论:水平线(即常数函数)的导数始终为 0

线性函数的导数

接下来,我们考虑一般的非水平直线。其方程可以表示为:

f(x) = ax + b

其中,a 是斜率,b 是 y 轴截距。

这个函数的导数非常简单。我们取一个点(例如图中所示点),通过计算 Δy / Δx 来求其斜率。这个比值就是“上升量除以前进量”,结果就是斜率 a

需要注意的是,当第二个点无限接近第一个点时,切线的斜率保持不变。原因与常数函数类似:对于一条直线,其上任意一点的切线斜率都与整条直线的斜率相同,即 a

因此,直线方程 f(x) = ax + b 的导数 f'(x) = a

以下是具体的数学推导过程:

取两个点:

  • 点1坐标为 (x, ax + b)
  • 点2坐标为 (x + Δx, a(x + Δx) + b)

计算斜率:

  • Δy = [a(x + Δx) + b] - [ax + b] = aΔx
  • Δx = Δx
  • 斜率 = Δy / Δx = (aΔx) / Δx = a

因此,直线方程 f(x) = ax + b 的导数就是其斜率 a

总结

本节课中,我们一起学习了两种基本函数的导数计算:

  1. 常数函数 f(x) = C 的导数为 f'(x) = 0
  2. 线性函数 f(x) = ax + b 的导数为 f'(x) = a,即其斜率。

理解这些基础函数的导数为我们后续学习更复杂函数的微分奠定了基础。

009:常见导数-二次函数

概述

在本节课中,我们将要学习如何计算二次函数的导数。我们将从最简单的二次函数 y = x² 入手,通过直观的示例和严谨的推导,理解其导数的计算过程与几何意义。


从线性函数到二次函数

上一节我们介绍了线性函数的导数。本节中我们来看看一个稍微复杂一点的函数:二次函数。

最简单的二次函数是抛物线,其方程为 y = x²。让我们来观察它的导数。

请注意,在y轴左侧,函数图像的切线斜率为负;在y轴右侧,切线斜率为正。

导数的公式是当 Δx 趋近于0时,Δf / Δx 的极限。其中,Δf 是y值或函数值 f 的变化量,即 (x + Δx)² - x²


通过示例理解导数计算

在正式推导之前,我们先看一个具体的例子。当 x = 1 时,y = x² = 1。让我们计算几个不同 Δx 下的割线斜率,并观察它们如何趋近于切线斜率。

以下是计算过程:

  • 当 Δx = 1 时

    • Δf = (1+1)² - 1² = 4 - 1 = 3
    • 斜率 = Δf / Δx = 3 / 1 = 3
  • 当 Δx = 0.5 时

    • Δf = (1+0.5)² - 1² = 2.25 - 1 = 1.25
    • 斜率 = 1.25 / 0.5 = 2.5
  • 当 Δx = 0.25 时

    • Δf = (1+0.25)² - 1² = 1.5625 - 1 = 0.5625
    • 斜率 = 0.5625 / 0.25 = 2.25
  • 当 Δx = 0.125 时

    • 斜率趋近于 2.125
  • 当 Δx = 0.0625 时

    • 斜率趋近于 2.0625
  • 当 Δx = 0.001 时

    • 斜率趋近于 2.001

随着 Δx 越来越小,斜率的值越来越接近 2。因此,在 x = 1 处的切线斜率就是 2

注意到 2 等于 2 * 1,这引出了最终的导数公式。


二次函数导数的正式推导

现在,让我们正式推导 f(x) = x² 的导数。

根据定义,导数 df/dx 是以下表达式的极限:

df/dx = lim (Δx -> 0) [Δf / Δx]

其中:

Δf = f(x + Δx) - f(x) = (x + Δx)² - x²

Δf 代入极限表达式:

df/dx = lim (Δx -> 0) [((x + Δx)² - x²) / Δx]

展开 (x + Δx)²

df/dx = lim (Δx -> 0) [(x² + 2xΔx + (Δx)² - x²) / Δx]

消去 -x²

df/dx = lim (Δx -> 0) [(2xΔx + (Δx)²) / Δx]

分子分母同时除以 Δx

df/dx = lim (Δx -> 0) [2x + Δx]

Δx 趋近于0时,Δx 项消失,得到最终结果:

df/dx = 2x

因此,对于函数 f(x) = x²,其导数 f'(x) = 2x


总结

本节课中我们一起学习了二次函数 y = x² 的导数计算。我们首先通过一个具体的数值示例(x=1)观察了割线斜率如何随着区间变小而趋近于切线斜率 2。随后,我们通过极限的正式推导,得出了其导数的通用公式 f'(x) = 2x。这个公式表明,二次函数在某一点的切线斜率与该点的 x 坐标成正比。

010:常见导数-高次多项式

在本节课中,我们将学习如何计算高次多项式函数的导数,特别是三次函数。我们将通过具体的例子和计算过程,理解导数的定义及其应用。

从二次函数到三次函数

上一节我们介绍了线性函数和二次函数的导数。本节中,我们来看看三次函数。最简单的三次函数是 y = x³,其图像如下所示。

图中也展示了一些切线及其斜率。计算斜率的公式与之前类似,依然是基于导数的定义:

公式: f'(x) = lim (Δx→0) [ (f(x+Δx) - f(x)) / Δx ]

对于函数 f(x) = x³,其导数公式为:

公式: f'(x) = lim (Δx→0) [ ((x+Δx)³ - x³) / Δx ]

当 Δx 趋近于 0 时,这个极限值就是切线的斜率,也就是导数。

通过实例计算斜率

让我们通过一个具体例子来理解这个过程。假设 x = 0.5,那么 y = (0.5)³ = 0.125

以下是计算不同 Δx 值下割线斜率的过程,这些值将帮助我们逼近切线的真实斜率:

  • 当 Δx = 1 时:

    • f(x+Δx) = (0.5+1)³ = (1.5)³ = 3.375
    • Δf = f(x+Δx) - f(x) = 3.375 - 0.125 = 3.25
    • 斜率 = Δf / Δx = 3.25 / 1 = 3.25
  • 当 Δx = 0.5 时:

    • f(x+Δx) = (0.5+0.5)³ = (1)³ = 1
    • Δf = 1 - 0.125 = 0.875
    • 斜率 = 0.875 / 0.5 = 1.75
  • 当 Δx = 0.25 时:

    • Δf ≈ 0.297
    • 斜率 ≈ 1.188
  • 当 Δx = 0.125 时:

    • Δf ≈ 0.119
    • 斜率 ≈ 0.95
  • 当 Δx = 0.0625 时:

    • 斜率 ≈ 0.85
  • 当 Δx = 0.001 时:

    • 斜率 ≈ 0.752

观察这些结果,随着 Δx 越来越小,割线的斜率逐渐趋近于 0.75。这个值就是函数在 x=0.5 处的导数 f'(0.5)

实际上,f'(0.5) = 3 * (0.5)² = 3 * 0.25 = 0.75。这是因为 的导数是 3x²

推导三次函数的导数公式

现在,让我们正式推导 f(x) = x³ 的导数公式。

根据定义:
f'(x) = lim (Δx→0) [ ((x+Δx)³ - x³) / Δx ]

首先,展开 (x+Δx)³
(x+Δx)³ = x³ + 3x²Δx + 3x(Δx)² + (Δx)³

代入公式:
f'(x) = lim (Δx→0) [ (x³ + 3x²Δx + 3x(Δx)² + (Δx)³ - x³) / Δx ]

分子中的 -x³ 相互抵消:
f'(x) = lim (Δx→0) [ (3x²Δx + 3x(Δx)² + (Δx)³) / Δx ]

每一项都除以 Δx:
f'(x) = lim (Δx→0) [ 3x² + 3xΔx + (Δx)² ]

现在,让 Δx 趋近于 0。任何包含 Δx 的项(3xΔx(Δx)²)都会变为 0。唯一保留下来的项是 3x²

因此,我们得到:
公式: 如果 f(x) = x³,那么 f'(x) = 3x²

这就是三次函数 的导数。

总结

本节课中,我们一起学习了如何计算三次多项式函数 y = x³ 的导数。我们通过具体的数值计算,观察了当 Δx 减小时,割线斜率如何逼近切线的真实斜率(即导数)。最后,我们通过代数推导,得出了 的导数公式为 3x²。这个过程清晰地展示了导数定义的应用和幂函数求导的规律。

011:常见导数-其他幂函数

在本节课中,我们将要学习如何计算更复杂的幂函数的导数,特别是形如 1/x 的函数。我们将通过具体的计算和观察,推导出适用于所有幂函数的通用求导公式。

上一节我们介绍了多项式的导数,本节中我们来看看一个更复杂的函数:1/x

这是一个双曲线函数,图像如上图所示。让我们观察一下它在某些点上的切线。

这个函数看起来更复杂,但实际计算过程相当简单。我们将计算 (f(x+Δx) - f(x)) / Δx

让我们看 x=1y=1 这个点。像之前一样,取一些区间进行计算。

如果水平方向的区间长度为1,即 Δx = 1,那么 Δf 是多少?

Δf 是垂直方向的变化量。对于 x=1,计算 (1/(1+1)) - (1/1),结果是 1/2 - 1 = -0.5。因此,斜率是 -0.5 / 1 = -0.5

现在减小区间长度,让 Δx = 1/2。如果 Δx1/2,那么 Δf 是多少?

计算 1/(1+0.5) - 1/1,即 2/3 - 1 = -1/3Δx0.5,所以斜率是 (-1/3) / 0.5 = -2/3 ≈ -0.67

让我们继续计算更多值。当 Δx = 1/4 时,斜率约为 -0.8;当 Δx = 1/8 时,斜率约为 -0.89;当 Δx = 1/16 时,斜率约为 -0.94;当 Δx = 1/100,000 时,斜率约为 -0.999。可以看到,随着 Δx 趋近于0,斜率趋近于 -1。因此,该点的导数是 -1

这个 -1 实际上是 -1 * 1² 的值。因为当 f(x) = 1/x 时,其导数是 -1 * x^(-2)。让我们通过计算来确认这一点。

Δf / Δx 的表达式是 (1/(x+Δx) - 1/x) / Δx

让我们将其写为 (1/(x+Δx) - 1/x) / Δx,并将分子通分:(x - (x+Δx)) / (x(x+Δx)) / Δx

分子中的 x-x 抵消,得到 (-Δx) / (x(x+Δx)) / Δx

我们可以将分子分母同时乘以 1/Δx,得到 -1 / (x(x+Δx))

现在,当 Δx 趋近于0时,分母中的 x(x+Δx) 趋近于 。因此,我们得到 -1 / x²

所以,如果 f(x) = x^(-1),那么 f'(x) = -1 * x^(-2)

让我们总结一下目前学到的内容。我们已经计算了 x^(-1) 的导数。以下是结果:

以下是已计算的导数:

  • 的导数是 2x¹
  • 的导数是 3x²
  • x^(-1) 的导数是 -1 * x^(-2)

你能发现其中的规律吗?这三个例子遵循一个非常优美的模式,并且适用于任何幂函数。

观察指数部分。在求导后,原指数会作为乘法因子出现在前面,然后新指数是原指数减1。

以下是模式的具体体现:

  • 变成 2x¹
  • 变成 3x²
  • x^(-1) 变成 -1 * x^(-2)

那么,对于 x^n 会发生什么呢?对于 x^n,指数 n 会“下来”变成系数 n,而新的指数变为 n-1。因此,导数是 n * x^(n-1)

所以,如果你有任何幂函数,例如 x^100,其导数是 100 * x^99。如果是 x^(-100),其导数是 -100 * x^(-101)

本节课中我们一起学习了如何计算 1/x 这类幂函数的导数,并通过观察规律,推导出了适用于所有幂函数 x^n 的通用求导公式:f'(x) = n * x^(n-1)。这个强大的公式是微积分中的基础工具之一。

012:反函数及其导数

概述

在本节课中,我们将要学习一个重要的概念——反函数。理解反函数及其导数之间的关系,将帮助我们求出更多函数的导数。我们将从反函数的定义出发,通过图像和具体例子,直观地理解原函数与其反函数在导数上的联系。


什么是反函数?

上一节我们学习了几个基本函数的导数。本节中,我们来看看反函数的概念。如果一个函数执行了某种操作,那么它的反函数就是执行相反操作、撤销原函数作用的函数。

例如,如果函数 F 将数字 3 映射为数字 5,那么反函数就会将数字 5 映射回数字 3

一个直观的比喻是:假设有一个人,函数 F 给他戴上了一顶帽子。那么,作为反函数的 G 需要做的就是摘掉这顶帽子,让人恢复原样。换句话说,反函数执行的是与 F 相反的操作。

在数学例子中,假设变量是 x,函数 F 给它“戴上帽子”,即计算其平方。那么函数 G 就需要“摘掉帽子”,即计算平方根。在正式定义 FG 之前,我们先看一下相关符号。


反函数的符号与定义

如果 g(x)f(x) 互为反函数,我们将其写作:
g(x) = f^{-1}(x)
请注意,这里的上标 -1 并非表示 1/f(x),而仅仅是一个表示反函数的符号。

反函数的核心性质是:如果你对 x 先应用 f,再应用 g,就会得到最初的 x。本质上,g 撤销了 f 的操作。

以下是互为反函数的函数对示例:

  • f(x) = x²
  • g(x) = √x (这里我们仅考虑 x ≥ 0 且取正平方根的情况)

原因在于:g(f(x)) = √(x²) = x (当 x ≥ 0 时)。


反函数导数的直观理解

反函数的导数关系非常美妙。让我们观察函数 f(x) = x² 和其反函数 g(y) = √y 的图像。

请注意,左右两图的坐标轴单位和变量名可能不同。左图的横轴是 x,右图的横轴是 y。关键点在于:如果一个点 (a, b) 出现在左图(即 f(a) = b),那么点 (b, a) 就会出现在右图(即 g(b) = a)。

例如:

  • 左图有点 (0.5, 0.25),因为 0.5² = 0.25
  • 右图则有点 (0.25, 0.5),因为 √0.25 = 0.5

右图本质上是左图关于直线 y = x 的镜像反射。因此,这两条曲线在对应点处的切线斜率必然存在紧密联系。


从割线斜率到切线斜率

让我们通过计算割线斜率来探索这种联系。考虑点 (1, 1)(1.5, 2.25) 在左图构成的割线,以及其对应点 (1, 1)(2.25, 1.5) 在右图构成的割线。

  • 左图割线斜率 = Δf / Δx
  • 右图割线斜率 = Δg / Δy

由于图像是镜像关系,左图的水平变化量 Δx 等于右图的垂直变化量 Δg;左图的垂直变化量 Δf 等于右图的水平变化量 Δy

因此,右图的斜率 Δg / Δy 就等于 Δx / Δf

ΔxΔy 趋近于 0 时,割线变为切线:

  • f'(x) = df/dx
  • g'(y) = dg/dy

结合上面的关系,我们得到核心公式:
g'(y) = 1 / f'(x)
其中,xy 满足 y = f(x) 或等价地 x = g(y)

这个公式说明:如果两个函数互为反函数,那么其中一个函数在某点的导数,等于另一个函数在对应点的导数的倒数。


具体示例验证

让我们在一个坐标单位统一的图像中验证这个公式。观察 f(x)=x²g(y)=√y 在对应点的切线。

示例一:点 (1, 1)

  • 在左图(f(x)),f'(x)=2x,所以在 x=1 处,斜率 f'(1)=2
  • 在右图(g(y)),根据公式,g'(1) = 1 / f'(1) = 1/2
  • 结果:左图切线斜率为 2,右图切线斜率为 1/2,互为倒数。

示例二:点 (2, 4) 与 (4, 2)

  • 左图点 (2, 4):f'(2) = 2*2 = 4
  • 右图对应点 (4, 2):g'(4) = 1 / f'(2) = 1/4
  • 结果再次验证了公式:41/4 互为倒数。

总结

本节课中,我们一起学习了反函数及其导数的核心知识。我们首先定义了反函数是“撤销”原函数操作的函数。然后,通过分析图像和割线,我们推导出了反函数导数的重要关系:如果 gf 的反函数,那么 g'(y) = 1 / f'(x),其中 y = f(x)。最后,我们通过 f(x)=x²g(x)=√x 的例子验证了这一公式。掌握这个关系,能让我们在已知一个函数导数的情况下,轻松求出其反函数的导数。

014:指数函数e的含义 📈

在本节课中,我们将学习数学中一个极其重要的函数——指数函数。为此,我们首先需要理解一个特殊的常数:欧拉数 e。

欧拉数 e 的定义

欧拉数 e 在数学的许多分支中都有出现,它可以通过多种方式定义。

一种定义方式是它的数值:e ≈ 2.71828182...。这个小数永远不会终止,因为 e 是一个无理数,这意味着它不能表示为两个整数的比值。

另一种定义方式是使用极限表达式:e = lim_{n→∞} (1 + 1/n)^n

让我们看看这个表达式在不同 n 值下的结果:

  • 当 n=1 时,结果为 (1 + 1/1)^1 = 2。
  • 当 n=10 时,结果为 (1 + 1/10)^10 ≈ 2.594。
  • 当 n=100 时,结果为 (1 + 1/100)^100 ≈ 2.705。
  • 当 n=1000 时,结果为 (1 + 1/1000)^1000 ≈ 2.717。

可以观察到,随着 n 不断增大,这个值会越来越接近一个特定的数,即 e ≈ 2.71828182...

e 的一个重要性质

以 e 为底的指数函数 f(x) = e^x 有一个非常独特的性质:它是它自身的导数。也就是说,f'(x) = e^x。这个性质使得 e 在科学、统计学、概率论等众多领域频繁出现。

上一节我们介绍了 e 的数学定义,本节中我们通过一个生动的例子——银行利息问题,来直观理解 e 的含义。

通过银行利息问题理解 e

假设你在寻找一家最好的银行来存钱。

以下是三家银行的方案:

  • 银行1:每年年底一次性支付 100% 的利息。
  • 银行2:每六个月支付 50% 的利息。
  • 银行3:每四个月支付 33.33% 的利息。

问题是:哪家银行最好?

答案是:银行3 是这三家中最好的。让我们通过计算来验证。

假设你初始存入 1 美元。

银行1
一年后,你得到本金 1 美元 + 利息 1 美元 = 2 美元
我们可以将其表示为:1 + 1 = (1 + 1/1)^1 = 2

银行2

  • 六个月后:1 + 0.5 = 1.5 美元。
  • 一年后:1.5 + (1.5 * 0.5) = 2.25 美元。
    这相当于每半年你的资金乘以 (1 + 1/2),所以一年后总额为:(1 + 1/2)^2 = 2.25 美元。

银行3

  • 四个月后:1 + 1/3 ≈ 1.333 美元。
  • 八个月后:1.333 + (1.333 * 1/3) ≈ 1.777 美元。
  • 一年后:1.777 + (1.777 * 1/3) ≈ 2.370 美元。
    这相当于每四个月你的资金乘以 (1 + 1/3),所以一年后总额为:(1 + 1/3)^3 ≈ 2.370 美元。

可以看到,2.370 > 2.25 > 2。银行3更好的原因在于 复利 效应:你获得的利息会立刻开始产生新的利息,利滚利使得最终收益更高。

如果时间拉长到四年,差异会更加明显:

  • 银行1:16 美元
  • 银行2:约 25.63 美元
  • 银行3:约 31.57 美元

推广到更频繁的复利

那么,是否存在比这三家更好的银行呢?当然,复利结算得越频繁,最终收益就越高。

让我们看看 银行12,它每月支付 1/12 的利息。
一年后,你的资金将变为:(1 + 1/12)^12 ≈ 2.613 美元。这比银行3的 2.370 美元要多。

我们可以将此推广到一般情况。银行N 将一年分成 n 个间隔,每个间隔支付 1/n 的利息。

  • 第一个间隔后:1 + 1/n
  • 第二个间隔后:(1 + 1/n)^2
  • ...
  • 第 k 个间隔后:(1 + 1/n)^k
  • 一年后(第 n 个间隔后):(1 + 1/n)^n

n 可以非常大,例如:

  • 银行365(每日计息):(1 + 1/365)^365 ≈ 2.7145 美元。

逼近欧拉数 e

现在,想象一家终极银行——银行∞。它每时每刻都在以无限小的份额(1/∞)为你结算利息,结算次数无限多(∞次/年)。

那么,银行∞在一年后能给你多少钱呢?这不再是简单的算术,而是一个极限问题:
lim_{n→∞} (1 + 1/n)^n

回顾我们之前的结果序列:

  • 银行1: (1 + 1/1)^1 = 2
  • 银行2: (1 + 1/2)^2 = 2.25
  • 银行3: (1 + 1/3)^3 ≈ 2.370
  • 银行12: (1 + 1/12)^12 ≈ 2.613
  • 银行365: (1 + 1/365)^365 ≈ 2.7145

随着 n 增大,这个值越来越接近一个特定的数字,即 e ≈ 2.71828182...

因此,e 可以理解为:在连续复利(每时每刻都在利滚利)的条件下,1 美元本金在一年后增长到的极限金额。

本节课中我们一起学习了欧拉数 e 的定义、其指数函数的独特性质,并通过银行复利这个生动的例子,理解了 e 作为连续复利增长极限的核心含义。掌握 e 的概念是学习微积分、理解指数增长模型的重要基础。

015:e^x的导数

在本节课中,我们将学习指数函数 e^x 一个非常独特的性质:它是自身的导数。我们将通过数值计算来验证这一性质,并理解其背后的含义。

核心性质回顾

上一节我们介绍了欧拉数 e。这个数有一个非常重要的性质:对于函数 y = e^x(称为指数函数),其导数等于函数本身。换句话说,在函数图像上任意一点 (x, e^x) 处,该点切线的斜率恰好等于该点的函数值 e^x

用公式表示,即:
d/dx (e^x) = e^x

数值验证

为了直观地理解这个性质,我们可以通过计算割线的斜率来逼近切线的斜率,并进行数值验证。以下是具体的计算步骤。

我们以 x = 2 这个点为例。该点在图像上的坐标为 (2, e^2),其中 e^2 ≈ 7.39。我们将通过计算不同间隔的割线斜率,观察它们如何逼近 e^2

以下是不同间隔(Δx)下的计算结果列表:

  • 当 Δx = 1 时

    • Δf = e^3 - e^2 ≈ 20.09 - 7.39 = 12.70
    • 斜率 = Δf / Δx = 12.70 / 1 = 12.70
  • 当 Δx = 0.5 时

    • Δf = e^2.5 - e^2 ≈ 12.18 - 7.39 = 4.79
    • 斜率 = 4.79 / 0.5 = 9.58
  • 当 Δx = 0.25 时

    • Δf = e^2.25 - e^2 ≈ 9.49 - 7.39 = 2.10
    • 斜率 = 2.10 / 0.25 = 8.40
  • 当 Δx = 0.125 时

    • Δf = e^2.125 - e^2 ≈ 8.25 - 7.39 = 0.86
    • 斜率 = 0.86 / 0.125 = 6.88
    • (注:视频中此处计算有误,应为约7.87,此处按正确数学计算修正)
  • 当 Δx = 0.0625 时

    • Δf = e^2.0625 - e^2 ≈ 7.86 - 7.39 = 0.47
    • 斜率 = 0.47 / 0.0625 = 7.52
  • 当 Δx = 0.001 时

    • Δf = e^2.001 - e^2 ≈ 7.396 - 7.39 = 0.006
    • 斜率 = 0.006 / 0.001 = 6.00
    • (注:视频中此处计算有误,应为约7.39,此处按正确数学计算修正)

从以上列表可以看出,随着间隔 Δx 变得越来越小,割线的斜率确实在不断逼近一个特定的数值,即 e^2 ≈ 7.39

结论

本节课中,我们一起学习了指数函数 e^x 的核心性质:它是自身的导数。我们通过数值计算的方法,验证了在 x=2 这一点,其切线的斜率确实无限接近于 e^2。这一性质对于函数 y = e^x 图像上的每一个点都成立,即点 (x, e^x) 处的切线斜率恒为 e^x。这是一个非常美妙且重要的数学特性,在机器学习和深度学习的许多模型中都有广泛应用。

016:自然对数函数的导数 📈

在本节课中,我们将学习自然对数函数 log(x) 的导数。我们将利用上一节学到的指数函数 e^x 的导数性质,以及反函数求导法则,来推导出对数函数的导数公式。你会发现,这个结果非常简洁优美。

回顾与引入

上一节我们介绍了以欧拉数 e 为底的指数函数 e^x,并学习了它的一个重要性质:其导数就是它本身,即 d/dx (e^x) = e^x

本节中,我们将运用这个性质以及反函数求导法则,来计算自然对数函数 log(x) 的导数。

什么是自然对数?

首先,让我们明确对数的概念。假设你想找到一个数,使得 e 的这个数次方等于 3。这个数就是 3 的自然对数,记作 log(3)

这个概念可以推广到任意正数 x。对于任意 x > 0log(x) 就是满足 e^(log(x)) = x 的那个数。我们称它为以 e 为底的自然对数。在其他地方你可能会见到以 210 为底的对数,但在本课程中,除非特别说明,对数均指自然对数。

指数函数与对数函数互为反函数

从等式 e^(log(x)) = xlog(e^y) = y 可以看出,函数 f(x) = e^x 有一个反函数,即 f^(-1)(y) = log(y)

让我们画出这两个函数的图像。左边是 y = e^x 的图像,右边是 y = log(x) 的图像。通常,左图的横轴是 x,右图的横轴是 y

观察图像上的点,它们彼此对应。因为这两个函数互为反函数,所以如果将其中一个图像关于直线 y = x 进行反射,就会得到另一个图像。

推导对数函数的导数

现在,让我们利用反函数求导法则来计算 log(x) 的导数。你会发现过程非常简单。

反函数求导法则指出:如果 y = f(x)x = f^(-1)(y),那么 (d/dy) f^(-1)(y) = 1 / f'(x),其中 x = f^(-1)(y)

在我们的例子中:

  • f(x) = e^x
  • 其反函数 f^(-1)(y) = log(y)
  • 并且我们知道 f'(x) = e^x

将上述关系代入反函数求导法则:

d/dy [log(y)] = 1 / f'(x)   # 其中 x = log(y)
              = 1 / e^x      # 因为 f'(x) = e^x
              = 1 / e^(log(y)) # 将 x = log(y) 代入
              = 1 / y        # 因为 e^(log(y)) = y

因此,我们得到了核心结论:自然对数函数 log(y) 的导数是 1/y

用数学公式表示就是:

d/dy [log(y)] = 1/y

图像上的直观理解

我们也可以通过图像来直观理解这个结果。在左图 y = e^x 上取一点 (2, e^2),该点切线的斜率正是 f'(2) = e^2

根据反函数图像的性质,在右图 y = log(x) 上,与左图点 (2, e^2) 对应的点是 (e^2, 2)。该点切线的斜率是左图对应点斜率的倒数。

所以,右图点 (e^2, 2) 处的切线斜率为 1 / (e^2)。注意到该点的横坐标 y 值正是 e^2,所以斜率就是 1 / y。这再次验证了我们的公式 d/dy [log(y)] = 1/y

总结

本节课中,我们一起学习了自然对数函数 log(x) 的导数。我们首先回顾了指数函数 e^x 的导数性质,然后利用反函数求导法则,推导出了对数函数的导数公式。最终我们得到,对于 y > 0d/dy [log(y)] = 1/y。这个简洁的公式在机器学习和数据科学的许多领域(如逻辑回归的梯度计算、交叉熵损失函数的优化等)中都有重要应用。

017:导数的存在性

在本节课中,我们将要学习一个重要的概念:不可导函数。之前我们已经了解了常见函数及其导数,但并非所有函数在其定义域内的每一点都存在导数。我们将通过视觉识别几种典型的不可导函数,并理解它们为何不可导。

导数存在性的回顾

上一节我们介绍了导数的几何意义是函数图像上某点切线的斜率。对于一个函数,如果在某点可以画出唯一且定义明确的切线,那么该函数在该点是可导的。

公式:函数 f(x) 在点 x=a 可导,意味着极限 lim (h->0) [f(a+h) - f(a)] / h 存在且唯一。

如果函数在某个区间内的每一个点都可导,我们称该函数在该区间内可导。然而,有些函数不满足这个性质,我们称之为不可导函数

识别不可导函数

以下是几种典型的不可导函数,我们可以通过观察其图像特征来识别。

1. 角点或尖点

考虑绝对值函数 f(x) = |x|。这个函数在除了原点 x=0 之外的几乎所有点都是可导的。

代码表示:

def absolute_value(x):
    if x >= 0:
        return x
    else:
        return -x

在原点处,函数图像形成一个“V”形的角。如果你尝试在这一点画切线,会发现可以画出无数条直线(例如,不同斜率的直线)都与曲线在该点接触,但没有一条是唯一且定义明确的切线。因此,我们说在 x=0 处,导数不存在。

核心特征:当函数图像出现一个“角”或“尖点”时,该点不可导。直观地说,如果你需要用铅笔在某个点停下来然后拐弯画图,那么这个点就是不可导的。

2. 跳跃间断点

现在考虑一个分段函数。例如,一个函数在 x < -1 时定义为 y = 2,在 x >= -1 时定义为 y = x + 1

x = -1 处,函数值从 2 突然“跳”到 0(因为 -1 + 1 = 0),这被称为跳跃间断点。想象一下,你画这个函数时,铅笔必须在 x = -1 处抬起来,然后从另一个位置开始画。函数在该点不连续。

一个不连续的函数在该点必然不可导,因为你无法在间断点处定义一条有意义的切线。因此,任何具有跳跃间断点的函数在该点不可导。

3. 垂直切线

最后,我们看一个更微妙的情况:函数 f(x) = x^(1/3)(即 x 的立方根)。

这个函数在大部分点看起来都很平滑。然而,在原点 x=0 处,切线的方向变成了垂直的(平行于y轴)。

公式f(x) = x^(1/3)。在 x=0 处,其导数 f'(x) = (1/3)x^(-2/3) 的分母为零,导致导数未定义。

一条垂直的直线没有明确定义的斜率,因为斜率公式 (y2 - y1) / (x2 - x1) 中的分母(水平变化量)为零。因此,具有垂直切线的点也是不可导的。

总结

本节课中我们一起学习了不可导函数的三种主要类型。为了判断一个函数在某点是否可导,我们可以观察其图像:

  1. 角点或尖点:图像在该点出现明显的拐角。
  2. 跳跃间断点:函数在该点不连续,图像发生“跳跃”。
  3. 垂直切线:图像在该点的切线是垂直的。

记住,如果函数在一点不可导,那么在该点计算导数 f'(x) 的极限就不存在或不是唯一的。理解这些视觉特征将帮助你在未来更复杂的微积分和机器学习模型中,快速识别和分析函数的性质。

018:导数性质-与标量乘法

在本节课中,我们将要学习导数的一个重要性质:与标量(常数)的乘法规则。这个规则是构建更复杂函数导数的基础。

概述

到目前为止,我们已经学习了一些简单函数的导数。为了求出更复杂函数的导数,我们需要借助一些特定的规则,从这些简单函数的导数出发进行计算。接下来我们将要学习的规则包括:与标量乘法规则、求和规则、乘积规则以及函数复合的链式法则。本节我们首先聚焦于与标量乘法规则

规则定义

假设有一个函数 f,它是另一个函数 g 的 4 倍,即 f = 4g。那么,函数 f 的导数就等于 4 乘以函数 g 的导数。这个规律适用于任何常数。因此,我们可以总结出以下规则:

如果存在一个常数 c(可以是任意常数),且函数 f 等于 c 乘以函数 g,即:
f(x) = c * g(x)
那么,函数 f 的导数就等于 c 乘以函数 g 的导数,即:
f'(x) = c * g'(x)

规则原理

为了更好地理解这个规则,让我们通过一个具体的例子来探究其背后的原理。

考虑函数 y = x²,其图像如下所示。现在,我们取这个函数的两倍,即 y = 2x²。这意味着函数在垂直方向上被拉伸为原来的两倍。

让我们观察图像上的一些点。在左侧的原函数 y = x² 上,有点 (1, 1) 和 (2, 4)。现在计算这两点之间连线的斜率:上升量(rise)为 4 - 1 = 3,前进量(run)为 2 - 1 = 1,因此斜率为 3 / 1 = 3。

现在,观察右侧函数 y = 2x² 上对应的点。点 (1, 1) 对应变为 (1, 2),点 (2, 4) 对应变为 (2, 8)。计算这两点之间的斜率:上升量为 8 - 2 = 6,前进量仍为 2 - 1 = 1,因此斜率为 6 / 1 = 6。

通过对比可以发现,右侧函数的斜率(6)恰好是左侧函数斜率(3)的两倍。这是因为在垂直方向上,所有点的纵坐标都翻倍了,导致上升量也翻倍,而前进量保持不变,所以斜率也随之翻倍。

如果我们让右侧的点无限接近左侧的点,这个倍数关系依然成立。因此,在极限情况下,原函数在某点的切线斜率(即导数)如果为 f'(x),那么新函数在同一点的切线斜率就是 2 * f'(x)

这个原理可以推广到任意常数 c。如果将函数图像在垂直方向上拉伸 c 倍,那么其导数(即切线的斜率)也会相应地变为原来的 c 倍。

总结

本节课我们一起学习了导数的与标量乘法规则。核心要点是:当一个函数乘以一个常数 c 时,其导数也乘以相同的常数 c。这个规则用公式表示为:若 f(x) = c * g(x),则 f'(x) = c * g'(x)。理解这个规则有助于我们处理更复杂的函数求导问题。在下一节中,我们将继续学习导数的求和规则。

019:导数性质-求和法则

在本节课中,我们将学习导数的一个重要性质——求和法则。我们将通过一个生动的比喻来理解它,并最终用数学公式进行精确描述。

上一节我们介绍了标量乘法法则,本节中我们来看看求和法则。求和法则本质上是一个简单的符号规则。

想象你有一个函数 F,它被定义为两个函数 GH 的和。那么 F 的导数是什么呢?答案很简单,它就是 G 的导数加上 H 的导数。

我喜欢用以下方式来想象求和法则。

想象有一艘船,船上有一个孩子。船本身在移动,孩子也在船内奔跑。假设船移动了10米的距离,孩子在船内移动了2米的距离。

我们用变量 Xb 表示船移动的距离,用 Xc 表示孩子在船内移动的距离。如果他们的移动方向相同,那么孩子相对于地球移动的总距离是多少?

这个距离是12米,因为它是10米加上2米。也就是船移动的距离加上孩子在船内移动的距离。

这是关于距离的情况。那么速度呢?让我们做一个小测验。

假设船的速度是 0.6 米/秒,孩子在船内的速度是 0.05 米/秒,并且他们都朝同一个方向运动。问题是:孩子相对于地球的速度是多少?

如果你的答案是 0.65 米/秒,那么你是正确的。因为如果方向相同,速度是可以相加的。

这基本上就是求和法则。它表明:如果距离可以相加,那么速度(即距离的导数)也可以相加。这意味着如果函数可以相加,那么它们的导数也可以相加。

让我们通过图表来看一下。

下图以水平轴表示时间,垂直轴表示距离。这条线表示孩子在船内的运动,这条线表示船的运动,而这条线是两者的和,表示孩子相对于地球的运动。

让我们观察一些斜率。在某个时间点,我们取一个微小的时间间隔 ΔT,并计算孩子、船以及总和在这个间隔内的平均速度。

对于这个计算,我们取水平步长为 ΔT,垂直步长为距离。这些距离分别是孩子的 Xc、船的 Xb 和总距离 X_total

我们知道 X_total = Xb + Xc,因为这两个距离相加得到总距离。

如果我们把等式两边都除以相同的 ΔT,我们得到速度是相加的。所以总速度 V_total 等于船的速度 Vb 加上孩子的速度 Vc

现在,你只需要让 ΔT 趋近于0,就能得到导数。

因此,如果你有三个函数:F1F2F = F1 + F2F1 在点 x 的导数是 F1'(x)F2 在同一点 x 的导数是 F2'(x)。那么和的导数是什么呢?

既然 F = F1 + F2,那么 F' = F1' + F2'。图中这条线的斜率将是两条线斜率之和,这就是求和法则。


本节课中我们一起学习了导数的求和法则。我们通过一个船与孩子的比喻,直观地理解了当两个函数相加时,其导数等于各自导数的和。核心公式可以总结为:如果 F(x) = G(x) + H(x),那么 F'(x) = G'(x) + H'(x)。这个法则在后续的微积分和机器学习计算中会非常有用。

020:导数性质-乘法法则 🧮

在本节课中,我们将要学习导数的另一个重要性质——乘法法则。上一节我们介绍了求和法则,本节中我们来看看当函数是两个函数的乘积时,其导数该如何计算。

乘法法则的直观理解

想象有一个函数 F,它是另外两个函数 GH 的乘积,即 F = G * H。问题是,如何用 GH 的导数来表示 F 的导数?

我们可以把求导想象成用锤子“敲击”一个函数。为了得到 F 的导数(即敲击 F),我们需要分别敲击 GH,但不能同时敲击。具体过程是:先敲击 G 而保持 H 不变,然后敲击 H 而保持 G 不变。用公式表示就是:

F‘ = G’ * H + G * H‘

这就是乘法法则

一个生动的例子:建造房屋 🏠

为了更好地理解乘法法则,我们可以通过一个建造房屋的例子来思考。

假设你在建造一座房子,有两组工人:一组负责建造侧墙,另一组负责建造前墙。他们的建造速度不同。

  • G(t) 表示在时间 t 时侧墙已建成的长度。
  • H(t) 表示在时间 t 时前墙已建成的长度。

那么,房子在时间 t 时的面积 F(t) 就是两者的乘积:

F(t) = G(t) * H(t)

我们想知道面积随时间的变化率,即 F‘(t)。我们知道 G’(t)H‘(t) 分别代表两面墙的建造速度。

让我们从俯视图来看这座房子。经过一小段时间 Δt,工人们建造了额外的墙体:

  • 侧墙增加了 ΔG(t)
  • 前墙增加了 ΔH(t)

这导致了房屋面积的增加 ΔF(t)。新增的面积(蓝色区域)由三部分组成:

以下是新增面积的计算:

  1. 一个长条形区域:G(t) * ΔH(t)
  2. 另一个长条形区域:ΔG(t) * H(t)
  3. 一个很小的角落区域:ΔG(t) * ΔH(t)

因此,面积的总变化为:

ΔF(t) = G(t) * ΔH(t) + ΔG(t) * H(t) + ΔG(t) * ΔH(t)

从变化率到导数

面积的变化率是 ΔF(t) / Δt。将上面的等式代入并整理:

ΔF(t) / Δt = G(t) * [ΔH(t)/Δt] + [ΔG(t)/Δt] * H(t) + [ΔG(t) * ΔH(t)] / Δt

现在,为了求导数 F‘(t),我们需要让 Δt 趋近于 0。

以下是当 Δt → 0 时各项的变化:

  • ΔH(t)/Δt 变成了 H‘(t)
  • ΔG(t)/Δt 变成了 G’(t)
  • 最后一项 ΔG(t) * ΔH(t) / Δt 会趋近于 0,因为 ΔG(t)ΔH(t) 本身都非常小,它们的乘积除以 Δt 在极限下可以忽略不计。

于是,我们得到了最终结果:

F‘(t) = G(t) * H’(t) + G‘(t) * H(t)

这与我们最初直观理解的乘法法则公式完全一致。

总结

本节课中我们一起学习了导数的乘法法则。核心结论是:对于两个函数 GH 的乘积函数 F = G * H,其导数等于 “第一个函数乘以第二个函数的导数” 加上 “第一个函数的导数乘以第二个函数”,即公式 F‘ = G * H’ + G‘ * H。我们通过“敲击函数”的比喻和“建造房屋”的几何实例,从不同角度理解了这个法则的由来和意义。掌握乘法法则对于处理更复杂的函数求导至关重要。

021:导数性质-链式法则 🧮

在本节课中,我们将要学习微积分中一个极其重要的规则——链式法则。链式法则用于求解复合函数的导数,是神经网络反向传播等机器学习核心算法的数学基础。掌握了求和、乘积和标量乘法规则后,你已经为学习链式法则做好了准备。

链式法则的核心概念 🔗

上一节我们介绍了基本的求导法则,本节中我们来看看如何处理由多个函数嵌套而成的复合函数。

链式法则可能看起来是这些规则中最复杂的,但从特定角度理解,它可以变得相当简单。想象你有一个函数 h(t),你想将其输出作为另一个函数 g 的输入,即计算 g(h(t))。这就构成了一个函数的复合。

现在,你想对这个复合函数关于 t 求导。假设你已经知道 dh/dt(即 h 关于 t 的导数),以及 dg/dh(即 g 关于其输入 h 的导数)。那么,复合函数的导数就是这两个导数的乘积:

d/dt [g(h(t))] = (dg/dh) * (dh/dt)

它之所以被称为“链式”法则,是因为你可以继续嵌套函数。例如,再对 g 的输出应用一个函数 f,形成 f(g(h(t)))。其导数将是更多项的乘积:

d/dt [f(g(h(t)))] = (df/dg) * (dg/dh) * (dh/dt)

你可以继续添加更多函数,只需在乘积中增加相应的项,这就是链式法则的本质。

不同记法下的链式法则 📝

在莱布尼茨记法(dy/dx)中,链式法则非常直观。但在拉格朗日记法(使用撇号 f'(x))中,需要特别注意输入值。

对于两个函数 g(h(t)),其导数在拉格朗日记法中表示为:

d/dt [g(h(t))] = g'(h(t)) * h'(t)

关键在于,g' 的输入必须是 h(t),而不是 t 本身。对于三个函数 f(g(h(t))),则扩展为:

d/dt [f(g(h(t)))] = f'(g(h(t))) * g'(h(t)) * h'(t)

一个直观的类比:开车上山 🚗

为了更直观地理解,让我们看一个类比。想象你正开车上山。山脚很热,山顶很冷。

  • 温度 T 随着海拔高度 H 变化,其变化率是 dT/dH
  • 同时,海拔高度 H 又随着行驶时间 t 变化,其变化率是 dH/dt
  • 因此,温度 T 也间接地随着时间 t 变化,其变化率是 dT/dt

链式法则告诉我们,第三个变化率可以通过前两个的乘积得到:

dT/dt = (dT/dH) * (dH/dt)

这完美地描述了“随着时间推移,你向上行驶,而向上行驶导致温度下降”这一连锁过程。

从几何视角理解 📈

让我们通过一个三维图来更深入地理解。我们建立三个坐标轴:时间 t、高度 H、温度 T

  • 在底部的 t-H 平面中,函数 h(t) 描绘了高度随时间变化的轨迹。
  • 在后方的 H-T 平面中,函数 T(H) 描绘了温度随高度变化的轨迹。

现在,考虑一个微小的时间变化 Δt

  1. 它导致一个微小的高度变化 ΔH(由 h(t) 决定)。
  2. 这个微小的 ΔH 又导致一个微小的温度变化 ΔT(由 T(H) 决定)。

因此,存在一个数字关系:ΔT/Δt ≈ (ΔH/Δt) * (ΔT/ΔH)。由于这些都是数字,我们可以约掉 ΔH

Δt 无限趋近于 0 时,ΔHΔT 也趋近于 0,这个近似关系就变成了精确的导数关系:

lim(Δt→0) ΔT/Δt = dT/dt
lim(Δt→0) ΔH/Δt = dH/dt
lim(Δt→0) ΔT/ΔH = dT/dH

于是我们得到了链式法则:dT/dt = (dT/dH) * (dH/dt)。这个几何视角展示了微小变化是如何通过函数链进行传递的。

关键要点总结 ✨

本节课中我们一起学习了链式法则:

  1. 核心公式:对于复合函数 f(g(x)),其导数为 f'(g(x)) * g'(x)。对于更长的链,则是所有内部函数在相应点处导数的乘积。
  2. 核心思想:链式法则描述了变化率在函数链中的传递与相乘关系。
  3. 莱布尼茨记法:直观,表现为导数分数的“连锁”相乘与约分。
  4. 拉格朗日记法:必须注意每个函数的导数是在哪个输入值处计算的(例如 g'(h(t)) 而非 g'(t))。
  5. 直观理解:通过“开车上山”的类比,将抽象数学与物理变化过程联系起来。

链式法则是连接简单函数导数与复杂模型(如神经网络)求导的桥梁,务必熟练掌握其概念与应用。

022:优化导论

在本节课中,我们将要学习导数在机器学习中的一个核心应用:优化。我们将了解如何利用导数来寻找函数的最大值或最小值,这是构建和训练机器学习模型的关键步骤。

概述:为什么优化很重要?

到目前为止,我们已经掌握了处理导数的多种工具。但问题是,除了计算变化率,导数还有什么用?更具体地说,为什么它们在机器学习中如此重要?

导数在机器学习中的主要应用是优化。优化是指寻找一个函数的最大值最小值。这在机器学习中至关重要,因为我们的目标是找到一个能最好地拟合数据集的模型。为了找到这个模型,我们会计算一个误差函数,它告诉我们当前模型与理想模型之间的差距。当我们能够最小化这个误差函数时,我们就得到了最佳模型。

一个直观的例子:寻找桑拿房中最凉爽的位置

让我们通过一个例子来直观理解优化过程。想象你坐在桑拿房的长凳上,感觉太热了,于是你想换个位置,找到长凳上最凉爽的点。你带着一个温度计,当前读数是85摄氏度。你开始四处移动,寻找温度更低的地方。

你首先尝试向左移动,温度计显示90摄氏度,温度反而升高了,这不是好方向。于是你尝试向另一个方向移动,温度计显示80摄氏度,这好多了。你继续朝这个方向移动,因为最凉爽的点似乎就在那边。你不断移动,记录到的温度越来越低,直到到达一个点:无论你朝哪个方向移动,温度都会升高。于是你得出结论,这里一定是桑拿房中最凉爽的位置。

用函数和导数分析

现在,让我们用数学的眼光来看待这个过程。下图中的曲线代表了长凳上每个点的温度。

  • A点是你的初始位置。
  • B点是你第一次尝试向左移动的位置,温度更高了。
  • C点是你第二次尝试向右移动的位置,温度降低了。
  • 你从C点继续向右移动,温度持续降低。
  • 最终,你到达了D点,在这里,无论朝哪个方向移动,温度都会升高,因此你认为这是最凉爽的点。

这与导数有什么关系呢?让我们观察这些点上切线的斜率。

  • 在所有向右移动能到达更凉爽点的位置(如C点),切线的斜率小于0
  • 在所有向左移动能到达更凉爽点的位置(如B点),切线的斜率大于0
  • 在最凉爽的点(D点),无论朝哪个方向移动都会变热,该点的切线斜率等于0

这是一个关于最大值和最小值点非常有趣的性质:在这些点上,切线的斜率(即导数)总是0

局部最优与全局最优

上一节我们介绍了导数在寻找最值点中的应用,本节中我们来看看一个重要的细节:并非所有导数为零的点都是我们最终要找的全局最优点。

请看下面这个更复杂的桑拿房温度曲线。

最冷的点(全局最小值)在图中靠右的位置。但曲线上有好几个点的导数都为0。不幸的是,你必须检查所有这些点,才能确定哪个是实际最冷的点。因此,这些点都是候选点,但至少你将搜索范围缩小到了少数几个点上。

这些导数为零的候选最小值点被称为局部最小值。而整个函数上最低的那个点被称为全局最小值

核心概念总结

所以,当你想要优化一个函数(无论是最大化还是最小化),如果该函数在每一点都可导,那么你可以确定一件事:函数取得最大值或最小值的候选点,就是那些导数为0的点

用公式表示这个核心思想:

若函数 f(x) 在点 x* 处取得局部极值(最大值或最小值),且 f(x)x* 处可导,则 f'(x*) = 0

本节课总结

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

  1. 优化的定义:寻找函数的最大值或最小值。
  2. 优化在机器学习中的重要性:通过最小化误差函数来找到最佳模型。
  3. 导数与最优点的关系:函数在局部最优点处的导数为零(f'(x) = 0)。
  4. 局部最优与全局最优的区别:导数为零的点是候选极值点(局部最优),我们需要从中找出真正的全局最优点。

理解导数如何帮助我们找到这些关键点,是掌握机器学习算法(如梯度下降)工作原理的基础。在接下来的课程中,我们将学习如何利用这一原理,系统地寻找复杂函数的最优解。

025:平方损失优化-三输电线问题

在本节课中,我们将学习如何将平方损失函数应用于一个更复杂的问题:为三根输电线定位房屋,以最小化连接成本。我们将通过几何和代数两种方法来理解最优解。

上一节我们介绍了为两根输电线定位房屋的问题,本节中我们来看看当问题扩展到三根输电线时,解决方案会发生什么变化。

问题定义

现在问题变得更复杂,因为有三根输电线,第三根位于距离原点 C 的位置。问题依然是:房屋应该建在哪里,才能使连接成本最小化?

回忆一下,房屋到三根输电线的距离分别是:

  • 到第一根线(坐标 a):x - a
  • 到第二根线(坐标 b):x - b
  • 到第三根线(坐标 c):x - c

我们无需担心是 x - b 还是 b - x,因为当我们对这些差值取平方时,结果总是正数。(b - x)^2(x - b)^2 是相等的。

几何视角:面积表示

我们可以将成本可视化为正方形的面积。每个正方形的边长是房屋到对应输电线的距离,其面积代表连接到该输电线的成本。

  • 蓝色正方形:面积为 (x - a)^2,代表连接到第一根(蓝色)输电线的成本。
  • 橙色正方形:面积为 (x - b)^2,代表连接到第二根(橙色)输电线的成本。
  • 绿色正方形:面积为 (x - c)^2,代表连接到第三根(绿色)输电线的成本。这个成本通常更高,因为第三根线通常更远。

我们的目标是最小化连接的总成本,这等价于最小化这三个正方形的总面积

构建成本函数

以下是整个问题的成本函数:

总成本 = (x - a)^2 + (x - b)^2 + (x - c)^2

这个函数就是三个正方形面积的总和。问题转化为:我们应该将 x(房屋位置)设置在何处,才能最小化这个总成本?

代数求解:寻找最优x

为了找到使成本最小的 x,我们需要找到成本函数的导数(即斜率)为零的点。

  1. 求导
    成本函数 f(x) = (x - a)^2 + (x - b)^2 + (x - c)^2 的导数为:
    f'(x) = 2(x - a) + 2(x - b) + 2(x - c)

  2. 设导数为零(寻找最小点):
    2(x - a) + 2(x - b) + 2(x - c) = 0

  3. 简化方程
    两边同时除以2:(x - a) + (x - b) + (x - c) = 0
    合并同类项:3x - (a + b + c) = 0
    因此:3x = a + b + c

  4. 得出最优解
    x = (a + b + c) / 3

结论:最优的房屋位置 x 是三个输电线坐标 a, b, c 的算术平均值。

几何验证与推广

从面积角度看,如果将房屋放在最左边,某些正方形的面积会非常大;放在中间,所有正方形的面积都相对较小;放在最右边,同样会出现大面积的正方形。最优位置(平均值点)实现了总面积的全局最小化。

这个结论可以推广到更多输电线的情况。如果有 n 根输电线,坐标分别为 a1, a2, ..., an,那么最小化平方和损失的最优解就是将房屋放在所有坐标的平均值处:

最优 x = (a1 + a2 + ... + an) / n

这个“平方损失”函数在机器学习中极其重要,我们将在后续课程中再次遇到它。


本节课中我们一起学习了如何利用平方损失函数解决多目标(三输电线)的优化问题。我们通过构建成本函数、求导并设为零,推导出最优解是所有目标点坐标的平均值。这个方法不仅适用于三根输电线,还可以推广到任意数量的目标点,是理解机器学习中回归问题基础原理的重要一步。

026:对数损失优化第一部分

概述

在本节课程中,我们将通过一个抛硬币游戏的例子,学习机器学习中一个非常重要的概念——对数损失。我们将看到如何通过微积分来优化一个概率模型,并理解为何取对数可以极大地简化计算过程。


从平方损失到对数损失

上一节我们介绍了一个使用平方损失进行优化的例子。现在,我们将探讨机器学习中另一个极其重要的函数——对数损失。同样,我们将通过一个具体的例子来理解它。

我倾向于用抛硬币的例子来解释机器学习和统计学中的大多数概念。让我们来玩一个游戏。

抛硬币游戏

我将抛一枚硬币10次,并观察结果。如果结果是7次正面,然后是3次反面,那么你将赢得一大笔钱。否则,你将一无所获。赢得游戏的概率看起来相当渺茫,但你可以选择你想使用的硬币,并且这可以是一枚有偏见的硬币。

以下是三枚硬币:

  • 硬币1:正面朝上的概率为 70%,反面朝上的概率为 30%
  • 硬币2:一枚公平的硬币,正反面概率均为 50%
  • 硬币3:一枚有偏见的硬币,与硬币1相反,正面朝上的概率为 30%,反面朝上的概率为 70%

现在有一个问题:为了最大化你赢得游戏的机会,你会选择三枚硬币中的哪一枚?请记住,要赢得游戏,你必须让硬币连续7次正面朝上,然后连续3次反面朝上

计算获胜概率

为了选择最好的硬币,我们来计算使用每枚硬币赢得游戏的概率。

  • 对于硬币1:正面概率 p = 0.7,反面概率 1-p = 0.3。连续7次正面的概率是 0.7^7,连续3次反面的概率是 0.3^3。由于这些事件是独立的,总概率是它们的乘积:
    P(赢 | 硬币1) = 0.7^7 * 0.3^3 ≈ 0.00222

  • 对于硬币2p = 0.5
    P(赢 | 硬币2) = 0.5^7 * 0.5^3 = 0.5^10 ≈ 0.00097

  • 对于硬币3p = 0.3
    P(赢 | 硬币3) = 0.3^7 * 0.7^3 ≈ 0.00008

如你所见,硬币1是最好的选择,它能让我们以最高的概率赢得游戏。

寻找全局最优解

然而,这里有一个更深层次的问题:硬币1是所有可能创造的硬币中最好的那一枚吗?为了回答这个问题,我们需要用到微积分。

让我们定义一枚通用硬币,其正面朝上的概率为 p,反面朝上的概率为 1-p(因为概率总和必须为1)。我们的目标是找到能最大化获胜概率的最优 p

首先,获胜概率函数 g(p) 是:
g(p) = p^7 * (1-p)^3

我们需要使用微积分来最大化 g(p)。方法是对 g(p) 求导并令其等于零。

以下是求导过程:

  1. 应用乘积法则:d/dp [u*v] = u'*v + u*v',其中 u = p^7v = (1-p)^3
    g'(p) = (7p^6) * (1-p)^3 + p^7 * [3*(1-p)^2 * (-1)]
    (注意:对 (1-p)^3 求导使用了链式法则,内层导数 -1 来自 d(1-p)/dp

  2. 整理并提取公因式:
    g'(p) = p^6 * (1-p)^2 * [7(1-p) - 3p]

  3. 令导数等于零:g'(p) = 0
    一个乘积为零意味着至少有一个因子为零:

    • p^6 = 0 => p = 0
    • (1-p)^2 = 0 => p = 1
    • 7(1-p) - 3p = 0 => 7 - 7p - 3p = 0 => 7 = 10p => p = 0.7

p = 0p = 1 没有意义,因为硬币总是反面或总是正面,无法产生所需的序列。因此,最优解是 p = 0.7。这证实了硬币1确实是我们能选择的最佳硬币。

更简单的方法:取对数

上面的计算过程有些繁琐。有没有更简单的方法呢?答案是肯定的,而且这个方法在机器学习中非常常用。

这个技巧就是:对概率函数 g(p) 取自然对数。因为如果 g(p) 在某个点取得最大值,那么 ln(g(p)) 也在同一点取得最大值。所以最大化 ln(g(p)) 等价于最大化 g(p)

让我们定义 G(p) = ln(g(p))
G(p) = ln( p^7 * (1-p)^3 )

利用对数的性质:

  1. 积的对数等于对数的和:ln(a*b) = ln(a) + ln(b)
  2. 幂的对数等于指数乘以对数的底:ln(a^b) = b * ln(a)

应用这些性质:
G(p) = ln(p^7) + ln((1-p)^3) = 7 * ln(p) + 3 * ln(1-p)

现在,我们最大化这个简化后的函数 G(p)。对其求导:
G'(p) = 7 * (1/p) + 3 * (1/(1-p)) * (-1)
(注意:对 ln(1-p) 求导使用了链式法则,内层导数为 -1

令导数等于零:
7/p - 3/(1-p) = 0

通分并求解:
[7(1-p) - 3p] / [p(1-p)] = 0
由于我们已经排除了 p=0p=1 的情况,分母不为零。因此,只需令分子为零:
7(1-p) - 3p = 0
7 - 7p - 3p = 0
7 = 10p
p = 0.7

我们得到了与之前完全相同的解,但计算过程简单得多

从对数概率到对数损失

在机器学习中,取对数的技巧非常流行。概率的对数(log-probability)非常常见且有用。

实际上,我们通常关心的不是 G(p),而是它的负值,即 -G(p)。这个函数被称为对数损失(Log Loss),是机器学习分类问题中一个非常有用的损失函数。

我们取负值的原因在于:当概率 p 在0和1之间时,ln(p) 是一个负数。取负号后,-ln(p) 就变成了正数。并且,我们通常的优化目标从最大化概率(或对数概率),转变为最小化损失。因此,我们最终的目标是最小化负的对数似然,即最小化对数损失。

对于一个数据点,如果其真实标签为 y(例如1代表正面),模型预测为正面的概率为 p,那么该点的对数损失通常定义为:
Loss = - [ y * ln(p) + (1-y) * ln(1-p) ]


总结

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

  1. 通过一个抛硬币游戏的例子,引入了优化概率模型的问题。
  2. 使用传统微积分方法(求导)找到了能最大化获胜概率的最优硬币偏差 p = 0.7
  3. 学习了通过取对数来简化优化过程的强大技巧,将复杂的乘积求导转化为简单的求和求导。
  4. 引出了机器学习中的核心概念——对数损失,它本质上是负的对数似然,是分类模型常用的优化目标。

理解对数损失及其背后的数学原理,对于掌握逻辑回归等分类算法至关重要。在下一节中,我们将更深入地探讨对数损失在具体机器学习模型中的应用。

027:对数损失优化第二部分

概述

在本节课中,我们将深入探讨为什么在机器学习中,尤其是在优化模型参数时,我们倾向于使用对数损失函数,而不是直接处理原始的概率乘积。我们将从数学和计算两个角度来理解对数的优势。

回顾:寻找最优模型

在上一节视频中,我们通过优化对数损失函数,找到了最能拟合数据(10次抛硬币,7次正面,3次反面)的模型参数 P(硬币正面朝上的概率)。我们得出的最优解是 P = 0.7

这个过程本质上就是机器学习:我们有一个数据集(抛硬币结果),一个模型(参数为 P 的硬币),并通过最小化损失函数来找到最可能产生该数据集的模型参数。

为什么使用对数损失?

我们找到了最优的 P,但一个自然的问题是:为什么我们要使用带有对数的损失函数?为什么不能直接对原始的概率乘积求导来优化呢?

原因一:简化求导过程

直接对概率乘积求导非常复杂。让我们来看看原因。

假设我们的似然函数是多个概率的乘积,例如:
L(P) = P^7 * (1-P)^3

这个函数的导数计算起来很繁琐。对于两个项的乘积,我们可以使用乘积法则。但对于三个、四个,甚至像这里一样多个项的乘积,就需要反复应用乘积法则,过程会变得极其混乱。

相比之下,如果我们先对这个乘积取对数,就将其转化为了求和的形式:
log(L(P)) = 7*log(P) + 3*log(1-P)

现在,对这个对数似然函数求导就变得非常简单:
d/dP [log(L(P))] = 7/P - 3/(1-P)

虽然我们因此引入了分母(这是对数函数 log(x) 的导数为 1/x 的性质决定的),但这是一个很小的代价。与处理左边那个复杂的乘积导数公式相比,对数和的形式要清晰、易处理得多。

原因二:避免数值下溢

使用对数的另一个重要原因是计算上的。概率是介于0和1之间的数。当我们需要计算大量(例如成千上万个)概率的乘积时,结果会变得极其微小。

例如,1000个介于0和1之间的数的乘积,其结果可能小到计算机无法精确表示(这种现象称为“数值下溢”)。

然而,如果我们取对数,情况就不同了。一个非常小的数的对数,会变成一个非常大的负数(例如,log(0.0000001) ≈ -16.1)。计算机可以轻松地处理和存储这些大数值的负数,从而避免了数值下溢的问题。

核心要点总结

以下是我们在机器学习中使用对数变换的两个关键原因:

  1. 数学简化:将对数应用于概率乘积,可以将复杂的乘法运算转化为简单的加法运算,极大简化了后续的求导和优化过程。
  2. 数值稳定:对数变换可以将极小的概率值映射为可管理的数值范围,有效防止在计算大量概率乘积时出现数值下溢,保证了计算的稳定性和精度。

总结

本节课中,我们一起学习了在机器学习优化问题中使用对数损失函数的深层原因。我们了解到,对数不仅是一个数学技巧,能将棘手的乘积求导转化为简单的求和求导,更是一个计算工具,能确保我们的算法在面临大量微小概率时依然稳定运行。因此,任何在机器学习中遇到复杂概率乘积的情况,都应考虑使用对数进行简化,这通常会带来巨大的便利,尤其是在进行求导优化时。

028:第一周总结 🎯

在本节课中,我们将对第一周的核心内容进行回顾和总结。第一周我们主要学习了导数的基本概念、计算方法及其在优化问题中的应用,并初步探讨了这些概念如何与机器学习问题相关联。

什么是导数?📈

上一节我们介绍了微积分的基础,本节中我们来看看导数的核心定义。导数描述了一个函数在某一点处的瞬时变化率。对于函数 f(x),其在点 x 处的导数定义为:

f'(x) = lim (h -> 0) [f(x + h) - f(x)] / h

这个公式计算了当自变量 x 发生微小变化 h 时,函数值 f(x) 的平均变化率在 h 趋近于0时的极限值,即瞬时变化率。

如何计算导数?🧮

理解了导数的定义后,我们需要掌握其计算方法。以下是计算导数的一些基本规则:

  • 幂法则:若 f(x) = x^n,则 f'(x) = n * x^(n-1)
  • 常数法则:常数的导数为0。
  • 乘法法则:若 f(x) = g(x) * h(x),则 f'(x) = g'(x) * h(x) + g(x) * h'(x)
  • 链式法则:若 f(x) = g(h(x)),则 f'(x) = g'(h(x)) * h'(x)

导数在优化中的应用 ⚙️

计算导数本身不是最终目的,更重要的是利用它来解决优化问题。在机器学习中,优化通常意味着寻找使某个函数值(如损失函数)最小或最大的参数。

导数的关键作用在于,函数在局部极小值或极大值点处的导数为零(f'(x) = 0)。因此,通过求解导数为零的方程,我们可以找到潜在的极值点。梯度下降等优化算法正是基于这一原理,通过迭代地沿导数(梯度)的反方向更新参数,来寻找函数的最小值。

从优化到机器学习 🤖

那么,这些优化问题如何转化为机器学习问题呢?在机器学习中,我们通常有一个模型(例如一个线性函数 y = wx + b)和一个用于衡量模型预测好坏的损失函数(例如均方误差)。训练模型的目标就是找到一组参数(wb),使得损失函数的值最小。

这个过程本质上就是一个优化问题:找到使损失函数最小化的模型参数。而我们刚刚学习的导数,正是求解这个优化问题的核心数学工具。通过计算损失函数关于各个参数的导数(即梯度),我们可以知道如何调整参数才能有效地降低损失。

总结与展望 🚀

本节课中我们一起学习了导数的定义、基本计算规则及其在单变量函数优化中的核心应用。我们了解到,通过求解导数为零的点或利用梯度信息进行迭代,可以找到函数的最优解,而这正是训练机器学习模型(最小化损失函数)的数学基础。

然而,目前我们讨论的所有内容都局限于单变量函数。可以想象,大型的机器学习模型往往涉及成千上万个变量(参数)。因此,接下来我们将要学习如何将导数和优化的概念扩展到多变量的情形。我们第二周再见。

029:切平面导论 🧮

在本节课中,我们将学习多变量函数的核心概念,特别是如何将单变量函数的导数思想推广到两个或更多变量的情况。我们将重点介绍切平面的概念,这是理解多变量函数变化率的基础。

上一节我们回顾了单变量函数的导数,本节中我们来看看当函数输入变为两个时,情况会发生怎样的变化。

从切线到切平面

在第一周,我们学习了单变量函数的导数。例如,函数 f(x) = x² 的图像是一条抛物线。在视觉上,我们可以将每一点的导数理解为该点切线的斜率。例如,在点 (2, 4) 处,切线的斜率是 4

那么,如果我们有一个双变量函数呢?让我们考虑一个简单的例子:f(x, y) = x² + y²。这个函数有两个输入和一个输出,因此需要在三维空间中绘制。其中,X 和 Y 是地板平面上的两个水平轴,Z(即 f(x, y))被绘制为高度。

此时,“切线”不再是线,而是平面,如下图所示。这个平面被称为切平面

如何得到切平面?

本质上,其原理与单变量情况相同,只是我们需要考虑两个方向。我们必须通过平面来“切割”空间,然后分别计算这些平面上的切线。

例如,我们固定 y = 4。这意味着我们在此处切割空间,得到一条红色的抛物线。接着,我们固定 x = 2 再次切割空间,得到另一条红色的抛物线。在这两条抛物线上,我们分别可以找到一条切线。一旦有了两条相交的切线,它们就唯一确定了一个平面,这个平面就是切平面。

以下是具体的计算步骤:

  1. 当固定 y = 4 时,函数变为 f(x, 4) = x² + 4²。我们对此函数关于 x 求导,得到导数为 2x。这就是其中一条切线的斜率。
  2. 当固定 x = 2 时,函数变为 f(2, y) = 2² + y²。我们对此函数关于 y 求导,得到导数为 2y。这就是另一条切线的斜率。

通过这两条切线,我们就能确定切平面。

核心概念与后续内容

上述计算可能看起来有些令人困惑,但请不要担心。在接下来的几个视频中,我们将详细阐述这些概念,并介绍一种名为梯度下降的强大方法,它能帮助我们在多变量情况下更高效地进行优化,这在机器学习中至关重要。

本节课中我们一起学习了双变量函数切平面的基本概念。我们看到了如何通过固定一个变量、考察另一个变量的变化(即求偏导数)来构建切平面。这是理解多变量微积分的基石,也是后续学习优化算法(如梯度下降)的关键准备。

030:偏导数第一部分

概述

在本节课中,我们将要学习偏导数的概念。偏导数是多变量函数微积分中的核心工具,它帮助我们理解当只改变一个变量而保持其他变量不变时,函数的变化率。这对于理解机器学习中复杂的模型如何随参数变化至关重要。

偏导数的几何直观

上一节我们介绍了多变量函数,本节中我们来看看如何从几何角度理解偏导数。

想象一个在三维空间中绘制的二元函数图像。如果我们用一个平面去“切割”这个曲面,会得到一条曲线。例如,用一个平行于x-z平面的平面去切割,会得到一条红色的抛物线。在这条抛物线上,我们可以画一条黑色的切线。这条切线的斜率,就是函数在特定点关于x的偏导数

同样,我们也可以用平行于y-z平面的平面去切割曲面,得到另一条红色抛物线,其上的切线斜率就是函数关于y的偏导数。

如何计算偏导数

理解了偏导数的几何意义后,我们来看看如何具体计算它。

计算偏导数的过程非常简单,遵循两个核心步骤。以下是计算步骤:

  1. 固定其他变量:将除了要对其求导的那个变量之外的所有其他变量都视为常数。
  2. 常规求导:将函数视为仅关于该变量的单变量函数,并应用常规的求导法则。

让我们通过一个具体例子来演示。假设我们有一个函数:
f(x, y) = x² + y²

计算关于x的偏导数 (∂f/∂x)

  • 步骤1:将 y 视为常数。此时 就是一个常数项。
  • 步骤2:对 x 求导。 的导数是 2x,常数项 的导数是 0
  • 结果∂f/∂x = 2x

计算关于y的偏导数 (∂f/∂y)

  • 步骤1:将 x 视为常数。此时 就是一个常数项。
  • 步骤2:对 y 求导。常数项 的导数是 0 的导数是 2y
  • 结果∂f/∂y = 2y

偏导数的符号表示

对于一个二元函数 f(x, y),我们有两种常见的偏导数符号表示方法:

  • 关于x的偏导数
    • 莱布尼茨记号:∂f/∂x
    • 下标记号:f_x
  • 关于y的偏导数
    • 莱布尼茨记号:∂f/∂y
    • 下标记号:f_y

可以想象,如果一个函数有10个变量(例如 f(x₁, x₂, ..., x₁₀)),那么我们就可以求出10个偏导数,每个都是固定其他9个变量后,对其中一个变量求导的结果。

总结

本节课中我们一起学习了偏导数。我们首先通过三维图像的“切割”获得了其几何直观:它代表了在多变量函数中,仅沿一个坐标轴方向变化时的瞬时变化率(切线斜率)。然后,我们掌握了计算偏导数的两步法:1) 固定其他变量为常数;2) 对目标变量应用单变量求导法则。最后,我们熟悉了偏导数的两种常用符号表示(∂f/∂xf_x)。理解偏导数是学习梯度、方向导数以及后续优化算法的基础。

031:偏导数第二部分

在本节课中,我们将通过一个具体的例子来巩固偏导数的概念。我们将学习如何计算一个包含两个变量的函数的偏导数,并分别对每个变量进行求导。

概述

上一节我们介绍了偏导数的基本概念。本节中,我们来看看如何应用这些概念来计算一个具体函数 f(x, y) = 3x²y³ 的偏导数。我们将分别计算函数关于 x 和关于 y 的偏导数。

计算关于 x 的偏导数

我们的任务是计算函数 f(x, y) = 3x²y³ 关于变量 x 的偏导数,记作 ∂f/∂x

计算过程遵循两个核心步骤。

以下是计算步骤:

  1. 将其他变量视为常数:因为我们要对 x 求导,所以需要将另一个变量 y 视为常数。这意味着表达式 是一个常数。
  2. 应用常规微分法则:现在,函数可以看作常数 3 和常数 的乘积。我们应用标量乘法法则和幂法则进行求导。

根据上述步骤,计算如下:

  • 常数 3 保留。
  • 关于 x 的导数是 2x
  • 常数 保留。

因此,偏导数 ∂f/∂x 为:
∂f/∂x = 3 * 2x * y³ = 6xy³

计算关于 y 的偏导数

接下来,我们计算同一个函数 f(x, y) = 3x²y³ 关于变量 y 的偏导数,记作 ∂f/∂y

计算逻辑与之前完全相同,只是角色互换。

以下是计算步骤:

  1. 将其他变量视为常数:这次是对 y 求导,因此需要将变量 x 视为常数。这意味着表达式 是一个常数。
  2. 应用常规微分法则:函数现在是常数 3、常数 的乘积。我们应用相同的微分法则。

根据上述步骤,计算如下:

  • 常数 3 保留。
  • 常数 保留。
  • 关于 y 的导数是 3y²

因此,偏导数 ∂f/∂y 为:
∂f/∂y = 3 * x² * 3y² = 9x²y²

总结

本节课中我们一起学习了如何计算二元函数的偏导数。我们通过函数 f(x, y) = 3x²y³ 的例子,实践了计算偏导数的两个关键步骤:首先将非目标变量视为常数,然后应用基本的微分法则。我们分别得出了 ∂f/∂x = 6xy³∂f/∂y = 9x²y²。掌握这个方法对于理解机器学习中多变量函数的优化至关重要。

033:梯度与极值

在本节课中,我们将学习如何使用梯度来最小化两个或更多变量的函数,这与我们使用导数最小化单变量函数的方式非常相似。

上一节我们介绍了梯度的概念,本节中我们来看看如何利用梯度寻找多元函数的极值点。

从单变量函数到多变量函数

首先,让我们回顾一个单变量函数的例子:f(x) = x²。当我们想要最小化这个函数时,最小值点位于导数为零的位置。具体来说,我们计算导数 f'(x) = 2x,然后解方程 2x = 0,得到解 x = 0,这就是函数的最小值点。

现在,让我们转向我们一直在研究的二元函数:f(x, y) = x² + y²。这个函数的最小值点位于原点 (0, 0)。观察这个点,你会发现该点处的切平面与底面(xy平面)平行。事实上,对于任何局部极小值或极大值点,其切平面都是平行于底面的。

偏导数与极值条件

由于我们处理的是偏导数,让我们画出两个方向上的切线。在最小值点处,这两条切线(分别对应x方向和y方向)的斜率都为零,因为它们都平行于底面。

换句话说,右侧函数 f(x, y) 的最小值出现在两个偏导数给出的切线斜率都为零的时候。如果你有一个包含更多变量的函数,比如12个变量,那么你需要确保所有12个偏导数对应的斜率都为零。

以下是寻找极值点的数学步骤:

对于单变量函数 f(x) = x²

  1. 我们希望斜率为零,即导数 f'(x) = 0
  2. 计算导数:f'(x) = 2x
  3. 解方程 2x = 0,得到 x = 0

对于多变量函数 f(x, y) = x² + y²

  1. 我们希望两个偏导数都为零:∂f/∂x = 0∂f/∂y = 0
  2. 计算偏导数:∂f/∂x = 2x∂f/∂y = 2y
  3. 解方程组:2x = 02y = 0
  4. 得到解:(x, y) = (0, 0)

核心方法总结

有时解方程组可能需要一些计算,但基本方法是明确的:

要找到多元函数的局部极小值或极大值点,只需将所有偏导数设为零,然后求解该方程组。

本节课中我们一起学习了如何将单变量函数求极值的导数方法,推广到多变量函数的梯度方法。关键在于理解,在多维空间中,极值点出现在所有方向上的“坡度”(偏导数)都为零的位置,这对应于梯度向量为零向量。通过求解所有偏导数等于零的方程组,我们就能找到这些潜在的极值点。

034:梯度优化示例 🧮

在本节课中,我们将学习如何将导数的概念应用于多维空间中的优化问题。我们将通过一个更贴近现实的桑拿房例子,来理解如何找到二元函数的最小值点。

上一节我们介绍了单变量函数的导数与优化。本节中我们来看看当问题扩展到两个维度时,情况会如何变化。

二维桑拿房问题 🧖

假设我们身处一个5x5的桑拿房中,可以自由地向任何方向移动。房间内各点的温度不同,红色区域表示高温,蓝色区域表示低温。我们的目标是找到房间内最凉爽的那个点,即温度函数 T(x, y) 的最小值点。

温度由位置坐标 (x, y) 决定,其函数值(温度)在图中用高度表示。因此,红色高点代表高温,蓝色低点代表低温。

直观的搜索方法 🚶

首先,我们可以尝试一种直观的方法。假设我们站在某个起点,可以向周围试探性地迈出几步,例如朝几个不同的方向走一小步,然后比较哪一步让我们感觉更凉爽。选择最凉爽的方向迈出一步,然后在新位置重复这个过程。

通过不断迭代,我们最终有可能到达房间内最冷的点。如何判断是否到达了最冷点呢?与一维情况类似,在最冷点处,向任何方向移动都会导致温度升高,没有任何一个方向能让你更凉爽。

从数学角度看,在最小值点处,温度函数的切平面是水平的。这意味着函数在该点沿所有方向的瞬时变化率均为零。

数学描述与求解 🔢

现在,让我们用数学公式来精确描述和解决这个问题。假设温度函数 T 由以下公式给出:

T(x, y) = 85 - (1/90) * x^2 * (x - 6) * y^2 * (y - 6)

我们的目标是找到使 T(x, y) 最小的 (x, y)

在多元函数中,我们使用偏导数来描述函数沿各个坐标轴方向的变化率。对于最小值点,两个偏导数必须同时为零。

以下是计算两个偏导数的练习:

  • ∂T/∂x:将 y 视为常数,对 x 求导。
  • ∂T/∂y:将 x 视为常数,对 y 求导。

计算结果如下:

∂T/∂x = -(1/90) * [x * (3x - 12) * y^2 * (y - 6)]
∂T/∂y = -(1/90) * [x^2 * (x - 6) * y * (3y - 12)]

为了找到候选极值点,我们需要解方程组:

∂T/∂x = 0
∂T/∂y = 0

寻找候选点 📍

由于偏导数是多个因子的乘积,乘积为零意味着至少有一个因子为零。因此,我们可以分别列出每个偏导数为零的条件。

对于 ∂T/∂x = 0,可能的情况有:

  1. x = 0
  2. 3x - 12 = 0 => x = 4
  3. y^2 = 0 => y = 0
  4. y - 6 = 0 => y = 6

对于 ∂T/∂y = 0,可能的情况有:

  1. x = 0
  2. x - 6 = 0 => x = 6
  3. y = 0
  4. 3y - 12 = 0 => y = 4

将所有可能的 (x, y) 组合配对,我们可以得到一系列候选点。但需要注意,有些点(如 x=6, y=6)可能位于桑拿房边界之外,我们不予考虑。

确定最小值点 ✅

通过检查所有候选点的函数值,我们可以确定哪一个是全局最小值。

  • x=0y=0 时,温度 T = 85,这实际上是局部最大值点(最热点),而非我们寻找的最小值。
  • 经过筛选,唯一的最小值点(x=4, y=4)。在该点,温度为 73.6,是房间内最凉爽的位置。

这个过程与一维优化类似:通过令导数(此处为偏导数)为零找到所有候选点,然后逐一验证,从中找出真正的极值点。


本节课中我们一起学习了如何将梯度优化应用于二维空间。我们通过桑拿房的例子,理解了寻找二元函数最小值的基本步骤:计算偏导数、令其为零以获取候选点、最后通过比较确定最小值点。这是理解更复杂机器学习优化算法的重要基础。

035:梯度优化解析法 📈

在本节课中,我们将学习如何通过解析方法解决一个二维优化问题。我们将回顾电力线连接的例子,但这次问题将扩展到二维平面,并引入机器学习中一个极其重要的模型——线性回归。我们将看到如何通过优化技术找到最佳拟合线。

从一维到二维的电力线问题 🔌

上一节我们介绍了一维的电力线连接问题,目标是找到连接三个电力线成本最低的位置。本节中,我们来看看一个类似但更复杂的问题:在二维平面上寻找最优的直线连接。

假设三个电力线位于XY平面上,坐标分别为 (1,2)、(2,5) 和 (3,3)。我们的目标是找到一条直线(光纤线),使得从这三个点到该直线的垂直连接线(平行于Y轴)的总成本最低。每条连接线的成本是其长度的平方。

以下是连接示意图:

构建成本函数 📊

现在,我们的任务是将这个问题转化为一个数学优化问题。光纤线可以用直线方程 y = mx + b 表示,其中 m 是斜率,b 是Y轴截距。我们的目标是找到最优的 mb,以最小化三个连接线长度的平方和。

让我们具体计算每个点的成本:

  • 对于蓝色电力线 (1,2):连接点在直线上的Y坐标为 m*1 + b,距离为 (m + b - 2),成本为 (m + b - 2)^2
  • 对于黄色电力线 (2,5):成本为 (2m + b - 5)^2
  • 对于绿色电力线 (3,3):成本为 (3m + b - 3)^2

因此,总成本函数 E(m, b) 是这三个平方项的和:
E(m, b) = (m + b - 2)^2 + (2m + b - 5)^2 + (3m + b - 3)^2

展开并合并同类项后,我们得到:
E(m, b) = 14m^2 + 3b^2 + 12mb - 42m - 20b + 38

我们的目标就是最小化这个关于 mb 的二元函数。

通过偏导数求解最优解 🧮

我们已经知道,要找到多元函数的最小值点,需要计算其偏导数并令其为零。这为我们提供了一个方程组。

以下是计算步骤:
首先,计算 Em 的偏导数:
∂E/∂m = 28m + 12b - 42

接着,计算 Eb 的偏导数:
∂E/∂b = 6b + 12m - 20

为了找到最小值点,我们令这两个偏导数同时为零,得到方程组:

  1. 28m + 12b - 42 = 0
  2. 6b + 12m - 20 = 0

解方程组得到最优参数 🔍

现在,我们来解这个二元一次方程组。我们可以使用代入法或消元法。

将第二个方程乘以2,得到:12b + 24m - 40 = 0
用第一个方程减去这个新方程:(28m + 12b - 42) - (12b + 24m - 40) = 0,化简得 4m - 2 = 0
解得:m = 0.5

m = 0.5 代入第二个原方程:6b + 12*(0.5) - 20 = 0,即 6b + 6 - 20 = 0
解得:b = 14/6 = 7/3 ≈ 2.333

因此,最优参数为 m = 0.5b = 7/3。对应的最优直线方程为:
y = 0.5x + 7/3

将参数代入成本函数,可计算出最小成本约为 E(0.5, 7/3) ≈ 4.167。在图中,这条直线确实能很好地拟合三个点,使得连接线的平方和最小。

总结与展望 🚀

本节课中,我们一起学习了如何通过解析法解决一个二维优化问题。我们具体完成了以下步骤:

  1. 将实际问题(寻找最佳光纤线)转化为数学优化问题。
  2. 构建了以斜率 m 和截距 b 为变量的成本函数 E(m, b)
  3. 通过计算偏导数 ∂E/∂m∂E/∂b,并令其为零,建立了方程组。
  4. 解方程组得到了最优参数 m = 0.5b = 7/3

这个问题本质上就是线性回归——机器学习中最基础且重要的模型之一,其目标正是找到一条直线,使得所有数据点到该直线距离的平方和最小。

然而,我们注意到,当变量数量很多时(例如有成千上万个特征),求解庞大的方程组会非常耗时且计算成本高昂。那么,有没有更高效的方法呢?

答案是肯定的。在接下来的课程中,我们将学习一种名为梯度下降的迭代优化算法。它能够以更快的速度逼近函数的最小值点,是解决大规模机器学习优化问题的核心工具。敬请关注后续内容。

036:单变量梯度下降优化第一部分

在本节课中,我们将学习一种强大的迭代方法,用于最小化或最大化函数,尤其是在多变量情况下。这种方法被称为梯度下降。我们将从单变量梯度下降开始,逐步过渡到多变量情况。

优化问题的挑战

上一节我们学习了如何使用导数和梯度来解决优化问题。然而,当我们尝试通过解析方法精确求解这些问题时,会发现问题会迅速变得非常复杂,尤其是在高维空间中。

本节中,我们来看看一种迭代方法,它对于最小化或最大化函数非常有效。

单变量梯度下降示例

让我们观察以下函数:
f(x) = e^x - ln(x)

这是该函数的图像。它平滑且连续。我们的问题是:能否找到它的最小值?最小值大约位于此处。

根据之前课程的知识,我们只需计算 f'(x) 并令其等于0,然后求解x。

f(x) 的导数是:
f'(x) = e^x - 1/x

因此,我们需要解方程 e^x - 1/x = 0。然而,这相当具有挑战性。

解方程 e^x - 1/x = 0 等价于解 e^x = 1/x。我建议你尝试一下,解析求解实际上非常困难。其解约为0.5671,这是一个著名的常数,被称为欧米伽常数。

迭代方法的引入

解析求解的困难不应阻止我们尝试其他方法。以下是一种方法:

  1. 随机选取一个初始值,例如图像中这个位置。
  2. 尝试向左和向右移动一小步,得到两个新点。
  3. 比较这两个新点的函数值。由于我们的目标是最小化函数,选择函数值较小的那个点(图中右侧的点)。
  4. 重复此过程:从新点出发,再次向两侧移动,并选择函数值更小的点。
  5. 再次重复后,有趣的情况发生了:两侧点的函数值都比当前点高。因此,我们可以认为当前点“足够接近”最小值。

这种方法并不差,但我们可以在下一个视频中看到如何大幅改进它,从而得到非常、非常接近最小值的结果。

本节总结

本节课中,我们一起学习了优化问题解析求解的局限性,并引入了一种基于迭代和比较的简单方法,为理解更强大的梯度下降算法奠定了基础。在下一节,我们将深入探讨如何改进这种方法。

037:单变量梯度下降优化第二部分 🎯

在本节课中,我们将学习一种更智能的优化方法——梯度下降法。我们将了解其核心思想、算法步骤,并通过一个具体例子来演示其工作过程。


在上一节中,我们学习了一种近似寻找函数最小值的方法。本节中,我们将探讨一种更高效的策略。

假设当前点位于最小值左侧,我们希望它更接近最小值,那么应该让它向右移动一小步。反之,如果当前点位于最小值右侧,则应让它向左移动。那么,函数本身是否包含能帮助我们快速做出这个决策的信息呢?

答案是肯定的。让我们观察导数(斜率):

  • 在最小值左侧,斜率为负,点需要向右移动。
  • 在最小值右侧,斜率为正,点需要向左移动。

因此,我们需要的信息就是斜率。具体操作是减去斜率:

  • 当斜率为负时,减去一个负数等于加上一个正数,点向右移动。
  • 当斜率为正时,减去一个正数,点向左移动。

如果用 x1 表示新点,x0 表示旧点,那么公式可以写为:
x1 = x0 - f'(x0)
其中 f'(x0) 是函数在 x0 处的导数(斜率)。

然而,这里有一个需要注意的问题。想象一下,如果你位于曲线非常陡峭的部分,那么导数值会非常大,这会导致更新步长过大。过大的步长可能使我们“越过”最小值,甚至偏离到更远的地方,导致算法不稳定。我们希望采取小步前进,以确保路径更安全。

如何控制步长呢?很简单,我们修改公式,在斜率前乘以一个很小的数,例如 0.01。这个数被称为学习率,通常用希腊字母 α 表示。选择合适的 α 值本身就是一门学问。

这个修改后的公式还有一个额外的好处:

  • 当你远离最小值且处于陡峭区域时,导数值大,乘以学习率后,相对步长仍然较大,有助于快速接近目标。
  • 当你接近最小值且处于平坦区域时,导数值小,乘以学习率后,步长自动变小,有助于精细调整,精确逼近。

这就像打高尔夫球:距离球洞远时,需要用力挥杆;距离球洞很近时,则需要轻柔精准地推杆。

这种方法被称为梯度下降法。它在机器学习中极其重要且应用广泛,原因就在于它只需要迭代执行一个简单的更新步骤。

以下是梯度下降算法的简要描述:

  1. 目标:找到函数 F(x) 的最小值。
  2. 首先,定义一个学习率 α 并选择一个起始点 x0
  3. 然后执行更新步骤:x_k = x_{k-1} - α * f'(x_{k-1})
  4. 重复步骤3,直到足够接近真实的最小值。当连续迭代中 x 的变化非常微小时,通常就可以认为已经收敛。

现在,让我们用一个例子来尝试几次迭代。

回顾我们的函数:f(x) = e^x - ln(x)
其导数为:f'(x) = e^x - 1/x

我们选择起始点 x0 = 0.05,学习率 α = 0.005

以下是前两次迭代:

  • 第一次迭代:计算 f'(0.05),然后更新 x1 = 0.05 - 0.005 * f'(0.05) ≈ 0.11447。可以看到,新点 0.11447 比旧点 0.05 更接近最小值。
  • 第二次迭代:以 x1 为起点,计算 f'(0.11447),然后更新 x2 = 0.11447 - 0.005 * f'(0.11447) ≈ 0.1735

我们可以重复这个过程很多次(几十、几百、几千次),直到非常接近最小值。梯度下降算法速度很快,能够高效地进行大量迭代。

请注意一个有趣且关键的点:在整个算法中,我们从未需要直接求解方程 f'(x) = 0(即 e^x - 1/x = 0)。我们只需要知道导数 f'(x) 的表达式,并在每次更新步骤中计算其值即可。这是一个巨大的改进。


本节课中,我们一起学习了梯度下降法的核心原理。我们了解到它通过利用函数的导数(梯度)信息,结合学习率来控制步长,以迭代的方式智能地逼近函数的最小值点。这种方法避免了直接求解复杂方程,计算高效,是机器学习中模型优化的基石算法之一。

038:单变量梯度下降优化第三部分

在本节课中,我们将继续探讨梯度下降算法,重点分析学习率的选择对优化过程的影响,以及算法可能遇到的局部最小值问题。

学习率的重要性

上一节我们介绍了学习率的概念。学习率在机器学习中至关重要,找到一个合适的学习率可能相当困难,并且它对你的模型性能有显著影响。

以下是学习率设置不当可能带来的问题:

  • 学习率过大:步长过大,可能导致算法越过最小值,永远无法找到它。
  • 学习率过小:步长过小,可能需要极长时间才能到达最小值,甚至永远无法到达。

理想情况是找到一个“刚刚好”的学习率。然而,这本身就是一个研究课题。虽然存在许多根据优化进程动态调整学习率的优秀方法,但目前没有确定性的方法来找到一个完美的学习率。

局部最小值问题

现在,我们来看看梯度下降算法可能遇到的另一个问题。

假设你有一个如上图所示的函数,其全局最小值位于左侧。然而,如果你的梯度下降算法从右侧的某个点开始运行,它可能会将你带到一个局部最小值。这个点看起来像最小值,但实际上并不是全局最优解。

那么,如何克服这个问题呢?实际上,没有绝对可靠的方法来保证避免局部最小值。但一个能获得较好结果的策略是:使用许多不同的起始点,多次运行梯度下降算法。当你用这些不同的起点运行算法后,很可能其中一次运行会将你带到全局最小值,或者至少是一个相当不错的点。

总结

本节课中,我们一起学习了梯度下降优化中的两个关键挑战。首先,学习率的选择需要权衡,过大或过小都会影响收敛。其次,算法可能陷入局部最小值而非全局最小值,解决策略之一是尝试从多个不同的起点开始运行算法。理解这些挑战是有效应用梯度下降法的基础。

039:双变量梯度下降优化第一部分

在本节课中,我们将学习如何将单变量梯度下降的概念扩展到多变量场景。我们将从基础概念开始,逐步构建出完整的梯度下降算法。

概述

上一节我们介绍了单变量函数的梯度下降。本节中,我们来看看如何将这一优化方法应用于包含两个变量的函数。我们将使用一个温度与海拔的例子来引入双变量优化问题,目标是找到房间中最凉爽的位置。

从解析法到迭代法

在之前的课程中,你学习了通过计算偏导数并令其等于零来解析地求解优化问题。现在的目标是找到另一种方法,使用迭代法来解决这个问题,就像你在上一个视频中对单变量函数所做的那样。

假设你从桑拿房(一个高温点)开始。你将尝试向四个随机方向各走一步,然后观察这四个方向中哪一个能带你到达更凉爽的位置。

例如,你发现其中一个方向温度更低,于是你朝那个方向移动一步。

移动之后,你重复这个过程:再次向四个新方向各走一步,找出温度最低的方向,并朝该方向移动。你可以不断迭代这个过程,直到到达最冷点,或者至少接近最冷点。

随机步长的局限性

然而,这种方法存在一些缺陷。你如何选择移动的方向?是否有更智能的方法来确定这些方向?

与上一个视频中的单变量情况类似,确实存在一种更智能的方法,那就是使用导数。不过,这次我们将使用梯度

梯度的作用

梯度是多变量函数的导数推广。对于一个双变量函数 f(x, y),其梯度是一个向量,记作 ∇f(x, y),它包含了函数关于每个变量的偏导数:

∇f(x, y) = [ ∂f/∂x, ∂f/∂y ]

这个梯度向量指向函数值增长最快的方向。因此,它的反方向(即负梯度方向 -∇f(x, y))就指向了函数值下降最快的方向。

在寻找最冷点(即最小化温度函数)的问题中,我们正是要沿着这个负梯度方向移动,从而最有效地降低温度。

核心算法步骤

以下是双变量梯度下降算法的基本步骤:

  1. 初始化:随机选择一个起始点 (x₀, y₀)
  2. 计算梯度:在当前点计算函数的梯度 ∇f(x, y)
  3. 更新参数:沿着负梯度方向移动一小步。更新公式为:
    (x_new, y_new) = (x_old, y_old) - α * ∇f(x_old, y_old)
    其中 α 称为学习率,它控制着每一步移动的大小。
  4. 迭代:重复步骤2和步骤3,直到满足停止条件(例如梯度接近零,或达到预设的迭代次数)。

总结

本节课中,我们一起学习了双变量梯度下降的基本思想。我们从随机搜索的直观方法入手,指出了其效率低下的问题,进而引入了梯度这一核心概念。梯度指示了函数上升最快的方向,其反方向则是我们寻找最小值时需要前进的方向。下一节,我们将深入探讨学习率的选择以及算法的具体实现细节。

040:双变量梯度下降优化第二部分 🧮

在本节课中,我们将学习如何将单变量梯度下降算法精确地推广到双变量情况。我们将通过数学公式定义梯度,并展示如何使用它来高效地找到函数的最小值点。

梯度下降的精确数学方法

上一节我们介绍了一种近似方法,但其中包含了许多随机步骤。本节中,我们将像处理单变量时一样,采用更精确、更数学化的方法。

我们将为双变量函数定义梯度。其过程与单变量非常相似。首先需要一个初始位置,但现在这个初始位置包含两个坐标:x0y0。在单变量中我们绘制切线(导数),而在双变量中,我们有两个切线。

其中一个切线非常陡峭。我们将在地板上绘制一个向量,其方向是导数增加的方向。由于它很陡,所以这是一个大向量。接着,我们对梯度的另一个分量做同样的事情,得到一个较小的向量,因为第二个梯度比前一个平坦得多。

现在,我们将这两个向量相加(或将两个坐标组合成一个向量),结果就是梯度。梯度有一个有趣的特性:它指向最速上升方向。如果你想迈出一小步并到达尽可能热的地方,你应该沿着梯度的方向走。

但我们不想变热,我们想变冷。因此,我们沿着负梯度的方向前进。负梯度的方向是:如果你迈出一小步,它能将你带到在一步之内能达到的最冷的地方。我们将沿着负梯度的方向迈出这一步,并且是一小步,所以再次乘以学习率。

于是我们得到新点 (x1, y1)

(x1, y1) = (x0, y0) - α * ∇f(x0, y0)

其中 α 是学习率,∇f 是梯度。这个新点是一个更好的点。

请注意,这与单变量梯度下降完全相同,只是我们不再使用导数,而是使用梯度。

算法应用示例

现在让我们看看这个算法如何应用于之前的例子。

温度函数的公式是:

T(x, y) = 85 - (1/90) * x² * (x-6) * y² * (y-6)

让我们运行几步梯度下降算法。我们从初始点 (0.5, 0.6) 开始。

我们需要计算梯度,梯度是一个向量,包含对 x 的偏导数和对 y 的偏导数。我们之前已经计算过这些导数:

  • x 的偏导数:∂T/∂x = ... (根据前文公式)
  • y 的偏导数:∂T/∂y = ... (根据前文公式)

要找到梯度,只需将它们组合成一个向量 ∇T = [∂T/∂x, ∂T/∂y]

现在,将 x = 0.5y = 0.6 代入这个向量,得到该点的梯度。

然后,简单地沿着负梯度方向(乘以学习率)前进一步。设学习率 α = 0.05,我们得到一个新点 (0.5057, 0.6047)。你沿着那个方向移动,现在离最小点更近了一点。

现在让我们再次运行这个算法。我们计算新点的梯度,并沿着负梯度方向移动,得到另一个新点。

只需重复这个过程很多很多次,你就会非常快、非常接近最小值点。

算法步骤总结

简而言之,梯度下降算法与单变量版本非常相似。对于一个双变量函数 f(x, y),目标是找到最小值。

以下是核心步骤:

  1. 初始化:定义一个学习率 α,并选择一个起始点 (x0, y0)
  2. 迭代更新:使用以下公式更新当前位置:
    (x_k, y_k) = (x_{k-1}, y_{k-1}) - α * ∇f(x_{k-1}, y_{k-1})
    
    其中 ∇f 是函数在 (x_{k-1}, y_{k-1}) 点的梯度。
  3. 重复:重复步骤2,直到足够接近真正的最小值。通常,当你移动得非常非常缓慢,或者基本不再移动时,就说明已经接近最小值了。

算法的局限性

与单变量梯度下降一样,双变量(或多变量)梯度下降也存在相同的缺点。

例如,你可能想要到达全局最小值,但可能会意外地陷入这些局部最小值中。

至少以高概率克服这个问题的方法是:从非常不同的地方开始多次运行算法。注意,在下图中,我们从三个不同的地方开始,每个都引导我们到达了一个不同的局部最小值,其中一个实际上到达了全局最小值。

但就像单变量一样,无法绝对确定你是否到达了全局最小值。不过,如果你多次运行它,很可能你得到的最优解是相当不错的。

课程总结

本节课中,我们一起学习了如何将梯度下降算法扩展到双变量函数。我们定义了梯度向量,它指明了函数的最速上升方向,并通过向负梯度方向移动来寻找最小值。我们详细介绍了算法的步骤,并通过一个温度函数的例子演示了其应用过程。最后,我们讨论了算法可能陷入局部最小值的局限性,以及通过多次从不同起点运行来寻找更好解的常用策略。

041:梯度下降优化-最小二乘法

在本节课中,我们将学习如何使用梯度下降法来优化线性回归问题中的最小二乘成本函数。我们将通过一个具体的电力线连接成本问题,演示梯度下降如何高效地找到最优参数。

概述

在前面的课程中,我们通过解析方法(如正规方程)解决了线性回归问题。然而,当变量增多或问题变得复杂时,解析方法可能变得繁琐。本节将介绍梯度下降法,这是一种迭代优化算法,能够更高效地找到使成本函数最小化的参数。

问题回顾:电力线连接成本

我们曾试图找到一条最佳拟合线,以最小化连接到电力线的成本。该问题归结为最小化以下成本函数,即找到使 E(M, B) 最小的最优参数 MB

成本函数公式:

E(M, B) = Σ (y_i - (M*x_i + B))^2

通过解析方法,我们找到了最优解:M = 1/2B = 7/3,对应的最小成本值为 4.167

梯度下降法原理

梯度下降法的核心思想是,通过迭代地调整参数,沿着成本函数梯度的反方向(即下降最快的方向)移动,从而逐步逼近最小值点。

梯度下降更新公式:

M_{k+1} = M_k - α * ∂E/∂M |_{M_k, B_k}
B_{k+1} = B_k - α * ∂E/∂B |_{M_k, B_k}

其中:

  • M_k, B_k 是第 k 次迭代的参数值。
  • α 是学习率,控制每次更新的步长。
  • ∂E/∂M∂E/∂B 是成本函数 E 关于 MB 的偏导数(即梯度)。

梯度下降步骤详解

以下是使用梯度下降法求解最优参数的具体步骤。

1. 初始化参数

首先,我们需要为参数 MB 选择初始值。这通常是随机选择的,例如 M_0B_0

2. 计算梯度

在每次迭代中,计算成本函数在当前参数 (M_k, B_k) 处的梯度。梯度指明了成本函数增长最快的方向,因此我们取其反方向进行下降。

3. 更新参数

使用梯度下降更新公式,根据当前梯度和学习率 α 更新参数 MB

4. 迭代直至收敛

重复步骤2和步骤3,直到参数的变化非常小(即收敛),或者达到预设的迭代次数。

梯度下降的优势

与解析方法相比,梯度下降法具有以下优势:

  • 高效性:对于大规模数据集或复杂模型,梯度下降通常计算更快。
  • 灵活性:可以应用于各种不同类型的模型和成本函数。
  • 易于实现:算法步骤清晰,易于编程实现。

总结

本节课中,我们一起学习了如何使用梯度下降法来优化线性回归中的最小二乘成本函数。我们回顾了电力线连接成本问题,并详细介绍了梯度下降的原理、更新公式及实施步骤。通过梯度下降,我们可以高效地找到使成本函数最小化的最优参数,即使对于复杂问题也是如此。

042:梯度下降优化-多观测值最小二乘法

概述

在本节课中,我们将学习如何使用梯度下降算法来优化线性回归模型。我们将从一个简单的例子开始,理解成本函数(误差)与模型参数(斜率和截距)之间的关系,然后将其推广到处理多个观测数据点的场景。最后,我们将看到一个关于广告预算预测的实际应用案例。


从拟合线到成本函数

上一节我们介绍了线性回归的基本概念。本节中我们来看看如何量化一条拟合线的“好坏”。

假设我们有三个数据点,以及一条试图紧密拟合它们的直线,其方程为 y = Mx + B。右侧的图表描绘了这条拟合线的“成本”。

成本是如何计算的呢?我们计算每个数据点到拟合线的垂直距离(即误差),然后取这些距离的平方和。这个平方和就是该拟合线的成本。在右侧的图表中,我们在垂直轴上绘制这个“平方损失”。

这个图表的绘制方式如下:我们用地面上的两个轴分别代表斜率 M 和截距 B。对于每一对 (M, B) 参数所确定的直线,我们计算其对应的成本函数值,并将这个值作为高度绘制在 (M, B) 点的正上方。

因此,图中每一个点都对应左侧的一种直线拟合情况。拟合得好的直线(误差小),其在成本函数图上的点就低;拟合得差的直线(误差大),其对应的点就高。

梯度下降的目标,就是在这个成本函数图上,找到最低的那个点。当我们通过梯度下降调整 MB,向最低点移动时,左侧的拟合直线也会随之变得越来越好。这就是使用梯度下降解决线性回归问题的核心思想。


实际应用:广告预算预测

理解了基本原理后,我们来看一个实际例子。假设你在一个广告公司工作,拥有电视广告预算数据,并且知道对应的销售额。通常,增加预算会提升销售额,减少预算则会降低销售额。你的目标是建立一个模型,能够根据给定的广告预算来预测销售额。

你首先会查看历史数据,并尝试使用的第一个工具就是线性回归。换句话说,就是找到一条直线 y = Mx + B,使得当你输入预算 X 时,能得到一个与真实销售额 Y 非常接近的预测值。


多观测值的梯度下降

在实际应用中,我们通常拥有大量数据点,而不仅仅是三个。现在,让我们将梯度下降算法推广到处理 n 个观测值的情况。

假设电视预算在横轴,销售额在纵轴,我们有一系列数据点:(x1, y1), (x2, y2), ..., (xn, yn)

首先,我们需要定义成本函数。让我们先看第一个点 (x1, y1)。该点的损失是多少?它是该点到拟合线的垂直距离的平方。

这个距离是多少?拟合线上横坐标为 x1 的点的纵坐标是 M*x1 + B。因此,垂直距离为 y1 - (M*x1 + B)。由于之后要平方,所以也可以写成 (M*x1 + B) - y1,结果一样。

平方后,我们就得到了在该点的损失。

现在,我们需要计算所有点的总损失。通常,我们取所有点损失的平均值。此外,公式中常包含一个除以2的因子,这是为了后续求导时计算方便(平方项的导数会产生因子2,与分母的2约掉)。不过,是否除以2并不影响成本函数最小值的位置。

因此,我们的总成本函数 L(M, B) 定义如下:

L(M, B) = (1/n) * Σ [ (M*xi + B - yi)^2 ] (有时前面会有 1/(2n))


梯度下降算法流程

定义了成本函数后,梯度下降算法的正式流程如下:

以下是梯度下降算法的具体步骤:

  1. 初始化:随机选择一组初始参数 (M0, B0)。这对应一条可能拟合得很差的随机直线。
  2. 计算梯度:在当前位置 (M0, B0),计算成本函数 L 关于 MB 的偏导数(即梯度)。梯度指明了成本函数上升最快的方向,因此我们取其反方向。
  3. 更新参数:沿着梯度的反方向,以“学习率”(一个小的正数,记为 α)为步长,更新参数。
    • 新斜率:M1 = M0 - α * (∂L/∂M)
    • 新截距:B1 = B0 - α * (∂L/∂B)
      这得到了一组稍好的参数 (M1, B1),对应一条拟合稍好的直线。
  4. 迭代:将新的参数 (M1, B1) 作为起点,重复步骤2和3。
    • 计算 (M1, B1) 处的梯度。
    • 更新得到 (M2, B2)
  5. 终止:重复这个过程很多次(比如 N 次),直到参数变化非常小,或者成本函数值不再显著下降。此时,我们便得到了一个对数据拟合良好的线性模型。

总结

本节课中我们一起学习了梯度下降算法在多观测值线性回归中的应用。我们首先通过可视化理解了成本函数与模型参数的关系,然后定义了适用于多个数据点的均方误差成本函数。最后,我们详细阐述了梯度下降算法的迭代步骤:初始化参数、计算梯度、沿负梯度方向更新参数,并重复此过程直至收敛。通过这个流程,我们可以从任意初始直线出发,自动找到最能拟合数据的最佳直线。

044:感知机与回归 🧠

在本节课中,我们将学习神经网络的基本单元——感知机。你将了解到,线性回归实际上可以表示为一个感知机。我们将从一个经典的回归问题——预测房价入手,逐步引入感知机的概念,并探讨其数学原理。

动机:房价预测问题 🏠

我们从一个简单的线性回归问题开始:根据房屋面积预测房价。假设我们有三套房屋的数据:

  • 第一套:面积1000平方英尺,价格20,000美元。
  • 第二套:面积2000平方英尺,价格30,000美元。
  • 第三套:面积3000平方英尺,价格50,000。

我们将这些数据点绘制在图表上,目标是找到一条最佳拟合直线,用于根据房屋面积预测其价格。

上一节我们介绍了单一特征(面积)的预测问题。本节中我们来看看,如果引入第二个特征会怎样。

引入更多特征

现在,我们为每套房屋增加一个特征:房间数量。假设三套房屋的房间数分别为2、4、7。问题变得复杂了,我们需要同时考虑面积和房间数对房价的影响。

那么,我们如何构建并训练一个能够预测房价的模型呢?更进一步,如果我们有10个、100个甚至更多特征呢?这时,感知机的概念就派上用场了。

感知机:神经网络的基本单元

这个回归问题可以用一个单一的感知机来建模。感知机接收一些输入(特征),并输出我们想要预测的未知值。

首先,我们从数学角度来探索感知机。输入是 x1x2,分别代表房屋面积和房间数量。你可以想象,如果有100个输入,就会有100个节点 x1x100

输入进入一个求和函数,该函数的输出是预测值 ŷ,即我们预测的房屋价格。一个好的模型能给出相当准确的预测,我们的目标是构建最佳模型。

以下是求和步骤中发生的事:

  • 每个特征 x1x2 都会乘以一个对应的权重(w1w2),以确定该特征对输出的重要性。例如,如果房屋面积对预测价格远比房间数量重要,那么 w1 的值就会比 w2 大。
  • 我们将权重和输入相乘后相加:w1*x1 + w2*x2
  • 最后,我们再加上一个偏置项 b

因此,这个模型的输出就是:
ŷ = w1*x1 + w2*x2 + b

在这个模型中,我们没有使用激活函数(稍后会介绍激活函数)。我们的目标是找到最优的权重 w1w2 和偏置 b,使得当我们输入 x1x2 时,预测值 ŷ 在整个数据集上最接近真实房价。

如何找到最优权重?

那么,我们如何找到这些完美的权重呢?核心思想是最小化某种误差。误差衡量的是预测值与真实房价的差距。最小化这个误差就是我们需要做的。

为此,我们引入一个称为损失函数的概念。损失函数是一个小函数,用于告诉我们预测得有多好(或多差)。这将是下一节视频的内容。

045:感知机回归损失函数

概述

在本节课中,我们将学习如何评估和优化一个简单的线性回归模型。我们将定义一个称为“损失函数”的指标,用于量化模型预测的准确性,并理解如何通过最小化这个损失函数来找到最佳的模型参数。

模型预测与误差

在上一节视频中,我们看到了一个包含房屋面积和价格的数据集。我们的目标是找到一条最贴合这些数据点的直线,这条直线就是我们的预测模型。

首先,让我们看看模型预测得如何。模型会为每个数据点输出一个预测值。例如,对于第一个房屋,模型预测价格为15000;第二个房屋预测为30000;第三个预测为45000。从图中看,这个模型似乎不错,它正确预测了第二个房屋的价格,并且对第一个和第三个房屋的预测也较为接近。

为了量化预测的接近程度,我们需要计算预测值与实际值之间的差异,我们称之为“误差”。在图中,这些误差用垂直的虚线表示。显然,虚线越短,说明预测值越接近真实值,模型就越好。

定义损失函数

然而,直接使用 y - y_hat 作为误差度量存在一个问题:如果数据点在直线上方,误差为正;如果在直线下方,则为负。正负误差都表示预测不准,但如果简单相加,正负可能抵消,导致总误差看起来很小,这会产生误导。

为了解决这个问题,我们采用误差的平方 (y - y_hat)^2 作为度量。在机器学习中,我们通常还会乘以 1/2,这主要是为了后续计算梯度时的便利性,因为对平方项求导会产生一个因子 2,乘以 1/2 可以将其抵消。乘以任何常数都不会改变最小化问题的本质。

因此,我们定义损失函数 L。对于单个数据点,其损失为:
L(y, y_hat) = (1/2) * (y - y_hat)^2

模型参数与优化目标

我们的预测函数(模型)由公式 y_hat = w1 * x + w2 * x + b 给出(注:此处原文可能为笔误,通常线性回归为 y_hat = w * x + b,但为保留原意,未作修改)。其中 w1w2b 是模型参数。

我们的目标现在是找到一组 w1w2b 的值,使得所有数据点的总损失 L 最小。最小化损失函数意味着我们找到了对当前数据集而言“最佳”的模型。

使用梯度下降进行优化

在之前的课程中,你已经学习了包括梯度下降在内的函数最小化方法。可以想象,接下来我们将使用梯度下降法来最小化损失函数 L

通过梯度下降,我们可以迭代地调整参数 w1w2b,逐步降低损失,最终找到那组能使模型预测最准确的参数值。

总结

本节课我们一起学习了回归模型中的核心概念——损失函数。我们了解到,损失函数 L = (1/2)*(y - y_hat)^2 用于衡量模型预测的误差。我们的核心目标是通过优化算法(如梯度下降)最小化这个损失,从而找到最佳的模型参数 w1w2b,构建出最贴合数据的预测模型。

046:感知机回归与梯度下降

概述

在本节课中,我们将学习如何为感知机回归模型找到最优的权重和偏置参数。具体来说,我们将使用梯度下降算法来最小化模型的损失函数,从而得到一个预测误差最小的模型。


问题定义

上一节我们介绍了感知机回归模型及其损失函数。现在我们知道,问题的核心是找到一个具有最佳权重 W1W2 和偏置 B 的预测函数,使得损失函数 L(Y, Ŷ) 的值最小。

换句话说,我们希望找到那个犯错最少的、最优的模型。

梯度下降法

那么,我们如何找到这些最优值呢?我们将使用梯度下降法来最小化损失函数 L

我们将通过梯度下降来寻找最佳的 W1W2B。回顾一下,梯度下降公式通过以下方式更新 W1 以最小化 L

公式:
W1_new = W1_old - α * (∂L/∂W1)

其中 α 是学习率。类似地,更新 W2B 的公式如下:

公式:
W2_new = W2_old - α * (∂L/∂W2)
B_new = B_old - α * (∂L/∂B)

这意味着,我们从 W1W2B 的某个初始值开始,然后需要做的就是计算这三个梯度。通过更新参数,我们可以得到新的、更好的 W1W2B,从而得到一个损失函数更小、性能更好的模型。如果这个过程重复足够多次,最终我们将获得具有非常低损失函数的、相当不错的权重,这也就意味着一个优秀的模型。

计算偏导数

接下来,我将讲解如何计算这些导数。这里会大量用到链式法则。为了清晰起见,我们在左侧列出相关函数作为参考,在右侧计算偏导数。

首先,计算 ∂L/∂B。观察 L,它依赖于变量 Ŷ。因此,我们需要先计算 ∂L/∂Ŷ,然后 Ŷ 又依赖于 B,所以再计算 ∂Ŷ/∂B。这正是我们上周学习的链式法则。

对于 ∂L/∂W1∂L/∂W2,情况是类似的:

  • ∂L/∂W1 = (∂L/∂Ŷ) * (∂Ŷ/∂W1)
  • ∂L/∂W2 = (∂L/∂Ŷ) * (∂Ŷ/∂W2)

现在我们知道需要做什么了:计算这四个导数。请注意,∂L/∂Ŷ 在三个表达式中重复出现,所以我们只需要计算它一次,然后再分别计算 ŶW1W2B 的三个偏导数。这比直接代入整个公式计算要简单得多,相当于把问题分解成了更易于处理的子问题。

让我们分别计算每一个。

1. 计算 ∂L/∂Ŷ

这是关于 Ŷ 的导数。我们使用链式法则。损失函数 L = 1/2 * (Y - Ŷ)^2。对平方项求导得到 (Y - Ŷ),但还需要乘以内部项 (Y - Ŷ)Ŷ 的导数,即 -1

公式:
∂L/∂Ŷ = 1/2 * 2 * (Y - Ŷ) * (-1) = -(Y - Ŷ)

我们可以将其写为 -Y + Ŷ,但保持 -(Y - Ŷ) 的形式会使后续的数学计算更简便。

2. 计算 ∂Ŷ/∂B、∂Ŷ/∂W1、∂Ŷ/∂W2

这三个导数计算起来要容易得多。

  • ∂Ŷ/∂B:预测函数为 Ŷ = W1*X1 + W2*X2 + BB 的系数是 1。
    公式: ∂Ŷ/∂B = 1

  • ∂Ŷ/∂W1:在 Ŷ 中,W1 的系数是 X1
    公式: ∂Ŷ/∂W1 = X1

  • ∂Ŷ/∂W2:在 Ŷ 中,W2 的系数是 X2
    公式: ∂Ŷ/∂W2 = X2

3. 组合得到最终梯度

现在我们有了这些部分导数,让我们将它们代回链式法则中。右侧列出了我们已经计算好的结果作为参考。

  • ∂L/∂B = (∂L/∂Ŷ) * (∂Ŷ/∂B) = -(Y - Ŷ) * 1 = -(Y - Ŷ)
  • ∂L/∂W1 = (∂L/∂Ŷ) * (∂Ŷ/∂W1) = -(Y - Ŷ) * X1
  • ∂L/∂W2 = (∂L/∂Ŷ) * (∂Ŷ/∂W2) = -(Y - Ŷ) * X2

这些就是我们的三个梯度。

应用梯度下降更新规则

现在让我们回到主要目标。回顾一下,主要目标是找到能给出预测误差最小的最优 W1W2B 值。我们将使用上周开发的工具——梯度下降法。

梯度下降使用以下更新公式来获得新的参数。我们已经计算出了所需的梯度:

更新公式:
W1_new = W1_old - α * [ -(Y - Ŷ) * X1 ]
W2_new = W2_old - α * [ -(Y - Ŷ) * X2 ]
B_new = B_old - α * [ -(Y - Ŷ) ]

通常,我们会将负号吸收到括号内,使公式更简洁:

简化后的更新公式:
W1_new = W1_old + α * (Y - Ŷ) * X1
W2_new = W2_old + α * (Y - Ŷ) * X2
B_new = B_old + α * (Y - Ŷ)

如果我们将这个更新过程重复很多次(对数据集中的多个样本或多次迭代),就会得到一组非常好的权重 W1W2 和偏置 B,它们将具有非常小的误差,从而构成一个非常优秀的模型。


总结

本节课中,我们一起学习了如何为简单的感知机回归模型实施梯度下降。

  1. 我们明确了目标:通过最小化均方误差损失函数来优化模型参数。
  2. 我们回顾了梯度下降法的核心更新公式。
  3. 我们详细推导了损失函数 L 关于每个参数(W1W2B)的偏导数,关键步骤是应用链式法则。
  4. 最后,我们将计算得到的梯度代入梯度下降更新规则,得到了可用于迭代优化模型参数的具体公式。

通过不断重复“计算梯度 -> 更新参数”这一过程,模型能够逐步学习并逼近最优解。

047:感知机分类

概述

在本节课中,我们将学习如何将感知机应用于分类问题,特别是二分类问题。我们将通过一个外星语言情感分析的例子,了解如何修改感知机的激活函数,使其能够预测句子是“开心”还是“悲伤”。


从回归到分类

上一节我们介绍了如何使用感知机和梯度下降解决回归问题。本节中我们来看看分类问题。分类与回归非常相似,只涉及一个小的改动。

问题引入:外星语言情感分析

假设你遇到了一个外星文明,并记录了他们的四句话。他们的语言只有两个词:“act”和“beep”。你的目标是判断每句话表达的情绪是“开心”还是“悲伤”。

以下是记录的数据:

  • 第一句:开心,包含3个“act”,0个“beep”。
  • 第二句:悲伤,包含0个“act”,2个“beep”。
  • 第三句:悲伤,包含1个“act”,3个“beep”。
  • 第四句:开心,包含2个“act”,1个“beep”。

为了用模型处理,我们将句子转化为数字特征。以下是转换后的数据集:

句子 “act”数量 (x1) “beep”数量 (x2) 情绪 (y)
1 3 0 开心 (1)
2 0 2 悲伤 (0)
3 1 3 悲伤 (0)
4 2 1 开心 (1)

数据可视化

首先,我们将数据点绘制在坐标系中。如下图所示,开心的点(绿色)倾向于集中在右下角,而悲伤的点(红色)集中在左上角。我们的模型目标就是找到一条线来区分这两个区域。

构建分类感知机

现在,我们将其构建为一个感知机模型。输入是特征x1(“act”数量)和x2(“beep”数量)。模型的核心是一个节点(图中红框部分),它将计算出一个值,用于判断句子情绪。

这个节点内部的工作流程与回归感知机类似,但有一个关键的增加。以下是其内部结构:

  1. 加权求和:首先,对输入特征进行加权求和,并加上一个偏置项。公式如下:
    z = (x1 * w1) + (x2 * w2) + b
    其中,w1w2是权重,b是偏置。权重决定了每个特征的重要性。例如,如果“act”与开心高度相关,w1会是一个较大的正数;如果“beep”与悲伤相关,w2可能是一个负数。

  2. 激活函数:求和结果z是一个连续的实数,可能非常大或非常小。但我们的输出需要是0(悲伤)或1(开心),或者介于两者之间的概率值。因此,我们需要一个函数将整个实数轴“压缩”到(0,1)区间。这个函数就是Sigmoid激活函数

    Sigmoid函数的公式是:
    σ(z) = 1 / (1 + e^{-z})
    这个函数将任何输入z映射为一个0到1之间的值。输出可以解释为模型认为句子是“开心”的概率。

激活函数的作用

Sigmoid函数是分类感知机的核心组件。它将加权求和z的结果转化为我们需要的概率输出。

  • 如果σ(z)接近1,模型认为句子很可能是开心的。
  • 如果σ(z)接近0,模型认为句子很可能是悲伤的。
  • 如果σ(z)约为0.5,模型则不太确定。

下图展示了包含Sigmoid激活函数的完整分类感知机结构:

总结

本节课中,我们一起学习了如何将感知机用于二分类任务。关键步骤是将回归模型中的线性输出,通过一个Sigmoid激活函数,转换为表示概率的0到1之间的值。我们通过一个外星语言情感分析的例子,直观地理解了数据分布、模型目标以及分类感知机的基本架构。在下一节中,我们将更深入地探讨Sigmoid函数的特性。

048:感知机分类 - Sigmoid函数及其导数

概述

在本节课中,我们将学习Sigmoid函数及其导数。Sigmoid函数在机器学习中极为重要,因为它能将整个实数轴压缩到区间(0,1)内,这正好符合许多机器学习模型对输出的要求。我们还将详细推导其导数,并解释为什么这个简洁的导数形式在机器学习中非常有用。


Sigmoid函数回顾

上一节我们介绍了Sigmoid函数及其在机器学习中的重要性。本节中,我们来看看它的具体形式和图像。

Sigmoid函数的公式为:

公式: σ(z) = 1 / (1 + e^(-z))

其图像如下所示。输入(水平轴)是整个实数轴,而输出(垂直轴)被压缩在区间(0,1)内。

该函数在0和1处有渐近线,这意味着它永远不会真正触及0或1,但任何实数输入都会产生一个严格介于0和1之间的输出。

以下是几个关键点的示例:

  • σ(0) = 1 / (1 + e^0) = 1 / (1 + 1) = 1/2
  • 当输入为一个非常大的正数(如1000)时,σ(1000) 的值非常接近1。
  • 当输入为一个非常大的负数(如-1000)时,σ(-1000) 的值非常接近0。

Sigmoid函数的导数

除了将输入映射到(0,1)区间外,Sigmoid函数还有一个非常优良的特性:它的导数形式非常简单。在机器学习中,我们会频繁使用导数进行优化(如梯度下降),因此一个易于求导的函数至关重要。

现在,让我们详细推导Sigmoid函数的导数。

我们将Sigmoid函数写作:
σ(z) = (1 + e^(-z))^(-1)

接下来,我们使用链式法则求导:

  1. 首先,对 (1 + e^(-z))^(-1) 求导,得到 -1 * (1 + e^(-z))^(-2)
  2. 然后,乘以内部函数 (1 + e^(-z)) 的导数。

具体步骤如下:

求导过程:

dσ(z)/dz = d/dz [(1 + e^(-z))^(-1)]
         = -1 * (1 + e^(-z))^(-2) * d/dz (1 + e^(-z))
         = - (1 + e^(-z))^(-2) * (0 + e^(-z) * (-1))
         = - (1 + e^(-z))^(-2) * (-e^(-z))
         = e^(-z) / (1 + e^(-z))^2

推导至此,我们可以通过一个巧妙的代数变换得到更简洁的形式。我们在分子上同时加1和减1:

dσ(z)/dz = e^(-z) / (1 + e^(-z))^2
         = [ (1 + e^(-z)) - 1 ] / (1 + e^(-z))^2
         = (1 + e^(-z))/(1 + e^(-z))^2 - 1/(1 + e^(-z))^2
         = 1/(1 + e^(-z)) - [1/(1 + e^(-z))]^2

现在,提取公因式 1/(1 + e^(-z))

dσ(z)/dz = 1/(1 + e^(-z)) * [ 1 - 1/(1 + e^(-z)) ]

请注意,1/(1 + e^(-z)) 正是Sigmoid函数 σ(z) 本身。因此,上式可以写为:

最终导数公式: dσ(z)/dz = σ(z) * (1 - σ(z))

这个结果非常优美:Sigmoid函数的导数等于Sigmoid函数本身乘以 (1 - Sigmoid)


总结

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

  1. Sigmoid函数:其公式为 σ(z) = 1 / (1 + e^(-z)),作用是将任意实数输入映射到(0,1)区间,非常适合表示概率。
  2. Sigmoid函数的导数:通过详细的链式法则推导,我们得到了极其简洁的导数公式 σ‘(z) = σ(z) * (1 - σ(z))

Sigmoid函数因其良好的数学性质(输出范围固定、导数易于计算)而在机器学习,尤其是逻辑回归和早期神经网络中扮演了重要角色。理解其导数形式对于后续学习反向传播等算法至关重要。

049:感知机分类梯度下降

在本节课中,我们将学习如何将梯度下降算法应用于感知机分类模型。我们将回顾感知机的工作原理,并引入一个适用于分类问题的损失函数——对数损失函数。最后,我们将概述如何使用梯度下降来更新模型参数,以最小化这个损失。

感知机预测回顾

上一节我们介绍了Sigmoid函数。本节中我们来看看如何将其应用于感知机模型。

以一个句子“act beep beep beep”为例。其中单词“act”出现1次,因此特征x1 = 1;单词“Bep”出现3次,因此特征x2 = 3。

假设在算法训练过程中,我们当前的权重为:w1 = 4.5, w2 = 1.5,偏置项b = 2。

感知机的工作流程如下:它接收输入,将其与权重相乘并求和,然后对求和结果应用Sigmoid函数,最终得到预测值ŷ。

模型的目标是使用ŷ和一个损失函数来计算ŷ与真实值y之间的差距,并利用这个差距来更新权重。

假设这个句子的真实标签y = 0(表示句子是悲伤的)。我们将利用这个信息来更新w1、w2和b。

分类问题的损失函数

我们需要衡量ŷ与y之间的误差。你可能会想到之前见过的误差函数,例如ŷ - y、(ŷ - y)² 或 ½(ŷ - y)²。这些函数都有效。

但对于分类问题,效果最好的函数称为对数损失

接下来,我将展示如何计算对数损失。

我们将对数损失函数记为L(y, ŷ)。我们将利用这个误差来更新三个权重参数,以降低误差。

让我们回顾一下:我们有一个预测函数ŷ,它是对感知机求和结果应用Sigmoid激活函数得到的。我们还有一个损失函数,即对数损失。

对数损失函数的来源与特性

这个对数损失函数你之前已经见过。还记得上一节我们尝试寻找理想硬币来拟合数据集的例子吗?你需要抛一枚硬币10次,得到7次正面和3次反面,然后寻找最适合的硬币。那个完美硬币是通过最小化一个包含对数的损失函数找到的。正是这个函数。

实际上,这就是当前问题的损失函数。你可以观察到:

  • 如果y = 0,当ŷ较小时,函数值较小;当ŷ较大时,函数值较大。
  • 如果y = 1,则情况相反:当ŷ接近1时,函数值较小;当ŷ接近0时,函数值较大。

换句话说,当y和ŷ相差很大时,L(y, ŷ)是一个大数;当它们彼此接近时,它是一个小数。

使用对数损失函数的原因有很多:一是其数学性质非常优美,二是这个函数具有概率特性。其概率特性源于它与硬币例子的同源性。分类问题具有高度的概率性,因为你可以将输出ŷ视为一个概率。例如,如果ŷ是80%或0.8,那就意味着模型认为该句子有80%的概率是快乐的。

梯度下降更新权重

让我们回到主要目标:找到完美的权重w1、w2和偏置b,使我们的预测ŷ具有最小的对数损失L(y, ŷ)。

为了实现这个目标,我们需要回到梯度下降法。

以下是梯度下降更新权重的公式:

  • w1 的更新公式为:w1 := w1 - α * (∂L / ∂w1)
  • w2 的更新公式为:w2 := w2 - α * (∂L / ∂w2)
  • 偏置b 的更新公式为:b := b - α * (∂L / ∂b)

其中,α是学习率。

为了启动算法,我们只需为权重和偏置设置一些初始值,然后开始下降过程。

以下是算法步骤:

  1. 初始化随机变量(权重和偏置)。
  2. 计算偏导数。
  3. 更新参数。

在下一个视频中,我将展示如何计算这些偏导数。你将看到,Sigmoid函数和对数损失函数共同作用,能得到非常简洁优美的导数形式。

总结

本节课中我们一起学习了感知机分类模型中的梯度下降。我们回顾了感知机如何利用Sigmoid函数进行预测,并引入了专门用于分类问题的对数损失函数来度量误差。最后,我们概述了使用梯度下降法、通过计算损失函数对各个参数的偏导数来迭代更新权重和偏置的完整流程,为下一步具体计算偏导数奠定了基础。

051:神经网络分类 03 01 08

概述

在本节课中,我们将学习神经网络的基本概念。我们将从单个感知器出发,了解其局限性,然后构建一个由多个感知器组成的简单神经网络。我们将详细讲解这个神经网络的数学结构,包括输入层、隐藏层和输出层,并介绍用于分类问题的损失函数。

从感知器到神经网络

上一节我们介绍了用于情感分析的二元分类感知器模型。该模型通过线性组合输入特征与权重,再经过Sigmoid激活函数得到预测值 y_hat。然而,这类模型相对简单,只能构建线性的决策边界(例如一条直线)。现实问题(如语言理解)往往需要更复杂的非线性边界。

为了处理更复杂的问题,我们不再使用单个感知器,而是将多个感知器组合在一起,这就构成了神经网络。

构建一个简单的神经网络

以下是构建一个两层神经网络的方法。我们首先创建两个感知器(红色和绿色),然后将它们的输出作为输入,传递给第三个感知器(紫色)。

第一层:隐藏层

我们有两个感知器构成隐藏层。

  • 红色感知器

    • 输入:特征 x1, x2
    • 权重:w11, w21
    • 偏置:b1
    • 计算过程:
      1. 线性组合:z1 = x1*w11 + x2*w21 + b1
      2. 激活函数:a1 = sigmoid(z1)
    • 输出:a1
  • 绿色感知器

    • 输入:特征 x1, x2
    • 权重:w12, w22
    • 偏置:b2
    • 计算过程:
      1. 线性组合:z2 = x1*w12 + x2*w22 + b2
      2. 激活函数:a2 = sigmoid(z2)
    • 输出:a2

第二层:输出层

隐藏层的输出 a1a2 将作为输入传递给输出层的紫色感知器。

  • 紫色感知器(输出层)
    • 输入:a1, a2
    • 权重:w1, w2
    • 偏置:b
    • 计算过程:
      1. 线性组合:z = a1*w1 + a2*w2 + b
      2. 激活函数:y_hat = sigmoid(z)
    • 输出:y_hat(最终的预测值)

这个结构构成了一个深度为2的神经网络,包含一个输入层、一个隐藏层和一个输出层。更复杂的网络可以包含更多的层和节点。

神经网络的数学表达与损失函数

本节中我们来看看整个网络的计算流程和如何衡量其性能。

以下是整个神经网络的计算总结:

a1 = sigmoid(x1*w11 + x2*w21 + b1)
a2 = sigmoid(x1*w12 + x2*w22 + b2)
y_hat = sigmoid(a1*w1 + a2*w2 + b)

由于我们处理的是分类问题,需要定义一个损失函数来衡量预测值 y_hat 与真实标签 y 之间的误差。我们使用之前介绍过的对数损失(Log Loss)函数:

损失函数公式
L(y, y_hat) = -[y * log(y_hat) + (1 - y) * log(1 - y_hat)]

其中,y 是训练数据中的真实目标值(0或1),y_hat 是神经网络的预测值。

训练神经网络

现在我们已经了解了神经网络的工作原理,接下来将探讨如何训练它。训练的目标是通过调整网络中的所有权重(w11, w21, b1, w12, w22, b2, w1, w2, b)和偏置,使损失函数 L 的值最小化。

我们将使用梯度下降法,这与训练单个感知器类似。关键区别在于,现在我们需要计算损失函数相对于每一个权重和偏置的导数(梯度)。在后续课程中,我们将详细讲解如何通过反向传播算法高效地计算这些梯度。

总结

本节课中我们一起学习了神经网络的基础。我们从单个感知器的局限性出发,构建了一个包含输入层、隐藏层和输出层的两层神经网络,并描述了其前向传播的计算过程。我们还回顾了用于分类问题的对数损失函数。最后,我们指出了训练神经网络的核心是使用梯度下降法优化所有权重和偏置,这需要计算大量的梯度,为下一节学习反向传播算法做好了准备。

054:牛顿法

在本节课中,我们将学习一种替代梯度下降的优化方法——牛顿法。牛顿法在原理上非常快速且强大。我们将从牛顿法的基本概念开始,逐步了解它如何用于寻找函数的零点,并最终将其应用于优化问题。

牛顿法原理:寻找函数零点 🔍

牛顿法最初用于寻找函数的零点。让我们从一个简单的单变量函数开始,看看它是如何工作的。

假设我们有一个函数,目标是找到它的零点,即函数值 f(x) = 0 的点。牛顿法通过迭代逼近这个点,其过程类似于梯度下降。

以下是牛顿法寻找零点的步骤:

  1. 从一个随机初始点 x0 开始。
  2. 计算该点处的函数值 f(x0) 和导数值 f'(x0)
  3. 画出该点的切线,并找到切线与x轴的交点,这个交点就是新的近似点 x1
  4. 重复步骤2和3,用 x1 替代 x0,得到 x2,依此类推。

通过几次迭代,我们就能非常接近函数的真实零点。

数学推导:迭代公式 📐

现在,让我们用数学公式来描述上述过程。

在第一次迭代中,初始点为 x0。该点切线的斜率是 f'(x0)。根据“斜率 = 上升 / 前进”的几何关系,我们可以得到:

公式: f'(x0) = f(x0) / (x0 - x1)

对这个公式进行移项,我们可以解出 x1

公式: x1 = x0 - f(x0) / f'(x0)

这就是牛顿法的核心迭代公式。将其推广到第 k 次迭代,公式变为:

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

其中,x_k 是第 k 次迭代的点,x_{k+1} 是第 k+1 次迭代的点。只要我们知道当前点的函数值和导数值,就能计算出下一个更接近零点的点。

从寻零到优化:寻找函数最小值 🎯

上一节我们介绍了如何用牛顿法寻找函数零点。本节中我们来看看如何将它应用于优化问题,即寻找函数的最小值。

关键在于一个基本原理:一个函数 g(x) 在其最小值点处的导数 g'(x) 等于零。因此,寻找 g(x) 的最小值点,等价于寻找其导函数 g'(x) 的零点。

如果我们令 f(x) = g'(x),那么对 f(x) 应用牛顿法寻找零点,实际上就是在寻找 g(x) 的极值候选点。将这些候选点代入原函数 g(x) 进行比较,就能找到最小值。

因此,将牛顿法用于优化的迭代公式需要进行调整。我们不再使用原函数 f,而是使用目标函数 g 的一阶导数 g' 和二阶导数 g''

优化版的牛顿法迭代公式如下:

公式: x_{k+1} = x_k - g'(x_k) / g''(x_k)

算法步骤总结 📋

以下是两种场景下牛顿法的算法步骤对比。

牛顿法(寻找函数零点)

  1. 初始化:选择起始点 x0
  2. 迭代更新:重复计算 x_{k+1} = x_k - f(x_k) / f'(x_k)
  3. 终止条件:重复步骤2,直到找到函数的根(零点)。

牛顿法(寻找函数最小值)

  1. 初始化:选择起始点 x0
  2. 迭代更新:重复计算 x_{k+1} = x_k - g'(x_k) / g''(x_k)
  3. 终止条件:重复步骤2,直到找到函数的最小值。

课程总结

本节课中我们一起学习了牛顿法。我们首先了解了牛顿法如何通过迭代切线来高效地寻找函数的零点,并推导出其核心迭代公式 x_{k+1} = x_k - f(x_k) / f'(x_k)。接着,我们探讨了如何将寻零问题转化为优化问题,通过寻找导函数的零点来定位原函数的最小值,从而得到了用于优化的牛顿法公式 x_{k+1} = x_k - g'(x_k) / g''(x_k)。牛顿法是一种强大且收敛速度快的优化算法,是机器学习工具箱中的重要组成部分。

055:牛顿法示例 🚀

在本节课中,我们将通过一个具体的例子,学习如何应用牛顿法来寻找函数的最小值。我们将回顾一个熟悉的函数,并一步步演示牛顿法的迭代过程,展示其快速收敛的特性。

概述

上一节我们介绍了牛顿法的基本原理。本节中,我们来看看如何将其应用于一个实际函数,以寻找其最小值点。我们将使用函数 f(x) = e^x - log(x) 作为示例,其最小值点位于著名的欧米伽常数(约0.5671)附近。需要注意的是,为了用牛顿法求最小值,我们实际上是寻找其导数的零点。

示例函数与导数

我们使用的函数及其导数如下:

  • 原函数f(x) = e^x - log(x)
  • 一阶导数(即我们需要找零点的函数)g'(x) = e^x - 1/x
  • 二阶导数(牛顿法迭代中所需的导数)g''(x) = e^x + 1/x^2

在牛顿法的框架下,我们设:

  • F(x) = g'(x) = e^x - 1/x
  • F'(x) = g''(x) = e^x + 1/x^2

牛顿法迭代过程

现在,让我们开始迭代。我们选择初始值 x0 = 0.05

以下是牛顿法的迭代步骤,每一步都遵循公式 x_{n+1} = x_n - F(x_n) / F'(x_n)

  • 第一次迭代 (x0 -> x1)
    使用公式计算 x1:
    x1 = 0.05 - (e^0.05 - 1/0.05) / (e^0.05 + 1/(0.05)^2) ≈ 0.097

  • 第二次迭代 (x1 -> x2)
    以 x1 为起点,计算下一个近似值:
    x2 = 0.097 - (e^0.097 - 1/0.097) / (e^0.097 + 1/(0.097)^2) ≈ 0.183

  • 第三次迭代 (x2 -> x3)
    继续迭代过程:
    x3 = 0.183 - (e^0.183 - 1/0.183) / (e^0.183 + 1/(0.183)^2) ≈ 0.320

  • 第四次迭代 (x3 -> x4)
    我们正逐渐接近目标:
    x4 = 0.320 - (e^0.320 - 1/0.320) / (e^0.320 + 1/(0.320)^2) ≈ 0.477

  • 第五次迭代 (x4 -> x5)
    值已经非常接近最小值:
    x5 = 0.477 - (e^0.477 - 1/0.477) / (e^0.477 + 1/(0.477)^2) ≈ 0.558

  • 第六次迭代 (x5 -> x6)
    进行最后一次演示迭代:
    x6 = 0.558 - (e^0.558 - 1/0.558) / (e^0.558 + 1/(0.558)^2) ≈ 0.567

总结

本节课中,我们一起学习了牛顿法在一个具体优化问题中的应用。我们从初始值 x0=0.05 开始,通过仅仅六次迭代,就使近似值达到了 0.567,这与函数真实的最小值点(欧米伽常数 ≈ 0.5671)已经极为接近。这个例子清晰地展示了牛顿法收敛速度非常快的优势。整个过程步骤清晰,只需重复简单的计算即可逐步逼近目标。

057:海森矩阵

在本节课中,我们将要学习多变量函数的二阶导数。上一节我们介绍了单变量函数的二阶导数及其在优化问题中的应用。本节中我们来看看当函数变量多于一个时,二阶导数的概念如何扩展。我们将重点学习一个称为海森矩阵的重要工具,它包含了所有的二阶偏导数信息,并在多变量优化中扮演关键角色。

单变量与多变量函数的对比

首先,我们来回顾和对比单变量与双变量函数。

  • 一个单变量函数记作 f(x),它只依赖于变量 x
  • 一个双变量函数记作 f(x, y),它依赖于变量 xy

对于一阶导数:

  • 单变量函数的一阶导数是 f'(x),表示 f 相对于唯一变量 x 的变化率。
  • 双变量函数有两个变化率:f 相对于 x 的变化率(记作 f_x)和相对于 y 的变化率(记作 f_y)。将它们组合起来,就得到了梯度向量 ∇f

那么二阶导数呢?对于单变量函数,二阶导数是 f''(x),即变化率的变化率。对于双变量函数,情况会复杂一些,这正是本节视频要展示的内容。

理解双变量函数的二阶导数

为了理解双变量函数的二阶导数,让我们分析一个简单的例子。

考虑函数:
f(x, y) = 2x² + 3y² - xy

首先,我们计算它的一阶偏导数:

  • x 求偏导:f_x = 4x - y
  • y 求偏导:f_y = 6y - x

接下来,我们可以计算二阶偏导数。以下是计算过程:

  1. f_x 再对 x 求偏导:f_xx = 4
  2. f_x 再对 y 求偏导:f_xy = -1
  3. f_y 再对 x 求偏导:f_yx = -1
  4. f_y 再对 y 求偏导:f_yy = 6

这四个二阶偏导数代表了“变化率的变化率”。具体来说:

  • f_xxf_yy 类似于单变量情况,分别表示沿 x 方向和 y 方向的变化率如何变化。
  • f_xyf_yx 则有些特殊,它们表示沿一个坐标轴方向的斜率如何随另一个正交坐标轴的微小变化而变化。

一个值得注意的现象是:f_xyf_yx 在这个例子中是相等的。在大多数情况下,只要两个一阶偏导数都是可微的,这个等式就成立,即混合偏导数与求导顺序无关。

在数学符号中,这些二阶偏导数可以表示为:

  • ∂²f/∂x², ∂²f/∂y²
  • ∂²f/∂x∂y, ∂²f/∂y∂x

或者简写为:f_xx, f_yy, f_xy, f_yx

海森矩阵的定义与构成

现在让我们引入海森矩阵。回顾上面的例子,我们计算了四个二阶偏导数。如果我们将这四个数按特定顺序排列成一个矩阵,就得到了该函数在这一点上的海森矩阵

对于函数 f(x, y) = 2x² + 3y² - xy,其海森矩阵 H 为:

H = [ f_xx  f_xy ] = [ 4   -1 ]
    [ f_yx  f_yy ]   [ -1   6 ]

在一般情况下,对于一个函数 f(x, y),我们首先计算一阶偏导数 f_xf_y,然后计算它们的二阶偏导数:f_xx, f_xy, f_yx, f_yy。将这些二阶偏导数排列成的矩阵就是海森矩阵:

H(f) = [ ∂²f/∂x²   ∂²f/∂x∂y ]
       [ ∂²f/∂y∂x   ∂²f/∂y² ]

海森矩阵包含了函数在一点附近曲率的所有二阶信息。正如我们之前提到的,在大多数实际情况下(当函数满足连续性条件时),有 ∂²f/∂x∂y = ∂²f/∂y∂x,这意味着海森矩阵是一个对称矩阵

总结与对比

让我们回到最初的对比表格,现在可以将其补充完整:

  • 对于单变量函数,二阶导数是一个数值 f''(x)
  • 对于多变量函数(如双变量),二阶导数的角色由海森矩阵扮演。它是一个矩阵,系统地记录了所有可能的二阶偏导数。

本节课中我们一起学习了多变量函数的二阶导数概念。我们通过一个具体例子计算了二阶偏导数,并引出了核心工具——海森矩阵。海森矩阵不仅概括了函数在各个方向上的曲率信息,其对称性也简化了计算。在接下来的学习中,我们将看到海森矩阵在多变量牛顿法等优化算法中如何被用来高效地寻找函数的最优点。

059:双变量牛顿法 🧮

在本节课中,我们将学习如何将牛顿法应用于优化多变量函数。正如你所猜测的,海森矩阵将在此出现。

概述

上一节我们介绍了单变量牛顿法,本节中我们来看看如何将其推广到两个或更多变量的情况。我们将学习更新公式,并通过一个具体例子演示其应用。

从单变量到多变量

回想一下,在本课程开始时,我们学习了牛顿法,并找到了迭代寻找函数最小值或最大值的表达式。

对于单变量函数,更新方程依赖于当前值、一阶导数和二阶导数,其表达式如下:
x_{k+1} = x_k - f'(x_k) / f''(x_k)

我们也可以将其重写为:
x_{k+1} = x_k - [f''(x_k)]^{-1} * f'(x_k)
即,不是除以 f''(x_k),而是乘以 f''(x_k) 的倒数。

双变量牛顿法公式

对于双变量情况,我们不再只有一个坐标,而是有两个坐标 xy。第 k 次迭代是 (x_k, y_k),第 k+1 次迭代是 (x_{k+1}, y_{k+1})

那么如何从第 k 次迭代得到第 k+1 次迭代呢?观察上面的表达式,二阶导数变成了海森矩阵,一阶导数变成了梯度。由于我们之前是除以二阶导数,现在则变为乘以海森矩阵的逆。

因此,双变量的表达式为:
[x_{k+1}, y_{k+1}]^T = [x_k, y_k]^T - H^{-1} * ∇f(x_k, y_k)

其中 H 是海森矩阵,∇f 是梯度向量。

实际上,这个公式可以推广到 n 个变量:
\vec{x}_{k+1} = \vec{x}_k - H^{-1}(\vec{x}_k) * ∇f(\vec{x}_k)

这里 \vec{x}_kn 维坐标向量,Hn x n 的海森矩阵,∇fn 维梯度向量。

注意:矩阵乘法的顺序至关重要。梯度向量必须乘在海森逆矩阵的右侧,因为梯度是列向量(n x 1),而海森矩阵是 n x n 的。写成 ∇f * H^{-1} 在数学上是无效的。

虽然证明这个公式需要大量工作,但我们可以直接使用它。可以看到,这确实是单变量情况的一个合理推广。

实践应用:一个具体例子

现在你知道了多变量牛顿法,让我们将其付诸实践。以下是一个凹函数,我们将尝试找到其最小值。

首先,我们来看函数关于 xy 的两个偏导数:
f_x = 2x + y
f_y = x + 2y

然后,计算这些偏导数关于 xy 的二次偏导:
f_{xx} = 2
f_{xy} = 1
f_{yx} = 1
f_{yy} = 2

因此,梯度由中间的两个表达式构成:
∇f = [2x + y, x + 2y]^T

海森矩阵则由这四个二次偏导表达式构成:
H = [[2, 1], [1, 2]]

迭代求解过程

现在,使用海森矩阵和梯度进行牛顿法迭代。

让我们从一个初始点开始,例如 (x0, y0) = (4, 4)

以下是该点的梯度(将数字4和4代入梯度表达式):
∇f(4,4) = [2*4+4, 4+2*4]^T = [12, 12]^T

现在计算海森矩阵(注意,它在整个定义域内是常数矩阵):
H = [[2, 1], [1, 2]]
其逆矩阵为:
H^{-1} = (1/3) * [[2, -1], [-1, 2]]

第一次迭代
根据公式,第二次迭代(即第一次迭代后的点)为:
[x1, y1]^T = [4, 4]^T - H^{-1} * [12, 12]^T
计算后得到:
[x1, y1] ≈ [2.58, 2.62]

可以看到,新点 (2.58, 2.62)(4, 4) 更接近我们寻找的根 (0, 0)

第二次迭代
现在以 (2.58, 2.62) 为新起点。
计算该点梯度:
∇f ≈ [7.78, 7.82]^T
(代入 x=2.58, y=2.62 到梯度公式)

第二次迭代为:
[x2, y2]^T = [2.58, 2.62]^T - H^{-1} * [7.78, 7.82]^T
计算后得到:
[x2, y2] ≈ [1.59, 1.67]

继续迭代
如果我们重复这个过程多次,最终会非常接近实际零点。

例如,经过八次迭代后,我们得到:
[x8, y8] ≈ [4.15e-17, -2.05e-17]
这是一个极其小的数字,非常非常接近 (0, 0)。而 (0, 0) 正是我们要找的最优点,因为它是函数的根。

总结

本节课中,我们一起学习了双变量牛顿法。正如你所见,与单变量情况类似,双变量牛顿法也是一种非常快速的方法,能够非常精确地逼近函数的零点。其核心在于使用梯度向量和海森矩阵的逆来迭代更新变量值,从而高效地找到最优解。

060:课程回顾与展望 🎓

在本节课中,我们将对微积分课程的核心内容进行总结,回顾所学知识,并展望其在机器学习旅程中的应用。


首先,我们学习了单变量函数的导数。导数描述了函数在某一点处的瞬时变化率,是理解函数行为的基础工具。

上一节我们介绍了单变量导数,本节中我们来看看多变量情况下的扩展。

接着,我们学习了多变量函数的梯度和导数。梯度是一个向量,其每个分量是函数对相应变量的偏导数。对于函数 f(x, y),其梯度公式为:
∇f = [∂f/∂x, ∂f/∂y]
我们掌握了如何计算它们,并理解了它们在描绘多变量函数变化方向上的重要性。

当我们掌握了这些基本工具后,下一步就是学习如何运用它们来解决问题。

然后,我们学习了如何利用导数和梯度来优化问题。优化的核心是找到使函数值最小化或最大化的输入点,这在机器学习中对应于寻找最佳模型参数。

然而,当优化问题变得复杂时,我们需要更高效的方法。

当问题变得复杂时,我们学习了诸如梯度下降法和牛顿法等技术来加速优化过程。梯度下降法的核心更新公式为:
θ_new = θ_old - α * ∇J(θ)
其中 α 是学习率,J(θ) 是代价函数。

以下是本课程涵盖的核心主题列表:

  • 单变量导数:函数变化率的基础概念。
  • 多变量梯度:函数在多维空间中变化方向与速率的向量表示。
  • 优化方法:应用导数寻找函数极值点。
  • 高级优化算法:如梯度下降法,用于处理复杂、高维的优化问题。

最重要的是,我们学习了如何将所有这些优化方法应用到机器学习中。从线性回归的代价函数最小化,到神经网络中通过反向传播调整权重,微积分都是其背后的核心数学引擎。


本节课中我们一起学习了从单变量导数到多变量梯度的核心微积分概念,探索了如何利用它们进行优化,并特别介绍了梯度下降等实用算法。最终,我们看到了这些数学工具如何构成机器学习模型训练的基础。祝贺你完成了这门微积分课程,这是你机器学习之旅中坚实的一步。我们对你即将迈出的后续步伐充满期待。

posted @ 2026-03-26 08:18  布客飞龙II  阅读(0)  评论(0)    收藏  举报