
端到端算法这几年的热度不用我多说。行业里聊自动驾驶几乎绕不开这个话题。从早期模块化方案到如今端到端模型上车技术路线之争背后其实是大家对“自动驾驶最终形态”的认知在变化。但说实话圈内讨论越是热烈噪音也越多。什么“世界模型”“可驾驶空间”“数据闭环”这些词满天飞很多人反而搞不清楚端到端到底解决了什么、代价是什么、落地过程中会踩哪些坑。这篇文章不聊虚的我就从自己做端到端算法研发和部署的经验出发把这几个关键问题掰开揉碎讲清楚端到端算法出现的真实背景是什么全栈端到端和模块化端到端应该怎么选训练数据为什么是真正的主战场以及仿真测试在整条链路里到底扮演什么角色。我尽量用一线从业者的视角来写该给结论的地方给结论该给代码和参数的地方也不含糊。1. 端到端算法到底在解决什么问题很多人把端到端简单理解成“传感器输入控制输出”也就是一个神经网络把感知、预测、规划、控制全包了。这个理解不算错但太表面。要搞清楚端到端为什么火得先看传统模块化方案在量产落地中积累了哪些顽疾。1.1 传统模块化方案的三个死穴传统自动驾驶系统一般拆成感知、预测、规划、控制四个大模块模块之间通过人工定义的接口传递信息。这条路线发展了十几年理论上很成熟车上跑起来也确实稳定可控。但真正大规模路测之后问题就慢慢浮出来了。第一个死穴是信息损耗。感知模块输出的是障碍物列表、车道线、红绿灯状态这些结构化信息但原始传感器里的大量细节——比如路面积水反光、前方卡车正在倒车、旁边行人视线被遮挡后的犹豫——这些信息在结构化过程中就丢失了。你刷到过那种“自动驾驶莫名其妙撞上静止物体”的事故视频很多时候就是目标检测漏检或者跟踪不稳定但更深层的原因是信息在模块传递中被过度压缩了后排的规划模块根本不知道前方有这种情况。第二个死穴是“接口即天花板”。每个模块单独优化可以做到很好但模块之间的接口一旦定死整个系统的能力上限就被锁死了。感知模块要同时满足检测、分割、跟踪、融合多个任务每个任务都要为下游提供最合适的表达但下游真正需要什么感知模块的设计者其实是猜的。规划模块输出的轨迹控制模块能不能跟得上又是一个跨越接口的难题。这种接口割裂导致每个团队都在自己的边界内折腾系统性进步很难发生。第三个死穴是长尾场景无法穷举。传统方案对每个场景都是“感知识别—预测判断—规划决策”的显式流程遇到没见过的场景就要靠工程师写规则去兜底。可真实世界的长尾场景是无穷无尽的三维组合靠人力堆规则是堆不完的。我见过一个团队的规则库里躺着几万个 if-else真遇到“前方路面散落多个轮胎且旁边还有行人”这种组合照样抓瞎。1.2 端到端的定义从感知到执行的连续可导端到端的核心不是“换个网络结构”而是把整条链路变成一个可以联合优化的连续函数。传感器数据进去控制指令出来中间所有环节都由神经网络完成整个系统用同一个损失函数做梯度回传参数一起更新。这样做的好处非常直接第一信息不丢像素级的信息可以直接参与到决策中而不是被压缩成结构化列表第二目标一致整车系统优化的是同一个最终指标比如安全抵达、舒适性而不是各模块独自优化自己的中间指标第三学习能力上限更高只要数据足够多模型可以自己发现人类驾驶员都未必能言说的驾驶规律——比如某些路口的潜规则通行次序。当然我这里说的“连续可导”是一个理想化定义。实际量产系统里大多还保留了一些规则兜底和安全冗余模块后面我会细讲。但思路已经从“分而治之”转向了“全局最优”这是本质变化。1.3 一个类比从“搭积木”到“学开车”我经常给团队里新来的同学打一个比方。传统模块化方案像是把人的大脑切成几块视觉区、听觉区、决策区分开各自训练再由一个“调度主任”把信号传来传去。这种方式的好处是每个区域都能专业化管理但坏处是区域之间的翻译总会失真、延迟。端到端更像是“直接模仿”一个老司机的完整驾驶行为。你坐在副驾看老司机怎么打方向、怎么踩刹车、怎么观察路况然后在脑子里把这些行为映射成一对对的“场景—操作”模式。端到端模型学的就是这个映射不解释为什么但结果就是能开得像样。至于这个老司机脑子里的逻辑模型不需要用规则把它显式写出来而是用海量参数把它“隐式”记下来了。2. 全栈端到端还是模块化端到端两条路线的权衡上面我说的是理想的全栈端到端但现实中还有一个更接地气的方案叫“模块化端到端”。这两个方向困住了不少团队我在这里把各自的技术要点和适用场景讲透。2.1 全栈端到端技术上限高工程难度爆炸全栈端到端的代表性结构一般是“感知编码器 场景 Transformer 规划头”一次性输出运动轨迹甚至直接输出转向、油门、刹车。输入侧可以是多相机画面、激光雷达点云也可以叠加高精地图或者导航信息。全栈方案最大的吸引力在于系统的所有信息都保存在统一的特征空间里模型可以学到跨模块的耦合关系。比如“前车急刹”与“旁边车辆可能变道避让”这两个信息在传统架构里分属预测和感知两个模块在全栈模型里可能只是一个注意力连接的问题。但全栈方案的工程代价非常大。首先是训练数据需求近乎无限一个能稳定跑全栈的模型起步就是几千万甚至上亿个场景片段而且数据分布要足够广。其次模型的可解释性极低出了问题你不知道是感知错了还是规划错了排查成本极高。最麻烦的是安全验证监管和消费者都希望看到“系统为什么这么做”的解释全栈模型在这方面的说服力天然不足。2.2 模块化端到端量产救星真实落地的主流模块化端到端其实保留了传统架构里感知、预测、规划的基本分工但干掉了模块之间的人工接口改为用“可微传递”的方式连接各模块。感知部分仍然输出检测框、轨迹、语义图这些中间表达但下游模块可以直接对上游的中间特征做梯度回传。或者说每个模块内部是端到端训练的但模块之间的接口也可以参与联合优化。这种方案的好处非常务实。第一可以逐步替换传统模块不用一次性推翻所有代码资产第二每个模块仍然可以单独测试、单独部署出了问题还能回溯到具体环节第三数据需求量比全栈小一个量级对算力平台的兼容性也好。我自己的判断是未来两三年内真正能在量产车上跑起来的端到端系统绝大多数会是模块化端到端。全栈方案更适合头部玩家做技术储备和前瞻Demo离大规模交付还差一段距离。2.3 一个关键问题真端到端和伪端到端行业里有一个被频繁混淆的点很多宣称自己做了端到端的团队其实只是把感知部分的检测、跟踪、融合合并成了一个多任务模型后面接的依然是传统规划器。我管这个叫“伪端到端”。它能带来一定的性能提升但本质上还是在搭积木。怎么分辨一个简单的方法是看规划和感知之间是否共享梯度回传。如果你训练规划模块时梯度能流回感知模块的特征提取层甚至原始输入那才叫端到端。如果规划模块只消费感知模块的输出接口不管这个接口是物体列表还是鸟瞰图都只能算是强化后的模块化系统。这个区分非常重要因为团队资源、算法架构、数据策略都会因为这个选择而产生巨大分歧。尤其是在立项阶段你得想清楚自己到底在做一个“增强版模块化”还是一个“真正的端到端”。3. 训练数据才是端到端真正的主战场很多团队上来就研究模型结构注意力全放在 Transformer 怎么搭、注意力机制怎么改、损失函数怎么调上。但以我个人的观察和实践端到端算法开发里花费时间最多、决定上限的从来都是数据。3.1 数据从哪里来真实采集依然是王道端到端模型的能力上限基本由训练数据的覆盖边界决定。真实路采数据永远是最宝贵的因为它包含了真实的传感器噪声、真实的物理规律、真实的交通参与者交互行为。真实采集要做好三件事多传感器同步采集、地理位置和时段的均衡采样、危险场景的定向补充采集。前两件是基本功第三件考验团队的场景挖掘能力。很多团队会从事故报告、路测日志里挖掘高频高风险场景然后定向安排采集车辆去补齐。这套流程行业里叫“增量采集”本质是想办法把长尾概率分布的尾部拉平。我建议自建团队的初期先做一个“数据采集驾驶规范”详细规定城市道路、高速、乡村、雨天、夜晚的采集比例以及跟车距离、变道频率、路口通行等驾驶行为的覆盖要求。这块做扎实了后面模型训练会省非常多的事。3.2 数据闭环从路测故障反推数据需求端到端的训练数据不是一次性采完就结束了而是要形成一个“采集—训练—测试—发现失败—定向补充”的闭环。这个闭环行业里叫“数据闭环”或者“影子模式”。具体流程是这样的量产车或者测试车队在运行过程中会把触发某些条件的原始数据片段自动上传到云端。比如模型预测轨迹和驾驶员实际轨迹偏差大的片段、安全员接管的片段、遇到罕见场景的片段。这些数据是金子因为它们精准地覆盖了模型的失败面。云端的挖掘系统会对这些片段做自动标注、场景分类、难度评估然后决定是直接进入训练集还是先做增强再进入训练集。训练完的新模型会先在仿真环境里做回归通过后再小范围影子测试最后才推给所有车辆。这里提醒一点数据闭环听起来顺理成章但执行起来最大的坑是标注。端到端训练需要的是“行为级标注”也就是不仅要告诉模型障碍物在哪还要告诉它理想的行驶轨迹是什么。这种标注非常贵人工标注一帧可能要几十秒到几分钟不等一个长片段下来成本不可忽视。所以很多团队会想办法做半自动标注先用一个已有模型跑出结果人工只修正错误区域。3.3 仿真数据的作用欧卡2这类模拟器能帮多大忙说到数据就必须聊一下仿真数据尤其是像《欧洲卡车模拟2》欧卡2这类游戏模拟器在端到端训练中的应用。很多人一听“游戏模拟器”就觉得不靠谱但实际用起来它的价值比想象中大前提是你知道它的边界在哪。欧卡2和类似的高保真驾驶游戏可以提供非常丰富的场景不同欧洲国家的道路风格、各种天气条件、昼夜光照变化、卡车特有的低速操控特性。对训练端到端模型初期的“驾驶手感”这类数据极其有效。我们团队早期用欧卡2做了一批数据让模型先学“把方向盘打顺、把车速稳住”效果出奇地好。毕竟端到端模型的前几百轮训练非常容易因为数据分布剧烈变化而震荡先用平滑的仿真数据做“预热”再渐进式混入真实数据训练曲线会稳定很多。但仿真数据也有明显的天花板。第一游戏里的物理引擎和真实车辆动力学差距很大刹车距离、轮胎抓地力、悬挂响应都不完全一致第二游戏里的交通参与者行为规律相对简单和真实驾驶员的随机性、博弈性差得很远第三传感器仿真再逼真也还原不了真实摄像头的噪声和暗光表现。所以仿真数据适合做预训练、做数据增强、做场景补盲但撑不起一个完整的高水平模型。我们团队的实际策略是仿真数据占比不超过训练集的15%且主要用在前半段训练。真实数据的质量和数量才是决定最终表现的关键。3.4 数据配比与采样策略一份可以抄作业的经验很多团队的训练数据一抓一大把但训练出来的模型就是表现不稳。问题往往出在数据配比上。端到端模型的本质是学习条件分布P(行为|场景)如果训练集里的场景分布和真实世界的分布不一致模型在部署后就必然偏。我常用的一个采样策略是“三级配比”。基本盘是普通城市道路和高速数据占比约60%保证模型的基础驾驶能力第二级是难点场景比如复杂路口、施工区、人车混行路段占比约25%提升模型的上限第三级是关键长尾场景比如事故现场、动物横穿、极端天气占比约15%这类数据不求多但求覆盖面足够散。采样的时候还有一个细节不要只按时间采样。很多团队直接每隔一秒采一帧结果发现连续帧高度冗余模型学不到新东西。正确做法是先用场景分类器把整个数据仓库做分桶然后在每个桶内部做均匀采样确保模型能接触到丰富的场景而不是被某一段路的高密度帧“淹没”。4. 训练与调试中的实际问题这一章我罗列几个做端到端模型训练和Debug时遇到的高频问题。这些问题在论文里很少有人写但实操中每一个都能卡住团队好几天。4.1 行为克隆的缺陷复合误差为什么会放大大部分端到端驾驶模型最初都是用行为克隆Behavior Cloning训练的也就是让模型模仿人类驾驶员的操作。行为克隆的思路很简单输入场景输出预测轨迹或者方向盘转角用和人类操作之间的均方差做损失。但行为克隆有一个致命的缺陷复合误差。训练时模型每一步都看到的是人类当时看到的正确场景但部署时模型一旦在某一帧出现了轻微偏差这个偏差会改变下一帧的输入场景而模型从没见过“自己错误操作后”的场景于是偏差会像雪球一样越滚越大。这就是为什么很多端到端模型在仿真里开得好好的一上实车就跑偏。缓解复合误差有几个常用的实操手段。一个是“添加噪声”训练时给模型的输入叠加一些随机扰动让模型学会从偏差状态中自我修正另一个是“多帧自回归”训练时把模型上一帧的输出作为下一帧的输入之一迫使模型学会纠正轨迹还有一个是“数据增强回放”人为生成一些偏移轨迹数据让模型专门学习“回到正确路线上来”的能力。4.2 预测未来轨迹还是直接控制车辆两种输出头的取舍端到端模型的输出头设计基本上有两个流派。第一种是“轨迹规划派”模型输出未来3到8秒的期望轨迹点序列然后交给底层的横纵向控制器去跟踪。第二种是“直接控制派”模型直接输出方向盘转角、油门开度、刹车压力。轨迹规划派的优点是输出的中间量可以被监控、被约束、被后处理校验。工程上可以加一个安全边界检查如果模型输出的轨迹穿过障碍物系统可以拒绝并回退到规则规划器。这大大降低了落地的安全风险。直接控制派的优点是控制链路最短不存在“轨迹跟踪误差”这一环但缺点也很明显——你很难端到端地约束它的安全性出了问题不好兜底。我个人的建议是量产项目优先选轨迹规划派。哪怕模型本身更强也需要留一条规则兜底的退路。仿真测试里如果你发现模型输出的轨迹质量已经很好了直接控制派可以作为一个后续优化的方向但不要拿量产安全赌这个。4.3 损失函数设计不只是让轨迹贴近人类很多人以为端到端训练用的损失函数就是简单的轨迹MSE均方误差其实真实项目中远远不止。我们团队常用的损失由四部分组成主轨迹损失让主预测轨迹贴近人类轨迹、辅助轨迹损失让模型额外预测几条候选轨迹模拟多模态行为、碰撞损失如果预测轨迹与可通行空间边界相交增加惩罚、舒适性损失对轨迹的高阶导数做惩罚让轨迹更平滑。这四部分损失的权重需要反复调而且不同阶段权重还不一样。训练前期碰撞损失权重拉高让模型先学会“不出事”训练中后期舒适性损失权重适当提高让模型学会“开得稳”。这里没有一劳永逸的配方只能靠迭代实验去积累经验。我们的做法是把损失权重做成一个可配置的配置文件方便不同数据集、不同场景快速切换。4.4 记忆灾难与数据覆盖为什么模型会“突然变傻”端到端训练里有个非常诡异的现象模型明明在一个新数据集上表现变好了但在旧场景上却发生了退化。这不是玄学而是经典的“灾难性遗忘”问题。缓解手段有这么几种。一是“混合重放”每次训练时按一定比例混合一部分旧数据确保模型不会忘记旧知识二是“弹性权重固化”对重要的网络权重施加额外的正则化约束让它们更新得慢一点三是“联合蒸馏”用旧模型对新模型做蒸馏把旧模型的输出分布约束住。实战中我比较喜欢“混合重放”因为它实现最简单、效果最稳定。具体操作是把动态数据仓库的旧批次按20%到30%的比例混入每轮迭代新数据占大头但旧数据也不能丢。团队内部把它叫做“三七数据法则”七成新数据推进能力三成旧数据守住底盘。4.5 蒸馏训练把大模型的能力塞进量产模型最后说一个我个人十分推崇的方向蒸馏。由于车端的算力非常有限模型不能太大但云端训练可以用大模型。行业里的主流做法是用一个非常大的教师模型比如几亿参数的视觉Transformer在超大数据集上训练然后把它的知识蒸馏给车端的小模型比如几百万参数。蒸馏的核心不是让教师模型的输出直接作为标签而是让教师模型的“暗知识”传递给学生模型。比如教师模型可能不确定某个场景到底是该左转还是右转但它的输出分布会把这种不确定性表达出来。学生模型学习这种分布会比学习单一确定标签获得更多信息。实操中蒸馏损失一般做成软标签交叉熵加特征对齐损失的组合。软标签交叉熵传递语义信息特征对齐损失让学生模型在中间层也尽量逼近教师模型的特征表达。这两个损失按1比1的比例配比效果通常不会差。5. 测试验证与量产落地别急着吹牛先活过这关端到端模型在仿真和路测里走了狗屎运绝不能代表它就能稳定量产。测试验证体系这块如果建不好再好的模型都不敢往消费者手里放。这一章我把测试设计的关键环节列出来。5.1 利用仿真器和场景库做闭环测试前面提到仿真数据可以用于训练而仿真环境更大的价值在于测试。欧卡2这类游戏模拟器虽然训练价值有限但作为闭环测试的载体它反而是个非常趁手的工具。闭环测试的意思是让模型在仿真环境里连续驾驶跑完整个路线看它能不能安全到达。不同于开环测试给定场景比较模型输出和理想轨迹的差距闭环测试能暴露出模型在连续决策中的复合误差和长期稳定性问题。我们团队的测试流程是这样的先在公开数据集比如nuScenes这类开源数据集上跑开环评测确保基础能力达标然后在自建仿真场景库上跑闭环测试场景库里有几百个精心设计的“魔鬼场景”最后再上实车路测。这个三层关卡的设计至少能把80%的模型问题在进实车前拦下来。5.2 开环评价指标的真实局限很多团队汇报模型效果时喜欢拿“位移误差”“碰撞率”这些开环指标说事。但我要泼一盆冷水开环指标和闭环表现之间的相关性并没有想象中那么高。开环评测的输入是真实驾驶员当时的场景模型输出的轨迹只要和驾驶员轨迹接近就算得分高。但模型在真实驾驶中由于上一时刻自己的操作已经改变了车辆状态下一时刻看到的场景和开环评测时的场景完全不同。所以开环指标更适合做“回归测试”也就是模型迭代后有没有在旧场景上退化而不是用来预测“这个模型上路会不会出事”。真正要评估模型的水平必须做闭环测试让模型和模拟环境互动观察连续表现。5.3 影子模式让端到端模型在后台偷偷“实习”影子模式是目前业内公认的端到端模型最安全的上车验证方式。具体做法是把端到端模型部署在量产车上但它的输出不会直接控制车辆而是和驾驶员的实际操作做对比。如果模型输出和驾驶员操作高度一致说明它学会了如果偏差很大说明它还没学好。影子模式的核心价值在于可以在真实环境、真实车流、真实路况下大规模验证模型而不会造成任何安全风险。配合车队的大规模运营一周就能跑出几十万公里的影子数据这是任何仿真测试都无法比拟的。但影子模式也有一个陷阱统计学上的“幸存者偏差”。驾驶员实际操作未必是最优的有时甚至存在安全风险。如果模型一味模仿驾驶员它可能把一些坏习惯也学进去了。所以影子模式不仅要看“模型和驾驶员是否一致”还要叠加一个“驾驶员操作是否合理”的评估层把不合理的人类操作剔除出去。5.4 量产保障机制独立安全层不能省最后我坚持一个观点无论端到端模型做得多么出色量产车上都必须保留一个独立的、不可学习的规则安全层。这个安全层不做高级决策只做“最后一道防线”。比如检测到前方有静止障碍物且相对速度过大安全层可以直接触发主动制动再比如模型输出的轨迹剧烈抖动安全层可以拦截并切换到底层规则驾驶模式。这么做不是为了否定端到端恰恰相反是为了让端到端能真正走向量产。安全问题的终极责任主体是车企不是模型。一个可解释、可审计、可降级的安全层是监管、消费者、保险方都愿意接受端到端技术的前提。我个人在实际项目中体会最深的一点是端到端算法绝不是一个“模型工程”而是一个“数据工程 系统工程”。很多团队把精力都砸在模型结构上结果数据质量拉胯、测试验证稀烂最后车根本不敢上路。反而是那些把数据闭环、影子模式、安全兜底这些“脏活累活”先做扎实的团队端到端系统能一步一个脚印地往前推进。如果你正准备启动端到端项目我建议你先把数据采集规范和测试验证框架定下来再谈模型——顺序反了后面所有工作都会跟着返工。