用 PyTorch 单挑全世界,特斯拉是如何实现自动驾驶的?

作者丨Trent Eady

译者 | 夏夜

概要

特斯拉的工程师们正致力于开发一种发展自动驾驶技术的方法,这种方法能够真正适应数据的扩展,而不用因为数据规模扩展而增加工程师的人力。工程师们还在试图尽可能有效地利用打标工人。这意味着要将数十亿英里驾驶过程中出现的计算机视觉错误样本都积累起来。人类输入是一种信号源。人类行为能够告诉机器哪些地方做错了,在一些场景下还能够告诉机器怎样做是对的。不管特斯拉是否会在全自动驾驶技术领域取得成功,但有一点是肯定的,特斯拉会在城市环境中部署半自动驾驶汽车。Andrej Karpathy 是特斯拉(TSLA, https://seekingalpha.com/symbol/TSLA )的 AI 高级总监,他最近发表了一次演讲( https://youtu.be/oBklltKXtDE ),在演讲中,他半开玩笑地揭开了“运营假期”的神秘面纱。这里面的想法是将特斯拉的机器学习流水线自动化,这样所有的工程师就可以度假去啦,而特斯拉的半自动驾驶功能将会自动地继续完善。特斯拉汽车将继续自动上传数据,手动标注数据的工人将继续在必要的地方对数据打标,神经网络将自动地在新数据上进行训练,然后,改进的网络就会被部署到汽车上了。这个过程一直往复循环。

让工程师们去度假只是开玩笑的说法啦,因为总会有事情要做的,创新的脚步绝不会停止。而且,即使整个过程可以完全自动化,明智的做法也是让人们监视这套机制,看看是否如预期那样运转。但是,重点在于自动驾驶(Autopilot)、召唤(Summon)以及其他概念功能的改进都是以自动化方式为主。软件开发传统上是工程师的工作。“运营假期”的目标是让特斯拉的工程师更像是工厂里的工程师。工厂投入运行之前,这些工程师用很长的时间来做大量准备工作。一旦工厂运转起来,就需要大量的非工程师人员来保持其运行。目前仍然需要工程师们来检查机器,并在出现问题时修复系统或者做出改进。但总的来说,工厂的运转是独立于工程师的工作的。相比之下,传统的软件开发流程更像是工程师们亲自来打造产品。

用 PyTorch 单挑全世界,特斯拉是如何实现自动驾驶的?

来自 Andrej Karpathy 的演讲 ppt,它展示了特斯拉的机器学习流程。

特斯拉是想打造一种实现自动化目标的方法,这种方法能够适应不断扩增的数据规模,因为特斯拉拥有全球最大规模的车辆网络来收集数据,这些车辆上配置了传感器和计算机,并且都连入了互联网。这种方法最大的瓶颈就在于支付给标注工人的薪水。在计算机视觉任务中,特斯拉需要不断地把新产生的、手动打标过的照相机数据添加到训练集里,这样才能不断增加算法能力,但这种方式难以适应不断扩增的可收集数据规模,而只能应付这些数据的一个子集,这个子集规模对应于特斯拉能够承受的打标成本。特斯拉也许可以收集 1 万亿张交通灯照片,但是却支付不起同样规模的打标(指将照片中的交通灯标注为红、绿或黄三种颜色)费用。

对于需要手动打标的任务,特斯拉采用的方法不允许纯粹地增加标注数据的数量,而是通过获取更高质量的数据来加速机器学习过程。最有价值的训练数据样本是现有的神经网络模型不能正确预测的样本。也许,这个模型错误预测了物体的类别、误报了一个并不存在的物体,或者漏检了照片上拍到的物体。通过“运营假期”所代表的自动化过程,特斯拉比起其竞争对手来说,能够更多地捕捉到这类有价值的数据样本。

想象一辆特斯拉汽车在自动驾驶导航(属于其自动驾驶技术的一个版本,能够让特斯拉汽车自动切换车道)模式下沿着高速公路行驶。这辆特斯拉自动发起了车道切换程序,但没有注意到相邻车道上来了一辆皮卡。特斯拉汽车里的司机赶紧打了方向盘,退出了自动驾驶模式,取消了车道切换过程。这次人工干预会触发一次快照,快照可能包含一段短视频剪辑,这段视频剪辑将由特斯拉汽车的 8 个照相机、雷达数据、GPS 数据等组合得到。特斯拉的手动标注人员会审查这段视频剪辑,他们会看到特斯拉的神经网络没有检测到这两皮卡,标注人员就会在这两卡车周围画一个 3D 方框,标上“轻型卡车”,然后把标注好的视频剪辑发送到特斯拉总部,包含在训练数据集里。

现在想象一辆特斯拉在完全由人类司机控制的情况下沿着高速公路行驶。突然,特斯拉前面的一辆小型货车司机猛踩了刹车,相应地,特斯拉司机也猛踩了刹车。特斯拉汽车上的计算机自动驾驶软件其实是在默默运行着的,它安静地“观察”着人类司机的行车轨迹,每时每刻都会估算自动驾驶模型会采用同样行车轨迹的可能性。在这种情况下,自动驾驶软件没能够检测到这辆小型货车。在这个自动驾驶软件看来,这位人类司机在空旷的高速公路上猛踩刹车只是很随机的一种行为。于是,它会给这位司机的行车轨迹赋予一个较低的概率;也就是说,自动驾驶软件对这位司机的行为感到“惊讶”。人类司机行车轨迹和机器生成的行车轨迹之间的这种“惊讶”或者说“分歧”,会触发一次快照,然后会上传到特斯拉的数据标注人员那里。(我理解这就是特斯拉“影子模式”的工作方式。)

关于自动驾驶的一件可怕的事情是,当模型错误率变得更低时,你需要更多的错误数据样本加入训练才能让错误率继续减半。随着你的系统产生的错误越来越少,维持系统改良速率所需的错误样本却是越来越多。你需要的错误样本越多,它们就越难收集全。假设 Waymo 已经将严重的计算机视觉错误(例如:导致汽车异常行为的错误,这类异常行为是能被安全驾驶员确认的)降低到了每 1 万英里 1 个错误。(这不是一个真实的数据,只是为了说明问题而虚构的例子。)由于 Waymo 每月大约行驶 100 万英里,所以每月只会产生 100 个严重的计算机视觉错误样本。给这些错误样本打标现在是没问题的,但是要找到它们却是很费劲的。作为对比,我们看下,如果 Waymo 每月行驶 10 亿英里,那每月就会产生 10 万个错误样本。通过这个方式,搜集起来的错误样本数量是随行驶的里程数增加而增加的。

自从 2018 年 11 月发布自动驾驶导航以来的 12 个月内,自动驾驶导航模式下的特斯拉汽车已经行驶了 10 亿英里。平均下来每月行驶 8300 万英里。以后,这个月度数据还会继续增长,因为过去 12 个月里,具有自动驾驶导航功能的特斯拉汽车几乎增长了一倍,所以在接下来的 12 个月里,这个月度数据很可能会增加 50%(假设特斯拉目前的生产速度至少不会下降)。带有自动驾驶 2.0 及以上版本( https://lexfridman.com/tesla-autopilot-miles-and-vehicles/ )硬件的特斯拉车辆目前总共有大约 65 万辆。假设平均行驶里程数和美国人的均值( https://www.fhwa.dot.gov/ohim/onh00/bar8.htm )保持一致,总共的行驶里程数(包括完全由人类司机驾驶以及自动驾驶的里程数)大约是每月 7.25 亿英里。两种行驶模式都给“运营假期”提供了数据,就像以上解释的那样。自动驾驶模式下,人类干预标志着机器产生了错误或者人类司机认为这种情况对自动驾驶来说太难了。在手动驾驶模式下,人类和自动驾驶的“分歧”也标志着机器错误。

到目前为止,我只讨论了人类打标人员在“运营假期”循环流程里的情况。如果我们从流程里不仅移除了工程师,还移除了打标人员会怎样呢?把这整个处理流程都交给机器会怎样呢?

机器学习里令人惊讶的一个发现是,如果你使用了标注质量很差的数据训练时,有时候你可以获得和标注质量很好的数据训练同样的结果,只要你使用的质量较差的数据量是标注质量较好数据的 1000 倍。Facebook 发现( https://engineering.fb.com/ml-applications/advancing-state-of-the-art-image-recognition-with-deep-learning-on-hashtags/ )Instagram 的标签(通常与其对应图片的实际内容仅有微弱的联系)可以用来训练神经网络,这样训练出来的模型能够精确地给物体分类。这里的诀窍是,Facebook 使用了 10 亿张 Instagram 带有标签的图片,几乎实现了和 100 万手动标注的图片同样的精确度。Facebook 还发现了( https://ai.facebook.com/blog/billion-scale-semi-supervised-learning/ ),如果你结合两种图片,相比于单独训练其中任意一种,都能实现更高的精确度。

特斯拉有着 65 万人类司机,这是大量低质量标注数据的来源。在所谓的弱监督方式中(和完全监督方式相对,后者意味着标注人员会以手动的方式精心标注图片),我上面描述的标记数据的操作(用于后续做手动打标),可以被看做是低质量的打标。如果自动驾驶软件本来检测到某处有障碍物,可是人类司机却行驶到了那里,那么这个地方就会被自动标记为无障碍物。相反,如果自动驾驶软件检测到某处十分空旷,可是人类司机却在开到它旁边时停了下来,那这个地方就会被自动标记为有障碍物。这是一种混乱的方式,但这个方式可以用丰富的免费的标签来补充稀缺的、昂贵的标签。(想了解关于这个方式的更多内容,可以阅读这里的研究论文, https://arxiv.org/pdf/1610.01238.pdf )

特斯拉的自动驾驶岗位( https://web.archive.org/web/20190209090339/https://www.tesla.com/careers/job/autopilot-internship-co-opsummer2019-37950?redirect=no )长期以来一直要求候选人“能够设计出一些方法,这些方法除了能够使用丰富多样的标注数据外,还能使用大量轻标注的数据。" 在特斯拉的 Autonomy Day 发布会( https://youtu.be/Ucp0TTmvqOE )上,Karpathy 描述了一种和我之前描述的类似的方法。通过人类驾驶标记的视频剪辑,特斯拉训练了一个神经网络,用来感知和推断前方道路的曲线和坡度(视频可点击:https://youtu.be/v5l-jPsAK7k )。

弱监督学习方法是真正适应数据扩增需求的方法,限制不再是人力成本(包括工程师人力成本和标注人员人力成本),而是道路里程数,通过互联网传输的数据包以及特斯拉总部大量的 GPU。机器学习过程就真的只是一台复杂的机器了,它自行运转,这台机器的零部件能够运转多快,机器学习就能运行多快。而较缓慢的部分则是开发这个流程,和采取办法让它正常运转起来的这段时间。

相比于计算机视觉,“运营假期”能够更加容易地做出预测。当需要预测车辆和行人轨迹时,这里有丰富的免费的高质量标签:即未来。自动驾驶软件会观察一辆车目前的轨迹,在 5 秒之后,这辆车会用这 5 秒内实际走过的轨迹对这段观察进行打标。如果你预测了一位行人要走到哪里去,这位行人马上就会向你展示你的预测精确度如何。于是,系统能够自动发现错误,错误样本也能通过正确的未来轨迹被自动标注。这是绝妙的理想场景。人力不再是束缚,资金不再是束缚;只有车辆和计算机才可能成为束缚。

路径规划也是一个理想的场景。可以运用同样的原理,但是侧重点不一样。规划器试图决定汽车应当采取什么行为。汽车观察到的是完整的驾驶场景,由 8 个环绕的照相机和前置雷达捕捉信息。在手动模式下,神经网络预测特斯拉的人类司机会做什么,如果它预测错了,就会自动标记这个错误(同样的,这是我所理解的“影子模式”)。司机通过他们的行为给观察到的驾驶场景进行了标注。除了是在人类司机干预的情况下标记错误样本,自动驾驶模式和手动模式的原理是相同的。这个方式即所谓的模仿学习,最近被 DeepMind 团队用于训练神经网络( https://twitter.com/OriolVinyalsML/status/1189619408894717953?s=20 ),这个网络可以玩《星际争霸》,而且比 70% 以上( https://www.rankedftw.com/stats/leagues/1v1/#v=2&r=-2&sx=a )的人类玩家都玩得更好。Waymo( https://link.medium.com/4gThWBM4v1 )也在挖掘模仿学习的潜力,自动驾驶汽车初创公司 Aurora( https://slideslive.com/38917949/the-promise-and-challenge-of-ml-in-selfdriving?locale=cs )也很喜欢这类方法。(但是,Waymo 和 Aurora 不像特斯拉这样有着 65 万规模的人类司机,这些司机能够提供大量的训练数据)

所以总结起来,我认为“运营假期”有四大支撑优势:

自动标记计算机视觉错误,它们稍后会被上传并且被手动标注(完全监督学习)。当人类司机退出自动驾驶模式,或者在手动模式下,自动驾驶规划器与人类驾驶的行车轨迹出现“分歧”(或者令人“惊讶”的情况)时,都会将其标注为错误。使用从人类司机行为中获取的低质量标签,实现照相机数据的自动标注(计算机视觉的弱监督学习)。当计算机视觉神经网络和人类司机产生“分歧”时(这个分歧也导致了自动驾驶生成了不同于人类司机使用的行车轨迹),训练样本会被上传。针对预测的自动标注。未来事件能够标注过去的事件,并能显示预测的错误。针对规划的自动标注。人类驾驶行为提供了标签。当自动驾驶还在激活状态时,如果人类干预了,或者在人类和自动驾驶规划者之间产生了“分歧”,就会认为出现了错误。预测和规划是通过计算机视觉方法来追踪物体轨迹并观察行驶场景的。计算机视觉错误可能会引起预测和规划失效。所以,为了使其他部分实现最优运转,必须修复计算机视觉错误。

反过来说,预测或规划错误可能会触发视频剪辑的上传,即便没有产生任何计算机视觉错误。这类没有正确标记的视频剪辑会增加人类手动审查的工作量。因此,减少预测或规划方面的错误能够节省标注人员的时间,好让他们聚焦在计算机视觉方法产生的错误上。通过改进视频自动标记的精确度,可以帮助加快计算机视觉功能的进展速度。

特斯拉开发的方法正在尽可能地实现在数据规模扩增时,对人力扩增的需求减到最少,他们的工程师也因此站在了大规模自动驾驶机器学习的最前沿。自动的错误标记可以提升标注人员的标注效率。模仿学习的使用减少了工程师投入到路径规划算法上的工作量;与其费力地手动编码每一种驾驶行为,还不如让算法从数据中自动学习这些行为。考虑到特斯拉汽车每月 7.25 亿英里的驾驶里程,自动驾驶领域里还没有先例能用来判断特斯拉的方式会有怎样的效率。

一些怀疑论者认为完全解决计算机视觉问题是不可能的( https://tinyurl.com/zooxctotesla )。也许是这样吧。但除非它真的发生了,否则我们无法确定。

开发一个每 100 英里就失效一次然后需要人类干预的 2 级( http://cyberlaw.stanford.edu/files/blogimages/LevelsofDrivingAutomation.png )自动驾驶系统, 要远比开发一个每 100 万英里才失效一次的 4 级或 5 级自动驾驶系统容易得多。即使特斯拉离全自动驾驶的目标还很远,但几乎可以肯定的是,特斯拉将会开发出能够在城市街道上行驶的 2 级自动驾驶系统。在对未来的展望中,挥之不去的主要问题是,随着机器错误发生得越来越少,司机是会仍然保持警惕并在必要时干预自动驾驶机器呢,还是会被引入一种错误的安全感呢。特斯拉可能需要实施司机监控系统,确保司机随时集中注意力。朝向司机安放的照相机和已有的方向盘扭矩传感器,这两者的组合可能会比单独使用扭矩传感器更加有效。

对特斯拉来说,超级乐观的前景是它最终开发出来了全自动驾驶系统,部署了机器人出租车。在这样的局面下,特斯拉的市场份额即使不能十倍( https://raw.githubusercontent.com/ARKInvest/ARK-Invest-Tesla-Valuation-Model/master/Tesla%20Valuation%20for%20Github_5.27.19_v3.5.xlsx )地增加,也可以大致增加两倍或者三倍( https://www.cnbc.com/2019/09/27/waymo-valuation-cut-40percent-by-morgan-stanley-to-105-billion.html )。稍温和的乐观局面会是特斯拉为城市驾驶发布了 2 级系统,特斯拉也非常棒地卖出了更多汽车和更多的“全自动驾驶”附加组件单元。销售增长和汽车毛利率是投资者密切观察的两项关键指标;特斯拉的城市 2 级系统能够给这两项指标都带来超预期的贡献。(Andrej Karpathy 的演讲视频请点击:https://youtu.be/oBklltKXtDE ,视频中他描述了“运营假期”)

利益相关:我 / 我们是 TSLA 长期合作伙伴。我自己创作了这篇文章,本文表达了我的个人观点。我们没有因此接受任何经济酬劳(除了来自 Seeking Alpha 的稿费)。我与文中提及了股票的所有这些公司都没有业务关系。

点个在看少个 bug