本篇博客参考自上海大学刘树林老师的课程。B站课程链接:https://www.bilibili.com/video/BV17t4geUEvQ/?spm_id_from=333.337.search-card.all.click&vd_source=74af336a587568c23a499122c8ffbbee
文章目录
- 传统策略梯度训练面临的问题
- 其他方法的改进
- TRPO算法的贡献
- PPO算法对TRPO的改进
- PPO算法流程
传统策略梯度训练面临的问题
其他方法的改进
TRPO算法的贡献
传统方法容易出现策略网络不稳定的问题,基于这个问题,TRPO算法把两次策略
π
\pi
π的差异设置到一个很小的邻域内。简单说就是“小步、稳走、达到最优策略”。
下图展示了该优化方法的基本思想。目标函数是
J
(
θ
)
J(\theta)
J(θ),该函数当前的参数是
θ
n
o
w
\theta_{now}
θnow,该函数很难处理,具体参数/曲线也未知。在
θ
n
o
w
\theta_{now}
θnow的邻域中,找一条更容易处理的、简单的曲线
L
(
θ
∣
θ
n
o
w
)
L(\theta|\theta_{now})
L(θ∣θnow)。函数
L
(
θ
∣
θ
n
o
w
)
L(\theta|\theta_{now})
L(θ∣θnow)和函数
J
(
θ
)
J(\theta)
J(θ)是不一样的,但是在邻域
θ
n
o
w
\theta_{now}
θnow内,函数
L
(
θ
∣
θ
n
o
w
)
L(\theta|\theta_{now})
L(θ∣θnow)是可以逼近函数
J
(
θ
)
J(\theta)
J(θ)的。这个阈就被称作置信阈。在这个置信阈中,求曲线
L
(
θ
∣
θ
n
o
w
)
L(\theta|\theta_{now})
L(θ∣θnow)的最大值,把这个最大值对应的新参数
θ
n
o
w
\theta_{now}
θnow作为下一个点继续求解。然后再求近似、求最大值…… TRPO借助了这个思想。
下式就是策略梯度定理,
A
π
(
S
,
A
)
A_{\pi}(S,A)
Aπ(S,A)是优势函数。关键要解决两个问题:(1)要使得训练前后的两个策略可控;(2)旧策略收集的数据能够被策略网络多次应用以提升策略训练效果。
解决问题(1):对训练前后的两个策略施加约束;
解决问题(2):使用离轨策略。
下图展示了TRPO是如何解决这两个问题的。
(1)把原先的同轨策略改造成离轨策略。把现有的策略
π
o
l
d
\pi_{old}
πold作为一个旧策略,让旧策略去取数据/和环境互动,把训练的策略
π
n
e
w
\pi_{new}
πnew作为一个新策略。所以现在即有两个策略网络。把旧策略取到的数据
A
π
o
l
d
(
S
,
A
)
A_{\pi_{old}}(S,A)
Aπold(S,A)来训练新策略,得到新策略的网络参数
θ
n
e
w
\theta_{new}
θnew。
(2)增加置信阈。利用KL散度进行约束。KL散度是衡量两个概率分布差异的非对称性指标。在信任域策略优化(TRPO)中,使用KL散度限制策略更新的幅度,确保新策略与旧策略的差异不超过阈值
δ
\delta
δ。
PPO算法对TRPO的改进
用KL散度的目的是使得新策略和旧策略比较接近,但这样做比较麻烦。干脆取一个很小的
ϵ
\epsilon
ϵ,把新旧策略的比值控制在
[
1
−
ϵ
,
1
+
ϵ
]
[1-\epsilon,1+\epsilon]
[1−ϵ,1+ϵ]之间。当比值超过上边界/下边界的时候,强行让比值等于对应的上下边界值。
PPO算法流程
第一模块:采集数据
第1步:将当前策略网络参数作为旧策略网络参数
θ
o
l
d
\theta_{old}
θold。
第2步:将初始状态
s
0
s_0
s0输入旧网络策略中,由于状态s和动作a均连续,策略网络采用随机高斯策略框架,策略网络的输出为动作a所服从正态分布的均值
μ
o
l
d
\mu_{old}
μold和标准差
σ
o
l
d
\sigma_{old}
σold,由此可以得到高斯分布策略函数
π
o
l
d
(
a
∣
s
,
θ
o
l
d
)
\pi_{old}(a|s,\theta_{old})
πold(a∣s,θold),然后抽样选择动作:
a
0
a_0
a0~
π
o
l
d
(
⋅
∣
s
0
,
θ
o
l
d
)
\pi_{old}(·|s_0,\theta_{old})
πold(⋅∣s0,θold),并与环境产生交互,环境给出相应的奖励
r
1
r_1
r1,同时状态更新为
s
1
s_1
s1,上述过程就产生了一个四元组
(
s
0
,
a
0
,
r
1
,
s
1
)
(s_0,a_0,r_1,s_1)
(s0,a0,r1,s1)。继续以上循环,可以得到多个四元组
(
s
0
,
a
0
,
r
1
,
s
1
)
(s_0,a_0,r_1,s_1)
(s0,a0,r1,s1),
(
s
1
,
a
1
,
r
2
,
s
2
)
(s_1,a_1,r_2,s_2)
(s1,a1,r2,s2),…,将其储存在经验记忆库中,供训练使用。
第二模块:计算状态价值函数和优势函数
第1步:从经验记忆库中按照时序依次取出四元组
(
s
0
,
a
0
,
r
1
,
s
1
)
(s_0,a_0,r_1,s_1)
(s0,a0,r1,s1),
(
s
1
,
a
1
,
r
2
,
s
2
)
(s_1,a_1,r_2,s_2)
(s1,a1,r2,s2),…,将其依次输入价值网络中,计算
q
0
=
V
(
s
0
;
w
)
和
q
1
=
V
(
s
1
;
w
)
,
.
.
.
q_0 = V(s_0;w) 和 q_1 = V(s_1;w),...
q0=V(s0;w)和q1=V(s1;w),...
第2步:计算TD目标
y
0
=
r
1
+
γ
q
1
y_0=r_1+\gamma q_1
y0=r1+γq1
第3步:计算TD误差
δ
0
=
q
0
−
y
0
\delta_0=q_0-y_0
δ0=q0−y0
第4步:计算优势函数
A
t
A_t
At。优势函数
A
t
A_t
At的引入是为了减小策略梯度中产生的方差,为了达到更好的效果,PPO-Clip算法采用了广义优势估计(GAE)
近似优势函数
A
t
A_t
At。
如下图所示,A2C方法用的是下图中的
A
t
(
1
)
A_t^{(1)}
At(1)进行计算的,这样计算的偏差比较大。
A
t
(
k
)
A_t^{(k)}
At(k)类似于蒙特卡洛方法,但它的问题则是方差比较大。为了弥补两个方法的不足,干脆将
A
t
(
1
)
A_t^{(1)}
At(1)到
A
t
(
k
)
A_t^{(k)}
At(k)都算出来,分别求单步时序差分、两步、三步,…,再做平滑,这样就能弥补方差和偏差大的问题。这就是一种广义优势函数。
下图是广义优势估计的定义。这种再次加权,相当于对偏差和方差做出了平衡,这个效果比单用一个优势函数的效果要好得多。
第三模块:更新评估网络
第1步:计算评估网络(价值网络)的损失函数。这里用均方误差MSE(Mean Squared Error,MSE)来定义评估网络的损失函数,公式表示为针对任意时间步
t
t
t 时刻的预测值
V
(
s
t
;
w
)
V(s_t; w)
V(st;w)与目标值
r
t
+
1
+
γ
V
(
s
t
+
1
;
w
)
r_{t+1}+ \gamma V(s_{t+1};w)
rt+1+γV(st+1;w) 之间的差异。
L
(
w
)
=
{
V
(
s
t
;
w
)
−
[
r
t
+
1
+
γ
V
(
S
t
+
1
;
w
)
]
}
2
L(w)= \{V(s_t; w)- [r_{t+1} + \gamma V(S_{t+1}; w)]\}^2
L(w)={V(st;w)−[rt+1+γV(St+1;w)]}2
第2步:针对任意时间步时刻,计算损失函数梯度。
∇
w
L
(
w
)
=
2
{
V
(
s
t
;
w
)
−
[
r
t
+
1
+
γ
V
(
s
t
+
1
;
w
)
]
}
∇
w
V
(
s
t
;
w
)
=
2
δ
t
∇
w
V
(
s
t
;
w
)
\nabla_wL(w)=2\{V(s_t;w)-[r_{t+1} + \gamma V(s_{t+1};w)]\} \nabla_w V(s_t; w) = 2 \delta_t \nabla_w V(s_t;w)
∇wL(w)=2{V(st;w)−[rt+1+γV(st+1;w)]}∇wV(st;w)=2δt∇wV(st;w)
第3步:针对任意时间步t时刻,更新评估网络。
w
←
w
−
2
α
δ
t
∇
w
(
s
t
;
w
)
w←w-2\alpha \delta_t \nabla_w(s_t;w)
w←w−2αδt∇w(st;w)
还可以采用小批量更新方法。
第四模块:更新策略网络
第1步:针对所有四元组
(
s
,
a
,
r
,
s
)
(s,a,r,s)
(s,a,r,s)中的
s
s
s、
a
a
a,分别由动作
a
a
a概率分布的均值
μ
o
l
d
\mu_{old}
μold和标准差
σ
o
l
d
\sigma_{old}
σold构造高斯分布旧策略函数(动作概率密度函数)
π
o
l
d
(
a
∣
s
,
θ
o
l
d
)
\pi_{old}(a|s,\theta_{old})
πold(a∣s,θold),并计算自然对数
l
o
g
π
o
l
d
(
a
∣
s
,
θ
o
l
d
)
log \pi_{old}(a|s,\theta_{old})
logπold(a∣s,θold)。
第2步:针对本模块第1步计算出的每个 l o g π o l d ( a ∣ s , θ o l d ) log\pi_{old}(a|s,\theta_{old}) logπold(a∣s,θold),依次单独训练当前网络。
(a)在每次训练中,将四元组 ( s t , a t , r t + 1 , s t + 1 ) (s_t,a_t,r_{t+1},s_{t+1}) (st,at,rt+1,st+1)中的 s t s_t st输入当前策略网络中由动作 a a a,概率分布的均值 μ n e w \mu_{new} μnew和标准差 σ o l d \sigma_{old} σold构造高斯分布新策略函数(动作概率密度函数) π n e w ( a t ∣ s t , θ n e w ) \pi_{new}(a_t|s_t, \theta_{new}) πnew(at∣st,θnew),并计算自然对数 l o g π n e w ( a t ∣ s t , θ n e w ) log\pi_{new}(a_t | s_t,\theta_{new}) logπnew(at∣st,θnew)。