强化学习 之 DDPG

参考

1、【强化学习】DDPG(Deep Deterministic Policy Gradient)算法详解
2、Deep Reinforcement Learning - 1. DDPG原理和算法(PG、DPG、DDPG描述)
3、深度强化学习(纲要、概括总结)

简介

Deep Deterministic Policy Gradient (DDPG) 是Google DeepMind 提出的一种使用 Actor Critic 结构,但是输出的不是行为的概率,而是具体的行为,用于连续动作的预测。

DDPG 结合了之前获得成功的 DQN 结构,提高了Actor Critic的稳定性和收敛性。
在这里插入图片描述
DDPG和Actor-Critic 形式差不多,也需要有基于 策略 Policy 的神经网络 和基于 价值 Value 的神经网络。但是为了体现 DQN 的思想,每种神经网络我们都需要再细分为两个。

Policy Gradient 这边有估计网络和现实网络。估计网络(eval_net)用来输出实时的动作,供 actor 在现实中实行.;而现实网络(target_net)则是用来更新价值网络系统的。

价值系统这边也有现实网络和估计网络。他们都在输出这个状态的价值,而输入端却有不同。状态现实网络会拿着 从动作现实网络来的动作 加上 状态的观测值 加以分析;而状态估计网络则是拿着 当时 Actor 施加的动作 当做输入。

在实际运用中,DDPG 的这种做法的确带来了更有效的学习过程。

算法分析

在这里插入图片描述
Actor 参数的更新
在这里插入图片描述
关于 Actor 部分,他的参数更新同样会涉及到 Critic,如上式所示。

前半部分 grad[Q] 是从 Critic 来的,这是在说:这次 Actor 的动作要怎么移动,才能获得更大的 Q

而后半部分 grad[u] 是从 Actor 来的,这是在说:Actor 要怎么样修改自身参数,使得 Actor 更有可能做这个动作。

所以两者合起来就表示:Actor 要朝着更有可能获取大 Q 的方向修改动作参数了。

Critic 参数的更新
在这里插入图片描述
Critic 的更新借鉴了 DQN 和 Double Q learning 的方式,有两个计算 Q 的神经网络。Q_target 中依据下一状态,用 Actor 来选择动作,而这时的 Actor 也是一个 Actor_target (有着 Actor 很久之前的参数)。

使用这种方法获得的 Q_target 能像 DQN 那样切断相关性,提高收敛性。

神经网络结构

在这里插入图片描述
Critic 和 Actor 分别建立两个不同的网络 target_net(真实)、eval_net(预测)

Actor 部分
在这里插入图片描述
Actor 更新:

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'):
	# 负的学习率为了使我们计算的梯度往上升, 和 Policy Gradient 中的方式一个性质
    opt = tf.train.AdamOptimizer(-self.lr)
    # 对 eval_net 的参数更新
    self.train_op = opt.apply_gradients(zip(self.policy_grads, self.e_params)) 

其中,a_grad 由是 Critic 生成并传送给 Actor,在 Critic 中如下计算 a_grad:

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

此处的 a 是来自 Actor 根据 S 计算而来的:“self.a = self._build_net(S, scope=‘eval_net’, trainable=True)”。

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(...)
# 将 actor 同它的 eval_net 和 target_net 产生的 a 和 a_ 传给 Critic
critic = Critic(..., actor.a, actor.a_)  
# 将 critic 产出的 dQ/da 加入到 Actor 的 Graph 中去
actor.add_grad_to_graph(critic.a_grads) 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值