这是困扰我一段时间的事情,而且我在网上找不到任何令人满意的答案,所以这里是:
在复习了一组关于凸优化的讲座之后,牛顿的方法似乎比梯度下降算法更优越,可以找到全局最优解,因为牛顿的方法可以为其求解提供保证,它的仿射不变性,并且大多数收敛于步骤少得多。为什么在机器学习问题中二阶优化算法(例如牛顿法)不如随机梯度下降法那么广泛使用?
这是困扰我一段时间的事情,而且我在网上找不到任何令人满意的答案,所以这里是:
在复习了一组关于凸优化的讲座之后,牛顿的方法似乎比梯度下降算法更优越,可以找到全局最优解,因为牛顿的方法可以为其求解提供保证,它的仿射不变性,并且大多数收敛于步骤少得多。为什么在机器学习问题中二阶优化算法(例如牛顿法)不如随机梯度下降法那么广泛使用?
Answers:
梯度下降使用其导数知识使函数最大化。牛顿法,一种寻根算法,利用其二阶导数的知识来最大化函数。当二阶导数已知且易于计算时(在逻辑回归中使用Newton-Raphson算法),这样做可能会更快。但是,二阶导数的解析表达式通常很复杂或难以处理,需要大量的计算。计算二阶导数的数值方法也需要大量计算-如果需要值来计算一阶导数,则二阶导数需要。N 2
更多的人应该在机器学习中使用牛顿方法*。我说这是一个具有数值优化背景的人,在过去的几年中涉足机器学习。
如果正确使用牛顿法,此处(甚至在文献中)答案中的缺点都不是问题。而且,确实很重要的缺点也会减缓相同或更多数量但通过不太明显的机制进行的梯度下降。
在Wolfe条件下使用线搜索或使用或信任区域可防止收敛到鞍点。适当的梯度下降实现也应该这样做。Cam.Davidson.Pilon的答案引用了该论文,指出了在存在鞍点的情况下“牛顿法”存在的问题,但他们主张的解决方法也是牛顿法。
使用牛顿法不需要构造整个(密集的)Hessian。您可以使用仅使用矩阵向量乘积的迭代方法(例如共轭梯度之类的Krylov方法)将Hessian的逆应用于向量。参见,例如,CG-Steihaug信任区域方法。
您可以通过求解两个形式与已用于计算梯度的伴随方程相同形式的高阶伴随方程,来有效地计算Hessian矩阵向量乘积(例如,神经网络训练中两个反向传播步骤的工作)。
病态条件减慢了迭代线性求解器的收敛速度,但同时也减慢了梯度下降的速度,甚至更慢。使用牛顿法而不是梯度下降法将难度从非线性优化阶段(可以做很多事情来改善这种情况)转移到线性代数阶段(在线性代数阶段,我们可以使用数字线性代数预处理技术的整个库来攻击它)。
同样,计算从“许多便宜的步骤”转变为“一些昂贵的步骤”,从而为子步骤(线性代数)级别的并行化提供了更多机会。
有关这些概念的背景信息,我推荐Nocedal和Wright 撰写的《数值优化》一书。
*当然,牛顿的方法对L1或其他类似的压缩感测/稀疏度提升惩罚函数没有帮助,因为它们缺乏所需的平滑度。
我本人最近才学到这一点-问题是牛顿方法要收敛到的高维空间中鞍点的扩散。请参阅本文:在高维非凸优化中识别和解决鞍点问题。
实际上,鞍点数与局部最小值的比值随维度N呈指数增长。
当通过遵循负曲率方向将梯度下降动力学从鞍点推开以降低误差时,...牛顿法不能适当地处理鞍点;如下所述,鞍点在牛顿动力学下变得有吸引力。
结合两个原因:
相反,梯度下降法不会导致鞍点。在鞍点处,渐变为零,但是从上面的渐变中可以看到,稍微跨出一步就会使优化无法进行-y变量上的渐变为负。
您问了两个问题:为什么没有更多的人使用牛顿法,为什么有那么多的人使用随机梯度下降法?这些问题有不同的答案,因为有许多算法可以减轻牛顿方法的计算负担,但通常比SGD更好。
计算。因此,在计算Hessian的成本很高时,将其求逆或求解最小二乘通常会更糟。(如果您具有稀疏的功能,则渐近看上去更好,但是其他方法也可以更好地执行,因此稀疏性不会使牛顿相对更具吸引力。)
其次,许多方法不仅是梯度下降法,而且比牛顿法更常用。它们通常是Newton方法的简化版本,从某种意义上说,它们以较低的每步计算成本来近似Newton步骤,但需要更多的迭代才能收敛。一些例子:
当您根本不想处理近似二阶导数时,梯度下降法很有吸引力,因为它仅使用一阶信息。当学习率乘以单位矩阵时,梯度下降就隐式近似了逆Hessian。我个人很少使用梯度下降法:L-BFGS易于实现,因为它只需要指定目标函数和梯度即可。它具有比梯度下降更好的逆Hessian近似值;并且由于梯度下降需要调整学习率。
有时,您有大量的观测值(数据点),但是您从较少的观测值中也可以学到很多。在这种情况下,您可以使用“分批方法”,例如随机梯度下降,通过使用观测的子集来循环。
梯度下降方向的计算成本较低,并且在该方向上进行线搜索是朝最佳方向发展的更可靠,稳定的来源。简而言之,梯度下降相对可靠。
牛顿法相对昂贵,因为您需要在第一次迭代时计算Hessian。然后,在每个后续迭代中,您可以完全重新计算Hessian(如在牛顿方法中),或仅“更新”先前迭代的Hessian(在拟牛顿方法中),这种方法便宜但不那么可靠。
在行为特别良好的函数的极端情况下,尤其是二次函数非常完美的情况下,牛顿方法无疑是赢家。如果是完美的二次方,牛顿方法将在一次迭代中收敛。
在功能非常差的极端情况下,梯度下降往往会胜出。它将选择一个搜索方向,向下搜索该方向,并最终采取小而有效的步骤。相比之下,在这些情况下,牛顿法往往会失败,特别是如果您尝试使用准牛顿逼近。
在梯度下降和牛顿方法之间,有一些方法,例如Levenberg-Marquardt算法(LMA),尽管我已经看到名称有些混淆。要点是,当事物变得混乱和混乱时,应使用更多的梯度下降信息搜索,然后在事物变得更加线性和可靠时,使用更多的牛顿法信息搜索。
关于牛顿法用于SGD的方法有很多困难,尤其是:
它需要Hessian矩阵-如何例如以合理的成本从噪声梯度中以足够的精度进行估算?
完整的Hessian太昂贵了-我们宁愿需要一些限制,例如限制在一个子空间(哪个子空间?),
牛顿法直接以零梯度吸引到闭合点……在这里通常是鞍形。如何排斥他们呢?例如,无鞍牛顿可反转负曲率方向,但需要控制特征值的符号,
最好在网上进行操作-与其在一个点上进行大量计算,不如尝试利用更多本地信息将其拆分为许多小步骤。
我们可以从一阶到二阶进行小步移动,例如,向动量法中添加仅3个平均值的更新,我们可以同时沿其方向MSE拟合抛物线,从而更智能地选择步长...在低维子空间中进行二阶建模,我们仍可以将其余坐标用于同时梯度下降。