自学内容网 自学内容网

【DDPG】DDPG的离散实现(含代码)


前言

由于想用ddpg来应用到离散动作空间的环境,实现和ppo等其他算法的性能对比。故研究此问题。

代码见:DDPG_simple_add_discrete.py(欢迎star)


实现方法

要使ddpg从连续空间到离散空间的环境上有两种方法。
(单纯使用softmax来学习一个Categorical分布并不可行,这违背的ddpg初衷,因为Categorical分布是一个随机策略),所以认为这里的第三种方法将确定性策略的性质变了,变成了随机性的策略,故这里不将此认为一种合理的方法,所以说是两种方法。

  1. con_to_dis 连续动作转离散的方法
  2. 使用和SAC(continue)类似的方法:重参数化方法(将随机变量的采样与模型参数分离),让离散分布的采样可导 在ddpg中的使用就是 Gumbel-Softmax 技巧 (未实现)
    在MAAC原论文中使用 Categorical reparameterization with gumbel-softmax 链接:https://arxiv.org/pdf/1611.01144
    参考:maac作者的maddpg :https://github.com/shariqiqbal2810/maddpg-pytorch/blob/master/utils/misc.py#L48
  3. 使用softmax,类似于sac的离散域实现。

这里技术有限,第二种复刻后收敛不了,这里仅提供两种
1.args中is_con_to_dis设置为True
3.不进行任何设置,默认实现。
注:评估(evaluate.py)代码未加入discrete。对于1:加入is_con_to_dis即可,对于2,不需要加什么。

延深方法:使用 KNN 让 DDPG 选择 Discrete 行为 : http://coolmoon.dynv6.net:8090/archives/wolp

若有大佬实现了第二种方法,请在评论区留言,不甚感激。

实现结果

这里以简单的CartPole-v1环境为例。
呈现上述的第1,3结果。

第1种方法

这里的seed=0,random_steps=0
在这里插入图片描述
在上述基础上,random_steps=2(即增加了一步随机步数,因为判断<random_steps,选择环境里的随机步数,所以实际只是增加了一步随机步数。)
在这里插入图片描述
发现效果变好了许多。

第3种方法

由于使用probs概率当更新时的action,所以这里使用环境随机步数时,没有probs供给训练,故不能加入参数random_steps。

在这里插入图片描述
效果还行。

代码细节(原理)

以cartpole为例
其中,第三种方法代码 参考:DDPG处理“离散型动作空间”的环境“⻢⾥奥(mario)(附代码)

主要思路:将actor输出的[-1,1],变为以离散环境的动作维度的几个概率值probs,例[0.4,0.6],然后根据此创建一个分布(0.4的概率落在索引值为0的地方,0.6的概率落在索引值为1的地方),从这个分布中采样一个值(索引值),该值即为离散值。
细节:训练时,将此probs 替换成原来的action,其他保持不变。在环境采样时,则利用上述所说的离散值。

第一种方法,自写。简单思路:将连续域输出的动作[-1,1],根据离散环境动作值的个数,将其分成几块,例这里是两块,[-1,0] 则离散值为0,[0,1]为为1。按从负到正的顺序依次给离散值。

关于DDPG_simple代码中的一些参数和整体架构,见:【FreeRL】我的深度学习库构建思想


原文地址:https://blog.csdn.net/weixin_56760882/article/details/143023566

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!