强化学习之混合动作空间

强化学习之混合动作空间

基本介绍

在强化学习的动作空间设定中有连续动作空间,离散动作空间和混合动作空间。在大多数的论文中研究的都是连续动作空间和离散动作空间,而混合动作空间研究的比较少。在游戏ai,自动驾驶等一些领域中有时动作空间可以是混合动作空间,因此我阅读了一些相关的文献,资料和代码,计划整理一下混合动作空间中的一些基础知识(主要介绍parameterized action space)。

在这里插入图片描述

考虑一个简单的场景,假设我们要写一个王者荣耀的游戏ai,我们需要控制英雄的走位,技能释放的方向,这些动作都是属于连续动作空间的。同时我们还需要选择不同的技能,这个动作是属于离散动作空间的,因此我们有了一个动作空间为混合动作空间的问题。解决混合动作空间的一个很自然的思路是将连续动作空间离散化,然后在使用离散动作空间的算法进行求解,但是这样会造成动作空间的维度过大,导致智能体难以学习到好的策略。因此便有人提出来了专门针对混合动作空间的算法,其中比较常用的有PDQN和MPDQN。

PDQN

PDQN全称是Parametrized Deep Q-Network,PDQN将DQN与DDPG结合,分别用于处理离散动作空间和连续动作空间。整个网络的大致结构如下:
在这里插入图片描述

首先我们将state传入右边的网络 x ( θ ) x(\theta) x(θ),它可以看作是一个DDPG网络,用于确定连续动作空间的参数,右边网络的输出是连续参数的值。得到了右边网络的输出后将state和parameters进行拼接后传入 Q ( w ) Q(w) Q(w),它可以看作是一个DQN网络,我们只需要像使用DQN的方法一样就能够得出Q值最大的动作。整个方法的思路和优化中的alternating optimization有些相似,在alternating optimization中需要优化变量之间是解耦的,对于混合动作空间的问题而言不同变量之间是有关联的。

MPDQN

在PDQN中是将所有的parameters都传入到了第二个网络中,在理想情况下离散动作的Q值只和它对应的parameters有关,别的不会对它Q值的估计产生影响,但实际上MPDQN作者做了一些实验,结果表明其它的parameters也会对其产生影响。

在这里插入图片描述

因此作者在MPDQN的文章中提出了一种新的算法:Multi-Pass Q-Networks。目的是减小别的parameters对Q值估计的影响。整个网络的结构如下所示:

在这里插入图片描述

右边的网络还和之前一样,输出的是全部的parameters。但是在左边的网络这边有些不同。首先我们需要根据parameters的维度生成一个矩阵,矩阵的维度是[num_parameters, state_size + parameter_size]。

		# 先全部设为零,然后在右侧方矩阵的对角线上填充连续动作的值
        # implement forward
        negative_slope = 0.01

        Q = []
        # duplicate inputs so we can process all actions in a single pass
        batch_size = state.shape[0]
        # with torch.no_grad():
        x = torch.cat((state, torch.zeros_like(action_parameters)), dim=1)
        x = x.repeat(self.action_size, 1)
        for a in range(self.action_size):
            x[a*batch_size:(a+1)*batch_size, self.state_size + self.offsets[a]: self.state_size + self.offsets[a+1]] \
                = action_parameters[:, self.offsets[a]:self.offsets[a+1]]

首先将右边的方阵的值设为零,然后在右侧方矩阵的对角线上填充连续动作的值。接着将整个矩阵作为输入传给神经网络。拿到神经网络的输出后先将矩阵的对角线元素取出放到一个list里面,然后再根据最大值选择动作。

		# extract Q-values for each action
        for a in range(self.action_size):
            Qa = Qall[a*batch_size:(a+1)*batch_size, a]
            if len(Qa.shape) == 1:
                Qa = Qa.unsqueeze(1)
            Q.append(Qa)
        Q = torch.cat(Q, dim=1)
        return Q

参考资料

  • DEEP REINFORCEMENT LEARNING IN PARAMETERIZED ACTION SPACE

  • Parametrized Deep Q-Networks Learning: Reinforcement Learning with Discrete-Continuous Hybrid Action Space

  • Multi-Pass Q-Networks for Deep Reinforcement Learning with Parameterised Action Spaces

  • Hybrid Actor-Critic Reinforcement Learning in Parameterized Action Space

### 多维离散动作空间强化学习中的实现方法 #### 背景概述 多维离散动作空间是指在一个环境中,智能体需要在多个维度上分别选择离散的动作。这种类型的强化学习问题常见于复杂的控制场景,例如机器人操作、游戏AI以及路径规划等领域。对于这类问题,传统的单维离散动作空间算法可能无法直接适用。 #### 常见的解决方案及其原理 1. **扩展版深度Q网络 (DQN)** DQN是一种经典的用于离散动作空间强化学习算法。当面对多维离散动作空间时,可以通过调整神经网络结构来适应更高维度的动作表示。具体来说,可以将动作编码为一个多维向量,并让Q函数估计每个组合动作的价值[^1]。这种方法的核心在于设计合适的网络架构以捕捉不同维度之间的潜在关联。 2. **分解式策略优化** 对于某些特定的任务,如果各个维度之间存在一定程度的独立性,则可采用分解的方式简化问题求解过程。即先单独训练每一维上的最优子策略,然后再综合考虑它们的整体表现效果形成最终联合策略[^4]。这种方式能够显著降低计算复杂度并提高收敛速度。 3. **策略梯度方法的应用** 策略梯度类的方法如REINFORCE可以直接应用于多维离散动作空间的情况之下。通过定义概率分布p(a|s,θ),其中a代表整个复合型动作序列而不仅仅是单一数值形式;接着利用蒙特卡洛采样技术估算期望回报关于参数theta 的导数从而更新模型权重直至找到全局最优点为止[^3]。 4. **混合动作空间处理技巧** 虽然当前讨论主要围绕纯离散情形展开论述,但在实际应用场景当中往往还会涉及到既有离散又有连续成分存在的所谓“半结构化”或者说是“异构性质”的状态转移机制描述方式。此时就需要引入额外的技术手段比如Soft Actor-Critic(SAC), Proximal Policy Optimization(PPO)等先进框架来进行针对性改进以便更好地适配此类特殊需求条件下的目标达成效率最大化诉求[^2]。 ```python import torch import torch.nn as nn import numpy as np class MultiDiscreteDQN(nn.Module): def __init__(self, input_dim, output_dims): super(MultiDiscreteDQN, self).__init__() self.fc = nn.Linear(input_dim, 128) self.heads = nn.ModuleList([nn.Linear(128, dim) for dim in output_dims]) def forward(self, x): x = torch.relu(self.fc(x)) q_values_list = [] for head in self.heads: q_values_list.append(head(x)) return q_values_list def select_action(state, model, epsilon=0.1): if np.random.rand() < epsilon: actions = [np.random.randint(dim) for dim in action_space_dimensions] else: with torch.no_grad(): state_tensor = torch.tensor(state).float() q_values = model(state_tensor) actions = [torch.argmax(qv).item() for qv in q_values] return actions ``` 上述代码片段展示了一个简单的适用于多维离散动作空间DQN模型构建实例。它包含了多个输出头,每一个对应着不同的动作维度,这样就可以灵活地支持各种规模大小不一的具体案例实践探索活动开展起来更加便捷高效一些。 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值