转自:https://www.cnblogs.com/pinard/p/10137696.html

在前面讲到的DQN系列强化学习算法中,我们主要对价值函数进行了近似表示,基于价值来学习。这种Value Based强化学习方法在很多领域都得到比较好的应用,但是Value Based强化学习方法也有很多局限性,因此在另一些场景下我们需要其他的方法,比如本篇讨论的策略梯度(Policy Gradient),它是Policy Based强化学习方法,基于策略来学习。

    本文参考了Sutton的强化学习书第13章和策略梯度的论文。

1. Value Based强化学习方法的不足

    DQN系列强化学习算法主要的问题主要有三点。

    第一点是对连续动作的处理能力不足。DQN之类的方法一般都是只处理离散动作,无法处理连续动作。虽然有NAF DQN之类的变通方法,但是并不优雅。比如我们之前提到的经典的冰球世界(PuckWorld) 强化学习问题,具体的动态demo见这里。环境由一个正方形区域构成代表着冰球场地,场地内大的圆代表着运动员个体,小圆代表着目标冰球。在这个正方形环境中,小圆会每隔一定的时间随机改变在场地的位置,而代表个体的大圆的任务就是尽可能快的接近冰球目标。大圆可以操作的行为是在水平和竖直共四个方向上施加一个时间乘时长的力,借此来改变大圆的速度。假如此时这个力的大小和方向是可以灵活选择的,那么使用普通的DQN之类的算法就不好做了。因为此时策略是一个有具体值有方向的力,我们可以把这个力在水平和垂直方向分解。那么这个力就是两个连续的向量组成,这个策略使用离散的方式是不好表达的,但是用Policy Based强化学习方法却很容易建模。

    第二点是对受限状态下的问题处理能力不足。在使用特征来描述状态空间中的某一个状态时,有可能因为个体观测的限制或者建模的局限,导致真实环境下本来不同的两个状态却再我们建模后拥有相同的特征描述,进而很有可能导致我们的value Based方法无法得到最优解。此时使用Policy Based强化学习方法也很有效。

    第三点是无法解决随机策略问题。Value Based强化学习方法对应的最优策略通常是确定性策略,因为其是从众多行为价值中选择一个最大价值的行为,而有些问题的最优策略却是随机策略,这种情况下同样是无法通过基于价值的学习来求解的。这时也可以考虑使用Policy Based强化学习方法。

    由于上面这些原因,Value Based强化学习方法不能通吃所有的场景,我们需要新的解决上述类别问题的方法,比如Policy Based强化学习方法。

2. Policy Based强化学习方法引入

    回想我们在value Based强化学习方法里,我们对价值函数进行了近似表示,引入了一个动作价值函数q̂,这个函数由参数w描述,并接受状态s与动作a作为输入,计算后得到近似的动作价值,即:

q̂ (s,a,w)≈qπ(s,a)

    在Policy Based强化学习方法下,我们采样类似的思路,只不过这时我们对策略进行近似表示。此时策略π可以被被描述为一个包含参数θ的函数,即:

πθ(s,a)=P(a|s,θ)≈π(a|s)

    将策略表示成一个连续的函数后,我们就可以用连续函数的优化方法来寻找最优的策略了。而最常用的方法就是梯度上升法了,那么这个梯度对应的优化目标如何定义呢?

3. 策略梯度的优化目标

    我们要用梯度上升来寻找最优的梯度,首先就要找到一个可以优化的函数目标。

    最简单的优化目标就是初始状态收获的期望,即优化目标为:

    但是有的问题是没有明确的初始状态的,那么我们的优化目标可以定义平均价值,即:

    其中,dπθ(s)是基于策略πθ生成的马尔科夫链关于状态的静态分布。

    或者定义为每一时间步的平均奖励,即:

    无论我们是采用J1,JavV还是JavR来表示优化目标,最终对θ求导的梯度都可以表示为:

    具体的证明过程这里就不再列了,如果大家感兴趣,可以去看策略梯度的论文的附录1,里面有详细的证明。

    当然我们还可以采用很多其他可能的优化目标来做梯度上升,此时我们的梯度式子里面的∇θlogπθ(s,a)部分并不改变,变化的只是后面的Qπ(s,a)]部分。对于∇θlogπθ(s,a),我们一般称为分值函数(score function)。

    现在梯度的式子已经有了,后面剩下的就是策略函数πθ(s,a)的设计了。

4. 策略函数的设计

    现在我们回头看一下策略函数πθ(s,a)的设计,在前面它一直是一个数学符号。

    最常用的策略函数就是softmax策略函数了,它主要应用于离散空间中,softmax策略使用描述状态和行为的特征ϕ(s,a)与参数θ的线性组合来权衡一个行为发生的几率,即:

    则通过求导很容易求出对应的分值函数为:

    另一种高斯策略则是应用于连续行为空间的一种常用策略。该策略对应的行为从高斯分布ℕ(ϕ(?)?θ,σ?)中产生。高斯策略对应的分值函数求导可以得到为:

    有策略梯度的公式和策略函数,我们可以得到第一版的策略梯度算法了。

5. 蒙特卡罗策略梯度reinforce算法

    这里我们讨论最简单的策略梯度算法,蒙特卡罗策略梯度reinforce算法, 使用价值函数v(s)来近似代替策略梯度公式里面的Qπ(s,a)Qπ(s,a)。算法的流程很简单,如下所示:

    输入:N个蒙特卡罗完整序列,训练步长α

    输出:策略函数的参数θ

    1. for 每个蒙特卡罗序列:

    a. 用蒙特卡罗法计算序列每个时间位置t的状态价值vt

    b. 对序列每个时间位置t,使用梯度上升法,更新策略函数的参数θ:

2. 返回策略函数的参数θ

  这里的策略函数可以是softmax策略,高斯策略或者其他策略。

6. 策略梯度实例

    这里给出第5节的蒙特卡罗策略梯度reinforce算法的一个实例。仍然使用了OpenAI Gym中的CartPole-v0游戏来作为我们算法应用。CartPole-v0游戏的介绍参见这里。它比较简单,基本要求就是控制下面的cart移动使连接在上面的pole保持垂直不倒。这个任务只有两个离散动作,要么向左用力,要么向右用力。而state状态就是这个cart的位置和速度, pole的角度和角速度,4维的特征。坚持到200分的奖励则为过关。

    完整的代码参见我的github:https://github.com/ljpzzz/machinelearning/blob/master/reinforcement-learning/policy_gradient.py

    这里我们采用softmax策略作为我们的策略函数,同时,softmax的前置部分,也就是我们的策略模型用一个三层的softmax神经网络来表示。这样好处就是梯度的更新可以交给神经网络来做。

    我们的softmax神经网络的结构如下,注意这个网络不是价值Q网络,而是策略网络:

    def create_softmax_network(self):# network weightsW1 = self.weight_variable([self.state_dim, 20])b1 = self.bias_variable([20])W2 = self.weight_variable([20, self.action_dim])b2 = self.bias_variable([self.action_dim])# input layerself.state_input = tf.placeholder("float", [None, self.state_dim])self.tf_acts = tf.placeholder(tf.int32, [None, ], name="actions_num")self.tf_vt = tf.placeholder(tf.float32, [None, ], name="actions_value")# hidden layersh_layer = tf.nn.relu(tf.matmul(self.state_input, W1) + b1)# softmax layerself.softmax_input = tf.matmul(h_layer, W2) + b2#softmax outputself.all_act_prob = tf.nn.softmax(self.softmax_input, name='act_prob')self.neg_log_prob = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=self.softmax_input,labels=self.tf_acts)self.loss = tf.reduce_mean(self.neg_log_prob * self.tf_vt)  # reward guided lossself.train_op = tf.train.AdamOptimizer(LEARNING_RATE).minimize(self.loss)

    注意我们的损失函数是softmax交叉熵损失函数和状态价值函数的乘积,这样TensorFlow后面可以自动帮我们做梯度的迭代优化。

    另一个要注意的点就是蒙特卡罗法里面价值函数的计算,一般是从后向前算,这样前面的价值的计算可以利用后面的价值作为中间结果,简化计算,对应代码如下:

    def learn(self):discounted_ep_rs = np.zeros_like(self.ep_rs)running_add = 0for t in reversed(range(0, len(self.ep_rs))):running_add = running_add * GAMMA + self.ep_rs[t]discounted_ep_rs[t] = running_adddiscounted_ep_rs -= np.mean(discounted_ep_rs)discounted_ep_rs /= np.std(discounted_ep_rs)

    其余部分和之前的DQN的代码类似。

7. 策略梯度小结

    策略梯度提供了和DQN之类的方法不同的新思路,但是我们上面的蒙特卡罗策略梯度reinforce算法却并不完美。由于是蒙特卡罗法,我们需要完全的序列样本才能做算法迭代,同时蒙特卡罗法使用收获的期望来计算状态价值,会导致行为有较多的变异性,我们的参数更新的方向很可能不是策略梯度的最优方向。

    因此,Policy Based的强化学习方法还需要改进,注意到我们之前有Value Based强化学习方法,那么两者能不能结合起来一起使用呢?下一篇我们讨论Policy Based+Value Based结合的策略梯度方法Actor-Critic。

系统学习深度学习(三十五)--策略梯度(Policy Gradient)相关推荐

  1. 强化学习(Reinforcement Learning)之策略梯度(Policy Gradient)的一点点理解以及代码的对应解释

    一.策略梯度算法推导以及解释 1.1 背景 设πθ(s)\pi_{\theta }(s)πθ​(s)是一个有网络参数θ\thetaθ的actor,然后我们让这个actor和环境(environment ...

  2. Slicer学习笔记(三十五)slicer学习链接

    Slicer学习笔记(三十五)slicer学习链接 使用方面: 坐标系:https://www.slicer.org/wiki/Coordinate_systems 模块:https://slicer ...

  3. 强化学习(十三) 策略梯度(Policy Gradient)

    在前面讲到的DQN系列强化学习算法中,我们主要对价值函数进行了近似表示,基于价值来学习.这种Value Based强化学习方法在很多领域都得到比较好的应用,但是Value Based强化学习方法也有很 ...

  4. Java学习笔记(三十五)

    在完成对C语言的学习后,我最近开始了对C++和Java的学习,目前跟着视频学习了一些语法,也跟着敲了一些代码,有了一定的掌握程度.现在将跟着视频做的笔记进行整理.本篇博客是整理Java知识点的第三十五 ...

  5. 【OS学习笔记】三十五 保护模式十:中断描述符表、中断门和陷阱门

    上一篇文章学习了中断与异常的概念:[OS学习笔记]三十四 保护模式十:中断和异常区别 本片文章接着学习以下内容: 中断描述符表 中断门 陷阱门 1 中断描述符表 我们前面讲了无数次,在实模式下,是由位 ...

  6. 【C语言进阶深度学习记录】三十五 程序中的堆、栈以及静态存储区(数据区)

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 在我之前学习底层的知识的时候,也写过相关的内容.可以对比的学习:[软 ...

  7. 强化学习(4):策略梯度Policy Gradient算法

    本章内容主要参考了UC Berkeley Deep RL Bootcamp的内容,由作者按照自己的理解整理而成 终于到Policy Gradient方法了! 一.引言 reinforcement le ...

  8. 深度学习笔记(三十五)残差神经网络ResNet

    训练深层神经网络时,如果深度特别大,其实是很难训练下去的,因为会遇到梯度消失和梯度爆炸的问题.残差网络可以帮助我们更好地训练深层神经网络. 一.残差块 在神经网络的两层中,会执行如下运算过程(主路径) ...

  9. 深度学习自学(三十五):双向图推理全景图像分割

    整理的人脸系列学习经验:包括人脸检测.人脸关键点检测.人脸优选.人脸对齐.人脸特征提取,Re-ID等学习过程总结,有需要的可以参考,仅供学习,请勿盗用.https://blog.csdn.net/Th ...

最新文章

  1. 【Android】Activity生命周期(亲测)
  2. 公司内部将多国语言key转换成中文javaScript
  3. python面试-Python面试题(整理)
  4. Java安全管理器――SecurityManager
  5. GPM - 多语言实现视频
  6. 解析程序员的几个成长阶段
  7. Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-
  8. 团队行为心理学读书笔记(5)执行力背后的行为心理学
  9. 骁龙660是32位还是64位_高通发布骁龙 7c/8c 芯片,以后你可能会在电脑上看到它...
  10. 【算法分析与设计】数组循环移位问题
  11. matlab求积分数值解,利用matlab求解数值积分
  12. OpenCV-利用其它widthStep方法把interest——img的所有像素值增加200
  13. android 按钮果冻效果,用Tween动画简单模拟果冻按钮效果
  14. 2008-2020年上市公司环境信息披露质量指数EDI、环境绩效明细、环境排放明细、资源消耗明细
  15. Python+Docker+Redis-实现分布式爬取阳光问政
  16. 数据库中查出的树形,获取其所有子孙(递归方式)
  17. DJ4-3 路由器的工作原理
  18. win10可以运行linux模拟器,Win10将原生兼容安卓App,但模拟器不会被打败
  19. ExtJs 学习教程,个人感觉不错。
  20. win11耳机和扬声器怎么分开控制音量?

热门文章

  1. FFmpeg编解码过程(五)
  2. 贯穿时域与频域的方法——傅立叶分析
  3. usb audio知识点
  4. C#之网络字节序与主机字节序互转
  5. idea怎么调试jsp页面_一文学会JSP
  6. web项目怎么打包上线_如何打包发布Web Application应用程序
  7. 类的应用python平均分_【数据科学系统学习】Python # 数据分析基本操作[四] 数据规整化和数据聚合与分组运算...
  8. php laravel 理解,程序员-说一下PHP框架Laravel,如何理解她的思想
  9. linux vnc 安装目录,Linux环境VNC服务安装、配置与使用(图)
  10. JAVA中dot的用法_Java 方法