找回密码
 立即注册
查看: 161|回复: 5

与机器学习相关的智能优化算法有哪些?

[复制链接]
发表于 2024-7-15 17:57 | 显示全部楼层 |阅读模式
与机器学习相关的智能优化算法有哪些?
发表于 2024-7-15 17:58 | 显示全部楼层
肺功能优化算法(LPO)是一种新型的元启发式算法(智能优化算法),灵感来源于人体肺的规律性和智能性能,LPO利用无约束优化函数CEC2005和CEC2014以及工程设计优化问题进行了实验,表明LPO在处理这些优化问题方面表现出色!该成果由Mojtaba Ghasemia等人于2024年2月发表在SCI人工智能一区顶刊《ComputerMethods in Applied Mechanics and Engineering》上!
由于发表时间较短,你先用,你就是创新!




原理简介

我们应用肺生物学的见解来开发一种先进的算法。肺是人体的一个重要器官,负责过滤我们周围空气中的氧气,并有效地将其输送到循环系统。此外,它还负责从循环系统中去除二氧化碳,并在气体交换过程中将其释放到空气中。肺部的每一次呼吸都是对气体最优化交换的一个自然过程,它能够在不同的运动强度和氧气需求下,精准调节氧气和二氧化碳的交换。


LPO从一个初始的种群或气团Mi开始,其中i=1,2,…,Npop,它进入身体功能循环的血液并创造一个新的种群。这个初始种群是在目标问题范围的两个最大值(Mmax)和最小值(Mmin)之间随机生成的。这种主要的种群与血液团块或颗粒的作用相同。
一、空气进出肺的入口和出口

如前所述,我们选择了肺的RC模型,考虑到建模参数,我们假设进入肺的气团的位置如下,在优化学科中,这是初始种群的新位置:


上式中,D为问题的维数,Iter为算法的当前迭代次数。
二、二氧化碳与空气分离同时血液在静脉中流动

由肺从空气中分离出来的氧气被带入血液。这个质量Mi等价于问题空间中人口的移动。氧气进入血液的运动可以模拟为式(12)。也就是说,血液通过施加在它身上的压力而运动。它从施加更大压力的那一边,也就是适应性值更高的那一边,移动到施加更小压力的那一边,也就是适应性值更低的那一边。


式(13)中,Kij支配着第i个血团即Mi在动脉内的运动方向。在每个循环周期中,αi是介于0到1之间的一个数字,它决定了移位的值,并趋向于一个更优的量。
三、从血液中分离二氧化碳

如下表所示,我们将此动作建模为群体组成和交叉,如下所示:




式(14)中,si为似然值,由于肺对血液的净化作用,随着每次呼气而减小,与吸气、呼气次数Ne呈反比关系:


其中,ne1的值由用户指定。如前所述,吸气和呼气在每次迭代中执行Ne次。如果期望的质量在每个结合处都有所提高,它就会取代当前位置。也就是说,如果Mnew3ij位置优于Mi,则将其替换。值得注意的是,在第二次吸气和呼气后,公式(16)中使用了Mnew3ij:


这个优化周期将在设定次数的迭代或脉冲中继续进行。
算法伪代码

为了使大家更好地理解,这边给出算法伪代码,非常清晰!


如果实在看不懂,不用担心,可以看下代码,再结合上文公式理解就一目了然了!
性能测评

原文作者利用无约束优化函数CEC2005和CEC2014以及工程设计优化问题进行了实验。这些问题与文献中提出的许多当代算法进行了比较。结果表明,LPO在处理这些优化问题方面表现出色,并显示出解决各种现代优化挑战的潜力。
这边为了方便大家对比与理解,采用23个标准测试函数,即CEC2005,进行展示!这边展示其中5个测试函数的图,其余十几个测试函数大家可以自行切换尝试!










参考文献

[1]Ghasemi M, Zare M, Zahedi A, et al. Optimization based on performance of lungs in body: Lungs performance-based optimization (LPO)[J]. Computer Methods in Applied Mechanics and Engineering, 2024, 419: 116582.
完整代码

如果需要免费获得图中的完整测试代码,可查看链接:
2024年SCI一区新算法-肺功能优化算法(LPO)-公式原理详解与性能测评 Matlab代码免费获取
也可后台回复个人需求(比如LPO-BP)定制肺功能优化模型(看到秒回):
1.回归/时序/分类预测类:SVM、RVM、LSSVM、ELM、KELM、HKELM、DELM、RELM、DHKELM、RF、LSTM、BiLSTM、GRU、BiGRU、PNN、CNN、BP、XGBoost、TCN、BiTCN、ESN等等均可~
2.组合预测类:CNN/TCN/BiTCN/DBN/Adaboost结合SVM/RVM/ELM/LSTM/BiLSTM/GRU/BiGRU/Attention机制类等均可(可任意搭配非常新颖)~
3.分解类:EMD、EEMD、VMD、REMD、FEEMD、TVF-EMD、CEEMDAN、ICEEMDAN、SVMD等分解模型均可~
4.其他:机器人路径规划、无人机三维路径规划、DBSCAN聚类、VRPTW路径优化、微电网优化、无线传感器覆盖优化、故障诊断等等均可~
5.原创改进优化算法(适合需要创新的同学):2024年的肺功能优化算法LPO以及麻雀SSA、蜣螂DBO等任意优化算法均可,保证测试函数效果!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2024-7-15 17:58 | 显示全部楼层
前言

其实最优化问题,从小学开始学习数学的时候就可以说已经接触到了,在我印象中有个问题,用一个平底锅煎饼,每次只能放2只饼,煎一只饼要2分钟(正反各用1分钟),煎三只饼要几分钟。这个问题其实已经可以归为最优化问题,我们实际计算出的时间,和真实最节省的时间不断对比去调整煎饼方案,得到时间花费最短的方案,得到最优解。其实这个问题将对象换一下,将煎饼时间换为损失函数,将煎饼换为训练模型,那这个问题就是最优化问题了。根据我们训练出的模型,不论是回归还是分类,总体上总归和原标签是有损失的,要得到更为优秀的模型就要不断的去降低损失值。深度学习系列文章已经把损失函数体系全部都讲解完毕,不论是回归模型、分类模型、聚类模型还是生成模型问题,如果有需要的同学不要错过。此章节将梳理模型训练最优化问题原理和基础理论,以及讲解常用的最优化算法设计和实现。
一、最优化问题基础

以文字去说明最优化问题理解起来是十分抽象且难以起到工程化总结归纳的效果,固我们用数学模型来表示,最优化问题的数学模型一般形式可以描述为下面的结构:




这里的各个组成部分含义如下:

  • :目标函数,它是我们希望最小化(或最大化)的函数。在最大化问题中,通常将其取负后转化为最小化问题。
  • :决策变量,可以是标量或向量。在多维情况下,x 表示一个决策向量。
  • :不等式约束函数,它限制了决策变量的可行解必须位于一定的范围内。
  • :等式约束函数,它精确地限制了某些变量的关系。
在没有约束的情况下,最优化问题可以简化为仅最小化(或最大化)目标函数f(x)。可能讲到这里大家一看到数学公式又犯懵了,我们再来这么理解:
想象你在玩一款视频游戏,你的目标是得到尽可能多的分数(这就像是你的目标函数f(x)),分数是由你的游戏行为(决策变量x)决定的。但是,游戏中有一些规则:

  • 有一些任务你必须避免做到(这就是不等式约束  ≤0,比如说,你的角色不能掉入陷阱里,否则你会失分或者游戏结束。
  • 另外,有一些必须完成的任务(等式约束 =0,比如说,你需要收集所有的金币才能过关。
在游戏的可行区域(就是你能在游戏规则下行动的空间)内,你需要找到最好的策略来完成关卡并且得到最高分。这就是你在最优化问题中尝试完成的任务:在一定的规则内,找到最佳的解决方案。在现实世界的问题中,你可能会寻找成本最低的生产策略、最快的路线或者最有效的广告投放方案,而这些都需要在特定的限制和规则下进行。
在不同的领域,这个一般形式的最优化问题可能有更具体的变体。例如:

  • 线性规划(Linear Programming, LP):目标函数和所有约束都是线性的。
  • 非线性规划(Nonlinear Programming, NLP):目标函数或某些约束是非线性的。
  • 整数规划(Integer Programming):所有或部分决策变量被限制为整数。
  • 混合整数线性规划(Mixed Integer Linear Programming, MILP):某些决策变量是整数,且目标函数和约束都是线性的。
  • 动态规划(Dynamic Programming):用于多阶段决策过程优化的方法,可以分解为一系列相互关联的子问题。
理解了以上最优化算法的大体框架之后,我们需要开始学习一些更细致化的理论知识。从最优化算法的建模步骤开始,我们来逐渐拆解建模过程:

  • 定义问题:明确目标函数,变量以及任何可能的约束条件。
  • 选择合适的优化方法:根据问题的特性,选择一个有效的优化算法。
  • 初始化参数:为变量选择一个初始值。
  • 迭代优化:通过迭代过程改进变量,以最小化目标函数。
  • 终止条件:设定一个停止标准,例如迭代次数、目标函数的变化量或计算资源限制。
1.目标函数

目标函数(或成本函数、损失函数)是最优化问题的核心,它是需要最大化或最小化的函数。在机器学习中,目标函数通常衡量模型预测值与实际值之间的差异,因为之前有详细讲过各个模型的类型函数,这里不过多讲解:


2. 变量

在最优化问题中,变量是决定目标函数值的因素。在机器学习模型中,变量通常指模型的参数,如权重和偏置。通过损失函数的值不断的调整变量权重,就是优化过程。
3.约束条件

在最优化问题中,约束条件定义了解决方案必须遵守的规则。这些规则可以限制解决方案的取值范围或指定某些变量之间的关系。约束条件通常分为两类:等式约束和不等式约束。
3.1等式约束

等式约束指定了变量之间必须满足的精确关系。举个例子,如果我们正在设计一个小工具,其中一个部件的长度加上另一个部件的两倍长度必须总共等于10厘米,那么这就是一个等式约束。数学表达为:h_{j}(x)=0,其中h_{j}(x)是一个函数,它描述了变量 x之间的关系,而j只是一个索引,用于当有多个等式约束时进行区分。
3.2不等式约束

不等式约束定义了变量的取值范围,而不是确切的值。例如,如果你有一个背包,它的承重限制是20公斤,那么你放入背包的物品总重量就受到了一个不等式约束。数学表达为:g_{i}(x)≤0,其中g_{i}(x)表示变量x与允许的极限值之间的差距,i是约束的索引,用于区分多个不等式约束。
3.3约束条件的重要性

约束条件在最优化问题中至关重要,因为它们确保了解决方案是可行的。在没有约束的情况下,最优化问题可能会导致不现实或不可行的解决方案。例如,在工程设计问题中,如果没有考虑材料的强度或成本,可能会得到理论上效率最高,但实际上无法构建或成本过高的设计。
4.最优化算法

最优化算法是一系列解决最优化问题的数学方法,它们的目标是在给定的条件下寻找最佳的决策变量值。这些变量值可以最小化或最大化一个目标函数。也就是找到最优权重的x,这里简单介绍一下各类最优化算法:
4.1梯度下降(Gradient Descent)

梯度下降是最常见的最优化算法之一,特别是在机器学习领域。这种方法通过计算目标函数的梯度来找到函数值下降最快的方向。然后,它按照这个方向调整变量值,以此来减少函数值。梯度下降分为几种类型:

  • 批梯度下降:在每一步使用所有数据计算梯度。
  • 随机梯度下降(SGD):在每一步只使用一个数据样本来计算梯度。
  • 小批量梯度下降:介于批梯度下降和随机梯度下降之间,它在每一步使用一小批数据来计算梯度。
4.2牛顿法和拟牛顿法

这些方法利用了目标函数的二阶导数信息(即海森矩阵),提供了更快的收敛速率,特别是接近最优解时。拟牛顿法是一类不需要显式计算海森矩阵的方法,例如BFGS和L-BFGS,它们适用于大规模问题的优化。
4.3动量方法

动量方法在SGD的基础上增加了一个动量项,有助于加速SGD在相关方向上的导数,并抑制震荡,从而加快收敛速度。
4.4Adam(Adaptive Moment Estimation)

Adam结合了动量方法和RMSprop的优点。它计算了梯度的一阶矩(即平均值)和二阶矩(即未中心化的方差),然后用这些矩来调整每个参数的学习率。
4.5约束最优化

在有约束的情况下,拉格朗日乘数法是处理等式约束的经典方法。对于不等式约束,可以使用KKT(Karush-Kuhn-Tucker)条件,它是拉格朗日乘数法的一种推广。
4.6启发式和元启发式算法

对于某些复杂的或非凸优化问题,传统的梯度方法可能不适用或效率较低。启发式算法,如遗传算法、粒子群优化(PSO)和模拟退火,提供了替代的全局搜索策略。
4.7贝叶斯优化

贝叶斯优化是一种基于概率模型的全局优化策略,特别适用于那些目标函数评估代价很高的问题。它使用高斯过程来建立目标函数的代理模型,并使用这个模型来指导搜索。
5.凸性

凸性是最优化和数学分析中的一个核心概念。它描述了一个数学对象(如集合或函数)的形状特性。当我们说一个集合或函数是凸的,我们在描述其内部的结构和与其相关的直观几何属性。
5.1凸集

一个集合被称为凸集,如果它内部的任意两点之间的直线段都完全包含在该集合内部。形式化地说,一个集合C是凸的,如果对于任意两点x,y∈C 和任意θ满足0≤θ≤1,以下条件成立:

5.2凸函数

一个函数 被称为凸函数,如果它的定义域是一个凸集,并且对于定义域内的任意两点x和y以及任意θ满足0≤θ≤1,以下不等式成立:

直观上,这意味着函数的图形之上的任意一点和图形上任意两点连线之间的区域也在图形之上。这也意味着凸函数的局部最小值也是全局最小值。
函数 是一个典型的凸函数。我们可以观察到对于定义域内的任意两点,函数图像上的线段始终位于函数曲线的上方,这是凸函数的关键特性。在整个定义域内,这个函数的任何局部最小值也是全局最小值,而对于这个特定的函数,最小值在x=0处取得。


5.3凸性的重要性

凸性在最优化问题中非常重要,因为它保证了最优化问题具有良好的数学性质:

  • 全局最优解:凸优化问题的任何局部最优解也是全局最优解。
  • 优化算法:针对凸问题的优化算法通常更简单,更容易分析,并且更容易实现。
  • 稳定性:凸问题的解通常对问题数据的微小变化具有稳定性。
5.4凸优化

凸优化是研究凸函数或凸集合上的优化问题的一个子领域。由于凸问题的特殊性质,凸优化通常比一般的优化问题要容易解决得多。
5.5判断凸性

对于凸集,判断凸性相对直观。而对于凸函数,判断一个函数是否为凸可以通过计算其二阶导数(如果存在)来完成。如果函数的二阶导数是正的(对于一维函数)或者海森矩阵是半正定的(对于多维函数),那么这个函数是凸函数。
6.导数与梯度

在最优化问题中,导数和梯度是核心的数学概念,用来描述目标函数如何随变量变化而变化,并指导我们如何找到函数的最小值或最大值。
6.1导数(Derivative)

导数是单变量微积分中的基本概念,它描述了函数在某一点处随变量的变化率。对于函数 f(x),在点x处的导数通常表示为 。导数告诉我们函数在这一点的斜率,以及函数值是增加还是减少。如果导数为正,那么函数在这一点上随着变量增加而增加;如果导数为负,函数随变量增加而减少。如果导数为零,那么这一点可能是函数的局部极大值、局部极小值或鞍点。在最优化中,我们通常寻找使导数为零的点,因为这些点是潜在的最优点。
6.2梯度

梯度下降算法基于的思想是:要找到函数的最小值,最好的方法是沿着该函数的下降方向探寻。对此我们需要明白代表函数变化快慢的导数以及偏导数,在此基础上我们不仅要知道函数在坐标轴正方向上的变化率(即偏导数),而且还要设法求得函数在其他特定方向上的变化率。而方向导数就是函数在其他特定方向上的变化率。梯度与方向导数有一定的关联性,在微积分里面,对多元函数的参数求delta偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。
纯数理化的知识可能比较难懂,我们可以结合实际例子来了解:一座高度在(x,y)点是H(x,y)的山。H这一点的梯度是在该点坡度(或者说斜度)最陡的方向。梯度的大小告诉我们坡度到底有多陡。
梯度也可以告诉我们一个数量在不是最快变化方向的其他方向的变化速度。再次结合山坡的例子。可以有条直接上山的路其坡度是最大的,则其坡度是梯度的大小。也可以有一条和上坡方向成一个角度的路,例如投影在水平面上的夹角为60°。则,若最陡的坡度是40%,这条路的坡度小一点,是20%,也就是40%乘以60°的余弦。 这个现象可以如下数学的表示。山的高度函数H的梯度点积一个单位向量给出表面在该向量的方向上的斜率。这称为方向导数。梯度的方向是函数在该点增长最快的方向,而梯度的大小(模)表示在该方向上函数增长的速率。在最优化问题中,我们通常希望找到函数的全局最小值(对于最小化问题)。通过计算梯度并沿着梯度的反方向(即最陡下降方向)迭代更新变量值,我们可以逼近函数的最小值。
那么了解了以上最优化问题的解答基础之后,可以开始逐步关联这些相关理论,学习一些最优化算法来达到融会贯通。
二、最优化算法计算原理和实现

1.梯度下降法(Gradient Descent)

梯度下降算法(GradientDescent Optimization)是常用的最优化方法之一,“最优化方法”属于运筹学方法,是指在某些约束条件下,为某些变量选取哪些值,可以使得设定的目标函数达到最优问题。最优化方法有很多种,常见的有梯度下降法、牛顿法、共轭梯度法,等等。
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. if __name__ == '__main__':
  4.     plot_x = np.linspace(-1,6,141)#从-1到6选取141个点
  5.     plot_y = (plot_x - 2.5)**2 -1 #二次方程的损失函数
  6.     plt.scatter(plot_x[5],plot_y[5],color='r') #设置起始点,颜色为红色
  7.     plt.plot(plot_x,plot_y)
  8.     #设置坐标轴名称
  9.     plt.xlabel('theta',fontproperties='simHei',fontsize=15)
  10.     plt.ylabel('损失函数',fontproperties='simHei',fontsize=15)
  11.     plt.show()
复制代码
上述代码画出损失函数示意图,x轴代表的是参数theta,y轴代表的是损失函数的值(即Loss值),曲线y代表的是损失函数。我们的目标是希望通过大量的数据训练和调整参数theta,使得损失函数的值最小,可以通过求导数的方式,达到二次方程的最小值点,使得导数为0即可。梯度下降中有个比较重要的参数:学习率eta,它控制模型寻找最优解的速度。


首先定义损失函数以及导数:
  1. def J(theta): #损失函数
  2.     return (theta-2.5)**2-1
  3. def dJ(theta): #损失函数的导数
  4.     return 2*(theta-2.5)
复制代码
通过matplotlib绘制梯度下降迭代过程
  1. theta = 0.0 #初始点
  2. theta_history = [theta]
  3. eta = 0.1 #步长
  4. epsilon = 1e-8  #精度问题或者eta的设置无法使得倒数为0
  5. while True:
  6.     gradient = dJ(theta)
  7.     last_theta = theta #先记录下上一个theta的值
  8.     theta = theta - eta * gradient #得到一个新的theta
  9.     theta_history.append(theta)
  10.     if(abs(J(theta)-J(last_theta))<epsilon):
  11.         break #当两个theta值非常接近的时候,终止循环
  12. plt.plot(plot_x,J(plot_x),color='r')
  13. plt.plot(np.array(theta_history),J(np.array(theta_history)),color='b',marker='x')
  14. plt.show() #一开始的时候导数比较大,因为斜率比较陡,后面慢慢平缓了
  15. print(len(theta_history)) #一共走了46步
复制代码

学习率对梯度下降法的影响
首先看两个例子,一个学习率为0.01,另一个为0.8




第一个例子很明显学习的速度变慢了,第二个例子蓝色的步长在损失函数之间发生了跳跃,不过在跳跃的过程中,损失函数的值依然在不断地变小,步数是22步,因此学习率为0.8时,优化过程的时间缩短。当学习率为1.1时:


一元二次函数不收敛。学习率是一个需要认真调整的参数,过小会导致收敛过慢,而过大又可能导致模型不收敛。
2.随机梯度下降(Stochastic Gradient Descent, SGD)

随机梯度下降(Stochastic Gradient Descent,简称SGD)是一种用于最优化目标函数的算法,尤其是在机器学习和深度学习中用于最小化损失函数。它是梯度下降算法的一种变体,主要区别在于SGD每次更新参数时只使用一个样本或一个小批量样本来计算梯度,而不是像标准梯度下降算法那样使用整个数据集。
SGD的基本步骤如下:

  • 随机选择:从数据集中随机选择一个样本(或一小批样本)。
  • 计算梯度:计算选中样本在当前参数下损失函数的梯度。
  • 更新参数:根据梯度和学习率更新模型参数。
伪代码如下:
  1. for each epoch:
  2.     Shuffle the dataset
  3.     for each sample in the dataset:
  4.         gradient = compute_gradient(sample, parameters)
  5.         parameters = parameters - learning_rate * gradient
复制代码
这种每次只使用一个样本的更新方式使SGD特别适合大规模数据集的训练。SGD能更快地进行参数更新,因为它不需要在每次迭代中查看所有数据。此外,随机性有助于SGD跳出局部最小值,增加找到全局最小值的可能性。然而,SGD的缺点是它的更新可能会很嘈杂,导致目标函数的收敛路径变得非常波动。为了克服这一点,通常会随着时间逐渐减小学习率,或者使用SGD的变体,如带动量的SGD或者Adam优化器。
  1. import numpy as np
  2. # 假设我们有一个简单的线性关系 y = 2x + 3 + noise
  3. # 我们将生成一些样本数据来模拟这一关系
  4. np.random.seed(0)
  5. x = np.random.rand(100, 1)
  6. y = 2 * x + 3 + np.random.randn(100, 1) * 0.1
  7. # 初始化参数
  8. w = np.random.randn(1)
  9. b = np.random.randn(1)
  10. # 学习率
  11. learning_rate = 0.1
  12. # 进行100次迭代
  13. for epoch in range(100):
  14.     # 在所有样本中随机选择一个
  15.     idx = np.random.randint(100)
  16.     x_sample = x[idx]
  17.     y_sample = y[idx]
  18.    
  19.     # 计算梯度
  20.     gradient_w = -2 * x_sample * (y_sample - (w * x_sample + b))
  21.     gradient_b = -2 * (y_sample - (w * x_sample + b))
  22.    
  23.     # 更新参数
  24.     w = w - learning_rate * gradient_w
  25.     b = b - learning_rate * gradient_b
  26. # 输出学习到的参数值
  27. print(f"Learned linear function: y = {w[0]}x + {b[0]}")
复制代码
输出:Learned linear function: y = 2.127594940622086x + 2.941043061188159
在实际的深度学习应用中,梯度的计算会更复杂,并且通常会使用自动微分库(如TensorFlow或PyTorch)来计算梯度。此外,为了提高收敛速度和稳定性,通常会使用SGD的变体,如带动量的SGD、Adam或RMSprop等。
3.Adam(Adaptive Moment Estimation)

Adam(Adaptive Moment Estimation)算法是一种用于深度学习中的优化算法,它结合了Momentum(动量)和RMSprop(均方根传播)的思想。Adam 通过计算梯度的一阶矩(即均值)和二阶矩(即未中心化的方差)估计来自适应地调整每个参数的学习率。
Adam 算法的关键特点:

  • 动量:考虑了过去梯度的指数衰减平均,帮助加速学习过程。
  • 自适应学习率:为每个参数计算梯度平方的指数衰减平均,调整学习率。
  • 偏差校正:对一阶矩和二阶矩的估计进行校正,以防止它们在训练初期(接近于0)的偏差。
Adam 算法的更新规则:
对于每个参数 θ,在每个时间步 t
对于每个参数 θ,在每个时间步 t

  • 计算梯度
  • 更新有偏一阶矩估计:
  • 更新有偏二阶矩估计:
  • 计算偏差校正后的一阶矩估计:
  • 计算偏差校正后的二阶矩估计:
  • 更新参数:
其中,α是学习率, 是衰减率参数,通常取值接近1,ϵ 是为了保持数值稳定性而加入的一个小常数。下面我们来实现Adam算法:
  1. import numpy as np
  2. # 假设我们有一个简单的线性关系 y = 2x + 3 + noise
  3. np.random.seed(0)
  4. x = np.random.rand(100, 1)
  5. y = 2 * x + 3 + np.random.randn(100, 1) * 0.1
  6. # 初始化参数
  7. params = np.random.randn(2)
  8. m, v = np.zeros(2), np.zeros(2)
  9. # Adam 参数
  10. alpha, beta1, beta2, epsilon = 0.01, 0.9, 0.999, 1e-8
  11. # 运行Adam优化
  12. for t in range(1, 1001):
  13.     # 随机获取样本
  14.     idx = np.random.randint(100)
  15.     x_i, y_i = x[idx], y[idx]
  16.    
  17.     # 计算梯度
  18.     grads = 2 * np.array([x_i * (params[0] * x_i + params[1] - y_i), (params[0] * x_i + params[1] - y_i)]).squeeze()
  19.    
  20.     # 更新一阶和二阶矩估计
  21.     m = beta1 * m + (1 - beta1) * grads
  22.     v = beta2 * v + (1 - beta2) * (grads ** 2)
  23.    
  24.     # 计算偏差校正后的估计
  25.     m_hat = m / (1 - beta1 ** t)
  26.     v_hat = v / (1 - beta2 ** t)
  27.    
  28.     # 更新参数
  29.     params -= alpha * m_hat / (np.sqrt(v_hat) + epsilon)
  30. # 输出学习到的参数值
  31. print(f"Learned parameters: {params}")
复制代码
代码执行成功,并且经过Adam优化算法的迭代,Learned parameters: [2.68152662 2.64279962],我们得到了参数值[2.68152662,2.64279962]。
这意味着学习到的线性模型大致为y=2.68x+2.64,接近于我们模拟数据的真实关系。
4.遗传算法(Genetic Algorithms, GAs)

遗传算法(Genetic Algorithm,GA)最早是由美国的 John holland于20世纪70年代提出,该算法是根据大自然中生物体进化规律而设计提出的。是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。该算法通过数学的方式,利用计算机仿真运算,将问题的求解过程转换成类似生物进化中的染色体基因的交叉、变异等过程。在求解较为复杂的组合优化问题时,相对一些常规的优化算法,通常能够较快地获得较好的优化结果。
其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,不需要确定的规则就能自动获取和指导优化的搜索空间,自适应地调整搜索方向。
遗传算法以一种群体中的所有个体为对象,并利用随机化技术指导对一个被编码的参数空间进行高效搜索。其中,选择、交叉和变异构成了遗传算法的遗传操作;参数编码、初始群体的设定、适应度函数的设计、遗传操作设计、控制参数设定五个要素组成了遗传算法的核心内容。
遗传算法的基本步骤:

  • 初始化:随机生成一开始的种群。种群由一系列候选解组成,每个候选解(个体)通常是问题解空间中的一个点。
  • 评估:计算种群中每个个体的适应度(Fitness),适应度反映了个体解决问题的能力。
  • 选择(Selection):根据个体的适应度选择较优秀的个体进行繁殖。常用的选择方法有轮盘赌选择、锦标赛选择等。
  • 交叉(Crossover):随机选取一对个体作为父母,按照某种规则交换它们的部分基因,产生新的个体(子代)。这个过程模拟了生物的交配。
  • 变异(Mutation):以较小的概率随机改变个体中的某些基因,这增加了种群的多样性,有助于算法跳出局部最优解。
  • 替换:新一代的个体替换掉旧的个体,形成新的种群。这可能会完全替换,或是部分替换。
  • 终止:重复以上步骤,直到满足某个终止条件,比如达到了最大迭代次数,或者种群已经足够优化。
下面我们来简单实现遗传算法:
  1. import numpy as np
  2. # 目标函数
  3. def fitness_function(x):
  4.     return np.sum(x**2)
  5. # 初始化
  6. def initialize_population(size, n):
  7.     return np.random.rand(size, n)
  8. # 选择
  9. def selection(pop, fitness):
  10.     idx = np.argsort(fitness)
  11.     return pop[idx[:int(len(idx)/2)]]
  12. # 交叉
  13. def crossover(parents, n_children):
  14.     children = []
  15.     for _ in range(n_children):
  16.         parent1, parent2 = parents[np.random.choice(len(parents), 2, replace=False)]
  17.         child = parent1[:len(parent1)//2]
  18.         child = np.concatenate((child, parent2[len(parent2)//2:]))
  19.         children.append(child)
  20.     return np.array(children)
  21. # 变异
  22. def mutation(children, mutation_rate=0.01):
  23.     for child in children:
  24.         if np.random.rand() < mutation_rate:
  25.             idx = np.random.choice(len(child))
  26.             child[idx] = np.random.rand()
  27.     return children
  28. # 遗传算法
  29. def genetic_algorithm(fitness_function, n_iterations, population_size, n_variables):
  30.     pop = initialize_population(population_size, n_variables)
  31.     best_fit = float('inf')
  32.     best_solution = None
  33.    
  34.     for _ in range(n_iterations):
  35.         fitness = np.apply_along_axis(fitness_function, 1, pop)
  36.         best_idx = np.argmin(fitness)
  37.         if fitness[best_idx] < best_fit:
  38.             best_fit = fitness[best_idx]
  39.             best_solution = pop[best_idx]
  40.         
  41.         selected = selection(pop, fitness)
  42.         children = crossover(selected, len(pop) - len(selected))
  43.         children = mutation(children)
  44.         pop = np.concatenate((selected, children))
  45.    
  46.     return best_solution, best_fit
  47. # 使用遗传算法
  48. best_solution, best_fitness = genetic_algorithm(
  49.     fitness_function,
  50.     n_iterations=100,
  51.     population_size=50,
  52.     n_variables=5
  53. )
  54. print(f"Best solution: {best_solution}")
  55. print(f"Best fitness: {best_fitness}")
复制代码
在上述代码中,目标函数 fitness_function 被定义为 np.sum(x**2),这意味着它会计算一个向量 x 中所有元素的平方和。在遗传算法的上下文中,该函数作为一个适应度函数,其目的是最小化这个函数值。因此,遗传算法在这里的目标是找到一个向量 x,使得 x 中元素的平方和尽可能小。由于 x 中的元素都是非负的(由于是平方),因此最小化平方和实际上等同于找到接近零的向量。上述代码执行结果为:
Best solution: [0.02683969 0.07490378 0.34308792 0.01243034 0.06044091]
Best fitness: 0.12784788404801556
遗传算法通过模拟自然选择的过程来逐步改进种群中个体的质量,最终找到能够产生最低适应度(在这个例子中,即最小的平方和)的解。代码中的 best_solution 就是算法找到的最佳解,而 best_fitness 是这个解的适应度值,即目标函数的最小值。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2024-7-15 17:58 | 显示全部楼层
公众号:将门创投 (thejiangmen)
近年来,随着机器学习的兴起和神经网络模型的广泛使用,如何高效训练神经网络使之收敛成为了非常重要的课题。AdaGrad、Adam等自适应梯度优化算法也正是因为有较快的收敛性而在实践中备受青睐,然而并没有一种理论观点得以解释他们能够带来加速的原因。
我“门”有幸邀请到字节跳动AI Lab研究员——黄训蓬来到将门TechBeat,为我们带来Talk“如何利用高阶信息加速优化算法”
在本次分享中,黄训蓬从理论和实践两个角度说明了自适应梯度优化算法和高阶优化的千丝万缕的联系。
本次分享的主要内容如下:

1. Second Moment Matrices如何加速神经网络训练
2. 如何高效精确估计目标函数Hessian矩阵
3. 自适应梯度算法的理论进展
❤ Talk已在将门TechBeat上线!【点击这里】,即可马上免费观看!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2024-7-15 17:59 | 显示全部楼层
首先楼上说得很对,机器学习和智能优化没啥关系。
我想你应该是想找这些:
1. 模糊逻辑算法
2. 神经网络算法
3. 免疫算法
4. 内分泌算法
5. 人工代谢算法
6. 膜计算
7. 禁忌搜索算法
8. 和声搜索算法
9. 思维进化算法
10. 社会进化算法
11. 人口迁移算法
12. 标杆学习算法
13. 瞭望算法
14. 视觉认知优化算法
15. 头脑风暴优化算法
16. 随机聚焦搜索优化算法
17. 教学优化算法
18. 帝国竞争算法
19. 世界杯竞赛算法
20. 集体决策优化算法
21. 遗传算法
22. 遗传编程
23. 进化规划
24. 进化策略
25. 分布估计算法
26. 差分进化算法
27. DNA计算
28. 基因表达式编程算法
29. Memetic算法
30. 文化算法
31. 蚁群优化算法/蚁狮优化算法
32. 粒子群优化算法
33. 人工蜂群算法/蜂群优化算法
34. 混合蛙跳算法
35. 人工鱼群算法
36. 大马哈鱼洄游算法
37. 鲸鱼优化算法
38. 磷虾群算法
39. 细菌觅食优化算法
40. 细菌(群体)趋药性算法
41. 细菌菌落优化算法
42. 猫群优化算法
43. 鼠群优化算法
44. 猫鼠种群算法
45. 鸡群优化算法
46. 狼群算法
47. 灰狼优化算法
48. 狮子优化算法
49. 猴群算法
50. 雁群优化算法
51. 候鸟优化算法
52. 布谷鸟搜索算法
53. 萤火虫群优化算法/萤火虫算法
54. 飞蛾扑火优化算法
55. 蝙蝠算法
56. 果蝇优化算法
57. 群居蜘蛛优化算法
58. 蟑螂优化算法
59. 捕食搜索算法
60. 自由搜索算法
61. 食物链算法
62. 共生生物搜索算法
63. 生物地理学优化算法
64. 竞争优化算法
65. 模拟植物生长算法
66. 人工植物优化算法
67. 人工藻类算法
68. 小树生长算法
69. 自然树生长竞争算法
70. 根树优化算法
71. 森林优化算法
72. 入侵草优化算法
73. 种子优化算法
74. 花朵授粉算法
75. 模拟退火算法
76. 混沌优化算法
77. 混沌黄金分割搜索算法
78. 随机分形搜索算法
79. 量子搜索算法
80. 智能水滴优化算法
81. 水循环算法
82. 水波优化算法
83. 人工雨滴算法
84. 云搜索优化算法
85. 气象云模型优化算法
86. 风驱动优化算法
87. 宇宙大爆炸算法
88. 中心引力优化算法
89. 引力搜索算法
90. 引力场算法
91. 极值动力学优化算法
92. 拟态物理学优化算法
93. 分子动理论优化算法
94. 类电磁机制算法
95. 热传递搜索算法
96. 涡流搜索算法
97. 闪电搜索算法
98. 光线优化算法
99. 化学反应优化算法
100. 正弦余弦算法
101. 阴阳对优化算法
102. 一维元胞自动机的涌现计算
103. Conway生命游戏的涌现计算
104. 蚂蚁系统觅食路径的涌现计算
105. 数字人工生命Autolife的涌现行为
106. 黏菌的铁路网络涌现计算

来自:李士勇 李 研 林永茂 编著. 智能优化算法与涌现计算
发表于 2024-7-15 17:59 | 显示全部楼层
首先,我不是太理解提问者的问题,智能优化算法和机器学习算法是两种不一样的算法,智能优化算法的本质就是做优化的,就像最早的单纯形法,梯度下降法,牛顿法,一样,是做问题的优化,但是,最近几年也有研究者把智能优化算法做分类,做回归这些领域,但是总的来说,智能算法本职就是优化算法。机器学习算法有很多了,各种机器学习算法百花齐放,只要能做一些回归,分类,聚类这些具有学习的事情,都可以认为是机器学习算法,就像有些做智能算法来做分类,也可以称为机器学习算法。机器学习算法热门的有:线性分类回归,对数几率回归,岭回归,支持向量机,决策树,贝叶斯分类器,等等。智能算法也有很多:粒子群,鲸鱼优化算法,模拟退火,等等,太多了,不一一列举了,什么烟花算法,头脑风暴法,飞蛾算法,细菌算法,各种各样
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-21 20:28 , Processed in 0.153991 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表