策略梯度(Policy Gradient)
在 reinforcement learning 中有 3 个components,actor,environment,reward function。
举例子说明
让机器玩 video game 时,
- actor 做的事情就是去操控游戏的摇杆, 比如说向左、向右、开火等操作;
- environment 就是游戏的主机, 负责控制游戏的画面负责控制说,怪物要怎么移动, 你现在要看到什么画面等等;
- reward function 就是当你做什么事情,发生什么状况的时候,你可以得到多少分数, 比如说杀一只怪兽得到 20 分等等
在 reinforcement learning 里面,environment 跟 reward function 不是你可以控制的,environment 跟 reward function 是在开始学习之前,就已经事先给定的。你唯一能做的事情是调整 actor 里面的 policy(policy 决定了 actor 的行为),使得 actor 可以得到最大的 reward。
- Policy 一般写成 π \pi π。假设你是用 deep learning 的技术来做 reinforcement learning 的话,policy 就是一个 network。Network 里面就有一堆参数, 我们用 θ \theta θ 来代表 π \pi π 的参数。
- Network 的 input 就是现在 machine 看到的东西(observation),如果让 machine 打电玩的话,machine 看到的东西就是游戏的画面.
- Output 的就是机器要采取什么样的行为(action)。
一场游戏叫做一个 episode(回合) 或者 trial(试验)。把这个游戏里面,所有得到的 reward 都总合起来,就是 total reward,我们称其为return(回报),用 R 来表示它。Actor 要想办法去 maximize 它可以得到的 reward。
在一场游戏里面,我们把 environment 输出的
s
s
s 跟 actor 输出的行为
a
a
a合并为一个序列,叫做Trajectory。
T
r
a
j
e
c
t
o
r
y
τ
=
s
1
,
a
1
,
s
2
,
a
2
.
.
.
s
t
,
a
t
Trajectory\ \tau={s_1,a_1,s_2,a_2...s_t,a_t}
Trajectory τ=s1,a1,s2,a2...st,at
当
θ
\theta
θ给定后,我们可以计算每一个
τ
\tau
τ出现的概率。
P
θ
(
τ
)
=
P
(
s
1
)
P
(
a
1
∣
s
1
)
P
(
s
2
∣
a
1
,
s
1
)
P
(
a
2
∣
s
2
)
P
(
s
3
∣
s
2
,
a
2
)
.
.
.
.
=
p
(
s
1
)
∏
t
=
1
T
P
θ
(
a
t
∣
s
t
)
P
(
s
t
+
1
∣
s
t
,
a
t
)
P_{\theta}(\tau)=P(s_1)P(a_1|s_1)P(s_2|a_1,s_1)P(a_2|s_2)P(s_3|s_2,a_2).... \\=p(s_1)\prod_{t=1}^T P_{\theta}(a_t|s_t)P(s_{t+1}|s_t,a_t)
Pθ(τ)=P(s1)P(a1∣s1)P(s2∣a1,s1)P(a2∣s2)P(s3∣s2,a2)....=p(s1)t=1∏TPθ(at∣st)P(st+1∣st,at)
由上式可以得知,
s
t
s_t
st只取决于
s
t
−
1
和
a
t
−
1
s_{t-1}和a_{t-1}
st−1和at−1,而
a
t
a_t
at只取决于
s
t
s_t
st。
同时,每个
τ
\tau
τ都会带来一定的reward,由于
τ
\tau
τ的随机性,reward也是随机变量,因此我们需要计算他的期望值。因此在
θ
\theta
θ确定的情况下,我们对reward求期望。
而为了计算这个期望值,我们需要对
θ
\theta
θ不变的情况下,穷举出
τ
\tau
τ的情况和概率。
1.1、推导策略梯度
在得出关于
θ
\theta
θ的reward函数之后,我们对
θ
\theta
θ求梯度,去求解最大的reward。
首先,我们需要知道公式:
∇
f
(
x
)
=
f
(
x
)
∇
l
o
g
f
(
x
)
∇f(x)=f(x)∇logf(x)
∇f(x)=f(x)∇logf(x)
由此我们得到:
∇
P
θ
(
τ
)
=
P
θ
(
t
a
u
)
∇
log
P
θ
\nabla P_{\theta}(\tau)=P_{\theta}(tau)∇\log{P_{\theta}}
∇Pθ(τ)=Pθ(tau)∇logPθ
P
θ
(
τ
)
P_{\theta}(\tau)
Pθ(τ)里面有两种因式,
P
θ
(
a
t
∣
s
t
)
P_{\theta}(a_t|s_t)
Pθ(at∣st)和
P
θ
(
a
t
+
1
∣
a
t
,
s
t
)
P_{\theta}(a_{t+1}|a_t,s_t)
Pθ(at+1∣at,st)。而
P
θ
(
a
t
+
1
∣
a
t
,
s
t
)
P_{\theta}(a_{t+1}|a_t,s_t)
Pθ(at+1∣at,st)是由环境决定的从而与
θ
\theta
θ无关,因此
∇
log
P
θ
(
a
t
+
1
∣
a
t
,
s
t
)
=
0
\nabla\log P_{\theta}(a_{t+1}|a_t,s_t)=0
∇logPθ(at+1∣at,st)=0.
1.2、Tips
1.2.1、first tip
如果 given state s 采取 action a 会给你整场游戏正面的 reward,就要增加它的概率。如果 state s 执行 action a,整场游戏得到负的 reward,就要减少这一项的概率。
但在很多游戏里面,
r
e
w
a
r
d
≥
0
reward \geq 0
reward≥0。举一个例子:
假设你在某一个 state 有 3 个 action a/b/c可以执行。根据这个式子,你要把这 3 项的概率, log probability 都拉高。 但是它们前面 weight 的这个 R 是不一样的。 R 是有大有小的,weight 小的,它上升的就少,weight 多的,它上升的就大一点。 因为这个 log probability,它是一个概率,所以action a、b、c 的和要是 0。 所以上升少的,在做完 normalize 以后, 它其实就是下降的,上升的多的,才会上升。但是这是一个理想状况。实际上,在真正的学习过程中,某些action并没有被sample到,导致其他action的概率上升而未被sample的action下降。但是这并不代表这些action不会带来正reward。因此我们reward减掉一项b,叫做baseline。
为什么这么做?
所以如果得到的 total reward
R
(
τ
n
)
R(\tau^n)
R(τn)大于 b 的话,就让它的概率上升。如果这个 total reward 小于 b,就算它是正的,正的很小也是不好的,你就要让这一项的概率下降。
我们把 R − b R-b R−b称为advantage function,用 A A A来代表。Advantage function 的意义就是,假设我们在某一个 s t a t e s t state s_t statest 执行某一个 a c t i o n a t action a_t actionat ,相较于其他可能的 action,它有多好。它在意的不是一个绝对的好,而是相对的好,即相对优势(relative advantage)。因为会减掉一个 b,减掉一个 baseline, 所以这个东西是相对的好,不是绝对的好。 A θ ( s t , a t ) A^{\theta}\left(s_{t}, a_{t}\right) Aθ(st,at) 通常可以是由一个 network estimate 出来的,这个 network 叫做 critic。
1.2.2、second tip
第二个tip:给每个action合适的credit。
在一场游戏种,最好的
R
(
τ
n
)
R(\tau^n)
R(τn)得到提升并不代表每个行为都是正确的,同理
R
(
τ
n
)
R(\tau^n)
R(τn)的下降也不代表每个行为都是错的。所以我们希望可以给每一个不同的 action 前面都乘上不同的 weight。每一个 action 的不同 weight, 它反映了每一个 action 到底是好还是不好。
以上面两个图为例,第一个图的+3并不代表
s
t
a
t
e
s
b
state s_b
statesb执行
a
2
a_2
a2是好的,主要是由于
s
a
s_a
sa的
a
1
a_1
a1。
R
R
R由+3变为-7,也是由于
s
a
s_a
sa的action导致的,可能与
s
b
s_b
sb的action无关。所以
s
t
a
t
e
s
b
state s_b
statesb执行
a
2
a_2
a2可能只是会导致-2而与-5无关。
但是假设我们今天 sample 到这项的次数够多,把所有发生这件事情的情况的分数通通都集合起来, 那可能不是一个问题。但现在的问题就是,我们 sample 的次数是不够多的。在 sample 的次数不够多的情况下,你要给每一个 state 跟 action pair 合理的 credit,你要让大家知道它合理的 contribution。怎么给它一个合理的 contribution 呢? 一个做法是计算这个 pair 的 reward 的时候,不把整场游戏得到的 reward 全部加起来,只计算从这一个 action 执行以后所得到的 reward。
再进一步,我们把未来的 reward 做一个 discount,由此得到的回报被称为 Discounted Return(折扣回报)。
1.2、计算策略梯度
我们前面提到policy function其实就是neural network(这也是DRL最大特征)。所以这个梯度计算我们完全可以利用监督学习的network去理解。
1.2.1、监督式学习
在实际应用中,我们希望网络的输出尽可能逼近实际情况我们采取交叉熵(Cross Entropy)去评价两个概率分布的差距。
1.2.2、policy Gradient
policy function预测每个状态下行动的概率。我们将网络的输出和实际动作求交叉熵(这里注意:和监督学习不同,这里没有标签,所以使用实际动作)。为了让网络往正确的方向更新,这里需要乘以一个奖励回报
G
t
G_t
Gt。这个奖励回报相当于对真实action的评价,
G
t
G_t
Gt越大,权重就越大,优化力度更大一些。
类比监督式学习的loss,policy gradient其实没有本质不同,都是网络输出和实际需要的概率分布差距。而优化方向就是减小这个差距。
1.2.3、整个流程
上图是 REINFORCE 的流程图。首先我们需要一个 policy model 来输出动作概率,输出动作概率后,我们用 sample 函数去得到一个具体的动作,然后跟环境交互过后,我们可以得到一整个 episode 的数据。拿到 episode 数据之后,我再去执行一下 learn() 函数,在 learn() 函数里面,我就可以拿这些数据去构造 loss function,扔给这个优化器去优化,去更新我的 policy model。
蒙特卡洛(MC)和时序差分
2、PPO(近端策略优化)
on-policy 和 off-policy 这两种 training 方法的区别。
- 如果要 learn 的 agent 跟和环境互动的 agent 是同一个的话, 这个叫做on-policy(同策略)。
- 如果要 learn 的 agent 跟和环境互动的 agent 不是同一个的话, 那这个叫做off-policy(异策略)。
为什么我们会想要考虑 off-policy ?让我们来想想 policy gradient。Policy gradient 是 on-policy 的做法,因为在做 policy gradient 时, actor 先去跟环境互动去搜集资料,搜集很多的 τ \tau τ,根据它搜集到的资料,会按照 policy gradient 的式子去 update policy 的参数。所以 policy gradient 是一个 on-policy 的 algorithm。但是这种方法需要每次重新collect数据,所以我们尝试使用另外一个policy和actor θ ′ \theta^\prime θ′去sample数据,那么 θ \theta θ可以update多次。
2.1、importance sampling
如何实现上诉的off-policy过程呢?
假设我有一个function f(x) ,我无法对其进行积分,但是现在需要计算f(x)的期望。一般方法是sample data,然后把data代入到f(x)中,取均值。
如果我们无法sample data呢?但我们有distribution q 去sample,所以我们可以应用下面这个式子:
我们去q中sample x,然去计算
f
(
x
)
p
(
x
)
q
(
x
)
f(x)\frac {p(x)}{q(x)}
f(x)q(x)p(x)的期望值。
因此,我们可以使用importance sampling把on-policy的问题变为了off-policy的问题。
做 policy gradient 的时候,也是同样。
注意图片的红色斜杠,这里我们假设
p
θ
(
s
t
)
=
p
θ
′
(
s
t
)
p_{\theta}(s_t)=p_{\theta^\prime}(s_t)
pθ(st)=pθ′(st)。由于参数
θ
\theta
θ和参数
θ
′
\theta^\prime
θ′分别和环境互动时,同一个
s
t
s_t
st出现的概率无法计算,所以选择相同作为处理方法。
但是
p
θ
(
a
t
∣
s
t
)
p_{\theta}(a_t|s_t)
pθ(at∣st)很好算。policy function 就是一个network,你就把
s
t
s_t
st输入网络中去,网络就会输出
a
t
a_t
at的概率即
p
θ
(
a
t
∣
s
t
)
p_\theta(a_t|s_t)
pθ(at∣st)
其中
j
θ
′
(
θ
)
j^{\theta^\prime}(\theta)
jθ′(θ)是反推出来的原函数。
2.1.1、issue of importance sampling
但 importance sampling 有一个 issue,虽然理论上可以换成其他任何分布,但是如果
p
θ
(
a
t
∣
s
t
)
p_{\theta}(a_t|s_t)
pθ(at∣st)跟
p
θ
′
(
a
t
∣
s
t
)
p_{\theta^\prime}(a_t|s_t)
pθ′(at∣st)差太多的话,这两个 distribution 差太多的话,importance sampling 的结果就会不好。
p是原分布,q是另一个分布。
上式可以看出mean相同,不代表variance相同。根据上图推导式,
p
(
x
)
q
(
x
)
\frac{p(x)}{q(x)}
q(x)p(x)的值过大,variance就会相差很大。这样会导致的结果是,一旦sample的数据不够多,会导致非常大的差距,实操与理论不符合。
举个例子。
上图中,先sample q(x),如果你的sample次数不够多,那么大多数数据在右侧而q(x)为正数,所以计算出等式右侧是正数。同理,等式左侧是负数。但是理论上等式左右两侧都是负数。
所以PPO就是避免两个distribution差太多。
2.2、Proximal Policy Optimization
PPO的出现是为了避免
p
θ
(
a
t
∣
s
t
)
p_{\theta}(a_t|s_t)
pθ(at∣st)跟
p
θ
′
(
a
t
∣
s
t
)
p_{\theta^\prime}(a_t|s_t)
pθ′(at∣st)差太多,但不是
θ
\theta
θ和
θ
′
\theta^\prime
θ′差太多,因为刚刚的推导式中是参数
θ
\theta
θ下的network计算出的概率。
TRPO(Trust Region Policy Optimization)是PPO的前身,计算上和代码实现上,PPO会简单许多。
Q:KL divergence 到底指的是什么?
A:虽然KL的参数是
θ
\theta
θ和
θ
′
\theta^\prime
θ′,但是实际上他计算的是对应
θ
\theta
θ下action的距离。这也是PPO的目的。
最终PPO的算法如下
2.2.1、PPO-Penalty
在 PPO 的 paper 里面还有一个 adaptive KL divergence。
β
\beta
β 要设多少呢?这里有个动态调整
β
\beta
β的方法。
- 在这个方法里面呢,你先设一个 KL divergence,你可以接受的最大值。然后假设你发现说你 optimize 完这个式子以后,KL divergence 的项太大,那就代表说后面这个 penalize 的 term 没有发挥作用,那就把 β \beta β 调大。
- 那另外你定一个 KL divergence 的最小值。如果发现 optimize 完上面这个式子以后,KL divergence 比最小值还要小,那代表后面这一项的效果太强了。所以减少$ \beta$。
2.2.1、PPO-Clip
因为这个式子想要做的事情就是希望
p
θ
(
a
t
∣
s
t
)
p_{\theta}(a_t|s_t)
pθ(at∣st)跟
p
θ
′
(
a
t
∣
s
t
)
p_{\theta^\prime}(a_t|s_t)
pθ′(at∣st),也就是你拿来做 demonstration 的 model 跟你实际上 learn 的 model,在 optimize 以后不要差距太大。
第二项前面有个 clip function,他的作用是:
在括号里面有 3 项,如果第一项小于第二项的话,那就 output
1
−
ε
1-\varepsilon
1−ε 。第一项如果大于第三项的话,那就output
1
+
ε
1+\varepsilon
1+ε。
解释:
当A>0时,也就是某一个 state-action 的 pair 是好的,那我们希望增加这个 state-action pair 的概率。
p
θ
(
a
t
∣
s
t
)
p_{\theta}(a_t|s_t)
pθ(at∣st)会越大越好,但它跟
p
θ
k
(
a
t
∣
s
t
)
p_{\theta^k}(a_t|s_t)
pθk(at∣st)的比值不可以超过
1
+
ε
1+\varepsilon
1+ε。当
p
θ
(
a
t
∣
s
t
)
p_{\theta}(a_t|s_t)
pθ(at∣st)被train到
p
θ
(
a
t
∣
s
t
)
p
θ
k
(
a
t
∣
s
t
)
>
1
+
ε
\frac{p_{\theta}(a_t|s_t)}{p_{\theta^k}(a_t|s_t)} > 1+\varepsilon
pθk(at∣st)pθ(at∣st)>1+ε时,就停止。