3. Transformer基础回顾:自注意力机制、多头注意力、位置编码、编码器-解码器结构,以及Transformer在序列建模中的优势

Transformer架构自2017年由Vaswani等人提出以来,已经成为自然语言处理、计算机视觉以及自动驾驶感知与决策领域的基石模型。在端到端自动驾驶中,Transformer被广泛用于处理多传感器融合、时序轨迹预测以及鸟瞰视角(BEV)特征建模。理解其核心组件——自注意力机制、多头注意力、位置编码以及编码器-解码器结构——是掌握后续BEVFormer、UniAD等先进方案的前提。本节将系统梳理这些基础概念,并结合自动驾驶场景说明其工程意义。

Transformer核心组件与自动驾驶映射 输入嵌入 图像/点云/轨迹 位置编码 正弦/可学习/BEV网格 多头自注意力 Q, K, V 线性投影 缩放点积注意力 多头拼接 + 输出投影 头数h=8, 维度d_k=64 前馈网络(MLP) Linear → ReLU → Linear 残差连接 + LayerNorm Add & Norm K, V 解码器 掩码自注意力 交叉注意力(编码器输出) 逐位置前馈网络 自回归生成 输出头 轨迹/检测/占用网格 自动驾驶场景映射 • 多传感器化:相机图像→Patch嵌入,激光雷达→体素/Voxel嵌入 • 时序建模:历史帧位置编码→时间注意力→未来轨迹预测 • BEV生成:空间位置编码→跨视图注意力→统一鸟瞰视角特征

上图展示了Transformer核心组件之间的数据流关系。在自动驾驶中,输入嵌入层将多传感器数据转换为序列,位置编码为每个注入空间或时间位置信息,多头自注意力捕捉间的长程依赖,编码器-解码器结构则支持从感知到规划的完整映射。下面我们将逐一深入剖析每个组件的原理与工程实践。

3.1 自注意力机制:从全局建模到动态权重分配

核心原理

自注意力(Self-Attention)的核心思想是让序列中的每个元素都能直接与序列中所有其他元素计算相关性,从而建模全局依赖关系。给定输入序列 \( X \in \mathbb{R}^{n \times d} \),通过三个可学习的权重矩阵 \( W_Q, W_K, W_V \) 分别生成查询(Query)、键(Key)和值(Value)矩阵:

Q = X @ W_Q    # 形状: (n, d_k)
K = X @ W_K    # 形状: (n, d_k)
V = X @ W_V    # 形状: (n, d_v)

注意力输出计算为:

Attention(Q, K, V) = softmax(Q @ K.T / sqrt(d_k)) @ V

其中 \( \sqrt{d_k} \) 是缩放因子,用于防止点积结果过大导致softmax梯度消失。在自动驾驶场景中,自注意力允许当前帧的某个车辆检测框直接与历史帧中同一车辆的特征进行交互,即使时间间隔较长。

判断方法或操作流程

在实际工程中,判断是否适合使用自注意力机制,可以从以下三个维度评估:

  • 依赖距离:如果任务需要建模超过10个时间步或空间距离超过50米的依赖关系,传统CNN或RNN难以高效捕捉,自注意力是更优选择。
  • 并行性需求:自注意力可以完全并行计算所有位置的注意力权重,而RNN必须串行处理,因此GPU集群训练时自注意力效率更高。
  • 动态权重需求:如果不同输入样本需要不同的特征交互模式(例如雨天和晴天对传感器融合权重的影响不同),自注意力的动态权重分配能力具有明显优势。

案例拆解:多传感器融合中的自注意力

在自动驾驶的3D目标检测任务中,我们通常需要融合6个相机图像和1个激光雷达点云。传统方法将不同传感器特征直接拼接,但这种方式忽略了传感器之间的动态相关性。使用自注意力机制时,我们将每个相机的2D特征图划分为16×16的Patch,每个Patch作为一个;激光雷达点云则通过Voxelization划分为8×8×4的体素,每个非空体素作为一个。所有共同输入自注意力层,模型自动学习“当相机检测到模糊目标时,应更多关注激光雷达对应区域的点云特征”这类动态权重分配。

传感器类型数量维度注意力模式
前视相机256256与激光雷达体素交互
环视相机(4个)4×256256跨相机位置交互
激光雷达512256与图像Patch交互

实验结果表明,基于自注意力的融合方案在nuScenes数据集上的mAP比简单拼接方法提升了4.7%,尤其在夜间和逆光场景下提升更为显著。

常见误区:自注意力并非万能。当序列长度超过5000时,计算复杂度 \( O(n^2) \) 会导致显存爆炸。在自动驾驶中处理高分辨率图像时,应优先使用窗口注意力或稀疏注意力来降低计算量。

3.2 多头注意力:多子空间特征提取与并行计算

核心原理

多头注意力(Multi-Head Attention)将自注意力拆分为多个并行的“头”,每个头在不同的表示子空间上独立计算注意力。具体来说,将 \( Q, K, V \) 分别投影到 \( h \) 个维度为 \( d_k \) 的子空间,每个头独立计算注意力输出,最后将所有头的输出拼接并经过一个线性投影:

MultiHead(Q, K, V) = Concat(head_1, ..., head_h) @ W_O
其中 head_i = Attention(Q @ W_Q^i, K @ W_K^i, V @ W_V^i)

在自动驾驶中,不同的注意力头可以自动学习不同的语义关系:一个头可能专注于车辆之间的空间距离关系,另一个头可能专注于车道线对车辆行驶方向的约束,第三个头可能专注于时间序列上的速度变化模式。

判断方法或操作流程

选择多头注意力的头数 \( h \) 时,需要遵循以下工程准则:

  1. 维度约束:\( d_k = d_{model} / h \) 通常设置为64,因此当模型维度为512时,\( h=8 \) 是标准配置。
  2. 任务复杂度:对于BEV感知这类需要同时建模空间、时间和语义信息的任务,建议 \( h \geq 8 \);对于简单的轨迹分类任务,\( h=4 \) 即可。
  3. 消融实验:在训练初期,分别测试 \( h=4, 8, 16 \) 的收敛速度和最终精度,选择验证集表现最优的配置。

实战场景:轨迹预测中的多头注意力

在车辆轨迹预测任务中,输入为过去3秒内目标车辆及其周围车辆的轨迹序列。我们使用8头注意力:

  • 头1-2:学习目标车辆自身的历史位置变化模式
  • 头3-4:学习目标车辆与周围车辆的相对距离和相对速度
  • 头5-6:学习车道线、交通标志等静态地图元素对轨迹的约束
  • 头7-8:学习交通信号灯状态和行人意图等动态语义信息

通过可视化注意力权重,我们发现头3和头4确实关注了相邻车辆的交互,而头7和头8在红绿灯切换时激活程度显著增加。这种可解释性对于自动驾驶系统的安全验证至关重要。

经验提醒:多头注意力的计算可以完全并行化,在PyTorch中通过 torch.nn.MultiheadAttention 实现时,务必设置 batch_first=True 以避免维度转置带来的性能损耗。

3.3 位置编码:为无序注入空间与时间信息

核心原理

自注意力机制本身是置换不变的,即打乱输入的顺序不会改变输出结果。但在自动驾驶中,的顺序承载着重要的空间位置和时间先后信息。位置编码(Positional Encoding)通过向输入嵌入中添加位置向量来打破这种对称性。常用的位置编码有两种:

  • 正弦位置编码:使用不同频率的正弦和余弦函数生成位置向量,公式为 \( PE_{(pos, 2i)} = \sin(pos / 10000^{2i/d}) \),\( PE_{(pos, 2i+1)} = \cos(pos / 10000^{2i/d}) \)。这种编码具有相对位置感知能力,且无需训练。
  • 可学习位置编码:将位置向量作为可训练参数,在训练过程中自动更新。在BEVFormer等模型中,使用可学习的网格状位置编码来对应BEV平面上的不同坐标。

判断方法或操作流程

在自动驾驶中选择位置编码类型时,可以参考以下决策流程:

  1. 如果输入是固定长度的序列(如固定数量的历史帧),优先使用可学习位置编码。
  2. 如果输入长度可变(如不同数量的检测目标),使用正弦位置编码或插值方式扩展可学习编码。
  3. 对于BEV空间特征,使用2D可学习位置编码,每个网格坐标对应一个独立的可学习向量。
  4. 对于多传感器融合,需要为每个传感器类型添加额外的“传感器类型编码”,与位置编码相加后输入Transformer。

案例拆解:BEV空间中的位置编码设计

在BEVFormer中,我们需要将6个相机的2D特征转换为统一的BEV表示。BEV平面被划分为200×200的网格,每个网格对应现实世界中的0.5m×0.5m区域。我们为每个网格分配一个可学习的2D位置编码向量,维度为256。同时,为了区分不同高度层(因为BEV是俯视图,但车辆有高度信息),我们为每个高度层(共4层)也分配了可学习的高度编码。最终的位置编码为:

bev_pos_encoding = grid_encoding + height_encoding + sensor_type_encoding

这种设计使得模型能够区分“同一位置不同高度的障碍物”和“不同传感器观测到的同一目标”。在Waymo开放数据集上的实验表明,加入高度编码后,车辆检测的3D IoU提升了2.1%。

常见误区:不要将位置编码直接加到归一化后的特征上。建议先对输入特征进行LayerNorm,再添加位置编码,否则位置信息可能被特征幅值淹没。

3.4 编码器-解码器结构:从感知到规划的完整映射

核心原理

编码器-解码器(Encoder-Decoder)结构是Transformer的经典架构。编码器由多个相同的层堆叠而成,每层包含多头自注意力和前馈网络;解码器同样由多层堆叠,但每层额外包含一个交叉注意力模块,用于关注编码器的输出。在自动驾驶中,这种结构天然适合“感知→决策”的流水线:

  • 编码器:处理多传感器输入,输出丰富的上下文特征表示。
  • 解码器:以编码器输出为条件,逐步生成规划轨迹或检测结果。

判断方法或操作流程

在端到端自动驾驶模型中,选择编码器-解码器结构还是纯编码器结构,取决于任务类型:

任务类型推荐结构原因
3D目标检测纯编码器输出是固定数量的检测框,无需序列生成
轨迹预测编码器-解码器需要自回归生成未来多个时间步的轨迹点
行为规划编码器-解码器需要根据感知结果逐步生成驾驶动作序列
占用网格预测纯编码器输出是固定大小的网格,可直接分类

实战场景:UniAD中的编码器-解码器设计

UniAD(Unified Autonomous Driving)是首个将感知、预测、规划统一到单一Transformer框架中的模型。其编码器处理多相机图像和激光雷达点云,输出BEV特征;解码器则包含三个级联的查询模块:

  1. 检测查询:初始化为可学习的锚点,通过交叉注意力从BEV特征中提取目标位置和类别。
  2. 轨迹查询:以检测结果作为条件,通过自回归方式生成未来3秒的轨迹点。
  3. 规划查询:结合高精地图和交通规则,输出最终的安全驾驶轨迹。

这种设计使得信息从感知到规划单向流动,避免了传统模块化系统中误差累积的问题。在nuScenes数据集上,UniAD的规划碰撞率比基线方法降低了32%。

总结复盘:Transformer在序列建模中的核心优势可以归纳为三点:第一,全局感受野,自注意力让每个位置都能直接访问整个序列的信息;第二,动态权重,注意力权重根据输入内容自适应调整,而非固定卷积核;第三,高度并行化,所有的注意力计算可同时进行,充分利用GPU算力。在自动驾驶中,这些优势直接转化为更精准的长程感知、更鲁棒的多传感器融合和更高效的端到端训练。