策略梯度(Policy Gradient)
我们之前学习Q-learning算法以及DQN算法都是通过拟合价值函数进行学习的,虽然他在很多领域都有了不错的表现,但是它也存在着很多缺点。例如:
(1)基于价值的强化学习对连续动作以及高维度的离散动作处理能力不足。因为通过价值更新策略时,是需要对每个动作下的价值函数的大小进行比较计算的,维度一旦上来就会浪费大量的计算机资源。
(2)在基于价值的强化学习中可能会将实际状态并不相同的两个状态描述为同一状态,进而导致value Based方法无法得到最优解。(比如下面这个环境中,两个灰色位置状态明显不同,但他们在值函数中的特征是一样的)
(3)基于价值的强化学习在策略选择上没有那么强的随机性,虽然说有那么多种动作选择策略,但随机性并不强。
而Policy Gradient简单来说就是省去了基于价值强化学习的计算每个动作价值的部分,直接根据当前的状态输出动作或者动作的概率,这样Agent就可以在一个连续空间内选取动作。
Policy Gradient算法就是对策略函数进行近似表示:
π
θ
(
s
,
a
)
=
P
(
a
∣
s
,
θ
)
≈
π
(
a
∣
s
)
\begin{align} π_\theta(s,a)=P(a|s,\theta)\approxπ(a|s) \end{align}
πθ(s,a)=P(a∣s,θ)≈π(a∣s)
由于我们取消了根据Q值来选择动作的这个机制,所以我们现在的机制变为了**如果一个动作得到的reward多,那么我们使其出现的概率增加,如果一个动作得到的reward少,我们使其出现的概率减小。**根据这个思想我们可以构造出损失函数:
l
o
s
s
=
−
E
[
l
o
g
[
π
(
a
,
s
)
]
⋅
Q
(
s
,
a
)
]
\begin{align} loss=-E[log[π(a,s)]\cdot Q(s,a)] \end{align}
loss=−E[log[π(a,s)]⋅Q(s,a)]
其中由于策略π不好求,可以替换为:
l
o
s
s
=
−
E
[
l
o
g
[
p
θ
(
τ
)
)
]
⋅
R
(
τ
)
]
\begin{align} loss=-E[log[p_\theta(\tau))]\cdot R(\tau)] \end{align}
loss=−E[log[pθ(τ))]⋅R(τ)]
其中
τ
\tau
τ为轨迹,定义是
τ
=
\tau=
τ={
s
1
,
a
1
,
s
2
,
a
2
,
⋅
⋅
⋅
⋅
⋅
⋅
,
s
t
,
a
t
s_1,a_1,s_2,a_2,······,s_t,a_t
s1,a1,s2,a2,⋅⋅⋅⋅⋅⋅,st,at},
p
θ
(
τ
)
p_\theta(\tau)
pθ(τ)是轨迹
τ
\tau
τ出现的概率,这里的
θ
\theta
θ代表的是神经网络参数,因为在给定状态s下要选择什么动作需要神经网络来完成,
R
(
τ
)
R(\tau)
R(τ)是轨迹
τ
\tau
τ的总将奖励值。
之所以取对数操作是因为,取对数后不会影响函数的单调性,同时可以避免指数操作,乘法也可变为加法,降低了计算的复杂度,还避免了多个小于一的数相乘导致下溢出的情况。