【强化学习】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 中的 actionself.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/
【强化学习】Deep Deterministic Policy Gradient(DDPG)算法详解相关推荐
- 深度增强学习DDPG(Deep Deterministic Policy Gradient)算法源码走读
原文链接:https://blog.csdn.net/jinzhuojun/article/details/82556127 本文是基于OpenAI推出deep reinforcement learn ...
- DDPG(Deep Deterministic Policy Gradient)
Hi,这是第二篇算法简介呀 论文链接:"Continuous control with deep reinforcement learning." ,2016 文章概述 这篇文 ...
- 【强化学习】DDPG(Deep Deterministic Policy Gradient)算法详解
http://www0.cs.ucl.ac.uk/staff/d.silver/web/Teaching.html 引用莫凡老师的素材 https://morvanzhou.github.io/tut ...
- 梯度下降(Gradient descent)算法详解
梯度下降(Gradient descent)算法详解 说起梯度下降算法,其实并不是很难,它的重要作用就是求函数的极值.梯度下降就是求一个函数的最小值,对应的梯度上升就是求函数最大值.为什么这样说呢?兔 ...
- 强化学习笔记 DDPG (Deep Deterministic Policy Gradient)
1 总述 总体来讲,和actor-critic 差不多,只不过这里用了target network 和experience relay 强化学习笔记 experience replay 经验回放_UQ ...
- 强化学习系列之Policy Gradient算法
一. 背景 1.1 基础组成部分 强化学习里面包含三个部件:Actor,environment,reward function Actor : 表示角色,是能够被玩家控制的. Policy of Ac ...
- Policy gradient(策略梯度详解)
文章目录 策略梯度基本知识 什么是策略梯度? 强化学习案例 策略梯度公式详解 如何使你的损失函数更好 增加一个基准 为每一个action分配不同的权重 策略梯度基本知识 什么是策略梯度? 直接根据状态 ...
- php 定位_PHP进阶学习之Geo的地图定位算法详解
本文实例讲述了PHP进阶学习之Geo的地图定位算法.分享给大家供大家参考,具体如下: 前言 日常开发中我们经常需要查找某个物体的定位,或者查找附近的范围等,我们自然而然会想到的方法就是利用各种提供服务 ...
- 【强化学习】Actor-Critic(演员-评论家)算法详解
1 Actor Critic算法简介 1.1 为什么要有Actor Critic Actor-Critic的Actor的前身是Policy Gradient,这能让它毫不费力地在连续动作中选取合适的动 ...
最新文章
- JavaEE高级-MyBatis学习笔记
- Circular Sequence UVA - 1584
- ios消息推送机制原理与实现(转)
- mysql explain语句_Mysql explain 语句详解
- 华为荣耀七能升级鸿蒙系统吗,华为鸿蒙系统来了,你知道哪些华为手机荣耀手机可以升级吗?...
- N进制正反累加判回文数(洛谷P1015题题解,Java语言描述)
- P1616 疯狂的采药(python3实现)--80分
- VS中生成、清理项目、调试、開始运行(不调试)、Debug 和 Release等之间的差别...
- PHP运行模式的深入理解
- LeetCode 357. Count Numbers with Unique Digits
- 【leetcode】在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。
- 没项目经验难就业?推荐你参加“大学生就业特训营” | 100 个免费名额,先到先得!...
- 前端js下载mp4、flv格式的文件流
- c语言数码管按下k1显示1,单片机C语言程序的设计实训100例_基于8051+PROTEUS仿真1.docx...
- 把ipad变成电脑的音箱
- mac book usb 故障修复
- 芯片级维修学习课程安排
- mysql笛卡尔积查询很慢_浅谈MySQL使用笛卡尔积原理进行多表查询
- 网页验证码显示在输入框input上的方法
- 登录界面及其功能的设计