1. 引言
本文介绍一篇OpenAI团队出品,2019年挂在arXiv上,目前还未被任何会议期刊接收的文章:Solving Rubik’s Cube with a Robot Hand。它是上一篇Learning dexterous in-hand manipulation 的续集,上一篇的论文详解请参考: 【强化学习与机器人控制论文 2】基于强化学习的五指灵巧手操作
论文传送门:Solving Rubik’s Cube with a Robot Hand.
此论文最大的亮点为:引入了自动域随机化(Automatic Domain Randomization, ADR)算法,它是一个强大的sim2real迁移算法,通过系统地学习策略,发现有元学习的迹象。
2. 论文解读
2.1 背景
虽然今天存在许多能够解魔方的机器人,但他们都是专门为解魔方而制造的,不能推广到其他操作任务中。而Shadow Dexterous Hand不同,它是一个五指机械手,类似于人手,能进行很多物体的操作。如下图所示,在上一篇论文中,OpenAI团队已经用带有域随机化的强化学习算法,训练它翻转物体(左图);在这篇文章中,通过自动域随机化的方法,来进一步提升操作的鲁棒性,从而能够进行翻转物体(左图)和魔方操作(右图)。
因为魔方有六个旋转的自由度,且机械手是单手操作,所以OpenAI团队将这六种面的旋转等效为两个操作,一个叫rotation。这代表将旋转魔方的一个面,通常指的是魔方的顶面(因为这样单手最好操作),另一个叫flip,这代表对魔方进行整体的翻转,就是上一篇论文里的操作。六个面的旋转一定可以通过有限步的这两个操作完成。论文中将这两个操作又称为two types of subgoals。
解魔方看起来很炫酷,但其实OpenAI用现成软件—— Kociemba 求解器得到了一个被打乱的魔方的求解序列(即很多goals),剩下的就是纯粹的操作问题,即如何让魔方达到这一个个的goal。
因此本文的重点还是如何解决机械手sim2real的问题,从而实现从仿真环境中得到能够直接用于实际机械手的policy,和视觉状态估计器。
2.2 硬件平台和仿真平台的搭建
关于 Shadow Dexterous Hand 的硬件平台在上一篇文章(【强化学习与机器人控制论文 2】基于强化学习的五指灵巧手操作)中已经讲述,这里不再赘述。
由于仅通过视觉的魔方状态感知非常困难,作者对真实魔方进行了改造,在魔方里加入了内置传感器和蓝牙模块,以作为获取魔方状态的手段。
和上一篇文章一样,仿真平台中,物理引擎采用mujoco,渲染采用Unity3D,以生成合成图片俩训练 the vision based pose estimator。
值得注意的是,上一篇文章在仿真环境中并没有用肌腱驱动的方式直接驱动机械手,而用关节驱动的方式来近似。但是在本文中,仿真环境中直接采用了肌腱驱动,这更加贴合实际情况。(这个肌腱驱动的动力学标定和建模是非常困难的,我一直想学习一下这种建模)
机械手的仿真模型如下图所示,绿色的线为肌腱,黄色圆柱为滑轮,滑轮的作用是模拟现实机械手中的耦合关节动力学。
其他关于机械手与魔方在仿真环境中的建模和标定过程,请参考原论文,这里不再讲述,因为工程细节不是我们需要考虑的。
2.3 主要算法框架
整体训练的系统结构如下图所示,大体上分为仿真环境下训练和迁移到实物两步。
其中:
A. 使用自动域随机化(ADR)来生成 随机参数和外观的分布 不断变化 的仿真。将这些数据用于控制策略和基于视觉的状态估计器的训练。
B. 控制策略从随机仿真中接收观察到的机器人状态和奖励,并使用递归神经网络(RNN)和强化学习来学习动作策略。
C. 基于视觉的状态估计器使用从随机仿真中收集的渲染场景作为数据,然后用卷积神经网络(CNN)学习预测魔方的姿态和面角,它与控制策略分开训练。
D. 为了迁移到现实世界,从3个真实的摄像机得到的图像,用CNN网络预测魔方的姿态,并使用3D动作捕捉系统测量机器人指尖的位置。描述魔方内部旋转状态的面角由视觉状态评估器或内置传感器的定制魔方Giiker提供,并将其输入策略网络。
2.4 自动域随机化ADR
正如上一篇文章所述,通过使用Domain Randomization(域随机化)的方式,能够很好地实现 control policy 和 vision model 从仿真到现实机器人的迁移,但是它需要大量的手动调参。本文提出了 Automatic Domain Randomization (ADR, 自动域随机化)的方法,来自动地完成调参过程。
能够想到ADR方法,是基于这样一个假设:在最大化不同分布的环境中进行训练能够导致sim2real的迁移,是因为emergent meta-learning。
更具体地来说,如果一个模型具备一些记忆的结构,那么在部署的时候,它能够根据当前环境,调节它的行为来获得更好的表现,即内在地实现了一个学习算法。作者假设如果这一点想要发生,那就有:training distribution 非常大,以至于模型有限的容量不能够记住某个特定的环境解法。
ADR干的事情就是,自动且逐渐扩展环境参数的分布的随机范围。
ADR算法流程如下图所示(图中的1~5是我标的流程顺序)。ADR控制distribution over environments(环境的分布)。我们从这个分布中采样environments,并使用采样得到的environments来生成 training data,然后使用这些data来优化我们的模型(策略或视觉状态估计器)。我们进一步评估模型在当前environments上的性能,并使用此信息自动更新 distribution over environments。
注意ADR算法只是用于生成training data(因为它改变environments),而不会影响其他的算法模型,因此既可以在策略模型中使用ADR,又可以在视觉模型中使用ADR。
从上图中可以看到,是否更新distribution over environments是取决于第四步的模型性能的,只要模型性能在可接受的范围内,那么环境就会不断地被随机化,这种环境扩展的范围是远超手动调节的域随机化(DR)方法。而这个“可接受的范围”被定义为performance thresholds,对于策略训练来说,它们是一个episode中任务成功数量的上界和下界。对于视觉训练来说,它们是每个输出(位置或姿态)达到目标的百分比。
ADR相比于DR方法,优势有两个:一个是采用课程学习的思想,逐步地增加环境难度;二是免去了手动调节随机化参数的麻烦。
下面讲述ADR算法的理论部分:
环境记为 e λ e_{\lambda} eλ,其中环境随机参数 λ ∈ R d \lambda \in \mathbb{R}^{d} λ∈Rd, d d d 是仿真环境中随机参数的数量(或维度)。在DR算法中, λ \lambda λ 来源于固定分布 P ϕ P_{\phi} Pϕ ,其中 ϕ ∈ R d ′ \phi \in \mathbb{R}^{d^{\prime}} ϕ∈Rd′ ( d ′ d^{\prime} d′是分布参数的数量(或维度),它通常比随机参数的数量 d d d大,比如对于一个一维正态分布来说, d ′ = 2 d^{\prime}=2 d′=2,即均值和方差,而采样的 x x x只有一维,因此 d = 1 d=1 d=1)。
而在ADR算法中, ϕ \phi ϕ 是在训练过程中动态变化的, λ ∼ P ϕ \lambda \sim P_{\phi} λ∼Pϕ,通过在动态的分布 P ϕ P_{\phi} Pϕ中采样来得到一个具体的随机环境 e λ e_{\lambda} eλ.
为了定量化ADR的扩张,作者定义 ADR熵 H ( P ϕ ) \mathcal{H}\left(P_{\phi}\right) H(Pϕ),单位为 奈特/维度(nats/dimension)。
H ( P ϕ ) = − 1 d ∫ P ϕ ( λ ) log P ϕ ( λ ) d λ \mathcal{H}\left(P_{\phi}\right)=-\frac{1}{d} \int P_{\phi}(\lambda) \log P_{\phi}(\lambda) d \lambda H(Pϕ)=−d1∫Pϕ(λ)logPϕ(λ)dλ
ADR熵越高,随机抽样分布越广。ADR熵在后续衡量环境的随机性上有重要作用。
在此篇论文中,作者使用均匀分布来采样随机参数,那么 d ′ = 2 d d^{\prime}=2 d d′=2d,为了后续推导公式的方便,将分布参数 ϕ \phi ϕ拆为两部分,即均匀分布的最小值和最大值,记为 ϕ L , ϕ H ∈ R d \phi^{L}, \phi^{H} \in \mathbb{R}^{d} ϕL,ϕH∈Rd,这样,随机参数的每一维度的取值 λ i ∼ U ( ϕ i L , ϕ i H ) \lambda_{i} \sim U\left(\phi_{i}^{L}, \phi_{i}^{H}\right) λi∼U(ϕiL,ϕiH),注意均匀分布的边界值也包含在内。即分布 P ϕ P_{\phi} Pϕ由下式给出:
P ϕ ( λ ) = ∏ i = 1 d U ( ϕ i L , ϕ i H ) P_{\phi}(\lambda)=\prod_{i=1}^{d} U\left(\phi_{i}^{L}, \phi_{i}^{H}\right) Pϕ(λ)=i=1∏dU(ϕiL,ϕiH)
(注: P ϕ P_{\phi} Pϕ是环境随机参数 λ \lambda λ的函数,我第一次看的时候很难理解这一点,觉得 P ϕ P_{\phi} Pϕ表达式里应该不含 λ \lambda λ,后来我反应过来,这只是针对均匀分布是不含 λ \lambda λ的,但是更一般地,对于其他分布(如正态分布)中肯定是含 λ \lambda λ的, λ \lambda λ就相当于概率密度函数中的自变量 x x x,我们在写均匀分布的概率密度函数通常也是写成: f ( x ) = 1 b − a , a < x < b f(x)=\frac{1}{b-a}, a<x<b f(x)=b−a1,a<x<b,还是会写成 f ( x ) f(x) f(x),尽管它与 x x x无关)
那么ADR熵为:
H ( P ϕ ) = 1 d ∑ i = 1 d log ( ϕ i H − ϕ i L ) \mathcal{H}\left(P_{\phi}\right)=\frac{1}{d} \sum_{i=1}^{d} \log \left(\phi_{i}^{H}-\phi_{i}^{L}\right) H(Pϕ)=d1i=1∑dlog(ϕiH−ϕiL)
(注:这个公式的推导过程为:在 H ( P ϕ ) = − 1 d ∫ P ϕ ( λ ) log P ϕ ( λ ) d λ \mathcal{H}\left(P_{\phi}\right)=-\frac{1}{d} \int P_{\phi}(\lambda) \log P_{\phi}(\lambda) d \lambda H(Pϕ)=−d1∫Pϕ(λ)logPϕ(λ)dλ 公式中, log P ϕ ( λ ) = − ∑ i = 1 d log ( ϕ i H − ϕ i L ) \log P_{\phi}(\lambda) =-\sum_{i=1}^{d} \log \left(\phi_{i}^{H}-\phi_{i}^{L}\right) logPϕ(λ)=−∑i=1dlog(ϕiH−ϕiL),这是一个常数项,可以提到积分号外面。为什么 ∫ P ϕ ( λ ) d λ = 1 \int P_{\phi}(\lambda)d \lambda=1 ∫Pϕ(λ)dλ=1?按理来说 P ϕ ( λ ) P_{\phi}(\lambda) Pϕ(λ)也是常数项,可以提到积分号外面,但是写成 ∫ P ϕ ( λ ) d λ \int P_{\phi}(\lambda)d \lambda ∫Pϕ(λ)dλ更好理解,这就是对均匀分布的概率密度函数在整个定义域的积分,根据概率密度函数的性质,当然等于1)
ADR算法流程如下图所示,首先选择初始的分布参数 ϕ 0 \phi^{0} ϕ0、性能数据池 { D i L , D i H } i = 1 d \left\{D_{i}^{L}, D_{i}^{H}\right\}_{i=1}^{d} {DiL,DiH}i=1d、性能数据池的最大容量 m m m、性能最低和最高阈值 t L , t H t_{L}, t_{H} tL,tH、更新步幅 Δ \Delta Δ. 在每轮迭代中,ADR算法随机选择 λ \lambda λ的一个维度 λ i \lambda_i λi,将其固定为边界值 ϕ i L \phi_{i}^{L} ϕiL 或 ϕ i H \phi_{i}^{H} ϕiH(两者被选中的概率各为50%,作者将其称为"boundary sampling"),然后其它的环境随机参数的值按分布 P ϕ P_{\phi} Pϕ采样得到(这样就得到一个确定的环境 e λ e_{\lambda} eλ)。接着在环境 e λ e_{\lambda} eλ中进行模型性能评估,将性能评估值 p p p放入对应的性能数据池 D i D_i Di中(即:如果 λ i = ϕ i L \lambda_i=\phi_{i}^{L} λi=ϕiL,那么就放入 D i L D_{i}^{L} DiL中;如果 λ i = ϕ i H \lambda_i=\phi_{i}^{H} λi=ϕiH,那么就放入 D i H D_{i}^{H} DiH中)。一旦性能数据池 D i D_i Di的数据量超过最大容量 m m m,那么就计算整个性能数据池 D i D_i Di的平均值,将其与阈值 t L t_{L} tL 和 t H t_{H} tH比较,从而决定分布参数 ϕ i \phi_{i} ϕi是增大一个步幅 Δ \Delta Δ还是减少一个步幅 Δ \Delta Δ。(我个人觉得其内在逻辑是这样的:比如将 λ i \lambda_i λi直接定为 ϕ i L \phi_{i}^{L} ϕiL,而其它的 λ \lambda λ根据均匀分布采样,然后用这样得到的环境去评估,结果发现它比能接受的阈值 t L t_{L} tL还要低,那么就把当前分布参数 ϕ i \phi_i ϕi的值减少一个步长 Δ \Delta Δ,至于 Δ \Delta Δ是正是负,是多少,还需要具体情况具体分析)
如前所述,ADR算法通过总是将一个环境参数固定到一个边界值来修改 P ϕ P_{\phi} Pϕ,但是还未涉及到生成训练数据。为了生成模型训练数据,作者使用算法2从 P ϕ P_{\phi} Pϕ上采样 λ \lambda λ,并在采样环境下运行该模型生成training data 。
为了将ADR与training data的生成相结合,每次迭代作者以概率 p b p_{b} pb执行算法1和以概率 1 − p b 1-p_{b} 1−pb执行算法2。作者将 p b p_{b} pb称为boundary sampling probability。
作者后续对ADR算法进行了分布式的实现。策略网络和视觉网络的ADR算法分布式架构如下所示,高并行和异步实现取决于一些策略或视觉的参数的中心化存储,这些参数包括:模型参数 Θ \Theta Θ, ADR参数 Φ \Phi Φ, 训练数据 T T T,性能数据池 { D i } i = 1 d \left\{D_{i}\right\}_{i=1}^{d} {Di}i=1d。作者使用Redis去实现他们,具体细节大家可以参考论文,这里不再展开。
2.5 实验结果
关于仿真环境中,有哪些参数随机化,大家可以自行参考原论文。关于强化学习中的策略网络架构和视觉神经网络架构也可以参考原论文,架构是基于上一篇论文的,做了一些改进,这里不再展开。
最后将ADR算法用于sim2real后发现,作者用六种方式玩弄机械手,机械手都能很好地完成解魔方的操作,具有较强的鲁棒性。这些扰动情况都是没有在仿真环境中训练过的,但是在实际操作时,机械手确实能够抵抗这种扰动。
作者认为,一个足够多样化的环境与记忆增强策略(如LSTM)相结合,就会导致 emergent meta-learning(浮现的元学习)。作者定义的meta-learning为:学习隐含的马尔可夫决策过程的动力学。作者通过一系列的对比实验来研究用ADR方法训练的策略是否真的有meta-learning的迹象(结论是:确实有。具体过程可以参考论文)。
3. 总结
本文与上一篇论文最大的改进在于提出ADR算法,它是一个强有力的sim2real算法,它能够在实际环境中处理很多仿真环境中没有见过的场景。如果想要做仿真到实际的迁移,可以再细读一下里面的工程细节。