3. DRL算法分析

Proximal Policy Optimization (PPO)

PPO paper 见 ArXiv:
OpenAI: https://arxiv.org/pdf/1707.06347.pdf
DeepMind: https://arxiv.org/pdf/1707.02286.pdf

本节参考的是Prof. Li Hongyi 的课程, 原视频见 https://www.youtube.com/watch?v=z95ZYgPgXOY&list=PLJV_el3uVTsODxQFgzMzPLa16h6B8kWM_

Reinforcement Learning and Policy Gradient

RL 离不开三个主要成分:agent, policy, environment, reward. 所有的RL问题都能想象成一个游戏:一个玩家拿着自己的一套policy在环境里面玩收集reward。怎么才能想出好的policy让累积的reward最大。

在这里插入图片描述

可以看到这一连串的逻辑是,env给出一个state,玩家看到这个state用当前的policy给出一个action,action作用于环境生成新的state,周而复始,而且每次action都会生成一个reward。

我们假设环境是stationary的,可以用转移概率 p ( s t + 1 ∣ s t , a t ) p(s_{t+1}|s_t,a_t) p(st+1st,at) 来表示;用户的policy是随机的,可以用 p ( a t ∣ s t ) p(a_t|s_t) p(atst) 来表示。我们的目的是找到policy,所以我们可以用变量来表示policy。单个变量肯定不现实啦,所以就用一个神经网络with参数 θ \theta θ. 那么policy就可以描述为 π = p θ ( a t ∣ s t ) \pi=p_\theta(a_t|s_t) π=pθ(atst)。注意,我们是没法控制环境的,所以我们唯一能改变游戏走向的手段就是改变 θ \theta θ.

Three main questions


第一个问题:给定环境,给定policy,agent在玩游戏时会走什么样的轨迹尼?
结论1:轨迹 τ = { s 1 , a 1 , s 2 , a 2 , . . . , s T , a T } \tau=\{s_1,a_1,s_2,a_2,...,s_T,a_T\} τ={s1,a1,s2,a2,...,sT,aT} 发生的概率为
p θ ( τ ) = p ( s 1 ) p θ ( a 1 ∣ s 1 ) p ( s 2 ∣ s 1 , a 1 ) p θ ( a 2 ∣ s 2 ) . . . p ( s T ∣ s T − 1 , a T − 1 ) p ( a T ∣ s T ) 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)...p(s_T|s_{T-1},a_{T-1})p(a_T|s_T) pθ(τ)=p(s1)pθ(a1s1)p(s2s1,a1)pθ(a2s2)...p(sTsT1,aT1)p(aTsT)

此式很好理解,就是一个联合分布的拆解而已。


第二个问题:给定policy,我们的得到的reward是多少尼?
我们可以用policy下行走轨迹的平均reward来measure某个policy获得的reward。

首先,对于某个trajectory,我们得到的累积reward是
R ( τ ) = ∑ t = 1 T r t R(\tau)=\sum_{t=1}^T r_t R(τ)=t=1Trt

τ \tau τ 是由policy决定的。因此某个policy下,我们能得到的平均reward应该是
R ˉ θ = ∑ τ R ( τ ) p θ ( τ ) = E τ ∼ p θ ( τ ) [ R ( τ ) ] \bar{R}_\theta=\sum_\tau R(\tau)p_\theta(\tau)=\mathbb{E}_{\tau\sim p_\theta(\tau)}[R(\tau)] Rˉθ=τR(τ)pθ(τ)=Eτpθ(τ)[R(τ)]

注意

  1. 这里面 R ( τ ) R(\tau) R(τ)也可以是随机变量(即对于固定的 τ \tau τ,每一个确定的action拿到的reward也可以是随机的),但是它是环境的一部分我们没法操控,所以我们不care R ( τ ) R(\tau) R(τ)是不是随机是不是可微分。在调整policy的过程中,我们只是把它当做常数项而已。
  2. 不同的轨迹 τ \tau τ 可能长度不同。拿玩游戏来说,比较差的policy大多数的 τ \tau τ 都很短最后的reward也相对小一些,比较好的policy一般 τ \tau τ会长一点。等长游戏就看谁的policy质量高了。

第三个问题:怎样才能最大化 R ˉ θ \bar{R}_\theta Rˉθ 尼?

这个其实就是back propagation。我们要求 ∇ θ R ˉ θ \nabla_\theta \bar{R}_\theta θRˉθ, 然后往梯度方向更新 θ \theta θ 来使累积 reward 越大。
θ = θ + η ∇ θ R ˉ θ \theta = \theta + \eta \nabla_\theta \bar{R}_\theta θ=θ+ηθRˉθ

所以唯一的难点在于怎么求 ∇ θ R ˉ θ \nabla_\theta \bar{R}_\theta θRˉθ. 我们带入 R ˉ θ \bar{R}_\theta Rˉθ 的表达式有
∇ θ R ˉ θ = ∑ τ R ( τ ) ∇ θ p θ ( τ ) = ∑ τ R ( τ ) p θ ( τ ) ∇ θ log ⁡ p θ ( τ ) − − ( 1 ) \nabla_\theta \bar{R}_\theta= \sum_\tau R(\tau) \nabla_\theta p_\theta(\tau)= \sum_\tau R(\tau) p_\theta(\tau) \nabla_\theta \log p_\theta(\tau) --(1) θRˉθ=τR(τ)θpθ(τ)=τR(τ)pθ(τ)θlogpθ(τ)(1)

可以看到第二步我们做了一下转换,用 log ⁡ \log log 求导替换之前没有 log ⁡ \log log 的求导,我们想要 log ⁡ \log log 的原因是 p θ ( τ ) p_\theta(\tau) pθ(τ) 是连乘积的形式,在 log ⁡ \log log 下可以分成加法。特别的,我们有
∇ θ log ⁡ p θ ( τ ) = ∇ θ ( log ⁡ p ( s 1 ) + log ⁡ p θ ( a 1 ∣ s 1 ) + log ⁡ p ( s 2 ∣ s 1 , a 1 ) + . . . ) \nabla_\theta \log p_\theta(\tau)=\nabla_\theta (\log p(s_1) + \log p_\theta(a_1|s_1) + \log p(s_2|s_1,a_1) + ...) θlogpθ(τ)=θ(logp(s1)+logpθ(a1s1)+logp(s2s1,a1)+...)

= ∑ t = 1 T ∇ θ log ⁡ p θ ( a t ∣ s t ) = \sum_{t=1}^T \nabla_\theta \log p_\theta(a_t|s_t) =t=1Tθlogpθ(atst)

所以实际上可以看到,对于某一个轨迹, ∇ θ log ⁡ p θ ( τ ) \nabla_\theta \log p_\theta(\tau) θlogpθ(τ) 仅仅和 每一步policy的决策 ∇ θ log ⁡ p θ ( a t ∣ s t ) \nabla_\theta \log p_\theta(a_t|s_t) θlogpθ(atst) 有关。这也很合理,因为只有决策时才能改变轨迹 τ \tau τ.

OK, 那么我们回到 (1) 式,(1) 式可以简写为
∇ θ R ˉ θ = E τ ∼ p θ ( τ ) [ R ( τ ) ∇ θ log ⁡ p θ ( τ ) ] \nabla_\theta \bar{R}_\theta= \mathbb{E}_{\tau\sim p_\theta(\tau) } \left[R(\tau) \nabla_\theta \log p_\theta(\tau) \right] θRˉθ=Eτpθ(τ)[R(τ)θlogpθ(τ)]

显然,我们继续是写不出来解析式的,因此只能通过sample的方法,即按照 p θ ( τ ) p_\theta(\tau) pθ(τ) 这个概率来sample一堆trajectory然后计算他们平均得到的reward. 假设我们sample了 N N N 个轨迹 { τ n : n = 1 , 2 , . . . , N } \{\tau^n:n=1,2,...,N\} {τn:n=1,2,...,N}, 则
∇ θ R ˉ θ = E τ ∼ p θ ( τ ) [ R ( τ ) ∇ θ log ⁡ p θ ( τ ) ] \nabla_\theta \bar{R}_\theta= \mathbb{E}_{\tau\sim p_\theta(\tau) } \left[R(\tau) \nabla_\theta \log p_\theta(\tau) \right] θRˉθ=Eτpθ(τ)[R(τ)θlogpθ(τ)]

= 1 N ∑ n = 1 N R ( τ n ) ∇ θ log ⁡ p θ ( τ n ) =\frac{1}{N}\sum_{n=1}^N R(\tau^n) \nabla_\theta \log p_\theta(\tau^n) =N1n=1NR(τn)θlogpθ(τn)

= 1 N ∑ n = 1 N ∑ t = 1 T n R ( τ n ) ∇ θ log ⁡ p θ ( a t n ∣ s t n ) =\frac{1}{N}\sum_{n=1}^N \sum_{t=1}^{T_n}R(\tau^n) \nabla_\theta \log p_\theta(a^n_t|s^n_t) =N1n=1Nt=1TnR(τn)θlogpθ(atnstn)

这个公式其实也很好理解,就是用policy π θ \pi_\theta πθ sample了 N N N 个轨迹,每个轨迹走了 T n T_n Tn 步并收获了total reward R ( τ n ) R(\tau^n) R(τn).

注: ∇ θ log ⁡ p θ ( a t n ∣ s t n ) \nabla_\theta \log p_\theta(a^n_t|s^n_t) θlogpθ(atnstn) 是让 log ⁡ p θ ( a t n ∣ s t n ) \log p_\theta(a^n_t|s^n_t) logpθ(atnstn) 增大的方向,也就是让 p θ ( a t n ∣ s t n ) p_\theta(a^n_t|s^n_t) pθ(atnstn) 增大的方向。因此,如果某一个trajectory收获的reward R ( τ n ) R(\tau^n) R(τn) 是正的,那我们应该加大 p θ ( a t n ∣ s t n ) p_\theta(a^n_t|s^n_t) pθ(atnstn) 也就是按照 ∇ θ log ⁡ p θ ( a t n ∣ s t n ) \nabla_\theta \log p_\theta(a^n_t|s^n_t) θlogpθ(atnstn)这个方向更新 θ \theta θ; 但是如果某一个trajectory收获的reward R ( τ n ) R(\tau^n) R(τn) 是负的,那我们应该减少 p θ ( a t n ∣ s t n ) p_\theta(a^n_t|s^n_t) pθ(atnstn) 也就是按照 − ∇ θ log ⁡ p θ ( a t n ∣ s t n ) -\nabla_\theta \log p_\theta(a^n_t|s^n_t) θlogpθ(atnstn)这个方向更新 θ \theta θ,上式合情合理。


Two Tips to improve the credit

  1. Advantage function
    从刚刚这个解释中也可以看出,如果 total reward 有正有负的话实际上是更好学习的。所以一般在实际中我们会把 R ( τ n ) R(\tau^n) R(τn) 减掉一个 baseline 使得 total reward 有正有负。减掉baseline之后的数实际上衡量的是action之间的相对好坏,我们称之为 advantage function.
    A θ ( s t , a t ) = R ( τ n ) − b A^\theta(s_t,a_t) = R(\tau^n) - b Aθ(st,at)=R(τn)b
    其中 b b b 我们可以取减掉的数为 R ( τ n ) R(\tau^n) R(τn) 的均值 E [ R ( τ ) ] \mathbb{E}[R(\tau)] E[R(τ)], 我们也可以用DNN来算这个值.

  2. Credit assignment
    在当前的式子中,一个轨迹中的所有action都给了同样的weights也就是 R ( τ n ) − b R(\tau^n) - b R(τn)b, 但这显然是不公平的。所以我们可以考虑给不同的action assign 不同的weight

∇ θ R ˉ θ = 1 N ∑ n = 1 N ∑ t = 1 T n ( ∑ t ′ = t T n γ t ′ − t r t ′ n − b ) ∇ θ log ⁡ p θ ( a t n ∣ s t n ) \nabla_\theta \bar{R}_\theta=\frac{1}{N}\sum_{n=1}^N \sum_{t=1}^{T_n}\left(\sum_{t'=t}^{T_n}\gamma^{t'-t}r^n_{t'} -b\right) \nabla_\theta \log p_\theta(a^n_t|s^n_t) θRˉθ=N1n=1Nt=1Tn(t=tTnγttrtnb)θlogpθ(atnstn)

Importance sampling

以上我们描述的policy gradient的方法,是从某一个初始policy π θ 0 \pi_{\theta_0} πθ0 开始,不断地sample轨迹,从轨迹中模拟出gradient,在更新 θ \theta θ 得到新的policy π θ 1 \pi_{\theta_1} πθ1, 然后重新sample 轨迹 再不断更新的过程。这是一个on-policy的算法,每次得到新的policy都要重新用新的policy来sample experience,因此非常 sample inefficient. 所以我们先考虑把它转换成一个off-policy的方式。

A3C and A2C

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值