梯度下降法和牛顿法都是优化方法。
梯度下降法
梯度下降法和相关知识可以参考导数、偏导数、梯度、方向导数、梯度下降、二阶导数、二阶方向导数一文。梯度下降法是一种迭代地每次沿着与梯度相反方向前进的不断降低损失函数的优化方法。梯度下降只用到一阶导数的信息,没有参考二阶导数的信息。
当自变量有多维时,如果某点二阶导数矩阵的最大特征值和最小特征值差别较大(二阶导数的信息),也就是说在一个自变量维度上一阶导数下降的很快,另一个自变量维度上一阶导数下降的很慢,慢的那个维度会拖累快的维度,导致整体迭代速度较慢。并且此时学习率设置的较小才会避免迭代过程中在二阶导大的方向不经过最低点而跳到对向这样来回跳动,但是此时学习率较小同时会导致在二阶导小的方向迭代较慢。在这种情况下,选择一个好的学习率是一件比较困难的事情。
如下图所示,(1,1)方向是二阶导最大的方向(最陡),(1,-1)方向是二阶导最小的方向(最缓),红色的线是梯度下降的路线,可以看到路线在(1,1)方向反复来回跳动(不断跳到对向)。梯度下降在这种情况下的表现有瑕疵。
牛顿法
牛顿法既参考了一阶导数的信息,也参考了二阶导数的信息。在理解牛顿法之前,可以参考驻点以及二阶导对驻点的判断一文。
牛顿法先在某点进行二阶泰勒展开,用二次函数近似表示原函数。
然后求这个二次函数的驻点:
到就是一次迭代。
如果原函数就是二次函数,那么牛顿法直接就找到了原函数驻点,停止迭代。如果原函数不是二次函数,那么需要使用二阶泰勒展开每次迭代到达近似二次函数的驻点,直至到达原函数驻点。
深度学习下的损失函数
在深度学习中,损失函数往往是高维的。
维度越高,最小值点出现的概率越来越低,鞍点出现的概率越来越高(呈指数级增大)。这和投硬币是一样的道理,在二维情况下,二阶导数矩阵的两个特征值都为正的概率(最小值点出现的概率)是1/4,在三维情况下,二阶导矩阵的三个特征值都为正的概率(最小值点出现的概率)是1/8,等等......。在高维情况下,因为鞍点多,牛顿法有很大的概率会停在鞍点上。
并且在高维情况下,的特征值都为正的情况更有可能出现在损失函数低的地方,也就是说最小值点更有可能出现在损失函数低的地方,鞍点更有可能出现在损失函数高的地方。所以在高维情况下牛顿法不仅有很大的概率会停在鞍点上,并且这些鞍点还对应着较高的损失函数。
在高维的情况下,梯度下降法比牛顿法会取得更好的优化效果。因为梯度下降不断迭代寻找使得损失函数很低的点,而牛顿法不断迭代停留在某一驻点上(大概率是对应较高损失函数的鞍点)。
梯度下降法和牛顿法的对比
梯度下降法 | 牛顿法 | |
理念 | 不断迭代使损失函数下降,寻找损失函数值较低的点 | 不断迭代进行二阶泰勒近似,寻找驻点 |
优点 | 基本不会停留在鞍点 | 速度较快 |
缺点 | 速度较慢,需要选择合适的学习率 | 会停留在鞍点(损失函数较高) |
如果有不正确的地方,欢迎各位大佬留言呀~