强化学习之AC、A2C和A3C
阅读本文可参考我以前的文章《强化学习实践教学》https://tianjuewudi.gitee.io/2021/07/16/qiang-hua-xue-xi-shi-jian-jiao-xue/#toc-heading-29,其中的连续动作空间上求解RL章节是本文的基础,其中的DDPG和Actor-Critic除了Target网络外其余都一致。首先,A2C的全称是Advantage Actor
阅读本文可参考我以前的文章《强化学习实践教学》https://tianjuewudi.gitee.io/2021/07/16/qiang-hua-xue-xi-shi-jian-jiao-xue/#toc-heading-29,其中的连续动作空间上求解RL章节是本文的基础,其中的DDPG和Actor-Critic除了Target网络外其余都一致。
首先,A2C的全称是Advantage Actor Critic,而A3C是Asynchronous Advantage Actor Critic,A2C源自A3C。
Actor Critic
首先解释一下Actor Critic的概念,Q-learning是一种价值迭代法,而policy gradient是一种策略迭代法,Actor Critic同时使用了这两种方法。
Actor直接负责输出每个Action的概率,有多少个Action就有多少个输出。Critic输出的是动作价值Q。这是两个神经网络。在Policy Gradient中,一个episode的累计Reward就像是一个Critic,决定了Actor的学习方向,使得Actor倾向于学习Critic累计Reward更高的逻辑。因此策略梯度可写作:
g
=
E
[
∑
t
=
0
∞
ψ
t
∇
θ
l
o
g
π
θ
(
a
t
∣
s
t
)
]
g = E[\sum_{t=0}^{\infty}\psi_t \nabla_{\theta}log \pi_{\theta}(a_t|s_t)]
g=E[t=0∑∞ψt∇θlogπθ(at∣st)]
其中这里的π就是actor,ψ就是critic,这是一个广义的框架。
critic有多种形式:
- 一个轨迹中的Reward相加。
- 一个轨迹中后面某部分的Reward相加。
- 相加后的Reward减去一个baseline。
- 采用行为价值函数Q代替。
- 采用优势函数A,即Q-V。
- 采用TD-error,计算新的状态价值减去原本的状态价值。
经典的AC方法使用的是4-6。
权重更新公式为:
w
=
w
+
β
ψ
∇
W
v
^
(
S
t
,
w
)
w = w + \beta \psi \nabla_W \hat v(S_t,w)
w=w+βψ∇Wv^(St,w)
以下是重点:
在两个神经网络中,我们一般用 π ( a ∣ s ; θ ) \pi (a|s;\theta) π(a∣s;θ)表示策略网络actor,θ代表其中的参数, q ( s , a ; w ) q(s,a;w) q(s,a;w)代表价值网络critic,w代表其中的参数。注意这里actor网络只需要输入状态,而critic网络则需要输入状态和动作,两个网络往往可以共用前一部分。
actor网络的更新参数的目标是让critic网络的输出值越大越好。当确定状态s的情况下,如何选取动作action来使得critic的值最大就是actor网络需要优化的目标。而更新Critic的参数是为了让其的打分更精准,训练的依据就是环境给的reward。
下面讲解如何更新Critic参数,依靠的是常用的TD算法:
下面是更新Actor参数的方法:
下面做一个总结:
由于实际操作中我们不可能得出期望值,因此直接做蒙泰卡罗近似,每个episode拿一次的采样值来更新一点点 ,使得采样到的action得到的动作价值尽可能增大即可,操作比critic要简单得多。
Advantage Actor Critic
A2C的出现是为了解决AC的高方差问题。在所有行为的得分为正的情况下不代表所有的行为都是正确的,我们必须有选择地学习更好的行为。因此我们会在原有Reward基础上减去一个常数,这个数的计算方式就是Advantage。这是因为我们对于输入的同一个状况,由于输出要具有一定随机性的存在,那么其实这些所有可能所能获得的Reward的平均值就是Vθ,这就是Critic的含义。我们用来更新参数的At是用Reward减去这个平均值,也就是如果对于一个状况的行为的得分比我们critic预测的要高,则采纳,反之舍弃。
Advantage学习是使用两步以上的奖励来更新Q函数。这个步数需要自己设置合理,以下举例两步:
Q
(
s
t
,
a
t
)
→
R
(
t
+
1
)
+
γ
R
(
t
+
2
)
+
γ
2
m
a
x
a
Q
(
s
t
+
2
,
a
)
Q(s_t,a_t) \rightarrow R(t+1) + \gamma R(t+2) + \gamma^2 max_a Q(s_{t+2},a)
Q(st,at)→R(t+1)+γR(t+2)+γ2maxaQ(st+2,a)
以下是重点:
A2C于AC的不同之处在于给Q值增加了一个baseline,我们用Q值减去这个baseline来判断当前逻辑的好坏,这个baseline通常由
V
t
V_t
Vt来担任。那么原来更新的Q值被替换为:
Q
(
s
t
,
a
t
)
−
V
(
s
t
)
Q(s_t,a_t) - V(s_t)
Q(st,at)−V(st)
而Q值我们通常用的是一个回合随机出来的特殊值。我们想要采用期望值,这个期望值的计算方式是
r
t
+
γ
V
(
s
t
+
1
)
r_t + \gamma V(s_{t+1})
rt+γV(st+1),这是因为执行一个动作的下一回合必定更新到
s
t
+
1
s_{t+1}
st+1的状态,在加上本回合获得的Reward就是Q的期望值 。这样我们就可以得到最后的价值公式:
r
t
+
γ
V
(
s
t
+
1
)
−
V
(
s
t
)
r_t+ \gamma V(s_{t+1}) - V(s_t)
rt+γV(st+1)−V(st)
其中大于0时我们倾向于采用,反之亦然。
这样的好处是我们现在只用计算V不用计算Q了,这是Critic的不同之处。
Asynchronous Advantage Actor Critic
A3C全称为异步优势动作评价算法(Asynchronous advantage actor-critic)。
然而经验回放机制存在两个问题:
- agent 与环境的每次实时交互都需要耗费很多的内存和计算力;
- 经验回放机制要求 agent 采用离策略(off-policy)方法来进行学习,而off-policy方法只能基于旧策略生成的数据进行更新;
前文讲到,神经网络训练时,需要的数据是独立同分布的,为了打破数据之间的相关性,DQN和DDPG的方法都采用了经验回放的技巧。然而经验回放需要大量的内存,打破数据的相关性,经验回放并非是唯一的方法。另外一种是异步的方法,所谓异步的方法是指数据并非同时产生,A3C的方法便是其中表现非常优异的异步强化学习算法。
A3C模型如下图所示,每个Worker直接从Global Network中拿参数,自己与环境互动输出行为。利用每个Worker的梯度,对Global Network的参数进行更新。每一个Worker都是一个A2C。A3C主要有两个操作,一个是pull,一个是push:
pull:把主网络的参数直接赋予Worker中的网络
push:使用各Worker中的梯度,对主网络的参数进行更新
这种异步更新的方法在多种算法中都适用。所有的异步agent执行完后再用累计的梯度信息更新网络参数。其中n-step的算法(后两个)需要每个异步agent复制一份子网络,每个anget执行n步后倒退算出每步的总回报和相关梯度,用累计梯度更新主网络参数。
M Babaeizadeh等人提出了一种混合CPU/GPU版的A3C,并提供开源代码https://github.com/NVlabs/GA3C。
具体地,GA3C主要分为:
Agent,和A3C功能一样,收集样本,但是不需要各自复制一份模型,只需要在每次选择Action前,将当前的State作为请求加入 Prediction Queue;执行动作n步后倒退算出每步的总回报,得到的n个(st,at,R,st+1)(st,at,R,st+1)加入 Trainning Queue;
Predictor,将 Prediction Queue 中的请求样本出队作为minibatch填入GPU的网络模型中,将模型预测的Action返回给各自的Agent,为减少延迟,可以使用多线程并行多个predictiors;
Trainer,将 Trainning Queue 的样本出队作为minibatch填入GPU的网络模型中,训练更新模型,同样,为减少延迟,可以使用多线程并行多个trainers;
参考文献:
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)