文章目录

  • 前言
  • values 和 policy
  • 策略的表示
  • 策略梯度
  • REINFORCE method
  • 实例:CartPole

前言

重读《Deep Reinforcemnet Learning Hands-on》, 常读常新, 极其深入浅出的一本深度强化学习教程。 本文的唯一贡献是对其进行了翻译和提炼, 加一点自己的理解组织成一篇中文笔记。

原英文书下载地址: 传送门
原代码地址: 传送门

本文是书本第九章,介绍DQN的一种替代:策略梯度方法。

values 和 policy

在DQN方法中,我们主要是通过深度网络,得到不同状态下不同动作所对应的Q值,然后选取Q值最大的动作。 这一策略我们可以表示如下:

π ( s ) = arg ⁡ m a x a Q ( s , a ) \pi(s)=\arg m a x_{a} Q(s, a) π(s)=argmaxa​Q(s,a)

然而这其实表明了一件事, 我们真正希望得到的是策略本身, 而并不是Q值,Q值是用来做出决策的。这不禁让我们想到,能否直接去获得策略,而不是间接地先通过Q值计算再获得策略呢?

这样做又如下的三个好处:

  1. 更直接。 自然,也有望带来更快的速度。
  2. 更适用于连续动作空间。 在DQN中,我们需要对每个动作都计算一个Q值,然而如果动作空间是连续而非离散的,那么就相当于有无数个动作,显然不可能求出所有的Q值。
  3. 策略学习类方法会引入随机性。具体而言,策略将被描述为动作的概率分布。 这在接下来会有所介绍,这对于网络的训练是有很大帮助的。

策略的表示

怎样表示一个策略? 最直观的做法是设计这样一个函数: 输入观测状态, 输出选取的动作结果。 然而,更好的做法则是:输出所有动作的概率分布(此处我们暂时仍假定离散的动作空间)。这个函数往往通过神经网络拟合,下图展示了一个例子:


这样做有诸多的好处:

  1. 如果是传统的直接输出单个动作结果的设计, 那么神经网络的微小变化也可能会导致输出结果的跳变,非常不稳定。 相反,如果以概率分布作为输出,那么网络的微小变化也只会导致概率分布的微小变化,比较稳定。 这非常契合神经网络梯度下降的本质。
  2. 由于策略是一个概率分布的结果,因此天然带有了探索的特性——即不存在说某一个动作绝不可能被选到的情况。

策略梯度

我们将策略梯度 (policy gradients, PG) 定义如下:

L = − Q ( s , a ) log ⁡ π ( a ∣ s ) \mathcal{L}=-Q(s, a) \log \pi(a \mid s) L=−Q(s,a)logπ(a∣s)

其中 Q ( s , a ) Q(s,a) Q(s,a)可以代表在状态 s s s下选用动作 a a a的价值(越大代表该动作越好),而 π ( a ∣ s ) \pi(a\mid s) π(a∣s)则代表我们的策略里此时选用该动作 a a a的概率。 值得一提的是,虽然名为策略梯度, 但 L \mathcal{L} L更多地被作为优化目标即损失函数来使用。 具体而言,我们期望在网络训练的过程中 (即对应策略 π \pi π的更新)能不断地最小化 L \mathcal{L} L,而这就要求对应于大 Q Q Q值的动作 a a a,其选取的概率 π ( a ∣ s ) \pi(a\mid s) π(a∣s)也应较大。 (log是一个单调增函数) 而这也就契合了我们的目标。

REINFORCE method

据此,我们可以得到策略梯度方法下的强化学习步骤:

  1. 随机初始化神经网络
  2. 进行N个回合, 保存数据 (s, a, r, s’)
  3. 对于第 k k k个回合的step t t t, 计算Q值为: Q k , t = ∑ i = 0 γ i r i Q_{k, t}=\sum_{i=0} \gamma^{i} r_{i} Qk,t​=∑i=0​γiri​
  4. 计算损失函数: L = − ∑ k , t Q k , t log ⁡ ( π ( a k , t ∣ s k , t , ) ) \mathcal{L}=-\sum_{k, t} Q_{k, t} \log \left(\pi\left(a_{k, t}\mid s_{k, t},\right)\right) L=−∑k,t​Qk,t​log(π(ak,t​∣sk,t​,))
  5. 训练网络,最小化 L \mathcal{L} L
  6. 从步骤2开始重复,直到收敛。

简单解释一下,这里用贝尔曼公式来计算Q值。 此外,注意到策略 π \pi π实质上就是神经网络: 接收 s s s,输出 a a a的概率。

实例:CartPole

以REINFORCE method 训练 CartPole游戏的代码在Chapter09/02_cartpole_reinforce.py之中。

首先:

class PGN(nn.Module):def __init__(self, input_size, n_actions):super(PGN, self).__init__()self.net = nn.Sequential(nn.Linear(input_size, 128),nn.ReLU(),nn.Linear(128, n_actions))def forward(self, x):return self.net(x)

这里定义了我们要训练的神经网络,注意到,输出维度为动作空间维度, 输入维度为观测维度。 值得一提的是,我们本期望的输出是所有动作的概率分布,那么照例应当使用softmax函数来进行归一。然而,出于计算复杂度等的考虑,作者将直接使用 log_softmax计算损失函数,因此这里就省略掉了。我们只要记住这里其实期望输出的就是不同动作的概率分布即可。

下面是训练程序部分:

optimizer.zero_grad()
states_v = torch.FloatTensor(batch_states)
batch_actions_t = torch.LongTensor(batch_actions)
batch_qvals_v = torch.FloatTensor(batch_qvals)logits_v = net(states_v)
log_prob_v = F.log_softmax(logits_v, dim=1)
log_prob_actions_v = batch_qvals_v * log_prob_v[range(len(batch_states)), batch_actions_t]
loss_v = -log_prob_actions_v.mean()loss_v.backward()
optimizer.step()

其中,states_v , batch_actions_tbatch_qvals_v 是通过与env环境交互后得到的状态、动作和对应的Q值,Q值由贝尔曼公式计算得到。此处最关键的语句是:
log_prob_actions_v = batch_qvals_v * log_prob_v[range(len(batch_states)), batch_actions_t]
这也是神经网络的损失函数 (log_prob_v 是神经网络输出的函数)。
具体而言,由于CartPole是一个动作空间只有2的环境,因此,net的输出也是一个2维向量,分别代表了选取两个动作的概率。log_prob_v[range(len(batch_states)), batch_actions_t]这里就是提取出实际所采用的动作所对应的概率值结果,再与该动作对应的Q值相乘。 这样一来,如果我们要最小化损失函数,就是最大化Q值与该动作的乘积结果。 我们就可以将Q值理解为这一动作的选取概率的权重,Q值越大的动作,网络也将向着提升该动作选取概率的方向训练,也即达到了我们强化学习的目的。

这份代码非常清晰,建议大家自己去调试学习。

【深度强化学习】策略梯度 Policy Gradients相关推荐

  1. 强化学习 | 策略梯度 | Natural PG | TRPO | PPO

    学习情况:

  2. 重温强化学习之深度强化学习

    1.简介                输入特征和真实特征相距比较远,加一个深度学习提取源的特征 2.基于值函数的深度强化学习 意义:不用函数近似无法解决大规模的问题,用函数近似训练不稳定,首次证明了 ...

  3. 【论文解读】深度强化学习基石论文:函数近似的策略梯度方法

     导读:这篇是1999 年Richard Sutton 在强化学习领域中的经典论文,论文证明了策略梯度定理和在用函数近似 Q 值时策略梯度定理依然成立,本论文奠定了后续以深度强化学习策略梯度方法的基石 ...

  4. bootstrapt学习指南_TensorFlow 2.0深度强化学习指南

    摘要: 用深度强化学习来展示TensorFlow 2.0的强大特性! 在本教程中,我将通过实施Advantage Actor-Critic(演员-评论家,A2C)代理来解决经典的CartPole-v0 ...

  5. 深度强化学习综述论文 A Brief Survey of Deep Reinforcement Learning

    A Brief Survey of Deep Reinforcement Learning 深度强化学习的简要概述 作者: Kai Arulkumaran, Marc Peter Deisenroth ...

  6. 中科院自动化所介绍深度强化学习进展:从AlphaGo到AlphaGo Zero

    来源:德先生 概要:2016年初,AlphaGo战胜李世石成为人工智能的里程碑事件.其核心技术深度强化学习受到人们的广泛关注和研究,取得了丰硕的理论和应用成果. 深度强化学习进展:  从AlphaGo ...

  7. 深度强化学习(三):Policy Gradients

    ###一.Policy-based RL概述 ####1.Policy-based RL起源 在学习Policy Gradiens(PG)之前,我们将强化学习的方法分成两类进行考虑: 一类是value ...

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

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

  9. 系统学习深度学习(三十五)--策略梯度(Policy Gradient)

    转自:https://www.cnblogs.com/pinard/p/10137696.html 在前面讲到的DQN系列强化学习算法中,我们主要对价值函数进行了近似表示,基于价值来学习.这种Valu ...

最新文章

  1. java gui 案例_JavaGui入门—布局的嵌套使用附实例
  2. slot没有毁灭的问题_解析flink之perjob模式下yn参数不生效问题
  3. Python 空字符串转化问题:ValueError: invalid literal for int() with base 10: ' ',原因及解决方法。
  4. ML/DL之激活函数/求导函数:ML中常用的AF激活函数(step_function、sigmoid、softmax、ReLU等)求导函数等代码实现之详细攻略
  5. 批量从网上下载图片、zip等文件到本地[java爬虫]
  6. Stanford CoreNLP 3.6.0 中文指代消解模块调用失败的解决方案
  7. 微软面试题:写程序找出二叉树的深度
  8. JS打开摄像头并截图上传
  9. 【VRP】基于matlab遗传算法求解多车辆路径规划问题【含Matlab源码 1249期】
  10. 四分位数算法记录(含java代码实现)
  11. WOS(一)——文献高级检索
  12. Arduino Uno 与 触摸模块 ttp223 实验详录
  13. 奇安信和深信服哪个好_你为什么从深信服离职?
  14. 拉依达准则python实现
  15. 基于51单片机智能电子密码锁的设计
  16. 后台怎么接收处理从url 客户端传来的json数据格式
  17. 看inux系统中的c语言编译器,Linux系统自定义安装C语言gcc编译器图文详细教程
  18. JS.Razor.CSHtml结合使用
  19. mysql utf8mb4 bin_Mysql的utf8与utf8mb4区别,utf8mb4_bin、utf8mb4_general_ci与utf8mb4_unicode_ci的选择...
  20. js函数arguments的使用

热门文章

  1. 【Android开源控件】SmartRefreshLayout实现下拉刷新,上划加载
  2. 职场中提升自信心的四种绝佳方法
  3. vue只有package-lock.json,没有package.json文件的时候
  4. CSS(3)学习笔记——持续更新
  5. RW007模块连接ONENET之UART模式(一)
  6. matlab mann-kendall,基于Matlab的Mann-Kendall突变检验及高分辨率图形输出
  7. 华微电子否认与奇虎360有“绯闻”
  8. html 打开腾讯qq,qq软件管理器 QQ应用管理器里面的腾讯软件打不开
  9. Linux基础之文件编程
  10. CAD教程:实体对象复制移动的操作教程