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+1∣st,at) 来表示;用户的policy是随机的,可以用 p ( a t ∣ s t ) p(a_t|s_t) p(at∣st) 来表示。我们的目的是找到policy,所以我们可以用变量来表示policy。单个变量肯定不现实啦,所以就用一个神经网络with参数 θ \theta θ. 那么policy就可以描述为 π = p θ ( a t ∣ s t ) \pi=p_\theta(a_t|s_t) π=pθ(at∣st)。注意,我们是没法控制环境的,所以我们唯一能改变游戏走向的手段就是改变 θ \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θ(a1∣s1)p(s2∣s1,a1)pθ(a2∣s2)...p(sT∣sT−1,aT−1)p(aT∣sT)
此式很好理解,就是一个联合分布的拆解而已。
第二个问题:给定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=1∑Trt
τ
\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(τ)]
注意
- 这里面 R ( τ ) R(\tau) R(τ)也可以是随机变量(即对于固定的 τ \tau τ,每一个确定的action拿到的reward也可以是随机的),但是它是环境的一部分我们没法操控,所以我们不care R ( τ ) R(\tau) R(τ)是不是随机是不是可微分。在调整policy的过程中,我们只是把它当做常数项而已。
- 不同的轨迹 τ \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θ(a1∣s1)+logp(s2∣s1,a1)+...)
= ∑ t = 1 T ∇ θ log p θ ( a t ∣ s t ) = \sum_{t=1}^T \nabla_\theta \log p_\theta(a_t|s_t) =t=1∑T∇θlogpθ(at∣st)
所以实际上可以看到,对于某一个轨迹, ∇ θ 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θ(at∣st) 有关。这也很合理,因为只有决策时才能改变轨迹 τ \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=1∑NR(τ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=1∑Nt=1∑TnR(τn)∇θlogpθ(atn∣stn)
这个公式其实也很好理解,就是用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θ(atn∣stn) 是让 log p θ ( a t n ∣ s t n ) \log p_\theta(a^n_t|s^n_t) logpθ(atn∣stn) 增大的方向,也就是让 p θ ( a t n ∣ s t n ) p_\theta(a^n_t|s^n_t) pθ(atn∣stn) 增大的方向。因此,如果某一个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θ(atn∣stn) 也就是按照 ∇ θ log p θ ( a t n ∣ s t n ) \nabla_\theta \log p_\theta(a^n_t|s^n_t) ∇θlogpθ(atn∣stn)这个方向更新 θ \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θ(atn∣stn) 也就是按照 − ∇ θ log p θ ( a t n ∣ s t n ) -\nabla_\theta \log p_\theta(a^n_t|s^n_t) −∇θlogpθ(atn∣stn)这个方向更新 θ \theta θ,上式合情合理。
Two Tips to improve the credit
-
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来算这个值. -
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=1∑Nt=1∑Tn(t′=t∑Tnγt′−trt′n−b)∇θlogpθ(atn∣stn)
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的方式。