工作时间AM:09:00--PM:20:00

WORKINGTIME

0898-08980898免费咨询

0898-08980898
邮箱:
admin@eyoucms.com
电话:
0898-08980898
传真:
0000-0000-0000
手机:
13800000000
地址:
海南省海口市
新闻资讯
当前位置: 首页 > 新闻资讯
DDPG神经网络实战(基于强化学习优化粒子群算法)  上传时间:2024-03-04 13:30:28

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情

前几天通过阅读这篇文献: 《Reinforcement learning based parameters adaption method for particleswarm optimization》 发现有些点还是比较新颖的,所以今天对论文的代码进行了整体的复现。整个过程大概花费了1天半(编码调试,不包括实验)

(PS:如果 不想看论文的话,请查看这篇博客:关于强化学习优化粒子群算法的论文解读(全) 在本篇博文将完整分析这篇论文的思路以及工作流程。而且说实话这篇论文其实我感觉复现起来没有一点难度,有些点还是比较新颖的,可以玩玩,顺便作为一个强化学习项目练练手。

日期:2022.6.27~2022.6.28

整个的项目结构如下: 在这里插入图片描述

这里不做过多的解释了,不过值的一提的是,我这里是没有使用矩阵的写法的,因为整个项目一开始的目的就是为了使用Python作为实验,然后把Python代码转换为Java代码上Flink的,所以设计之初就是使用一个对象来存储一个粒子的,这样做的好处就是使用一个对象代替了好几个大的矩阵,也就是说不需要去维护矩阵了,而且写出来的代码可读性很高,并且刚好论文当中有使用CLPSO的速度更新方程来进行变体,所以他这里实现的话,也是很难直接使用矩阵来实现这个粒子之间的跟踪,以及锦标赛选择滴。

哦,对了额外说明一下这篇论文是发在arxiv上面的,不是什么IEEE这种顶刊,所以有些地方,他的描述是不严谨的,所以代码的总体的设计是按照论文来的,但是有些细节是不太一样的,不然代码都跑不起来。

然后这个项目也是验证跑了一下的,发现效果真的挺厉害的,说实话如果不是因为这个东西加了个DDPG,我想要玩玩这个神经网络,我根本就不会去想要复现这个玩意,而且一开始也是抱着怀疑的态度编写的,不过现在来看,还是挺厉害的,我一共训练了300轮每一轮PSO算法跑1000次。也就是说这里是跑了30万然后100个粒子,也就是3000万,本来的话,上午我是可以发出这篇文章记录一下的,但是后来改了几个bug然后调了几个参数,其实原来我还在训练3亿次的网络,但是实在顶不住了,最后改到0.3亿。

传统PSO(这里我没有展示优化过后的(原来我优化的)因为结果都一样被吊打) 都是跑1000次 传统: 在这里插入图片描述

我自己优化的只能到-58 DDPG优化: 在这里插入图片描述 而且是在50多次就出来了: 在这里插入图片描述 这怎么玩?!!! 说实话,没有想过会有这种效果。

当然废话不多说了,我们直接来看实现。

这里的话,基于先去的数据结构,这里定义了一个Bird专门用来储存一些信息。



这里的基本的粒子群实现其实和原来的是现实是一样的,只是我这里为了做到通用,我是直接在上面加功能。


这个类其实是有两个功能的,一个是传统的粒子群算法,对每次这里是封装了一个传统粒子群算法的,然后就是基于论文改造的一些方法,那么这部分的调用是通过别的类来调用的。这玩意可以提取出来,但是也有重复的地方(和基本的粒子群算法)所以我就没有单独提取出来了。

这里也是有一个统一的配置中心进行管控的。 不过其实还有一些东西我是没有提取到这个配置里面的,懒得搞了。



那么接下来就是如何实现论文当中的训练部分了。 因为论文也是说要先预训练嘛,所以你懂的。

这里我们想要实现这个玩意,我们需要先定义两个神经网络。


这个就是论文当中的,只是actor在这里应该是20个输出,而不是25.

这个损失函数其实就是和那个DDPG的一样的,没啥区别。 在这里插入图片描述

在这里插入图片描述

这个环境其实就是和PSO算法深度绑定的,其实编写倒也简单,因为按照强化学习的框架来看,你只需要实现,getRward() 和 reset() 方法,基本上这两个方法就够了,一个方法得到当前情况下,动作的奖励,以及下一步的状态,reset就直接是初始化的,返回当前的状态。



这个其实是环境的编写重点之一。 那么这个也是按照论文来的,获取三个参数,当前迭代次数,当前的离散度,是当前最近空转的最长长度 这个部分其实在前面的PSORL实现了。看里面的 注释其实应该是知道的。

然后这里吗除了中间那个处理起来比较麻烦,其他的其实处理起来都简单。


在这里插入图片描述 至于当前迭代次数,这个我想都不用说了吧,传进来的i是啥(当然实际上,我一开始没有设计到那个参数i(那个停摆的意思理解错了一开始,后来仔细看我博客才反应过来,是当前最近空转的最长长度),我自己PSORL是有一个计数器的)。

这个就更加简单了。 在这里插入图片描述 直接: 在这里插入图片描述

我们的粒子群是需要这个待优化函数的。那么这里的待优化函数也是封装在Target里面。



终于到了训练了。 现在目光移到这个玩意里面。 在这里插入图片描述 这里面包含了actor 和 critic的训练。


之后训练完毕后,你将在这里见到你的权重文件 在这里插入图片描述

终于到了调用阶段喽。

在这里插入图片描述



没有什么比数学本身牛皮,只要理解了,就好办了。毕竟写代码这种粗活还是容易一点的。

平台注册入口