参考: 李宏毅老师课件

PPO = Policy Gradient 从 On-policy 到 Off-policy, 再加一些constraint

Policy Gradient

Basic Conception

  • Actor: 动作执行者(智能体)

  • Env: 环境

  • Reward Function: 奖励函数

  • Policy \(\pi\) : a network with parameter \(\theta\).

    Input: 当前的 Env.

    Output: actor 要采取的下一个 action 的分布.

  • Trajectory \(\tau\): 一系列的 Env 和 Action, \(\set{s_1,a_1,s_2,a_2, \dots}\)



    在参数为 \(\theta\) 情况下, 发生\(\tau\)的概率: \(p_{\theta}(\tau)=p(s_1)p_{\theta}(a_1|s_1)p(s_2|s_1,a_1)p_{\theta}(a_2|s_2)\cdots\)

Optimization

Object



给定 \(\tau\), 可以计算 \(\tau\) 的 reward, \({R(\tau)}\).

对于参数为 \(\theta\) 的 Policy下, Trajectory \(\tau\) 是采样得到的, 因此实际上需要计算的是 reward 的期望值\(\overline{R_\theta}\). 我们希望 \(\overline{R_\theta}\) 越大越好.

Policy Gradient

Reward 的期望:

\[\begin{equation}
\begin{aligned}
\overline{R_\theta}=\sum_\tau R(\tau)p_\theta(\tau)
\end{aligned}
\end{equation}
\]

求 \(\theta\) 的梯度:

\[\begin{equation}
\begin{aligned}
\nabla \overline 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)}\quad &&\text{分子分母同乘} p_\theta(\tau)\\
&=\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)]\\
&\approx \frac 1 N \sum_{n=1}^{N} R(\tau^n)\nabla \log p_\theta(\tau^n)\\
&= \frac 1 N \sum_{n=1}^{N} \sum_{t=1}^{T_n} R(\tau^n)\nabla \log p_\theta(a^n_t|s^n_t)
\end{aligned}
\end{equation}
\]

然后由 \(\nabla \log p_\theta(\tau)=\frac{\nabla p_\theta(\tau)}{p_\theta(\tau)}\), 可得到第三行公式.

此处可延伸出一个公式:

\[\begin{equation}
\nabla f(x) = f(x) \nabla \log f(x)
\end{equation}
\]

由\(\sum_\tau p_\theta(\tau)f(\tau)=E_{\tau\sim p_\theta(\tau)}[f(\tau)]\), 可得第四行

通过采样的方式估计期望值, 采样 \(N\) 个 Trajectory, 既第五行公式

最后将 \(p_\theta(\tau)\) 展开代入, 得第六行公式

Implementation

最大化 Reward 的期望 \(\overline{R_\theta}\), 由公式(2)中梯度的计算, 可以反推出目标函数在实现时定义如下:

\[\begin{equation}
\begin{aligned}
J(\theta) = \frac 1 N \sum_{n=1}^{N} \sum_{t=1}^{T_n} R(\tau^n) \log p_\theta(a^n_t|s^n_t)
\end{aligned}
\end{equation}
\]

最大化 \(object\) 等价于最小化 \(loss\):

\[\begin{equation}
\begin{aligned}
loss = -\frac 1 N \sum_{n=1}^{N} \sum_{t=1}^{T_n} R(\tau^n) \log p_\theta(a^n_t|s^n_t)
\end{aligned}
\end{equation}
\]

其中, \(a^n_t, s^n_t\) 是在参数为 \(\theta\) 的 policy 下采样得到的.

与交叉熵损失对比: 其实就是将采样得到的 \(a^n_t\) 视作grand truth计算交叉熵, 区别在于针对不同的 Trajectory \(\tau^n\), 要多乘了一个 \(R(\tau^n)\)

Tips

Add a baseline



\(R(\tau^n)\) 可能总为正数, 这样在 training时, 相当于告诉 model, 不论时什么action 都要将它的概率提升.

理想情况下, 这样是没有问题的, 因为 Reward 即使总是正的, 也有大有小.

当时实际上, action 是采样得到的, 这会导致如果有的 action 没有被采样到, 它的概率相对于被采样到的 action 就会下降, 而这时, 并不能表示当前环境下采取 action 不好.

改进: 减去一个 baseline, \(b\).

Assign Suitable Credit



再来看一下目标函数:

\[\begin{equation}
\begin{aligned}
J(\theta) = \frac 1 N \sum_{n=1}^{N} \sum_{t=1}^{T_n} R(\tau^n) \log p_\theta(a^n_t|s^n_t)
\end{aligned}
\end{equation}
\]

对于同一个 Trajectory \(\tau\) 中, 针对每个状态 \(s\) 下, 执行 动作 \(a\), 都有相同的 Reward 系数. 这是不合理的.

例如图的左边, 在 \(s_b\) 执行 \(a_2\) 不是一个好的选择, 他会导致接下来进入 \(s_c\), 并执行 \(a_3\), 得到 -2 分.

由此, 提出改进1.

改进1: 每个时刻的 reward 改为, 当前时刻到结束时刻的 reward 的总和



某时刻的 action, 经过越长时间, 它的影响力就越小. 也就是与该 action 间隔很久的 reward 与该 action 的关系很小. 由此提出改进2.

改进2: 加一个衰减系数.

最后, 将整个系数项称为 Advantage Function, \(A^\theta(s_t, a_t)\).其含义为, 在某 state 下, \(a_t\) 相较于其他的 action, 有多好. (这个 \(A\), 通常可以是用一个网络来预测的 ???)

最终, 得梯度公式:

\[\begin{equation}
\nabla \overline R_\theta \approx \frac 1 N \sum_{n=1}^{N} \sum_{t=1}^{T_n} A^\theta(s_t, a_t) \nabla\log p_\theta(a^n_t|s^n_t)
\end{equation}
\]

On-policy \(\rightarrow\) Off-policy

On-policy

梯度计算公式:

\[\begin{equation}
\nabla \overline R_\theta =E_{\tau\sim p_\theta(\tau)}[R(\tau)\nabla \log p_\theta(\tau)]\\
\end{equation}
\]

目前为止的做法其实是一种 on-policy 的方法:

  • 每次更新梯度前, 都需要从 \(\pi_\theta\) 中采样 \(\tau\).
  • 参数更新后, 又需要用更新后的参数重新采样 \(\tau\).

目标是: 从另一个 policy, \(\pi_{\theta'}\) 中采样数据, 用来训练 \(\pi_\theta\). 这样就可以重复利用这些采样得到的数据.

Importance Sampling(重要性采样)

\(x\) 服从 \(p\) 分布时, 计算 \(f(x)\) 期望 \(E_{x\sim p}[f(x)]\) 的做法: 一般是从 \(p\) 中采样一些 \(x\), 带入 \(f(x)\) 求平均, 用这个值来估计所求期望.

现在, 假设无法从 \(p\) 中直接采样 \(x\), 但可以从另一个分布 \(q\) 中采样 \(x\). 可以对 \(E_{x\sim p}[f(x)]\) 做如下变形:

\[\begin{equation}
\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)}]
\end{aligned}
\end{equation}
\]

这样, 我们就可以用 \(q\) 中采样的数据来估计期望值 \(E_{x\sim p}[f(x)]\). 这就是 Importance Sampling.

Issue of Importance Sampling

理论上, 我们已经得出两个期望值是相等的:

\[\begin{equation}
E_{x\sim p}[f(x)] = E_{x\sim q}[f(x)\frac{p(x)}{q(x)}].
\end{equation}
\]

那么它们的方差是否相等呢? \(Var_{x\sim p}[f(x)] == Var_{x\sim q}[f(x)\frac{p(x)}{q(x)}] ?\)

由公式

\[\begin{equation}
Var[x] = E[x^2]-(E[x])^2
\end{equation}
\]

可以得出:

\[\begin{equation}
\begin{aligned}
Var_{x\sim p}[f(x)]&=E_{x\sim p}[f^2(x)]-(E_{x\sim p}[f(x)])^2\\
Var_{x\sim q}[f(x)\frac{p(x)}{q(x)}] &=E_{x\sim q}[(f(x)\frac{p(x)}{q(x)})^2]-(E_{x\sim q}[f(x)\frac{p(x)}{q(x)}])^2\\
&=\int (f(x)\frac{p(x)}{q(x)})^2q(x) \, dx - (E_{x\sim p}[f(x)])^2\\
&=\int f^2(x)\frac{p(x)}{q(x)}p(x) \, dx - (E_{x\sim p}[f(x)])^2\\
&=E_{x\sim p}[f^2(x)\frac{p(x)}{q(x)}]-(E_{x\sim p}[f(x)])^2
\end{aligned}
\end{equation}
\]

对比发现, 第一项中后者比前者多乘了一个 \(\frac{p(x)}{q(x)}\), 也就是说当 \(p\) 与 \(q\) 相差很多时, 它们的方差也会差很多.

这样就会出现一问题: 理论上, 无论 \(p,q\) 的分布是什么样的, 当我们从 \(p\) 和 \(q\) 采样足够多次时, 是可以得到 \(E_{x\sim p}[f(x)] = E_{x\sim q}[f(x)\frac{p(x)}{q(x)}]\) 的.

但是当 \(p,q\) 差距过大, 而我们采样的次数又不够多时, 因为它们之间的方差差距很大, 所以最后很可能导致期望差距很大.

一个直观的例子:



图中 \(p,q\)两个分布的差异很大.

当我们采样次数不够多, 导致没有采样到最左边那个样本时, 就会出现实际上 \(E_{x\sim p}[f(x)]\) 应是一个负值, 但我们用 \(E_{x\sim q}[f(x)\frac{p(x)}{q(x)}]\) 计算出来的却是一个正值.

而当我们采样到最左边那个样本时, 因为此时 \(\frac{p(x)}{q(x)}\) 的值将会非常大, 所以可以把 \(E_{x\sim q}[f(x)\frac{p(x)}{q(x)}]\) 拉回负值.

Off-policy

将 Importance Sampling 用在 policy gradient 中, 我们就可以得到:

\[\begin{equation}
\begin{aligned}
\nabla \overline R_\theta &=E_{\tau\sim p_\theta(\tau)}[R(\tau)\nabla \log p_\theta(\tau)]\\
&=E_{\tau\sim p_{\theta'}(\tau)}[\frac{p_{\theta}(\tau)}{p_{\theta'}(\tau)}R(\tau)\nabla \log p_\theta(\tau)]
\end{aligned}
\end{equation}
\]

这样, 我们就可以从 \(\theta'\) 中采样数据, 然后多次利用这些数据来更新 \(\theta\).

结合公式(7), 得

\[\begin{equation}
\begin{aligned}
\nabla \overline R_\theta &=E_{\tau\sim p_{\theta'}(\tau)}[\frac{p_{\theta}(\tau)}{p_{\theta'}(\tau)}R(\tau)\nabla \log p_\theta(\tau)]\\
&=E_{(s_t,a_t)\sim\pi_{\theta'}}[\frac{p_\theta(s_t, a_t)}{p_{\theta'}(s_t, a_t)}A^{\theta'}(s_t, a_t) \nabla\log p_\theta(a^n_t|s^n_t)]\quad &&\text{由公式(6)得}\\
&=E_{(s_t,a_t)\sim\pi_{\theta'}}[\frac{p_\theta(a_t|s_t)p_\theta(s_t)}{p_{\theta'}(a_t|s_t)p_{\theta'}(s_t)}A^{\theta'}(s_t, a_t) \nabla\log p_\theta(a^n_t|s^n_t)]\\
&=E_{(s_t,a_t)\sim\pi_{\theta'}}[\frac{p_\theta(a_t|s_t)}{p_{\theta'}(a_t|s_t)}A^{\theta'}(s_t, a_t) \nabla\log p_\theta(a^n_t|s^n_t)]\quad &&\text{假设}p_\theta(s_t)=p_{\theta'}(s_t)\\
\end{aligned}
\end{equation}
\]

再由公式(3)得:

\[\begin{equation}
\nabla \overline R_\theta=E_{(s_t,a_t)\sim\pi_{\theta'}}[\frac{\nabla p_\theta(a_t|s_t)}{p_{\theta'}(a_t|s_t)}A^{\theta'}(s_t, a_t)]
\end{equation}
\]

反推目标函数:

\[\begin{equation}
J^{\theta'}(\theta)=E_{(s_t,a_t)\sim\pi_{\theta'}}[\frac{p_\theta(a_t|s_t)}{p_{\theta'}(a_t|s_t)}A^{\theta'}(s_t, a_t)]
\end{equation}
\]

Add constraint

目前为止, 我们利用 Importance Sampling 完成了 Policy Gradient 从 On-policy 到 Off-policy 的优化.

但是 Importance Sampling 在实际应用中有一个不得不考虑的限制, 就是我们无法保证能采样足够多的数据, 这时当两个分布 \(p_\theta, p_{\theta'}\)差异过大时, 难以保证期望相等.

PPO做的事情, 简单说就是, 限制两个分布 \(p_\theta, p_{\theta'}\) 不能差太多.

\[\begin{equation}
J_{PPO}^{\theta'}(\theta)=J^{\theta'}(\theta)-\beta KL(\theta, \theta')
\end{equation}
\]

注: 此处 KL 散度指的不是将两个模型的参数看作分布,拉近两个模型的参数的距离. 而是两个模型行为上的距离, 就是当两个模型输入同样的 state 时, 希望输出的 action 的分布尽可能像

Conclusion

PPO algorithm

PPO2

PPO2: 简化 PPO 的计算.



首先, 我们将横坐标 \(x\) 设为 \(\frac{p_\theta(a_t|s_t)}{p_{\theta^k}(a_t|s_t)}\), 则函数 \(y=x\) 与 \(y=clip(x, 1-\epsilon, 1+\epsilon)\) 的图像分别为图中的绿线和蓝线.

  • 当 \(A>0\) 时, \(J_{PPO2}^{\theta^k}(\theta)\) 就是左图中红线, 我们要最大化目标函数, 也就希望 \(x\) 越大越好, 但是当超过 \(1+\epsilon\) 后, 对目标函数就没有 benefit 了.
  • 当 \(A<0\) 时, 同理, 如右图.

目的依旧是保证两个分布 \(p_\theta, p_{\theta^k}\) 差距不能过大.

强化学习 Proximal Policy Optimization (PPO)的更多相关文章

  1. 深度学习课程笔记(十四)深度强化学习 --- Proximal Policy Optimization (PPO)

    深度学习课程笔记(十四)深度强化学习 ---  Proximal Policy Optimization (PPO) 2018-07-17 16:54:51  Reference: https://b ...

  2. 深度学习-深度强化学习(DRL)-Policy Gradient与PPO笔记

    Policy Gradient 初始学习李宏毅讲的强化学习,听台湾的口音真是费了九牛二虎之力,后来看到有热心博客整理的很细致,于是转载来看,当作笔记留待复习用,原文链接在文末.看完笔记再去听一听李宏毅 ...

  3. 强化学习七 - Policy Gradient Methods

    一.前言 之前我们讨论的所有问题都是先学习action value,再根据action value 来选择action(无论是根据greedy policy选择使得action value 最大的ac ...

  4. 强化学习算法Policy Gradient

    1 算法的优缺点 1.1 优点 在DQN算法中,神经网络输出的是动作的q值,这对于一个agent拥有少数的离散的动作还是可以的.但是如果某个agent的动作是连续的,这无疑对DQN算法是一个巨大的挑战 ...

  5. 强化学习---TRPO/DPPO/PPO/PPO2

    时间线: OpenAI 发表的 Trust Region Policy Optimization, Google DeepMind 看过 OpenAI 关于 TRPO后, 2017年7月7号,抢在 O ...

  6. [强化学习]Part1:强化学习初印象

    引入 智能 人工智能 强化学习初印象 强化学习的相关资料 经典书籍推荐:<Reinforcement Learning:An Introduction(强化学习导论)>(强化学习教父Ric ...

  7. 强化学习(十七) 基于模型的强化学习与Dyna算法框架

    在前面我们讨论了基于价值的强化学习(Value Based RL)和基于策略的强化学习模型(Policy Based RL),本篇我们讨论最后一种强化学习流派,基于模型的强化学习(Model Base ...

  8. Ubuntu下常用强化学习实验环境搭建(MuJoCo, OpenAI Gym, rllab, DeepMind Lab, TORCS, PySC2)

    http://lib.csdn.net/article/aimachinelearning/68113 原文地址:http://blog.csdn.net/jinzhuojun/article/det ...

  9. 基于Keras的OpenAI-gym强化学习的车杆/FlappyBird游戏

    强化学习 课程:Q-Learning强化学习(李宏毅).深度强化学习 强化学习是一种允许你创造能从环境中交互学习的AI Agent的机器学习算法,其通过试错来学习.如上图所示,大脑代表AI Agent ...

  10. 告别炼丹,Google Brain提出强化学习助力Neural Architecture Search | ICLR2017

    论文为Google Brain在16年推出的使用强化学习的Neural Architecture Search方法,该方法能够针对数据集搜索构建特定的网络,但需要800卡训练一个月时间.虽然论文的思路 ...

随机推荐

  1. PictureBox 从数据库加载图片照片

    Private Sub PAPHOTO_SEL() Try Dim objCon As SqlConnection Dim objCmd As SqlCommand '打开数据库 objCon = N ...

  2. 【Vue2.x源码系列08】Diff算法原理

    什么是虚拟DOM DOM是很慢的,其元素非常庞大,当我们频繁的去做 DOM更新,会产生一定的性能问题,我们可以直观感受一下 div元素包含的海量属性 在Javascript对象中,虚拟DOM 表现为一 ...

  3. distribute by在spark中的一些应用

    一.在二次排序当中的应用 1.1 说到排序当然第一想到的就是sort by和order by这两者的区别,也分情况. 在算子当中,两者没有区别,orderby()调用的也是sort.order by就 ...

  4. 基于Django的简易博客系统教程

    1. 安装Django 在命令行中输入以下命令安装Django pip install django 2. 创建Django项目 在命令行中输入以下命令创建一个名为myblog的Django项目 dj ...

  5. TypeError: this.CliEngine is not a constructor

    vue cli3 项目老是提示TypeError: this.CliEngine is not a constructor这个,看着特别扭 解决方法也不难,直接点击Details 然后再点击,如下第一 ...

  6. DOS系统中EXE程序加载过程

    1.在内存区中寻找一段容量足够的空闲内存区. 2.这段内存区的前256字节中,创建一个称为程序段前缀(PSP)的数据区. 3.这段内存区256字节之后,将程序装入,程序的地址被设为SA+10H : 0 ...

  7. Nginx SSL 双向认证,key 生成和配置

    一.安装Nginx和OpenSSL yum install nginx openssl -y 二.SSL 服务器 / 客户端双向验证证书的生成 创建一个新的 CA 根证书,在 nginx 安装目录下新 ...

  8. 使用EasyExcel对excel数据进行相似度判断

    @Data public class ExeclDto { /** * execl表 */ private String filename; /** * 需要匹配的工作表名 */ private St ...

  9. 前端vue uni-app基于uQRCode封装简单快速实用全端二维码生成插件

    快速实现基于uQRCode封装简单快速实用全端二维码生成插件; 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=12677 效果图 ...

  10. Windows11右键菜单修改为Win10模式的方法

    Windows11右键菜单修改为Win10模式的方法 自述: 更新win11后看着鼠标右键的菜单有些不太舒服,索性就改回了win10的右键菜单的样式 , 下面开始进行操作 第一步 首先以管理员方式打开 ...