使用神经网络驱动的基于模型的强化学习[译]

图1.经过学习的神经网络动态模型能使一个六足机器人学会遵循既定的轨迹运行,并且只需要17分钟的实际经验。

实现机器人在现实世界的自主行动是困难的。真的,十分困难。即使配备昂贵的机器人和世界一流的研究人员,机器人仍然难以在复杂的、非结构化的环境中进行自主地导航和交互。

为什么世界上没有自主机器人呢?因为实现能适应我们世界所有复杂情况的工程系统是极其困难的。从非线性动力学,局部可观测性到不可预测的地形以及传感器故障,机器人特别容易受墨菲定律的影响:任何可能出错的地方都会出错。在解决墨菲定律的办法上,我们选择利用这种失败的可能性,让我们的机器人在失败中进行学习,而不是通过给机器人可能遇到的情况一一进行编程。从经验中学习控制策略的优势是明显的,因为与手工设计的控制方式相比,能够根据更多的数据进行调整和改进。因此,当遇到会发生故障的场景时,尽管机器人仍然会出错,但经过学习的控制器有望在下一次出现类似的情况时纠正它的错误。为了应对现实世界中任务的复杂性,目前基于学习的方法通常会使用深度神经网络。这些应用了深度神经网络的方法很强大,但在利用数据的有效性上却显得不足:这些基于反复试验的机器人仍然会失败。失败两次、三次,并且通常是成千上万次。现代深度强化学习方法的样本无效性是在现实世界中利用学习型方法的主要瓶颈之一。

我们一直在研究用于机器人控制的具有样本高效性且使用神经网络的学习型方法。对于复杂的,接口丰富的模拟机器人以及真实的机器人(图1),我们的方法能使它们仅仅使用它们在环境中随机移动几分钟产生的数据就学会跟随轨迹进行运动的技能。在这篇博客中,我们将概述我们的方法以及实验的结果。更多的细节可以在本文底部列出的研究论文中找到,包括本文使用的代码

样本有效性:无模型与基于模型

从经验中学习机器人技能的方法通常属于强化学习的范畴。强化学习算法一般可以分为两类:第一类,无模型的,即通过学习某种策略或者价值函数;第二类,基于模型的,即通过学习动力学模型。虽然无模型的深度强化学习算法能够广泛地用于各种机器人技能,但它们通常会受到非常高的样本复杂性的阻碍,通常需要数百万个样本才能使机器人具有良好的表现,并且一只能学习一项。尽管在一些之前的工作中,这些无模型算法已经应用于真实的操作任务,但这些算法的高复杂度以及低灵活度已经严重阻碍了他们在现实世界运动技能学习中的广泛运用。

基于模型的强化学习算法通常被认为具有更高的样本有效性。然而,为了达到这一目的,这些算法通常不是采用相对简单的函数逼近器,就是采用概论动力学模型,例如高斯过程,前者不能很好地推广到复杂的任务,而后者虽然能够很好的进行推广,但在复杂的高维领域存在问题,比如具有不连续驱动力的摩擦接触的系统。相反,我们使用中等大小的神经网络作为函数逼近器,这样既可以实现较高的样本有效性,又具有足够多的表现形式可用于各种复杂的高维运动任务的推广和应用。

用于基于模型的深度强化学习的神经网络动力学

我们的工作旨在将深层神经网络模型在其他领域的成功扩展到基于模型的强化学习中。近年来,将神经网络与基于模型的强化学习(RL)结合的努力还没有实现可以和较简单的模型(例如高斯过程)相竞争的结果。比如,Gu等人观察到即使是线性模型在模拟经验生成方面也能获得较好的表现,而Heess等人却发现将神经网络模型纳入无模型学习系统收效甚微。我们的方法之所以有效,依赖于一些关键的决定。首先,我们在模型预测控制框架内使用学习型神经网络模型,因此系统可以不断地重新规划并纠正错误。其次,我们使用相对较短的规划距离,这样我们就不必依靠这个模型对较远的未来进行准确的预测。这两个相对简单的设计决策使得我们的方法能够执行各种各样的运动任务,这些运动任务没有被通用的基于模型的强化学习演示过,所有的操作都基于原始的状态。

我们的基于模型的强化学习方法如图2所示。我们维护一个由我们不断添加内容的轨迹数据集,并用这个数据集来训练我们的动态模型。数据集被随机轨迹初始化。然后,我们通过使用数据集训练神经网络动态模型与用学习型动态模型使用模型预测控制器(MPC)交替进行实现强化学习来收集额外的轨迹添加到数据集上。下面我们讨论这两个组件。

图2.基于模型的强化学习算法概述

动态模型

我们将我们的学习型动态函数通过一些需要学习的权重参数化为一个深度神经网络。我们的动力学函数将当前状态Ťs_t和行为aŤa_t作为输入参数,并输出预测的状态差st + 1- sŤs_{t+1}-s_t。动态模型本身可以在监督学习环境中进行训练,其中收集的训练数据以成对的形式储存,包括输入参数(sŤ,aŤ)(s_t,a_t)和相应的输出内容(st + 1,sŤ)(s_{t+1},s_t)。

请注意,我们上面提到的“状态”可以随着机器人类型变化,并且可以包括诸如质心位置,质心速度,关节位置等元素,以及其他我们选择的可以测量的元素。

控制器

为了使学习型动态模型完成任务,我们需要定义一个对任务进行编码标记的奖励函数。例如,一个标准的“x_vel”奖励使一个任务标记为前进。对于跟随轨迹运动的任务,我们制定了奖励函数,激励机器人靠近轨迹,并沿着轨迹前进。

通过学习型动态模型和任务奖励函数,我们制定了一个基于模型的控制器。在每个时间周期内,规划接下来的HH步的方法是,随机产生KK个候选动作序列,使用学习型动态模型预测这些动作序列的结果,并选择对应累积奖励最高的序列(图3)。然后,我们只执行动作序列中的第一个动作,然后在下一个时间周期重复该过程。这种重新规划的方式对于学习型动态模型中的不准确因素具有较好的鲁棒性。

图3.使用学习型动态模型模拟多个候选动作序列过程的示意图,预测其结果,并根据奖励函数选择最佳动作序列。

结果

我们首先使用各种MuJoCo模拟器评估了我们的方法,包括游泳人,半型猎豹和蚂蚁。图4显示,使用我们的学习型动态模型和MPC控制器,模拟器能够遵循由一组稀疏的导航点定义的路径。此外,我们的方法只用了几分钟的随机数据来训练学习型动态模型,说明其具有较好的样本有效性。

请注意,使用这种方法,我们只用对模型进行一次训练。我们只需要简单地改变奖励函数,就可以在运行时将模型应用于各种不同的预期轨迹,而不需要根据特定的任务单独地进行训练。

图4:蚂蚁,游泳者和半型猎豹跟随轨迹运动的结果。每个模拟器为了执行这些不同的轨迹而使用的动态模型仅被训练一次,并且仅使用随机收集的训练数据。

我们方法的哪些方面对于取得优秀的性能至关重要?我们首先考察了MPC规划距离H的变化对方法的影响。图5表明,如果规划距离太短,性能可能会因为不可恢复的贪婪行为而受到影响。对于半型猎豹而言,由于学习型动态模型的不准确性,如果规划距离太长,性能也会受到影响。图6详细展示了我们的学习型动态模型进行一次一百步预测的结果,显示某些状态元素的开环预测最终偏离了地面运行实况。因此,一个中等规划距离是最好的,既能避免贪婪行为,又能尽量减少不准确模型的不利影响。

图5:控制器使用不同规划距离的任务性能曲线。规划距离太短或者太长都不好。

图6:动态模型的100步正向模拟(开环),显示某些状态元素的开环预测最终偏离了地面运行实况。

我们还改变了用来训练动力学模型的初始随机轨迹的数量。图7显示尽管较高的初始训练数据量能产生较高的初始性能,但是数据聚合同样允许由低数据量初始化的实验达到与其相同的较高的最终性能。这突出显示了强化学习中的策略数据可以如何提高样本有效性。

图7:通过使用不同数量的初始随机数据训练的动态模型获得的任务性能曲线。

值得注意的是,基于模型的控制器的最终性能仍然远远低于无模型学习的控制器(当无模型学习型控制器经过数千倍的经验训练时)。这种次优的表现有时被称为“模型偏差”,并且是基于模型的强化学习(RL)中已知的问题。为了解决这个问题,我们还提出了一个混合的方法,组合基于模型和无模型的学习,尽管这种方法以额外的经验训练作为代价,但却能消除收敛的渐进偏差。这种混合的方法以及其他的分析可以在我们的论文中找到。

学习在现实世界中移动

图8:VelociRoACH的长度为10厘米,重量约为30克,每秒最多可以移动27个身体长度,并且使用两个发动机来控制六条腿。

由于我们基于模型的强化学习算法学习运动步态时需要的经验远少于无模型算法,因此可以直接用真实的机器人进行评估。在其他工作中,我们研究了这种方法如何完全从现实世界的经验中学习,从零开始获取一个微型机器人的运动步态(图8)。

Millirobots是许多应用领域使用广泛的机器人平台,因为其体积小并且制作成本低。然而,控制这些微型机器人是非常困难的,因为这些机器人是欠驱动的,同时又受到功率限制和大小影响。虽然手动控制器有时能很好地控制这些微型机器人,但是它们往往不适于动态演习和复杂的地形。因此,我们使用上面的基于模型的强化学习技术来使VelociRoach微型机器人能够跟随轨迹运动。图9显示,我们的基于模型的控制器经过17分钟的随机数据训练后就可以在高速状态下精确地根据轨迹运行。

图9:使用我们的基于模型的学习方法,VelociRoACH按照各种预定的轨迹运行。

为了分析模型的泛化能力,我们收集了在地毯和聚苯乙烯泡沫塑料地形运行上的数据,并评估了我们的方法,如表1所示。正如预期的那样,基于模型的控制器在与其训练时相同的地形上执行时性能最好,表明模型结合了地形的信息。然而,当使用来自两个地形的数据对模型进行训练时,性能会降低,这可能意味着我们需要开展更多的工作来开发在各种任务设定中均有效的基于模型的学习算法。表2显示,随着训练动态模型的数据越来越多,其性能也在不断提高,这是一个鼓舞人心的迹象,表明我们的方法会随着时间的推移而不断改进(不同于手工设计的解决方案)。

表1:用不同类型的数据进行模型训练以及在不同表面上执行时机器人跟随轨迹运行的性能。

表2:在同样的情况下,使用经过不同数据量训练的动态模型时机器人跟随轨迹运动的性能。

我们希望这些结果展示了基于模型的样本效率机器人学习方法的前景,并能鼓励未来人们这方面的研究。

我们要感谢Sergey Levine和Ronald Fearing的反馈。

这篇文章基于以下论文:

  • 神经网络驱动模型控制欠驱动的腿部微型机器人
    A Nagabandi, G Yang, T Asmar, G Kahn, S Levine, R Fearing
    论文
  • 用于基于模型的深度强化学习的神经网络驱动使用无模型微调
    A Nagabandi,G Kahn,R Fearing,S Levine
    论文网站代码

本文为译文,最初发表在腾讯云+社区,译者(本人)享有版权,转载请联系。

内部区块链的优缺点【译】

我经常转发与银行或大型企业实施的区块链实验有关的新闻,并提出这样的疑问:”他们为什么会在这种内部场景使用区块链呢?“

区块链的作用是取代可信赖的第三方,或者是在不完全相互信任的实体之间建立信任关系,如此看来,内部区块链似乎是矛盾的。

然而,许多公开发布的实验,试验性项目和针对应用的验证性测试都着重于区块链的内部使用案例,即区块链中可能有一个或多个节点,但是都由同一组织控制,且通常局限在一个区域内。

虽然最近有许多对比公有型(非许可型)与私有型(许可型)联盟区块链的讨论,但是却鲜有人思考内部区块链的优点。

一些概念:

公有型(非许可型)意思是任何人都可以对交易进行校验,以及添加新的区块,同时,任何人都可以读取区块链中的数据,例如比特币和以太坊。

私有型(许可型)意思是在区块链中,可以添加区块的实体对象对整个区块链网络的其余部分来说是已知的,并且得到了它们的许可。这种类型的区块链可以分为两大类。第一类即区块链的参与者是同一类型的实体,例如产业区块链。第二类则是内部区块链,即所有区块的添加者都由同一组织控制。


内部区块链实验

使用内部区块链进行实验的主要原因似乎是:

(1)在实施内容与区块链有关的情况下对工作压力和预算的考虑

(2)相比于同外部组织(通常是竞争对手)进行合作,内部设置更加简单

(3)可以亲自动手体验一些最新的技术

以下是一些关于内部区块链解决方案相较于传统数据库的优缺点的想法。我非常欢迎有这方面技术知识的读者,例如数据库管理员,对这些想法进行补充或指正,因为我并不是一个技术专家。


对数据安全的考虑

数据读取

目前,对非区块链式数据库的读取访问往往记录在日志文件中。而区块链的读取特点是,你可以自由地读取区块链中某一节点的数据(通常储存在一个固定的数据库中),只需要通过与其相连的节点。基于区块链的数据库本身并没有任何内置机制可以改善这个问题。因而你仍然会使用日志文件来记录谁读取了你的区块链,所以在这一方面,区块链式数据库和普通数据库的解决方案几乎没有什么差别。

数据写入(添加)

非区块链式数据库通常使用用户名和密码对用户进行身份验证,同时根据用户权限来决定他是否可以写入数据,并使用日志文件记录新数据写入行为。

区块链在添加数据时通常需要额外使用数据签名。数据签名的使用首先在交易层面,其次则是添加区块时(针对私有链)

在交易层面,例如在比特币交易中,你通过在支付信息中添加数字签名来证明你是这笔钱的所有者。尽管用于储存非交易性数据的区块链不需要使用此机制,但是许多用于数字资产转移的区块链都在使用它。区块链节点的软件理论上可以接收来自任何人的数据并将其添加到区块中,而不需要来自数据发送者的数字签名。

在增加区块的层面上,对于私有链的区块添加者来说,一种获取许可的机制就是在要添加的区块上使用数字签名来证明他们的身份,这样其他验证人员就会接受这个区块。但这种情况并不适用于公有链,例如比特币。在比特币区块链中,你完全可以在没有明确表示你是谁的情况下进行挖矿,尽管你的IP地址和你通过挖矿获得的比特币地址都会泄露你的信息。

数字签名能够在人们写入更改时在安全性和不可否认性上添加额外的一层保障。所以区块链能够在数据写入这个方面为数据库增加使用价值。

数据修改或删除

非区块链式数据库通常使用用户名和密码对用户进行身份验证,同时根据用户权限来决定他是否可以修改数据,并使用日志文件记录数据修改行为。

区块链包含许多节点,数据一旦写入,拒绝更改,除非你得到了绝大部分或者所有节点的同意,或者你滥用旨在解决区块创建的同步问题的“最长链规则”。这意味着你可以降低流氓管理员更改历史数据的风险,通过让区块链运行在不同数据中心的节点上,每个数据中心都配备不同的数据库管理团队。如果要更改历史数据(假设私有区块链设定不能在单一节点连续添加多个区块),那么需要多个团队合谋,共同协作才能办得到。

从这方面来看,区块链式数据库比传统数据库更安全。对于没有存档和业务连续性需求的不受监管的对象来说,区块链可能是一个极佳的解决方案。但是对于金融机构来说,频繁地备份以及长期保存这些备份是必须的,因此,不难想象,对于一个银行来说,比较各个备份来检测数据是否发生了更改可能更为直截了当。但是,在这种方式下每个数据库你都需要构建相应的比较方法,区块链则不然,你可以直接获得这种不可变性。


存档和备份

尽管如上所述,区块链不如存档简单,但我可以想象,未来区块链将会代替存档。如果你的区块链在全球范围内有多个复制这些不可变数据的节点,你还需要额外的定期备份吗?


适应性

添加一个新的节点并使其与现有区块链同步是非常容易的。只需要安装相应软件,输入区块链上其他计算机的地址,让它开始下载区块并校验新出现的交易和区块就可以了。在我看来,这比传统企业数据库提供的解决方案更容易操作,也更经济实惠。但也有可能我是错的。


跨境时的数据隔离

区块链在各个节点之间进行数据的复制。如果你的某些数据需要保留在特定的司法管辖区内(例如新加坡的客户数据),那么你需要找到适合的方法来解决这个问题。找到解决方案是相对比较简单的,只需要认真思考一下。这些数据和常规数据库中的客户端数据,以及内部区块链上的交易数据是十分相似的。


数据隐私

是否要考虑交易中的中国墙问题呢?如果需要,鉴于区块链的实现需要不断复制数据,那么使用区块链可能不会是一个好的解决方案。虽然隐私问题可以通过加密来解决,即将密钥安放在需要的地方,但是,数据需要在加密以及保持一定可见性用于校验这两者之间实现动态变化,尤其是交易数据。

思考一下:你在某个区块链中并添加了一些表示A(你)和B(交易另一方)之间交易的数据。同时,C也在这个区块链中。那么,交易数据添加到区块链上后,C就可以看到A在与B通信。此外,C也可以在没有攻破A和B的系统的情况下,用自己的时间尝试解密或者分析所有A和B之间的通信信息。从敏感的商业视角来看,这难道也可以接受吗?


第三方访问

对于为何使用内部区块链,有时我会听到这样的理由:监管机构或审计人员获取访问权限十分简单 – 他们可以很容易地接入区块链并从那里开始获取他们想要的数据。确实如此,但是,让他们从常规数据库中获取数据真的比这个要难吗?

另一个可能更好的理由是互操作性 – 当你希望其他的参与者也可以写入数据时,如果你有一个以区块链形式构建的内部数据库(即添加的数据记录中包含了块哈希的值,并且安装有有一些能够和外界通过对等网络进行交互的服务器软件),那么数据库接入其他参与者会更加简单。但你必须注意那些你与外部参与者共享的数据和元数据(参见上面的数据隐私部分)。


速度

区块链中数据的读取速度很快。同时,鉴于区块链节点复制的数据用传统数据的格式存储,你可以向读取普通数据库一样进行读取。

但如果写入速度对项目来说十分重要,或者你需要处理大量的数据,那么区块链的性能还不如常规数据库。

不过,我经常听到关于比特币区块链交易速度受限问题的担忧。但这种速度受限并不一定会体现在内部的,私有的,使用工作量证明协议的区块链上:内部区块链如果位于具有良好通信能力的数据中心,其交易处理速度可以达到比特币的3倍以上。


结论

尽管最开始我们并没有任何令人信服的理由能说明为什么要在解决内部问题时使用区块链,但从技术的角度来说,两者的结合是有利的。毕竟,这是一次实践,一次试验,是在创新和改良现有的技术以寻求更出色的解决方案。鉴于创建私有型区块链并不需要挖矿开销,也不复杂,在区块链技术还在发展的这个阶段,如果有人问:“为什么要用区块链呢?”,那么正确答案可以是:“为什么不用呢?”

请对上述关于在解决内部问题时使用区块链代替传统数据库的理由发表您的看法!

本文为译文,最初发表在腾讯云+社区,译者(本人)享有版权,转载请联系。