Soft Actor-Critic
目前来说,关于连续动作的强化学习算法,经常使用到的就是PPO、DDPG和SAC以及在此基础上的改进算法,这里主要说一下SAC算法。
介绍
首先SAC算法是基于Off-Policy的,因此会用到Replay Buffer,使用过去的样本经验进行学习,这会使得算法的稳定性和收敛性有一定的困难,特别是在连续的状态和动作空间下。然后是基于Actor-Critic的,同时基于值和策略进行评估,可以实现单步更新。SAC则是在此基础上,要求最大化期望的同时最大化策略分布的熵,以确保策略足够的随机。
算法
熵
和DDPG不同的是,SAC使用随机的策略做连续控制,核心就是熵的正则化,在最大化预期回报和最大化熵之间找到了一个临界值。熵是表示混乱程度的变量,自然情况下会趋向于混乱,就是一个熵增的过程。
在这我们可以用
H
(
X
)
H(X)
H(X)来表示信息熵来表示数据信息量的大小,其中
X
X
X表示一个随机变量所有可能取值的自信息
I
(
x
)
I(x)
I(x)的加权和,
P
(
x
)
P(x)
P(x)表示事件
x
x
x发生的概率:
H
(
X
)
=
∫
X
I
(
x
)
d
x
=
−
∫
X
l
o
g
(
P
(
x
)
)
P
(
x
)
d
x
H(X) = \int_XI(x)dx = -\int_Xlog(P(x))P(x)dx
H(X)=∫XI(x)dx=−∫Xlog(P(x))P(x)dx
KL散度(相对熵): 表示两个概率分布之间差异的非对称性度量,相对熵等价于两个概率分布的信息熵。
D
K
L
(
p
∥
q
)
=
∑
i
=
1
n
[
p
(
x
i
)
l
o
g
p
(
x
i
)
−
p
(
x
i
)
l
o
g
q
(
x
i
)
]
D_{KL}(p∥q)=\displaystyle\sum_{i=1}^{n} [p(x_i)logp(x_i )−p(x_i)logq(x_i)]
DKL(p∥q)=i=1∑n[p(xi)logp(xi)−p(xi)logq(xi)]
随机策略
A-C算法中,利用梯度上升来实现期望的最大化,如果动作
a
a
a 是
n
n
n 维的,那么策略
π
\pi
π 使用
n
n
n个高斯分布
N
(
μ
,
σ
)
N(\mu, \sigma)
N(μ,σ) 连乘的方式来近似$\pi& :
π
(
a
∣
s
)
=
∏
i
=
1
n
1
2
π
σ
i
e
−
(
a
i
−
μ
i
)
2
2
σ
i
2
\pi(a|s) = \displaystyle\prod_{i = 1}^n\frac{1}{\sqrt{2\pi\sigma_i}}e^{-\frac{(a_i-\mu_i)^2}{2\sigma_i^2}}
π(a∣s)=i=1∏n2πσi1e−2σi2(ai−μi)2
公式中的
σ
\sigma
σ和
μ
\mu
μ可以用神经网络来近似逼近。
然后根据得到的
n
n
n个高斯分布来采样得到行
a
a
a,将其代入上面的
π
\pi
π, 便可以得到
∂
log
π
(
a
∣
s
;
θ
)
∂
θ
\frac{\partial \log ^{\pi(a|s;\theta)}}{\partial^\theta}
∂θ∂logπ(a∣s;θ), 现在还剩下
Q
π
(
s
,
a
)
Q_\pi(s, a)
Qπ(s,a) 需要求。这个我们使用actor-critic中的critic对应的价值网络
q
(
s
,
q
;
w
)
q(s, q; w)
q(s,q;w)来近似,然后用时间差分算法来最小化
q
t
a
r
g
e
t
q_{target}
qtarget和
q
q
q的差距来优化价值网络的参数,这就是整个的训练过程。
熵正则化
SAC中通过实现熵正则化,可以进一步提高探索能力,得到更多的状态空间,在增大熵的同时,保证期望的增加,通过修改了普通策略学习的目标函数,可以在每一步的回报中增加策略的熵,目标如下:
J
(
θ
)
=
E
[
V
π
(
S
)
+
α
H
(
π
(
.
∣
S
)
)
]
J(\theta)=\mathbb{E}[V_\pi(S)+\alpha H(\pi(.|S))]
J(θ)=E[Vπ(S)+αH(π(.∣S))]
策略梯度近似如下:
∂
J
(
θ
)
∂
θ
=
E
[
∂
l
o
g
π
(
A
∣
s
;
θ
)
∂
θ
⋅
Q
π
(
s
,
A
)
]
≈
Q
π
(
s
,
a
)
−
α
⋅
l
o
g
π
(
a
∣
s
;
θ
)
−
α
∂
θ
l
o
g
π
(
a
∣
s
;
θ
)
\frac {\partial^{J(\theta)}}{\partial^\theta}=\mathbb{E}[\frac {\partial^log^{\pi(A|s;\theta)}}{\partial^\theta} · Q_\pi(s, A)]\approx \frac{Q_\pi(s, a)-\alpha ·log^{\pi(a|s; \theta ) - \alpha}}{\partial~\theta}log^{\pi(a|s; \theta )}
∂θ∂J(θ)=E[∂θ∂logπ(A∣s;θ)⋅Qπ(s,A)]≈∂ θQπ(s,a)−α⋅logπ(a∣s;θ)−αlogπ(a∣s;θ)
SAC网络
在SAC中使用到了两个Q网络,并通过取最小的Q值来避免最大化带来的高估,求期望是对下一个状态(来自于replay buffer)和下一个动作(来自于当前策略而不是replay buffer)求期望,(这里的动作需要强调指出,不是从replay buffer采样得到的,而是基于当前策略计算得到的新的action),因此可以使用样本进行近似估算Q值,训练过程如下:
通过策略网络采样动作进行游戏,记录transition(state,action,reward,next_state)到 replay buffer中
从replay buffer获取训练数据,计算策略网络和两个Q网络,通过时间差分算法来更新Q网络,使用Q值中较小的那个来更新V网络,再得到的V值后再使用梯度上升来更新策略网络,最后再用使用梯度下降算法Polyak平均更新目标V网络。