非精线搜索步长规则Armijo规则Goldstein规则Wolfe规则

2024-02-04 10:36

本文主要是介绍非精线搜索步长规则Armijo规则Goldstein规则Wolfe规则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

非精确线搜索步长规则

在数值优化中,线搜索是一种寻找合适步长的策略,以确保在目标函数上获得足够的下降。如最速下降法,拟牛顿法这些常用的优化算法等,其中的线搜索步骤通常使用Armijo规则、Goldstein规则或Wolfe规则等。

设无约束优化问题:
min ⁡ f ( x ) , x ∈ R n \min f(x),{\kern 1pt} \,x \in {R^n} minf(x),xRn
参数迭代过程: x k + 1 ← x k + α k d k x_{k+1}\leftarrow x_k + \alpha_k d_k xk+1xk+αkdk

α k = arg ⁡ min ⁡ f ( x k + 1 ) = arg ⁡ min ⁡ α k > 0 f ( x k + α k ⋅ d k ) = arg ⁡ min ⁡ α k > 0 ϕ ( α k ) \alpha _{k}=\arg\min f\left(x_{k+1}\right) =\arg\min_{\alpha_k>0}f\left(x_{k}+\alpha_k\cdot d_{k}\right) \\ =\arg\min_{\alpha_k>0}\phi\left(\alpha_k\right) αk=argminf(xk+1)=argαk>0minf(xk+αkdk)=argαk>0minϕ(αk)

从而我们可以得到关于步长 α k \alpha_k αk的方程:
ϕ ( α k ) ≜ f ( x k + α k d k ) \phi(\alpha_k)\triangleq f(x_{k}+\alpha_k d_{k}) ϕ(αk)f(xk+αkdk)

ϕ ( α k ) \phi(\alpha_k) ϕ(αk)求导:
ϕ ′ ( α k ) = ∇ f ( x k + α k d k ) T ⋅ d k \phi^{\prime}(\alpha_k)=\nabla f(x_{k}+\alpha_k d_{k})^{T}\cdot d_{k} ϕ(αk)=f(xk+αkdk)Tdk

当步长 α k = 0 \alpha_k=0 αk=0时, ϕ ( 0 ) = f ( x k ) \phi(0)=f(x_{k}) ϕ(0)=f(xk) ϕ ′ ( 0 ) = ∇ f T ( x k ) ⋅ d k < 0 \phi^{\prime}\left(0\right)=\nabla f^{\rm T}\left(x_{k}\right)\cdot d_{k}<0 ϕ(0)=fT(xk)dk<0

Tips: 当 ∇ f ( x k ) ⋅ d k < 0 \nabla f\left(x_{k}\right)\cdot d_{k}<0 f(xk)dk<0时,即下降方向与负梯度方向的夹角为锐角时,下降有效

我们绘制一个假设的 ϕ ( α k ) \phi(\alpha_k) ϕ(αk)的函数曲线:
在这里插入图片描述

ϕ ( α k ) \phi(\alpha_k) ϕ(αk)在0处的切线方程:
L ( α k ) = f ( x k ) + ∇ f T ( x k ) d k ⋅ α k L({\alpha _k}) = f\left( {{x_k}} \right) + \nabla {f^{\rm{T}}}\left( {{x_k}} \right){d_k} \cdot {\alpha _k} L(αk)=f(xk)+fT(xk)dkαk

Armijo规则

Armijo规则是最简单的线搜索规则之一,它基于函数值的下降来决定步长。
具体而言,Armijo规则要求如下图所示:
在这里插入图片描述
绿色划线范围为 α k \alpha_k αk可取值的范围。

设置连接0点 ϕ ( 0 ) = f ( x k ) \phi (0) = f({x_k}) ϕ(0)=f(xk)和射线 L ( α k ) = f ( x k ) + ∇ f T ( x k ) d k ⋅ α k L({\alpha _k}) = f\left( {{x_k}} \right) + \nabla {f^{\rm{T}}}\left( {{x_k}} \right){d_k} \cdot {\alpha _k} L(αk)=f(xk)+fT(xk)dkαk之间作一条过 ( 0 , f ( x k ) ) (0,f(x_k)) (0,f(xk))斜率为 c ⋅ ∇ f ( x k ) T d k c \cdot \nabla f(x_k)^T d_k cf(xk)Tdk的射线。所有满足以下方程的 α k {\alpha _k} αk便可作为步长。即图中绿线划出的取值范围。

ϕ ( α k ) = f ( x k + α k ⋅ d k ) ≤ f ( x k ) + c ⋅ α k ⋅ ∇ f ( x k ) T d k \phi(\alpha_k)=f(x_k + \alpha_k \cdot d_k) \leq f(x_k) + c \cdot \alpha_k \cdot \nabla f(x_k)^T d_k ϕ(αk)=f(xk+αkdk)f(xk)+cαkf(xk)Tdk

其中, α k \alpha_k αk是步长, c c c 是Armijo规则的参数,通常取小于1的值。Armijo规则保证在朝着梯度方向(即搜索方向 d k d_k dk)移动时,目标函数能够有足够的下降。

Goldstein规则

由于Armijo规则,引入 α k \alpha_k αk的取值范围包含了0附近的值,为了保证迭代步长不会太小,
Goldstein规则是对Armijo规则的一种改进,它引入了一个额外的上界条件。Goldstein规则要求:

f ( x k + α k ⋅ d k ) ≤ f ( x k ) + c 1 ⋅ α k ⋅ ∇ f ( x k ) T d k f(x_k + \alpha_k \cdot d_k) \leq f(x_k) + c_1 \cdot \alpha_k \cdot \nabla f(x_k)^T d_k f(xk+αkdk)f(xk)+c1αkf(xk)Tdk

并且,

f ( x k + α k ⋅ d k ) ≥ ( 1 − c 1 ) ⋅ α k ⋅ ∇ f ( x k ) T d k f(x_k + \alpha_k \cdot d_k) \geq (1 - c_1) \cdot \alpha_k \cdot \nabla f(x_k)^T d_k f(xk+αkdk)(1c1)αkf(xk)Tdk

其中, c 1 c_1 c1 是Goldstein规则的参数,通常取小于0.5的值。Goldstein规则的引入使得步长既要满足下降条件,又要限制在一个合理的范围内。

其示意图如下:
在这里插入图片描述
蓝色划线范围为 α k \alpha_k αk可取值的范围。

Wolfe规则

Wolfe规则结合了Armijo条件和曲率条件,它对步长进行更为严格的控制。 ϕ ( α k ) \phi(\alpha_k) ϕ(αk)的斜率由负值最大逐步增加,因此新增一个斜率的约束,去掉小步长。

Wolfe规则要求两个条件:

  1. Armijo条件:
    ϕ ( α k ) = f ( x k + α k ⋅ d k ) ≤ f ( x k ) + c 1 ⋅ α k ⋅ ∇ f ( x k ) T d k \phi(\alpha_k)=f(x_k + \alpha_k \cdot d_k) \leq f(x_k) + c_1 \cdot \alpha_k \cdot \nabla f(x_k)^T d_k ϕ(αk)=f(xk+αkdk)f(xk)+c1αkf(xk)Tdk

  2. 曲率条件:
    ϕ ′ ( α k ) = ∇ f ( x k + α k ⋅ d k ) T d k ≥ c 2 ⋅ ∇ f ( x k ) T d k \phi^{\prime}(\alpha_k)=\nabla f(x_k + \alpha_k \cdot d_k)^T d_k \geq c_2 \cdot \nabla f(x_k)^T d_k ϕ(αk)=f(xk+αkdk)Tdkc2f(xk)Tdk

其中, c 1 c_1 c1 c 2 c_2 c2 是Wolfe规则的参数,通常 0 < c 1 < c 2 < 1 0 < c_1 < c_2 < 1 0<c1<c2<1。Wolfe规则旨在确保步长既满足足够的下降条件,又满足足够的曲率条件,以保证收敛性和数值稳定性。
在这里插入图片描述
蓝色划线范围为 α k \alpha_k αk可取值的范围。

C++示例代码

以上规则在实际应用中通常作为拟牛顿法的一部分。以下是一个简单的C++示例程序,演示了Armijo、Goldstein和Wolfe规则的使用。

#include <iostream>
#include <cmath>
#include <Eigen/Dense>
#include <limits>using namespace Eigen;double objectiveFunction(const VectorXd& x) {return x[0]*x[0] + 2*x[1]*x[1];
}VectorXd gradient(const VectorXd& x) {VectorXd grad(2);grad[0] = 2*x[0];grad[1] = 4*x[1];return grad;
}bool armijoRule(const VectorXd& x, const VectorXd& d, double alpha, double beta) {double c = 0.5; // Armijo参数double expectedReduction = c * alpha * gradient(x).dot(d);double actualReduction = objectiveFunction(x - alpha * d) - objectiveFunction(x);return actualReduction >= expectedReduction;
}void armijoExample() {VectorXd x(2);x << 1.0, 1.0;  // Initial guessVectorXd d = -gradient(x); // Descent directiondouble alpha = 1.0; // Initial step sizedouble beta = 0.5;  // Step size reduction factorwhile (!armijoRule(x, d, alpha, beta)) {alpha *= beta;}std::cout << "Armijo rule: Optimal step size = " << alpha << std::endl;
}bool goldsteinRule(const VectorXd& x, const VectorXd& d, double alpha, double beta, double gamma) {double c1 = 0.5; // Goldstein参数double expectedReduction = c1 * alpha * gradient(x).dot(d);double actualReduction = objectiveFunction(x - alpha * d) - objectiveFunction(x);double upperBound = (1 - c1) * alpha * gradient(x).dot(d);return actualReduction >= expectedReduction && actualReduction <= upperBound;
}void goldsteinExample() {VectorXd x(2);x << 1.0, 1.0;  // Initial guessVectorXd d = -gradient(x); // Descent directiondouble alpha = 1.0; // Initial step sizedouble beta = 0.5;  // Step size reduction factordouble gamma = 2.0; // Additional parameter for Goldstein rulewhile (!goldsteinRule(x, d, alpha, beta, gamma)) {alpha *= beta;}std::cout << "Goldstein rule: Optimal step size = " << alpha << std::endl;
}bool wolfeRule(const VectorXd& x, const VectorXd& d, double alpha, double c1, double c2) {double phi0 = objectiveFunction(x);double phi_alpha = objectiveFunction(x + alpha * d);double phi_prime_0 = gradient(x).dot(d);double phi_prime_alpha = gradient(x + alpha * d).dot(d);// Armijo条件if (phi_alpha > phi0 + c1 * alpha * phi_prime_0)return false;// 曲率条件if (phi_prime_alpha < c2 * phi_prime_0)return false;return true;
}void wolfeExample() {VectorXd x(2);x << 1.0, 1.0;  // Initial guessVectorXd d = -gradient(x); // Descent directiondouble alpha = 1.0; // Initial step sizedouble c1 = 1e-4;   // Armijo条件参数double c2 = 0.9;    // 曲率条件参数while (!wolfeRule(x, d, alpha, c1, c2)) {alpha *= 0.5; // Reduce step size}std::cout << "Wolfe rule: Optimal step size = " << alpha << std::endl;
}int main()
{armijoExample();goldsteinExample();wolfeExample();
}//g++ xiansousuo.cpp `pkg-config eigen3 --libs --cflags`                                                                                                                         

以上代码通过迭代求得最佳的步长。

在实际应用中,选择适当的线搜索规则和参数非常重要。这些规则的性能可能因问题的性质而异,因此需要根据具体情况进行调整。线搜索规则的选择直接影响了优化算法的性能和收敛速度,因此在应用中需要进行仔细的实验和调优。

参考链接

https://www.bilibili.com/video/BV1H14y1R7Yo/?spm_id_from=333.337.search-card.all.click

这篇关于非精线搜索步长规则Armijo规则Goldstein规则Wolfe规则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/677195

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

hdu4277搜索

给你n个有长度的线段,问如果用上所有的线段来拼1个三角形,最多能拼出多少种不同的? import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;

Adblock Plus官方规则Easylist China说明与反馈贴(2015.12.15)

-------------------------------特别说明--------------------------------------- 视频广告问题:因Adblock Plus的局限,存在以下现象,优酷、搜狐、17173黑屏并倒数;乐视、爱奇艺播放广告。因为这些视频网站的Flash播放器被植入了检测代码,而Adblock Plus无法修改播放器。 如需同时使用ads

浙大数据结构:04-树7 二叉搜索树的操作集

这道题答案都在PPT上,所以先学会再写的话并不难。 1、BinTree Insert( BinTree BST, ElementType X ) 递归实现,小就进左子树,大就进右子树。 为空就新建结点插入。 BinTree Insert( BinTree BST, ElementType X ){if(!BST){BST=(BinTree)malloc(sizeof(struct TNo

【python计算机视觉编程——7.图像搜索】

python计算机视觉编程——7.图像搜索 7.图像搜索7.1 基于内容的图像检索(CBIR)从文本挖掘中获取灵感——矢量空间模型(BOW表示模型)7.2 视觉单词**思想****特征提取**: 创建词汇7.3 图像索引7.3.1 建立数据库7.3.2 添加图像 7.4 在数据库中搜索图像7.4.1 利用索引获取获选图像7.4.2 用一幅图像进行查询7.4.3 确定对比基准并绘制结果 7.

记忆化搜索【下】

375. 猜数字大小II 题目分析 题目链接:375. 猜数字大小 II - 力扣(LeetCode) 题目比较长,大致意思就是给一个数,比如说10,定的数字是7,让我们在[1, 10]这个区间猜。 如果猜大或猜小都会说明是大了还是小了,此外,我们还需要支付猜错数字对应的现金。 现在就是让我们定制一个猜测策略,确保准备最少的钱能猜对 如果采用二分查找,只能确保最小次数,题目要求的

关联规则(一)Apriori算法

此篇文章转自 http://blog.sina.com.cn/s/blog_6a17628d0100v83b.html 个人觉得比课本上讲的更通俗易懂! 1.  挖掘关联规则 1.1   什么是关联规则 一言蔽之,关联规则是形如X→Y的蕴涵式,表示通过X可以推导“得到”Y,其中X和Y分别称为关联规则的先导(antecedent或left-hand-side, LHS)和后