分布式强化学习之IMPALA

参考内容:https://zhuanlan.zhihu.com/p/58226117

参考书籍:《深度强化学习学术前沿与实战应用》

IMPALA全名Importance Weighted Actor-Learner Architecture,也就是重要性加权Actor-learner架构,可以训练高效复杂的任务序列。

框架概述

在实际的问题场景中,我们可以将数百个Actor设置在每一个服务器的每一个线程上,它们可以相互独立,同时处理一个任务,也可以同时训练不同的任务,下面开始运行一个完整的过程。

从每一段训练过程开始,每个Actor将自己的本地策略和中心Learner的最新策略同步,之后于自身所处的环境交互n个时间步。在n步之后,Actor发送自己经历这一段“状态——动作——奖励”的轨迹 “ s 1 , a 1 , r 1 , s 2 , a 2 , r 2 , . . . s n , a n , r n ” “s_1,a_1,r_1,s_2,a_2,r_2,...s_n,a_n,r_n” s1,a1,r1,s2,a2,r2,...sn,an,rn,以及自己本地的策略分布(包括LSTM的初始状态,通过相应的队列等数据结构),发送回给Learner,我们的Learner从训练启动开始就在不断地收到来自Actor的这些序列信息和策略,并且在这些序列信息中不断进行自身更新。在各个线程训练actor的过程中,Learner是在不断学习更新策略的,无需等待actor都训练完毕,因此Learner的策略是在时间上比所有actor超前很多的,每一个Actor和Learner的时间差距有不同,这样的巨大差异是不利于训练质量的,但为了训练速度我们又不能妥协去把异步改为同步,使得服务器相互等待。

V-trace

这里引入了一种off-policy的actor-critic算法——V-trace,它用在像IMPALA这样的分布式任务框架上,改进了原先计算梯度的公式,来适应Actor于Learner在策略上的时间差。

在A3C这样的on-policy场景,值函数的更新可以表示为:
V s = V ( x s ) + ∑ t = s s + n − 1 γ t − s ( r t + γ V ( x t + 1 ) − V ( x t ) ) V_s = V(x_s) + \sum_{t=s}^{s+n-1} \gamma^{t-s}(r_t + \gamma V(x_{t+1}) - V(x_t)) Vs=V(xs)+t=ss+n1γts(rt+γV(xt+1)V(xt))
这时候我们采用off-policy策略来修正时间差,从比较过时和比较新的策略去估计一个最好的策略,这就需要用到重要性采样(Importance Sampling)。这时候我们可以得到在n步下V-trace算法下的目标价值函数:
V s = d e f V ( x s ) + ∑ t = s s + n − 1 γ t − s ( ∏ i = s t − 1 c i ) δ t V V_s =^{def} V(x_s) + \sum_{t=s}^{s+n-1} \gamma^{t-s}(\prod_{i=s}^{t-1} c_i )\delta_t V Vs=defV(xs)+t=ss+n1γts(i=st1ci)δtV

δ t V = d e f p t ( r t + γ V ( x t + 1 ) − V ( x t ) ) \delta_t V =^{def} p_t(r_t + \gamma V(x_{t+1}) - V(x_t)) δtV=defpt(rt+γV(xt+1)V(xt))

p t = d e f m i n ( ρ ˉ , π ( a t ∣ x t ) μ ( a t ∣ x t ) ) p_t =^{def} min(\bar{\rho},\frac{\pi(a_t|x_t)}{\mu(a_t|x_t)}) pt=defmin(ρˉ,μ(atxt)π(atxt))

c i = d e f m i n ( c ˉ , π ( a i ∣ x i ) μ ( a i ∣ x i ) ) c_i =^{def}min(\bar{c},\frac{\pi(a_i|x_i)}{\mu(a_i|x_i)}) ci=defmin(cˉ,μ(aixi)π(aixi))

这是一个经过裁剪的重要性采样。裁剪的原因是π于μ的实际分布差距越大,最后估计的策略的差异就越大。而为了更好的估计相应的策略分布,我们采用一步步累积的方法进行s到t步的逐步估计,这样将致使方差越来越大,所以我们才需要进行裁剪,采用相应策略之比的平均值来稳定方差,使训练效果更加稳定。

引入额外的重要性参数 ρ t \rho_t ρt的作用是为V-trace中的TD-error定义一个不动点,在取不动点的时候,值函数 V π p ˉ V_{\pi_{\bar{p}}} Vπpˉ对应的策略是:
π p ˉ ( a ∣ x ) = d e f m i n ( ρ ˉ μ ( a ∣ x ) , π ( a ∣ x ) ) ∑ b ∈ A min ⁡ ( ρ ˉ μ ( b ∣ x ) , π ( b ∣ x ) ) \pi_{\bar{p}}(a|x) =^{def} \frac{min(\bar{\rho} \mu(a|x),\pi(a|x))}{\sum_{b \in A} \min(\bar{\rho} \mu(b|x),\pi(b|x))} πpˉ(ax)=defbAmin(ρˉμ(bx),π(bx))min(ρˉμ(ax),π(ax))
这样的策略中,不动点 ρ ˉ \bar{\rho} ρˉ的作用很大,当 ρ ˉ \bar{\rho} ρˉ为无穷大的时候,我们可以很容易求出这个结果相当于
π p ˉ ( a ∣ x ) = d e f π ( a ∣ x ) ∑ b ∈ A π ( b ∣ x ) = π ( a ∣ x ) \pi_{\bar{p}}(a|x) =^{def} \frac{\pi(a|x)}{\sum_{b \in A} \pi(b|x)} = \pi(a|x) πpˉ(ax)=defbAπ(bx)π(ax)=π(ax)
ρ ˉ \bar{\rho} ρˉ不是无穷大的时候,生成的策略是目标策略和执行策略之间的中间策略,完美弥补两个策略之间的差异。

V-trace算法加入裁剪后的重要性因子, c ˉ \bar{c} cˉ影响的是模型收敛到最好结果的速度,而 ρ ˉ \bar{\rho} ρˉ决定的是最后我们想收敛到的目标价值函数,可以更好解决不同的Actor和learner出现的时间差。

后面的更新用 V s V_s Vs替换掉相应的价值函数后,依然是标准的actor-critic算法。值函数的损失梯度依旧采取L2平方损失。
( V s − V θ ( x s ) ) ∇ θ V θ ( x s ) (V_s - V_{\theta}(x_s)) \nabla_{\theta} V_{\theta}(x_s) (VsVθ(xs))θVθ(xs)
在当前训练时间为s时,参数为w的策略网络的梯度表示形式如下:
ρ s ∇ w log ⁡ π w ( a s , x s ) ( r s + γ v s + 1 − V θ ( x s ) ) \rho_s \nabla_w \log \pi_w(a_s,x_s)(r_s + \gamma v_{s+1} - V_{\theta}(x_s)) ρswlogπw(as,xs)(rs+γvs+1Vθ(xs))
与A3C相同,为了防止过早收敛,算法不能达到最优解,还需要在损失梯度中加上一个熵奖励(entropy bonus):
− ∇ w ∑ a π w ( a ∣ x s ) log ⁡ π w ( a ∣ x s ) -\nabla_w \sum_a \pi_w(a|x_s) \log \pi_w(a|x_s) waπw(axs)logπw(axs)

三项配合一定的权重后求和得到最终损失梯度,也就得到了算法的整体更新公式。

在这种大规模训练中,训练一次耗资巨大,为了避免训练的这一波陷入局部极小值点,采用了 population based training(PBT) 方法。每次训练若干个智能体,每隔一段时间剔除表现不好的,并且对于表现较好的智能体进行mutation(通常是扰动一下超参数组合)。通过这种方法,保证长达几天的训练结束后能得到好的结果。

有意思是,通过这种方法,学习率会随着学习进度自然慢慢减小,这和很多算法里面linear scheduled learning rate的trick不谋而合。

你可能感兴趣的:(强化学习,深度学习,强化学习)