梯度下降法、牛顿法、拟牛顿法 三类迭代法应用场景有何差别?

本文探讨了梯度下降法、牛顿法和拟牛顿法在机器学习中的应用场景差异。梯度下降法常用于神经网络训练,特别是非凸问题;牛顿法和拟牛顿法适用于凸问题如逻辑回归,其中牛顿法利用二阶导数信息,拟牛顿法通过近似海森矩阵实现。时间复杂度和收敛速度的差异源于求解方法的不同。
摘要由CSDN通过智能技术生成
梯度下降法、牛顿法、拟牛顿法 三类迭代法应用场景有何差别?

By Datawhale知乎内容输出小组D1

问题

梯度下降法一族(如SGD、Adam)、牛顿法一族(如Gauss-Newton Method,LM法)、拟牛顿法一族(如L-BFGS)是机器学习中最常见的三大类迭代法,但三者分别通常擅长解决的应用场景是什么?为什么会这样的呢?谢谢

解答
梯度下降法(SGD为例) 牛顿法 拟牛顿法
时间复杂度(单次迭代) 只需计算1阶导,时间复杂度低,为 O ( n ) O\left( n \right) O(n) 需计算Hessian矩阵及其逆,时间复杂度高,为 O ( n 3 ) O\left( { {n^3}} \right) O(n3) 用正定矩阵近似Hessian矩阵的逆,时间复杂度为 O ( n 2 ) O\left( { {n^2}} \right) O(n2)
收敛速度 收敛慢,迭代次数大 收敛快,迭代次数小 -
初始值要求 无太强要求,容易逃离鞍点 对初始值有一定要求,非凸问题容易陷入鞍点(牛顿法步长会越来越小) -
应用场景 特征维度较大的场景,如特征数>10k 特征维度较小的场景 需满足拟牛顿条件,更适合凸问题

此外,在神经网络(非凸问题)的训练中,大多数都采用梯度下降法一族方法。而在训练逻辑回归(凸问题)等模型时,可采用梯度下降和拟牛顿方法。

关于时间复杂度和收敛速度的差异,起因于求解方法:

机器学习的任务中,是要最小化损失函数 L ( θ ) L\left( \theta \right) L(θ),其中 θ \theta θ 是待求的模型参数。梯度下降法、牛顿法/拟牛顿法都是迭代求解。梯度下降法是梯度求解,而牛顿法/拟牛顿法是用二阶的海森矩阵的逆矩阵或伪逆矩阵求解。

迭代公式 θ t = θ t − 1 + Δ θ {\theta ^t} = {\theta ^{t - 1}} + \Delta \theta θt=θt1+Δθ

求解方法
梯度下降法:一阶泰勒展开
L ( θ t ) = L ( θ t − 1 + Δ θ ) ≈ L ( θ t − 1 ) + L ′ ( θ t − 1 ) Δ θ \begin{aligned} L\left( { {\theta ^t}} \right) &= L\left( { {\theta ^{t - 1}} + \Delta \theta } \right) \\ &\approx L\left( { {\theta ^{t - 1}}} \right) + L'\left( { {\theta ^{t - 1}}} \right)\Delta \theta \end{aligned} L(θt)

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
梯度下降是一种优化算法,用于找到一个函数的最小值。它通过迭代地更新参数的方式来逐步接近最小值。在每次迭代中,梯度下降算法计算函数在当前参数值处的梯度,并将参数值朝着梯度的反方向进行更新,从而使函数值逐渐减小。 缩放梯度下降是梯度下降算法的一种变体,它在更新参数时引入了一个学习率因子。学习率因子可以控制每次更新的步长,从而加快或减慢算法的收敛速度。通过调整学习率因子,可以使算法更快地收敛到最小值,但也可能导致算法无法收敛或收敛到局部最小值。 牛顿法是一种基于二阶导数的优化算法,它通过使用函数的一阶和二阶导数来逼近函数的局部极小值。牛顿法的更新公式为:x_new = x_old - f'(x_old) / f''(x_old),其中f'(x_old)和f''(x_old)分别表示函数在x_old处的一阶和二阶导数。牛顿法通常能够更快地收敛到最小值,但它的计算复杂度较高。 拟牛顿法是对牛顿法的一种改进,它通过近似计算二阶导数来减少计算复杂度。拟牛顿法使用一个称为Hessian矩阵的矩阵来近似二阶导数。常用的拟牛顿法包括DFP算法和BFGS算法。这些算法通过迭代地更新Hessian矩阵来逼近函数的最小值。 以下是一个使用梯度下降算法求解函数最小值的示例代码: ```python def gradient_descent(f, df, x0, learning_rate, num_iterations): x = x0 for i in range(num_iterations): gradient = df(x) x -= learning_rate * gradient return x # 定义函数及其导数 def f(x): return x**2 + 2*x + 1 def df(x): return 2*x + 2 # 设置初始参数和学习率 x0 = 0 learning_rate = 0.1 num_iterations = 100 # 调用梯度下降算法 result = gradient_descent(f, df, x0, learning_rate, num_iterations) print("最小值点:", result) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值