阅读本文可参考我以前的文章《强化学习实践教学》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;
参考文献:
1.深度强化学习——A3C
2.强化学习AC、A2C、A3C算法原理与实现