赞
踩
强化学习算法
{
Value-Based Approach:
Critic
{
State value function
V
π
(
s
)
State-Action value function
Q
π
(
s
,
a
)
⟹
Q-Learning算法【训练Critic/值函数的参数:基于值函数结果来“间接”挑选最优 π】
Policy-Based Approach:Policy Gradient算法【“直接”训练
Actor
/Policy π 的参数】
⟹
PPO算法
Actor+Critic【使用Critic(比如Q-Learning)作为Policy Gradient算法(包括PPO)中评估策略好坏(Advantage)的手段】
OpenAI 把PPO当作他们默认强化学习算法
The on-policy approach in the preceding section is actually a compromise—it learns action values not for the optimal policy, but for a near-optimal policy that still explores. on-policy算法是在保证跟随最优策略的基础上同时保持着对其它动作的探索性,对于on-policy算法来说如要保持探索性则必然会牺牲一定的最优选择机会。
A more straightforward approach is to use two policies, one that is learned about and that becomes the optimal policy, and one that is more exploratory and is used to generate behavior. 有一个更加直接的办法就是在迭代过程中允许存在两个policy,一个用于生成学习过程的动作,具有很强的探索性,另外一个则是由值函数产生的最优策略,这个方法就被称作off-policy。
The policy being learned about is called the target policy, and the policy used to generate behavior is called the behavior policy.In this case we say that learning is from data “off” the target policy, and the overall process is termed off-policy learning.
f ( x ) f(x) f(x) 与 f ( x ) p ( x ) q ( x ) f(x)\cfrac{p(x)}{q(x)} f(x)q(x)p(x)这两个 random variable 它的 mean 一样,并不代表他们的 方差(var)一样。
通过公式:
VAR
[
X
]
=
E
[
X
2
]
−
(
E
[
X
]
)
2
\operatorname{VAR}[X]=E\left[X^{2}\right]-(E[X])^{2}
VAR[X]=E[X2]−(E[X])2
可计算得到:
Var
x
∼
p
[
f
(
x
)
]
=
E
x
∼
p
[
f
(
x
)
2
]
−
(
E
x
∼
p
[
f
(
x
)
]
)
2
(
1
)
Var
x
∼
q
[
f
(
x
)
p
(
x
)
q
(
x
)
]
=
E
x
∼
q
[
(
f
(
x
)
p
(
x
)
q
(
x
)
)
2
]
−
(
E
x
∼
q
[
f
(
x
)
p
(
x
)
q
(
x
)
]
)
2
=
E
x
∼
q
[
p
(
x
)
q
(
x
)
⋅
f
(
x
)
2
⋅
p
(
x
)
q
(
x
)
]
−
(
E
x
∼
q
[
f
(
x
)
p
(
x
)
q
(
x
)
]
)
2
∵
∵
∵
E
x
∼
p
[
f
(
x
)
]
=
∫
f
(
x
)
p
(
x
)
d
x
=
∫
f
(
x
)
p
(
x
)
q
(
x
)
q
(
x
)
d
x
=
E
x
∼
q
[
p
(
x
)
q
(
x
)
f
(
x
)
]
∴
∴
∴
E
x
∼
q
[
p
(
x
)
q
(
x
)
⋅
f
(
x
)
2
⋅
p
(
x
)
q
(
x
)
]
=
E
x
∼
p
[
f
(
x
)
2
p
(
x
)
q
(
x
)
]
\mathbb{E}_{x \sim q}\left[\cfrac{p(x)}{q(x)}·f(x)^{2}·\cfrac{p(x)}{q(x)}\right]=\mathbb{E}_{x \sim p}\left[f(x)^{2} \cfrac{p(x)}{q(x)}\right]
Ex∼q[q(x)p(x)⋅f(x)2⋅q(x)p(x)]=Ex∼p[f(x)2q(x)p(x)]
∴
∴
∴
Var
x
∼
q
[
f
(
x
)
p
(
x
)
q
(
x
)
]
=
E
x
∼
p
[
f
(
x
)
2
p
(
x
)
q
(
x
)
]
−
(
E
x
∼
p
[
f
(
x
)
]
)
2
(
2
)
通过式(1)、(2)可看出:如果 p ( x ) q ( x ) \cfrac{p(x)}{q(x)} q(x)p(x) 很大的话,那么实际采样的 Var x ∼ q [ f ( x ) p ( x ) q ( x ) ] \operatorname{Var}_{x \sim q}\left[f(x) \cfrac{p(x)}{q(x)}\right] Varx∼q[f(x)q(x)p(x)] 就会与希望的 Var x ∼ p [ f ( x ) ] \operatorname{Var}_{x \sim p}[f(x)] Varx∼p[f(x)] 差别很大。
虽然理论上如果 f ( x ) f(x) f(x) 与 f ( x ) p ( x ) q ( x ) f(x)\cfrac{p(x)}{q(x)} f(x)q(x)p(x)这两个 random variable 它的 mean/Expectation 一样,那么只要对 p p p、 q q q这两个分布采样足够多次的话,你得到的结果会是一样的。
但是假设你 sample 的次数不够多,因为它们的 various 差距是很大的,所以你就有可能得到非常大的差别。
假设:
通过 p p p 分布采样:
通过 q q q 分布采样:
利用 Importance Sampling 将 Policy Gradient 这个 On-policy算法 转为 Off-policy算法
由Policy Gradient 可知:将 Policy Gradient 经过 “Add a Baseline”、“Assign Suitable Credit” 处理后的梯度为:
∇
θ
R
‾
θ
≈
1
N
∑
i
=
1
N
∑
t
=
1
T
i
[
A
θ
(
s
t
,
a
t
)
∇
θ
l
o
g
p
θ
(
a
t
i
∣
s
t
i
)
]
=
E
(
s
t
,
a
t
)
∼
π
θ
[
A
θ
(
s
t
,
a
t
)
∇
θ
l
o
g
P
θ
(
a
t
∣
s
t
)
]
这边 A ( s t , a t ) A(s_t,a_t) A(st,at) 有一个上标 θ \theta θ 代表这个 A A A 是 actor θ \text{actor}^{\theta} actorθ 跟环境互动的时候所计算出来的 A A A。 但是实际上我们今天从 θ \theta θ 换到 θ ′ \theta^{\prime } θ′ 的时候, A θ ( s t , a t ) A^{\theta}(s_t,a_t) Aθ(st,at) 其实应该改成 A θ ′ ( s t , a t ) A^{\theta^{\prime }}(s_t,a_t) Aθ′(st,at),为什么?这个 A ( s t , a t ) A(s_t,a_t) A(st,at) 这一项是怎么来的? A ( s t , a t ) A(s_t,a_t) A(st,at) 这一项是想要估测说现在在某一个 state采取某一个 action 接下来 会得到 accumulated reward 的值减掉 base line。你怎么估这一项 advantage A A A,你就会看 在这个 state s t s_t st 采取这个 action a t a_t at 接下来会得到的 reward 的总和 再减掉 baseline。之前是 参数为 θ \theta θ 的Actor π π π 在跟环境做互动,所以你观察到的是 θ \theta θ 得到的 reward。但现在不是参数为 θ \theta θ 的Actor π π π 跟环境做互动,现在是参数为 θ ′ \theta^{\prime } θ′ 的Actor π π π 在跟环境做互动。所以你得到的这个 advantage, 其实是根据 θ ′ \theta^{\prime } θ′ 所 estimate 出来的 advantage A A A。
∴
∴
∴
∇
θ
R
‾
θ
=
E
(
s
t
,
a
t
)
∼
π
θ
[
A
θ
(
s
t
,
a
t
)
∇
θ
l
o
g
P
θ
(
a
t
∣
s
t
)
]
=
E
(
s
t
,
a
t
)
∼
π
θ
′
[
P
θ
(
s
t
,
a
t
)
P
θ
′
(
s
t
,
a
t
)
A
(
θ
′
)
(
s
t
,
a
t
)
∇
θ
l
o
g
P
θ
(
a
t
∣
s
t
)
]
=
E
(
s
t
,
a
t
)
∼
π
θ
′
[
P
θ
(
a
t
∣
s
t
)
P
θ
(
s
t
)
P
θ
′
(
a
t
∣
s
t
)
P
θ
′
(
s
t
)
A
(
θ
′
)
(
s
t
,
a
t
)
∇
θ
l
o
g
P
θ
(
a
t
∣
s
t
)
]
上式子中假设模型是 θ θ θ 时看到 s t s_t st 的几率 P θ ( s t ) P_θ(s_t) Pθ(st) 与模型是 θ ′ θ' θ′ 时看到 s t s_t st 的几率 p θ ′ ( s t ) p_{θ'}(s_t) pθ′(st) 是一样的,举例来说,会看到什么 state 往往跟你会采取什么样的 action 是没有太大的关系的。
比如说你玩不同的 Atari 的游戏,那其实你看到的游戏画面都是差不多的,所以也许不同的 θ θ θ 对 s t s_t st 是没有影响的。但是有一个更直觉的理由就是,这一项到时候真的要你算,你会算吗? 你不觉得这项你不太能算吗?因为想想看这项要怎么算,这一项表示有一个参数为 θ θ θ 的 A c t o r θ Actor_θ Actorθ,然后拿 A c t o r θ Actor_θ Actorθ去跟环境做互动去算 s t s_t st 出现的机率,这个你根本很难算,尤其是你如果 input 是 image 的话, 同样的 s t s_t st 根本就不会出现第二次,所以你根本没有办法估这一项, 所以干脆就无视这个问题。
但是 P θ ( a t ∣ s t ) P_θ(a_t|s_t) Pθ(at∣st) 这一项是可以计算的,你手上有参数为 θ θ θ 的神经网络,你就把 s t s_t st 带进去(比如 s t s_t st 就是游戏画面),你把游戏画面带进去, 参数为 θ θ θ 的神经网络就会告诉你某一个 state s t s_t st 的 a t a_t at 机率是多少。
也就是说我们其实有个 policy 的 network π θ π_θ πθ,把 s t s_t st 带进去, π θ π_θ πθ会告诉我们每一个 a t a_t at 的机率是多少,所以这一项 P θ ( a t ∣ s t ) P_θ(a_t|s_t) Pθ(at∣st) 你只要知道 π θ π_θ πθ 的参数 θ θ θ ,知道 π θ ′ π_{θ'} πθ′ 的参数 θ ′ θ' θ′,这个 P θ ( a t ∣ s t ) P_θ(a_t|s_t) Pθ(at∣st)、 P θ ′ ( a t ∣ s t ) P_{θ'}(a_t|s_t) Pθ′(at∣st)就可以算。
∴
∴
∴
令
P
θ
(
s
t
)
=
P
θ
′
(
s
t
)
P_θ(s_t)=P_{θ'}(s_t)
Pθ(st)=Pθ′(st),得 “梯度”:
∇
θ
R
‾
θ
=
E
(
s
t
,
a
t
)
∼
π
θ
′
[
P
θ
(
a
t
∣
s
t
)
P
θ
′
(
a
t
∣
s
t
)
A
(
θ
′
)
(
s
t
,
a
t
)
∇
θ
l
o
g
P
θ
(
a
t
∣
s
t
)
]
可以根据 gradient/梯度 去反推原来的 objective function/目标函数:
∇
θ
R
‾
θ
=
E
(
s
t
,
a
t
)
∼
π
θ
′
[
P
θ
(
a
t
∣
s
t
)
P
θ
′
(
a
t
∣
s
t
)
A
(
θ
′
)
(
s
t
,
a
t
)
∇
θ
l
o
g
P
θ
(
a
t
∣
s
t
)
]
=
E
(
s
t
,
a
t
)
∼
π
θ
′
{
[
P
θ
(
a
t
∣
s
t
)
P
θ
′
(
a
t
∣
s
t
)
A
(
θ
′
)
(
s
t
,
a
t
)
]
∇
θ
l
o
g
[
P
θ
(
a
t
∣
s
t
)
P
θ
′
(
a
t
∣
s
t
)
A
(
θ
′
)
(
s
t
,
a
t
)
]
}
紫色部分与θ无关
∵ ∇ x l o g f ( x ) = 1 f ( x ) ∇ x f ( x ) ∴ ∇ x f ( x ) = f ( x ) ∇ x l o g f ( x ) \textbf{∵} \quad \nabla_xlogf(x)=\cfrac{1}{f(x)}\nabla_xf(x) \qquad \textbf{∴} \quad \nabla_xf(x)=f(x)\nabla_xlogf(x) ∵∇xlogf(x)=f(x)1∇xf(x)∴∇xf(x)=f(x)∇xlogf(x)
∴
\textbf{∴}
∴目标函数为:
J
(
θ
′
)
(
θ
)
=
R
‾
(
θ
′
)
(
θ
)
=
E
(
s
t
,
a
t
)
∼
π
θ
′
[
P
θ
(
a
t
∣
s
t
)
P
θ
′
(
a
t
∣
s
t
)
A
(
θ
′
)
(
s
t
,
a
t
)
]
其中:
用 θ ′ θ' θ′ 去跟环境做互动,sample 出 ( s t , a t ) (s_t,a_t) (st,at) 以后,去计算 ( s t , a t ) (s_t,a_t) (st,at) 的 advantage A ( θ ′ ) ( s t , a t ) A^{(θ')}(s_t,a_t) A(θ′)(st,at), 然后在计算 P θ ( a t ∣ s t ) P θ ′ ( a t ∣ s t ) A ( θ ′ ) ( s t , a t ) \cfrac{P_θ(a_t|s_t)}{P_{θ'}(a_t|s_t)}A^{(θ')}(s_t,a_t) Pθ′(at∣st)Pθ(at∣st)A(θ′)(st,at),其中:
所以这一整项 P θ ( a t ∣ s t ) P θ ′ ( a t ∣ s t ) A ( θ ′ ) ( s t , a t ) \cfrac{P_θ(a_t|s_t)}{P_{θ'}(a_t|s_t)}A^{(θ')}(s_t,a_t) Pθ′(at∣st)Pθ(at∣st)A(θ′)(st,at) 是可以算的。
实际上在 update 参数的时候,就是按照上面这个式子去 update 参数。所以,通过上面的式子可以把 on-policy 换成 off-policy。
但是我们会遇到的问题是,importance sampling 有一个 issue,就是 P θ P_θ Pθ 跟 P θ ′ P_{θ'} Pθ′ 不能差太多,差太多的话,importance sampling 结果就会不好。怎么避免它差太多呢?这个就是 PPO 在做的事情
由 “Importance Sampling” 的讨论可知,实践中,在公式
E
x
∼
p
[
f
(
x
)
]
=
E
x
∼
q
[
f
(
x
)
p
(
x
)
q
(
x
)
]
PPO 与 TRPO 的效果差不多,但是在实操时, 使用PPO算法 比 使用 TRPO 算法更容易操作。
虽然 PPO 或 TRPO(PPO 的前身) 原始的 Paper 里面写了很多的数学式,但它它实际上做的事情就是:
原来在 off-policy 的方法里面说,我们要 optimize 的是这个 objective function,但是我们又说这个 objective function 又牵涉到 importance sampling。在做 importance sampling 的时候
P
θ
P_θ
Pθ 不能跟
P
θ
′
P_{θ'}
Pθ′ 差太多,你做 demonstration 的 model 不能够跟真正的 model 差太多,差太多的话 importance sampling 的结果就会不好。
所以:我们在 training 的时候 多加一个 constrain。这个 constrain 是 π θ π_θ πθ 跟 t π θ ′ π_{θ'} πθ′ 这两个 model 输出的结果(输出结果为action)的 KL diversions,即: K L ( θ , θ ′ ) KL(θ,θ') KL(θ,θ′)。
J
P
P
O
(
θ
′
)
(
θ
)
=
J
(
θ
′
)
(
θ
)
−
β
K
L
(
θ
,
θ
′
)
=
E
(
s
t
,
a
t
)
∼
π
θ
′
[
P
θ
(
a
t
∣
s
t
)
P
θ
′
(
a
t
∣
s
t
)
A
(
θ
′
)
(
s
t
,
a
t
)
]
−
β
K
L
(
θ
,
θ
′
)
其中:
两个参数所代表的神经网络模型的 behavior 的KL距离
,即:采用
θ
θ
θ与
θ
′
θ'
θ′这两个参数的两个Model的 Output 的 Action 的分布(即:
π
θ
π_θ
πθ与
π
θ
′
π_{θ'}
πθ′ 的输出的概率分布) 的 KL-Divergence。平均起来
才是我这边所指的这两个 Actor 间的 KL diversions。
其中:
Adaptive KL penalty
。PPO 的前身TRPO:
J
T
R
P
O
(
θ
′
)
(
θ
)
=
E
(
s
t
,
a
t
)
∼
π
θ
′
[
P
θ
(
a
t
∣
s
t
)
P
θ
′
(
a
t
∣
s
t
)
A
(
θ
′
)
(
s
t
,
a
t
)
]
K
L
(
π
θ
,
π
θ
′
)
<
δ
PPO 与 TRPO唯一不一样的地方就是 constrain K L ( θ , θ ′ ) KL(θ,θ') KL(θ,θ′) 摆的位置不一样。
PPO 直接把 constrain 放到你要 optimize 的式子 J P P O ( θ ′ ) ( θ ) = J ( θ ′ ) ( θ ) − β K L ( θ , θ ′ ) J^{(θ')}_{PPO}(θ)=J^{(θ')}(θ)-βKL(θ,θ') JPPO(θ′)(θ)=J(θ′)(θ)−βKL(θ,θ′) 里面,然后接下来你就可以用 gradient ascent 的方法去 maximize 这个式子。
TRPO是把 KL diversions 当作 constrain,他希望 θ θ θ 跟 θ ′ θ' θ′ 的 KL diversions 小于一个 δ \delta δ,那你知道你在做那种 optimization 如果你是用 gradient based optimization 的时候,有 constrain 是很难处理的。就是因为它是把这一个 KL diversions constrain 当做一个额外的 constrain,没有放 objective 里面,所以它很难算。
看文献上的结果是,PPO 跟 TRPO 可能 performance 差不多,但是 PPO 在实际操作上,比 TRPO 容易的多。
Policy Gradient:
J
(
θ
′
)
(
θ
)
=
R
‾
(
θ
′
)
(
θ
)
=
E
(
s
t
,
a
t
)
∼
π
θ
′
[
P
θ
(
a
t
∣
s
t
)
P
θ
′
(
a
t
∣
s
t
)
A
(
θ
′
)
(
s
t
,
a
t
)
]
TRPO:
J
T
R
P
O
(
θ
′
)
(
θ
)
=
E
(
s
t
,
a
t
)
∼
π
θ
′
[
P
θ
(
a
t
∣
s
t
)
P
θ
′
(
a
t
∣
s
t
)
A
(
θ
′
)
(
s
t
,
a
t
)
]
K
L
(
π
θ
,
π
θ
′
)
<
δ
PPO:
J
P
P
O
(
θ
′
)
(
θ
)
=
J
(
θ
′
)
(
θ
)
−
β
K
L
(
θ
,
θ
′
)
=
E
(
s
t
,
a
t
)
∼
π
θ
′
[
P
θ
(
a
t
∣
s
t
)
P
θ
′
(
a
t
∣
s
t
)
A
(
θ
′
)
(
s
t
,
a
t
)
]
−
β
K
L
(
θ
,
θ
′
)
PPO 实际上在算这个 KL 的时候,也是有点麻烦的。因为这个 KL 理论上应该 sample 一大堆不同的 state,每一个state都输入到 参数为
θ
θ
θ 跟
θ
′
θ'
θ′ 的两个模型来计算KL散度。PPO 要计算 KL diversions,很复杂,PPO2 的式子里面就没有什么 KL 了。
PPO2:
J
P
P
O
2
θ
k
(
θ
)
≈
∑
(
s
t
,
a
t
)
m
i
n
[
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
)
]
PPO2 要去 maximize 的 objective function 如上所示。
在多数的 cases 里面,PPO 都是不错的,不是最好的,就是第二好的
参考资料:
深度增强学习PPO(Proximal Policy Optimization)算法源码走读
【RL系列】强化学习之On-Policy与Off-Policy
Sutton的Google硬盘
Proximal Policy Optimization Algorithms
Proximal Policy Optimization (PPO)
PPO论文笔记
强化学习的近端策略优化(PPO)中,近端(Proximal)是什么意思?
强化学习与ChatGPT:PPO 算法介绍和实际应用(中文介绍)
李宏毅深度强化学习笔记(一)Proximal Policy Optimization (PPO)
Proximal Policy Optimization(PPO)算法原理及实现!
Proximal Policy Optimization (PPO) 算法理解:从策略梯度开始
【强化学习】PPO的理论推导
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。