赞
踩
Actor-Critic,演员评论家算法是强化学习中的一种很实用的方法。
比较详细的推导可以看:https://datawhalechina.github.io/easy-rl/#/chapter9/chapter9?id=actor-critic-1
演员-评论家算法(Actor-Critic Algorithm) 是一种结合 policy base 和 value base 思想的算法,Actor是利用策略梯度算法实现,Critic使用时序差分实现。
在 Actor-Critic 算法 里面,最知名的方法就是 A3C(Asynchronous Advantage Actor-Critic)。
策略梯度法(Policy Gradient)可以参考:https://blog.csdn.net/qq_33302004/article/details/115495686
我们回顾一下policy gradient,其主要过程就是:
Q-Learning可以参考:https://blog.csdn.net/qq_33302004/article/details/114871232
简而言之,Q-Learning就是一种 value base 的方法,该方法会建立一个Q表,里面存储了每一对 ( s , a ) (s,a) (s,a)对应的value值,agent会根据Q表中的值决定在状态 s s s下采用哪种动作。以上面的方法,agent不断与环境进行互动,并更新Q表,最终Q表不断收敛,机器人也取得了比较好的效果。
大致过程如下:
上面的Q-Learning是举了一个例子,其中value值的计算方法采用了时间差分(TD) 方法,在使用中还可以使用蒙特卡洛(MC) 的方法实现。
无论用TD还是MC,Q-Learning都是一种value base的方法,其核心就是计算两种函数:
想要更深入理解这两种值函数,可以参考:https://blog.csdn.net/qq_33302004/article/details/115189857
Actor是一个policy base的方法,负责做决策,并且更新决策;Critic是一个value base的方法,负责估计当前Actor的 V π ( s ) V^\pi(s) Vπ(s)和 Q π ( s , a ) Q^\pi(s,a) Qπ(s,a)。
Actor就是我们第二部分中提到的policy gradient,这个方法的和核心就是利用回报梯度更新网络,最终公式如下:
∇
R
ˉ
(
τ
)
=
1
N
∑
n
=
1
N
∑
t
=
1
T
n
(
∑
t
′
=
t
T
r
t
′
n
γ
t
′
−
t
−
b
)
∇
l
o
g
p
θ
(
a
t
n
∣
s
t
n
)
,
γ
∈
[
0
,
1
]
\nabla\bar{R}(\tau) = \frac1N \sum_{n=1}^N \sum_{t=1}^{T_n} (\sum_{t'=t}^T r_{t'}^n \gamma^{t'-t} - b) \nabla log p_\theta(a_t^n|s_t^n) , \gamma \in[0,1]
∇Rˉ(τ)=N1n=1∑Nt=1∑Tn(t′=t∑Trt′nγt′−t−b)∇logpθ(atn∣stn),γ∈[0,1]
其中,我们将
R
−
b
R-b
R−b这一项定义为 Advantage function(比较优势) 符号表示为
A
θ
(
s
t
,
a
t
)
A^{\theta}(s_t, a_t)
Aθ(st,at):
A
θ
(
s
t
,
a
t
)
=
∑
t
′
=
t
T
r
t
′
n
γ
t
′
−
t
−
b
A^{\theta}(s_t, a_t) = \sum_{t'=t}^T r_{t'}^n \gamma^{t'-t} - b
Aθ(st,at)=t′=t∑Trt′nγt′−t−b
我们可以看出Advantage function(比较优势) 就是利用蒙特卡洛方法计算的累计回报期望-baseline,那么我们是否可以不在Actor中计算回报,而是直接使用Critic来更新Actor呢?
其实累计回报期望:
E
[
G
t
n
]
≈
∑
t
′
=
t
T
r
t
′
n
γ
t
′
−
t
E[G_t^n] \approx \sum_{t'=t}^T r_{t'}^n \gamma^{t'-t}
E[Gtn]≈∑t′=tTrt′nγt′−t,就是
Q
π
θ
(
s
t
n
,
a
t
n
)
Q^{\pi_\theta}(s_t^n,a_t^n)
Qπθ(stn,atn)。
因为这个就是 Q 的定义。Q-function 的定义就是在某一个状态 s,采取某一个动作 a,假设 policy 就是 π \pi π的情况下会得到的累积奖励的期望值有多大,而这个东西就是 G 的期望值。累积奖励的期望值就是 G 的期望值。
所以我们把 Q-function 套在这里就结束了,就可以把 Actor 跟 Critic 这两个方法结合起来。
对于baseline有许多不同的表示方法,但一个常见的做法是用价值函数 V π θ ( s t n ) V^{\pi_\theta}(s_t^n) Vπθ(stn) 来表示 baseline。
价值函数是说,假设 policy 是 π \pi π,在某一个状态 s 一直互动到游戏结束,期望奖励(expected reward) 有多大。 V π θ ( s t n ) V^{\pi_\theta}(s_t^n) Vπθ(stn) 是状态 s t n s_t^n stn下,执行所有 a t n a_t^n atn所产生的 Q π θ ( s t n , a t n ) Q^{\pi_\theta}(s_t^n,a_t^n) Qπθ(stn,atn)期望值,所以 Q π θ ( s t n , a t n ) − V π θ ( s t n ) Q^{\pi_\theta}(s_t^n,a_t^n) - V^{\pi_\theta}(s_t^n) Qπθ(stn,atn)−Vπθ(stn) 一定有正有负。
所以最终Actor的训练函数为:
∇
R
ˉ
(
τ
)
=
1
N
∑
n
=
1
N
∑
t
=
1
T
n
(
Q
π
θ
(
s
t
n
,
a
t
n
)
−
V
π
θ
(
s
t
n
)
)
∇
l
o
g
p
θ
(
a
t
n
∣
s
t
n
)
\nabla\bar{R}(\tau) = \frac1N \sum_{n=1}^N \sum_{t=1}^{T_n} (Q^{\pi_\theta}(s_t^n,a_t^n) - V^{\pi_\theta}(s_t^n)) \nabla log p_\theta(a_t^n|s_t^n)
∇Rˉ(τ)=N1n=1∑Nt=1∑Tn(Qπθ(stn,atn)−Vπθ(stn))∇logpθ(atn∣stn)
在上章中我们推导出Advantage function(比较优势) :
A
θ
(
s
t
n
,
a
t
n
)
=
Q
π
θ
(
s
t
n
,
a
t
n
)
−
V
π
θ
(
s
t
n
)
A^{\theta}(s_t^n, a_t^n) = Q^{\pi_\theta}(s_t^n,a_t^n) - V^{\pi_\theta}(s_t^n)
Aθ(stn,atn)=Qπθ(stn,atn)−Vπθ(stn)
从公式中可以看出,我们要完成两种估计,
V
π
(
s
)
V^\pi(s)
Vπ(s)和
Q
π
(
s
,
a
)
Q^\pi(s,a)
Qπ(s,a),那么直观思路就是我们需要两个网络:Q-network 和 V-network,如果这样做估测不准的风险就变成两倍。所以我们何不只估测一个网络?
事实上在这个 Actor-Critic 方法里面,我们可以只估测 V 这个网络,并且用 V 的值来表示 Q 的值,即:
Q
π
θ
(
s
t
n
,
a
t
n
)
=
E
[
r
t
n
+
V
π
θ
(
s
t
+
1
n
)
]
Q^{\pi_\theta}(s_t^n,a_t^n) = E[r_t^n+ V^{\pi_\theta}(s_{t+1}^n)]
Qπθ(stn,atn)=E[rtn+Vπθ(st+1n)]
你在状态 s s s 采取动作 a a a,会得到奖励 r r r,然后跳到状态 s t + 1 s_{t+1} st+1 。但是你会得到什么样的奖励 r r r,跳到什么样的状态 s t + 1 s_{t+1} st+1 ,它本身是有随机性的。所以要把右边这个式子,取期望值它才会等于 Q-function。
但是如果我们能够比较准确的估计
r
t
n
r_t^n
rtn就可以把期望去掉:
Q
π
θ
(
s
t
n
,
a
t
n
)
=
r
t
n
+
V
π
θ
(
s
t
+
1
n
)
Q^{\pi_\theta}(s_t^n,a_t^n) = r_t^n+ V^{\pi_\theta}(s_{t+1}^n)
Qπθ(stn,atn)=rtn+Vπθ(st+1n)
把这个期望值去掉的好处就是你不需要估计 Q 了,你只需要估计 V 就够了,你只要估计 一个网络就够了。但这样你就引入了一个随机的东西 r ,它是有随机性的,它是一个随机变量。但是这个随机变量,相较于累积奖励 G 可能还好,因为它是某一个步骤会得到的奖励,而 G 是所有未来会得到的奖励的总和。G 的方差比较大,r 虽然也有一些方差,但它的方差会比 G 要小。所以把原来方差比较大的 G 换成方差比较小的 r 也是合理的。
Q: 为什么可以直接把期望值拿掉?
A: 原始的 A3C paper 试了各种方法,最后做出来就是这个最好。当然你可能说,搞不好估计 Q 和 V,也可以估计 很好,那我告诉你就是做实验的时候,最后结果就是这个最好,所以后来大家都用这个。
由此我们的Advantage function(比较优势) 公式变成了如下的样子:
A
θ
(
s
t
n
,
a
t
n
)
=
r
t
n
+
V
π
θ
(
s
t
+
1
n
)
−
V
π
θ
(
s
t
n
)
A^{\theta}(s_t^n, a_t^n) = r_t^n+ V^{\pi_\theta}(s_{t+1}^n) - V^{\pi_\theta}(s_t^n)
Aθ(stn,atn)=rtn+Vπθ(st+1n)−Vπθ(stn)
训练梯度公式如下:
∇
R
ˉ
(
τ
)
=
1
N
∑
n
=
1
N
∑
t
=
1
T
n
(
r
t
n
+
V
π
θ
(
s
t
+
1
n
)
−
V
π
θ
(
s
t
n
)
)
∇
l
o
g
p
θ
(
a
t
n
∣
s
t
n
)
\nabla\bar{R}(\tau) = \frac1N \sum_{n=1}^N \sum_{t=1}^{T_n} (r_t^n+ V^{\pi_\theta}(s_{t+1}^n) - V^{\pi_\theta}(s_t^n)) \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)
因为利用了Advantage function(比较优势),所以这个方法叫做Advantage Actor-Critic,也可以叫做A2C。
实现 Actor-Critic 的时候,有两个一定会用的 tip:
强化学习有一个问题就是它很慢,那怎么增加训练的速度呢?举个例子,火影忍者就是有一次鸣人说,他想要在一周之内打败晓,所以要加快修行的速度,他老师就教他一个方法:用影分身进行同样修行。两个一起修行的话,经验值累积的速度就会变成 2 倍,所以鸣人就开了 1000 个影分身来进行修行。这个其实就是 Asynchronous(异步的) Advantage Actor-Critic,也就是 A3C 这个方法的精神。
A3C 这个方法就是同时开很多个 worker,那每一个 worker 其实就是一个影分身。那最后这些影分身会把所有的经验,通通集合在一起。你如果没有很多个 CPU,可能也是不好实现的,你可以实现 A2C 就好。
A3C的过程如下:
其实 GAN 跟 Actor-Critic 的方法是非常类似的。这边就不细讲,你可以去找到一篇 paper 叫做 Connecting Generative Adversarial Network and Actor-Critic Methods。
Q: 知道 GAN 跟 Actor-Critic 非常像有什么帮助呢?
A: 一个很大的帮助就是 GAN 跟 Actor-Critic 都是以难训练而闻名的。所以在文献上就会收集各式各样的方法,告诉你说怎么样可以把 GAN 训练起来。怎么样可以把 Actor-Critic 训练起来。但是因为做 GAN 跟 Actor-Critic 的人是两群人,所以这篇 paper 里面就列出说在 GAN 上面有哪些技术是有人做过的,在 Actor-Critic 上面,有哪些技术是有人做过的。也许在 GAN 上面有试过的技术,你可以试着应用在 Actor-Critic 上,在 Actor-Critic 上面做过的技术,你可以试着应用在 GAN 上面,看看是否 work。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。