数值优化(Numerical Optimization)(2)-信赖域法

信赖域子问题与 Fidelity

信赖域法的思想很好理解:就是利用一个好解的局部模型 [公式] 来近似当前迭代点附近 (附近就是一个区域 [公式] ) 的函数情况 [公式] 

信赖域子问题的定义:假设 [公式]  [公式] 为目标函数,在区域 [公式] 内目标函数的近似函数为 [公式] ,则置信域子问题的目的是寻找

[公式]

也就是说信赖域子问题求的是近似函数在信赖域内取最小时对应的自变量取值 [公式] 。通常近似函数可以用二次函数来表示(注意这是关于 [公式] 的函数)

[公式]

其中 [公式] 为模型 Hessian,这里并没有要求它是正定的。

近似函数 [公式] 在点 [公式] 的 Fidelity 定义为:(可以理解为两个函数斜率的比值,用来衡量近似函数的可信程度)

[公式]

我们需要根据近似函数 [公式] 对目标函数 [公式] 的近似程度的好坏来调整信赖域的大小:令[公式]

  • 如果 [公式]  [公式] 是用于函数下降,函数 [公式] 能够很好地近似 [公式] ,此时我们能够增大置信域;(可以理解为 [公式] 和近似函数的斜率(导数)相近,所以 [公式] 能够较好近似 [公式] 
  • 如果 [公式]  [公式] 是用于函数下降,函数 [公式] 不能有效近似 [公式] ,此时应该收缩置信域;(可以理解为函数的导数偏差大,近似效果肯定不好了)
  • 其他情况下不需要对信赖域做出调整。

假设 [公式] 是函数 [公式] 的下降方向,令 [公式]

  • 如果 [公式] 则方向 [公式] 并不能使得函数 [公式] 具有一定的下降量, [公式]
  • 如果 [公式] 则方向 [公式] 能够使得函数 [公式] 有较大的下降, [公式]

Fidelity 算法

信赖域调整算法

输入:阈值 [公式] (通常取 [公式] ),信赖域 [公式]

判断:

  • 如果 [公式] (可以理解为扩大信赖域,但又不能超过最大信赖域的约束)
  • 如果 [公式]  [公式] (可以理解为缩小信赖域)

输出: [公式]

解的接受算法

输入:阈值 [公式]

判断:

  • 如果 [公式]  [公式]
  • 否则 [公式]

输出: [公式]

子问题的近似解

柯西点

定义:令 [公式] 为函数 [公式]  [公式] 的近似函数, [公式]  [公式] 处的单位最陡下降方向( [公式] ),求解关于 [公式] 的优化命题

[公式]

 [公式] 为函数 [公式] 的柯西点。可以理解为柯西点是函数 [公式] 在区域 [公式] 内沿着最陡下降方向进行线搜得到的最小点。

柯西点的计算:令 [公式] 是函数 [公式] 在区间 [公式] 的一个二次近似模型

[公式]

则柯西点为(其实就是高中的二次函数求最值问题,需要考虑边界条件)

[公式]

注:使用柯西点的收敛速率并不高。

Dogleg 法

狗腿路径的定义:令 [公式] 为函数 [公式] 的二次近似函数且 [公式] ,令 [公式] 为柯西点, [公式] 为近似函数的无约束情况下的最小点,狗腿路径 [公式] 

[公式]

狗腿路径可以理解为一种两阶段的方法,先朝最陡方向走,再往近似函数的无约束最小点走(如果碰到信赖域的边界就不走了)。

狗腿法的定义:选择 [公式] 的迭代点 [公式]  [公式] 

狗腿路径的性质:假设 [公式] 为二次函数 [公式] 的狗腿路径且半径 [公式] ,模型的 Hessian [公式]

  • [公式] 是下降的
  • [公式] 是上升的

柯西点法的全局收敛性

引理1:柯西点 [公式] 满足

[公式]

引理2:狗腿步长 [公式] 满足

[公式]

引理3:假设一个方法采用的步长 [公式] 满足 [公式] [公式] ,则 [公式] 满足

[公式]

可以证明在一定条件下,柯西点法能够使得: [公式] 

子问题的迭代解

子问题的精确解

最小化二次函数的条件:假设 [公式] 为二次函数

[公式]

其中 [公式] 是对称矩阵

  • [公式] 取得最小值当且仅当 [公式]  [公式] ,如果 [公式] 则所有满足 [公式] [公式] 均是 [公式] 的全局最小点
  • [公式] 具有唯一最小点当且仅当 [公式]

精确解满足定理:向量 [公式] 是信赖域问题的解

[公式]

当且仅当 [公式] 是可行的且存在 [公式]

  • [公式]
  • [公式]
  • [公式]

子问题的迭代解

精确解定理保证了解的存在性,因此我们需要找到满足条件的 [公式] ,可以利用牛顿法求根的思想进行迭代求解。

算例及matlab代码

这里采用信赖域法来求解一个无约束问题,信赖域子问题的求解采用柯西点法。优化问题为

[公式]

这一函数也叫做 Branin 函数,经常被用作测试函数,它有三个全局最优。

算法流程为:

  1. 初始化
  2. 重复以下步骤直到满足收敛条件
  3. 求解局部二次函数的最小值得到 [公式]
  4. 计算 [公式]
  5. 解的接受算法
  6. 信赖域调整算法

求解过程:

假设初始点为 [公式]  [公式] ,迭代的终止条件为 [公式] ,信赖域半径为[公式]  [公式] 

目标函数的梯度 [公式] 

[公式]

目标函数的严格 Hessian 为

[公式]

解的接受算法中的阈值 [公式] ,信赖域调整算法中的 [公式]

%% 定义函数、梯度和Hessian
f = @(x1,x2) (x2-0.129*x1^2+1.6*x1-6)^2+6.07*cos(x1)+10;
g = @(x1,x2) [2*(x2-0.129*x1^2+1.6*x1-6)*(-0.258*x1+1.6)-6.07*sin(x1);...
    2*(x2-0.129*x1^2+1.6*x1-6)];
B = @(x1,x2) [2*(-0.258*x1+1.6)^2-0.516*(x2-0.128*x1^2+1.6*x1-6)-6.07*cos(x1),...
    -0.516*x1+3.2;-0.516*x1+3.2,2];

%% 初始参数设置
epsilon = 0.01;
Delta_0 = 2;
Delta_max = 5;
x0 = [6;14];
c1 = 0.25;
c2 = 0.75;
eta = 0.2;

%% 迭代求解
while 1
    if norm(g(x0(1),x0(2)),2) <= 0.01
        break
    end
    g_k = g(x0(1),x0(2));
    B_k = B(x0(1),x0(2));
    if g_k'*B_k*g_k > 0
        p = -g_k/norm(g_k,2)*min(Delta_0,(norm(g_k,2)^3)/(g_k'*B_k*g_k));
    else
        p = -g_k/norm(g_k,2)*Delta_0;
    end
    x_temp = x0 + p;
    rho = (f(x_temp(1),x_temp(2))-f(x0(1),x0(2)))/(g_k'*p+0.5*p'*B_k*p);
    if rho > c2
        Delta_0 = min(2*Delta_0,Delta_max);
    else
        Delta_0 = 0.5*Delta_0;
    end
    if rho >= eta
        x0 = x0 + p;
    end
end

求解的结果:左图为自变量 [公式] 的优化轨迹,右图为函数值随迭代次数的变化。

下图在等高线图中展示优化路径