【强化学习】Deep Deterministic Policy Gradient(DDPG)算法详解

1 DDPG简介

DDPG吸收了Actor-Critic让Policy Gradient 单步更新的精华,而且还吸收让计算机学会玩游戏的DQN的精华,合并成了一种新算法,叫做Deep Deterinistic Policy Gradient。那DDPG到底是什么样的算法呢,我们就拆开来分析,我们将DDPG分成’Deep’和’Deterministic Policy Cradient’又能被细分为’Deterministic’和’Policy Gradient’,接下来,我们开始一个一个分析。

1.1 Deep和DQN

Deep顾名思义,就是走向更深层次,DQN就是使用一个记忆库和两套结构相同,但参数更新频率不同的神经网络能有效促进学习。那我们也把这种思想运用到DDPG当中,使DDPG也具备这种优良行式。但是DDPG的神经网络行式却比DQN的要复杂一点点。需要回顾DQN可以点击这里:https://blog.csdn.net/shoppingend/article/details/124379079?spm=1001.2014.3001.5502阅读【强化学习】Deep Q Network深度Q网络(DQN)一文回顾。

1.2 Deterministic Policy Gradient

Policy Gradient相比于其他强化学习算法,它能被用来在连续动作上进行动作的筛选。而且筛选的时候使根据所学习的动作分布随机进行筛选,而Deterministic有点看不下去,Deteriministic会让Policy Gradient在做动作的时候没有必要那么不确定,那么犹豫,反正最后都要输出一个动作值,没有必要随机。所以Deterministic就改变了输出动作的过程,斩钉截铁的直在连续的动作上输出一个动作值。

1.3 DDPG神经网络

DDPG神经网络其实和我们之前提到的Actor-Critic行式差不多,也需要基于策略Policy的神经网络和基于价值的Value神经网络,但是为了体现DQN和思想,每种神经网络我们都需要再细分为两个,Policy Gradient这边,我们由估计网络和现实网络,估计网络用来输出实时的动作,供actor在现实中实行。而现实网络则是用来更新价值网络系统的。所以我们再来看看价值系统这边,我们也有现实网络和估计网络,他们在输出这个状态的价值,而输入端却有不同,状态现实网络这边会拿着从动作加上状态的观测值加以分析,而状态估计网络则是拿着当时Actor施加的动作当作输入。在实际运用中,DDPG的这种做法的确带来了更有效的学习过程。

2 DDPG算法

2.1 要点

一句话概括DDPG:Google DeepMind提出的一种使用Actor-Critic 结构,但是输出的不是行为的概率,而是具体的行为,用于连续动作(continuous action)的预测。DDPG结合了之前获得成功的DQN结构,提到了Actor-Critic的稳定性和收敛性。Actor-Critic不完全清楚的可以点这里https://blog.csdn.net/shoppingend/article/details/124341639?spm=1001.2014.3001.5502了解一下。

2.2 算法

DDPG的算法实际上就是一种Actor-Critic,关于Actor部分,他的参数更新同样会涉及到Critic。
在这里插入图片描述
上面是关于Actor参数的更新,它的前半部分grad[Q]是从Critic来的,这是在说:这次Actor的动作要怎么移动,才能获得更大的Q,而后半部分grad[μ]是从Actor来的,这是在说:Actor要怎么样修改自身参数,使得Actor更有可能做这个动作。所以两者合起来就是在说:Actor要朝着更有可能获取大Q的方向修改动作参数了。
在这里插入图片描述
上面这个是关于Critic的更新, 它借鉴了DQN和Double Q-Learning的方式,有两个计算Q的神经网络,Q_target中依据下一状态,用Actor来选择动作,而这时的Actor也是一个Actor_target(有着Actor很久之前的参数)。使用这种方法获得的Q_target能像DQN那样切断相关性,提高收敛性。

2.3 代码主结构

我们用Tensorflow搭建神经网络,主结构可以见这个tensorboard的出来的图。
在这里插入图片描述
单独看Actor和Critic中各有什么结构
在这里插入图片描述
其搭建的代码部分在这:

class Actor(object):
    def __init__(self):
        ...
        with tf.variable_scope('Actor'):
            # 这个网络用于及时更新参数
            self.a = self._build_net(S, scope='eval_net', trainable=True)
            # 这个网络不及时更新参数, 用于预测 Critic 的 Q_target 中的 action
            self.a_ = self._build_net(S_, scope='target_net', trainable=False)
        ...

class Critic(object):
    def __init__(self):
        with tf.variable_scope('Critic'):
            # 这个网络是用于及时更新参数
            self.a = a  # 这个 a 是来自 Actor 的, 但是 self.a 在更新 Critic 的时候是之前选择的 a 而不是来自 Actor 的 a.
            self.q = self._build_net(S, self.a, 'eval_net', trainable=True)
            # 这个网络不及时更新参数, 用于给出 Actor 更新参数时的 Gradient ascent 强度
            self.q_ = self._build_net(S_, a_, 'target_net', trainable=False)
2.4 Actor-Critic

有了Actor-Critic每个里面各两个神经网络结构的了解,我们再来看看他们是如何进行交流,传递信息的。我们从Actor的学习更新方式开始说起。
在这里插入图片描述
这张图一眼就能看穿Actor的更新到底基于了那些东西。可以看出,它使用了两个eval_net,所以Actor class中用于train的代码我们这样写:

with tf.variable_scope('policy_grads'):
    # 这是在计算 (dQ/da) * (da/dparams)
    self.policy_grads = tf.gradients(
        ys=self.a, xs=self.e_params, # 计算 ys 对于 xs 的梯度
        grad_ys=a_grads # 这是从 Critic 来的 dQ/da
    )
with tf.variable_scope('A_train'):
    opt = tf.train.AdamOptimizer(-self.lr)  # 负的学习率为了使我们计算的梯度往上升, 和 Policy Gradient 中的方式一个性质
    self.train_op = opt.apply_gradients(zip(self.policy_grads, self.e_params)) # 对 eval_net 的参数更新

同时下面也提到的传送给Actor的a_grad应该用Tensorflow怎么计算。这个a_grad是Critic class里面的,这个a是来自Actor根据s计算而来的:

with tf.variable_scope('a_grad'):
    self.a_grads = tf.gradients(self.q, self.a)[0]   # dQ/da

而在Critic中,我们用的东西简单一点。
在这里插入图片描述
下面就是Critic的更新代码。

# 计算 target Q
with tf.variable_scope('target_q'):
    self.target_q = R + self.gamma * self.q_    # self.q_ 根据 Actor 的 target_net 来的
# 计算误差并反向传递误差
with tf.variable_scope('TD_error'):
    self.loss = tf.reduce_mean(tf.squared_difference(self.target_q, self.q))  # self.q 又基于 Actor 的 target_net
with tf.variable_scope('C_train'):
    self.train_op = tf.train.AdamOptimizer(self.lr).minimize(self.loss)

最后我们建立并把Actor和Critic融合在一起的时候是这样写的。

actor = Actor(...)
critic = Critic(..., actor.a, actor.a_)  # 将 actor 同它的 eval_net/target_net 产生的 a/a_ 传给 Critic
actor.add_grad_to_graph(critic.a_grads) # 将 critic 产出的 dQ/da 加入到 Actor 的 Graph 中去
2.5 记忆库Memory

以下是关于类似于DQN的记忆库代码,我们用了一个class来建立。

class Memory(object):
    def __init__(self, capacity, dims):
        """用 numpy 初始化记忆库"""

    def store_transition(self, s, a, r, s_):
        """保存每次记忆在 numpy array 里"""

    def sample(self, n):
        """随即从记忆库中抽取 n 个记忆进行学习"""
2.6 每回合算法

这里的回合算法只提到了最重要的部分,省掉了一些没必要的

var = 3  # 这里初始化一个方差用于增强 actor 的探索性

for i in range(MAX_EPISODES):
    ...
    for j in range(MAX_EP_STEPS):
        ...

        a = actor.choose_action(s)
        a = np.clip(np.random.normal(a, var), -2, 2) # 增强探索性
        s_, r, done, info = env.step(a)

        M.store_transition(s, a, r / 10, s_)   # 记忆库

        if M.pointer > MEMORY_CAPACITY: # 记忆库头一次满了以后
            var *= .9998    # 逐渐降低探索性
            b_M = M.sample(BATCH_SIZE)
            ...   # 将 b_M 拆分成下面的输入信息
            critic.learn(b_s, b_a, b_r, b_s_)
            actor.learn(b_s)

        s = s_

        if j == MAX_EP_STEPS-1:
            break

文章来源:莫凡强化学习https://mofanpy.com/tutorials/machine-learning/reinforcement-learning/

  • 9
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Deep Deterministic Policy GradientDDPG)是一种基于深度神经网络的强化学习算法。它是用来解决连续控制问题的,即输出动作的取值是连续的。DDPG是在DPG(Deterministic Policy Gradient)的基础上进行改进得到的,DPG是一种在连续动作空间中的直接求导策略梯度的方法。DDPG和DPG都属于策略梯度算法的一种,与其他策略梯度算法(如REINFORCE)的不同之处在于,DPG和DDPG都是基于偏微分方程的直接求导,而不是蒙特卡罗方法进行计算。DDPG使用一个确定性策略来生成动作,但同时使用一个噪声过程来扰动输出的动作,以产生更多的状态动作样本。这样一来,DDPG就具有了良好的探索能力,使得它在解决复杂的连续动作问题时能取得较好的效果。 ### 回答2: 深度确定性策略梯度(Deep Deterministic Policy GradientDDPG)是一种用于解决深度强化学习问题的方法。 DDPG是基于确定性策略梯度(Deterministic Policy Gradient,DPG)的算法,可以在连续动作空间下进行强化学习。与传统的策略梯度方法不同,DDPG直接学习确定性策略,在给定状态下选择最优的动作。 DDPG主要由两个网络组成:一个是Actor网络,用于学习确定性策略;另一个是Critic网络,用于估计状态-动作对的Q值。Actor网络根据当前状态选择动作,Critic网络根据当前状态和动作的组合估计其对应的Q值。通过不断地交互环境、收集数据和更新网络参数,DDPG算法逐渐优化确定性策略和Q值估计,以使得智能体在环境中获得更高的累积奖励。 DDPG算法的核心思想是通过使用Experience Replay和目标网络来提高学习的稳定性和收敛性。Experience Replay将智能体与环境的交互经验存储在一个经验回放缓冲区中,然后从中随机采样进行训练;目标网络通过延迟更新目标网络的方式,减小训练中的目标值变动,从而提高算法的稳定性。 DDPG算法在解决连续控制任务中表现出良好的性能和收敛性,可以应用于机器人控制、无人驾驶、金融交易等复杂任务中。然而,DDPG算法也存在一些挑战和问题,如对超参数的敏感性、样本效率较低等,这些问题是DDPG算法持续改进的方向之一。 ### 回答3: Deep Deterministic Policy GradientDDPG)是一种用于连续动作空间的深度强化学习算法。它结合了深度神经网络和确定性策略梯度的优势,可以应用于诸如机器人控制和金融投资等领域。 DDPG算法的核心思想是通过在连续动作空间中学习一个行动者-评论家系统。行动者使用确定性策略,即给定状态输出一个具体的动作,而评论家则评估行动者的动作质量。这两个网络都是用深度神经网络来表示,并通过梯度下降来进行优化。 在训练过程中,DDPG使用了经验回放缓冲区来存储之前的转换并随机采样进行训练。这样做可以解决样本相关性和非稳定性问题。同时,为了保持算法的探索性,DDPG采用了一个目标网络,用于与主网络进行定期的软更新。 DDPG的优点在于能够处理连续动作空间,通过近似价值函数和策略函数,对高维、非线性状态空间进行建模。此外,DDPG还有很好的收敛性和稳定性,可以在复杂任务中取得较好性能。 然而,DDPG也存在一些挑战。由于使用了神经网络近似值函数,对网络结构的选择和超参数的调整都非常重要。此外,训练过程中可能会出现训练不稳定的问题,需要进行合适的技巧和调整。 总结来说,DDPG是一种深度强化学习算法,适用于连续动作空间的问题。通过结合确定性策略梯度和深度神经网络的优势,DDPG能够解决高维、非线性状态空间的问题,并在复杂任务中取得好的性能。然而,对网络结构和超参数的选择需要仔细调整,且训练过程中可能存在稳定性问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值