这个问题很经典,很同意
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来学习这个行为,这样会给模型收敛性增加难度,训练结果有时候比随机还差。