优化理论15----Armijo-Goldstein准则、 Armijo-Goldstein搜索方法、python实现

不精确一维搜索——Armijo-Goldstein方法

文章目录

不精确一维搜索

不精确一维搜索法是求一维函数在区间 [ 0 , ∞ ) [0, \infty) [0,∞) 上的近似极小值,而这个近似精度由一个可接受参数来度量,用不精确一维搜索能求得极值的条件是函数在零点处的导数小于0,即 f ′ ( 0 ) < 0 f^{\prime}(0)<0 f′(0)<0 。主要有两种不精确一维搜索法:Armijo-Goldstein法和Wolfe-Powell法。

Armijo-Goldstein准则

Armijo-Goldstein准则的核心思想有两个:

①目标函数值应该有足够的下降;②一维搜索的步长 λ \lambda λ不应该太小。

这两个思想的意图非常明显。由于最优化问题的目的就是寻找极小值,因此,让目标函数函数值“下降”是我们努力的方向,所以①正是想要保证这一点。

同理,②也类似:如果一维搜索的步长 λ \lambda λ太小了,那么我们的搜索类似于在原地打转,可能也是在浪费时间和精力。

有了这两个指导思想,我们来看看Armijo-Goldstein准则的数学表达式:
f ( x k + λ k d k ) − f ( x k ) ≤ λ k ρ g k T d k (1) \begin{array}{l} f\left(x^{k}+\lambda_{k} d^{k}\right)-f\left(x^{k}\right) \leq \lambda_{k} \rho g_{k}^{T} d^{k}\\ \end{array}\tag{1} f(xk+λk​dk)−f(xk)≤λk​ρgkT​dk​(1)

f ( x k + λ k d k ) − f ( x k ) ≥ λ k ( 1 − ρ ) g k T d k (2) \begin{array}{l} f\left(x^{k}+\lambda_{k} d^{k}\right)-f\left(x^{k}\right) \geq \lambda_{k}(1-\rho) g_{k}^{T} d^{k} \end{array}\tag{2} f(xk+λk​dk)−f(xk)≥λk​(1−ρ)gkT​dk​(2)

其中, 0 < ρ < 1 2 0 < \rho < \frac{1}{2} 0<ρ<21​

公式推导

在非精确一维搜索中,通常要求 f ( x k + 1 ) f(x^{k+1}) f(xk+1)比 f ( x k ) f(x^{k}) f(xk)下降一定的数量,从而使得 f ( x k + 1 ) − f ( x k ) f(x^{k+1})-f(x^{k}) f(xk+1)−f(xk)达到一个满意水平,此时的 λ k \lambda_k λk​,就是可接受步长。

如何选取可接受步长 λ k \lambda_k λk​呢?

(1)不等式的左边式子的泰勒展开式为:
f ( x k + λ k d k ) = f ( x k ) + λ k g k T d k + o ( ∥ λ k d k ∥ ) (3) f({x^k} + {\lambda_k}{d^k}) = f({x^k}) + {\lambda_k}{g_k}^T{d^k} + o(\|{\lambda_k}{d_k}\|)\tag{3} f(xk+λk​dk)=f(xk)+λk​gk​Tdk+o(∥λk​dk​∥)(3)
其中 g k = ▽ f ( x k ) {g_k} = \triangledown f({x^k}) gk​=▽f(xk),我们已知了 g k T d k < 0 {g_k}^T{d^k} < 0 gk​Tdk<0(这是 d k {d^k} dk 为下降方向的充要条件),并且 0 < ρ < 1 2 0 < \rho < \frac{1}{2} 0<ρ<21​

去掉高阶无穷小,剩下的部分为: f ( x k ) + λ k g k T d k f({x^k}) + {\lambda_k}{g_k}^T{d^k} f(xk)+λk​gk​Tdk

而(*)不等式右边与之只差一个系数 ρ \rho ρ

因此,3式右边仍然是一个比 f ( x k ) f({x^k}) f(xk) 小的数,即:
f ( x k ) + λ k ρ g k T d k < f ( x k ) f({x^k}) + {\lambda_k}\rho{g_k}^T{d^k}< f({x_k}) f(xk)+λk​ρgk​Tdk<f(xk​)
也就是说函数值是下降的(下降是最优化的目标)。

由于 g k T d k < 0 {g_k}^T{d^k} < 0 gk​Tdk<0,并且 0 < ρ < 1 2 0 < \rho < \frac{1}{2} 0<ρ<21​,故 ( 2 ) (2) (2)式子右边比 ( 1 ) (1) (1)式子右边要小,即:
λ k ( 1 − ρ ) g k T d k < λ k ρ g k T d k < 0 {\lambda_k}(1-\rho){g_k}^T{d^k} < {\lambda_k}\rho{g_k}^T{d^k} < 0 λk​(1−ρ)gk​Tdk<λk​ρgk​Tdk<0
如果步长 λ k \lambda_k λk​太小的话,会导致这个不等式接近于不成立的边缘。因此,式2就保证了 λ k \lambda_k λk​不能太小。

为减少计算量,可以给出 f f f下降量的一个合适的下界
f ( x k ) − f ( x k + λ d k ) ≥ − λ ρ g k T d k f\left(x^{k}\right)-f\left(x^{k}+\lambda d^{k}\right) \geq-\lambda \rho g_{k}^{T} d^{k} f(xk)−f(xk+λdk)≥−λρgkT​dk

并且只需要 f f f下降到一定程度,比如要求下降量不超过 − λ k ( 1 − ρ ) g k T d k -{\lambda_k}(1-\rho){g_k}^T{d^k} −λk​(1−ρ)gk​Tdk,即
f ( x k ) − f ( x k + λ d k ) ≤ − λ ( 1 − ρ ) g k T d k f\left(x^{k}\right)-f\left(x^{k}+\lambda d^{k}\right) \leq-\lambda(1-\rho) g_{k}^{T} d^{k} f(xk)−f(xk+λdk)≤−λ(1−ρ)gkT​dk

这就是Armijo-Goldstein准则,交换下位置就得到了 ( 1 ) 和 ( 2 ) (1)和(2) (1)和(2)

优化理论15----Armijo-Goldstein准则、 Armijo-Goldstein搜索方法、python实现

Armijo-Goldstein法

  • 原理:从原点出发进行探测,探测点能够接受的上限值为 f ( 0 ) + σ 1 t k f ′ ( 0 ) f(0)+\sigma_{1} t_{k} f^{\prime}(0) f(0)+σ1​tk​f′(0)如果探测点处的函数值小于此值,则减小探测步长;探测点能够接受的下限值为 f ( 0 ) + σ 2 t k f ′ ( 0 ) f(0)+\sigma_{2} t_{k} f^{\prime}(0) f(0)+σ2​tk​f′(0) ,如果探测点处的函数值大于此值(且小于上限值),则停止迭代输出结果,否则增大迭代步长。
  • 算法步骤:用Armijo-Goldstein法求无约束问题 min ⁡ f ( x ) , x ∈ R \min f(x), x \in \mathbf{R} minf(x),x∈R 的算法步骤如下

【1】在搜索区间 [ 0 , ∞ ) [0, \infty) [0,∞) ( [ 0 , λ max ⁡ ] ) \left(\left[0, \lambda_{\max }\right]\right) ([0,λmax​])上取定初始探测点,计算 f ( 0 ) , f ′ ( 0 ) f(0), f^{\prime}(0) f(0),f′(0) ,给出可接受系数 σ 1 ∈ ( 0 , 1 ) \sigma_{1} \in(0,1) σ1​∈(0,1) 和 σ 2 ( σ 2 > σ 1 ) \sigma_{2}\left(\sigma_{2}>\sigma_{1}\right) σ2​(σ2​>σ1​) ,增大探索点系数 α > 1 \alpha>1 α>1 ,令 a 0 = 0 , b 0 = + ∞ a_{0}=0, b_{0}=+\infty a0​=0,b0​=+∞ 或 ( λ max ⁡ ) , k = 0 \left(\lambda_{\max }\right), k=0 (λmax​),k=0;

【2】检查下降量要求

计算 f ( t k ) f\left(t_{k}\right) f(tk​) ,若 f ( λ k ) ⩽ f ( 0 ) + σ 1 λ k f ′ ( 0 ) f\left(\lambda_{k}\right) \leqslant f(0)+\sigma_{1} \lambda_{k} f^{\prime}(0) f(λk​)⩽f(0)+σ1​λk​f′(0) ,则转【3】,否则令 a k + 1 = a k , b k + 1 = λ k a_{k+1}=a_{k}, b_{k+1}=\lambda_{k} ak+1​=ak​,bk+1​=λk​ ,转【4】;

【3】检查避免探索点过小的要求

若 f ( t k ) ⩾ f ( 0 ) + σ 2 λ k f ′ ( 0 ) f\left(t_{k}\right) \geqslant f(0)+\sigma_{2} \lambda_{k} f^{\prime}(0) f(tk​)⩾f(0)+σ2​λk​f′(0) ,停止迭代输出 λ k \lambda_{k} λk​ ;否则令 a k + 1 = λ k , b k + 1 = b k a_{k+1}=\lambda_{k}, b_{k+1}=b_{k} ak+1​=λk​,bk+1​=bk​ ,若 b k + 1 < + ∞ b_{k+1}<+\infty bk+1​<+∞ 转【4】,否则令 λ k + 1 = α λ k , k = k + 1 \lambda_{k+1}=\alpha \lambda_{k}, \quad k=k+1 λk+1​=αλk​,k=k+1 转【2】;

【4】选取新的试探点

令 λ k + 1 = a k + 1 + b k + 1 2 \lambda_{k+1}=\frac{a_{k+1}+b_{k+1}}{2} λk+1​=2ak+1​+bk+1​​ ,置 k = k + 1 k=k+1 k=k+1 转【2】

一般取 σ 1 ∈ ( 0 , 0.5 ] , σ 2 ∈ ( 0.5 , 1 ) , α = 2 \sigma_{1} \in(0,0.5], \quad \sigma_{2} \in(0.5,1), \quad \alpha=2 σ1​∈(0,0.5],σ2​∈(0.5,1),α=2 。

python实现

def goldsteinsearch(f,df,d,x,lambdamax,rho,t):
    '''
    线性搜索子函数
    数f,导数df,当前迭代点x和当前搜索方向d
    '''
    flag = 0
    a = 0
    b = lambdamax
    fk = f(x)
    gk = df(x)
    phi0 = fk
    dphi0 = np.dot(gk, d)
    lambda0=b*random.uniform(0,1)

    while(flag==0):
        newfk = f(x + lambda0 * d)
        phi = newfk
        # print(phi,phi0,rho,alpha ,dphi0)
        if (phi - phi0 )<= (rho * lambda0 * dphi0):
            if (phi - phi0) >= ((1 - rho) * lambda0 * dphi0):
                flag = 1
            else:
                a = lambda0
                b = b
                if (b < lambdamax):
                    lambda0 = (a + b) / 2
                else:
                    lambda0 = t * lambda0
        else:
            a = a
            b = lambda0
            lambda0 = (a + b) / 2
    return lambda0

参考资料

《精通MATLAB最优化计算(第二版)》

用“人话”解释不精确线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则

《最优化理论与方法》袁亚湘

Cauchy’s method of minimization

上一篇:编译nginx的源码安装subs_filter模块


下一篇:git统计代码行数