Phantom Y
首发于Phantom Y

RoboMaster AI 挑战赛科研思路浅谈

1

RoboMaster AI挑战赛的报名工作就要截止了,到1月18日为止比赛已经吸引了9个国家和地区的60多支队伍报名参赛。队伍报名之后首先要提交技术报告介绍自己队伍的基本情况和参赛的基本思路,优秀技术报告就可以得到组委会的物资赞助。大部分队伍的技术报告都写的很不错,可是因为比赛资金和场地承载能力有限,我们不得不选出25支队伍发放了比赛物资赞助。不管队伍是否获得了赞助,我们都希望大家能够继续研究下去,一起在RoboMaster的平台上探索新的AI技术。


报名工作截止之后,就可以分享一些个人想法给参赛的队伍了。由于我并不是AI方面的专家,这项比赛也暂时没有吸引世界一流的AI研究人员关注(希望我们的参赛选手可以变成世界一流的AI研究人员),所以本文中的讨论都比较粗浅,权当给队伍进行抛砖引玉。


在RoboMaster AI挑战赛中,一台机器人需要执行以下几种智能行为:

1. 移动、旋转

2. 发射子弹打击目标

3. 识别敌我机器人

4. 识别和移动到特定场地区域

5. 与另一台友方机器人配合调整自己的位置

很多队伍都提到了想要用DRL来进行机器人的决策,这确实是近年来的研究热点,也是机器人学非常有希望的方向。但是,在RoboMaster AI挑战赛中应该如何去应用DRL,是一个值得探讨的问题。一蹴而就实现端对端决策能力不仅需要强大的计算能力和蒙特卡洛方法克服局部最优的问题,也需要面对因为放弃传统方法的积累而引发的质疑。


2

由于近年来的人工智能热潮,RoboMaster参赛者们一般会关注深度学习视觉识别、目标追踪这些话题,所以大家都会关注如何能把深度学习技术用到比赛中去。由于深度学习在机器人上的应用基本集中在端对端的控制,所以大家都能想到的研究问题是用端对端控制解决上述1,2和3问题,也就是训练一个神经网络,输入相机看到的图像,直接输出对机器人移动、发弹的控制指令。 为了提高算法的稳定性和预测能力,可能我们需要输入不止一帧图像,而是若干帧历史图像,内部的网络结构也选用LSTM这样能够记忆一些中间状态的网络,而输出量则是控制底盘的电机(4个连续量),控制机器人云台移动的电机(2个连续量)和是否发射的指令(1个离散量),就像下图这样:

然后中间神经网络的训练采用Reinforcement Learning里的policy gradient方式。让机器人在场地中跑动,自主识别、打击对方机器人,如果机器人成功打中对方机器人,那么对方机器人的裁判系统就会记录到击打的数据,这样根据根据裁判系统给出的是否击打成功的数据,机器人就可以获得一个reward。直接把reward当做当时的value function,那么很容易得到一个policy gradient用来调整神经网络的权值,这个算法叫做REINFORCE(Williams 1996)。


RoboMaster相比其他实际环境中的机器人应用的好处是因为我们已经用了好几年的时间来研究机器人裁判系统,所以能够比较便捷地提供训练的数据。虽然如此,大家还是可以想象,这样的训练方法还是很低效的,可能在训练初期,机器人跑一个上午也就成功打中一两次目标。而要训练好这样具有成千上万个参数的大型的神经网络,机器人要积累上百万次打击的数据,先不说积累这么多数据需要多少时间,可能机器人本体都坚持不了运行这么久就会坏掉。


和上述这个算法的思路比较类似的是CMU教授Abhinav Gupta最近的paper “Learning to Fly by Crashing”,目的是用端对端深度神经网络实现多旋翼飞行器的自动避障,为了收集训练数据,他们的飞机炸了11500次。但这还不是全部,因为实际上神经网络的权值是首先用ImageNet的数据集和结果预先初始化过的,所以重头训练的话需要的数据量肯定更大:

3

花了这么多篇幅介绍端对端的算法,也谈了端对端算法训练的难度,另外我觉得,原理上来说,端对端控制并非是机器人的最优决策和控制方式。虽然Berkeley的Sergey Levine和Peter Abbeel等教授用DRL实现了相当出色的机器人控制程序,但是纯靠视觉信息输入的深度神经网络控制器肯定是不符合人类的决策和控制方式的。人抓取一个桌上的杯子,可以靠手眼协调实现,也可以闭上眼睛仅凭指尖的触觉实现,而且两种方式的切换并不存在学习过程。另外神经科学的研究也告诉我们,人类的神经系统中脑和脊髓都能够控制整个身体的运动,许多动作的执行和决策并不经过大脑,这种层级关系说明了端对端控制的非自然性,因此,可能也是被自然淘汰的决策和控制方式。


当然,人类的学习能力必须被机器人所实现,这毋庸置疑,只是需要妥善地平衡机器学习技术和传统方法在一台机器人中的使用范围,使得机器学习技术不需要处理过于高维的输入数据,这样能够避免维数灾难、减少训练所需要的数据量;而传统控制方法也能够减少对模型的依赖和噪声的干扰。两者结合一定是更加高效和稳健的算法。


在MIT教授Russell Tedrake的博士论文(Tedrake 2004b)里,他提供了一种结合增强学习技术和传统控制技术的算法思路,并用来提高Marc Raibert教授的Hopper机器人控制器:

直接把一个传统控制器和一个基于神经网络的控制器的输出相加作为最后给到执行器的指令。他的实验也证明了神经网络控制器能让机器人在一些传统控制器不能起作用的状态下恢复平衡。


这种结合方法有一个显而易见的问题就是两者相加为什么不是加权平均而是等权重的平均。根据两种控制器在不同环境中的适用情况和稳定性给他们不同的权值,应该能够获得更稳定、更连续的表现。

对于传统控制器来说,权值较好确定,如果是简单的PID控制,不管是I项误差过大还是D项误差变化过大,都侧面表现了控制器可能无法收敛或者发生了剧烈的振荡,说明我们应该降低控制器的权值;如果是基于模型的控制方法,那么卡尔曼滤波或者其他的状态观测器都能够通过协方差矩阵或者观测矩阵的性质给出控制器表现的评估,从而给出权值。

但是对于一个神经网络的控制器,我们怎么衡量它当前的控制表现呢?换句话说,一个神经网络输入图片然后可以输出一个结果,但是并不能同时告诉我们它对这个结果的置信度是多少。因此神经网络给出的控制指令,我们并不知道该给这个控制指令多大的权值。我前阵子和CMU的Maxim Likhachev教授讨论过这个问题,一个方法是神经网络前向传播后,看最后一层的连接权值的信息熵,因为层间权值代表了概率,概率越分散说明网络对某一个输出越没有信心;另一个方法也类似,观察某一些特定层之间连接权值的分布。不过这些都只是猜想,并没有合理的实验做验证。


4

相信RoboMaster是一个非常合适研究这个问题的平台。回到RoboMaster机器人的例子,还是为了解决移动、识别目标和打击目标的问题,还是要通过学习的方法,但是平衡机器学习技术和传统方法的使用范围。我们可以设计一个类似Tedrake教授方法的混合控制器,其中传统控制的部分里,算法对相机的图像做特征点提取、模板匹配、几何结构搜索等方法找到目标,然后用卡尔曼滤波等方法估算目标位置做tracking,然后通过PID控制云台的位置然后进行目标击打;机器学习的部分则继续用之前端对端的方式设计一个神经网络控制器,并且采用policy gradient reinforcement learning来学习。两个控制器加权平均作为最后的混合控制器的输出,这个输出的表现由裁判系统给出的是否击打成功的信息评估,并产生reward用于policy gradient的计算:

熟悉policy gradient的朋友可能要问,如果通过policy gradient来学习这样一个混合的控制器,该如何求这个混合控制器的log gradient。幸好,在这个混合控制器的情况下,log gradient中只包含神经网络自己的参数,那么通用的深度学习工具比如Tensorflow和PyTorch都提供了现成的工具计算神经网络的log gradient。


从policy gradient整体的框架上来看,两种控制器加权平均的方法还能让我们通过调整权值来加快神经网络收敛的速度、降低variance。第3节所说想法中,让权值代表控制器的控制表现,这是当控制器实际投入使用时的状态。而在控制器的训练阶段,我们可以让权值代表训练的进度,在刚开始训练的时候,传统控制器权值高,而神经网络控制器的权值低,这样policy gradient的贡献更多地来自传统控制器的结果,收敛速度低,但是variance也会较低,而训练一段时间以后,调低传统控制器的权值,调高神经网络控制器的权值,这样收敛速度会提高,而且网络已经接近收敛,variance还是能保持在较低的水平。


虽然这样做会让神经网络控制器逐步收敛到传统控制器附近的局部最优,很可能这个局部最优比全局最优差不少,但是因为传统控制器已经提供了一个表现不错的击打策略,所以神经网络控制器的收敛速度可以大大加快。我们可以尝试设计不同的传统控制器,用类似Berkeley教授Sergey Levine的Guided Policy Search的办法,来用不同的传统控制器引导神经网络收敛到不同的局部最优,然后比较选择出相对更好的那一个,也就更接近全局最优。


虽然这是一个显而易见的明确研究方向,但是设计一个混合控制器的科研价值远远大于应用价值。它能帮助我们研究如何在实际环境中提高增强学习收敛性,但是我估计混合控制器的表现不会让机器人变得神挡杀神佛挡杀佛战斗力爆表,因为这个混合控制器在整个RoboMaster赛场的层面上看只是一个小小的战术优化:让机器人打得更准,但是整个比赛还涉及到进攻和防御的阵型、方案的决策、机器人之间的协作等等战略问题,单独优化一个射击时的控制器很难直接影响到整个比赛的输赢。


5

如果从整个RoboMaster比赛的角度来说,我们更应该研究如何通过AI算法让机器人具备战略思维。对于这个研究方向我们要设计合适的比赛场景作为研究基础,RoboMaster每年7月的对抗赛并不是最合适的研究平台,因为对抗赛中一支队伍要出场7个机器人,角色和定位各有千秋,比赛场地里也有很多具有战略意义的道具和元素,这项赛事设计的方向是让学生把机器人的性能推到极限,然后通过人和机器人的协作来制定策略取胜,我们很难让RoboMaster对抗赛里的机器人一下变成全自动、自己设计比赛的策略。我们需要有一个更加简单的场景、更少的机器人,这样问题的难度和维数不至于太大。因此RoboMaster组委会设计了RoboMaster AI挑战赛,在一个简单的比赛场地中思考机器人2对2的策略和协作。


在之前的文章里我就提到过:

在过去一年中,我们看到了很多应用深度强化学习(Deep Reinforcement Learning,DRL)解决游戏问题的例子,比如Doom这款著名的第一人称射击游戏就被改造成了一个DRL研究的平台。著名AI科学家 @田渊栋 在专栏里多次提到自己在这个平台上的工作ICLR总结。另外DeepMind和暴雪联合发布了在即时战略游戏《星际争霸2》上的机器学习平台:放浪者:如何评价 DeepMind 和暴雪新开源的星际争霸 2 机器学习平台?。

从我的角度看来,星际争霸2是非常复杂的游戏,现有的机器学习技术和工具,恐怕短期内难以解决这个问题。而且就算解决星际争霸2,从中训练出来的AI可能依然不能应用到实际的机器人系统上。

而RoboMaster比赛中的机器人,则是一个更好的深度强化学习的研究平台。


即使是2对2的简单的场景,而且双方机器人的性能类似,策略也会非常难制定:两台机器人应该一同进攻一台敌方机器人,还是各自进攻一台?满血满子弹情况下策略和已经残血的情况下策略有什么不同?我们由简单到复杂做一些讨论。


如果我们用传统的方法来架构机器人的程序,最自然的方法是通过if-else或者switch-case语句,当血量处于某个范围的时候执行一种逻辑,根据血量变化或者其他状态的变化切换到其他的逻辑。这种程序的逻辑非常便于程序员编写,因为我们可以清晰地把机器人的逻辑组织成状态机,某一种状态中有一套逻辑,也就可以分配给一个人来写。比如下图这样的逻辑,我们把机器人任何时刻的状态归纳到三个模式里,巡逻模式中机器人就是在场地中生成随机的目标点走过去;定点模式就是在发现敌人之后走到敌人的附近;射击模式就是机器人静止,在相机的视野里识别目标然后攻击:

这三个模式,各自都是通过ROS和一些成熟的开源算法能够实现的功能。射击模式中的逻辑就是我们在第4节讲“传统控制”的时候提到的,一些计算机视觉和控制算法的组合。三个模式的逻辑都很容易实现,稍微优秀点的EE、CS、自动化等专业的学生都应该可以在RoboMaster、Robocon这样的机器人比赛里掌握实现逻辑和算法的能力。


上面描述的是一个机器人的逻辑。如果是1对1,两台机器人对抗,两者程序逻辑都是相同的,那么他们的程序应该会在碰面之后一同跳转到攻击模式,然后面对面射击到最后剩下一个,这种情况下毫无策略可言。所以也许我们需要增加一些状态,把射击模式细分成定点射击和一边左右平移一边射击。当自己的血量有优势的时候,定点射击就好,而血量比对方低的时候,就左右平移加射击。


那么当己方队伍有两台机器人的时候,策略该怎么设计?当然我们可以让两台机器人各自都按照上面所说的状态机逻辑独立运行互不干扰。但是我们还是希望机器人可以进行密切的配合,最naïve的办法就是把两个机器人的状态叠加起来,让两个机器人各自的3个状态合并成9个状态,就像下图所示:

可想而知,状态增加以后,状态之间的跳转关系将会平方倍地增加,设计越多的状态,书写状态之间跳转的逻辑将会越加繁杂困难。但是这依然是可解的,因为我们要处理的问题从机器学习的角度看并不复杂,如果我们设计一个“决策神经网络”,输入是机器人现在和过去一段时间的状态以及传感器的信息,输出是即将要跳转的状态,那么这个神经网络的参数还是比一个端对端的控制器少很多。神经网络最后输出的是可能要跳转的状态的概率,我们再用随机数的方法选择一个概率最大的状态跳转过去。比如现在我们处于1号机器人射击、2号机器人巡逻的状态,调用神经网络来确定在当前状态下应该跳转到哪个状态。神经网络会告诉我们0.9的confidence跳转到1号机器人巡逻、2号机器人射击的状态,0.1的confidence跳转到1号机器人射击、2号机器人射击的状态。我们生成0-1之间的随机数,如果随机数小于0.1则按后一种方式跳转,否则就按前者。


对这个神经网络的训练还是可以用增强学习里的policy gradient方法。不过因为一个状态会延续较长的时间段,机器人互相击打的战斗情况很难直接给“状态跳转得是不是好”这件事情提供reward,我们需要在policy gradient里面使用value function而不是直接的reward,这也符合policy gradient theorem最基本的形式(Sutton 1999)。当然Value
function的设计是个比较难的问题,我们需要借用Actor Critic的方法,增加一个对value function的approximation一同训练。


因此,我们就可以把手工编写的状态跳转逻辑用人工智能取代,构成一种“底层控制由传统控制技术实现,而上层决策由AI技术来实现”的双层级控制和决策体系。编写程序的程序员要关注的是一方面是每一个状态内的逻辑用传统的方法来实现,另一方面应用人工智能来简化状态之间跳转的逻辑书写的问题。


上述问题可以为以后更加复杂的多机器人协同任务打下基础。如果我们能用这种方式使得2台机器人在9个状态中间跳转,那也能训练好3台机器人在27个状态中的跳转,甚至更多的机器人。


另外一个有趣的研究方向是,如果两队机器人都使用同一套神经网络训练的方式一边对抗一边累计value function并且进行policy gradient调整,最后两组机器人负责状态跳转的决策神经网络会不会收敛到相同的参数值,或者会不会收敛。这个实验的结果肯定能够让我们对随机系统中神经网络的训练有更多的认识。


6

我感觉上面几个研究的方向,发表2-3篇ICRA、IROS水平的文章应该没有问题,平衡机器学习技术和传统方法的使用范围的研究也许能够深挖一下发发NIPS。


RoboMaster AI挑战赛组委会将在下周发布基于Nvidia Jetson TX2 开发的RoboRTS开源系统框架,为上面这些科研工作和算法的开发提供一个基本的平台,我们借助ROS实现了基本的消息传输框架以及代码组织的框架,由于这个工作主要是代码框架的编写,所以里面的具体功能,包括自动导航和自动射击都没有优化到非常高的水平,不过平台能够让使用者较快地进行AI算法的开发,希望关注RoboMaster比赛的朋友如果有想法的话可以一起在这个平台上努力努力。

发布于 2018-01-19

文章被以下专栏收录