You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
10 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 04 数学基础 | 不畏浮云遮望眼:最优化方法
从本质上讲,**人工智能的目标就是最优化:在复杂环境与多体交互中做出最优决策**。几乎所有的人工智能问题最后都会归结为一个优化问题的求解,因而最优化理论同样是人工智能必备的基础知识。
**最优化理论optimization研究的问题是判定给定目标函数的最大值最小值是否存在并找到令目标函数取到最大值最小值的数值**。如果把给定的目标函数看成连绵的山脉,最优化的过程就是判断顶峰的位置并找到到达顶峰路径的过程。
要实现最小化或最大化的函数被称为**目标函数objective function或评价函数**,大多数最优化问题都可以通过使目标函数$f(x)$最小化解决,最大化问题则可以通过最小化$-f(x)$实现。
实际的最优化算法既可能找到目标函数的全局最小值global minimum也可能找到局部极小值local minimum两者的区别在于全局最小值比定义域内所有其他点的函数值都小而局部极小值只是比所有邻近点的函数值都小。
理想情况下,最优化算法的目标是找到全局最小值。但找到全局最优解意味着在全局范围内执行搜索。还是以山峰做例子。全局最小值对应着山脉中最高的顶峰,找到这个顶峰最好的办法是站在更高的位置上,将所有的山峰尽收眼底,再在其中找到最高的一座。
可遗憾的是,目前实用的最优化算法都不具备这样的上帝视角。它们都是站在山脚下,一步一个脚印地寻找着附近的高峰。但受视野的限制,找到的峰值很可能只是方圆十里之内的顶峰,也就是局部极小值。
当目标函数的输入参数较多、解空间较大时,绝大多数实用算法都不能满足全局搜索对计算复杂度的要求,因而只能求出局部极小值。但在人工智能和深度学习的应用场景下,只要目标函数的取值足够小,就可以把这个值当作全局最小值使用,作为对性能和复杂度的折中。
**根据约束条件的不同最优化问题可以分为无约束优化unconstrained optimization和约束优化constrained optimization两类**。无约束优化对自变量$x$的取值没有限制,约束优化则把$x$的取值限制在特定的集合内,也就是满足一定的约束条件。
线性规划linear programming就是一类典型的约束优化其解决的问题通常是在有限的成本约束下取得最大的收益。约束优化问题通常比无约束优化问题更加复杂但通过**拉格朗日乘子**Lagrange multiplier的引入可以将含有$n$个变量和$k$个约束条件的问题转化为含有$(n + k)$个变量的无约束优化问题。拉格朗日函数最简单的形式如下
$$ L(x, y, \\lambda) = f(x, y) + \\lambda \\varphi(x, y) $$
式中$f(x, y)$为目标函数,$\\varphi(x, y)$则为等式约束条件,$\\lambda$是拉格朗日乘数。从数学意义上讲,由原目标函数和约束条件共同构成的拉格朗日函数与原目标函数具有共同的最优点集和共同的最优目标函数值,从而保证了最优解的不变性。
**求解无约束优化问题最常用的方法是梯度下降法gradient descent**。直观地说梯度下降法就是沿着目标函数值下降最快的方向寻找最小值就像爬山时要沿着坡度最陡的路径寻找山顶一样。在数学上梯度的方向是目标函数导数derivative的反方向。
当函数的输入为向量时,目标函数的图象就变成了高维空间上的曲面,这时的梯度就是垂直于曲面等高线并指向高度增加方向的向量,也就携带了高维空间中关于方向的信息。而要让目标函数以最快的速度下降,就需要让自变量在负梯度的方向上移动。这个结论翻译成数学语言就是“**多元函数沿其负梯度方向下降最快**”,这也是梯度下降法的理论依据。
在梯度下降算法中,另一个重要的影响因素是**步长**,也就是每次更新$f(\\mathbf{x})$时$\\mathbf{x}$的变化值。较小的步长会导致收敛过程较慢,当$f(\\mathbf{x})$接近最小值点时,步长太大反而会导致一步迈过最小值点,正所谓“过犹不及”。
因而在梯度下降法中,步长选择的整体规律是逐渐变小的。这样的方式也符合我们的认识规律。在校对仪器时,不都是先粗调再微调么?
以上是针对单个样本的梯度下降法,当可用的训练样本有多个时,样本的使用模式就分为两种。
一种是**批处理模式**batch processing即计算出在每个样本上目标函数的梯度再将不同样本的梯度进行求和求和的结果作为本次更新中目标函数的梯度。在批处理模式中每次更新都要遍历训练集中所有的样本因而运算量较大。
另一种模式叫做**随机梯度下降法**stochastic gradient descent它在每次更新中只使用一个样本下一次更新再使用另外一个样本在不断迭代的更新过程中实现对所有样本的遍历。有趣的是事实表明当训练集的规模较大时随机梯度下降法的性能更佳。
梯度下降法只用到了目标函数的一阶导数first-order derivative并没有使用二阶导数second-order derivative。一阶导数描述的是目标函数如何随输入的变化而变化二阶导数描述的则是一阶导数如何随输入的变化而变化提供了关于目标函数曲率curvature的信息。曲率影响的是目标函数的下降速度。当曲率为正时目标函数会比梯度下降法的预期下降得更慢反之当曲率为负时目标函数则会比梯度下降法的预期下降得更快。
梯度下降法不能利用二阶导数包含的曲率信息,只能利用目标函数的局部性质,因而难免盲目的搜索中。已知目标函数可能在多个方向上都具有增加的导数,意味着下降的梯度具有多种选择。但不同选择的效果显然有好有坏。
遗憾的是,梯度下降法无法获知关于导数的变化信息,也就不知道应该探索导数长期为负的方向。由于不具备观察目标函数的全局视角,在使用中梯度下降法就会走出一些弯路,导致收敛速度变慢。而二阶导数所包含的全局信息能够为梯度下降的方向提供指导,进而获得更优的收敛性。
**如果将二阶导数引入优化过程得到的典型方法就是牛顿法Newton's method**。在牛顿法中目标函数首先被泰勒展开写成二阶近似的形式相比之下梯度下降法只保留了目标函数的一阶近似。此时再对二阶近似后的目标函数求导并令其导数等于0得到的向量表示的就是下降最快的方向。**相比于梯度下降法,牛顿法的收敛速度更快**。
不管是利用一阶导数的梯度下降法,还是利用二阶导数的牛顿法,**其寻找最小值点的基本思想都是先确定方向再确定步长因而统称为“线性搜索方法”line search**。
还有一类算法,**其寻找最小值点的基本思路是先确定步长以步长为参数划定一个区域再在这个区域内寻找最快下降的方向。这类算法被称为“置信域方法”trust region**。
具体来说,置信域算法的运行过程如下:设定一个置信域半径$s$,并在以当前点为中心、以$s$为半径的封闭球形区域作为置信域,在置信域内寻找目标函数的二次近似模型的最优点,最优点和当前点之间的距离就是计算出来的备选位移。
在备选位移上,如果目标函数的二次近似产生了充分的下降,就将当前点移动到计算出的最优点,则继续按此规则迭代计算下去,并可以适当增加$s$;如果目标函数的近似下降不够理想,则说明步子跨得太大,需要缩小$s$并计算出新的备选位移,直到满足终止条件。
除了以上算法外,还有一类被称为“**启发式算法**”heuristics的最优化方法。启发式算法的灵感来源于20世纪50年代诞生的仿生学它将生物进化等自然现象的机理应用于现实世界复杂问题的优化之中并取得了不俗的效果。
相对于传统的基于数学理论的最优化方法,启发式算法显得返璞归真。**启发式算法的核心思想就是大自然中"优胜劣汰"的生存法则,并在算法的实现中添加了选择和突变等经验因素**。
事实上搜索越多并不意味着智能越高智能高的表现恰恰是能够善用启发式策略不用经过大量搜索也能解决问题。启发式算法的实例包括模拟生物进化规律的遗传算法genetic algorithm、模拟统计物理中固体结晶过程的模拟退火算法simulated annealing、模拟低等动物产生集群智能的蚁群算法ant colony optimization等等。
今天炙手可热的神经网络实际上也是一类启发式算法,它模拟的则是大脑中神经元竞争和协作的机制。关于各类启发式算法的论著较多,如果你感兴趣,可以查阅不同算法的原理及实现,受篇幅所限,在此不做赘述。
今天我和你分享了人工智能必备的最优化方法基础,着重于抽象概念的解释而非具体的数学公式,其要点如下:
* 通常情况下,最优化问题是在无约束情况下求解给定目标函数的最小值;
* 在线性搜索中,确定寻找最小值时的搜索方向需要使用目标函数的一阶导数和二阶导数;
* 置信域算法的思想是先确定搜索步长,再确定搜索方向;
* 以人工神经网络为代表的启发式算法是另外一类重要的优化方法。
在最优化方法中,基于数学定理的搜索式算法和基于仿生学原理的启发式算法,哪一种能够在人工智能的发展中发挥更大的作用呢?
欢迎发表你的观点。
![](https://static001.geekbang.org/resource/image/13/8e/13a4991f9bc5b7c3717f47ea28b4d18e.jpg)