笔记整理自李宏毅老师的公开课
Asynchronous Advantage Actor-Critic (A3C)
回顾Policy Gradient的梯度参数:
∇
R
ˉ
θ
≈
1
N
∑
n
=
1
N
∑
t
=
1
T
n
(
∑
t
′
=
t
T
n
r
t
′
−
t
r
t
′
n
−
b
)
∇
log
p
θ
(
a
t
n
∣
s
t
n
)
\nabla \bar{R}_{\theta}\approx \frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T_n}\left(\sum_{t^{'}=t}^{T_n}r^{t^{'}-t_{r^{n}_{t^{'}}}}-b\right)\nabla\log{p_{\theta}(a_{t}^{n}|s_{t}^{n})}
∇Rˉθ≈N1n=1∑Nt=1∑Tn⎝⎛t′=t∑Tnrt′−trt′n−b⎠⎞∇logpθ(atn∣stn)
如果令 G t n = ∑ t ′ = t T n r t ′ − t r t ′ n G_{t}^{n}=\sum_{t^{'}=t}^{T_n}r^{t^{'}-t_{r^{n}_{t^{'}}}} Gtn=∑t′=tTnrt′−trt′n, G t n G_t^{n} Gtn是Actor跟环境互动而来的,那么 G G G则会使不稳定的。因为数值本身具有随机性,而且环境也有随机性。不过,如果我们sample足够多的次数,那么均值会比较稳定。
其实,本质上来说,有下面的公式成立:
E
[
G
t
n
]
=
Q
π
θ
(
s
t
n
,
a
t
n
)
E\left[G_{t}^{n}\right]=Q^{\pi_{\theta}}(s_t^{n},a_t^{n})
E[Gtn]=Qπθ(stn,atn)
那么问题转换成了求解
Q
π
θ
(
s
t
n
,
a
t
n
)
Q^{\pi_{\theta}}(s_t^{n},a_t^{n})
Qπθ(stn,atn);同时,
b
b
b可以用
V
π
θ
(
s
t
n
)
V^{\pi_{\theta}}(s_t^{n})
Vπθ(stn)进行表示。但是,这样做的缺点在于,我们需要估计
Q
π
Q^\pi
Qπ和
V
π
V^\pi
Vπ这两个神经网络,这样的训练量大,而且结果不稳定。引入一个代换法则:
Q
π
(
s
t
n
,
a
t
n
)
=
E
[
r
t
n
+
V
π
(
s
t
+
1
n
)
]
Q^\pi\left(s_t^n,a_t^n\right)=E\left[r_t^n+V^\pi\left(s_{t+1}^n\right)\right]
Qπ(stn,atn)=E[rtn+Vπ(st+1n)]
实际使用时,可以去掉期望值,原作者的Paper实验这样做的效果比较好。
Q
π
(
s
t
n
,
a
t
n
)
=
r
t
n
+
V
π
(
s
t
+
1
n
)
Q^\pi\left(s_t^n,a_t^n\right)=r_t^n+V^\pi\left(s_{t+1}^n\right)
Qπ(stn,atn)=rtn+Vπ(st+1n)
可以这么理解,
Q
Q
Q的意思是为了表示
s
t
s_t
st状态下,采取行动
a
t
a_t
at后会获得的所有的奖励总和,那么和自然,这个公式可以表示成当前这一步行动的奖励
r
t
r_t
rt累加上下一个状态的奖励
V
V
V。
r
r
r是个随机值,由环境等的因素共同决定,这也是这个模型的缺点,由随机值的影响。
那么,最终的梯度可以表示为:
∇
R
ˉ
θ
≈
1
N
∑
n
=
1
N
∑
t
=
1
T
n
(
r
t
n
+
V
π
(
s
t
+
1
n
)
−
V
π
(
s
t
n
)
)
∇
log
p
θ
(
a
t
n
∣
s
t
n
)
\nabla \bar{R}_{\theta}\approx \frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T_n}\left(r_t^n+V^\pi(s^n_{t+1})-V^\pi(s^n_t)\right)\nabla\log{p_{\theta}(a_{t}^{n}|s_{t}^{n})}
∇Rˉθ≈N1n=1∑Nt=1∑Tn(rtn+Vπ(st+1n)−Vπ(stn))∇logpθ(atn∣stn)
训练时候的
Q
Q
Q和
V
V
V网络可以共享前面几层的参数,只是在最后输出的时候,变换到不同的网络层中。训练的时候,可以使用输出参数的交叉熵作为
π
(
s
)
\pi(s)
π(s)的参数,那么交叉熵越大,说明越需要进行Exploration。
A3C是同时开多个环境进行产生数据,并不断更新。
Pathwise Derivative Policy Gradient
在之前的 Q π Q^\pi Qπ网络中,我们输入一个游戏状态 s s s和一个行动 a a a,时候会得到一个 Q π ( s , a ) Q^\pi(s,a) Qπ(s,a)作为输出。而该方法的特别之处在于,专门产生一个Actor π \pi π网络用于生成行动 a a a,这样,一个网络的输出就会作为另一个网络的输入。训练的时候,需要先训练 Q π Q^\pi Qπ网络,之后固定住该网络,再去训练 π \pi π网络。
那么,Actor网络的梯度是:
θ
π
′
=
θ
π
+
η
∇
θ
π
Q
π
(
s
,
a
)
\theta^{\pi^{'}}=\theta^\pi+\eta\nabla_{\theta^\pi}Q^\pi(s,a)
θπ′=θπ+η∇θπQπ(s,a)
给出一般性的算法:
- 初始化Q-function Q Q Q,target Q-function Q ^ = Q \hat{Q}=Q Q^=Q,actor π \pi π,target actor π ^ = π \hat{\pi}=\pi π^=π
- 在每个episode中:
- 对于每一步
- 给定一个状态 s t s_t st,基于 π \pi π采取行动 a t a_t at,注意这里需要Exploration
- 获得一个奖励 r t r_t rt,并到达一个新的状态 s t + 1 s_{t+1} st+1
- 把 ( s i , a i , r i , s i + 1 ) (s_i,a_i,r_i,s_{i+1}) (si,ai,ri,si+1)存储到buffer中
- 从buffer中随机获取一个批次的 ( s i , a i . r i , s i + 1 ) (s_i,a_i.r_i,s_{i+1}) (si,ai.ri,si+1)
- 目标函数 y = r i + Q ^ ( s i + 1 , π ^ ( s i + 1 ) ) y=r_i+\hat{Q}(s_{i+1},\hat{\pi}(s_{i+1})) y=ri+Q^(si+1,π^(si+1))
- 更新 Q Q Q的参数,使得 Q ( s i , a i ) Q(s_i,a_i) Q(si,ai)接近 y y y
- 更新 π \pi π的参数去最大化 Q ( s i , π ( s i ) ) Q(s_i,\pi(s_i)) Q(si,π(si))
- 每C步执行更新 Q ^ = Q \hat{Q}=Q Q^=Q, π ^ = π \hat{\pi}=\pi π^=π
- 对于每一步