
你有没有想过,一个让自动驾驶系统冒出一身冷汗的"惊险时刻",到底算不算真的危险?
这事儿比听起来复杂得多。假设有辆自动驾驶车,在变道时和旁边车辆只剩下一秒钟的时间差。这算惊险吗?
答案是:看情况。
如果这是在车流稀疏的高速公路上,车道宽敞、车少,那一秒钟的时间差确实不多见,算是个相当critical的场面。可如果这是在车流密集的拥堵路段,车辆见缝插针地并线simply是家常便饭,一秒钟的时间差甚至可能是家常便饭,根本排不上号。
这就是威斯康星大学麦迪逊分校研究团队在这篇论文里想解决的核心问题:同样一个风险数值,在不同场景下的"吓人程度"完全不一样,而现有的自动驾驶测试场景生成方法,大多没办法精确量化这种相对性。
这件事为什么重要
在自动驾驶车辆真正上路之前,它的软件系统必须经过各种"极端场景"的考验,行业里管这个叫"角落案例"(corner case)测试。
**场景化测试*:把真实或虚拟的交通情况整理成可重复使用的测试案例,用来检验自动驾驶系统在各种状况下的表现是否可靠。
过去几年,学术界已经发展出不少生成这类极端场景的方法。有的专注于制造"信息量大"的罕见事件,有的用对抗性轨迹生成来逼近事故边缘,还有的用扩散模型来控制场景里车辆的运动轨迹和行为模式。这些方法确实能让研究者说"我要一个有特定行为的场景",或者"我要一个风险等级为X的场景"。
但问题来了:这些方法给出的风险等级,往往是一个脱离具体场景上下文的固定数字。就像论文里打的比方,一秒钟的"后车接近时间"(PET,post-encroachment time,后面会详细解释),在稀疏车流里排在历史分布的后三分之一,在密集车流里却超过了中位数。同一个物理数值,在不同场景里代表的"危险程度"天差地别。
这就好比你问一个人"你今天跑了5公里,算不算运动量大"。对一个刚开始锻炼的人来说,5公里可能是极限挑战;对一个马拉松运动员来说,5公里只是热身。脱离了"这个人平时跑多少"这个背景,"5公里"这个数字本身毫无意义。如果测试系统只盯着固定的物理阈值,而不考虑场景本身的"正常水平"是什么,那生成出来的"极端场景"可能在某些历史背景下其实稀松平常,在另一些历史背景下却又太过超纲,测试的针对性和可信度都会打折扣。
研究团队给出的解法,简单说就是:不再用一个绝对的风险数值做测试目标,而是用这个数值在"这段历史对应的所有可能未来"里所处的百分位数(percentile)来定义危险程度。
百分位数怎么用
这篇论文的核心创新,是把"场景有多危险"这件事,转化成了一个概率论里的百分位数问题。
**条件风险分布*:给定一段观测到的历史轨迹(车辆过去0.96秒的运动状态),未来可能发生的风险结果(比如最小后车接近时间)会呈现出一个概率分布,这个分布就叫条件风险分布。
设想一下,历史记录好比天气预报里"今天气压、湿度、风向"这些已知条件,而未来的风险值就像"明天会不会下暴雨"。同一组气压湿度数据,放在不同地区、不同季节,导致暴雨的概率可能完全不同。研究者要做的,就是先搞清楚"在当前这组历史条件下,未来各种风险结果出现的可能性分布长什么样",然后再问:"我想要的这个危险程度,排在这个分布的第几百分位?"
具体来说,论文定义了一个请求参数p,p取值从0到1,数值越大代表越危险。比如p=0.9,意思是"我要一个比90%的自然未来都更危险的场景",对应到统计学语言,就是条件分布里风险最小(最危险)的那10%。
**参考风险分布*:研究团队从真实的高速公路驾驶数据中学习出的一个条件概率分布模型,用来把抽象的百分位数请求p,转换成具体的物理风险目标值(比如0.52秒的PET)。
这个转换过程用到了一个叫"广义逆函数"的数学工具,说白了就是:给定一个百分位数p,去查这个参考分布,看看对应的物理数值是多少。打个比方,这就像班级里按成绩排名,你说"我要排在前10%",老师根据全班历史成绩分布,告诉你"那你至少要考95分"。这个"95分"会随着是哪个班级、哪次考试而变化,但"前10%"这个相对位置的含义始终一致。
如果不这样设计会怎样?论文里做了个对比实验很说明问题。他们测试了几种不考虑历史上下文的方法,比如直接给扩散模型一个固定的风险等级作为条件(这就是对比方法RADE的做法),结果这些场景虽然整体上"更危险的等级确实更危险",但具体到每一个历史场景,它能不能精确落在你要求的那个相对位置上,表现很差,只有14.31%的请求达标。相比之下,论文提出的方法把这个达标率拉到了98.75%。这中间的差距,正是因为"相对位置"和"绝对数值"根本是两回事。
危险到底怎么衡量:PET这把尺子
既然要定义"危险程度",总得有个具体的量化指标。这篇论文选用的是交通安全研究里的经典指标,叫PET。
**PET(后车接近时间,post-encroachment time)*:指一辆车离开某个路面区域,到另一辆车进入同一区域之间所间隔的时间。时间越短,说明两车"擦肩而过"的间隔越短,危险程度越高。如果两车同时占据了同一块区域(也就是说相撞了),PET直接记为0;如果两车压根没有在观测窗口内产生空间冲突,PET就封顶在论文设定的4秒上限。
PET这个指标的巧妙之处在于,它捕捉的是"时间上的擦肩而过",而不只是"空间上靠得有多近"。两辆车可能在空间上离得很近,但只要通过同一个点的时间差得足够大,其实并不危险;反过来,哪怕两辆车从头到尾都隔着一段距离,但如果几乎同时"踩"在了同一块地方,那就是实打实的险情。
论文里用的PET计算方式还有个细节值得一提:它是取自车(ego vehicle)和周围所有车辆(surrounding vehicles,简称SV)之间PET的最小值,也就是说只要有一对车辆产生了危险的交会,这个场景就被判定为危险,这叫"短板效应",符合直觉。
由于PET在0秒(真的碰撞)和4秒(完全没有冲突)这两头都存在"扎堆"的现象,统计学上管这个叫"概率质量点"(point mass,或者叫原子atom),意思是有一堆观测值精确地落在同一个数值上,而不是连续分布的。这给百分位数的定义带来了一点小麻烦:如果好几个不同的百分位数请求,其实对应的都是同一个物理结果(比如"完全没有冲突"这个结果,可能同时满足p=0.05到p=0.3这一整段请求),那该怎么评判这个请求是否"精确实现"了呢?
论文为此设计了一个"兼容区间"的评判标准,简单说就是把每个物理结果对应的,所有"合理"的百分位数请求都圈成一个区间,只要你的请求落在这个区间内,就算命中。这个设计挺贴心的,避免了因为统计上的"扎堆"现象而误判某个本来合理的结果为"失败"。
怎么把一个抽象的百分位数,变成一辆辆具体的车
讲完了"危险怎么定义",接下来要讲的是"场景怎么生成"。这是整篇论文工程量最大的部分,简单说分成两步:先学会预测"这段历史接下来大概率会发生什么风险",再学会"按要求生成符合这个风险水平的具体车辆轨迹"。
第一步,用一个叫"条件概率模型"的神经网络系统,去学习历史交通状况和未来风险结果之间的关系。这个模型有两路输入:一路专门看每辆车自己的运动轨迹历史(绝对运动特征),另一路专门看每辆周围车辆相对于自车的运动历史(相对运动特征)。这两路信息会被融合成一组"关系向量",代表自车和每辆周围车辆之间的互动关系。
**连续分级概率得分(CRPS,continuous ranked probability score)*:一种衡量概率分布预测好坏的评分标准,数值越小代表预测的分布和真实发生的结果越吻合。论文用它来训练参考风险分布模型。
这里有个挺有意思的设计细节:论文把PET可能取值的范围(0到4秒)切成了64个小区间,每个区间都单独用一次"注意力查询"(attention query),去读取前面提到的那组关系向量,从而给出这个区间对应的概率密度。为什么要这么麻烦,而不是让一个模型统一输出整条分布曲线?
论文的解释是,不同风险区间可能要依赖不同的历史线索。比如判断"这段历史会不会导致完全无风险(PET封顶4秒)",可能主要看两车之间的车道差异和速度差;而判断"这段历史会不会导致极度危险(PET接近0秒)",可能更依赖两车瞬时的加速度变化和车距收窄速度。让每个区间都单独"问一遍"历史信息,相当于让模型针对不同的风险程度,各自去挖掘最相关的线索,而不是用一套通用权重硬套所有情况。
实验数据证实了这个设计是有效的:采用这种"分区间查询"策略的模型,比起"一刀切"的静态查询模型,CRPS指标降低了5.47%,而且在最关键的"高危险尾部"区域(也就是对应高p值请求的部分),校准误差从0.04318降到了0.01051,降幅超过四分之三。这说明分区间查询尤其提升了对极端危险场景的预测精度,而这恰恰是自动驾驶测试最关心的地方。
模型学会了预测未来风险的分布之后,还得把这个预测"翻译"成具体的、能跑起来的车辆轨迹。论文用的是一种叫"扩散模型"(diffusion model)的生成技术。
**扩散模型*:一种通过逐步给数据加噪声、再学习如何逐步去噪的方式来生成新数据的深度学习方法,近几年在图像、视频生成领域大放异彩,这里被用来生成车辆的运动轨迹。
扩散模型生成轨迹的过程,有点像往一块橡皮泥上不断揉捏塑形:先从一团完全随机的"噪声"轨迹开始,模型通过50步逐步"去噪",一点点把这团混沌调整成一条合理、符合物理规律的车辆运动轨迹。论文里每辆车的未来加速度,用8个余弦系数来表示(一种紧凑的数学编码方式),这样可以保证生成出来的轨迹起点位置和速度,和观测到的历史完全吻合,不会出现"断档"。
这套系统最关键的创新,在于如何让生成过程真正"听懂"百分位数请求p。论文设计了两条并行的路径:第一条是"学习型条件引导",把p、对应的物理风险目标值,还有描述整条风险分布形状的信息,一起塞进扩散模型的每一层,让模型在生成的每一步都"记得"这个请求是什么;第二条是"采样时风险引导",在扩散过程快结束的最后15步里,实时计算当前生成轨迹对应的PET值,如果和目标值有偏差,就主动调整轨迹的方向,把PET值朝目标"推"过去。
这就好比学做菜和尝味道同步进行。只靠"学习型条件引导",相当于厨师按照菜谱(目标咸淡)下料,但从不尝味道,全凭经验估算;只靠"采样时风险引导",相当于厨师完全不看菜谱,边做边尝,尝一口不够咸就加点盐,直到满意为止。论文做了详细的消融实验,结果发现:只用"学习型条件引导",精确命中率(fine-control rate)只有24.79%;只用"采样时风险引导",命中率能达到95.07%;而两者结合,命中率才冲到98.75%。也就是说,"边做边尝"这个实时调整的步骤,才是精确控制的主力,但"按菜谱下料"打的底子也不能少,它能让"边做边尝"的起点更靠谱,少走弯路。
如果完全不做实时调整,只靠条件输入会发生什么?论文的数据给出了答案:命中率会从98.75%暴跌到24.79%,平均百分位数误差从0.00673飙升到0.16554,足足放大了24倍。这说明单纯告诉模型"我想要什么",模型未必真能精准给出来,必须有一个实时纠偏的机制,不断检查"我现在生成的东西,离目标还差多少",才能真正把控制精度做扎实。
场景生成的"安全阀":道路边界和车辆碰撞约束
光有风险引导还不够,生成出来的场景还得物理上说得通,车不能飞到路外面去,也不能两辆车直接穿模撞在一起(除非这正是你想要的那种极端场景)。
论文在扩散采样的过程中,同步加入了道路边界约束和背景车辆(非主角车辆)之间的防重叠约束。具体做法是在采样的最后几步,用一种叫"二次规划"(quadratic programming,一种数学优化方法)的技术,对车辆的轨迹系数做微调,确保它们始终待在道路可行驶范围内,并且不会和其他背景车辆的车身发生重叠。
实验结果显示,这套约束机制效果相当扎实:在全部3930个生成场景里,没有一个出现背景车辆之间的车身重叠,只有1个出现了主角车和其他车的接触。相比之下,论文对比的几个外部基线方法,背景车辆重叠率普遍在2%到11%之间,有的方法甚至达到11.11%。
实打实的数据:98.75%的命中率说明了什么
讲了这么多设计思路,最终还是要看数据说话。论文的主要实验设置是:从测试集里挑了96段历史记录,每段历史都提出5种不同的百分位数请求(p=0.1、0.3、0.5、0.7、0.9),每种请求用3次不同的随机噪声生成,总共凑出1440次生成请求。
结果是,论文提出的完整方法在1440次请求里,有1422次落在了0.05的百分位数容差范围内,命中率98.75%,平均百分位数误差只有0.00673,对应的物理PET目标误差平均只有0.00991秒,差不多是一百分之一秒的量级。
下面这张对比表,能看出这个成绩在同类方法里有多突出:
| 方法 | 命中率(Fine%) | 百分位数误差 | PET目标误差(秒) |
|---|---|---|---|
| TrafficGen(无百分位数输入) | 16.04 | 0.28665 | 0.14083 |
| CTG++(无百分位数输入) | 14.00 | 0.33789 | 0.19553 |
| STRIVE(无百分位数输入) | 13.06 | 0.31757 | 0.26149 |
| RADE(固定物理风险输入) | 14.31 | 0.31555 | 0.20461 |
| P-CVAE(百分位数输入,但学习不到控制) | 16.25 | 0.32465 | 0.21517 |
| 标准条件扩散模型(百分位数输入) | 17.01 | 0.29226 | 0.15928 |
| **本文方法** | **98.75** | **0.00673** | **0.00991** |
这张表最扎眼的地方是,即便是那些明确接收了百分位数p作为输入的对比方法(P-CVAE和标准条件扩散模型),命中率也只有16%到17%,跟压根不接收百分位数请求的方法几乎没差别。这说明光是"把p塞给模型当输入"这件事本身,根本不足以让模型学会精确控制,必须配合论文里设计的那套实时引导机制才行。
换个角度想这件事:98.75%对17%,这不是简单的"好一点",而是差了将近六倍。如果你是测试工程师,拿着后一种方法生成"90百分位危险场景"的测试用例,实际上你只有不到两成的把握,这个场景真的比90%的自然情况都危险,剩下八成可能是文不对题。这种不确定性放到安全测试里是致命的,因为你根本不知道自己测的是真极端还是假极端。
这套方法迁移能力如何:换个风险指标照样能用
论文还做了一个挺有说服力的扩展实验,把整套框架从PET换成了另一个经典的碰撞风险指标,TTC(time to collision,碰撞时间)。
**TTC(碰撞时间)*:如果两辆车保持当前的相对速度不变,还要多久会相撞。这是跟车场景(车辆排队行驶,没有变道)里最常用的风险指标。
研究者在跟车场景里重新拟合了一个TTC版本的参考分布,然后直接复用原先为PET训练好的扩散生成模型(连训练都没有重新做),只是把"引导"那部分换成了针对TTC的计算逻辑。结果命中率依然达到98.61%,几乎没有损失。
这个结果说明了什么?说明论文提出的"百分位数请求"这套框架,本质上是一个通用接口,不依赖于具体用哪个风险指标。只要换一个新的风险指标,重新训练一个参考分布,再适配一下引导逻辑的计算方式,整套系统就能继续工作。这有点像插座和插头的关系:只要你的设备符合标准插口规格,换一个新电器照样能用同一个插座供电,不需要重新布线。
生成的场景拿去考验真实的自动驾驶决策逻辑
光说生成的场景"risky",还不够有说服力,论文干脆拿这些场景去真刀真枪地考验了一个简化版的自动驾驶决策系统。
**IDM和MOBIL*:IDM(智能驾驶员模型,intelligent driver model)负责控制车辆的加减速,MOBIL(minimizing overall braking induced by lane changes)负责决定什么时候变道。这两个是交通仿真领域非常经典的基于规则的驾驶行为模型,常被用作测试基准。
研究者把这个简化的驾驶决策系统放进生成的场景里,让它替代原本的自车,而周围车辆则按照论文方法生成的轨迹"照本宣科"地开,不会对这个决策系统做出的动作有任何反应(这样设计是为了保证测试场景本身不被决策系统的反应"带偏")。
结果相当直观:在p=0.9(最高危险等级)的场景里,这个简化决策系统急刹车的比例达到12.85%,是观测到的真实自然场景(3.12%)的4倍多;而且有14.58%的场景里,后方车辆直接"追尾"了这个决策系统控制的车。相比之下,p=0.1(最低危险等级)的场景,急刹车比例只有3.82%,接近自然水平,0%出现追尾。
更有意思的是,论文还发现危险往往是在场景的后半段才"爆发"出来的。研究者统计了"后方车辆接近时间小于3秒"这一危险信号出现的时间点,发现在p=0.9的高危险请求下,这个信号大约从场景进行到2秒左右开始冒头,然后持续增长到场景结束;而决策系统的急刹车动作,大多集中在最后1.5秒才发生。这跟现实中追尾危机的发展规律其实很像,危险通常不是一上来就炸,而是慢慢积累压力,最后逼得你不得不猛踩刹车。
这就好比两辆车并排走在高速上,后车一开始只是稍微靠近了点,你心里"咯噔"一下但还没到紧张的地步;可它越靠越近,你的后视镜里它越来越大,等你真正意识到情况不对,留给你反应的时间已经没多少了。如果测试系统只盯着"场景结束那一刻"的风险值,完全有可能漏掉这种"压力逐渐累积"的危险模式,而论文这个实验恰好证明,它生成的高危险场景确实复现了这种真实世界里常见的险情演化轨迹。
写在后面
读完这篇论文,我最大的触动其实不在那个98.75%的命中率数字本身,而在于它提醒我们,很多看似客观的"危险程度"评判,背后都藏着一个容易被忽视的隐含假设,就是默认了"同一个数值,在哪里都一样危险"。这个假设在很多场合其实是错的,不只是自动驾驶测试。
论文里还有个细节我觉得特别值得单独拎出来说。研究者在车辆跟车场景做TTC百分位数实验时发现,因为未来窗口是从历史观测结束那一刻开始算的,所以最小TTC不可能超过"历史结束那一刻的TTC初始值"。这是个很容易被忽略的物理约束,但研究者专门针对这种情况做了处理,把超出这个上限的概率质量,挪到了这个初始值所在的"原子点"上。这种一丝不苟地对待统计分布边界条件的态度,恰恰是一篇工程论文能不能真正落地的分水岭。很多方法栽跟头,往往不是败在核心思路上,而是败在这种容易被嫌麻烦而忽略的细节上。
还有一点让我挺意外的是,论文专门做了实验证明,单纯从现有的几个"自然分布采样器"(比如CTG++、STRIVE这些已有的轨迹生成模型)里,挑出和目标最接近的那一个样本,命中率依然上不去,哪怕采样15次、哪怕用"事后诸葛亮"的方式去挑最接近的那个。这说明这些现有模型的样本本身,压根就没有覆盖到你想要的那个危险区间,不是挑选策略的问题,是采样空间本身就"够不着"。这倒让我想起一个朴素的道理:如果一开始的候选池子里压根没有你要找的东西,再聪明的挑选方法也无济于事。
这篇论文目前主要在highD这一个高速公路数据集上验证,论文作者自己也坦承,城市路口、匝道汇入这些更复杂的交通场景还没覆盖,这些场景里车辆之间的冲突几何形态要复杂得多。另外测试环节里周围车辆是"按剧本不回应"的,真实世界里如果周围车辆会根据自车的反应调整自己的行为,这个"百分位数"还能不能稳定地保持在请求的水平,这是个还没完全回答的问题。
Q&A
Q1:论文提出的百分位数控制方法到底解决了什么问题?
A:它解决了自动驾驶测试场景生成中"危险程度脱离上下文"的问题。同一个物理风险数值(比如1秒的PET)在不同交通场景下代表的危险程度完全不同,这篇论文让测试者可以直接指定"我要一个比XX%的自然情况都更危险的场景",系统会自动根据具体历史场景换算出对应的物理目标,并精确生成符合要求的轨迹。
Q2:这个方法生成场景的精确度到底有多高?
A:在主要评测集的1440次生成请求里,有1422次(98.75%)落在了0.05的百分位数误差容差范围内,平均百分位数误差仅0.00673,对应的物理PET误差平均只有0.00991秒。相比之下,几个主流对比方法(包括直接输入百分位数作为条件的扩散模型)命中率都只有14%到17%左右。
Q3:这套方法只能用于PET指标吗,能不能用在其他风险衡量方式上?
A:不局限于PET。论文做了扩展实验,把同一套框架用在了TTC(碰撞时间)这个跟车场景常用的风险指标上,甚至没有重新训练生成模型,只是换了参考分布和引导计算逻辑,命中率依然达到98.61%,说明这套百分位数请求框架具备较好的通用性,理论上可以适配其他风险指标。
好文章,需要你的鼓励
RGPO用"临时脚手架"破解大模型强化学习的奖励稀疏难题:先让模型独立解题,失败则分段放出标准解法引导重写,仅采纳经验证更优的答案。难题测试准确率从0跃至99.5%,语言模型平均分高出最强基线5.0分。
论文提出用MoE模型的路由器输出作为跨语言对齐目标,通过持续预训练对翻译句对施加路由KL散度损失,在不改变分词和架构的前提下让隐藏表示更接近,并在四个开源MoE模型、七种语言上验证了下游任务性能的一致提升。
DiffGate提出难度门控的教师指导机制,让验证器决定何时需要教师介入,仅对失败且困难的轨迹提供有界教师指导,结合GRPO强化学习,在数学与代码任务上显著提升解题覆盖率与跨领域迁移能力。
研究者用固定不变的16位二进制编码替代传统可训练词嵌入表,在17亿参数规模模型上训练1000亿token,证明模型仍可获得实质语言能力,揭示输入表并非必需,但性能略逊于可学习方案。