什么是梯度下降法?
梯度下降法简单来说就是一种寻找目标函数最小化的方法。
在深度学习中,经常有人会拿下面这幅图来比较各种优化算法的性质,包括传统的 SGD,Momentum SGD,AdaGrad,RMSProp 和 Adam 等。不过光看图可能无法理解其中的精妙之处,本文将会从数学的基础知识出发,初步介绍深度学习中的一些优化算法,最后进行一些简单的案例分析。
数学基础知识回顾
一元函数的导数与 Taylor 级数
在微积分中,函数 在点
上的导数定义为:
它在几何上指的就是函数
在
上的切线方向。
通常来说,为了计算某个函数 的最大值或者最小值,通常都会计算它的导数
,然后求解方程
就可以得到函数的临界点,进一步判断这些临界点是否是最大值或者最小值。但是临界点并不一定是全局最大值或者全局最小值,甚至不是局部的最大值或者局部最小值。
例如:函数 ,它的导数是
,因此
是它的临界点。但
则不是这个函数的局部最大值或者局部最小值点,因为
且
。
从 Taylor 级数的角度来看, 在
附近的 Taylor 级数是
对于临界点 而言,它满足条件
。当
时,可以得到
是
的局部最小值;当
时,可以得到
是
的局部最大值。而对于上面的例子
而言,临界点
的二阶导数则是
,因此使用上面的方法则无法判断临界点
是否是局部极值。
多元函数的梯度和 Taylor 级数
对于多元函数 而言,同样可以计算它们的“导数”,也就是偏导数和梯度,i.e. 它的梯度可以定义为:
而多元函数 在点
上的 Taylor 级数是:
其中 表示 Hessian 矩阵。如果
是临界点,并且 Hessian 矩阵是正定矩阵的时候,
在
处达到局部极小值。
梯度下降法
从数学上的角度来看,梯度的方向是函数增长速度最快的方向,那么梯度的反方向就是函数减少最快的方向。那么,如果想计算一个函数的最小值,就可以使用梯度下降法的思想来做。假设希望求解目标函数 的最小值,可以从一个初始点
开始,基于学习率
构建一个迭代过程:当
时,
其中 ,一旦达到收敛条件的话,迭代就结束。从梯度下降法的迭代公式来看,下一个点的选择与当前点的位置和它的梯度相关。反之,如果要计算函数
的最大值,沿着梯度的反方向前进即可,也就是说:
其中 。整体来看,无论是计算函数的最大值或者最小值,都需要构建一个迭代关系
,那就是:
也就是说对于所有的 ,都满足迭代关系
。所以,在以上的两个方法中,我们可以写出函数
的表达式为:
深度学习中的优化算法
在本文中,假设 是每个样本的损失函数,
表示一个关于输入
和参数
的函数,并且
表示
所对应的目标值。
案例分析
案例1:
针对这个函数 而言,从数学上我们可以轻易地得到最小值点就是
。不过在这里我们可以验证随机梯度下降法的效果。首先计算函数
的梯度为:
其次,给定一个随机的初始点 ,通过梯度可以得到迭代公式为:
其中 表示学习率,
表示迭代次数。因此,可以计算出具体的公式为:
于是可以得到:
意思就是说,使用随机梯度下降法我们可以得到函数 的最小值是
。
案例2:
不过,随机梯度下降法也有着自身的局限性。针对很多高维非凸函数而言,鞍点的数量其实远远大于局部极小值(极大值)的数量。因此,如何快速的逃离鞍点就是深度学习中大家所研究的问题之一。而比较简单的鞍点就是马鞍面函数 中的
点。而函数
在
上并没有最小值,因为
。 同时,函数
的偏导数是:
而 在点
上则满足以下几个性质:
也就是说, 这一点的 Hessian 矩阵并不是正定矩阵。
随机梯度下降法:如果初始点是 ,那么随机梯度下降法(SGD)就可以写成:对于所有的
,有
其中 是学习率。
使用动量的随机梯度下降法:如果初始点是 ,初始速度是
,学习率是
,动量参数是
,那么使用动量的随机梯度下降法就可以写成:
,
AdaGrad 算法:如果初始点是 ,学习率是
,
是小常数,那么 AdaGrad 算法就可以写成:
,
其中 是学习率,
是一个小常数。
Case 1:
当 时,如果使用随机梯度下降法,就可以得到
,
因此, 。 通过随机梯度下降法(SGD)在初始值为
的前提下并不能计算出函数
的最小值,而是会停止在
鞍点这个地方,最终无法逃离鞍点。
同理,如果使用基于动量的 SGD 算法,就要看初始速度的设置了,如果初始的速度为 ,那么最终都会收敛到
这个点上。不过,如果
,那么就可以在一定次数的迭代之后逃离
。
根据同样的分析思路,在本文中所写的 AdaGrad,RMSProp,Adam 算法中,如果初始点是 并且算法参数都是默认的话,使用这些方法同样无法逃离鞍点
,也就是说最终都会收敛到
上。
Case 2:
在这种情况下,可以考虑在 的基础上给纵坐标加上一个微小的扰动。不妨假设初始点为
。下面计算各个算法在这个初始值下的收敛效果。在实际的应用中,需要迭代的次数越少越好。于是,通过计算
的值,就可以进一步判断哪个算法(SGD,Momentum SGD,AdaGrad,RMSProp,Adam)更加容易逃离鞍点。
随机梯度下降法:通常情况下, 可以设置为
。从随机梯度下降法的公式来看,就可以得到如下迭代公式:
其实, ,i.e. 使用梯度下降法同样可以找到函数
的最小值。但是,如果
,则
需要满足条件:
换言之,需要迭代 次左右才能够使得
。
AdaGrad 算法:通常来说,在 AdaGrad 算法中,算法的参数默认值是 和
。由于初始值
,所以计算可以得到:
最后通过写程序就可以证明,在 AdaGrad 的默认参数下,只需要 次左右的迭代就可以实现
。
RMSProp 算法:
在这种情况下,为了简单起见,可以令衰减速率 ,那么同样可以写出迭代公式为:
,有
在 RMSProp 里面,一般来说小常数 ,
。通过直接计算可以知道,在这种情况和参数设置下,在迭代了
轮左右的时候,就会出现
的情况。
整体来说,在初始值为 的情况下,无论是 SGD,Momentum SGD,AdaGrad 算法,还是 RMSProp 算法,都会逃离鞍点
。只不过 AdaGrad 和 RMSProp 算法的逃离速度比 SGD 快了许多。