图灵时报·神经任务编程

欢迎大家来到心有麟熙新栏目,《The Turing Times——图灵时报》第一期!该栏目将为大家深入讲解某一篇或几篇相同主题的最新论文,如果有机会的话还会请论文的原作者客串!

本周有幸请到心有麟熙在斯坦福人工智能实验室的师兄Danfei Xu,为大家介绍他在机器人学习领域的论文《Neural Task Programming——神经任务编程》。

1

在越来越强调人机协作的今天,机器人通常在某些特定环境中与人进行长时间的交互并完成人类指派的各项任务。“完成人类指派的任务”这一条听起来简单,但确涉及到了机器人技术里的方方面面。

其中,最重要的一项技能便是如何从人类的教学中学习任务的目标和具体的完成方法。在机器人研究领域这个问题又被称为示范学习(robot learning from demonstration, LfD)

这个问题在80年代就被提出,并迅速成为了领域中最重要的几个开放问题之一。LfD也被广泛运用于工业机器人中。其中LfD技术最完备的公司莫过于RethinkRobotics了,其小型工业机器人产品不仅能与产险工人安全地共享空间,还能通过让人类"手把手"示范学习简单的分拣动作。

但是即使最先进的LfD技术背后也需要大量人为设计的控制逻辑,其复杂程度往往超过了机器人自己"学习"的部分。看到这里你可能会问,现在深度强化学习 (Deep Reinforcement Learning) 的技术那么先进,为什么不给机器人设定一个目标让它自己学习呢?

虽然端到端 (end-to-end) 的深度强化学习在很多方面都表现优异,但是也不乏缺点。其中一个缺点就是深度强化学习的算法每学习一个新的任务都需要一个特定的任务奖励,而且从一个任务中学到的技能也不能很好地转移到别的的任务中。这就好比一个已经学会走路的婴儿在要学习跑步的时候需要从爬行重新学起。再加上深度学习需要大量的数据才不会过拟合 (overfit),让机器人一下子学会多项任务更是难上加难。

我们今天介绍的论文就提出了一种方法可以让机器人快速地从任务示范中学到任务的目标和具体的步骤,并且把一个任务学到的技能用到新的任务中,对于之前没见过的任务还可以做到看一次就学会 (one-shot learning)。

如何做到这一点呢?我们先设想一个需要机器人执行复杂任务的场景。设想一个在仓库里负责分拣和包装的机器人。它需要学习包括分类 (sorting)、包装(packaging) 等一系列具体任务。如果在考虑到不同的对象、排序、子任务的排列组合,当中的变化将会非常复杂,例如,将四类物品分类放到四个快递盒子中,这当中的组合会产生出256个不同的任务!也就意味着如果用普通的增强学习的话我们需要单独学习256种不同的控制策略来完成所有的任务。

但是从另一个角度来想,假设我们想手动编写一个机器人控制程序来解决这个问题我们会怎么做呢?我们会先想到这些任务可以分解为若干个基础动作 (primitive motions),如检测,抓取、移动、放下等,这些动作构成了如抓取和放置等子任务 (sub-tasks)。

根据这些信息学过编程基础的人肯定会想到要用分治 (divide-and-conquer) 的方法来解决问题,比方说给每一个基础动作单独写一套控制程序然后,通过用高层的程序来调用这些程序来完成各个子任务,再由更高层的程序调用这些程序来解决更高层的子任务。

在本作中我们就提出了一种元学习 (meta-learning)的方法叫做神经任务编程 (neural task programming / NTP),NTP 通过神经网络编程 (neural programming) 的方法将已经学会的低等级技能重新组合以解决从未见过的新任务,并且可以通过理解一段任务演示的视频 (task demonstration) 来生成新的闭环控制策略 (close-loop policy)。

2

接下来我们用一张图来简要解释NTP的原理:

NTP神经网络模型的输入有三个:

机器人当前观测到场景 (state observation)

现在正在运行的神经网络程序 (input program)

相关任务信息 (task specification)

输出有四个:

下一个要调用的程序 (output program)

是否停止当前的程序

如果现在调用的程序是一个机器人API,例如抓取,那么输出API程序的参数

如果现在调用的程序是一个神经网络程序,那么对分输入的任务信息进行分割并只输出对于下一个程序有用的部分

会编程的小伙伴可能会发现这个模型模拟了一部分电脑程序的运行逻辑:

用参数调用方程

返回上级程序 (return)

这便是神经网络编程(neural programming) 的精髓 —— 用神经网络来模拟电脑程序执行 。神经网络编程相对于普通的神经网络有诸多优势,例如学习离散操作(discrete operations)。这里就不展开来讲了。有兴趣的小伙伴可以去了解一下NTP的前身NPI (Neural Programmer-Interpreter) 以及神经图灵机 (Neural Turing Machine)。

接下来要介绍的便是NTP思想的重点: 逐层分解任务信息。设想一个NTP程序“抓取"需要通过处理一段视频来理解视频里的任务示范的到底是抓取哪个物品。如果将分类桌上所有物品的整段演示视频都输入给NTP,那么找到相关的信息会非常难。最理想的状况是每个NTP程序只看到和自己相关的那段演示。

如何做到这一点呢?这就要讲到我们之前提到的分治的概念了。每个NTP程序不仅要输出下一个要调用的程序,还要负责把它接收到的任务信息分割并把对于下一个程序最重要的部分提取出来。这样的话NTP便可以把一个复杂的任务演示逐层分解成更简单的子任务,并用相关的控制策略来解决这些任务。

3

在本作中我们着重测试NTP的三种泛化能力:

完成不同的任务目标 (task semantics variation)

用不同的方法完成同3一个任务目标 (task topology variation)

以及处理不同数量的物体的能力 (task length variation)。

我们用三个不同的场景来测试这些泛化能力: 分拣 (sorting), 堆叠 (block stacking), 整理桌子 (table cleanup)。我们分别在模拟器和真实的机器人上做了测试。

测试的结果表明NTP在三项泛化能力的测试总均大幅超过其他方法。

当然邪恶的人类并不会就这么放过机器人的,我们还测试了NTP对于"意外"的应对能力,并证明NTP可以做到闭环控制(close-loop control)。

END

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180225G07R2700?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券