1.神经网络的Q值输出部分对不符合规范的动作的Q值进行掩码处理
2.在与环境step交互之前,对动作进行检查,假如不合理则从合理动作中随机选择一个
这是目前自己能想到的两种方法,不知道是否合理,或者还有没有更好的办法。
ps:这里假设动作空间是离散的。
在DRL中,假如并不是所有动作都可以选择,那么对于动作的约束应该加到哪里呢?
你也可以在选择动作时不作处理,然后在奖励函数设置时将不符合你规则的动作设置比较大的负奖励值。
Eric nice,谢谢啦
- 已编辑
- 选择动作的分布使用一个mask之后的分布,而梯度反传使用原始分布,这样可能会导致所有可选动作的选择概率一直降低,可以加一个最小概率解决。
- 直接将神经网络输出的值改为负无穷再做softmax或将softmax之后的概率值改为0,以这个分布来采样(Q-learning一般可以直接这样)
[未知] 另外个人不建议给予不可行动作负奖励的方法,虽然也有一定效果,但这样会多出很多无用尝试,收敛速度会有明显下降并且最终效果不一定好。
我的动作约束直接在选择动作时执行
- 已编辑
这个问题很经典,很同意
Air-legend 直接将神经网络输出的值改为负无穷再做softmax或将softmax之后的概率值改为0,以这个分布来采样(Q-learning一般可以直接这样
这个说法。
之前我也只是简单的使用掩码或者if-else规则进行限制,模型虽然收敛了但是感觉总是有点问题,后来从github上找到了openai大厂的相关代码描述,他们的做法与上面这个说法是一致的。
首先是环境部分self.env,使用的是为每个agent提供一个available的动作集合,可以随时调用这个方法以获取agent此时的可执行动作:
然后在agent的动作选择阶段,使用inf代替不符合要求的部分,使得softmax选择的动作合理:
最后在policy学习更新的部分,同样利用-9999999作为不合理动作的替换,使得反向传播的概率分布与采样一致:
以上代码就是openai对于不合理动作mask的处理,来自starcraft2的多智能体强化学习代码中的内容。
[未知] 另外,也不建议使用Reward来学习这个行为,这样会给模型收敛性增加难度,训练结果有时候比随机还差。
我之前用过一个方法,但不是对所有的问题都适用。
比如贪吃蛇,给定的动作空间为(东,南,西,北),但是贪吃蛇是不能直接回头的,于是我把动作空间改为(前,左,右)。对应的方向(东,南,西,北)可由当前蛇头的朝向和选择的动作(前,左,右)得到。
MISTCARRYYOU 请问这是哪里的代码呢,能否给个链接,谢谢啦
Air-legend 请问使用PPO算法处理离散动作空间,在softmax后加入mask,对于actor网络更新怎么处理呢,我看网上有的说把回传的无效动作梯度置为0,但是PPO批量更新,有batch个s,a,r,最后得出一个loss,没法处理啊
Air-legend 如果奖励不设置为负值,只是很小接近于0呢
感觉不做任何处理也行,会根据有一般化。不规范的操作可以看作无操作,状态会原地跳转(下个状态还是原来的),或者它状态自动变化。反正q(s,a)没有理想最优策略高,他被选的概率就会变低。这里约束加在和环境交互的地方。