深度强化学习笔记之PPO算法理解(1)

2023-05-16

深度强化学习笔记之PPO算法理解(1)

笔记内容来源于李宏毅老师的深度强化学习的PPT。

关于PPO(Proximal Policy Optimization),李老师分为了三个部分进行了介绍。

在这里插入图片描述

  • Policy Gradient:该方法是PPO的前身,与基于价值的强化学习方法不同,策略梯度法是对策略进行更新;
  • On-policy | Off-policy
  • Add constraint:对Policy Gradient进行一些限制,前者就变成了PPO。

1.Policy Gradient

与基于价值的强化学习方法不同,Policy Gradient通常会采集多组完整的状态序列用于actor的训练。所谓actor本质上也就是agent,它的功能在于给定一个环境状态,可以输出一个action。

actor在进行训练之前,会先与环境进行交互,然后得到一组训练数据(由多条状态序列构成)。
train data : { τ 1 , τ 2 , . . . , τ N } ,    τ i = { s 1 , a 1 , . . . , s T , a T } \text{train data}:\{\tau^1,\tau^2,...,\tau^N\}, \; \tau_i=\{s_1,a_1,...,s_T,a_T\} train data:{τ1,τ2,...,τN},τi={s1,a1,...,sT,aT}
在这里插入图片描述

对于每条状态序列的奖励表示为该序列得到的所有的奖励之和,如下所示:
R ( τ ) = ∑ t = 1 T r t (1) R(\tau)=\sum_{t=1}^T r_t \tag1 R(τ)=t=1Trt(1)
但是Policy Gradient并不是只用一条状态序列来更新策略的,而是会根据所有的采集到的状态序列来计算它的期望奖励。
R ˉ θ = ∑ τ R ( τ ) p θ ( τ ) = E τ ∼ p θ ( τ ) [ R ( τ ) ] (2) \bar{R}_{\theta}=\sum_{\tau}R(\tau)p_{\theta}(\tau)=E_{\tau\sim p_{\theta}(\tau)}[R(\tau)] \tag2 Rˉθ=τR(τ)pθ(τ)=Eτpθ(τ)[R(τ)](2)
上式可以理解为:在使用参数为 θ \theta θ的actor与环境进行互动,采集到多条状态序列,其分布可以表示为 τ ∼ p θ ( τ ) \tau\sim p_{\theta}(\tau) τpθ(τ)。对于这些以参数为 θ \theta θ的actor所收集到的状态序列,Policy Gradient会计算它们的期望奖励值,然后以该期望奖励值来更新actor的参数,得到新的参数 θ ′ \theta' θ。如此往复,就是Policy Gradient的大致流程。 从这里可以看出,Policy Gradient是基于无模型的算法。

那么应该如何更新actor的参数呢?

Policy Gradient的后一个单词就告诉了我们方法,也就是采用梯度进行参数更新。即计算式(2)的梯度,然后朝着奖励值增加的方向更新参数。

对式(2)计算其梯度,我们可以得到:
∇ R ˉ θ = ∑ τ R ( τ ) ∇ p θ ( τ ) = ∑ τ R ( τ ) p θ ( τ ) ∇ p θ ( τ ) p θ ( τ ) (3) \nabla \bar{R}_{\theta}=\sum_{\tau}R(\tau)\nabla p_{\theta}(\tau)=\sum_{\tau}R(\tau)p_{\theta}(\tau) \frac{\nabla p_{\theta}(\tau)}{p_{\theta}(\tau)} \tag3 Rˉθ=τR(τ)pθ(τ)=τR(τ)pθ(τ)pθ(τ)pθ(τ)(3)
根据导数公式 ∇ f ( x ) = f ( x ) ∇ log ⁡ f ( x ) \nabla f(x)=f(x) \nabla \log f(x) f(x)=f(x)logf(x),上式可以转化为:
∇ R ˉ θ = ∑ τ R ( τ ) p θ ( τ ) ∇ log ⁡ p θ ( τ ) = E τ ∼ p θ ( τ ) [ R τ ∇ log ⁡ p θ ( τ ) ]      ( 4 ) ≈ 1 N ∑ n = 1 N R ( τ n ) ∇ log ⁡ p θ ( τ n ) ( 5 ) = 1 N ∑ n = 1 N ∑ t = 1 T n R ( τ n ) ∇ log ⁡ p θ ( a t n ∣ s t n ) ( 6 ) \begin{aligned} \nabla \bar{R}_{\theta} &= \sum_{\tau}R(\tau)p_{\theta}(\tau) \nabla \log p_{\theta}(\tau) \\ &= E_{\tau \sim p_{\theta}(\tau)}[R_{\tau} \nabla \log p_{\theta}(\tau)] \ \quad \qquad \qquad \; (4)\\ & \approx \frac{1}{N}\sum_{n=1}^N R(\tau^n) \nabla \log p_{\theta}(\tau^n) \qquad \qquad \quad (5)\\ &= \frac{1}{N}\sum_{n=1}^N \sum_{t=1}^{T_n} R(\tau^n) \nabla \log p_{\theta}(a_t^n|s_t^n) \quad \quad (6)\\ \end{aligned} Rˉθ=τR(τ)pθ(τ)logpθ(τ)=Eτpθ(τ)[Rτlogpθ(τ)] (4)N1n=1NR(τn)logpθ(τn)(5)=N1n=1Nt=1TnR(τn)logpθ(atnstn)(6)
因为我们并不知道 τ ∼ p θ ( τ ) \tau\sim p_{\theta}(\tau) τpθ(τ)的真实分布,因此只能通过采样的方式计算式(4)的数学期望,也就是式(5)的形式。

在这里插入图片描述

上图就是Policy Gradient的大致流程,也就是数据收集和模型更新的循环。这里需要注意的是,Policy Gradient每次收集到的数据只会对模型进行一次更新,并不会反复使用这些数据。 从这就可以看出,Policy Gradient是一种"On-policy"的算法。

那么应该如何在实际应用中使用式(6)来更新模型呢?

待续…

2.From on-policy to off-policy

下图说明了两种方式的区别。简单来说,"on-policy"就是指我们自己训练,然后自己学习。而"off-policy"就是指我们可以旁观别人的训练,从而得到学习。

在这里插入图片描述

为什么我们要把on-policy方法转变为off-policy方法呢?

上一节我们提到Policy Gradient的训练方法,但是它的训练方法非常浪费时间。因为它获得的每一组训练资料都只能更新一次模型的参数,更新完之后又要重新收集训练资料。如果训练资料可以更新多次模型的参数,那么训练效率就会得到很大的提高。

在使用on-policy方法时,由于我们是使用参数为 θ \theta θ的actor收集训练数据的,一旦参数 θ \theta θ得到更新后,我们就必须重新收集数据,因为此时参数 θ \theta θ已经变化的。

为了可以使得训练资料可以反复使用,我们就必须固定actor的参数值。一个方法就是使用两个actor,一个参数为 θ ′ \theta' θ的actor用于收集训练资料,另一个参数为 θ \theta θ的actor用于训练。因为前者不参与训练,故它的参数也不会发生变化,如此就可以反复使用这组训练数据。

但这里需要解决一个问题,即两个不同参数的actor得到的训练数据的分布是不同的,如何将它们联系起来呢?从公式角度出发,假设前者actor采集的训练资料的分布为 q q q,后者的分布为 p p p,我们应该如何实现这两者之间的转化呢?
∇ R ˉ θ = E τ ∼ p → E τ ∼ q \nabla \bar{R}_{\theta}=E_{\tau \sim p} \rightarrow E_{\tau \sim q} Rˉθ=EτpEτq
这里就需要提到一种称为Importance Sampling的技术。
E x ∼ p [ f ( x ) ] = ∫ f ( x ) p ( x ) d x = ∫ f ( x ) p ( x ) q ( x ) q ( x ) d x = E x ∼ q [ f ( x ) p ( x ) q ( x ) ] (7) \begin{aligned} E_{x \sim p}[f(x)] &= \int f(x)p(x)dx \\ &= \int f(x) \frac{p(x)}{q(x)}q(x)dx \\ &= E_{x \sim q}[f(x)\frac{p(x)}{q(x)}] \tag7 \end{aligned} Exp[f(x)]=f(x)p(x)dx=f(x)q(x)p(x)q(x)dx=Exq[f(x)q(x)p(x)](7)
但是上述方法的应用需要满足一个条件:两类分布 ( p , q ) (p,q) (p,q)不能差异太大

原因在于,虽然通过式(7)使得两者的数学期望相同,但是两者的方差并不是相同的,如下图所示。

在这里插入图片描述

p ( x ) , q ( x ) p(x),q(x) p(x),q(x)相差很大时,根据采样情况存在两种可能:

  • 当采样次数足够多时,虽然两者方差不同,但是最终得到的期望值是相同的。这种情况没有问题;
  • 但是当采样次数不够多时,此时方差不同的影响就会产生,会导致两者的期望值不一定相等。

举一个极端的例子,如下图所示。当两者分布相差较大时,如果我们采样的次数不多,比如采样得到的样本全部都在 q ( x ) q(x) q(x)右侧区域上(下图右侧的绿点),那么最终计算得到的 E x ∼ q E_{x\sim q} Exq就是一个正值。但是 E x ∼ p E_{x\sim p} Exp却是一个负值,此时就会导致两者的期望不相同。但是如果再多采样几个点,也许就会得到位于左侧区域的样本,由于权重大的原因( p ( x ) / q ( x ) p(x)/q(x) p(x)/q(x)比较大),就会把 E x ∼ q E_{x\sim q} Exq拉到负值。

在这里插入图片描述

3.Add Constraint

简单来说,PPO就是Policy Gradient的"off-policy"版本。为了满足Importance Sampling的使用条件,PPO在目标函数中加入了一个约束项。
J θ k = ∑ ( s t , a t ) p θ ( a t ∣ s t ) p θ k ( a t ∣ s t ) A θ k ( s t , a t ) ( 8 ) J P P O θ k = J θ k − β K L ( θ , θ k ) ( 9 ) J T R P O θ k = J θ k ,    K L ( θ , θ k ) < δ ( 10 ) \begin{aligned} J^{\theta^k}&=\sum_{(s_t,a_t)} \frac{p_{\theta}(a_t|s_t)}{p_{\theta^k}(a_t|s_t)}A^{\theta^k}(s_t,a_t) \quad (8)\\ J_{PPO}^{\theta^k}&=J^{\theta^k}-\beta KL(\theta,\theta^k) \quad (9) \\ J_{TRPO}^{\theta^k}&=J^{\theta^k}, \; KL(\theta,\theta^k)<\delta \quad (10) \\ \end{aligned} JθkJPPOθkJTRPOθk=(st,at)pθk(atst)pθ(atst)Aθk(st,at)(8)=JθkβKL(θ,θk)(9)=Jθk,KL(θ,θk)<δ(10)
PPO算法与TRPO算法的区别在于前者把约束项放入了目标函数中,而不是作为外部约束。

关于PPO算法,还有一个更加容易实现的形式:
J P P O 2 θ k ≈ ∑ s t , a t min ⁡ ( p θ ( a t ∣ s t ) p θ k ( a t ∣ s t ) A θ k ( s t , a t ) , c l i p ( p θ ( a t ∣ s t ) p θ k ( a t ∣ s t ) , 1 − ϵ , 1 + ϵ ) A θ k ( s t , a t ) ) (11) J_{PPO2}^{\theta^k} \approx \sum_{s_t,a_t} \min (\frac{p_{\theta}(a_t|s_t)}{p_{\theta^k}(a_t|s_t)}A^{\theta^k}(s_t,a_t), clip(\frac{p_{\theta}(a_t|s_t)}{p_{\theta^k}(a_t|s_t)},1-\epsilon,1+\epsilon)A^{\theta^k}(s_t,a_t)) \tag{11} JPPO2θkst,atmin(pθk(atst)pθ(atst)Aθk(st,at),clip(pθk(atst)pθ(atst),1ϵ,1+ϵ)Aθk(st,at))(11)
在这里插入图片描述

注意:以上所有形式的目标函数的参数只有 θ \theta θ θ k \theta_k θk表示的是旧策略的参数,并不参与参数的更新。

关于式(11),有一个直观的解释:

  • A θ k ( s t , a t ) > 0 A^{\theta^k}(s_t,a_t)>0 Aθk(st,at)>0时,说明 ( s t , a t ) (s_t,a_t) (st,at)相对来说是比较好的,我们希望这一对出现的概率越高越好(即 p θ ( a t ∣ s t ) p_{\theta}(a_t|s_t) pθ(atst)越大越好)。但是为了不让 θ \theta θ θ k \theta_k θk相差太多,设置了一个上限值 1 + ϵ 1+\epsilon 1+ϵ
  • A θ k ( s t , a t ) < 0 A^{\theta^k}(s_t,a_t)<0 Aθk(st,at)<0时,说明 ( s t , a t ) (s_t,a_t) (st,at)相对来说是比较差的,我们希望这一对出现的概率越低越好(即 p θ ( a t ∣ s t ) p_{\theta}(a_t|s_t) pθ(atst)越小越好)。但是为了不让 θ \theta θ θ k \theta_k θk相差太多,设置了一个下限值 1 − ϵ 1-\epsilon 1ϵ
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度强化学习笔记之PPO算法理解(1) 的相关文章

随机推荐

  • Boost 中 signal2 用法

    boost 函数与回调 xff08 三 xff09 signals2
  • 树莓派学习笔记

    文章目录 树莓派基础入门笔记无显示屏使用方式基础教程5 树莓派文件传输 配置编译环境使用U盘直接传输使用vnc传输文件FTP文件传输协议Python配置编译环境C C 43 43 配置编译环境Linux常用终端命令nano和vi编辑器的使用
  • 22.IO与显示器

    README 1 本文内容总结自 B站 操作系统 哈工大李治军老师 xff0c 内容非常棒 xff0c 墙裂推荐 xff1b 2 显示器是输入型外设 xff1b 3 本章主要内容是讲 显示器是如何被驱动的 xff1b 或操作系统是如何让用户
  • BGP协议基础配置—学习

    BGP重要概念 IGP是运行在AS内部的路由协议 xff0c 主要有RIP OSPF及IS IS xff0c 着重于发现和计算路由 EGP是运行在AS之间的路由协议 xff0c 通常是BGP xff0c 它是实现路由控制和选择最好的路由协议
  • STM32 Not a genuine ST Device! Abort connection 错误解决方案

    STM32 Not a genuine ST Device Abort connection 错误解决方案 网上解决方案晶振设置不匹配导致Connect setting to with Pre reset降低MAX Clock 我自己的解决
  • VMware的.vmdk文件只赠不减的处理方法

    VMware虚拟机的虚拟磁盘的大小会随着使用时间不断变大 xff0c 而且只赠不减 即使在虚拟系统中删除了磁盘中的文件 xff0c 虚拟磁盘的大小仍然不会变小 释放空闲磁盘的方法如下 xff1a VMWare Tools中的 Shrink功
  • 使用码云(Gitee)进行代码管理,以及VsCode关联Git

    一 安装git Git的下载 安装与配置 git 简明指南 二 注册码云 1 xff09 注册码云账号 xff1a 码云官网 2 xff09 绑定邮箱 xff1a 右上角 头像 设置 邮箱管理 三 本地项目与码云关联 1 本地项目上传至码云
  • 删掉带页眉的空白页结果把所有页眉都删掉解决办法

    点击视图 大纲 会发现在之前的操作中有两个分节符 xff0c 把上面那个删掉即可 参考链接https zhidao baidu com question 105591450 html 小问题也蛮耗时的
  • ROS之多个订阅数据同步

    做传感器数据融合时 xff0c 常常会需要用到多个数据 xff0c 即需要同时订阅多个话题 那么 xff0c 如何同步这些传感器数据的时间辍 xff0c 并将它们放入一个回调函数中进行处理呢 xff1f 参考文档 xff1a http wi
  • C++中使用strtok函数分割字符串String

    C 43 43 中使用strtok函数分割字符串String string str getline cin str vector lt string gt vec char p 61 strtok char str c str 34 34
  • 利用python获取IP资源池的方法

    在使用爬虫的时候 xff0c 经常会遇到IP被禁止的情况 xff0c 所以一般都需要一个资源池来提高降低风险 以下代码中 xff0c 基于python3 7 xff0c 数据库用的是POSTGRESQL11 xff0c 为了效率使用了队列
  • DNS笔记(一):yum方式安装DNS与简单设置

    思路 客户端主机 gt DNS服务端主机 gt 后台主机 DNS服务端主机防火墙 iptables I INPUT 4 m state state NEW p tcp dport 53 j ACCEPT iptables I INPUT 4
  • Linux基础知识之df和du的差异

    创建文件前统计 xff0c 可以看出磁盘总共50G xff0c 已使用13G root 64 payne du sh 2 gt dev null 13G root 64 payne df h Filesystem Size Used Ava
  • Linux网络异常排查手段

    网络不通常用工具 xff1a ping mtr nmap telnet curl 域名IP服务器解析工具 xff1a nslookup dig 1 ping 启动方式及解释 xff1a ping c3 www baidu com PING
  • Prometheus学习(一):单节点部署与配置+Grafana安装

    Prometheus学习 xff08 一 xff09 xff1a 单节点部署与配置 43 Grafana安装 一 配置前准备1 下载软件2 主机列表3 同步时间4 创建账户 二 安装与配置1 node exporter安装与配置2 Serv
  • ELK笔记(一):Centos7部署elasticsearch-7.8.0集群

    Centos7部署elasticsearch 7 8 0集群 1 部署前准备1 1 系统选择1 2 主机列表1 3 下载 解压缩安装包1 4 创建用户 2 修改配置文件2 1 elastic search配置文件2 2 OS配置文件 3 启
  • centos8安装ansible-awx:9.0.1

    为什么要这要贴出来呢 xff0c 因为这个鬼东西我真的不知道为什么能跑成功 xff0c 先是在centos7上安装 xff0c 结果重复多次后成功了 xff0c 然后重新装一遍 xff0c 又失败了 真的不知道怎么装了 xff0c 甚至连在
  • 使用helm创建elastic

    coding https gitee com pangfaheng devops coding tree master kubernets elastic git https github com elastic helm charts 1
  • jstatd监控jvm内存消耗

    env localhost MacOS11 6 remote server run a centos7 server in vmware use MacOS monitoring remote server remote server op
  • 深度强化学习笔记之PPO算法理解(1)

    深度强化学习笔记之PPO算法理解 xff08 1 xff09 笔记内容来源于李宏毅老师的深度强化学习的PPT 关于PPO xff08 Proximal Policy Optimization xff09 xff0c 李老师分为了三个部分进行