网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
本文主要介绍径向基函数代理优化算法(以下简称代理优化)。
首先需要注意的是:代理优化算法必须具有边界约束。如果所求问题不具有边界约束,则可以选择以-1000到1000作为默认边界。目标函数不一定非要是平滑的,但当目标函数是连续的时,算法的效果最好。代理优化的目的是尝试仅使用很少次的目标函数计算,来寻找目标函数的全局最小值。为此,算法将试图在“探索”和“速度”两个目标之间平衡本次优化过程。
代理优化算法分为串行算法和并行算法。其中串行算法是基础和核心,本文只介绍串行代理优化。
算法将在两个阶段之间交替进行。以下是简述版步骤:
(1)构造代理阶段:首先在边界范围内,创建数个随机的点(较少),并在这些点上计算目标函数。通过这些点,插值一个径向基函数来构造目标函数的一个“代理函数”。
(2)搜索最小值阶段:在边界范围内,随机抽样较多个点。根据这些点的“代理值”以及它们与目标函数已知的点之间的距离,来估计一个优值函数(merit function)。以优值函数的全局最优点作为“候选点”。在“候选点”计算目标函数。并称之为“适应点”。以此值更新代理,并再次搜索。在一定条件下,进行“代理重置”,返回步骤(1)
以下是算法的详细内容:
一、术语
(1)目标函数:真实的模型。代理优化最终的目的,还是要求目标函数的全局最优值。代理优化和其它模型最大的不同,就是目标函数是未知的,或者虽然可以求解,但计算起来昂贵、费时。
(2)代理函数(Surrogate function,“S”):目标函数的“代理”,化繁为简。此处采用径向基插值函数作为代理函数。
(3)当前值:目标函数最近一次被计算过的点。
(4)在职点(Incumbent point):在最近的一次“代理重置”后,目标函数值最小的点。这个翻译是我暂译的。Incumbent point是理解模型的关键概念。
(5)最优点:算法开始以来所有计算目标函数值中的最小的点。算法结束时的最优点就是我们最终的全局最优解。
(6)初始点:在算法开始之前,你传递给算法的一些已知目标函数值的点,初始点不是必须的。
(7)随机点:构造代理阶段,算法将在这些点计算目标函数。一般来说,算法会从伪随机序列中获取这些点,并进行缩放和位移。以保证在边界的要求范围内。特别的,当变量极多时(往往需要超过500个),算法将从拉丁超立方体序列中获取点。(关于拉丁超立方体,请看实验设计方法(二)——拉丁超立方体简介)
(8)自适应点:即“搜索最小值”阶段的点。在此处,算法对目标函数求值。
(9)优值函数(merit function):后面详细介绍。这个翻译是我暂译的。
(10)已计算点:或者叫已知值点,即目标函数已知的所有点,包括初始点、构造代理点和搜索最小值阶段计算过的点。
(11)采样点:即算法在最小值搜索阶段对“优值函数”求值的点,这些点计算过的是优值函数,而不是目标函数。
(12)比例(scale):搜索最小值阶段的一个量化参数。
二、算法步骤
算法将在两个阶段之间交替进行。
1、构造代理阶段
算法首先会在边界内选择一些准随机点。如果你有一些初始点,那么算法会用上这些点。获得总共N个点(这个数也是由你设置的),随后,算法将在这些点上计算目标函数。因为计算目标函数的代价高昂,因此N并不需要选择太大。
径向基函数代理优化算法采用径向基函数(RBF)插值器,以构造目标函数的插值代理。常用的径向基函数均可以在代理优化模型中选择。比如:
但Matlab选了最适合的一个。其使用的是一个带有线性尾部的立方RBF,此函数使得图像颠簸的程度最小化。读到这里大家已经有一个疑问了。为什么要选RBF函数呢?因为RBF有几个方便的属性,使他是最适合构建代理的函数。
(1)RBF插值器在任意维数、任意点数的情况下,都使用相同的定义公式。
(2)在被计算的点一定可以取到指定的值。意思就是这些点一定可以用RBF进行插值拟合。
(3)计算一个RBF插值器在时间上的花费极少。
(4)当你已经有了一个RBF插值器,那么在已有插值表达式中添加一个点所需要的时间相对较少。
(5)构造一个RBF插值器将涉及到求解一个N*N的线性系统方程组。其中N是代理点的数量。对于RBF,该系统有唯一解。
构造代理阶段的示意图(1)在边界内以伪随机方式取点(2)在这些点计算目标函数 (3)使用插值创建“代理”
2、搜索最小值阶段
算法通过一个局部搜索的过程,来搜索目标函数的最小值。“比例(scale)”类似于模式搜索中的“半径”或者“网格”的大小。Matlab里,比例的初始值一般设置为0.2。算法会从“在职点”开始进行。在职点是最近一次代理重置以来,目标函数的最小值所在点。
算法搜索“优值函数”的最小值。优值函数是一个同时关联代理和已搜索值的距离的函数,以平衡“最小化代理”和“搜索空间(广泛度)”两个任务。
算法将成百上千个长度为比例(比如0.2)的伪随机向量。加在在职点上。以得到样本点。这些向量为正态分布的,再在每个维度上依据边界进行移动和缩放。如果的采样点掉到了边界外,算法将会改变采样点。使它们保持在边界内。
然后,算法在这些样本点,计算优值函数。
上一步中,优值函数最低的点被称为自适应点。算法将在自适应点计算目标函数值,并用该值更新“代理”。如果“自适应点”处的目标函数值低于在职点,则算法认为本次搜索“成功”。并将自适应点设为新的在职点。否则,算法认为搜索失败,不会改变在职点。(好吧,在职点这个翻译真的不怎么样,大家将就一下,记住英文Incumbent point)
当满足以下条件时,算法将改变“比例”的值。
(1)自上一次比例变化以来,已经进行了累计三次成功的搜索。此时将比例加倍。直到最大比例,其长度为边界所框定的箱型大小的0.8倍。
(2)在上一次比例变化后,已有max(5,n)次不成功的搜索(n为变量维度)。此时,将比例减半。直到最小比例长度为边界所框定的箱型大小的0.00001倍。
如此反复,随机搜索将最终集中在目标函数值最小的在职点附近。并且最终比例将减小到最小规模。
需要注意的是,算法不会计算任何与已知值点距离在一定范围内的优值函数。而当所有的样本点都在已知值点的这个特定范围内时,算法从搜索最小值阶段重新切换到构造代理阶段。这就叫做“代理重置”。通常这种重置发生在算法的scale缩小以后,因此所有的样本点都紧紧聚集在在职点的周围。
搜索最小值阶段的示意图(1)在在职点周围取样 (2)计算优值函数 (3)在自适应点计算目标函数 (4)更新插值代理和比例
三、优值函数(merit function)简介
优值函数是代理优化的重要概念。优值函数同时关联代理和已搜索值的距离的函数,以平衡“最小化代理”和“搜索空间(广泛度)”两个任务。优值函数fmerit(x)是以下两项的加权组合:
(1)“比例化代理”:定义Smin为采样点之间的“最小代理值”。Smax为采样点之间的“最大代理值”。Sx为x处的代理值。则比例化代理S(x)为:
S(x)非负,且代理值最小的样本点S(x)值为0。(最小化代理的能力)
(2)“比例化距离”:定义xj为k个已知值点,定义dij为点i与已知值点
dmin = min(dij)
dmax = max(dij)
即对于所有ij的极大和极小距离,则规范化距离D(x)为
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新