强化学习中的MASK掩码约束动作action

参考强化学习中的MASK掩码约束动作action_强化学习 硬约束 动作掩码-CSDN博客

1、虽然可以制定相应的奖励函数,但是强化学习模型还是努力去学。

2、因此,在大多数RL落地的场景下,都会使用MASK掩码方法解决动作约束的问题

在强化学习解决问题的场景中,动作是体现学习效果最直接的因素,直接影响了智能体下一步的走向和对环境状态的改变。在应用强化学习解决实际问题时,往往不同于gym库中倒立摆那样的情况,而是存在很多的约束。例如,在t tt时刻智能体可选的动作为1 , 2 , 3 1,2,31,2,3,但是在t + 1 t+1t+1时刻只能选1 , 2 1,21,2,3 33处于不可用的状态。在这种情况下,就需要借助掩码mask来对智能体的动作进行处理。
有人会疑问:就不能制定相应的奖励函数使得智能体学习到这种约束吗?
这样做是可以的,但是付出的训练代价很大,并且极其容易导致模型发散。
因此,在大多数RL落地的场景下,都会使用MASK掩码方法解决动作约束的问题:

作者:zbloom
链接:https://www.zhihu.com/question/642964626/answer/3388797119
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在强化学习中,多维离散动作空间中的动作屏蔽(Action Masking)是一种技术,用于在特定状态下限制或排除某些动作。这对于那些不总是所有动作都合法的环境来说尤为重要。例如,在某些游戏中,某些动作可能在当前状态下是不可执行的。

为了实现动作屏蔽,通常需要在智能体和其环境之间加入一个额外的接口,以便环境可以告诉智能体哪些动作是可行的。在实施时,可以采取以下步骤:

  1. 状态表示扩展: 在状态表示中增加一个布尔掩码(mask),它与动作空间的大小相同。每个动作对应一个布尔值,其中 True 表示动作是可行的,而 False 表示动作在当前状态下不可行。
  2. 环境反馈: 环境在返回状态信息的同时,也返回一个动作掩码给智能体。这个掩码需要根据当前状态来更新,确保它反映了哪些动作是允许的。
  3. 修改策略网络: 智能体的策略网络需要修改,以便在生成动作时考虑动作掩码。有两种常见的方法来实现这一点:
  • 概率修正:在策略网络输出动作概率分布之后,将不可行动作的概率设置为零,然后重新归一化概率分布。
  • Q值修正:在Q学习中,将不可行动作的Q值设置为一个非常低的值(比如负无穷),以确保在选取动作时,不可行的动作不会被选中。
  1. 采样和训练: 在训练过程中,智能体需要根据修改后的概率分布来采样动作,并且在经验回放(experience replay)中,只使用那些合法的动作。
  2. 兼容性和库支持: 一些强化学习库,如Stable Baselines或Ray's RLLib,已经内置了对动作屏蔽的支持。使用这些库时,你只需要按照它们的规定来设置动作掩码即可。

下面是一个简化的伪代码示例,(概率分布的方法)说明如何实现动作屏蔽:

# 假设有一个环境,它返回状态和动作掩码
state, action_mask = env.step(current_action)
# 策略网络输出动作概率,不包含掩码
policy_outputs = policy_network(state)
# 应用动作掩码
masked_outputs = policy_outputs * action_mask  # 不可行动作的概率设置为0
# 重新归一化概率
masked_outputs /= masked_outputs.sum()  # 确保概率总和为1
# 根据修改后的概率分布来采样动作
action = sample_from_distribution(masked_outputs)

在实现时,需要注意确保动作屏蔽逻辑的一致性和正确性,以避免智能体学习到错误的策略。此外,动作屏蔽可能会影响探索策略,因此需要适当调整探索机制,确保智能体能够充分探索可行的动作空间。

1 MASK的方法


Mask的核心就是在输出的动作或者值函数的向量上戴个“面具”,点乘一个{ 0 , 1 } \{0,1\}{0,1}或者{ − ∞ , 1 } \{-\infty, 1\}{−∞,1}的行向量,以规范化输出。如:
[ 1 , 2 , 3 ] ⋅ [ 1 , 1 , 0 ] = [ 1 , 2 , 0 ] [1, 2, 3] \cdot [1, 1, 0] = [1, 2, 0][1,2,3]⋅[1,1,0]=[1,2,0]
这样智能体选出的动作就可以进行简单的规范化。

2 MASK的两个关键点


由于强化学习,尤其是深度强化学习,学的最后还是分布,因此只是单单的不让智能体选择不符合规则的动作并不能加速模型的收敛。
因此,MASK一般加在选择动作前的值函数向量或者其他数据向量上,并且会将MASK后的值传入神经网络训练。
两个关键点分别是:1-mask分布 2-回传训练

3 具体做法(Q值的方法)

以openai中MASK星际争霸智能体的动作为例:StarCraft: Implementations of QMIX, VDN, COMA, QTRAN, MAVEN, CommNet, DyMA-CL, and G2ANet on SMAC, the decentralised micromanagement scenario of StarCraft II (gitee.com)
首先是环境部分self.env,使用的是为每个agent提供一个available的动作集合,可以随时调用这个方法以获取agent此时的可执行动作:

然后在agent的动作选择阶段,使用inf代替不符合要求的部分,使得softmax选择的动作合理:

最后在policy学习更新的部分,同样利用-9999999作为不合理动作的替换,使得反向传播的概率分布与采样一致:

 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/weixin_43483381/article/details/118710203

  • 14
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值