Actor-Critic( A 2 C A 3 C A2C \ A3C A2C A3C)
1、首先要搞清楚什么是actor-critic算法,它是怎么来的?
Actor-critic算法是一种policy based的on policy的model-free算法。和value based的DQN算法有着本质的不同。policy based算法是将policy参数化 π ( a ∣ s , θ ) = Pr { A t = a ∣ S t = s , θ t = θ } \pi(a | s, \boldsymbol{\theta})=\operatorname{Pr}\left\{A_{t}=a | S_{t}=s, \boldsymbol{\theta}_{t}=\boldsymbol{\theta}\right\} π(a∣s,θ)=Pr{At=a∣St=s,θt=θ} 用它估计的价值函数用 v ^ ( s , w ) \hat{v}(s, \mathbf{w}) v^(s,w) 表示。这里需要主义,参数化表示的价值函数都是连续函数是可以求梯度的!针对policy based强化学习问题,我们的目标依然是最大化回报,即:最大化 E [ ∑ t = 0 H R ( s t ) ∣ π θ ] E\left[\sum_{t=0}^{H} R\left(s_{t}\right) | \pi_{\theta}\right] E[∑t=0HR(st)∣πθ]
我们可以用
τ
\tau
τ 表示一组状态-动作序列
s
0
,
u
0
,
⋯
,
s
H
,
u
H
,
s_{0}, u_{0}, \cdots, s_{H}, u_{H},
s0,u0,⋯,sH,uH,
G
(
τ
)
=
∑
t
=
0
H
R
(
s
t
,
u
t
)
,
G(\tau)=\sum_{t=0}^{H} R\left(s_{t}, u_{t}\right),
G(τ)=∑t=0HR(st,ut), 表示轨迹
τ
\tau
τ 的回报,
P
(
τ
;
θ
)
P(\tau ; \theta)
P(τ;θ) 表示轨迹
τ
\tau
τ 出现的概率; 则强化学习的目标函数可表示为:
U
(
θ
)
=
E
(
∑
t
=
0
H
G
(
s
t
,
u
t
)
;
π
θ
)
=
∑
τ
P
(
τ
;
θ
)
G
(
τ
)
(9.1.1)
\begin{aligned}U(\theta)=E\left(\sum_{t=0}^{H} G\left(s_{t}, u_{t}\right) ; \pi_{\theta}\right)=\sum_{\tau} P(\tau ; \theta) G(\tau)\end{aligned}\tag{9.1.1}
U(θ)=E(t=0∑HG(st,ut);πθ)=τ∑P(τ;θ)G(τ)(9.1.1)
则我们的目标就是:
max
θ
U
(
θ
)
=
max
θ
∑
τ
P
(
τ
;
θ
)
R
(
τ
)
\max _{\theta} U(\theta)=\max _{\theta} \sum_{\tau} P(\tau ; \theta) R(\tau)
maxθU(θ)=maxθ∑τP(τ;θ)R(τ) ,根据gradient ascent方法有:
θ
n
e
w
=
θ
o
l
d
+
α
∇
θ
U
(
θ
)
\theta_{n e w}=\theta_{o l d}+\alpha \nabla_{\theta} U(\theta)
θnew=θold+α∇θU(θ)
这里需要说明,虽然该目标函数不是连续的但是在数学上它是可以写成如下形式的(具体证明没有找到):
∇
θ
U
(
θ
)
=
∇
θ
∑
τ
P
(
τ
;
θ
)
G
(
τ
)
=
∑
τ
∇
θ
P
(
τ
;
θ
)
G
(
τ
)
=
∑
τ
P
(
τ
;
θ
)
P
(
τ
;
θ
)
∇
θ
P
(
τ
;
θ
)
G
(
τ
)
=
∑
τ
P
(
τ
;
θ
)
∇
θ
P
(
τ
;
θ
)
P
(
τ
;
θ
)
G
(
τ
)
=
∑
τ
P
(
τ
;
θ
)
∇
θ
ln
P
(
τ
;
θ
)
G
(
τ
)
=
E
[
∇
θ
ln
P
(
τ
;
θ
)
G
(
τ
)
]
(9.1.2)
\begin{aligned}\nabla_{\theta} U(\theta) &=\nabla_{\theta} \sum_{\tau} P(\tau ; \theta) G(\tau) \\&=\sum_{\tau} \nabla_{\theta} P(\tau ; \theta) G(\tau) \\&=\sum_{\tau} \frac{P(\tau ; \theta)}{P(\tau ; \theta)} \nabla_{\theta} P(\tau ; \theta) G(\tau) \\&=\sum_{\tau} P(\tau ; \theta) \frac{\nabla_{\theta} P(\tau ; \theta)}{P(\tau ; \theta)} G(\tau) \\&=\sum_{\tau} P(\tau ; \theta) \nabla_{\theta} \ln P(\tau ; \theta) G(\tau)\\&=E \left[\ \nabla_{\theta} \ln P(\tau ; \theta) G(\tau) \ \right]\end{aligned}\tag{9.1.2}
∇θU(θ)=∇θτ∑P(τ;θ)G(τ)=τ∑∇θP(τ;θ)G(τ)=τ∑P(τ;θ)P(τ;θ)∇θP(τ;θ)G(τ)=τ∑P(τ;θ)P(τ;θ)∇θP(τ;θ)G(τ)=τ∑P(τ;θ)∇θlnP(τ;θ)G(τ)=E[ ∇θlnP(τ;θ)G(τ) ](9.1.2)
由此可以得到:
∇
θ
U
(
θ
)
≈
g
^
=
1
m
∑
i
=
1
m
∇
θ
ln
P
(
τ
;
θ
)
G
(
τ
)
(9.1.3)
\begin{aligned}\nabla_{\theta} U(\theta) \approx \hat{g}=\frac{1}{m} \sum_{i=1}^{m} \nabla_{\theta} \ln P(\tau ; \theta) G(\tau)\end{aligned}\tag{9.1.3}
∇θU(θ)≈g^=m1i=1∑m∇θlnP(τ;θ)G(τ)(9.1.3)
这个公式中
∇
θ
log
P
(
τ
;
θ
)
\nabla_{\theta} \log P(\tau ; \theta)
∇θlogP(τ;θ) 就是目标函数变化最快的方向,
G
(
τ
)
G(\tau)
G(τ) 可以看作更新的幅度
对于
∇
θ
log
P
(
τ
;
θ
)
\nabla_{\theta} \log P(\tau ; \theta)
∇θlogP(τ;θ) 这一项,通过数学上的一些技巧可以证明它和环境的动态特性是无关的!
∇
θ
ln
P
(
τ
(
i
)
;
θ
)
=
∇
θ
ln
[
∏
t
=
0
H
P
(
s
t
+
1
(
i
)
∣
s
t
(
i
)
,
u
t
(
i
)
)
⏟
dynamics model
⋅
π
θ
(
u
t
(
i
)
∣
s
t
(
i
)
)
⏟
policy
]
=
∇
θ
[
∑
t
=
0
H
ln
P
(
s
t
+
1
(
i
)
∣
s
t
(
i
)
,
u
t
(
i
)
)
+
∑
t
=
0
H
ln
π
θ
(
u
t
(
i
)
∣
s
t
(
i
)
)
]
=
∇
θ
∑
t
=
0
H
ln
π
θ
(
u
t
(
i
)
∣
s
t
(
i
)
)
=
∑
t
=
0
H
∇
θ
ln
π
θ
(
u
t
(
i
)
∣
s
t
(
i
)
)
⏟
no dynamics model required!!
(9.1.4)
\begin{aligned}\nabla_{\theta} \ln P\left(\tau^{(i)} ; \theta\right) &=\nabla_{\theta} \ln \left[\prod_{t=0}^{H} \underbrace{P\left(s_{t+1}^{(i)} | s_{t}^{(i)}, u_{t}^{(i)}\right)}_{\text {dynamics model }} \cdot \underbrace{\pi_{\theta}\left(u_{t}^{(i)} | s_{t}^{(i)}\right)}_{\text {policy }}\right] \\&=\nabla_{\theta}\left[\sum_{t=0}^{H} \ln P\left(s_{t+1}^{(i)} | s_{t}^{(i)}, u_{t}^{(i)}\right)+\sum_{t=0}^{H} \ln \pi_{\theta}\left(u_{t}^{(i)} | s_{t}^{(i)}\right)\right] \\&=\nabla_{\theta} \sum_{t=0}^{H} \ln \pi_{\theta}\left(u_{t}^{(i)} | s_{t}^{(i)}\right) \\&=\sum_{t=0}^{H} \underbrace{\nabla_{\theta} \ln \pi_{\theta}\left(u_{t}^{(i)} | s_{t}^{(i)}\right)}_{\text {no dynamics model required!! }}\end{aligned}\tag{9.1.4}
∇θlnP(τ(i);θ)=∇θln⎣⎢⎢⎡t=0∏Hdynamics model
P(st+1(i)∣st(i),ut(i))⋅policy
πθ(ut(i)∣st(i))⎦⎥⎥⎤=∇θ[t=0∑HlnP(st+1(i)∣st(i),ut(i))+t=0∑Hlnπθ(ut(i)∣st(i))]=∇θt=0∑Hlnπθ(ut(i)∣st(i))=t=0∑Hno dynamics model required!!
∇θlnπθ(ut(i)∣st(i))(9.1.4)
再考虑上折扣率就有:
∇
θ
U
(
θ
)
=
E
[
∇
θ
ln
P
(
τ
;
θ
)
G
(
τ
)
]
=
E
[
∑
t
=
0
H
γ
t
∇
θ
ln
π
θ
(
u
t
(
i
)
∣
s
t
(
i
)
)
G
(
τ
)
]
(9.1.5)
\begin{aligned}\nabla_{\theta} U(\theta) &=E \left[\ \nabla_{\theta} \ln P(\tau ; \theta) G(\tau) \ \right]\\&= E \left[\ \sum_{t=0}^{H} \gamma^t \ \nabla_{\theta} \ln \pi_{\theta}\left(u_{t}^{(i)} | s_{t}^{(i)}\right) G(\tau) \ \right]\end{aligned}\tag{9.1.5}
∇θU(θ)=E[ ∇θlnP(τ;θ)G(τ) ]=E[ t=0∑Hγt ∇θlnπθ(ut(i)∣st(i))G(τ) ](9.1.5)
所以更新的就可以采用以下形式:
θ
t
+
1
←
θ
t
+
α
γ
t
G
t
∇
ln
π
(
A
t
∣
S
t
;
θ
)
,
t
=
0
,
1
,
…
(9.1.6)
\begin{aligned}\boldsymbol{\theta}_{t+1} \leftarrow \boldsymbol{\theta}_{t}+\alpha \gamma^{t} G_{t} \nabla \ln \pi\left(A_{t} | S_{t} ; \boldsymbol{\theta}\right), \quad t=0,1, \ldots\end{aligned}\tag{9.1.6}
θt+1←θt+αγtGt∇lnπ(At∣St;θ),t=0,1,…(9.1.6)
这就是policy based的gradient算法,其中比较经典的是REINFORCE算法。
该算法需要生成一幕完整的序列,是基于MC的算法,因此它的方差比较大。又因为用到了随机梯度的方法所以有时容易陷入局部最优解。
为了解决这个问题,引入了基线
b
(
s
)
b(s)
b(s) 这个概念!则有:
E
[
γ
′
(
G
t
−
B
(
S
t
)
)
∇
ln
π
(
A
t
∣
S
i
;
θ
)
]
=
E
[
γ
′
G
t
∇
ln
π
(
A
t
∣
S
t
;
θ
)
]
(9.1.7)
\begin{aligned}\mathrm{E}\left[\gamma^{\prime}\left(G_{t}-B\left(S_{t}\right)\right) \nabla \ln \pi\left(A_{t} | S_{i} ; \mathbf{\theta}\right)\right]=\mathrm{E}\left[\gamma^{\prime} G_{t} \nabla \ln \pi\left(A_{t} | S_{t} ; \mathbf{\theta}\right)\right]\end{aligned}\tag{9.1.7}
E[γ′(Gt−B(St))∇lnπ(At∣Si;θ)]=E[γ′Gt∇lnπ(At∣St;θ)](9.1.7)
相关证明以及引入基线后确实能减小方差的证明此处略去。
上式左边可以做出如下改动:
E
[
γ
′
(
G
t
−
B
(
S
t
)
)
∇
ln
π
(
A
t
∣
S
i
;
θ
)
]
=
E
[
Ψ
t
∇
ln
π
(
A
t
∣
S
i
;
θ
)
]
(9.1.8)
\begin{aligned}\mathrm{E}\left[\gamma^{\prime}\left(G_{t}-B\left(S_{t}\right)\right) \nabla \ln \pi\left(A_{t} | S_{i} ; \mathbf{\theta}\right)\right]= \mathrm{E}\left[ \Psi_t \ \nabla \ln \pi\left(A_{t} | S_{i} ; \mathbf{\theta}\right)\right]\end{aligned}\tag{9.1.8}
E[γ′(Gt−B(St))∇lnπ(At∣Si;θ)]=E[Ψt ∇lnπ(At∣Si;θ)](9.1.8)
其中当
Ψ
t
=
A
(
a
t
,
s
t
)
=
γ
t
[
q
π
(
S
t
,
A
t
)
−
v
π
(
S
t
)
]
\Psi_{t}= A(a_t, s_t) = \gamma^{t}\left[q_{\pi}\left(S_{t}, A_{t}\right)-v_{\pi}\left(S_{t}\right)\right]
Ψt=A(at,st)=γt[qπ(St,At)−vπ(St)] 时(注意:此处的价值函数都是在参数化了策略之后得到的,在代码中价值函数是CNN的输出)就是典型的actor-critic算法。其中
Ψ
t
\Psi_t
Ψt 是critic,
∇
ln
π
(
A
t
∣
S
i
;
θ
)
\nabla \ln \pi\left(A_{t} | S_{i} ; \mathbf{\theta}\right)
∇lnπ(At∣Si;θ) 是actor。这里需要强调,因为critic中用价值函数来估计了回报,这种基于其他估计来更新自己的估计的方法正是自举法的体现,并且只有用到了bootstrapping方法的才是actor-critic算法,因此即使将REINFORCE算法中的基线用价值函数替代也不算是actor-critic。也正因为actor-critic算法采用了bootstrapping,所以引入了偏差但是能减小方差。
2、Actor-critic的一些特点
actor和critic是用同一个神经网络训练的但是最后的全连接层不同。当使用A3C(asynchronous advantage actor critic)时利用多线程的技巧,让多个agent同时做exploration,累计gradient,在一个episode结束后用整个轨迹来进行更新,这么做可以取代DQN中的experience replay。因为使用了多线程,不同线程中的actor-learner学到的经验关联性不高因此可以避免使用experience replay但仍能有一个比较稳定的学习过程。并且由于摆脱了experience replay的束缚,asynchronous的思想可以用到on-policy的算法上比如SARSA;其次开多线程可以加快学习的速度。
参考资料
知乎专栏
《强化学习原理与python实现》肖智清