- 标题:An autonomous land vehicle in a neural network
- 发表:Advances in Neural Information Processing Systems, 1989 (NIPS对应的期刊)
- 文章链接:这篇文章1989年的,上古文章了属于是,资源不太好找。第一个链接给出的文章写得很模糊,基本就是大概介绍了一下网络结构,第二个链接的slide讲得比较细致,但是网络结构有点区别。区别主要在于网络输入,文章中的输入包括视觉传感器和激光测距传感器,是一个多模态的设定,而slide中的网络只有一个视觉输入。本文基于slide进行说明,视角倾向模仿学习
- 领域:模仿学习 - 行为克隆方法、端到端自动驾驶
-
前言:虽然这篇文章很老,但是它非常具有开创性。据我所知,这是端到端自动驾驶领域的第一篇文章,其提出的方法也是第一个模仿学习方法(现在看来属于行为克隆方法)。因此,研究自动驾驶和模仿学习的同学应该都会或多或少地听说到这篇文章
-
在此文之前,自动驾驶方法基本都是 rule-based 的
这类基于规则的系统是在理解了整个场景之后,再做决策,涉及到很多相关的子问题,比如说车道线,交通标志的识别,行人检测,信号灯检测,车辆的检测等等,基于规则的方法需要将各种各样的因素全部纳入考虑范围,综合决策,这其实是一件非常困难和复杂的事情。
因此,为了实现自动驾驶,不但要做车道线,交通标志等的视觉识别,还要考虑路径规划等问题,设计规则也很麻烦。所以本文的思想就是不管那么多了,直接用神经网络学一个 image -> action 的映射,也就是所谓的 end2end 系统
1. 网络结构
- 1989年还没有深度学习的概念,更是没有卷积网络什么的,本文采用的也是很简单的浅层神经网络,如下图所示
- 网络输入是一个 30x32 的图像,中间有一个四个神经元组成的隐藏层,输出层由30个神经元组成,其中每个神经元代表一个转向角度
- 可见,这个方法的本质是匹配单步动作,可以把它看做一种行为克隆方法
2. 训练数据采集
- 作者原先想设计一个模拟器,利用一些图形学的方法,可以直接生成各种视角下的公路图像,就好像玩GTA5的第一人称视角那样,因为当时的摄像机分辨率很差,所以对生成图像的质量要求也不高。但是这个系统的开发遇到很多困难,最后放弃了这个思路
- 最后,作者的方案是把摄像机装在真实的车辆上,在行驶过程中直接采集驾驶时可能看到的图像以及人类驾驶员对应的方向盘动作,这个思路直到今天仍在使用。比较特别的一点是,可能因为以前的数据存储成本较高,本文方法没有像现在一样先收集一堆数据再进行学习,而是搞成了一个在线学习的框架,它维护了一个200张图像的epoch,每轮迭代采集并更新一些图像,然后用这个epoch反向传播更新一次网络参数。具体的训练过程稍后再详细说明
3. 损失设计
- 先用输出层的30个神经元的激活程度拟合一个高斯分布,然后取其均值位置作为网络给出的方向盘控制角度。用网络给出角度和驾驶员真实转向角度之差作为loss
4. 学会纠正错误(克服 compounding error)
- 作者注意到一个关键问题:If the human drives perfectly, the network never learns to make corrections when it drifts off the desired track。如果我们只采集维持在道路中心行驶的完美的示范数据,那么一旦自动行驶到道路边缘位置,由于缺乏相应的动作数据,自动驾驶网络就不知道该怎么做了,这时只能利用其泛化能力给出大概的动作,这很可能导致车辆进一步偏航,最后驶离道路
- 由于自动驾驶是一个序贯控制任务,具有马尔可夫性,网络输出的误差都会累计起来,车辆开向道路边缘的情况是不可避免的,这其实就是行为克隆方法共有的级联误差问题(compounding error),为此,必须让自动驾驶网络学会如何从道路边缘恢复到道路中心来,这就要求我们收集大量的 “错误纠正” 样本(即从路边开回中心的数据样本)
- 作者最初的想法很简单粗暴,因为本文方法是一个在线学习方法,所以执行以下三步就能收集到 “错误纠正” 样本了
- Turn learning off temporarily, and drive off course.
- Turn learning back on, and let the network observe the human making the necessary corrections.
- Repeat
- 以上想法基本就是人工开到路边再开回去,显然这种方法是十分危险且低效的。为了解决这一问题,作者提出了另一个方法:数据增广。这也是影响很大的一个想法,从今天模仿学习的角度看,对专家轨迹进行数据增广是件难事,因为扰动专家动作导致的轨迹结果难以估计,而对于本文这种行为克隆方法来说,因为其仅仅做单步动作匹配,打破了轨迹的马尔可夫性,所以可以使用CV中常见的方法进行数据增广,这个思路也是一直沿用到了今天。
如上图所示,作者对每一张最优的真实图像执行若干次随机平移和旋转,然后用一个物理模型计算其对应的方向盘旋转角度,从而实现单步控制数据的增广。
5. 平衡样本类别
- 监督学习中,若样本类别不平衡,那么将会对多数类过拟合,少数类欠拟合,由于作者维护的epoch尺寸较小,就更容易遇到这个问题。距离来说,若车辆在一段时间内一直右转弯,那么epoch中的样本将都被替换为右转的样本,若一直这样更新网络参数,最后训练好的网络就只会右转了
- 为了解决此问题,作者使用以下方法来替换epoch中的旧样本
- Replace the image with the lowest error
- Replace the image with the closest steering direction
6. 训练过程
- Online training details
- Take current camera image plus 14 shifted/rotated variants, each with computed steering direction.
- Replace 15 old exemplars in the 200 element training exemplar buffer with these 15 new ones.
- Perform one epoch of backpropagation learning on the training exemplar buffer.
- Repeat steps 1-3 until the network’s predicted steering direction reliably matches the person’s steering direction.
7. 总结
- 这个简单的自动驾驶网络能实现的效果是:速度0.5m/s,CMU校园,树木覆盖的路面,日落环境下,可以准确行驶400米,证明了端到端学习有形成一个自动驾驶系统的能力
- 由于这篇文章主要是讨论的端到端自动驾驶任务,所以后面花了不少篇幅说明这个简单的神经网络实现了图像特征的自动提取,不过本文主要从模仿学习角度出发,就不再讨论这方面了
- 从 IL 角度看,本文的主要贡献是
- 提出了第一种行为克隆模仿学习方法,说明了监督学习方法有能力解决序贯决策任务
- 作者注意到了 BC 方法的级联错误问题,并提出一种行为克隆方法中的数据增广方法,直到今天仍在使用
- 提出了一种专家数据收集方法,其思想直到今天仍在使用