![深度学习从0到1](https://wfqqreader-1252317822.image.myqcloud.com/cover/588/39479588/b_39479588.jpg)
4.3 梯度下降法
4.3.1 梯度下降法介绍
在求解机器学习算法的模型参数时,梯度下降法(Gradient Descent)是最常用的方法之一。在学习梯度下降法之前,我们先来了解一下导数(Derivative)、偏导数(Partial Derivative)、方向导数(Directional Derivative)和梯度(Gradient)的概念。
导数——导数的概念如图4.1所示。
![](https://epubservercos.yuewen.com/3560BA/20637463908664506/epubprivate/OEBPS/Images/41193_69_2.jpg?sign=1739222376-OA3oybohO5eaSquqFj2iVjwO1dQWrAen-0-c4afec92521322d1cd703e4484edac7f)
图4.1 导数
导数的定义如下:
![](https://epubservercos.yuewen.com/3560BA/20637463908664506/epubprivate/OEBPS/Images/41193_70_1.jpg?sign=1739222376-kYggBlVTnc0uBGC1uA1x47ee4eBYfchv-0-a04e3c2703d227a09247f33bfc7d5c10)
(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轴正方向是趋向于减小的。
偏导数——偏导数的定义如下:
![](https://epubservercos.yuewen.com/3560BA/20637463908664506/epubprivate/OEBPS/Images/41193_70_3.jpg?sign=1739222376-qEunqJc50v6FZwd5karCpidvYm7OYjWT-0-e2fba537744f070bf2af0e2154588980)
从式(4.3)和式(4.4)可以看到,导数与偏导数的本质是一致的,都是当自变量的变化量趋近于0时,函数值的变化量与自变量的变化量的比值的极限。直观地说,偏导数也就是函数在某一点上沿坐标轴正方向的变化率。
导数与偏导数的区别在于:导数,指的是在一元函数中,函数y=f(x)在某一点处沿x轴正方向的变化率;偏导数,指的是在多元函数中,函数y=f(x0,x1,…,xn)在某一点处沿某一坐标轴(x0,x1,…,xn)正方向的变化率。
方向导数——方向导数的定义如下:
![](https://epubservercos.yuewen.com/3560BA/20637463908664506/epubprivate/OEBPS/Images/41193_70_4.jpg?sign=1739222376-oxCMLiuqbzVA8bxKd7ulWORjLoZOEZq8-0-77a9c68685fd45eb187e6649260d5b0c)
其中,;l表示某个方向。
在前面导数和偏导数的定义中,均是沿坐标轴正方向讨论函数的变化率。那么当我们讨论函数沿任意方向的变化率时,也就引出了方向导数的定义,即某一点在某一趋近方向上的导数值。
通俗的解释是:我们不仅要知道函数在坐标轴正方向上的变化率(偏导数),而且还要设法求得函数在其他特定方向上的变化率。而方向导数就是函数在其他特定方向上的变化率。
梯度——梯度的定义如下:
![](https://epubservercos.yuewen.com/3560BA/20637463908664506/epubprivate/OEBPS/Images/41193_70_6.jpg?sign=1739222376-yaX8uwSML19I6BeGAw1coHiNhugfcOkG-0-7e9f8860813bad63c9e70f40bb27bc6a)
对于f(x0,…,xi,…,xn)上的某一点来说,其存在很多个方向导数,梯度的方向是函数f(x0,…,xi,…,xn)在某一点增长最快的方向,梯度的模则是该点上方向导数的最大值,梯度的模等于:
![](https://epubservercos.yuewen.com/3560BA/20637463908664506/epubprivate/OEBPS/Images/41193_71_1.jpg?sign=1739222376-vNYbXzf4lm3A9YwPzbKIhDWflJB0271y-0-2cb2c6b4cf79ac7afeb95e6b72088d15)
这里注意3点:
(1)梯度是一个向量,既有方向,又有大小;
(2)梯度的方向是最大方向导数的方向;
(3)梯度的值是最大方向导数的值。
梯度下降法——既然在变量空间的某一点处,函数沿梯度方向具有最大的变化率,那么在优化代价函数的时候,就可以沿着负梯度方向去减小代价函数的值。计算过程可以描述如下。
![](https://epubservercos.yuewen.com/3560BA/20637463908664506/epubprivate/OEBPS/Images/41193_71_2.jpg?sign=1739222376-uBHIvuIDzhCnD4NrnHnlHmpswTtxkn8o-0-8bbbbebb092ae5a2d0eb8a1715968611)
(1)Repeat表示不断重复;
(2)表示参数调整;
(3)η表示学习率。
4.3.2 梯度下降法二维例子
4.2节中我们已经知道了代价函数的定义,代价函数的值越小,说明模型的预测值越接近真实标签的值。代价函数中的预测值y是跟神经网络中的参数w和b相关的。我们可以先考虑一个简单的情况,假如神经网络只有一个参数w,参数w与代价函数loss的关系如图4.2所示。
![](https://epubservercos.yuewen.com/3560BA/20637463908664506/epubprivate/OEBPS/Images/41193_71_4.jpg?sign=1739222376-x6V1ajfHlLcnEpoxlZ3rsLp8ap9wfsJB-0-5429af33f5a65e560fb0c0e584e35649)
图4.2 参数w与代价函数loss的关系
假设w的初始值是-3,我们需要使用梯度下降法来不断优化w的取值,使得loss不断减少。首先我们应该先计算w=-3时的梯度,如图4.3所示。
![](https://epubservercos.yuewen.com/3560BA/20637463908664506/epubprivate/OEBPS/Images/41193_72_1.jpg?sign=1739222376-JKmNrb0HtUfPs7QTPk3rN5XMg3g85zAL-0-7490b489daf3293e03df9281b53e6ebf)
图4.3 w为-3时的梯度
从图4.3中我们可以看出,当w为-3时,w所处位置的梯度应该是一个负数,梯度下降法在优化代价函数的时候,是沿着负梯度方向去减小代价函数的值的,所以负梯度是一个正数,w的值应该变大。根据梯度下降法的优化公式:
![](https://epubservercos.yuewen.com/3560BA/20637463908664506/epubprivate/OEBPS/Images/41193_72_2.jpg?sign=1739222376-TojTi4g3ZgeUhXKdXxBCPPLIRijeGn8j-0-4510af59a1f81bb49a0f37c080224c63)
学习率η一般是一个大于0的数,为负数,我们可以判断出w的值会变大。变大的数值跟学习率η有关,也跟函数f在w处的梯度大小有关。
假设w变大移动到了w=2的位置,我们需要再次计算w=2时的梯度,如图4.4所示。
![](https://epubservercos.yuewen.com/3560BA/20637463908664506/epubprivate/OEBPS/Images/41193_72_4.jpg?sign=1739222376-Qr1P7G5iZlV4eKPCOvSsqNKnjpaLrx9h-0-2764a09bd15fdc2a2164ce8b92b4df5a)
图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所示。
![](https://epubservercos.yuewen.com/3560BA/20637463908664506/epubprivate/OEBPS/Images/41193_73_1.jpg?sign=1739222376-hnSjMellSDEcefOzh7lKjdNCsluF6XPl-0-f234ed43cf9f83f4444ea003f37d053a)
图4.5 w1和w2与代价函数loss的关系
我们在图中随机选取w1和w2的初始值p1和p2,然后从p1和p2这两个初始位置开始使用梯度下降法优化网络参数,得到如图4.6所示的结果。
![](https://epubservercos.yuewen.com/3560BA/20637463908664506/epubprivate/OEBPS/Images/41193_73_2.jpg?sign=1739222376-As7M0MU4rD6r1nHvDe9le01wmoSptBuL-0-a2d20525a896eb83d7684c2cade22848)
图4.6 从p1和p2初始点开始优化网络
从图4.6中可以看到网络参数的优化过程其实就是p1和p2两个“小球“从初始点开始,每次移动一步,不断向坡底进行移动。在这个过程中,整个网络的Loss是在不断变小的。
同时我们还可以观察到一个现象,p1“小球“最后走到了图4.6中的全局最小值(Global Minimum),而p2“小球”最后走到的位置是一个局部极小值(Local Minimum)。说明我们在使用梯度下降法的时候,不同的初始值的选取可能会影响最后的结果,有些时候我们可以得到Loss的全局最小值,或者称为全局最优解。而有些时候,我们得到的结果可能是Loss的局部极小值,或者称为局部最优解。不同的权值初始值会得到不同的结果,这算是梯度下降法存在的一个缺点。
但大家不用太担心这个问题,一般实际模型训练的时候,局部极小值的情况不常出现。如果我们担心模型得到的结果是局部极小值,则可以让模型多训练几次,然后取最好的那一次的结果作为模型的最终结果就可以了。