强化学习之混合动作空间

强化学习之混合动作空间

基本介绍

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

强化学习之混合动作空间_第1张图片

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

PDQN

PDQN全称是Parametrized Deep Q-Network,PDQN将DQN与DDPG结合,分别用于处理离散动作空间和连续动作空间。整个网络的大致结构如下:
强化学习之混合动作空间_第2张图片

首先我们将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也会对其产生影响。

强化学习之混合动作空间_第3张图片

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

强化学习之混合动作空间_第4张图片

右边的网络还和之前一样,输出的是全部的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

你可能感兴趣的:(深度强化学习,人工智能,算法,强化学习,深度学习)