一 r ( τ ) r(\tau) r(τ)的baseline

毫无疑问, r ( τ ) r(\tau) r(τ)代表着轨道 τ \tau τ的好坏。按照我们推导出来的policy gradient的式子, r ( τ ) r(\tau) r(τ)大于0的时候,训练会使得这个轨道上涉及的所有 π w ( a i ∣ s i ) \pi_{w}\left(a_{i} \mid s_{i}\right) πw​(ai​∣si​)增加。这说明,如果 τ \tau τ是一条比较好的轨道,则我们应该“充分学习成功的经验”,让 τ \tau τ涉及到的每一次决策 ( s i , a i ) (s_i, a_i) (si​,ai​)的概率都增大;同理,当 r ( τ ) r(\tau) r(τ)小于0的时候,训练会使得这个轨道上所有 π w ( a i ∣ s i ) \pi_{w}\left(a_{i} \mid s_{i}\right) πw​(ai​∣si​)概率减少。这是因为 τ \tau τ是一条比较失败的轨道,所以我们应该“避免重蹈覆辙”,让 τ \tau τ涉及的每一次决策 ( s i , a i ) (s_i, a_i) (si​,ai​)的概率都减少。从训练的公式上看,我们能够实现上述目的。从直觉上说,上述的目的也是合情合理的。这令我们非常满意。

但是,我们现在要考虑下面的情况:假设我们的MDP所定义的 τ \tau τ都是大于0的,则所有 r ( τ ) r(\tau) r(τ)都应该是正的,只有大和小的分别,没有正和负的分别。在 r ( τ ) r(\tau) r(τ)比较小的时候 τ \tau τ包含着“失败的经验”(例如贪吃蛇游戏中, r ( τ ) r(\tau) r(τ)用游戏结束时蛇的长度来表示,那么 r ( τ ) = 5 r(\tau)=5 r(τ)=5是一个很差的结果)。

现在的问题是:如果我们坚持用 r ( τ ) r(\tau) r(τ)来训练,就会出现“学习失败经验”的情况,似乎“不合情理”;而如果对 r ( τ ) r(\tau) r(τ)进行调整,就与我们推导的策略梯度的公式有所偏差,不知会不会出现错误。这个问题应该如何解释呢?

但是,如果我们采样了许多 τ \tau τ,其中的 r ( τ ) r(\tau) r(τ)有大有小、全部大于0。我们用这些数据训练的效果就完全等同于将较小的 r ( τ ) r(\tau) r(τ)变成负数,将较大的 r ( τ ) r(\tau) r(τ)变成小一些的正数。这就好像用 r ( τ ) r(\tau) r(τ)减去自己的均值再去进行训练一样。

我们的策略梯度是: ∇ w J ( w ) = E w [ ∇ w log ⁡ ( P w ( τ ) ) r ( τ ) ] \nabla_{w} J(w)=E_{w}\left[\nabla_{w} \log \left(P_{w}(\tau)\right) r(\tau)\right] ∇w​J(w)=Ew​[∇w​log(Pw​(τ))r(τ)]
如果改变 r ( τ ) r(\tau) r(τ),给他加一个常数:
E w [ ∇ w log ⁡ ( P w ( τ ) ) ( r ( τ ) + b ) ] = E w [ ∇ w log ⁡ ( P w ( τ ) ) r ( τ ) ] + E w [ ∇ w log ⁡ ( P w ( τ ) ) b ] E_{w}\left[\nabla_{w} \log \left(P_{w}(\tau)\right) (r(\tau)+b)\right]=E_{w}\left[\nabla_{w} \log \left(P_{w}(\tau)\right) r(\tau)\right]+E_{w}\left[\nabla_{w} \log \left(P_{w}(\tau)\right) b\right] Ew​[∇w​log(Pw​(τ))(r(τ)+b)]=Ew​[∇w​log(Pw​(τ))r(τ)]+Ew​[∇w​log(Pw​(τ))b]
而 E w [ ∇ w log ⁡ ( P w ( τ ) ) b ] = ∫ t a u ∇ w P w ( τ ) b d τ = b ∇ w ∫ τ P w ( τ ) d τ = 0 E_{w}\left[\nabla_{w} \log \left(P_{w}(\tau)\right) b\right]=\int_{t a u} \nabla_{w} P_{w}(\tau) b d \tau=b \nabla_{w} \int_{\tau} P_{w}(\tau) d \tau=0 Ew​[∇w​log(Pw​(τ))b]=∫tau​∇w​Pw​(τ)bdτ=b∇w​∫τ​Pw​(τ)dτ=0

所以得到:
∇ w J ( w ) = E w [ ∇ w log ⁡ ( P w ( τ ) ) ( r ( τ ) + b ) ] \nabla_{w} J(w) = E_{w}\left[\nabla_{w} \log \left(P_{w}(\tau)\right) (r(\tau)+b)\right] ∇w​J(w)=Ew​[∇w​log(Pw​(τ))(r(τ)+b)]
这启发我们,如果将所有轨道对应的奖励总和 r ( τ ) r(\tau) r(τ)(即训练时的“权重”)同时增加一个常数 b b b ,其实是不会影响策略梯度的求值的。

从直观上来说, b b b应该取值为 r ( τ ) r(\tau) r(τ)的均值,这可以使得 r ( τ ) − b r(\tau)-b r(τ)−b的平方和最小。并且这样可以使得“比较好的”轨道 τ \tau τ对应的权重 r ( τ ) − b r(\tau)-b r(τ)−b都是正数,而“比较差的”轨道 τ \tau τ对应的权重 r ( τ ) r(\tau) r(τ)是负数。但是,这并不意味着估计的均方误差最小。如果经过严格的数学推理,我们会发现其实 b b b不是取 r ( τ ) r(\tau) r(τ)的均值,而是取 r ( τ ) r(\tau) r(τ)关于对应梯度大小的加权均值时候,估计的均方误差最小。不过在实践中人们发现,将 b b b取为 r ( τ ) r(\tau) r(τ)的均值,虽然不能达到“均方误差最小”,但是计算比较简单,效果也相当不错,而且“赏罚分明”,比较符合人们的直观。所以人们一般就将 b b b取为所有 r ( τ ) r(\tau) r(τ)的均值。这也就是说,在训练时,我们一般先对采样出的所有轨道的 r ( τ ) r(\tau) r(τ)进行中心化,然后再求其均值以用来估计策略梯度

二 Experience Replay

policy gradient显然是一个on-policy的算法。换言之,我们必须用当前策略产生的数据,才能训练改善当前的策略。

在DQN中,由于DQN具有off-policy的特性,它可以采用experience replay,将所有训练中产生的 ( s , a , r , s ′ ) \left(s, a, r, s^{\prime}\right) (s,a,r,s′)数据集都记录下来,放在一个记忆库中。每次训练的时候,都可以从中随机抽取出一个batch来训练。此举有很多好处,例如提高数据的利用率、减少产生数据的成本,打断同一个batch数据集前后关联程度、增加训练集之间独立性等等。如果策略梯度算法必须每一步产生大量数据,而只用来训练一次就丢掉,无疑太过浪费了。所以,我们的问题是,在策略梯度算法中,如何才能正确利用过去的数据呢?

策略梯度公式唯一妨碍我们采用off-policy的地方就只有一个,那就是 τ i \tau_i τi​不服从 P w ( τ ) P_w(\tau) Pw​(τ)分布。

化简一下我们的问题,我们想求的是 E x ∼ p ( x ) [ f ( x ) ] E_{x \sim p(x)}[f(x)] Ex∼p(x)​[f(x)] ,但我们只有一组 x ∼ q ( x ) x \sim q(x) x∼q(x)的样本,我们掌握 f ( x ) f(x) f(x)的计算方法,并且也掌握 p ( x ) p(x) p(x)与 q ( x ) q(x) q(x)的表达式。唯一的问题就是 p ( x ) p(x) p(x)与 q ( x ) q(x) q(x)是不同的概率密度函数。注意如下的公式:
E x ∼ p ( x ) [ f ( x ) ] = ∫ x p ( x ) f ( x ) d x = ∫ x q ( x ) p ( x ) q ( x ) f ( x ) d x = E x ∼ q ( x ) [ p ( x ) q ( x ) f ( x ) ] E_{x \sim p(x)}[f(x)]=\int_{x} p(x) f(x) d x=\int_{x} q(x) \frac{p(x)}{q(x)} f(x) d x=E_{x \sim q(x)}\left[\frac{p(x)}{q(x)} f(x)\right] Ex∼p(x)​[f(x)]=∫x​p(x)f(x)dx=∫x​q(x)q(x)p(x)​f(x)dx=Ex∼q(x)​[q(x)p(x)​f(x)]
这也就是说,如果我们对当前这组样本 x x x对应的 p ( x ) q ( x ) f ( x ) \frac{p(x)}{q(x)} f(x) q(x)p(x)​f(x)求均值,就可以得到 E x ∼ p ( x ) [ f ( x ) ] E_{x \sim p(x)}[f(x)] Ex∼p(x)​[f(x)]的一个无偏估计。

上述的方法被称为“重要性蒙特卡洛方法”。即通过为每个样本增加一个“重要性权重” p ( x ) q ( x ) \frac{p(x)}{q(x)} q(x)p(x)​,使得本来服从 q ( x ) q(x) q(x)分布的一组样本可以被“强行改成”服从于 p ( x ) p(x) p(x)分布的样本。这样一来,就可以计算我们手头上没有样本的分布所对应的期望了。以下的图片展示为什么我们可以通过改变样本的“重要性权重”达到改变样本分布的目的。要注意的是,左图中的黑点位置在右图中位置没有移动,只是按照不同权重变成了不同大小的红点,其对应的分布也发生了改变。

所有基于策略的方法都天然地是on-policy的算法。为了将其off-policy的训练,提升性能,我们都需要采取类似于重要性采样的方法。

三 Exploration

在DQN中,exploration可以增加数据集的多样性,使得算法更加鲁棒。主要有两种exploration方法,一种 ϵ − \epsilon- ϵ− greedy,即以 1 − ϵ 1-\epsilon 1−ϵ的概率按照 a r g m a x Q ( s , a ) argmaxQ(s, a) argmaxQ(s,a)选择 a a a,而以 ϵ \epsilon ϵ的概率随机选择一个 a a a;另一种方式叫做Boltzmann Exploration,即按照 exp ⁡ ( Q ( s , a ) ) \exp(Q(s, a)) exp(Q(s,a))归一化后的概率产生 a a a。这两种方法都可以为数据集增加多样性,不过后一种方法的性能要比前者更鲁棒,因为它充分地考虑了所有不同 a a a之间的优劣,让 Q ( s , a ) Q(s, a) Q(s,a)更高的 a a a更容易被选中。

policy gradient算法和DQN是完全不同的。它不是要估计某个“客观的价值”,而是要直接输出“最佳的策略”。所以,它不会像DQN一样存在“局部收敛”的问题。但是,在迭代中我们要随机采样很多 τ i \tau_i τi​ ,求出 ∇ w log ⁡ P w ( τ i ) r ( τ i ) \nabla_{w} \log P_{w}\left(\tau_{i}\right) r\left(\tau_{i}\right) ∇w​logPw​(τi​)r(τi​)的平均值,以估计policy gradient E w ( ∇ w log ⁡ P w ( τ ) r ( τ ) ) E_{w}\left(\nabla_{w} \log P_{w}(\tau) r(\tau)\right) Ew​(∇w​logPw​(τ)r(τ)) 。如果我们采样出来的 τ \tau τ不够多样,则估计的policy gradient肯定会不够准确。换句话说,我们希望 P w ( τ ) P_w(\tau) Pw​(τ)的分布更加“平均”一些,这样,通过蒙特卡洛方法对 P w ( τ ) P_w(\tau) Pw​(τ)求期望才会更加准确。从这个角度说,一定程度的explore对于训练策略网络也是很重要的。

策略网络天然就具有explore的方式——它输出的本来就是 π w ( a ∣ s ) \pi_{w}(a \mid s) πw​(a∣s)的概率,我们让Agent按照这个概率分布去随机抽样 a a a,做出决策,则得到 τ \tau τ自然是具有多样性的。但是随着训练的进行,某些 ( s , a ) (s, a) (s,a)的 π w ( a ∣ s ) \pi_{w}(a \mid s) πw​(a∣s)趋于1,这样一来 τ \tau τ的多样性也大大的减少了。归根结底,这是因为我们并没有显式地去定义如何增加 τ \tau τ的多样性,我们应该对多样性进行一个严格的定义,并显式地去增加它。

我们定义熵函数 H ( s ) = Σ a π v o ( s , a ) log ⁡ ( π w ( s , a ) ) H(s)=\Sigma_{a} \pi_{v o}(s, a) \log \left(\pi_{w}(s, a)\right) H(s)=Σa​πvo​(s,a)log(πw​(s,a)),表示面对输入状态 s s s时,策略网络输出的 a a a的概率分布的熵。若 a a a的概率分布越均匀,则熵越大。对不同的 s s s,策略网络输出的 a a a的分布不同,熵函数自然也不同,所以熵函数是一个关于 s s s的函数,将其记为 H ( s ) H(s) H(s)。我们定义策略的熵为不同状态下熵的期望值,即:
E w ( H ( s ) ) = ∫ s P w ( s ) H ( s ) d s E_{w}(H(s))=\int_{s} P_{w}(s) H(s) d s Ew​(H(s))=∫s​Pw​(s)H(s)ds
策略的熵越大,说明它决策中 ( s , a ) (s, a) (s,a)的丰富度越高,用它决策出来的 τ \tau τ就越多样。

在基本的policy gradient中,我们迭代地让 w w w沿着 ∇ w J ( w ) \nabla_wJ(w) ∇w​J(w)的方向更新,以谋求获得更大的 J ( w ) J(w) J(w)。现在,我们修改一下,让 w w w沿着 ∇ w [ J ( w ) + α E w ( H ( s ) ) ] \nabla_{w}\left[J(w)+\alpha E_{w}(H(s))\right] ∇w​[J(w)+αEw​(H(s))]的方向更新,意思是我们既要考虑增大总的奖励 J ( w ) J(w) J(w),也要同时考虑让策略具有更大的熵、让它决策更具有多样性。这就好像是在说,我们要多为自己的人生保留无限的可能性,不要过早地把自己给限定死了。 α \alpha α是一个惩罚系数,表示我们对于“决策多样性”的重视程度。 α \alpha α越高,就代表我们越重视多种不同的经验,越会努力去尝试让自己人生丰富多彩。它与机器学习中的正则项系数有一定相似性,相当于超参数。要多调试一下不同的 α \alpha α才能找出其最佳的取值。

【RL】策略梯度的训练技巧相关推荐

  1. RL策略梯度方法之(十二): actor-critic with experience replay(ACER)

    本专栏按照 https://lilianweng.github.io/lil-log/2018/04/08/policy-gradient-algorithms.html 顺序进行总结 . 文章目录 ...

  2. RL策略梯度方法之(八): Distributed Distributional DDPG (D4PG)

    本专栏按照 https://lilianweng.github.io/lil-log/2018/04/08/policy-gradient-algorithms.html 顺序进行总结 . 文章目录 ...

  3. 策略梯度模型 (Policy Gradient)原理与实现

    作者:陆平 1. 智能体与环境 策略梯度(Policy Gradient)模型是强化学习中的一个经典基础模型.它用来在某种环境下训练智能体.对于一些简单场景,我们可以把智能体与环境及关系抽象为: 智能 ...

  4. 深化学习(RL)概念应用以及基于表格型、神经网络型、策略梯度、连续动作空间求解RL​​​​​​​

    深化学习(RL)概念应用以及基于表格型.神经网络型.策略梯度.连续动作空间求解RL 目录 一.概念以及应用 二.基于表格型求解RL--Sarsa和learning 表格型方法--Sarsa 1. Sa ...

  5. 【RL】策略梯度(VPG)与Actor-critic的思想与推导

    获取更多内容,请访问博主的个人博客 爱吃猫的小鱼干的Blog 一 RL学习什么 动作值函数(Q函数). 以Q-Learning.DQN为代表,这个系列的算法学习最优动作值函数 Q∗(s,a)Q^*(s ...

  6. 策略梯度训练cartpole小游戏

    我原来已经安装了anaconda,在此基础上进入cmd进行pip install tensorflow和pip install gym就可以了. 在win10的pycharm做的. policy_gr ...

  7. RL之PG:基于TF利用策略梯度算法玩Cartpole游戏实现智能得高分

    RL之PG:基于TF利用策略梯度算法玩Cartpole游戏实现智能得高分 目录 输出结果 设计思路 测试过程 输出结果 视频观看地址:强化学习-基于TF利用策略梯度算法玩Cartpole游戏实现智能得 ...

  8. 【从RL到DRL】深度强化学习基础(四)——策略梯度中的Baseline,Reinforce与A2C的对比

    目录 带有Baseline的策略梯度 数学推导 蒙特卡洛近似(With Baseline) Reinforce With Baseline 使用Reinforce算法训练: Advantage Act ...

  9. 【从RL到DRL】深度强化学习基础(五)离散控制与连续控制——确定策略梯度方法(DPG)、使用随机策略进行连续控制

    目录 确定策略梯度(Deterministic Policy Gradient,DPG) 改进:使用Target Network 随机策略与确定策略网络对比 使用随机策略进行连续控制 策略网络搭建 策 ...

最新文章

  1. 2018-2019-1 20165226 《信息安全系统设计基础》第4周学习总结
  2. GridView跨行合并单元格
  3. linux怎么在win上安装mysql_CentOS下安装MySQL及Windows下使用Navicat for MySQL连接
  4. 2019年 ICPC亚洲区预赛(上海赛区)总结
  5. openwrt lamp
  6. oracle写完存储过程之后,oracle存储过程和自定义函数
  7. java中的轻重量级组件_java Swing AWT 轻量级组建 和 重量级组件
  8. 汽车倒车雷达系统的设计与实现(二)
  9. 线阵相机参数选择 照明方式
  10. 同时使用动态库和静态库时怎么写makefile
  11. 步态分析——信度以及效度
  12. vue组件 组件的继承extend
  13. matlab中逗号分号冒号方括号,matlab中分号、冒号、逗号等常用标点符号的功能和用法总结...
  14. 华夏教师杂志华夏教师杂志社华夏教师编辑部2022年第24期目录
  15. python-matplotlib-数据可视化-导入shp矢量数据并显示成图
  16. 行业分析-全球与中国湿部淀粉市场现状及未来发展趋势
  17. 利用计算机进行数值模拟计算,数值模拟法
  18. [Unity基础]Shuriken粒子系统的碰撞
  19. 黑苹果安装 未能与恢复服务器取得联系,联想M73小主机黑苹果 篇二:系统安装及BIOS设置...
  20. [Element Migrating][ElInput][Attribute]: icon is removed, use suffix-icon / prefix-icon instead.

热门文章

  1. 微信WeixinJSBridge支付,H5微信支付,react 微信支付
  2. Throwing OutOfMemoryError “pthread_create (1040KB stack) failed: Try again“
  3. oracle数据备份无法导出空表解决办法
  4. 云计算的五个基本特征、四种部署模型和三种服务模式
  5. [原创]测试用例设计之“正交实验设计”法
  6. 基于cpt的组网实验_毫米波5G基站的应用场景和超密集组网规划方法详解
  7. deeplabv3 + mobilenetv2 做语义分割并封装成c++部署到移动端,linux,windows等平台(史上最详细)
  8. 流水明细记账,选择晨曦记账本
  9. Android Studio 批量修改文件名
  10. 下载Chrome扩展离线皮肤包crx文件方法