项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1.精确一维搜索与非精确一维搜索

在上一篇文章中,我们提到第k次的迭代公式为:
xk+1=xk+αkdkx_{k+1} = x_k + \alpha_kd_kxk+1​=xk​+αk​dk​
其中,αk\alpha_kαk​表示步长。接下来我们讨论一下怎么确定步长。
我们令
φ(αk)=f(xk+αkdk)\varphi(\alpha_k) = f(x_k + \alpha_k d_k)φ(αk​)=f(xk​+αk​dk​)
假设我们从点xkx_kxk​出发,沿着方向dkd_kdk​进行搜索,确定φ(αk)\varphi(\alpha_k)φ(αk​)值最小,这个过程就叫一维搜索。注意我们在这个搜索过程中假设xkx_kxk​与dkd_kdk​都已经确定,只有αk\alpha_kαk​未知。

如果能直接求出这个最优解αk\alpha_kαk​,那么我们这个αk\alpha_kαk​就被称为最优步长,这种方法被称为最优一维搜索,或者说精确一维搜索。
但是实际情况往往是问题比较复杂,数据维度也很高,直接求精确的最优步长αk\alpha_kαk​可能比较困难,这个时候往往会选择不精确一维搜索来进行代替。
不精确的一维搜索也可以成为近似一维搜索。通常的方法是选择合适的αk\alpha_kαk​,使得目标函数有一定的下降量,即f(xk+αkdk)<f(xk)f(x_k + \alpha_kd_k) < f(x_k)f(xk​+αk​dk​)<f(xk​)。或者说,只需要找到一个步长,使得目标函数有一定的下降量就可以了。

2.精确一维搜索之试探法

精确一维搜索主要包括试探法(区间搜索法)与函数逼近法。
其中,常用的试探法又包括进退法,黄金分割法,二分法等。

2.1进退法

算法的步骤如下:
1.确定搜索的起点与初始步长。
2.以起点开始以初始步长向前试探。如果函数值变大,改变步长方向。
3.如果函数值下降,维持原来的试探方向,并将步长加倍。

算法的大致流程如下

2.2 黄金分割法

0.618法,又叫黄金分割法,是优选法的一种。它在试验时,把试点安排在黄金分割点上来寻找最佳点。而生产生活中,我们常常取其近似值0.618,因此得名。0.618法是最常用的单因素单峰目标函数优选法之一。(参考文献1)
用0.618法寻找最佳点时,虽然不能保证在有限次内准确找出最佳点,但随着试验次数的增加,最佳点被限定在越来越小的范围内,即存优范围会越来越小。用存优范围与原始范围的比值来衡量一种试验方法的效率,这个比值叫精度。用0.618法确定试点时,每一次实验都把存优范围缩小为原来的0.618.因此,n次试验后的精度为:
δn=0.618n−1\delta_n = 0.618^{n-1}δn​=0.618n−1

具体的算法细节可以查阅更为详细的文献与参考资料。

2.3 二分法

具体原理与黄金分割类似。

3.精确一维搜索之函数逼近法

如果原函数具有比较好的解析性质,那么可以使用函数逼近(插值)的方法。

3.1 牛顿法

牛顿法的思路就是利用某一点的函数值,一阶导数值,二阶导数值构造二次插值函数。牛顿法最大的优势就是收敛速度快,具有局部二阶收敛的速度。

将f(x)f(x)f(x)在xkx_kxk​点处泰勒展开
f(x)=f(xk)+f′(xk)(x−xk)+f′′(xk)2!(x−xk)2+o(x−xk)2f(x) = f(x_k) + f'(x_k)(x-x_k) + \frac{f''(x_k)}{2!}(x - x_k)^2 + o(x-x_k)^2f(x)=f(xk​)+f′(xk​)(x−xk​)+2!f′′(xk​)​(x−xk​)2+o(x−xk​)2

要求上面函数的极值,由高等数学的知识,易知f′(x)=0f'(x) = 0f′(x)=0,那么有
f′(xk)+f′′(xk)(x−xk)=0f'(x_k) + f''(x_k)(x - x_k) = 0f′(xk​)+f′′(xk​)(x−xk​)=0
求解可知
x=xk−f′(xk)f′′(xk)x = x_k - \frac{f'(x_k)}{f''(x_k)}x=xk​−f′′(xk​)f′(xk​)​

对应到一维搜索中,步长α\alphaα的迭代方式为:
αk+1=αk−f′(αk)f′′(αk)\alpha_{k+1} = \alpha_k - \frac{f'(\alpha_k)}{f''(\alpha_k)}αk+1​=αk​−f′′(αk​)f′(αk​)​
每次更新该点,然后迭代查找即可。

3.2 插值法

可以有相应的二次插值,三次插值方法,具体可以查看参考文献2关于插值方法的描述。

4.不精确搜索

由于实际问题的复杂性,使用精确一维搜索往往要付出很高的代价,还不一定能得到比较好的结果。后来慢慢发现,只要遵循一定的规律,算法就很可能达到收敛。

4.1 Armijo-Goldstein准则

Armijo-Goldstein准则的核心思想有两个:
1.目标函数值应该有足够的下降
2.一维搜索的步长α\alphaα不应该太小。

这两个思想的意图非常明显。由于最优化问题的目的就是寻找极小值,因此,让目标函数函数值“下降”是我们努力的方向,所以1正是想要保证这一点。
同理,2也类似:如果一维搜索的步长α\alphaα太小了,那么我们的搜索类似于在原地打转,可能也是在浪费时间和精力。(参考文献3)

所以最后Armijo准则的表达式为两个式子:
f(xk+αkdk)≤f(xk)+αkρgkTdkf(x_k + \alpha_k d_k) \le f(x_k) + \alpha_k \rho g_k^Td_kf(xk​+αk​dk​)≤f(xk​)+αk​ρgkT​dk​
f(xk+αkdk)≥f(xk)+αk(1−ρ)gkTdkf(x_k + \alpha_k d_k) \ge f(x_k) + \alpha_k (1 - \rho) g_k^Td_kf(xk​+αk​dk​)≥f(xk​)+αk​(1−ρ)gkT​dk​
其中,0<ρ<1/20 \lt \rho \lt 1/20<ρ<1/2

为什么上面两个式子就可以满足我们的要求,可以阅读参考文献3,或者查阅相关最优化理论的教材。

4.2 Wolfe-Powell准则

Armijo-Goldstein准则可能会把最优步长因子排除在可接受区间外,因此Wolfe-Powell准则做了相关的改进。
Wolfe-Powell准则也是有两个表达式。第一个表达式与Armijo-Goldstein准则的第一个表达式相同,而第二个表达式为:
∇f(xk+αkdk)Tdk≥σgkTdk,σ∈(ρ,1)\nabla f(x_k + \alpha_k d_k)^Td_k \ge \sigma g_k^T d_k, \quad \sigma \in (\rho, 1)∇f(xk​+αk​dk​)Tdk​≥σgkT​dk​,σ∈(ρ,1)

上面式子的几何解释为:在可接受点处的切线斜率大于等于初始斜率的σ\sigmaσ倍!

参考文献:
1.https://zh.wikipedia.org/wiki/黄金分割法
2.https://blog.csdn.net/bitcarmanlee/article/details/86556744
3.https://www.codelast.com/原创用人话解释不精确线搜索中的armijo-goldstein准则及wo/

凸优化系列二:确定步长一维搜索算法相关推荐

  1. 【凸优化笔记二】凸函数基本性质和例子

    [凸优化笔记二]凸函数基本性质和例子 凸函数的四个定义 定义一 定义二 定义三 定义四 一些栗子 凸函数的四个定义 定义一 其中 dom fff 是函数 fff 的 定义域(前域),为凸集--这个很重 ...

  2. SSE图像算法优化系列二十五:二值图像的Euclidean distance map(EDM)特征图计算及其优化。...

    Euclidean distance map(EDM)这个概念可能听过的人也很少,其主要是用在二值图像中,作为一个很有效的中间处理手段存在.一般的处理都是将灰度图处理成二值图或者一个二值图处理成另外一 ...

  3. SSE图像算法优化系列二十二:优化龚元浩博士的曲率滤波算法,达到约1000 MPixels/Sec的单次迭代速度...

      2015年龚博士的曲率滤波算法刚出来的时候,在图像处理界也曾引起不小的轰动,特别是其所说的算法的简洁性,以及算法的效果.执行效率等方面较其他算法均有一定的优势,我在该算法刚出来时也曾经有关注,不过 ...

  4. SSE图像算法优化系列二十一:基于DCT变换图像去噪算法的进一步优化(100W像素30ms)。...

    在优化IPOL网站中基于DCT(离散余弦变换)的图像去噪算法(附源代码) 一文中,我们曾经优化过基于DCT变换的图像去噪算法,在那文所提供的Demo中,处理一副1000*1000左右的灰度噪音图像耗时 ...

  5. SSE图像算法优化系列二十九:基础的拉普拉斯金字塔融合用于改善图像增强中易出现的过增强问题(一)...

    拉普拉斯金字塔融合是多图融合相关算法里最简单和最容易实现的一种,我们在看网络上大部分的文章都是在拿那个苹果和橙子融合在一起,变成一个果橙的效果作为例子说明.在这方面确实融合的比较好.但是本文我们主要讲 ...

  6. ElasticSearch优化系列二:机器设置(内存)

    点击"阅读原文"直接打开[北京站 | GPU CUDA 进阶课程]报名链接 预留一半内存给Lucence使用 一个常见的问题是配置堆太大.你有一个64 GB的机器,觉得JVM内存越 ...

  7. 凸优化(Quasi convex optimization)与梯度下降(Grad descent)

    目录 一.凸优化 1.1评价标准 1.2驻点 1.3凸优化条件 1.4凸优化形式 二.梯度下降 2.1损失函数 2.2梯度 一.凸优化 1.1评价标准 当我们建立模型之后,我们希望有一种标准来评价模型 ...

  8. hprof文件分析工具_应用稳定性优化系列(三),资源泄露问题分析及定位

    继介绍稳定性ANR类故障和Crash/Tombstone类故障后,本章将介绍第三大类故障资源泄露及其典型场景.分析定位和解决方法. 1  资源泄露问题原因分析 2  典型泄露场景 静态变量长期维持到大 ...

  9. 游戏优化系列三:Unity游戏的黑屏问题解决方法

    作者 大家好,我叫Jack冯: 本人20年硕士毕业于广东工业大学,于2020年6月加入37手游安卓团队:目前主要负责海外游戏发行安卓相关开发. 系列目录 游戏优化系列一:海外谷歌应用适配相关 游戏优化 ...

  10. C++性能优化系列——3D高斯核卷积计算(三)IPP计算一维卷积

    因为高斯卷积核计算具有可分离的性质,其计算过程的复杂度比不可分离的卷积要高,因此直接对比自己实现的3D高斯卷积与高性能库IPP的执行情况是没意义的.但是,只进行一维卷积,对比两个版本是有参考价值的.本 ...

最新文章

  1. 解决Cygwin编译cocos2dx 遇到的 error: 'UINT64_C' was not declared in this scope 问题
  2. JAVA中String与StringBuffer的区别
  3. 《剑指offer》反转链表
  4. Laravel 的 Eloquent ORM学习
  5. Leetcode: Valid Parentheses
  6. Pandas 中 把Dataframe 格式转化为 array 数组
  7. 微软开源 TensorFlow-DirectML,为 WSL2 提供 GPU 支持
  8. 软件工程概论第十三周学习进度
  9. lisp语言与python_5种语言混合编程:C++、JS、python、Lisp、汇编
  10. 库卡六轴机器人编程手册_工业机器人(ABB、库卡、安川)编程专业教材!
  11. 免费分享一套详细的Hadoop学习视频
  12. word批量转换pdf
  13. vs2015开发在网页中调用的ocx控件详解(一)
  14. Directory Opus一款功能强大的资源管理器
  15. java函数修饰符_Java 函数 面向对象,修饰符,类,构造方法,this
  16. 2020全国计算机考试ps版本,2020年3月计算机等级Photoshop练习题及参考答案
  17. 路由算法(Dijkstra, Bellman-Ford算法)
  18. 智慧交通解决方案|数字孪生高速公路交通运营管理系统
  19. 【我与bug那些事】Vue 点击选项(有相应分数)实现分数相加【思路】
  20. 视觉SLAM:一直在入门,从未到精通

热门文章

  1. java spring maven excel 导出
  2. 程序员的 升级 ,价值观的改变
  3. sql中毫秒数与格式化时间的转换
  4. PHP程序员40点陋习
  5. html5的优点与缺点大概总结
  6. 关于BinaryFormatter
  7. SharePoint 2007中的搜索服务
  8. DB2事务日志使用经验
  9. 利用内存分析工具(Memory Analyzer Tool,MAT)分析java项目内存泄露
  10. mybatis pageHelper 不分页