你好,欢迎来到我的《数学通识50讲》,这一讲我们学习如何用变化的眼光找到最优答案。
今天高等数学最常见的一个应用是对这种现实的问题实现最优化,比如炙手可热的机器学习,其实就是对一个目标函数实现最优化的过程。此外,金融上的结构化投资产品,商业上的博弈论,企业管理中的各种规划,其实也都是不同形式的最优化。
那么什么是最优化?其实它最简单的形态大家都不陌生,就是求一个函数的最大值或最小值。由于这两个问题是对称的,解法类似,因此我们就以求最大值为例来说明。
对于一个有限的集合,求最大值是一件很容易的事情,比如在计算机计算问题中就有很多寻找最大值的算法。所有那些算法的一个核心思想,就是比较大小。如果有一个元素在直接或者间接地和其它的元素对比后,它比谁都多,它就是最大值。
这是一种寻找最大值的思想,但在一个有无限集合的函数中就不大灵了,因为你不可能穷尽所有的可能性。那么怎么办呢?这时我们在中学里就要开始学习解题技巧了。
一般人如何求解最大值?
最著名的解题技巧就是计算抛物线的最大值。比如一个抛物线函数是:y =-x^2+4x,它的最大值是多少?
从直觉我们可以猜出来这个函数的最大值是存在的,因为我们至少有两个理由:
- 无论x是一个什么样有限的数,y都不可能是正的无穷大,而是一个有限的数;
- 当x趋于正无穷,或者负无穷时,y都是负无穷大。
因此我们猜想这个函数应该是两头小,中间大,而且中间是有最大值存在的,但是真让我们找到那个最大值,又无从下手。
很多人会代入几个数字试一试,比如让x=0,我们知道y 也等于零。如果x=1,那么y=3,增加了一些。如果x再增加到2,y会增加到4,但是再往后,y似乎就要往下走了。那么我们能说y的最大值就是4吗?把这个函数对应的曲线画在坐标上,能看出最大值就是4附近:
但是我们前面说了,在数学上我们不能通过测量得到结论,是要证明的。那么怎么证明呢?在中学里,老师会讲这样一个技巧,我把步骤放在文稿中了,大家有兴趣可以看一下:
- 我们把y=-x^2+4x重新组织一下,就得到y=-(x-2)^2+4。推导的过程我就省略了。
- 在这个式子里,我们知道(x-2)^2只可能大于零,或者等于零,因此乘以-1之后,-(x-2)^2只可能小于零,或者等于零。后面的4是个常数,不影响y的取值。
- 于是y的最大值就是当-(x-2)^2=0的时候,这时y=4。
总之,老师教的这个技巧能解决一批同类的抛物线的问题,但是遇到其它的问题,这种技巧还是无能为力。比如要问下面这个函数y=x^3-12x^2+4x+8在0到15之间有没有最大值或者最小值,上面的方法就不灵了。
因此,靠这样掌握了某个技巧考了高分,也不值得沾沾自喜,因为那种经验很难推广用来解决一般性问题。
在伽利略之前,人类其实没有太多的最优化问题要解决。但是到了伽利略和开普勒那个年代,人们就在物理学和天文学中遇到很多最优化问题了,比如计算行星运动的近日点和远日点距离、弹道的距离、望远镜透镜曲率和放大倍数的关系等等。这时就需要系统地解决最优化问题,而不能单靠一些技巧。这个难题就留给了牛顿。
牛顿怎么求解最大值?
牛顿是怎么考虑这个问题的呢?他的伟大之处在于,他不像前人那样,将最优化问题看成是若干数量比较大小的问题,而看成是研究函数动态变化趋势的问题。这一点很重要。
怎么理解牛顿这个思想呢?我们还是从前面那个求抛物线最高点的问题讲起。为了方便起见,我们把关注点放在最高点附近的位置上,我把上面的曲线又放大画了一遍。
我们在前面的课程讲到过,曲线瞬间变化的速率就是那一点切线的斜率,也就是它的导数。为了强化你对这个要点的理解,我特别将抛物线在最高点附近的斜率变化画出来,给你看一下:
在图中,上半部分就是前面说的抛物线,只是我为了让大家把曲线变化的细节看得更清楚,将它的横轴拉长了一倍。图中各种颜色的曲线,是一些点的切线。你可以看出,从左到右,抛物线的变化是由快到慢,到平缓,再到下降。而这些切线也是由陡峭变得平缓,在最高点变成了水平线,然后斜率就往下走了。
如果量化地度量它们,在x=0这个点,切线的斜率,也就是相应点的导数是4。到x=0.5时,斜率或者说导数变成了3,然后变成了2,1,0,-1,-2,等等。因此如果我们把导数函数也画在图中,就是那根直的虚线。
对比抛物线和它的导数(虚的直线),你是否发现了,曲线达到最高点的位置,就是切线变成水平的位置,或者说导数变为0的位置呢?
如果你看到了这一点,恭喜你,说明你的目光很敏锐。那么这种现象是巧合么?不是!如果我们回到最大值的定义,对应导数的定义,就很容易理解这两件事情的一致性了。
最大值的含义是说某个点a的函数值f(a)比周围点的数值都大,因此,如果我们从最大值的点往四周走一点点距离,就会发现那些点的函数值要比它小一点。在二维图上,就是和左右的点比较。
左边的比它小,说明左边的点变化的趋势是向上,导数大于零,右边的也比它小,说明右边的点变化趋势向下,导数小于零。从大于零的数变成小于零的,中间经过导数为零的点,就是最大值所在。
于是,寻找一个函数f(x)的最大值,就变成了一个寻找该函数的导数f’(x)等于零的问题。而后一个过程其实就是解方程,比前一个问题要容易。
上面这种思路,就是牛顿在寻找最大值这件事情上,和前人所不同的地方。他不是直接解决那些很难的问题,而是把比较数大小的问题,变成了寻找函数变化拐点的问题,后一个问题要比前一个好解决。但是,将这两个问题等同起来,需要发明一种工具,叫做导数。
有了导数这个工具,求最大值问题就变成了解方程的问题。这个方法的好处在于,它适用于任何函数。因此,我们不再需要针对每一种特定的函数,寻找一种解题技巧了。这也是为什么微积分是一种很强大的数学工具的原因。
还是没有彻底解决?
当然,我们昨天讲了,一个新的方法出来之后,常常免不了有一些破绽,用导数求最大值的方法也是如此。
比如一个立方函数,f(x) = x^3,它的导数是f’(x) = 3x^2,显然当x=0时,它的导数变为了零。但是x=0这一点显然不是x^3最大值的点,因为我们知道立方函数的最大值最后是趋近于无穷大。
为什么上述方法对于立方函数不管用了呢?我画一个图,大家就清楚了。
在图中你会发现,立方函数一开始上升的斜率很大,然后逐渐变小,并且变为零。但是,在变为零以后,它没有再进一步变小进入负数的区间,而是又逐渐变大了。原因找到了,问题就好补救。
我们只要在找到导数等于零那个点之后,看看它前后的点,是否发生了导数符号从正的到负的反转,如果发生了,它就是最大值的点,否则就不是最大值的点。这样就补救了一个漏洞。
用导数求最大值的方法还有其它的漏洞,比如下面这个函数。它有左右两个点,都满足导数等于零的条件,而且也都满足导数从正变成零,再变成负这个条件,但是最大值只能有一个。由于左边的那个点比右边的要高一些,因此左边的是真正的最大值,右边的是假的。
对于这种情况怎么办?首先,数学家们要更准确地定义什么是最大值。他们把最大值分成了两种,第一种被称为极大值,或者局部最大值,就是说只要一个点的函数值比周围都高就可以了。另一种才是我们原来理解的整个函数的最大值。
因此,一个函数可以有多个极大值,但是只能有一个最大值。这样,谁是最大值的定义就没有矛盾了。
但是接下来,数学家们需要给出,如何在很多的那个局部的极大值中找到最大值的方法。很遗憾,目前依然没有很好的方法系统性地解决这个问题,只能一个个比较。
事实上,这也是今天计算机进行机器学习时遇到的一个很大的、尚未解决的问题,因为在很多时候,我们觉得经过计算机长期的训练,找到了最大值,但是后来发现所找到的不过是很多局部极大值中的一个而已。人们对于这一点的认知,后来给企业管理和创新带来了很多思考和启发。这个内容我们在最后一个模块会讲到。
最后总结一下今天的内容。在过去,找最大值就是一个个地比较数字的大小,这就把数字变化看成是孤立的事件了,因此很难找到通用的求最大值的方法。
牛顿等人通过考察函数变化趋势,发明了一种通过跟踪函数从低到高,再到平稳,最后再下降的变化,而求最大值的方法。这就让人类对事物的理解从静态,到动态了。这种方法的好处是,它是通用的,而不是针对具体问题的技巧。当然,这种方法有一些漏洞,因此我们要一一补上。
到目前为止,我们关于微积分的主要思想就介绍完了,希望你通过这个工具,对世界的认识能够上到一个崭新的高度。下一讲我们会讲讲有关微积分的发明权之争,看看你从中会得到哪些启发。我们下一讲再见。——吴军《数学通识五十讲》