我们的目标是创建一个可以最大化获得奖励的代理。 通常这个最大化奖励是各时间折扣奖励的总和。
G
=
∑
t
=
0
T
γ
t
r
t
G = \sum_{t=0}^T\gamma^tr_t
G=t=0∑T?γtrt? 这里
γ
\gamma
γ是折扣因子,通常在 [0.95, 0.99] 范围内,
r
t
r_t
rt? 是时间 t 的奖励。
策略梯度方法通过重复估计梯度
g
:
=
?
θ
E
[
∑
t
=
0
∞
r
t
]
g:=
abla_ heta\mathbb{E}[\sum_{t=0}^{\infin}r_t]
g:=?θ?E[∑t=0∞?rt?]来最大化预期总奖励。策略梯度有几种不同的相关表达式,其形式为:
g
=
E
[
∑
t
=
0
∞
Ψ
t
?
θ
l
o
g
π
θ
(
a
t
∣
s
t
)
]
(1)
g=\mathbb{E}\Bigg\lbrack \sum_{t=0}^{\infin} \Psi_t
abla_ heta log\pi_ heta(a_t \mid s_t) \Bigg\rbrack ag{1}
g=E[t=0∑∞?Ψt??θ?logπθ?(at?∣st?)](1)
其中
Ψ
t
\Psi_t
Ψt? 可以是如下几个:
∑
t
=
0
∞
r
t
\sum_{t=0}^\infin r_t
∑t=0∞?rt?: 轨迹的总奖励
∑
t
′
=
t
∞
r
t
′
\sum_{t'=t}^\infin r_{t'}
∑t′=t∞?rt′?: 下一个动作
a
t
a_t
at? 的奖励
∑
t
=
0
∞
r
t
?
b
(
s
t
)
\sum_{t=0}^\infin r_t - b(s_t)
∑t=0∞?rt??b(st?): 上面公式的基线版本
Q
π
(
s
t
,
a
t
)
Q^\pi(s_t, a_t)
Qπ(st?,at?): 状态-动作价值函数
A
π
(
s
t
,
a
t
)
A^\pi(s_t, a_t)
Aπ(st?,at?): 优势函数
r
t
+
V
π
(
s
t
+
1
)
+
V
π
(
s
t
)
r_t+V^\pi(s_{t+1})+V^\pi(s_{t})
rt?+Vπ(st+1?)+Vπ(st?): TD残差
后面3个公式的具体定义如下:
V
π
(
s
t
)
:
=
E
s
t
+
1
:
∞
,
a
t
:
∞
[
∑
l
=
0
∞
r
t
+
l
]
Q
π
(
s
t
,
a
t
)
:
=
E
s
t
+
1
:
∞
,
a
t
+
1
:
∞
[
∑
l
=
0
∞
r
t
+
l
]
(2)
V^\pi(s_t) := \mathbb{E}_{s_{t+1:\infin}, a_{t:\infin}}\Bigg\lbrack\sum_{l=0}^\infin r_{t+l} \Bigg\rbrack \\ Q^\pi(s_t, a_t) := \mathbb{E}_{s_{t+1:\infin}, a_{t+1:\infin}}\Bigg\lbrack\sum_{l=0}^\infin r_{t+l} \Bigg\rbrack ag{2}
Vπ(st?):=Est+1:∞?,at:∞??[l=0∑∞?rt+l?]Qπ(st?,at?):=Est+1:∞?,at+1:∞??[l=0∑∞?rt+l?](2)
A
π
(
s
t
,
a
t
)
:
=
Q
π
(
s
t
,
a
t
)
?
V
π
(
s
t
)
(3)
A^\pi(s_t, a_t) := Q^\pi(s_t, a_t) - V^\pi(s_t) ag{3}
Aπ(st?,at?):=Qπ(st?,at?)?Vπ(st?)(3)
它由一个参与者(actor)
π
θ
(
.
∣
s
t
)
\pi heta(. \mid st)
πθ(.∣st) 和一个评估者(critic)
V
(
s
t
)
V(st)
V(st)组成。前者在时间
t
t
t 处输出下一个动作的概率分布,后者估计该状态的预期累积奖励(标量)。 由于 actor 和 critic 都将状态作为输入,因此可以在提取高级特征的两个网络之间共享骨干架构。
总损失函数由三项组成:CLIP项、价值函数 (VF) 项和熵奖励项。最终目标如下:
L
t
C
L
I
P
+
V
F
+
S
(
θ
)
=
E
^
t
[
L
t
C
L
I
P
(
θ
)
?
c
1
L
t
V
F
(
θ
)
+
c
2
S
[
π
θ
]
(
s
t
)
]
L_t^{CLIP+VF+S}( heta) = \hat{\mathbb{E}}_t \Big\lbrack L_t^{CLIP}( heta) - c_1L_t^{VF}( heta)+c_2S[\pi_ heta](s_t)\Big\rbrack
LtCLIP+VF+S?(θ)=E^t?[LtCLIP?(θ)?c1?LtVF?(θ)+c2?S[πθ?](st?)] 其中
c
1
c_1
c1? 和
c
2
c_2
c2? 是超参,分别衡量策略评估(critic)和探索(exploration)准确性的重要性。
CLIP项
正如我们所说,损失函数激发行为概率最大化(或最小化),从而导致行为正面优势(或负面优势)
L
C
L
I
P
(
θ
)
=
E
^
t
[
m
i
n
(
r
t
(
θ
)
A
t
^
,
c
l
i
p
(
r
t
(
θ
)
,
1
?
?
,
1
+
?
)
A
^
t
)
]
L^{CLIP}( heta) = \hat{\mathbb{E}}_t\Big\lbrack min \Big\lparen r_t( heta)\hat{A_t},clip \big\lparen r_t( heta),1-\epsilon, 1+\epsilon\big\rparen \hat{A}_t \Big\rparen \Big\rbrack
LCLIP(θ)=E^t?[min(rt?(θ)At?^?,clip(rt?(θ),1??,1+?)A^t?)] 其中:
r
t
(
θ
)
=
π
θ
(
a
t
∣
s
t
)
π
θ
o
l
d
(
a
t
∣
s
t
)
r_t( heta) = \frac{\pi_ heta(a_t \mid s_t)}{\pi_{ heta_{old}}(a_t \mid s_t)}
rt?(θ)=πθold??(at?∣st?)πθ?(at?∣st?)? 是衡量我们现在(更新后的策略)相对于之前执行该先前操作的可能性的比率。 原则上,我们不希望这个系数太大,因为太大意味着策略突然改变。这就是为什么我们采用其最小值和
[
1
?
?
,
1
+
?
]
[1-\epsilon, 1+\epsilon]
[1??,1+?] 之间的裁剪版本,其中
?
\epsilon
? 是个超参。
优势(advantage)的计算公式如下:
A
^
t
=
?
V
(
s
t
)
+
r
t
+
γ
r
t
+
1
+
γ
2
r
t
+
2
+
?
+
γ
(
T
?
t
+
1
)
r
T
?
1
+
γ
T
?
t
V
(
s
T
)
\hat{A}_t = -V(s_t)+r_t+\gamma r_{t+1}+\gamma^2 r_{t+2}+\dots+\gamma^{(T-t+1)} r_{T-1} + \gamma^{T-t}V(s_T)
A^t?=?V(st?)+rt?+γrt+1?+γ2rt+2?+?+γ(T?t+1)rT?1?+γT?tV(sT?) 其中:
A
t
^
\hat{A_t}
At?^? 是估计的优势,
?
V
(
s
t
)
-V(s_t)
?V(st?) 是估计的初始状态值,
γ
T
?
t
V
(
s
T
)
\gamma^{T-t}V(s_T)
γT?tV(sT?) 是估计的终末状态值,中间部分是过程中观测到的累计奖励。
我们看到它只是衡量评估者对给定状态
s
t
s_t
st? 的错误程度。 如果我们获得更高的累积奖励,则优势估计将为正,我们将更有可能在这种状态下采取行动。 反之亦然,如果我们期望更高的奖励但我们得到的奖励更小,则优势估计将为负,我们将降低在此步骤中采取行动的可能性。
请注意,如果我们一直走到终末状态
s
T
s_T
sT?,我们就不再需要依赖评估者了,我们可以简单地将评估者与实际累积奖励进行比较。 在这种情况下,优势的估计就是真正的优势。
价值函数项
为了对优势有一个良好的估计,我们需要一个可以预测给定状态值的评估者。 该模型为具有简单 MSE 损失的监督学习:
L
t
V
F
=
M
S
E
(
r
t
+
γ
r
t
+
1
+
?
+
γ
(
T
?
t
+
1
)
r
T
?
1
+
V
(
s
T
)
,
V
(
s
t
)
)
=
∣
∣
A
^
t
∣
∣
2
L_t^{VF} = MSE(r_t+\gamma r_{t+1}+\dots+\gamma^{(T-t+1)} r_{T-1}+V(s_T),V(s_t)) = ||\hat{A}_t||_2
LtVF?=MSE(rt?+γrt+1?+?+γ(T?t+1)rT?1?+V(sT?),V(st?))=∣∣A^t?∣∣2? 每次迭代中,我们也会更新评估者,以便随着训练的进行,它会为我们提供越来越准确的状态值。
熵奖励项
最后,我们鼓励对策略输出分布的熵进行少量奖励的探索。 标准熵为:
S
[
π
θ
]
(
s
t
)
=
?
∫
π
θ
(
a
t
∣
s
t
)
l
o
g
(
π
θ
(
a
t
∣
s
t
)
)
d
a
t
S[\pi_ heta](s_t) = -\int \pi_ heta(a_t \mid s_t) log(\pi_ heta(a_t \mid s_t))da_t
S[πθ?](st?)=?∫πθ?(at?∣st?)log(πθ?(at?∣st?))dat?
如果上面的讲解不够清晰,不用担心,下面将带大家从零开始一步一步实现近端策略优化算法。
工具代码
首先先导入所需的库
PPO 的重要超参有 actor 数量、horizon、epsilon、每个优化阶段的 epoch 数量、学习率、折扣因子gamma以及权衡不同损失项的常数 c1 和 c2。 这些超参我们通过参数传入进来。