1、极值问题
1.1、一元函数情况
在高等数学甚至是初等数学中,我们就已经接触过函数的极值这类问题。在初等数学中,例如二次函数的最小值(最大值)求解问题就是一个典型的极值问题,到了大学,我们可以从高等数学的知识中知道,对于任何一个连续函数来说,它的极值点一定是导数为零的点。
1.2、推广到多元函数
以上讨论的都是基于一元函数的情况(即二维平面中),我们可以把这个问题推广到多元函数中(即多维空间中)。在此之前,先引入偏导数和梯度的概念:
- 偏导数:在多元函数中,将其中一个自变量看作待求偏导的自变量而将其余自变量都看作常量对函数求导,所得到的就是函数对于该变量的偏导数;
- 梯度:有了偏导数的概念之后,梯度就相当简单了,多元函数对每一个自变量求偏导后,将所求得的所有偏导数构成一个矢量,这个矢量就是梯度。(所以梯度是一个矢量)
举个例子来说,二元函数,它对x的偏导为fx'=2x+2y,对y的偏导为fy'=2x+4y。那么,函数f在(1,2)这一点对x、y的偏导数分别为6、10。将这两个偏导数结合组成一个矢量(6,10)就是f在点(1,2)处的梯度。
有了偏导数和梯度的概念之后,就可以很容易将极值问题推广到多元函数的情况:多元函数的极值点一定是梯度为零的点。
补充一个小问题,在机器学习中,我们处理的都是矢量,即对于每一个现实中的对象,都是将它化为矢量后再做计算的,也就是说我们在机器学习中的函数都是矢量函数(或者叫向量函数)。其实,矢量函数本质上就是多元函数,我们可以将矢量的每一个分量(即每一维的值)看作是多元函数的每一个自变量。
2、迭代法
前面已经提到过,极值点一定是梯度为零的点,所以极值问题加转化成了求导数(梯度)为零的点的问题。对于前面提到过的那个简单的二元函数来说,梯度为零的点很容易求得,直接联立方程组就可以。但在大多数情况下,这个解并不是很容易求的,甚至没有解析解。例如:函数,对x、y的偏导分别为:、,使这两个偏导数为零再联立方程组,发现,这是两个超越方程,是没法用解析的方法求得的。基于这种情况,就有了迭代法的思想:
将原函数的极值点初始化为x0(x0是矢量),然后以某个迭代公式从x0得到x1(一般情况下x1比x0更接近极值点),这样一直迭代下去,直到迭代了一定的次数或者该点的梯度已经很接近零,我们就可以认为这一点就是极值点。
由以上定义可以知道,迭代法中最核心的问题就是怎样确定迭代方程让x更好更快地趋近于极值点,下面给出梯度下降法和牛顿法的思路:
由于这两种方法的思想都是基于泰勒公式的,所以在讨论梯度下降法和牛顿法之前,我们先给出多元函数的泰勒展开:
,H为Hessian矩阵
此处约等号是由于等式右边还应加上高阶无穷小,在x0的邻域内可以忽略不计。
- 梯度下降法(只展开到一次项):,即,要使f(x)的值比f(x0)更接近于极小值点,可以让,梯度下降法的思路是使x-x0等于x0处的负梯度值,即,等式的右边恒小于零,这样就达到了想要的效果,可以得到梯度下降法的初步迭代公式:,前面说过,只有在x0的邻域内高阶无穷小才能忽略不计,所以为了避免跳出x的邻域,我们在迭代公式上再加入一个参数:步长,得到:
从另外一个角度讲,要想使得两个向量的积小于零,只要使其夹角大于90度即可,且当夹角为180度时,向量的积达到最小值-1,梯度下降法也正是基于这种思想,使x按照下降速度最快的方向进行迭代以找到极值点。
- 牛顿法(展开到二次项):,两边同时求导可得:,使其等于零,得:,同样要加入参数步长,可以得到牛顿法的迭代公式:
3、小结
本文从数学的角度出发,较为详细地讨论了两种典型的最优化思想:梯度下降和牛顿法。基于向量函数(多元函数)的泰勒展开,简单推导了梯度下降法和牛顿法。需要注意的是,本文所讨论的都是无约束条件情况下的最优化问题,对于有约束条件的最优化问题更为复杂,笔者在单独的文章中对其进行探讨。另外,本文所使用的Hessian矩阵,不了解的读者可以自行查阅相关概念。
补充:本文在讨论极值问题时都是以极小值为例的,对于极大值问题,只需要将原目标函数取相反数,再求相反数的极小值即可。不足之处,欢迎各位指正!