机器学习笔记-阻尼牛顿法

前言

  在学习了牛顿法之后,我们了解到牛顿法存在一个致命的问题:牛顿法的搜索方向不一定就是下降方向。这直接可能会导致牛顿法不会收敛。为了解决这个问题,我们主要的改进的方向有两点:

  • 改进使得牛顿法的搜索方向就是其函数值下降的方向。
  • 改进使得牛顿法不是下降方向的搜索方向变成是下降方向的搜索方向。

一、阻尼牛顿法

  阻尼牛顿法就上述改进点中的第二点,为牛顿法沿牛顿方向增加一个一维搜索。
例如,我们知道在经典的牛顿法迭代公式中:

x ( k + 1 ) = x ( k ) + λ d ( k ) x^{(k+1)}=x^{(k)}+\lambda d^{(k)} x(k+1)=x(k)+λd(k)
d ( k ) = − ∇ 2 f ( x ) − 1 ∇ f ( x ) d^{(k)}=-\nabla^{2} f(x)^{-1} \nabla f(x) d(k)=2f(x)1f(x)
  在经典牛顿法中上式中 λ \lambda λ为1, d ( k ) d^{(k)} d(k)为牛顿法的搜索方向。但是这个方向可能不是下降方向,于是可以想到在 λ \lambda λ上进行改进,取 λ \lambda λ为满足下面表达式的。
f ( x ( k ) + λ k d ( k ) ) = min ⁡ λ f ( x ( k ) + λ d ( k ) ) f(x^{(k)}+\lambda_{k}d^{(k)})=\mathop {\min }\limits_\lambda f(x^{(k)}+\lambda d^{(k)}) f(x(k)+λkd(k))=λminf(x(k)+λd(k))
  满足上述为最小值的 λ \lambda λ的值就是阻尼牛顿法的一维搜索步长。所以在阻尼牛顿法中每一次计算搜索方向之后,都需要额外计算一次最优步长 λ k \lambda_{k} λk,然后才能使用迭代公式更新 x k + 1 x_{k+1} xk+1。下面是阻尼牛顿法的计算步骤:

  1. 给定初始点 x ( 1 ) x^{(1)} x(1),允许误差 ε > 0 \varepsilon > 0 ε>0,置 k = 1 k=1 k=1.
  2. 计算 ∇ f ( x ( k ) ) , ∇ 2 f ( x ( k ) ) − 1 \nabla f(x^{(k)}),\nabla^{2}f(x^{(k)})^{-1} f(x(k)),2f(x(k))1.
  3. 如果 ∥ ∇ f ( x ( k ) ) ∥ < ε \left\| {\nabla f({x^{(k)}})} \right\| < \varepsilon f(x(k))<ε,则停止迭代;否则,令:
    d ( k ) = − ∇ 2 f ( x ( k ) ) − 1 ∇ f ( x ( k ) ) d^{(k)}=-\nabla^{2}f(x^{(k)})^{-1}\nabla f(x^{(k)}) d(k)=2f(x(k))1f(x(k))
  4. x ( k ) x^{(k)} x(k)出发,沿着方向 d ( k ) d^{(k)} d(k)作一维搜索,
    min ⁡ λ f ( x ( k ) + λ d ( k ) ) = f ( x ( k ) + λ k d ( k ) ) \mathop {\min }\limits_\lambda f({x^{(k)}} + \lambda {d^{(k)}}) = f({x^{(k)}} + {\lambda _k}{d^{(k)}}) λminf(x(k)+λd(k))=f(x(k)+λkd(k))
    x ( k + 1 ) = x ( k ) + λ k d ( k ) x^{(k+1)}=x^{(k)}+\lambda_{k}d^{(k)} x(k+1)=x(k)+λkd(k).
  5. k : = k + 1 k:= k+1 k:=k+1,转步骤

  从上述的迭代步骤来看,停止迭代是依靠计算停止误差来确定的。由于阻尼牛顿法含有一维搜索,因此每次迭代目标函数值一般有所下降,绝对不会出现上升的情况,并且可以证明,阻尼牛顿法和牛顿法相比肯定会收敛。
  而阻尼牛顿法最重要的改进点就在计算步长 λ k \lambda_{k} λk中,在计算步长的过程中我们可以令其导数等于0,从而找到 λ k \lambda_{k} λk的值。

二、算法实例

计算函数:
f = 4 x 1 2 + 3 x 2 2 − 4 x 1 x 2 + x 1 f=4x^{2}_{1}+3x^{2}_{2}-4x_{1}x_{2}+x_{1} f=4x12+3x224x1x2+x1
的最小值。

% 牛顿法求解二元极值问题
syms x1 x2 a; 
f = 4 * x1^2 + 3 * x2^2 - 4 * x1 * x2 + x1;
% 构造目标函数的f一阶导
fx = diff(f,x1);
fy = diff(f,x2);
gf = [fx,fy]';
% 求Hesse矩阵
fxx = diff(fx,x1);
fxy = diff(fx,x2);
fyx = diff(fy,x1);
fyy = diff(fy,x2);
H = [fxx,fxy;fyx,fyy];
% 初始化
ess = 1e-5; % 精度
x0 = [1,1]; % 初始点
xk = x0'; % 
fk = subs(f,[x1,x2],x0); % 计算初始值
gk = subs(gf,[x1,x2],x0); % 计算初始导数
Hk = subs(H,[x1,x2],x0); % 计算初始黑塞矩阵
k = 0;
% 进入循环
while((norm(gk)>ess)&&(k<10))
    % 迭代进行
    dk = -Hk\gk;
    xk = xk + a * dk;
    f_xa = subs(f,[x1,x2],xk'); % 将含步长的表达式带入原函数
    diff_fa = diff(f_xa,a); % 求解一阶导
    a_n = solve(diff_fa,a); % 求根
    xk = subs(xk,a,a_n);
    % 计算新的函数值和梯度
    fk = subs(f,[x1,x2],xk');
    gk = subs(gf,[x1,x2],xk');
    Hk = subs(H,[x1,x2],xk');
    % 记录迭代次数
    k = k + 1;
end
xk = vpa(xk,10);
fk = vpa(fk,5);
disp(['最小值为:',num2str(double(fk))])
disp(['迭代次数为:',num2str(k)])

其实代码中与牛顿法相比主要就是增加了一个求解 λ k \lambda_{k} λk的步骤,其它的没有太多变化。

总结

  阻尼牛顿法和牛顿法相比增加了一维搜索的步长因素,这样会使得牛顿法每次的搜索方向变为下降方向,这样可以保证阻尼牛顿法在适当的条件下进行收敛,算是对牛顿法的一种改进。
  但是阻尼牛顿法和牛顿法都没有解决实质性问题,那就是黑塞矩阵可能会出现奇异的情况,如果黑塞矩阵出现奇异情况,那么后续点就无法计算得出,这些更细节的方面就又是对牛顿法的进一步改进,这里不详细介绍。
  更多详细内容可以阅读《最优化理论与算法》这本书

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最优化是指在一定的约束条件下,寻找一个使目标函数取得最大值或最小值的过程。梯度下降和牛顿都是最优化问题中常用的方。梯度下降是一种迭代优化算,通过计算目标函数的梯度来不断更新参数的值,直到达到某个停止条件。梯度下降的思想是沿着目标函数梯度的反方向进行参数调整,以逐步接近最优解。它适用于凸函数和可微函数,并且可以用于求解无约束优化问题和约束优化问题的局部最优解。 牛顿也是一种迭代优化算,它利用函数的二阶导数信息(Hessian矩阵)来逼近函数的局部性质,从而更快地收敛到最优解。牛顿在求解方程根或函数的最小值时非常有效。它经常被用于数学建模、机器学习、数据分析等领域中的参数优化问题,比如最小二乘、逻辑回归、神经网络等模型的参数优化。 需要注意的是,梯度下降和牛顿在不同情况下的效果可能会有所不同。梯度下降在参数空间中沿着梯度方向逐步搜索最优解,对于大规模数据集和高维参数空间比较适用。而牛顿利用了更多的二阶导数信息,对于曲率较大的函数,在局部区域更容易找到最优解。但是牛顿在计算复杂度和存储空间上可能会有一定的挑战。因此,在实际应用中,我们需要根据具体问题的特点选择合适的优化方

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值