带有action mask动作掩码的PPO算法(附代码实现)

Actor神经网络输出的动作概率是全部动作的概率,而在应用PPO算法解决实际问题的时候,经常会遇到动作action受到限制的情形,也就是部分动作action是合理的,智能体动作采样select_action的时候也就只能从那些合理的动作action集合中采样。

常见的解决方案有两种,一种是给非法动作action增加惩罚奖励,另一种是动作掩码action mask。动作掩码action mask的基本想法是,给actor神经网络输出的动作概率加上一层掩码,合法动作的掩码是1意味着输出对应的动作概率, 非法动作的掩码是0意味着不输出对应的动作概率。

下面逐渐介绍动作掩码action mask原理以及在PPO算法上的实现,以截取几份讲解中肯的参考资料关键部分的形式进行介绍~

一般而言,动作掩码action mask方法相比于方法一训练时给非法action增加penalty的做法,效果要好很多(参考资料:DRL算法落地笔记 - 知乎 https://zhuanlan.zhihu.com/p/412520739)
在这里插入图片描述

动作掩码action mask原理讲解

强化学习中无效动作应该如何屏蔽(mask)处理? - 知乎 https://zhuanlan.zhihu.com/p/538953546
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

PPO算法使用动作掩码action mask的方法

以离散动作的PPO算法为例,Actor网络输出仍然是全部动作的动作概率,有两处需要增加动作掩码action mask,一处是选择动作select action采样时候,另一处是训练actor网络,经常容易忘记的是第二处训练actor网络的时候也是同样要带上采样时的action mask(参考资料:腾讯人工智能绝悟的action mask是什么意思? - 知乎 https://www.zhihu.com/question/446176024#)
在这里插入图片描述

动作掩码action mask代码实现

最初,我在实现动作掩码action mask的时候,是这样操作的:采样时logits层非法action对应位置换成一个绝对值很大的负数,再经过softmax函数以后非法动作的概率就变成0(参考资料:Softmax如何进行mask操作 - 知乎 https://zhuanlan.zhihu.com/p/543736799)。它会遇到报错:神经网络输出nan。一般来说,神经网络输出nan大概是因为梯度更新时除数遇到0、log函数遇到0的原因。

解决方法是不使用手工的softmax函数,采用torch.distributions.Categorical自带函数库(参考资料:PPO 实践指南 - 知乎 https://zhuanlan.zhihu.com/p/627389144)

参考资料

特别感谢以上参考资料博主的真诚分享!!!

猜你喜欢

转载自blog.csdn.net/ningmengzhihe/article/details/131515927