优化方法介绍(一)
优化方法介绍(一)
本博客是一个系列博客,主要是介绍各种优化方法,使用 matlab 实现,包括方法介绍,公式推导和优化过程可视化
1 失败案例介绍
本文在编写最速下降法的时候使用了经典的求解函数框架,并使用了自适应步长(alpha)机制,即加入参数flag,当出现梯度下降的情况(Fnew>F0)时,flag自增一(flag = flag + 1),当flag大于等于其阈值(fthershold)时,才执行对于步长alpha的改变(alpha = alpha * multiplyer)操作。通过对于初始步长(alpha)、参数flag的阈值(fthershold)和步长改变量(multiplyer)这三个变量的循环寻优。
经过实践发现,这三个参数的最优值分别为
alpha = 1e-3
fthershold = 2
multiplyer = 1.7
最终优化之后的迭代次数(函数Rosenbrock被调用的次数)为17次,未经优化时的次数为26次。初始步长alpha的数值如此小的原因本文进行了探讨,通过对于函数设置断点之后本文发现,在使用梯度函数gradient计算梯度g时,由于极小值eps(或者说sqrt(eps))的数值比较小,为1e-8级,由于数值计算的问题会导致初始点在x1方向上的梯度达到1e3级,故需要alpha的数值取得比较小才能中和这种巨大的梯度,使得alpha*p的值在(0,10)之间。
代码包括
LineSearchFrameWork.m
文件,用于优化的函数
function [F0,x0,FE,xhis] = LineSearchFrameWork()
x0 = [2,2]; %Initial searching point
tol = 1e-6; %the tolerance value of results
FE = 0; %how many times the Rosenbrock function is runned
FEmax = 1e5;%maxium interation times
alpha = 1e-3; %initial step length
F0 = Rosenbrock(x0); % initial function value
flag = 0; % the determination parameter
fthers = 2; % the thershold of the times that gradient goes down
xhis = [];
xhis = [xhis; x0];
while (F0 > tol) && (FE < FEmax)
g = gradient(x0, F0);
FE = FE + 2;
p = -g;
xnew = x0 + alpha*p;
Fnew = Rosenbrock(xnew);
xhis = [xhis; xnew];
if Fnew < F0
flag = flag + 1;
if flag >= fthers
alpha = alpha * 1.7;
flag = 0;
end
end
x0 = xnew;
F0 = Fnew;
end
end
Rosenbrock.m
文件,用于 罗森布尔克 函数值的计算的函数
function y = Rosenbrock(x)
y = 100*(x(:, 2) - x(:, 1).^2).^2 + (1 - x(:, 1)).^2;
end
gradient.m
文件,计算梯度值的函数
function g = gradient(x, F0)
d = sqrt(eps);
g = (Rosenbrock(x + ones(1, 2)*d) - F0) / d;
runner.m
文件,主运行文件,用于调用其他的函数
clc; clear all; clear
tol = 1e-6;
[F0,x0,FE,xhis] = LineSearchFrameWork();
if F0 < tol
disp("成功了!!!!");
else
disp("lose loser");
end
plot(xhis(:, 1), xhis(:, 2), xhis(:, 1), xhis(:, 2),'*')
title('最速下降法求Rosenbrock函数的局部极小值')
xlabel('x_1'); ylabel('x_2');
运行后的优化结果为
寻优次数 | x1 值 | x2 值 |
---|---|---|
1 | 2 | 2 |
2 | 0.798 | 0.798 |
3 | 0.817619 | 0.817619 |
4 | 0.850445 | 0.850445 |
5 | 0.881263 | 0.881263 |
6 | 0.928068 | 0.928068 |
7 | 0.961518 | 0.961518 |
8 | 0.995455 | 0.995455 |
9 | 0.999905 | 0.999905 |

下面是对于MATLAB中的函数报告(profile):

初次实验之后,博主发现本文采用的方法是错误的,它只能适用于像(2,2)到最优点(1,1)这样的寻优过程,因为在本文的方法中直接将寻优过程初始点为(2,2)的Rosenbrock函数当作一个单值函数来处理,使得x1和x2同增同减,但是这种方法的适用范围非常小,只能在寻优初始点处的x1和x2相等时才能采用。
从上方的图表中可以看出,本文初次实现的方法是有很大问题的,因为本文是通过提前知道了寻优的初始点是x1=x2=2的特殊情况,而寻优的理想结果也是同样的x1=x2=1,所以采用了将Rosenbrock函数作为单值函数来进行寻优的方法。这样的方法其实是没有意义的,因为它有两个局限性:1)只适用于Rosenbrock函数;2)只适用于寻优初始点为x1=x2=2的特殊情况。本文研究Rosenbrock函数是为了使得寻优算法更加具有普适性,即对于尽可能多的函数尤其是一些特殊函数,都能够进行寻优的操作,而本文组的这个方法却是背离了这个初衷,只是为了解决问题而解决问题,这样的研究是没有多少价值的,如同鸡肋。
这个方法发现过程是一个巧合,在编写最速下降法的时候,对于梯度计算函数gradient函数,本来应该使用单位矩阵eye(2)的地方,错误地使用成了全1矩阵ones(1, 2),但是却奇迹般的找到了最优值,在一开始,本文是兴奋的,因为首次实现的结果就如此的成功,但是在后续的检查过程中本文发现,这个方法其实是错误的,本文后续对于这个方法有进行了反思,就有了上面对于这个方法的叙述和讨论。
2 最速下降法求解过程介绍
最速下降法的坐标更新表达式为
<