【论文】【优化算法】团队梯度下降算法
引言
梯度下降算法常用于在回归模型中求损失函数的最小值,梯度的求法是将函数的所有自变量全部求偏导,然后依次带入要求梯度的位置,再组合成向量。梯度下降的理念是不断沿着梯度的反方向走,找到最低点。每个自变量的迭代公式是。表示学习率,即下降速度,下文为了方便会用v代替。
梯度下降有许多优化算法了。比如加上了加速度的梯度下降,可以防止只求出了局部最优解。还有自适应梯度下降,速度不断减少,还有两者的结合。可是加速度梯度算法还是有可能只求出局部最优解,自适应梯度下降很容易“半途而废”,自适应加速度梯度下降虽然更准确了些,但计算量有些大。而且他们都难以控制自己的精度。
我想到了一种基于梯度下降算法的优化算法,能够更好地解决复杂的函数。我本来是想如何通过梯度下降算法得到更精确的最低点,于是我便想到了本文所使用的这种方法,我将其命名为团队梯度下降算法(梯队下降)
介绍
团队梯度下降算法,是由许多个“探险者”组成的算法,探险者数量总为双数。每个探险者都有自己的起始点与速度,也有不同的“性格”。性格,就是影响他们学习率的参数,越这个值越大,学习率也就越大。我们一般先用一个名为pos的列表存储所有“探险者”的数据,他们的所有数据全为随机生成。性格的生成决定与他们在列表中的索引,即。我们通过不断遍历pos,遍历到探险者时先判断其在pos中的位置,若不是已知最低点,则根据其性格改变其学习率。我们仍然使用
abs(nps - ip)<0.0001
(源代码片段,表示为||<ε ε(精度)暂定为0.0001)
决定其是否为最终输出结果。
Github开原地址:https://github.com/wdnmmd-250/Gradient-descent-algorithm-innovation.git
实验数据
用于实验的函数:y=x^2 - 5cos(πx),最低点:x=0
语言:python3
编译器:测试传统算法:emacs 测试团队梯度下降算法:海龟编辑器
硬件:测试传统算法:MacBook Air(版本忘了) 测试团队梯度下降算法:DELL+Win10
1.传统梯度算法
起始位置:x=5
学习率:0.001
结果:最低点:x=3.837505426858092
耗时0.0003170967102050781秒(第一次)0.0004761219024658203(第二次)
起始位置:x=3.5
学习率:0.01
结果:最低点:x=3.837505426858087(误差是因为学习率增加和位置变化)
耗时2.8848648071289062e-05秒(第一次)4.410743713378906e-05(第二次)
2.团队梯度算法
到时候把代码发上来吧,位置学习率太随机了。直接贴数据
前面是耗时/秒,后面是结论,小数因为语言原因没有化简
(以下为三次运行结果)
1.0.0006120204925537109 0
2.0.0003609657287597656 0
3.0.0006542205810546875 0.0
可见此算法的准确性。
(下面为直观数据)
算法类型
数据
耗时/s
X结果(误差)
传统
X=5, η=0.001
0.0003170967102050781
3.837505426858092
0.0004761219024658203
X=3.5, η=0.01
2.8848648071289062e-0
3.837505426858087
4.410743713378906e-05
团队
6个点
0.0009980201721191406
0
0.002001047134399414
0.0
0.0009982585906982422
0.0
讨论&结论
我这个团队梯度下降算法还可以改进。其实团队梯度下降算法探险者的还可以再增加,这次是6,下次就8、10、16、204,越多肯定越准确,内存也会越大。同时,我的代码也太丑陋了,是可以优化的。团队梯度下降算法更可以是一种理念,可以往里面填充很多东西。比如我想在生成结果之前加一层与其他的探险者数据的相似度判断,可是还没有这个能力。
这个算法的缺点是,它需要的算力与运行时间不够迅速。优点是,只要探险者足够多,硬件足够“硬”,我们就可以获得全局视野,能够如同俯视图像一样轻易找到最低点。此算法相较于传统的准确性更高,真是一片前途似锦啊!