非精线搜索步长规则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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/451423.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大金焓湿图软件介绍

鼠标在曲线图上选点模式 设置状态点1和状态点2参数模式 旁通分流 下载 https://download.csdn.net/download/jintaihu/16296674

【高质量精品】2024美赛A题数据+多版本前三问代码及代码讲解+前四问思路模型等(后续会更新)

一定要点击文末的卡片&#xff0c;进入后&#xff0c;即可获取完整资料后续参考论文!! 整体分析:这个题目是一个典型的生态系统建模问题&#xff0c;涉及到动物种群的性比例变化、资源可用性、环境因素、生态系统相互作用等多个方面。这个题目的难点在于如何建立一个合理的数学…

mysql按周统计数据简述

概述 业务中经常会遇到按年月日统计的场景&#xff1b; 但有时会有按周统计的情况&#xff1b; 我一般是用2中方法去解决&#xff1a; 利用mysql的weekday函数。计算出当前日期是一周中的第几天&#xff0c;然后当前日期 - 这个数值&#xff0c;就可以得到当前周的周一的日期…

瑞_23种设计模式_抽象工厂模式

文章目录 1 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;1.1 概念1.2 介绍1.3 小结1.4 结构 2 案例一2.1 案例需求2.2 代码实现 3 案例二3.1 需求3.2 实现 4 总结4.1 抽象工厂模式优缺点4.2 抽象工厂模式使用场景4.3 抽象工厂模式VS工厂方法模式4.4 抽象工厂…

jmeter-03界面介绍

文章目录 主界面介绍工具栏介绍测试计划介绍线程组介绍线程组——选择测试计划&#xff0c;右键-->添加-->线程-->线程组1.线程数2.准备时长(Ramp-up)3.循环次数4.same user on each iteratio5.调度器 主界面介绍 工具栏介绍 新建测试计划&#xff1a;创建一个空白的测…

RNN(神经网络)

目录 介绍&#xff1a; 数据&#xff1a; 模型&#xff1a; 预测&#xff1a; 介绍&#xff1a; RNN&#xff0c;全称为循环神经网络&#xff08;Recurrent Neural Network&#xff09;&#xff0c;是一种深度学习模型&#xff0c;它主要用于处理和分析序列数据。与传统…

HiveSQL题——collect_set()/collect_list()聚合函数

一、collect_set() /collect_list()介绍 collect_set()函数与collect_list()函数属于高级聚合函数&#xff08;行转列&#xff09;&#xff0c;将分组中的某列转换成一个数组返回&#xff0c;常与concat_ws()函数连用实现字段拼接效果。 collect_list&#xff1a;收集并形成lis…

GPT3.5\GPT4系列计算完整prompt token数的官方方法

前言: ChatGPT如何计算token数&#xff1f;https://wtl4it.blog.csdn.net/article/details/135116493?spm1001.2014.3001.5502https://wtl4it.blog.csdn.net/article/details/135116493?spm1001.2014.3001.5502 GPT3.5\GPT4系列计算完整prompt token数的官方方法&#xff1…

集成阿里云短信服务

目的是集成阿里云短信服务&#xff0c;完成验证码的发送和接收。 目 录 1、开通阿里云短信服务 2、申请签名 3、申请模板 4、获取AccessKey 5、代码实现 6、代码扩展 7、总结 1、开通阿里云短信服务 去阿里云官网开通 2、申请签名 进行整个步骤时&#xff0c;可以先…

XUbuntu22.04之如何创建、切换多个工作区(二百零九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

项目02《游戏-05-开发》Unity3D

基于 项目02《游戏-04-开发》Unity3D &#xff0c; 【任务】UI背包系统&#xff0c; 首先将Game窗口设置成1920 * 1080&#xff0c; 设置Canvas的缩放模式&#xff0c;&#xff1a;这样设置能让窗口在任意分辨率下都以一个正确的方式显示&#xff0c; 设置数值&…

Grafana实现在同一个面板中多个query应用不同的Data source

目的&#xff1a;实现在同一个面板中多个query应用不同的Data source如下图&#xff1a; 目前A、B都应用的是prometheus源&#xff0c;实现A、B两个query可以应用不同的Data source源 1.添加多个源&#xff1a; 2.点击需要应用多个源的面板&#xff0c;选择上面的设置按钮。 …