简介
了解本章的内容预期以及为何需要优化算法。
我们已经知道如何使用导数和梯度来解决优化问题。无论变量有多少,我们都能用这种方法求解。那么,为什么课程还没有结束?为什么我们还需要优化算法?
为什么要使用优化算法?
首先,我们其实已经接触过一种优化算法:通过导数和梯度来求解的过程本身就是一个算法。我们遵循一套结构清晰、步骤明确且有限的流程,最终实现函数的最小化或最大化。
从技术上讲,这并不是我们第一次接触算法。但本质上,这类方法与我们将要学习的新方法有很大不同。我们之前掌握的解析法(即利用导数和梯度的方法)是通过求解某些方程来得到一组候选点,然后对这些点进行检验,判断哪个是最小值,哪个是最大值。
而本章将介绍的算法采用的是另一种思路。它们更像是一种“试错”过程:我们在某一点评估函数值,然后朝着某个方向移动,希望这个方向能带我们接近最小值。当然,我们会运用一些巧妙的技术来选择合适的方向。这就是所谓的迭代过程:每一步的决策都可以基于之前的结果。
比较这两种方法——解析法和迭代法——前者看起来仍然更稳健、更可靠。但让我们深入探讨一下,为什么迭代算法是必不可少的。
不可微性
我们之前提到过,有些函数在某些点上没有定义导数。比如函数 ,我们知道它在 处取得最小值,但如果我们用计算机程序通过解析法来寻找这个最小值,却无法实现。
也许你会认为这些函数很奇怪,在实际中根本不会出现。但实际上,这类函数确实存在,甚至可能比 更复杂。因此,第一个需要尝试其他方法的原因就是:存在一些无法用解析法优化的函数。就这么简单。但即使在可以使用解析法的情况下,采用迭代法也具有一些优势。
执行时间
在解析方法中,我们需要执行如下步骤:
- 求解方程 ,或求解方程组 ;
- 计算海森矩阵的行列式。
我们之前处理的例子只有1个、2个或3个变量。但在机器学习中,问题通常涉及数百、数千甚至数百万个变量!求解如此庞大的方程组,或者计算这么大的矩阵的行列式,即使是计算机也会耗费极长时间。
相比之下,迭代方法在寻找函数最小值时消耗的资源更少。我们不需要计算行列式,也不必求解巨大的方程组。
这就是我们学习迭代算法的两个主要原因:一是存在不可微函数,二是这类算法速度快、资源消耗低。但还有一个同样重要的原因值得强调:如今,这些算法极其高效、快速且稳定。解析法与迭代法之间的可靠性差距已经变得几乎可以忽略不计。
迭代算法赋予了我们一种强大的能力——能够解决包含数百万变量的问题。它们让优化真正走进了我们的现实世界。现在,让我们一起来探索这些算法是什么,以及如何使用它们!
迭代算法
我们将重点学习三种迭代算法:
- 二分查找
- 梯度下降
- 牛顿法
其中一些方法仍然依赖导数来做决策(因此在面对不可微函数时仍会遇到困难)。但它们的核心思想始终一致:找到一个新点,使其比之前所有找到的点都更接近最小值。
记住:我们可以只讨论最小值,而忽略最大值,因为
我们会发现,这些算法面临的两个核心问题是:
- 第一个尝试的点应该选在哪里?
- 如何根据前一个点确定下一个点?
为此,我们需要引入一个新的概念:收敛性。
如果一个迭代算法在每一次新的迭代中都更接近期望的解,我们就说它收敛。一个不收敛的算法毫无价值,不值得投入时间和精力。收敛性是这类算法最重要的特性。
但仅仅收敛还不够。我们还希望收敛速度足够快。收敛速度可以理解为算法找到最优解所需的步数。这一点也很关键,因为如果收敛太慢,解决方案可能在实际中不可行。
当然,我们之前对收敛性和收敛速度的定义都是非正式的(所以别拿去给数学家看!)。它们有严格的数学定义,允许数学家深入分析每个算法的行为。但我们目前采用更轻松、直观的理解方式即可。不用担心,这种思维方式并不会影响我们对问题的深入分析。通过直觉思考,我们将建立起对这些算法更深刻的理解,并能更有效地加以应用。
现在,是时候开启这段全新的旅程了!