本专栏按照 https://lilianweng.github.io/lil-log/2018/04/08/policy-gradient-algorithms.html 顺序进行总结 。
文章目录
- 原理解析
- 算法实现
-
- 总体流程
- 代码实现
基于重要性采样的分布式深度强化学习算法
SVPG\color{red}SVPGSVPG :[ paper:Stein Variational Policy Gradient | code ]
原理解析
以下总结来源于:https://blog.csdn.net/yH0VLDe8VG8ep9VGe/article/details/79292530
IMPALA的灵感来自于热门的A3C架构,后者使用多个分布式actor来学习agent的参数。在类似这样的模型中,每个actor都使用策略参数的一个副本,在环境中操作。actor会周期性地暂停探索,将它们已经计算得出的梯度信息分享至中央参数服务器,而后者会对此进行更新。
与此不同,IMPALA中的actor不会被用来计算梯度信息。它们只是收集经验,并将这些经验传递至位于中心的learner。learner会计算梯度。因此在这样的模型中,actor 和 learner 是完全独立的。为了利用当代计算系统的规模优势,IMPALA在配置中可支持单个learner机器,也可支持多个相互之间同步的learner机器。以这种方式将学习和操作分开也有利于提升整个系统的吞吐量,因为与批量A2C这类架构不同,actor不再需要等待学习步骤。这帮助我们在有趣的环境中训练IMPALA,同时不必面临由于帧渲染时间或任务重启耗时造成的差异。
不过操作和学习的解耦也导致,actor的策略落后于learner。为了弥补这样的差距,我们引入了离策略优势actor-评价者公式V-trace。它弥补了离策略actor获得的轨迹。你可以从我们的论文中了解算法及其分析细节。
凭借优化的模型,与传统agent相比,IMPALA可以处理多出一到两个数量级的经验,使得在挑战性环境中的学习成为可能。我们将IMPALA与多种热门的actor-评价者方法进行了比较,发现前者有明显的速度提升。此外,IMPALA的吞吐量上升与actor、learner的数量增长呈线性关系。这表明,分布式agent模型和V-trace算法都可以胜任超大规模的实验,即使机器数量达到数千台。
在利用DMLab-30关卡进行测试时,与分布式A3C相比,IMPALA的数据效率达到10倍,而最终得分达到两倍。此外,与单任务环境中的训练相比,IMPALA在多任务环境的训练中表现出正向转换。
以下总结来源于:https://zhuanlan.zhihu.com/p/58226117?utm_source=wechat_session
Single Learner:
learner
的主要作用是通过获取 actor
得到的轨迹来做 SGD 来更新各个神经网络的参数,神经网络训练本身可并行的特性,learner
使用的是一块GPU。actor
定期从 learner
获取最新的神经网络参数,并且每个 actor
起一个模拟环境,来使用自己能获得的最新策略去采样,并且把获取到的 {xt,at,rt,μ(at∣xt)}\{ x_t, a_t, r_t, \mu(a_t|x_t)\}{
xt?,at?,rt?,μ(at?∣xt?)} 传回供 learner
去更新各个神经网络参数。由于模拟环境的运行通常不方便做并行,actor
一般使用 CPU
。由于 actor
上的策略 μ\muμ 可能不是 learner
中最新的策略 π\piπ ,因此这里使用了不同的符号来表示。
下一步,当训练规模扩大的时候,可以考虑使用多个learner(多块GPU)并且每块GPU配套多个 actor
(CPU)。每个learner只从自己的 actor
们中获取样本进行更新,learner之间定期交换gradient并且更新网络参数,actor也定期从任意learner上获取并更新神经网络参数。(这里有点没搞懂,为啥 actor
会去从别的learner那里拿神经网络参数?参考了[1]还是不明白)
IMPALA中 actor
和 learner
相互异步工作,极大提高了时间利用率。文章还与与batched A2C做了对比,如下图所示。
- a图中,正向传播和反向传播都想凑一批来做(可能是给到GPU来算),因此每一步都需要同步,而模拟环境各步所需时间方差很大,这样浪费了大量的等待时间;
- b图中,只把耗时较长的反向传播凑一批来做,正向传播就给各个
actor
自己做; - 而c图中的IMPALA则完全把
actor
和learner
分开异步进行,这样actor
不用去等待别的actor
,可以尽可能多的做采样,相应地,所作出的牺牲就是每次更新得到的样本变为了off-policy样本。接下来本文提出了V-trace
对于off-policy
样本做修正。
V-trace
算法中需要根据采样到的样本来维护一个状态价值函数 Vθ(x)V_{\theta} (x)Vθ?(x),V-trace的目的是根据采样到的 {xt,at,rt,μ(at∣xt)}\{ x_t, a_t, r_t, \mu(a_t|x_t)\}{ xt?,at?,rt?,μ(at?∣xt?)} 和 当前状态价值函数网络 来给出 当前状态价值函数的一个更好的估计 vsv_svs?(sss 下标表示它是其中的一个样本),这样价值神经网络就可以把它作为一个更新的目标来更新权重。
我们直接写出 vsv_svs? 的表达形式。
它具有如下性质:
-
状态价值函数 Vθ(x)V_{\theta} (x)Vθ?(x) 每次往 vsv_svs? 上更新,最后能够收敛;最后面我们会证明如果有 V-trace 算子 R:V(xs)→vsR:V(x_s) \to v_sR:V(xs?)→vs?,那么该算子是contraction。
-
状态价值函数 Vθ(x)V_{\theta} (x)Vθ?(x) 每次往 vsv_svs? 上更新,收敛到的状态价值函数是介于 VπV^{\pi}Vπ 和 VμV^{\mu}Vμ 之间的某个价值函数,我们记该价值函数为 Vπρ?V^{\pi_{\overline \rho}}Vπρ?? ,该价值函数对应的策略如下所示;最后面我们通过计算V-trace算子的不动点可以得到这个结论。
-
为了避免importance weight发散,我们需要加上相应的上界来避免;参数 ρ?\overline \rhoρ? 决定了收敛到的不动点位置; c?\overline cc 和 ρ?\overline \rhoρ? 决定了收敛的速率。
-
在on-policy的情况下,如果 ρ?≥c?≥1\overline \rho \ge \overline c \ge1ρ?≥c≥1 ,那么 vsv_svs? 就退化为on-policy n-steps Bellman target。