本文是对网上学习资料的整理与记录(主要来自CSDN,链接附在最后的参考资料部分),方便自己日后的复习巩固,也分享热爱知识的网友们。
对于机器学习中最重要的数学概念之一梯度的解读,主要从《高等数学》和《微积分》中的定义与理解进行剖析,并增加了另一个角度泰勒级数,来解析为什么函数上的一点沿着梯度的方向具有最大的变化率,这是机器学习优化算法——梯度下降法的核心思想。
导数
导数,反映的是函数$y=f(x)$在某一点处沿$x$轴正方向的变化率。公式定义如下:
再强调一遍,导数$f’(x)$是函数$f(x)$在$x$轴上某一点处沿着$x$轴正方向的变化率 / 变化趋势。
直观地看,也就是在$x$轴上某一点处,如果$f’(x) > 0$,说明$f(x)$的函数值在$x$点沿$x$轴正方向是趋于增加的;如果$f’(x) < 0$,说明$f(x)$的函数值在$x$点沿$x$轴正方向是趋于减少的。用图说话,则
图中的绿色曲线表示函数,,点P和点M是曲线上的两点。蓝色直线为函数曲线在P点的切线,点P横坐标(自变量)为$x$,点M横坐标为$x + Delta x$,则图中的$Delta x, Delta y, mathrm{d}x, mathrm{d}y$等符号的意义及关系如下:
- $Delta x$:$x$的变化量;
- $mathrm{d}x$:$x$的变化量$Delta x$趋于$0$时,则记作微元$mathrm{d}x$;
- $Delta y$:$Delta y = f(x_0 + Delta x) - f(x_0)$,是函数的增量;
- $mathrm{d}y$:$mathrm{d}y = f’(x_0) mathrm{d}x$,是切线的增量;
当$Delta x → 0$时,$mathrm{d}y$与$Delta y$都是无穷小,$mathrm{d}y$是$Delta y$的主部,即$Delta y = mathrm{d}y + o(Delta x)$。
可见,导数是代表函数(曲线)的斜率,是描述函数(曲线)变化快慢的量。同时曲线的极大值点也可以使用导数来判断,即极大值点的导数为$0$,此时斜率为零(但反过来一阶导数为零的点不一定是极值点可能是驻点,这时需要根据二阶导数判断),那么导数就为我们求解函数的极值提供了可能,当然我们现在说的导数是一元导数即$f(x)$,只具有一个自变量$x$,因此很容易求导。
多元函数与偏导数
多元函数
大多数情况下,决定因变量的因素可能并非只有一个。以某个地区的房价为例,导致房价变动的因素可能包括面积,学区划分,地段,交通,城市规模等等。每个因素都可以作为自变量,自变量不为1个的函数叫做多元函数。在这种多因素的情况下,如果想知道哪个因素对房价变动的影响最大(所谓的影响最大就是这个因素能使房价函数的变化率最大),很显然,可以用求导实现。那么针对多变量的情况,例如$f(x, y)$,就要引入偏导数的概念了。
偏导数
多元函数有多个自变量,每个自变量可以独立自由变化,那么它的函数值的变化率该如何得到呢?这时候就可以采用学过的一个实验方法——控制变量法。
还是以房价为例,如果房价和面积,交通,学区三个因素有关,$area = f(x, y, z)$,$x$代表面积,$y$代表交通,$z$标识学区。
可考虑先把交通$y$和学区$z$固定,考虑面积$x$的微小变化对房价产生的影响,表示成:$frac{partial f(x, y, z)}{x}$。同理,分别再把面积$x$和交通$z$固定,以及面积$x$和学区$y$固定在某一个点,得到分别对于交通和学区的变化率:$frac{partial f(x, y, z)}{y}$ 和 $frac{partial f(x, y, z)}{z}$。
这种在多元函数中,将其他变量看做常数,按照求导法则,计算分别针对某个变量的导数,叫做偏导数。偏导数每次只使一个自变量发生变化,所以计算过程和计算一元函数的导数过程无异。其物理意义就是查看这一个变量在其他情况不变的情况下对函数的影响程度。
比如函数$f(x, y) = x^2 + y^2 + 2xy + 3y$,求偏导的结果为:$frac{partial f(x, y)}{x} = 2x + 2y$ 和 $frac{partial f(x, y)}{y} = 2y + 2x + 3$。
偏导数的公式定义如下:
不难看到,偏导数与导数本质是一致的,都是当自变量的变化量趋于0时,函数值的变化量与自变量变化量比值的极限。直观地说,偏导数也就是函数在某一点上沿坐标轴正方向的的变化率。区别在于:
- 导数,指的是一元函数中,函数$y = f(x)$在某一点处沿$x$轴正方向的变化率;
- 偏导数,指的是多元函数中,函数$y = f(x_1, x_2, dots , x_n)$在某一点处沿某一坐标轴$(x_1, x_2, dots , x_n)$正方向的变化率。
方向导数
方向导数的公式定义:
在前面导数和偏导数的定义中,均是沿坐标轴正方向讨论函数的变化率。那么当我们讨论函数沿任意方向的变化率时,也就引出了方向导数的定义,即:函数上某一点在某一趋近方向上的导数值。
通俗的解释是:我们不仅要知道函数在坐标轴正方向上的变化率(即偏导数),而且还要设法求得函数在其他特定方向上的变化率。而方向导数就是函数在其他特定方向上的变化率。
梯度
梯度的数学概念
梯度的提出只为回答一个问题:函数在变量空间的某一点处,沿着哪一个方向有最大的变化率?
梯度给出的答案是:函数在某一点的梯度是这样一个向量,它的方向与取得最大方向导数的方向一致,而它的模为最大方向导数的值。
这里注意三点:
1)梯度是一个向量,即有方向有大小;
2)梯度的方向是最大方向导数的方向;
3)梯度的值是最大方向导数的值。
通俗地讲,就是函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
梯度的公式定义:
以圆锥为例,圆锥的方程为:
其中$a$为变参,这里取$a = 2$。则针对曲面上每一个点$P(x,y)$,其梯度可以定义为
$ abla f(x, y) = left[frac{partial f(x, y)}{partial x}, [frac{partial f(x, y)}{partial y} ight] = frac{partial f(x, y)}{partial x}vec i + frac{partial f(x, y)}{partial x}vec jquad(vec i = (1, 0), vec j = (0, 1))$
其中
同理
所以,在椎体的任意一点,梯度向量为$frac{a^2x}{z} vec i + frac{a^2y}{z} vec j$记作:
$grad f(x, y) = left(frac{a^2x}{z}, frac{a^2y}{z} ight)$
特殊情况下,在$y = 0$截面和$x = 0$截面与圆交线上的点的梯度为$grad f(x, 0) = (a, 0)$ 和 $grad f(0, y) = (0, a)$
如下图所示,由于梯度在另一个方向上的分量为$0$,所以梯度向量在坐标轴方向上达到最大,这和直觉是相符的。
直觉上,不论从圆锥上哪个点触发,它的梯度的大小是一样的(方向不一样),我们可以验证一下
所以
=
所以,圆锥上任意一点的梯度大小均为$a$,处处相等,包括上面计算得到的和坐标轴平面相交的两条线。
这里,$ abla = frac{partial}{partial x} vec i + frac{partial}{partial y} vec j$ 叫做二维空间向量梯度算子,$ abla f = frac{partial f}{partial x} vec i + frac{partial f}{partial y} vec j$。
方向导数与梯度(几何角度)
第3节已讲过,所谓方向导数,就是指函数$f(x, y)$沿着直线$ell$变化的速率,这条直线其实就是曲面上相对应的那条曲线在$xoy$平面的投影。完成投影的这个竖立的平面就称为投影平面,那么,方向导数其实就是空间曲线沿着它自己在xoy平面的投影直线的变化率。正如$mathrm{d}y / mathrm{d}x$表示二维平面中一条曲线在某一点沿着$x$轴的变化速率(也就是切线的斜率)一样。
所以,方向导数的公式可可转换成
其中角$ heta$是直线$ell$和$x$轴的夹角。那么,方向导数在$ell$指向何方的时候取得最大值呢?
设
是方向$ell$上的单位向量,则方向导数可以写成:
其中$varphi$角是投影直线$$ell和梯度的夹角,不难得出,当$varphi$角为$0$时,方向导数取得最大值,换句话说,当方向导数和梯度同向时,变化率最大。
方向导数的最大值即是梯度:
等高线与梯度
对于三维空间曲面来说,等高线就是平行于$xoy$平面和曲面图形交线在$xoy$平面的投影,例如,下面图形显示的马鞍面的等高线,它的等高线每一组都是双曲线。
当采用等高线的概念后,等高线和梯度有一个非常有趣的关系,实际上,等高线和梯度方向是互相垂直的,以三维曲面等高线为例,推导如下:
等高线方程为:
则,该曲线在$xoy$平面上的投影是一条曲线,在$xoy$平面上该曲线的方程为:
曲线上一点$P$的斜率,根据隐函数求导公式,两边对$x$求导:
而梯度向量定义为:
梯度方向斜率为:
所以,梯度方向和等高线切线方向垂直。
泰勒级数与梯度
数学中,泰勒公式是一个用函数在某点的信息描述其附近取值的公式。如果函数足够平滑的话,在已知函数在某一点的各阶导数值的情况之下,泰勒公式可以用这些导数值做系数构建一个多项式来近似函数在这一点的邻域中的值,即泰勒级数在某一邻域内去无限接近该函数的一个公式。
这里引入泰勒级数的目的是为了证明极值点的导数问题,高阶函数一般要使用到矩阵论的海森矩阵相关知识,这里不引入那么深的概念,但是基本的矩阵知识还是需要的。
我们只保留前三项:$f(x_k + delta) approx f(x_k) + f'(x_k)delta + frac{1}{2}f''(x_k)delta^2$
之前提到了一阶导数是极值点,现在解释为什么会是这样:上面的$delta$是指很小的步长,当$delta > 0$时说明$x$向右走,当$delta < 0$时说明$x$向左走,学过高等数学极限的应该有这个概念。
现在我们通过泰勒级数只考虑上面公式的前两项$f(x_k + delta) approx f(x_k) + f'(x_k)delta$ 来解释为什么极值点处的一阶导数为$0$:
假如$x_k$这一点的函数值$f(X_k)$为极值点,可以是极小值或者极大值(这里以极大值点为例)。因为此时的f(x_k)为极大值,则无论$delta > 0$还是$delta < 0$,都有$f(x_k pm delta) < f(x_k)$,那么上面的公式想要成立,只能让$f'(x_k) = 0$才能成立,极小值同理。
无需画图,从泰勒级数就可以说明极值点的一阶导数一定为$0$,那么一阶导数为零的点不一定是极值点怎么证明呢?使用三项即可证明一阶导数为零不一定是极值点:$f(x_k + delta) approx f(x_k) + f'(x_k)delta + frac{1}{2}f''(x_k)delta^2$ 中,如果$f'(x_k) = 0$,那么公式可写成这样:$f(x_k) + delta approx f(x_k) + frac{1}{2}f''(x_k)delta^2$。从上式可以看到如果在$f'(x_k) = 0$时假如$f(x_k)$为极大值,理应说无论$delta > 0$还是$delta < 0$,都有$f(x_k pm delta) < f(x_k)$。但是此时如果$f''(x_k) > 0$,则$f''(x_k)delta^2 > 0$所以$f(x_k pm delta) > f(x_k)$,即证得$f(x_k)$不是极大值点,那如何才能判断是极值点呢?
此时需要借助二阶导数,上面如果$f''(x_k) < 0$,则$f(x_k)$为极大值点,所以才有一阶导数等于零,二阶导数小于零为极大值点,如果二阶导数大于零则为极小值点。如果二阶导数等于$0$怎么办?那就继续判断三阶导数就可以了。
这是在标量的情况下的极值问题,如果$x$是向量怎么处理呢?还是引入泰勒公式就可以了。只是不一样的是都是向量了。
我们知道机器学习中的变量都很多,一般都使用向量进行表示(此时为列向量)且为多元函数,求导和标量一样的,只是现在是求偏导了:
$mathbf{f(x_k+ delta)} approx mathbf{f(x_k)} + mathbf{f'(x_k)}^Tmathbf{delta} + frac{1}{2}mathbf{f''(x_k)delta^2}$
上面的公式$mathbf{f(x_k)}, mathbf{delta}, mathbf{f'(x_k)}^T, mathbf{f''(x_k)}$都是向量,例如一阶偏导$mathbf{f'(x_k)}$应该是这样的:$$frac{partial f(mathbf{x})}{partial mathbf{x}} = left[egin{array}{c} frac{partial f(mathbf{x})}{partial x_1} \ vdots \ frac{partial f(mathbf{x})}{partial x_n} end{array} ight]$$
因为是向量,所以有大小有方向了,大家注意到了没有此时的$mathbf{f'(x_k)}^T$为行向量了,因为转置了,因此和$mathbf{delta}$相乘是內积,此时我们也只看前两项即:$mathbf{f(x_k+ delta)} approx mathbf{f(x_k)} + mathbf{f'(x_k)}^Tmathbf{delta}$。现在重点来了啊,为了每次$x$前进的方向是使函数$mathbf{f(x_k)}$增长最快,应该怎样选取前进方向的步伐(即向量$mathbf{delta}$)才能保证呢?显然,$mathbf{delta}$直接影响着$mathbf{f'(x_k)^Tdelta}$,而$mathbf{f(x_x + delta)}$的值由$mathbf{f(x_k)}$、$mathbf{f'(x_k)^Tdelta}$决定,然而$mathbf{f(x_k)}$是确定的,所以使$mathbf{f'(x_k)^Tdelta}$最大即可。
而该式就是向量的內积,根据向量內积的性质可知,只要使$mathbf{delta}$取的向量和$mathbf{f'(x_k)}$共线就可以了:如果共线同向则取最大方向,反向取最小小方向。因此直接使$mathbf{delta} = mathbf{f'(x_k)}$即可,即保证方向共线就可以了,至于值得大小可以乘一个标量,现在我们找到了这个向量,而这个向量就是多元函数的一阶偏导数,这时候就定义,多元函数的一阶偏导数为梯度,符号为$ abla f(x_0 + y_ 0)$,数学上的梯度就是这么来的,此时就可以写成这样了:
$mathbf{f(x_k + delta)} approx mathbf{f(x_k) + abla^Tf(x_k)delta + frac{1}{2}delta^T abla^2f(x_k)delta}$。
总结来说,梯度是为了寻找极值而生的,而且是极大值,因此梯度总是指向函数增长最快的方向,这就是本质原因了,但是我们常听的是梯度下降,梯度方向取反即下降最快的,共线反向取极小值就这个道理。
梯度的知识点难在理解上,梯度不是标量,是向量,有方向有大小,一般我们不是很关心大小,因为可以通过标量放大或者缩小,重要的是方向问题。因为只要确定增长最快的方向,才能最快找到极值点,这也是很多算法使用梯度优化算法的原因,当然是梯度的反方向。
斜率与梯度
斜率的方向对应曲线上某一点的切线,梯度的方向对应曲面上某一点切面的法线。
一维的斜率针对的二维的线,
二维的梯度针对的三维的面,
这里的一维、二维对应的是自变量的个数,而斜率、梯度这些其实就是我们对函数的预测,预测建立在比函数高一维的维度。
梯度检测
概述
当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误(比如难以发现的bug),虽然在训练过程中,代价函数在变小,但最终的结果可能并不是最优解。
所以我们采用一种叫梯度检测的思想,它可以通过估计梯度(或导数)的近似值来估算我们的梯度下降算法算出的梯度(或导数)是否为正确的。
原理
梯度检测会估计梯度(或导数)值,然后和你程序计算出来的梯度(导数)的值进行对比,以判断程序算出的梯度(导数)值是否正确。
上图中,我们关注$ heta_0$点的函数的导数,即$ heta_0$点切线(图中蓝线)的斜率,现在我们$ heta_0 - epsilon$ 和 $ heta_0 + epsilon$两点间连一条线(图中红线),我们发现红线的斜率和蓝线斜率很相似。
红线的斜率可以用以下式子表示:$frac{J( heta_0 + epsilon)-J( heta_0 - epsilon)}{2epsilon}$。实际上,这个式子很好地表示了$ heta_0$点导数的近似值。
在实际的应用中,$ heta$往往是一个向量,梯度下降算法要求我们对向量中的每一个分量进行偏导数的计算,对于偏导数,我们同样可以用以下式子进行近似计算:
$frac{J( heta_1 + epsilon, heta_2, heta_3, dots , heta_n) - J( heta_1 - epsilon, heta_2, heta_3, dots , heta_n)}{2epsilon}$
上式很好地估计了损失函数对$ heta_1$的偏导数。
梯度下降法
既然在变量空间的某一点处,函数沿梯度方向具有最大的变化率,那么在优化目标函数的时候,自然是沿着负梯度方向去减小函数值,以此达到我们的优化目标。如何沿着负梯度方向减小函数值呢?既然梯度是偏导数的集合,如下:
同时梯度和偏导数都是向量,那么参考向量运算法则,我们在每个变量轴上减小对应变量值即可,梯度下降法可以描述如下:
以上就是梯度下降法的由来,大部分的机器学习任务,都可以利用Gradient Descent来进行优化。
详解梯度下降法请点击机器学习优化算法。
参考资料:
https://blog.csdn.net/walilk/article/details/50978864
https://blog.csdn.net/weixin_42398658/article/details/83017995
https://blog.csdn.net/tugouxp/article/details/109156764
https://www.cnblogs.com/umbrellalalalala/p/9012676.html