在学习了牛顿法之后,我们了解到牛顿法存在一个致命的问题:牛顿法的搜索方向不一定就是下降方向。这直接可能会导致牛顿法不会收敛。为了解决这个问题,我们主要的改进的方向有两点:
阻尼牛顿法就上述改进点中的第二点,为牛顿法沿牛顿方向增加一个一维搜索。
例如,我们知道在经典的牛顿法迭代公式中:
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。下面是阻尼牛顿法的计算步骤:
从上述的迭代步骤来看,停止迭代是依靠计算停止误差来确定的。由于阻尼牛顿法含有一维搜索,因此每次迭代目标函数值一般有所下降,绝对不会出现上升的情况,并且可以证明,阻尼牛顿法和牛顿法相比肯定会收敛。
而阻尼牛顿法最重要的改进点就在计算步长 λ 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 = -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的步骤,其它的没有太多变化。
阻尼牛顿法和牛顿法相比增加了一维搜索的步长因素,这样会使得牛顿法每次的搜索方向变为下降方向,这样可以保证阻尼牛顿法在适当的条件下进行收敛,算是对牛顿法的一种改进。
但是阻尼牛顿法和牛顿法都没有解决实质性问题,那就是黑塞矩阵可能会出现奇异的情况,如果黑塞矩阵出现奇异情况,那么后续点就无法计算得出,这些更细节的方面就又是对牛顿法的进一步改进,这里不详细介绍。
更多详细内容可以阅读《最优化理论与算法》这本书