4.3 梯度下降法
4.3.1 梯度下降法介绍
在求解机器学习算法的模型参数时,梯度下降法(Gradient Descent)是最常用的方法之一。在学习梯度下降法之前,我们先来了解一下导数(Derivative)、偏导数(Partial Derivative)、方向导数(Directional Derivative)和梯度(Gradient)的概念。
导数——导数的概念如图4.1所示。
图4.1 导数
导数的定义如下:
(1)f′(x0)表示函数f在x0处的导数;
(2)Δx表示x的变化量;
(3)Δy:f(x0+Δx)-f(x0)表示函数的增量;
(4)表示Δx趋近于0;
(5)dx表示x的变化量Δx趋近于0;
(6)dy表示f′(x0)dx。
总的来说,f′(x0)反映的是函数y=f(x)在x轴上的某一点处沿x轴正方向的变化率/变化趋势。也就是在x轴上的某一点,如果f'(x)>0,说明f(x)的函数值在x点沿x轴正方向是趋向于增加的;如果f'(x)<0,说明f(x)的函数值在x点沿x轴正方向是趋向于减小的。
偏导数——偏导数的定义如下:
从式(4.3)和式(4.4)可以看到,导数与偏导数的本质是一致的,都是当自变量的变化量趋近于0时,函数值的变化量与自变量的变化量的比值的极限。直观地说,偏导数也就是函数在某一点上沿坐标轴正方向的变化率。
导数与偏导数的区别在于:导数,指的是在一元函数中,函数y=f(x)在某一点处沿x轴正方向的变化率;偏导数,指的是在多元函数中,函数y=f(x0,x1,…,xn)在某一点处沿某一坐标轴(x0,x1,…,xn)正方向的变化率。
方向导数——方向导数的定义如下:
其中,;l表示某个方向。
在前面导数和偏导数的定义中,均是沿坐标轴正方向讨论函数的变化率。那么当我们讨论函数沿任意方向的变化率时,也就引出了方向导数的定义,即某一点在某一趋近方向上的导数值。
通俗的解释是:我们不仅要知道函数在坐标轴正方向上的变化率(偏导数),而且还要设法求得函数在其他特定方向上的变化率。而方向导数就是函数在其他特定方向上的变化率。
梯度——梯度的定义如下:
对于f(x0,…,xi,…,xn)上的某一点来说,其存在很多个方向导数,梯度的方向是函数f(x0,…,xi,…,xn)在某一点增长最快的方向,梯度的模则是该点上方向导数的最大值,梯度的模等于:
这里注意3点:
(1)梯度是一个向量,既有方向,又有大小;
(2)梯度的方向是最大方向导数的方向;
(3)梯度的值是最大方向导数的值。
梯度下降法——既然在变量空间的某一点处,函数沿梯度方向具有最大的变化率,那么在优化代价函数的时候,就可以沿着负梯度方向去减小代价函数的值。计算过程可以描述如下。
(1)Repeat表示不断重复;
(2)表示参数调整;
(3)η表示学习率。
4.3.2 梯度下降法二维例子
4.2节中我们已经知道了代价函数的定义,代价函数的值越小,说明模型的预测值越接近真实标签的值。代价函数中的预测值y是跟神经网络中的参数w和b相关的。我们可以先考虑一个简单的情况,假如神经网络只有一个参数w,参数w与代价函数loss的关系如图4.2所示。
图4.2 参数w与代价函数loss的关系
假设w的初始值是-3,我们需要使用梯度下降法来不断优化w的取值,使得loss不断减少。首先我们应该先计算w=-3时的梯度,如图4.3所示。
图4.3 w为-3时的梯度
从图4.3中我们可以看出,当w为-3时,w所处位置的梯度应该是一个负数,梯度下降法在优化代价函数的时候,是沿着负梯度方向去减小代价函数的值的,所以负梯度是一个正数,w的值应该变大。根据梯度下降法的优化公式:
学习率η一般是一个大于0的数,为负数,我们可以判断出w的值会变大。变大的数值跟学习率η有关,也跟函数f在w处的梯度大小有关。
假设w变大移动到了w=2的位置,我们需要再次计算w=2时的梯度,如图4.4所示。
图4.4 w为2时的梯度
从图4.4中我们可以看出,当w为2时,w所处位置的梯度应该是一个正数,梯度下降法在优化代价函数的时候,是沿着负梯度方向去减小代价函数的值的,所以负梯度是一个负数,w的值应该变小。
学习率η一般是一个大于0的数,为正数,我们可以判断出w的值会变小。变小的数值跟学习率η有关,也跟函数f在w处的梯度大小有关。
从图4.3和图4.4中我们可以发现,不管w处于哪一个位置,当w向着负梯度的方向进行移动时,实际上就是向着可以使loss减小的方向进行移动。这就有点类似一个小球在山坡上面,它总是往坡底的方向进行移动,只不过它每一次是移动一步,这个步子的大小会受到学习率和所处位置梯度的大小所影响。
4.3.3 梯度下降法三维例子
我们可以再考虑一个稍微复杂一点的情况,假如神经网络有两个参数w1和w2,参数w1和w2与代价函数loss的关系如图4.5所示。
图4.5 w1和w2与代价函数loss的关系
我们在图中随机选取w1和w2的初始值p1和p2,然后从p1和p2这两个初始位置开始使用梯度下降法优化网络参数,得到如图4.6所示的结果。
图4.6 从p1和p2初始点开始优化网络
从图4.6中可以看到网络参数的优化过程其实就是p1和p2两个“小球“从初始点开始,每次移动一步,不断向坡底进行移动。在这个过程中,整个网络的Loss是在不断变小的。
同时我们还可以观察到一个现象,p1“小球“最后走到了图4.6中的全局最小值(Global Minimum),而p2“小球”最后走到的位置是一个局部极小值(Local Minimum)。说明我们在使用梯度下降法的时候,不同的初始值的选取可能会影响最后的结果,有些时候我们可以得到Loss的全局最小值,或者称为全局最优解。而有些时候,我们得到的结果可能是Loss的局部极小值,或者称为局部最优解。不同的权值初始值会得到不同的结果,这算是梯度下降法存在的一个缺点。
但大家不用太担心这个问题,一般实际模型训练的时候,局部极小值的情况不常出现。如果我们担心模型得到的结果是局部极小值,则可以让模型多训练几次,然后取最好的那一次的结果作为模型的最终结果就可以了。