Momenta 是自动驾驶领域的明星独角兽公司,主打"一个飞轮"模式------数据驱动算法、算法驱动量产、量产驱动数据。如果你想面 Momenta 的算法岗,那一定得做好准备:计算机视觉(BEV 感知、目标检测)、深度学习(Transformer、NeRF)、SLAM 定位、规划控制、多传感器融合,这五个方向基本是必考的。
我结合深蓝学院、牛客网等平台的面经,精选了10道真实高频题,每一道都写清楚了思路和关键要点。
一、计算机视觉方向
1. 请详细讲一下 BEV 感知是怎么回事?为什么现在自动驾驶公司都在用 BEV 架构?
这道题是 Momenta 面试的高频题,因为 Momenta 正是国内最早在量产车上落地 BEV 方案的公司之一,和智己汽车合作的产品用的就是 BEV 端到端方案。
解析: BEV 全称 Bird's Eye View,就是鸟瞰图。传统的车载感知是在前视、环视等各个摄像头的图像上独立做检测,再把结果投影到统一坐标系,这叫"后融合"。但它有个大问题------不同视角的检测结果在投影到地平面时可能冲突,而且缺少对时序信息的有效利用。
BEV 的做法不一样。它通过 Transformer 将多个视角的图像特征"统一"投影到车身正上方的鸟瞰视角空间,在 BEV 格子上做检测、分割、跟踪。这么做的好处很明显:第一,不同传感器(相机、激光雷达、毫米波雷达)的特征可以在同一个 BEV 空间里融合,不再需要分别做后处理;第二,BEV 空间天然适合做时序融合,可以叠加历史帧信息,提高遮挡、远距离场景的检测能力;第三,输出结果可以直接给下游规控模块用,非常适合端到端架构。
你还需要提到对 Occupancy Network(占据网络)的了解,因为 Momenta 也在这方面布局,比如它们提出的 DDOD(Data Driven Object Detection)模型就是基于 Occupancy 来做检测的。Occupancy 将场景理解为"每个格子有没有被物体占据",可以处理任意形状的障碍物,对长尾场景特别友好。
2. 手撕 NMS(非极大值抑制)代码,讲一下原理和常见变种
这道题在深蓝学院的 Momenta 题库和牛客面经里反复出现,是手撕代码的高频题。
解析: NMS 的原理说起来很简单------在目标检测的后处理阶段,一张图上同一个物体会产生很多个预测框,NMS 的作用就是只保留分数最高的那个,去掉其他重叠度太高的框。
核心流程是这样的:先把所有框按置信度分数从高到低排序,选分数最高的框,然后遍历剩下的所有框,计算它们跟这个最高分框的 IoU,如果 IoU 大于阈值(比如0.5),就把它扔掉。然后从剩下的框里再选分数最高的,重复这个过程。
面试官可能会追问 NMS 有什么缺点。你要知道,标准的 NMS 有两个大问题:第一,它硬性地把 IoU 大于阈值的框全都去掉,但如果两个物体离得很近,可能会把另一个物体的框也误杀了(漏检);第二,它完全看置信度排序,但有时候置信度低的框位置反而更准。
针对这些问题,出现了 Soft-NMS(衰减而不是直接去掉)、DIoU-NMS(考虑框中心距离)等变种。另外在工程实现上还要注意,深度学习模型的输出框数量可能很大(几千个),能不能实现一个高效的向量化版本?这个也会被问到。
3. 请说明经典 ICP 算法的流程,它有什么局限性?
这道题来自 Momenta 的真实面试记录,既是 SLAM 方向的经典题,Momenta 面试中明确出现过"请说明经典 ICP 算法的算法流程"。
解析: ICP(Iterative Closest Point)是点云配准的经典算法,用来把两帧点云对齐。它的思路特别直接------对于源点云中的每个点,在目标点云中找到最近的点作为对应,然后通过最小化所有对应点对之间的距离来求解变换矩阵(旋转 R 和平移 t),然后迭代这个过程直到收敛。
ICP 有个前提条件:需要有一个好的初始位姿。因为 ICP 本质上是一个局部优化方法,如果初始值离真实值太远,就会收敛到局部最优。这也是面试官想考察你知不知道的重点。
ICP 还有几个明显的局限:对噪声和离群点敏感、需要两帧点云之间有一定重叠度、需要点与点之间的对应关系(但最近邻搜索本身就是一个耗时的操作)、对于没有明显几何结构的场景(比如隧道、长走廊)容易失败。
扩展一下,你可以提一下 Point-to-Plane ICP(点面ICP),它把距离度量从点与点的欧氏距离换成点到目标点云拟合平面的距离,在平滑表面上收敛更快。还有基于面元(surfel)的 ICP 等变种。
二、深度学习方向
4. 请谈谈你对 Transformer 中 Self-Attention 的理解,为什么需要除以 sqrt(dk)?
这道题在 Momenta 面试中直接出现过------"coding TransformerLayer:self-attn 和 ffn 实现; 继续问 sqrt(dk) 的作用,能不能用 norm 呢?"
解析: Self-Attention 的核心公式是 Attention(Q,K,V) = softmax(QK^T / sqrt(dk)) * V。Q、K、V 分别是 Query、Key、Value,它们都是输入经过线性变换得到的。
这里的关键是为什么需要除以 sqrt(dk)。原因是当 Query 和 Key 的维度 dk 比较大的时候,QK^T 内积的方差也会比较大。你可以想象一下,如果两个 d 维的向量每个分量都是均值为0、方差为1的随机变量,那它们的点积的均值是0,但方差是 d。当 d 很大时,点积的值会非常大或者非常小,导致 softmax 的梯度进入饱和区,梯度变得非常小,不利于训练。除以 sqrt(dk) 后,可以把这个方差重新缩放回1,让 softmax 的输入落在梯度比较大的区域。
关于能不能用 LayerNorm 代替------面试官就是想知道你理解是否深入。答案是不太一样,LayerNorm 是对特征维度做归一化,而除以 sqrt(dk) 是对注意力分数的缩放,它们的计算方式和作用机理不同。不过最近有一些工作尝试用 Norm 来替代这个缩放,但并不是简单的 LayerNorm,而是类似 QK-Norm 的方案(比如 LLaMA 就用了 QK-Norm)。
5. 训练时 Loss 出现 NaN 怎么办?CUDA 显存超限怎么办?模型不收敛怎么排查?
这道题在 Momenta 面经中被称为"炼丹熟练度"考察,是二面面试官特别喜欢问的实战问题。
解析: Loss 出现 NaN 最常见的原因是学习率过大,导致梯度过大,参数更新后数值溢出。你先试试降低学习率,或者加上梯度裁剪(gradient clipping),限制梯度的最大值。如果还不行,检查一下输入数据里面有没有 NaN 或者 Inf,数据预处理是否出了问题。BatchNorm 层在某些 batch 里均方差为0也可能产生 NaN,可以换成 LayerNorm 或者增加 eps 值。
CUDA 显存超限的话,最直接的方法是减小 batch size,或者降低输入图像的尺寸。还可以用梯度累积(gradient accumulation)来模拟大 batch size,这不会增加显存但需要更多步。混合精度训练(AMP)也是一个选项,可以把显存占用降低近一半。checkpointing(梯度检查点)技术在前向时丢弃中间激活值,反向再重新计算,也是节省显存的有效手段。
模型不收敛是个更大的话题。首先要看你 Loss 在前期有没有下降------如果 Loss 从一开始就不动,可能是学习率太小,或者数据/标签出了问题。如果 Loss 震荡严重,可能是学习率太大或者 batch size 太小。还有一个容易被忽视的点:检查 Loss 定义是否正确。
6. 请讲解 Batch Normalization 的原理,训练和推理时有什么不同?
这道题在深蓝学院的 Momenta 题库中反复出现,属于深度学习基础八股题。
解析: Batch Normalization 的作用是解决训练过程中每层输入分布变化的问题(Internal Covariate Shift)。具体做法是对一个 batch 中的每个特征维度做标准化,减去均值除以标准差,然后再加上可学习的缩放和平移参数。
训练时,均值和方差是在当前 batch 上算出来的。但推理时就不一样了,因为你推理的时候可能 batch size 很小,甚至只有1张图,这时候算出来的均值和方差抖动很大,不可靠。所以推理时用的是训练阶段通过滑动平均累积下来的全局均值和方差。这也是为什么很多框架在训练和推理模式下 BN 层的行为不同。
面试官还可能追问:BN 的参数有多少?对于 C 个通道的特征图,BN 需要学习 C 个 gamma 和 C 个 beta,所以一共 2C 个参数。另外 BN 能否和卷积合并加速推理?可以,在推理阶段 BN 就是对一个线性变换的缩放平移,可以吸收到卷积层的权重和偏置里去,这也是 TensorRT 等部署框架做的优化。
三、SLAM/定位方向
7. 请描述一下 VINS-Mono 初始化的过程,为什么单目 VIO 需要初始化?
这道题在深蓝学院的 Momenta 面经里标记为高频,Momenta 本身招 SLAM 算法工程师时必问。
解析: VINS-Mono 初始化要解决一个核心问题:单目相机没有深度信息,所以整个系统的尺度都是未知的,你必须先恢复出尺度、重力方向、速度等状态量,然后后续的滑动窗口优化才能跑起来。
VINS-Mono 的初始化分几步走:第一步,先对图像做特征点提取、光流跟踪,同时把 IMU 数据做预积分。第二步,利用纯视觉的 SFM(运动恢复结构)恢复出相机的旋转和平移(带尺度的)。第三步,视觉结果和 IMU 预积分结果对齐,通过联合优化来估计重力方向、加速度计偏置、速度以及最重要的------尺度因子。第四步,把陀螺仪偏置也优化一下。
初始化对运动有要求:激励要充分,不能是纯匀速运动或者纯旋转。如果一直匀速直线运动或者静止,那么加速度计没法提供足够的激励信息来恢复尺度,初始化就会失败。
8. 请讲一讲卡尔曼滤波的流程,卡尔曼增益 K 的含义是什么?
这道题各类自动驾驶面经里基本人手一道,Momenta 这边同样高频。
解析: 卡尔曼滤波是状态估计的基石。它假设系统是线性高斯系统,通过预测和更新两个步骤来估计状态。
预测步骤:用上一时刻的状态和运动模型,预测当前时刻的状态和协方差。这一步让我们的估计变"模糊"了,因为预测本身有不确定性,所以协方差会变大。
更新步骤:用观测来修正预测。卡尔曼增益 K 就是核心,它决定了你是更相信预测还是更相信观测。K 大,意味着观测噪声小,我更相信观测,修正量大;K 小,意味着观测噪声大,我不太信任观测,修一点点或者不动。
面试官可能会追问:如果 Q(过程噪声协方差)变大或者 R(观测噪声协方差)变大,K 会怎么变?Q 变大意味着你更不信任模型预测,K 会变大,更依赖观测;R 变大意味着你更不信任观测,K 会变小。
实际自动驾驶中,卡尔曼滤波的应用非常广泛:IMU 和 GNSS 组合导航、目标跟踪(MOT中的卡尔曼跟踪器)、传感器融合等。你还可以提一下扩展卡尔曼滤波(EKF,处理非线性系统)和各种替代方法(粒子滤波、非线性优化)。
四、规划控制方向
9. 请讲一下 LQR 和 MPC 的区别,各自适合什么场景?
这道题在 Momenta 规划控制方向的面试中反复出现,来自深蓝学院题库。
解析: LQR(线性二次型调节器)和 MPC(模型预测控制)都是自动驾驶中常用的控制方法,但它们的设计理念有很大区别。
LQR 假设系统是线性的,找一个状态反馈控制律 u = -Kx,使得一个二次型的代价函数最小。它的优点是计算简单、可以离线求解(解 Riccati 方程),适合线性化后的横向控制。但缺点也很明显:不能显式处理约束,而且没有滚动优化的概念,一旦 K 定下来,控制律就固定了。
MPC 不是找一个固定的控制律,而是在每个时间步,基于当前状态,对未来 N 步的轨迹进行优化,只取第一步的控制量执行,然后到下一步重新优化。MPC 能天然处理各种约束(控制量约束、状态约束、避撞约束),也适合处理非线性系统。缺点是计算量大,对车载算力要求高。
简单来说:在高速巡航、变道等相对简单的工况下,LQR 就够用了,计算快、稳定;但在城市复杂场景、有避障需求、需要处理硬约束的时候,MPC 更合适。面试官可能还会追问如何融合使用两者,比如用 LQR 提供初值给 MPC。
10. 请解释一下 EM Planner 的流程,动态规划和二次规划分别做了什么?
这道题面向的是 Apollo 方案相关面试,Momenta 也关注端到端规划技术,了解 EM Planner 结构和改进点很有帮助。
解析: EM Planner 是百度 Apollo 提出来的经典规划框架,它把路径规划和速度规划分开做(就是决策规划里常说的横纵向解耦),通过期望最大化来迭代求解。
先讲 Path Planning(路径规划)。这一阶段用动态规划(DP)来做决策------在 Frenet 坐标系下撒采样点,通过 DP 搜索出一条最优的、避开障碍物的路径。DP 的代价函数考虑障碍物距离、道路边界、平滑度等,但它产生的是粗糙路径,有折点,不平滑。所以接下来用二次规划(QP)对这条路径做平滑处理,得到最终的光滑路径。
然后是 Speed Planning(速度规划)。流程类似,先基于路径结果,在 ST 图上用 DP 搜索出初步的速度曲线(什么时候加速、什么时候减速、什么时候停车),再通过 QP 对速度曲线做平滑。
EM Planner 最大优势是把复杂问题分解了,工程上可行;但问题在于横纵向解耦可能导致次优解------比如路径规划时不知道车速,速度规划时路径已经固定。这也是现在端到端方法(如 UniAD、D.L.P. 模型)想解决的问题。Momenta 在智己上落地的 D.L.P. 模型正是用数据驱动来代替传统规则,用 Transformer 架构做端到端规划。
总结
Momenta 的算法工程师面试覆盖面很广,从基础的深度学习理论(BN、NMS、Loss 排查)到自动驾驶核心业务(BEV 感知、VIO 初始化、规划控制),再到工程落地(模型部署、显存优化),考察的都非常深入。准备的时候不能光背八股,一定要理解每个算法背后的动机------为什么这么做、不这么做会有什么问题、有没有更好的方案。
祝各位面试顺利,早日上岸~