整理的代码库:https://github.com/Gaoshu-root/Code-related-courses/tree/main/RL2024/PPO
OpenAI 文档 —— PPO-Clip
OpenAI 文档 界面链接
PPO: on-policy 算法、适用于 离散 或 连续动作空间。可能局部最优
PPO 的动机与 TRPO 一样:如何利用现有的数据在策略上采取最大可能的改进 step,而不会改动过大而意外导致性能崩溃?
- TRPO 试图用一种复杂的二阶方法来解决这个问题,PPO 则是一种一阶方法,它使用了一些其他技巧来保持 新策略接近旧策略。
- PPO 方法的实现要简单得多,而且从经验上看,其执行效果至少与 TRPO 一样好。
PPO 有两种主要的变体:PPO-Penalty 和 PPO-Clip。
- PPO-Penalty 近似地解决了像 TRPO 这样的 KL 约束更新,但在目标函数中惩罚了 KL-divergence,而不是使其成为硬约束,并在训练过程中自动调整惩罚系数,使其适当缩放。
- PPO-Clip 在目标函数中没有 KL-divergence 项,也没有约束。而是依靠对目标函数的特定裁剪来去除 新策略远离旧策略 的激励。
PPO-Clip (OpenAl 使用的主要变体)。
关键公式
PPO-clip 更新策略: θ k + 1 = arg max θ E s , a ∼ π θ k [ L ( s , a , θ k , θ ) ] \theta_{k+1}=\arg\max\limits_{\theta}\underset{s,a\sim {\pi_{\theta_k}}}{\mathbb E}[L(s,a,\theta_k,\theta)] θk+1=argθmaxs,a∼πθkE[L(s,a,θk,θ)]
通常采取多步(通常是小批量) SGD 来最大化目标。
L ( s , a , θ k , θ ) = min ( π θ ( a ∣ s ) π θ k ( a ∣ s ) A π θ k ( s , a ) , clip ( π θ ( a ∣ s ) π θ k ( a ∣ s ) , 1 − ϵ , 1 + ϵ ) A π θ k ( s , a ) ) L(s,a,\theta_k,\theta)=\min\bigg(\frac{\pi_\theta(a|s)}{\pi_{\theta_k}(a|s)}A^{\pi_{\theta_k}}(s,a),\text{clip}\Big(\frac{\pi_\theta(a|s)}{\pi_{\theta_k}(a|s)},1-\epsilon,1+\epsilon\Big)A^{\pi_{\theta_k}}(s,a)\bigg) L(s,a,θk,θ)=min(πθk(a∣s)πθ(a∣s)Aπθk(s,a),clip(πθk(a∣s)πθ(a∣s),1−ϵ,1+ϵ)Aπθk(s,a))
- 其中 ϵ \epsilon ϵ 是一个(小)超参数,它大致表示新策略 与 旧策略之间的距离。
这是一个相当复杂的表达式,乍一看很难看出它在做什么,或者它如何帮助保持新策略接近旧策略。事实证明,这个目标有一个相当简化的版本[1],更容易处理(也是我们在代码中实现的版本):
L ( s , a , θ k , θ ) = min ( π θ ( a ∣ s ) π θ k ( a ∣ s ) A π θ k ( s , a ) , g ( ϵ , A π θ k ( s , a ) ) ) L(s,a,\theta_k,\theta)=\min\bigg(\frac{\pi_\theta(a|s)}{\pi_{\theta_k}(a|s)}A^{\pi_{\theta_k}}(s, a), g\Big(\epsilon, A^{\pi_{\theta_k}}(s,a)\Big)\bigg) L(s,a,θk,θ)=min(πθk(a∣s)πθ(a∣s)Aπθk(s,a),g(ϵ,Aπθk(s,a)))
- 其中 g ( ϵ , A ) = { ( 1 + ϵ ) A A ≥ 0 ( 1 − ϵ ) A A < 0 g(\epsilon,A)=\left\{\begin{aligned}(1+\epsilon)A&~~~~~~~A\geq0\\ (1-\epsilon)A&~~~~~~~A<0\end{aligned}\right. g(ϵ,A)={(1+ϵ)A(1−ϵ)A A≥0 A<0
————————————————
简化版本的 PPO-Clip 目标 推导
整理自 链接 (20180730)
命题 1: PPO-Clip 目标可简化成
L θ k C L I P ( θ ) = E s , a ∼ θ k [ min ( π θ ( a ∣ s ) π θ k ( a ∣ s ) A θ k ( s , a ) , g ( ϵ , A θ k ( s , a ) ) ) ] L^{\rm CLIP}_{\theta_k}(\theta)=\underset{s, a\sim\theta_k}{\mathbb E}\bigg[\min\bigg(\frac{\pi_\theta(a|s)}{\pi_{\theta_k}(a|s)}A^{\theta_k}(s, a), g\Big(\epsilon, A^{\theta_k}(s,a)\Big)\bigg)\bigg] LθkCLIP(θ)=s,a∼θkE[min(πθk(a∣s)πθ(a∣s)Aθk(s,a),g(ϵ,Aθk(s,a)))]
- 其中 g ( ϵ , A ) = { ( 1 + ϵ ) A A ≥ 0 ( 1 − ϵ ) A otherwise g(\epsilon,A)=\left\{\begin{aligned}(1+\epsilon)A&~~~~~~~A\geq0\\ (1-\epsilon)A&~~~~~~~\text{otherwise}\end{aligned}\right. g(ϵ,A)={(1+ϵ)A(1−ϵ)A A≥0 otherwise
简化过程:
PPO-Clip 的目标函数为:
~
L θ k C L I P ( θ ) ≐ E s , a ∼ θ k [ min ( π θ ( a ∣ s ) π θ k ( a ∣ s ) A θ k ( s , a ) , c l i p ( π θ ( a ∣ s ) π θ k ( a ∣ s ) , 1 − ϵ , 1 + ϵ ) A θ k ( s , a ) ) ] L^{\rm CLIP}_{\theta_k}(\theta)\doteq\underset{s, a\sim\theta_k}{\mathbb E}\bigg[\min\bigg(\frac{\pi_\theta(a|s)}{\pi_{\theta_k}(a|s)}A^{\theta_k}(s, a), {\rm clip}\Big(\frac{\pi_\theta(a|s)}{\pi_{\theta_k}(a|s)},1-\epsilon, 1+\epsilon\Big)A^{\theta_k}(s, a)\bigg)\bigg] LθkCLIP(θ)≐s,a∼θkE[min(πθk(a∣s)πθ(a∣s)Aθk(s,a),clip(πθk(a∣s)πθ(a∣s),1−ϵ,1+ϵ)Aθk(s,a))]
~
$\underset{s, a\sim\theta_k}{\mathbb E}$
E s , a ∼ θ k ~~~\underset{s, a\sim\theta_k}{\mathbb E} s,a∼θkE
- 其中 θ k \theta_k θk 为第 k k k 次迭代 的策略的参数 , ϵ \epsilon ϵ 为 小的超参数。
~
设 ϵ ∈ ( 0 , 1 ) \epsilon\in(0,1) ϵ∈(0,1), 定义
F ( r , A , ϵ ) ≐ min ( r A , c l i p ( r , 1 − ϵ , 1 + ϵ ) A ) F(r,A,\epsilon)\doteq\min\bigg(rA,{\rm clip}(r,1-\epsilon,1+\epsilon)A\bigg) F(r,A,ϵ)≐min(rA,clip(r,1−ϵ,1+ϵ)A)
当 A ≥ 0 A\geq0 A≥0
F ( r , A , ϵ ) = min ( r A , c l i p ( r , 1 − ϵ , 1 + ϵ ) A ) = A min ( r , c l i p ( r , 1 − ϵ , 1 + ϵ ) ) = A min ( r , { 1 + ϵ r ≥ 1 + ϵ r r ∈ ( 1 − ϵ , 1 + ϵ ) 1 − ϵ r ≤ 1 − ϵ } ) = A { min ( r , 1 + ϵ ) r ≥ 1 + ϵ min ( r , r ) r ∈ ( 1 − ϵ , 1 + ϵ ) min ( r , 1 − ϵ ) r ≤ 1 − ϵ } = A { 1 + ϵ r ≥ 1 + ϵ r r ∈ ( 1 − ϵ , 1 + ϵ ) r r ≤ 1 − ϵ } 根据右侧的范围 = A min ( r , 1 + ϵ ) = min ( r A , ( 1 + ϵ ) A ) \begin{aligned}F(r,A,\epsilon)&=\min\bigg(rA,{\rm clip}(r,1-\epsilon,1+\epsilon)A\bigg)\\ &=A\min\bigg(r,{\rm clip}(r,1-\epsilon,1+\epsilon)\bigg)\\ &=A\min\bigg(r,\left\{\begin{aligned}&1+\epsilon~~&r\geq1+\epsilon\\ &r &r\in(1-\epsilon,1+\epsilon)\\ &1-\epsilon &r\leq1-\epsilon\\ \end{aligned}\right\}\bigg)\\ &=A\left\{\begin{aligned}&\min(r,1+\epsilon)~~&r\geq1+\epsilon\\ &\min(r,r) &r\in(1-\epsilon,1+\epsilon)\\ &\min(r,1-\epsilon) &r\leq1-\epsilon\\ \end{aligned}\right\}\\ &=A\left\{\begin{aligned}&1+\epsilon~~&r\geq1+\epsilon\\ &r &r\in(1-\epsilon,1+\epsilon)\\ &r &r\leq1-\epsilon\\ \end{aligned}\right\}~~~~~\textcolor{blue}{根据右侧的范围}\\ &=A\min(r, 1+\epsilon)\\ &=\min\bigg(rA, (1+\epsilon)A\bigg) \end{aligned} F(r,A,ϵ)=min(rA,clip(r,1−ϵ,1+ϵ)A)=Amin(r,clip(r,1−ϵ,1+ϵ))=Amin(r,⎩ ⎨ ⎧1+ϵ r1−ϵr≥1+ϵr∈(1−ϵ,1+ϵ)r≤1−ϵ⎭ ⎬ ⎫)=A⎩ ⎨ ⎧min(r,1+ϵ) min(r,r)min(r,1−ϵ)r≥1+ϵr∈(1−ϵ,1+ϵ)r≤1−ϵ⎭ ⎬ ⎫=A⎩ ⎨ ⎧1+ϵ rrr≥1+ϵr∈(1−ϵ,1+ϵ)r≤1−ϵ⎭ ⎬ ⎫ 根据右侧的范围=Amin(r,1+ϵ)=min(rA,(1+ϵ)A)
~
当 A < 0 A<0 A<0
F ( r , A , ϵ ) = min ( r A , c l i p ( r , 1 − ϵ , 1 + ϵ ) A ) = A max ( r , c l i p ( r , 1 − ϵ , 1 + ϵ ) ) = A max ( r , { 1 + ϵ r ≥ 1 + ϵ r r ∈ ( 1 − ϵ , 1 + ϵ ) 1 − ϵ r ≤ 1 − ϵ } ) = A { max ( r , 1 + ϵ ) r ≥ 1 + ϵ max ( r , r ) r ∈ ( 1 − ϵ , 1 + ϵ ) max ( r , 1 − ϵ ) r ≤ 1 − ϵ } = A { r r ≥ 1 + ϵ r r ∈ ( 1 − ϵ , 1 + ϵ ) 1 − ϵ r ≤ 1 − ϵ } 根据右侧的范围 = A max ( r , 1 − ϵ ) = min ( r A , ( 1 − ϵ ) A ) \begin{aligned}F(r,A,\epsilon)&=\min\bigg(rA,{\rm clip}(r,1-\epsilon,1+\epsilon)A\bigg)\\ &=A\textcolor{blue}{\max}\bigg(r,{\rm clip}(r,1-\epsilon,1+\epsilon)\bigg)\\ &=A\max\bigg(r,\left\{\begin{aligned}&1+\epsilon~~&r\geq1+\epsilon\\ &r &r\in(1-\epsilon,1+\epsilon)\\ &1-\epsilon &r\leq1-\epsilon\\ \end{aligned}\right\}\bigg)\\ &=A\left\{\begin{aligned}&\max(r,1+\epsilon)~~&r\geq1+\epsilon\\ &\max(r,r) &r\in(1-\epsilon,1+\epsilon)\\ &\max(r,1-\epsilon) &r\leq1-\epsilon\\ \end{aligned}\right\}\\ &=A\left\{\begin{aligned}&r~~&r\geq1+\epsilon\\ &r &r\in(1-\epsilon,1+\epsilon)\\ &1-\epsilon &r\leq1-\epsilon\\ \end{aligned}\right\}~~~~~\textcolor{blue}{根据右侧的范围}\\ &=A\max(r, 1-\epsilon)\\ &=\textcolor{blue}{\min}\bigg(rA,(1-\epsilon)A\bigg) \end{aligned} F(r,A,ϵ)=min(rA,clip(r,1−ϵ,1+ϵ)A)=Amax(r,clip(r,1−ϵ,1+ϵ))=Amax(r,⎩ ⎨ ⎧1+ϵ r1−ϵr≥1+ϵr∈(1−ϵ,1+ϵ)r≤1−ϵ⎭ ⎬ ⎫)=A⎩ ⎨ ⎧max(r,1+ϵ) max(r,r)max(r,1−ϵ)r≥1+ϵr∈(1−ϵ,1+ϵ)r≤1−ϵ⎭ ⎬ ⎫=A⎩ ⎨ ⎧r r1−ϵr≥1+ϵr∈(1−ϵ,1+ϵ)r≤1−ϵ⎭ ⎬ ⎫ 根据右侧的范围=Amax(r,1−ϵ)=min(rA,(1−ϵ)A)
~
综上:可定义 g ( ϵ , A ) g(\epsilon,A) g(ϵ,A)
~
g ( ϵ , A ) = { ( 1 + ϵ ) A A ≥ 0 ( 1 − ϵ ) A A < 0 g(\epsilon,A)=\left\{\begin{aligned}&(1+\epsilon)A ~~~~&A\geq0\\ &(1-\epsilon)A&A<0\end{aligned}\right. g(ϵ,A)={(1+ϵ)A (1−ϵ)AA≥0A<0
动机: 如果给定的 状态-动作 对 具有负的优势 A A A,优化想要让 π θ ( a ∣ s ) \pi_\theta(a|s) πθ(a∣s) 更小,但让 π θ ( a ∣ s ) \pi_\theta(a|s) πθ(a∣s) 比 ( 1 − ϵ ) π θ ( a ∣ s ) (1-\epsilon)\pi_\theta(a|s) (1−ϵ)πθ(a∣s) 小对目标函数并没有额外的益处。
如果给定的 状态-动作 对 具有正的优势 A A A,优化想要让 π θ ( a ∣ s ) \pi_\theta(a|s) πθ(a∣s) 更大,但让 π θ ( a ∣ s ) \pi_\theta(a|s) πθ(a∣s) 比 ( 1 + ϵ ) π θ ( a ∣ s ) (1+\epsilon)\pi_\theta(a|s) (1+ϵ)πθ(a∣s) 大对目标函数并没有额外的益处。
————————————————
1、当 advantage优势 为正
L ( s , a , θ k , θ ) = min ( π θ ( a ∣ s ) ↑ π θ k ( a ∣ s ) , 1 + ϵ ) A π θ k ( s , a ) L(s,a,\theta_k, \theta)=\min\bigg(\frac{\pi_\theta(a|s)~\textcolor{blue}{↑}}{\pi_{\theta_k}(a|s)}, 1+\epsilon\bigg)A^{\pi_{\theta_k}}(s, a) L(s,a,θk,θ)=min(πθk(a∣s)πθ(a∣s) ↑,1+ϵ)Aπθk(s,a)
当 状态-动作对 的优势是正的,希望拟习得的策略增大动作
a
a
a 被执行的概率,即增大
π
θ
(
a
∣
s
)
\pi_\theta(a|s)
πθ(a∣s) ,这将会使得目标增大。
但该项中的 min 限制了 目标函数只能增大到某个值
一旦
π
θ
(
a
∣
s
)
>
(
1
+
ϵ
)
π
θ
k
(
a
∣
s
)
\pi_\theta(a|s)>(1+\epsilon)\pi_{\theta_k}(a|s)
πθ(a∣s)>(1+ϵ)πθk(a∣s), min 触发,限制该项值为
(
1
+
ϵ
)
π
θ
k
(
a
∣
s
)
(1+\epsilon)\pi_{\theta_k}(a|s)
(1+ϵ)πθk(a∣s)。
the new policy does not benefit by going far away from the old policy.
新策略 不会因远离 旧策略而受益。
——> 策略将会习得 不要与原策略相差过大。
2、当 advantage优势为负
L ( s , a , θ k , θ ) = max ( π θ ( a ∣ s ) ↓ π θ k ( a ∣ s ) , 1 − ϵ ) A π θ k ( s , a ) L(s,a,\theta_k, \theta)=\max\bigg(\frac{\pi_\theta(a|s) ~\textcolor{blue}{↓}}{\pi_{\theta_k}(a|s)}, 1-\epsilon\bigg)A^{\pi_{\theta_k}}(s, a) L(s,a,θk,θ)=max(πθk(a∣s)πθ(a∣s) ↓,1−ϵ)Aπθk(s,a)
当 某个状态-动作对 的优势是负的,希望拟习得的策略减小该动作
a
a
a 被执行的概率 ,即 减小
π
θ
(
a
∣
s
)
π_\theta(a|s)
πθ(a∣s) ,此时目标函数就会增大。但是该项中的 max 限制了目标函数可以增大到多少。
一旦
π
θ
(
a
∣
s
)
<
(
1
−
ϵ
)
π
θ
k
(
a
∣
s
)
\pi_\theta(a|s)<(1-\epsilon)\pi_{\theta_k}(a|s)
πθ(a∣s)<(1−ϵ)πθk(a∣s), max 触发,限制该项值为
(
1
−
ϵ
)
π
θ
k
(
a
∣
s
)
(1-\epsilon)\pi_{\theta_k}(a|s)
(1−ϵ)πθk(a∣s)。
再次说明:the new policy does not benefit by going far away from the old policy.
新策略 不会因远离 旧策略而受益。
注意: 这种 clipping 最终仍有可能得到一个与旧策略相去甚远的新策略,在这里的实现中,我们使用了一个特别简单的方法:提前停止。如果新策略与旧策略的平均 KL -散度超过一个阈值,我们就停止执行梯度步骤。
探索 vs. 利用
PPO 以一种 on-policy 的方式训练随机策略。
这意味着它根据随机策略的最新版本通过抽样动作进行探索。
动作选择的随机性取决于初始条件和训练过程。
在训练过程中,策略通常会逐渐变得不那么随机,因为更新规则会鼓励它利用已经找到的奖励。这可能导致策略陷入局部最优状态。
PPO-Clip 算法伪码
算法: PPO-Clip
1:输入:策略的初始参数 θ 0 \theta_0 θ0,价值函数的初始参数 ϕ 0 \phi_0 ϕ0
2: f o r k = 0 , 1 , 2 , … d o {\bf for} ~ k=0,1,2,\dots~ {\bf do} for k=0,1,2,… do:每个epoch
轮次 ~~~~ 未过拟合的前提下,轮次越多越好
3: ~~~~~~ 通过在环境中运行策略 π k = π ( θ k ) \pi_k=\pi(\theta_k) πk=π(θk) 收集轨迹集 D k = { τ i } {\cal D}_k=\{\tau_i\}~~~~~ Dk={τi} ∣ D k ∣ |{\cal D}_k| ∣Dk∣ 个并行 actors,每个 actor 收集 长度为 T T T 个时间步 的数据
4: ~~~~~~ 计算奖励 (rewards-to-go) R ^ t \hat R_t~~~~~ R^t 有些实现用的 td_target R ^ t = ∑ t ′ = t T R ( s t ′ , a t ′ , s t ′ + 1 ) ~~~~~~~~\hat R_t=\sum\limits_{t^\prime=t}^TR(s_{t^\prime},a_{t^\prime},s_{t^\prime +1}) R^t=t′=t∑TR(st′,at′,st′+1) 【参考链接】 ~~~~~ R ( τ ) = ∑ t = 0 ∞ γ t r t R(\tau)=\sum\limits_{t=0}^\infty \gamma^tr_t R(τ)=t=0∑∞γtrt 【参考链接】
5: ~~~~~~ 计算优势估计,基于当前价值函数 V ϕ k V_{\phi_k} Vϕk 的 A ^ t \hat A_t A^t (使用任何优势估计方法) ~~~~~ GAE6: ~~~~~~ 通过最大化 PPO-Clip 目标 更新策略:
~~~~~~~~~~~
θ k + 1 = arg max θ 1 ∣ D k ∣ T ∑ τ ∈ D k ∑ t = 0 T min ( π θ ( a t ∣ s t ) π θ k ( a t ∣ s t ) A π θ k ( s t , a t ) , g ( ϵ , A π θ k ( s t , a t ) ) ) ~~~~~~~~~~~\theta_{k+1}=\arg\max\limits_\theta\frac{1}{|{\cal D}_k|T}\sum\limits_{\tau\in{\cal D}_k}\sum\limits_{t=0}^T\min\Big(\frac{\pi_{\theta} (a_t|s_t)}{\pi_{\theta_k}(a_t|s_t)}A^{\pi_{\theta_k}}(s_t,a_t),g(\epsilon,A^{\pi_{\theta_k}}(s_t,a_t))\Big) θk+1=argθmax∣Dk∣T1τ∈Dk∑t=0∑Tmin(πθk(at∣st)πθ(at∣st)Aπθk(st,at),g(ϵ,Aπθk(st,at)))
~~~~~~~~~~~
~~~~~~~~~~~
~~~~~~~~~~~ 一般 随机梯度上升 + Adam
7: ~~~~~~ 均方误差回归 拟合 价值函数:
~~~~~~~~~~~
ϕ k + 1 = arg min ϕ 1 ∣ D k ∣ T ∑ τ ∈ D k ∑ t = 0 T ( V ϕ ( s t ) − R ^ t ) 2 ~~~~~~~~~~~\phi_{k+1}=\arg \min\limits_\phi\frac{1}{|{\cal D}_k|T}\sum\limits_{\tau\in{\cal D}_k}\sum\limits_{t=0}^T\Big(V_\phi(s_t)-\hat R_t\Big)^2 ϕk+1=argϕmin∣Dk∣T1τ∈Dk∑t=0∑T(Vϕ(st)−R^t)2
~~~~~~~~~~~
~~~~~~~~~~~ 一般 梯度下降
8: e n d f o r \bf end ~for end for
$\dots$
…
~~~\dots
…
spinup 关于 R ^ t \hat R_t R^t 的计算
# the next two lines implement GAE-Lambda advantage calculation
deltas = rews[:-1] + self.gamma * vals[1:] - vals[:-1]
self.adv_buf[path_slice] = core.discount_cumsum(deltas, self.gamma * self.lam)
# the next line computes rewards-to-go, to be targets for the value function
self.ret_buf[path_slice] = core.discount_cumsum(rews, self.gamma)[:-1]
def discount_cumsum(x, discount):
"""
magic from rllab for computing discounted cumulative sums of vectors.
input:
vector x,
[x0,
x1,
x2]
output:
[x0 + discount * x1 + discount^2 * x2,
x1 + discount * x2,
x2]
"""
return scipy.signal.lfilter([1], [1, float(-discount)], x[::-1], axis=0)[::-1]
- spinup/algos/pytorch/ppo
- rllib/algorithms/ppo/torch
第 12 章 PPO 算法 【上交】
整理自 链接
TRPO : 计算过程复杂,每一步更新的运算量非常大。
paperswithcode 页面相关整理
paperswithcode 页面 链接