启发式算法

本篇主要介绍一些启发式算法,包括粒子群算法,模拟退火算法,遗传算法。这些启发式的算法也是解决最优化问题的途径之一。

粒子群算法(PSO)

粒子群算法的思想是,粒子群算法是通过模拟鸟群捕食行为设计的一种群智能算法。区域内有大大小小不同的食物源,鸟群的任务是找到最大的食物源(全局最优解),鸟群的任务是找到这个食物源。鸟群在整个搜寻的过程中,通过相互传递各自位置的信息,让其他的鸟知道食物源的位置最终,整个鸟群都能聚集在食物源周围,即我们所说的找到了最优解,问题收敛。

假设 p b e s t p_{best} pbest是当前粒子的最优解, g b e s t g_{best} gbest是全局最优解, v v v表示粒子的速度, x x x表示粒子当前的位置。
v i = α v i + c 1 r 1 ( p b e s t i − x i ) + c 2 r 2 ( g b e s t − x i ) x i = x i + v i v^i=\alpha v^i+c_1 r_1(p_{best}^i-x^i)+c_2r_2(g_{best}-x^i) \\ x^i = x^i+v^i vi=αvi+c1r1(pbestixi)+c2r2(gbestxi)xi=xi+vi
其中, v i v^i vi表示粒子 i i i的速度, c 1 , c 2 c_1,c_2 c1,c2是加速超参, α \alpha α是惯性超参, r 1 , r 2 r_1,r_2 r1,r2是0到1之间的随机数。
其学习流程如下:
启发式算法_第1张图片
通过速度更新公式我们可以看出,若需要算法快速收敛,我们需要将加速度常数调大。但是这么做可能会导致算法出现“早熟”。若把惯性权重调大,可增加粒子探测新位置的“积极性”,避免过早陷入局部最优,但也会降低算法的收敛速度。对于有些改进算法,在速度更新公式最后一项会加入一个随机项,来平衡收敛速度与避免“早熟”。并且根据位置更新公式的特点,粒子群算法更适合求解连续优化问题。

粒子群算法虽然自提出以来就吸引了大量学者的目光,但粒子群算法也存在诸多弊端,如局部搜索能力差,容易陷入局部极值,搜索精度低等。针对这些问题,粒子群算法有如下三类的改进方向:

改变粒子关系的拓扑结构:

我们之前说粒子群设计玄妙之处在于它保留了全局最优位置和粒子已知的最优位置两个信息。然而历史最优位置(为方便我们称为位置A)和粒子已知的全局最优位置(为方便我们称为位置B)我们可以稍加改动。最经典的改进为master-slave算法。首先,我们可以将问题分解为诸多的master粒子和slave粒子,根据适应值的不同挑选master粒子。每个master粒子下有不同数量的slave粒子,master粒子1所在区域的位置A1为master和slave所有粒子的历史最优位置。同理,我们可以得到对应的A2和A3等粒子的最优位置,对比不同最优位置的数值,得出全局最优位置B。这种算法的好处是,如果master粒子1所属粒子陷入局部最优或者无法找寻到最优解的情况,master粒子2、master粒子3及其它master粒子所在区域仍继续搜寻,一定程度上保证了解的最优性。

master社区粒子的位置A为master社区和slave社区所有粒子的最优过去位置。而slave社区粒子的位置A仅仅为该slave社区所有粒子的最优过去位置。这样,当划分出多个slave社区时,即使有一个slave社区粒子收敛陷入局部最优,仍能保证master社区粒子有较大的概率跳出这个局部最优位置。

启发式算法_第2张图片

引入新的机制:
通过引入新的控制粒子的机制来加快收敛速度,并且避免陷入局部最优。这类改进方法的一个例子为捕猎算法。在粒子群算法计算中,当出现收敛趋势时,将会有大量的低速度粒子聚集。这些低速的聚集粒子并不会加速算法收敛也不会探测新的位置增加跳出局部最优的概率。所以我们称这些粒子为“懒惰粒子”。在迭代过程中,这些“懒惰粒子”仍会占用计算量。于是,如果能加入一种删除机制,删除这些“懒惰粒子”并生成出一些活跃的粒子,那么就可以在加快计算速度的同时减少收敛陷入局部最优的概率。这里引入了老鹰捕食兔子的机制,删除老弱病残的“懒惰”兔子,并增加新的“活跃”兔子。

耦合其他算法:
由于不同的算法有不同的优点,如何将不同算法耦合以克服算法自身缺陷一直是研究的热点。目前进行耦合计算的热点算法有模拟退火,蚁群算法,遗传算法等等。

参考
https://www.zhihu.com/question/23103725

模拟退火算法

梯度下降法或者梯度上升法是贪心算法,迭代到的最优点可能是局部最优或者是鞍点,模拟退火的方式以一定的概率来接受一个比当前解要差的解,因此有可能会跳出这个局部的最优解,达到全局的最优解。

  • J ( Y t + 1 ) J(Y_{t+1}) J(Yt+1)优于 J ( Y t ) J(Y_t) J(Yt),那么无条件的接受该移动
  • 否则,以 e x p ( ∣ J ( Y t + 1 ) − J ( Y t ) ∣ ∣ k ∗ T ) exp(\frac{|J(Y_{t+1})-J(Y_t)||}{k*T}) exp(kTJ(Yt+1)J(Yt))的概率接受该移动。

遗传算法

遗传算法是根据“适者生存”,“优胜劣汰”的原则,模拟生物界自然选择和遗传机制的随机搜索算法。
遗传算法包括以下几个要素:
编码,适应度函数,遗传算子(选择,交叉,变异)

以求解问题为例:

函数 f(x) = x + 10sin(5x) + 7cos(4x) 在区间[0,9]的最大值。

编码:
可以选择实数编码,也可以选择二进制编码。但实数编码容易过早收敛,二进制编码需要的存储空间大,但稳定性高。这里选择二进制编码。

适应度函数: 遗传算法中,一个个体(解)的好坏用适应度函数值来评价,在本问题中,f(x)就是适应度函数。

选择:
选择操作是从前代种群中选择多对较优个体,一对较优个体称之为一对父母,让父母们将它们的基因传递到下一代,直到下一代个体数量达到种群数量上限。在选择操作前,将种群中个体按照适应度从小到大进行排列。采用轮盘赌选择方法(当然还有很多别的选择方法),各个个体被选中的概率与其适应度函数值大小成正比。轮盘赌选择方法具有随机性,在选择的过程中可能会丢掉较好的个体,所以可以使用精英机制,将前代最优个体直接选择。

交叉:
两个待交叉的不同的染色体(父母)根据交叉概率(cross_rate)按某种方式交换其部分基因。交叉有很多种方式:

  • 单点交叉:指在个体编码串中只随机设置一个交叉点,将染色体分成两部分,子代染色体的左右两侧分别来自于父母染色体。
  • 多点交叉:在个体编码串中随机设置了两个/多个交叉点,然后再以间隔交换的方式进行部分基因交换。
  • 均匀交叉:两个配对个体的每个基因座上的基因都以相同的交叉概率进行交换,从而形成两个新个体。

变异:

  • 基本位变异(Simple Mutation):对个体编码串中以变异概率、随机指定的某一位或某几位仅因座上的值做变异运算。
  • 均匀变异(Uniform Mutation):分别用符合某一范围内均匀分布的随机数,以某一较小的概率来替换个体编码串中各个基因座上的原有基因值。(特别适用于在算法的初级运行阶段)
  • 边界变异(Boundary Mutation):随机的取基因座上的两个对应边界基因值之一去替代原有基因值。特别适用于最优点位于或接近于可行解的边界时的一类问题。
  • 非均匀变异:对原有的基因值做一随机扰动,以扰动后的结果作为变异后的新基因值。对每个基因座都以相同的概率进行变异运算之后,相当于整个解向量在解空间中作了一次轻微的变动。
  • 高斯近似变异:进行变异操作时用符号均值为 p p p的平均值,方差为 p 2 p^2 p2的正态分布的一个随机数来替换原有的基因值。

参考:
https://www.zhihu.com/question/23293449
https://blog.csdn.net/weixin_30239361/article/details/101686764

你可能感兴趣的:(深度学习基础,算法,机器学习)