小马智行自动驾驶规划算法面试经历:行为预测+运动规划+决策全考察
2年自动驾驶规划经验,详细复盘小马智行三轮技术面试:一面行为预测与深度学习、二面运动规划与Lattice Planner、三面决策系统与项目深挖,含真题汇总与心得建议
背景介绍
先说下我的情况吧,我是在另一家自动驾驶公司做了2年规划算法工程师,主要做行为预测和运动规划这块。说实话,小马智行一直是我心目中的白月光,毕竟在国内自动驾驶公司里,小马的技术实力和落地进度都是顶尖的。今年年初看到他们在招规划算法工程师,我毫不犹豫就投了。
投简历之前我其实挺忐忑的,因为虽然做了2年规划,但主要是在结构化道路上做,复杂场景的经验不算特别多。但转念一想,不试试怎么知道呢?于是花了两周时间把行为预测、运动规划和决策相关的知识点都过了一遍,尤其是Lattice Planner和基于学习的预测方法,这些是重点中的重点。
整个面试流程是三轮技术面+一轮HR面,下面我详细复盘每一轮的面试内容。
面试流程复盘
一面:行为预测+深度学习
一面是个看起来很年轻的工程师,后来知道是预测组的,人很nice。开场先让我自我介绍,然后直接进入技术环节。
他先问了我当前项目里行为预测是怎么做的,我详细讲了我们用的基于意图的预测框架:先做意图分类(左转、直行、右转),再根据意图生成轨迹。他追问了几个问题:
1. 意图分类的准确率怎么样?误分类的后果有多严重?
我说意图分类的准确率大概在85%左右,误分类确实会导致规划出的轨迹不安全,所以我们会在规划层做一个safety check,如果预测轨迹和规划轨迹有冲突,会触发紧急避障。他点了点头,似乎对这个回答还算满意。
2. 你们有没有考虑过用端到端的方法做预测?
我说我们尝试过用Social GAN做轨迹预测,效果还行但可解释性太差,在安全关键场景下不敢用。后来改成了基于规则+学习的混合方法,规则负责处理确定性高的场景,学习负责处理不确定性高的场景。
接下来他开始问深度学习的基础知识:
3. Transformer在序列预测中的优势是什么?
我说主要优势是能够捕捉长距离依赖关系,而且可以并行计算,比LSTM快很多。在行为预测中,我们用Transformer来编码周围车辆的历史轨迹,效果比LSTM好了不少。
4. 你们训练预测模型的时候,loss function是怎么设计的?
我说我们用了多任务loss,包括意图分类的交叉熵loss和轨迹回归的ADE/FDE loss,还加了一个多样性loss来鼓励模型生成多样化的预测轨迹。他追问多样性loss具体怎么实现的,我说是基于GMM的,每个mode对应一个高斯分布,用负对数似然作为loss。
5. 如果预测结果和实际行为偏差很大,你们怎么处理?
我说我们有一个在线监控系统,如果预测偏差超过阈值,会触发重新预测,同时规划层会切换到更保守的策略。另外我们也会把这种case收集起来,加入训练数据。
一面大概聊了1个小时,面试官最后说"基础还不错",让我等二面通知。
二面:运动规划+Lattice Planner
二面是个资深工程师,一上来就问运动规划,气氛明显比一面紧张不少。
1. 先说说你对Lattice Planner的理解?
我说Lattice Planner的核心思想是在状态空间中采样一组候选轨迹,然后用cost function评估每条轨迹,选择cost最低的。关键点在于采样策略和cost function的设计。采样太密计算量大,太疏可能错过最优解;cost function需要综合考虑舒适性、安全性和交规遵守。
2. Lattice Planner和RRT Star有什么区别?
我说Lattice Planner是在离散化的状态空间中搜索,而RRT Star是在连续空间中随机采样。Lattice Planner的优点是轨迹质量可控,缺点是状态空间离散化可能丢失一些好的解。RRT Star的优点是概率完备,缺点是轨迹可能不够平滑,需要后处理。
3. 你在实际项目中怎么处理动态障碍物的?
我说我们用了时空A*算法,把时间作为第三个维度加入搜索空间。对于动态障碍物,根据预测轨迹在时空图中标记占用区域,搜索时避开这些区域。他追问这样计算量会不会太大,我说确实会,所以我们做了一些优化,比如只在障碍物周围一定范围内做时空搜索,远处用静态规划。
4. 说说你对Frenet坐标系的理解?为什么在自动驾驶规划中常用?
我说Frenet坐标系是沿参考线建立的曲线坐标系,纵向用s表示沿参考线的弧长,横向用d表示偏离参考线的距离。在自动驾驶中常用的原因是:道路本身是弯曲的,用笛卡尔坐标系描述车辆在道路上的位置不太直观,而Frenet坐标系天然适合描述车辆在车道上的纵向和横向运动,而且可以将3D规划问题解耦为纵向和横向两个1D问题。
5. 横向规划和纵向规划怎么协调?
我说我们用的是交替优化策略:先固定纵向轨迹优化横向,再固定横向优化纵向,迭代几次直到收敛。另外在高速场景下,横向和纵向的耦合比较弱,可以独立规划;但在低速场景下耦合较强,需要联合优化。
6. 你们规划出来的轨迹怎么保证是动力学可行的?
我说我们在采样端就做了约束,只采样满足车辆运动学约束的轨迹(最大曲率、最大加速度等),而不是采样完再检查。这样虽然采样空间小了一些,但可以保证每条候选轨迹都是可执行的。
二面聊了大概1小时15分钟,面试官问得非常细,有好几个问题我答得不太好,尤其是时空A*的优化细节,我说得比较模糊。面完心里有点慌。
三面:决策系统+项目深挖
三面是规划组的tech lead,气场很强。他先让我详细讲了一个我做过的最有挑战的项目。
我讲了我们在复杂路口的规划项目,包括如何处理多车交互、如何处理行人突然闯入等。他问了几个很深入的问题:
1. 你们的决策系统是怎么架构的?
我说我们用的是分层决策架构:最上层是导航决策(走哪条路),中间层是行为决策(跟车、变道、让行等),最底层是运动规划。行为决策层用的是有限状态机+规则,状态包括跟车、变道准备、变道执行、紧急停车等。
2. 有限状态机的状态爆炸问题怎么解决?
我说确实会遇到状态爆炸的问题,尤其是场景复杂的时候。我们的做法是把状态分层,高层状态处理抽象行为,低层状态处理具体动作。另外,我们也在探索用强化学习来替代部分规则,但目前在安全关键场景下还是以规则为主。
3. 如果决策和规划的结果冲突了怎么办?
我说我们有一个仲裁机制:如果规划层发现决策层给出的行为不可行(比如变道但旁边有车),会反馈给决策层重新决策。如果时间来不及,规划层会执行一个fallback策略(比如保持当前车道跟车)。
4. 你们怎么评估规划系统的整体性能?
我说我们有一套评估体系,包括仿真评估和实车评估。仿真评估主要看通过率、舒适性指标(加速度、jerk)、安全性指标(碰撞率、TTC);实车评估主要看接管率、人工干预次数。他追问仿真和实车的一致性怎么样,我说大概70%左右,主要是仿真中行人行为不够真实。
5. 你觉得当前规划系统最大的瓶颈是什么?
我说我觉得最大的瓶颈是预测和规划的耦合。目前预测是先做预测再规划,是串行的,但实际上预测和规划是相互影响的——我的规划行为会影响其他车的行为,其他车的行为变化又反过来影响我的规划。这个问题不解决,规划系统永远做不到人类司机的水平。
三面聊了1个多小时,面试官明显对技术深度要求很高。最后他问我有什么问题,我问了小马在行为预测方面最新的进展,他简单说了几句,感觉他们也在探索预测和规划的联合优化。
真题汇总
行为预测部分:
1. 基于意图的预测框架怎么设计?意图分类准确率如何提升?
2. 端到端预测方法的优缺点?在安全场景下怎么保证可解释性?
3. Transformer在序列预测中的优势和具体应用?
4. 预测模型的loss function设计(多任务loss、多样性loss)?
5. 预测偏差大时怎么在线处理?
运动规划部分:
6. Lattice Planner的核心思想和关键参数?
7. Lattice Planner vs RRT Star的区别和适用场景?
8. 动态障碍物在时空图中的处理方法?
9. Frenet坐标系的理解和优势?
10. 横向规划和纵向规划的协调策略?
11. 如何保证规划轨迹的动力学可行性?
决策系统部分:
12. 分层决策架构的设计?
13. 有限状态机的状态爆炸问题?
14. 决策和规划的冲突处理机制?
15. 规划系统的评估体系?
16. 预测和规划的耦合问题?
心得建议
1. 基础一定要扎实:小马的面试非常注重基础,不管是深度学习还是规划算法,都会从最基本的概念问起,然后逐步深入。如果你的基础不牢,很容易在追问中露馅。
2. 项目经验要能讲清楚:面试官会围绕你的项目问很多细节,包括为什么这么做、有没有考虑过其他方案、遇到什么问题怎么解决的。所以一定要对自己的项目非常熟悉,不能只讲个大概。
3. 了解行业最新进展:面试中会问到一些前沿方向,比如预测和规划的联合优化、端到端规划等。如果你能说出自己的理解和思考,会加分不少。
4. 不要怕说不知道:有几个问题我确实不太清楚,直接说了"这个我不太了解",面试官也没有为难我,反而会换个角度引导我。装懂被拆穿才是最尴尬的。
5. 准备时间建议2-3周:如果你有2年左右的相关经验,2-3周的集中准备应该够了。重点复习规划算法(Lattice Planner、A*、RRT)、行为预测(意图分类、轨迹生成)、深度学习基础(Transformer、Loss设计)。
FAQ
Q:小马智行的面试难度怎么样?
A:说实话挺难的,尤其是二面和三面。一面偏基础,二面偏算法深度,三面偏系统设计和项目经验。整体难度我觉得在自动驾驶公司里属于第一梯队。
Q:面试官的风格怎么样?
A:三个面试官风格差异挺大的。一面比较轻松,像聊天;二面比较严肃,问题很密集;三面最有压力,会不断追问直到你答不上来。
Q:需要刷LeetCode吗?
A:没有考LeetCode,但会问算法思路,比如A*的启发函数怎么设计、搜索空间怎么剪枝等。建议把规划相关的经典算法搞明白就行。
Q:薪资怎么样?
A:这个因人而异,我了解到规划算法岗的base大概在40-60k之间,具体看级别和谈的情况。
Q:面试结果多久出来?
A:我是一面后3天收到二面通知,二面后5天收到三面通知,三面后1周收到offer。