概述
文章目录
- 前言
- 一、阻尼牛顿法
- 二、算法实例
- 总结
前言
在学习了牛顿法之后,我们了解到牛顿法存在一个致命的问题:牛顿法的搜索方向不一定就是下降方向。这直接可能会导致牛顿法不会收敛。为了解决这个问题,我们主要的改进的方向有两点:
- 改进使得牛顿法的搜索方向就是其函数值下降的方向。
- 改进使得牛顿法不是下降方向的搜索方向变成是下降方向的搜索方向。
一、阻尼牛顿法
阻尼牛顿法就上述改进点中的第二点,为牛顿法沿牛顿方向增加一个一维搜索。
例如,我们知道在经典的牛顿法迭代公式中:
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)−1∇f(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。下面是阻尼牛顿法的计算步骤:
- 给定初始点 x ( 1 ) x^{(1)} x(1),允许误差 ε > 0 varepsilon > 0 ε>0,置 k = 1 k=1 k=1.
- 计算 ∇ 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.
- 如果
∥
∇
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))−1∇f(x(k)) - 从
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). - 置 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+3x22−4x1x2+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 = -Hkgk;
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的步骤,其它的没有太多变化。
总结
阻尼牛顿法和牛顿法相比增加了一维搜索的步长因素,这样会使得牛顿法每次的搜索方向变为下降方向,这样可以保证阻尼牛顿法在适当的条件下进行收敛,算是对牛顿法的一种改进。
但是阻尼牛顿法和牛顿法都没有解决实质性问题,那就是黑塞矩阵可能会出现奇异的情况,如果黑塞矩阵出现奇异情况,那么后续点就无法计算得出,这些更细节的方面就又是对牛顿法的进一步改进,这里不详细介绍。
更多详细内容可以阅读《最优化理论与算法》这本书
最后
以上就是平常棒棒糖为你收集整理的机器学习笔记-阻尼牛顿法前言一、阻尼牛顿法二、算法实例总结的全部内容,希望文章能够帮你解决机器学习笔记-阻尼牛顿法前言一、阻尼牛顿法二、算法实例总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复