经常看到自动驾驶相关问题下面会有吃瓜群众提出类似于有轨电车难题的问题,我称之为场景A:

一个自动驾驶汽车在自己的车道上行驶,等他发现前面路上有五个人的时候已经很迟了,他只有两个选择:1.不拐弯直接撞上路上的两个人;2.拐个弯撞上在车道旁边人行道上乖乖走的一个人。

场景B则为:

假如我的自动驾驶汽车发现前面路上有10个小朋友在过马路,他只有两个选择,策略1:不顾世俗的非议撞上去保我的命。策略2:同情心爆发拐个弯带着我一起冲到路边的河里面

有这个问题的人通常可能是把强人工智能当作自动驾驶所使用的人工智能,意思就是自动驾驶汽车怎么选择,会综合考虑到法律,道德,同情心,忠诚等等因素。但是在无人驾驶攻城狮眼里,事情并不是这样子的。无人驾驶中的人工智能只是弱人工智能,他根本没有法律道德之类的这些意识。实际上这里的决策问题可以看作路径规划问题,转还是不转就代表着无人驾驶汽车选择了什么样的行走路径。而传统的路径规划问题,无人驾驶在考虑当前周边环境(车道十个小朋友,车道边有条河)以及法律法规甚至伦理道德等所有方面做出决策的过程,实际上就是把这些各个因素用数学表示出来,在这些因素的限制框架下,求解一个最优化问题。也就是说,弱人工智能下的自动驾驶车辆所作的决策,取决于攻城狮实现决策算法的时候是怎么建模的,若果在模型中驾驶员的安全更重要,车就会撞上去;如果模型优化的是总的伤亡人数,车就会冲进去河里。

当然,这里没有考虑端到端深度增强学习训练出来的驾驶策略,也就是输入直接是摄像头的图片,输出就是汽车的行驶策略,没有中间检测行人,建模法律法规道德伦理的过程。至于神经网络内部有没有自己知道那里是行人(以神经网络的检测能力,应该是有的),有没有考虑到法律法规,开发人员是不知道的。就像阿狗下一步下在哪里,没有人知道为什么。另外,这种极其罕见的例子,就算让特斯拉全球几万免费义务测试车不知道是幸运还是不幸运碰见了一次,拿来训练神经网络,对神经网络也没有任何影响,因为跟正常行驶的比起来,数量少太多太多。所以,目前来看,没有自动驾驶车辆会完全采用端到端的训练结果。就算是mobileye也只是把端到端的训练结果作为车道保持算法的输入之一,在卡尔曼滤波的框架下根别的检测结果结合起来。

所以,这里简要的介绍一下,在传统控制或者路径规划算法的框架下,攻城狮怎么建模这个问题,怎么确保他们开发的策略能在人们的法律以及道德伦理的审视下被普遍接受。

法律以及道德的约束,比如双黄线,比如不能撞人,比如撞猪比撞人好等等,在最优控制(optimal control)的框架下都可以转化为约束(constraint)以及损失函数(cost function)。

约束

约束很容易理解,车不能撞人,车不能越过双簧线,车不能闯红灯。

如下图

002adas20170207

假如双黄线的X坐标为0。假设X_auto是车最左边的位置,那么不能越过双黄线这一法律法规用数学的语言表示就是 X_auto >=0。

003adas20170207

同样的,假如车前面有个行人,车和人的距离是d,那么车不能撞人的这一约束就可以转化为d>=0.5(简化起见,不考虑车转弯)。

损失函数

损失函数的概念用在人工智能,自动控制等的方方面面。损失函数的自变量可以是车辆的下一步行为决策以及位置速度等等。损失函数最小是算法的优化目标。具体确定损失函数的形式也需要很多具体知识以及经验以及应用背景。Uber的自动驾驶Taxi可能希望乘客的体验尽可能舒适,那么就可以定为:加速度变化大的决策损失函数大,转弯大的策略损失函数大。而做自动卡车的Otto可能就希望他们跟路上的车啊行人保持尽可能大的距离;对于一个庞大的卡车来说,跟别人保持距离是很必要的,而里面的人(如果有的话)的舒适感就比较次要了,看看柏林发生的就知道了,据说那个卡车上还安装了自动刹车设备。。

004adas20170207

这里假设损失函数就是F(转角速度,加速度。对于Uber和Otto来说,损失函数F的形式不一样,但是自变量都是转角速度和加速度。

所以路径规划或者最优控制解决了这样一个问题,根据法律法规道德规范,制定了一系列的约束;根据厂家开发者乘客等等各种乱七八糟的期望定了一个损失函数。然后用一些数学的方法在以上框架下求最小值,能使损失函数最小的转角速度和加速度就可以看作是自动驾驶汽车下一步的策略。

根据我们日常的驾驶经验,以上算法基本上可以涵盖百分之九十五的情形。但是假如发生了如下情况:

005adas20170207

两边都是双黄线,前面一个人站在路中间等碰瓷,刹车来不及了。我们第一个约束说,双黄线不能越过去;我们第二个约束说,不能撞人。在这种情况下,我们的约束不能被全部满足,数学就叫做infeasible,没有可行解。当然自动驾驶汽车不能说,完了,难得世间两全事,不越双黄不撞人,我不知道怎么办了,你自己看着办吧。。

常见的解决办法,用在深度学习出现之前的王者,支持向量机里面的技巧,就是soft constraint(软约束?怪怪的)。就是说平时一切风调雨顺的时候,所有这些约束都满足;但是问题变得无解的时候,算法可以违背这些soft constraint,当然要付出比较大的惩罚(损失函数值极大增加)。比如说,压双黄线损失函数增加20,撞人损失函数增加10000,那算法当然决定越过双黄线。

据说奔驰做bertha benz无人驾驶测试的时候,算法里面定的是完全不能违反交通规则,也就是硬约束,然后一个场景是一辆卡车停在前面卸货,左边是双黄线,要开过去车必须要部分越线,于是车就停下来了,只能手动驾驶通过。。

所以机器人三大定律的第一定律--机器人不得伤害人类,变得不再是不可违背了,一切取决于当没有满足所有法律法规道德规范所确立的约束条件的可行解的时候,算法中为违反每个约束条件所定下来的损失函数惩罚数值;或者必须要有约束被违背的时候,哪些约束变成软约束,哪些不变。在场景A中,撞人必须成为软约束,如果撞一个人的惩罚是10000,偏离道路的惩罚是100,那策略2的损失函数值是10100;而撞五个人的损失函数值可能是50000(如果考虑叠加的话)。基于损失函数最小的原则,自动驾驶汽车会选择撞上人行道上的人。而在情景2中,很有可能保护车主还是作为硬约束,撞人变为软约束了,无论惩罚值是多少都会选择撞上去。"不计后果的保护主人"听着很拟人化,好像自动驾驶汽车忠心耿耿,其实只是算法里面所定下来的各个约束被违反时的惩罚数值以及转化为软约束的优先顺序所决定的罢了。

更新:好多人说为什么不刹车,好吧,这个是题目设定,刹车来不及了,必须选一个撞。或者可以理解成,刹车的同时还是要选择一个撞。

(作者简介:Kevin Zhong,博世研发工程师。本文经作者授权发表,转载请联系作者本人)

20160630000123