第二章 Transformer基础回顾:自注意力机制、多头注意力、位置编码、编码器-解码器结构,以及关键数学原理
Transformer架构自2017年由Vaswani等人提出后,迅速成为自然语言处理领域的主流模型,并在计算机视觉任务中展现出强大的潜力。在自动驾驶场景中,Transformer被广泛应用于多传感器融合、目标检测、轨迹预测和端到端规划等核心任务。理解Transformer的底层数学原理与结构设计,是将其落地到车载计算平台、进行模型优化与部署的前提。本章将系统回顾自注意力机制、多头注意力、位置编码以及编码器-解码器结构,并结合自动驾驶场景中的实际案例,剖析其数学本质与工程实践要点。
2.1 自注意力机制:让每个特征“看见”全局
核心原理
自注意力机制(Self-Attention)的核心思想是:对于输入序列中的每一个元素,通过计算它与序列中所有其他元素的相关性(注意力权重),来动态地聚合全局信息。在自动驾驶中,这一机制天然适配于多传感器特征融合——例如,将激光雷达点云投影到BEV(鸟瞰图)视角后,每个网格单元都可以通过自注意力与其他网格交互,从而建模车辆、行人、道路标线之间的长距离依赖关系。
数学上,给定输入矩阵 X ∈ R^(N×d)(N为序列长度,d为特征维度),通过三个可学习的权重矩阵 W_Q、W_K、W_V 分别生成查询(Query)、键(Key)和值(Value):
Q = X · W_Q, K = X · W_K, V = X · W_V
注意力输出计算为:
Attention(Q, K, V) = softmax(Q · Kᵀ / √d_k) · V
其中 d_k 是键向量的维度,除以 √d_k 是为了防止点积结果过大导致softmax梯度消失。在BEV特征图上,N通常对应网格单元数量(如200×200=40000),d为通道数(如256)。
判断方法:何时选择自注意力而非卷积
| 对比维度 | 卷积(CNN) | 自注意力(Transformer) |
|---|---|---|
| 感受野 | 局部(3×3、5×5) | 全局(整个序列) |
| 计算复杂度 | O(N·k²·d) | O(N²·d) |
| 长距离依赖 | 需堆叠多层 | 单层即可建模 |
| 自动驾驶适用场景 | 低层特征提取、实时性要求高的感知 | BEV融合、轨迹预测、全局规划 |
在车载芯片(如Orin、Thor)上,N²的复杂度是主要瓶颈。工程上常采用局部注意力窗口(如Swin Transformer)或稀疏注意力来降低计算量。
案例拆解:BEV特征上的自注意力融合
某自动驾驶公司在其感知系统中,将6路摄像头图像通过2D骨干网络提取特征后,利用可变形注意力(Deformable Attention)将2D特征投影到BEV空间。初始BEV特征为200×200×256,通过自注意力模块,每个网格单元可以聚合来自所有其他网格的信息。实验数据显示:加入自注意力后,远处(>50m)小目标(行人、锥桶)的召回率提升了12.3%,而近处目标的精度基本不变。代价是单帧推理时间增加了8ms(从35ms增至43ms),但通过TensorRT的FP16量化,最终控制在40ms以内,满足30FPS的实时性要求。
2.2 多头注意力:从多个子空间捕捉不同关系
核心原理
多头注意力(Multi-Head Attention)将自注意力拆分为 h 个独立的头(Head),每个头在不同的特征子空间上执行注意力计算,最后将结果拼接并线性投影。其数学表达为:
MultiHead(Q, K, V) = Concat(head₁, ..., headₕ) · Wᴼ
其中 headᵢ = Attention(Q·W_Qⁱ, K·W_Kⁱ, V·W_Vⁱ)
在自动驾驶中,不同的注意力头可以自动学习到不同的语义关系:一个头可能关注车辆之间的相对位置,另一个头关注车道线的连续性,第三个头关注行人过街的意图。这种多子空间的并行建模能力,使得Transformer在处理复杂交通场景时优于单头注意力。
操作流程:多头注意力的工程实现
- 输入准备:将BEV特征或目标查询序列展平为X ∈ R^(N×d)。
- 线性投影:分别用W_Q、W_K、W_V将X投影到d_k、d_k、d_v维度,并拆分为h个头(每个头维度为d_k/h)。
- 并行计算:在GPU上通过矩阵乘法批量计算h个头的注意力输出。
- 拼接与投影:将h个头的结果拼接为N×(h·d_v),再乘以Wᴼ得到最终输出。
案例拆解:多传感器融合中的多头注意力
在融合激光雷达和摄像头特征时,某团队设计了跨模态多头注意力:将激光雷达BEV特征作为Query,摄像头BEV特征作为Key/Value。实验设置8个头,每个头维度为32。通过可视化注意力权重发现:第2个头主要关注动态物体(车辆、行人),第5个头关注静态结构(车道线、路沿),第7个头关注遮挡区域的补全。这种自动分工使得融合后的3D检测精度(mAP)从单模态的68.4%提升至79.1%,且对夜间、逆光等极端光照条件的鲁棒性显著增强。
2.3 位置编码:为无序序列注入空间顺序
核心原理
自注意力机制本身是置换等变的——即打乱输入顺序,输出也会相应打乱,但不会改变集合内的关系。然而,自动驾驶中的特征(如BEV网格、目标序列)具有明确的空间位置信息,必须显式注入。位置编码(Positional Encoding)分为两类:
- 正弦函数编码:使用不同频率的正弦/余弦函数生成位置向量,公式为 PE(pos, 2i) = sin(pos/10000^(2i/d)),PE(pos, 2i+1) = cos(pos/10000^(2i/d))。优点是不需要学习参数,且能外推到更长序列。
- 可学习位置编码:将位置索引映射为可训练的嵌入向量,在训练中自动更新。在BEV场景中,通常将网格的(x, y)坐标分别编码后拼接。
判断方法:选择哪种位置编码
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| 固定尺寸BEV特征(如200×200) | 可学习网格坐标编码 | 训练充分,精度更高 |
| 变长目标序列(如轨迹预测) | 正弦函数编码 | 可处理任意长度,泛化性好 |
| 多传感器融合(不同模态) | 模态专属位置编码 | 区分不同传感器的空间坐标系 |
案例拆解:BEV位置编码的调优实践
某团队在训练BEVFormer时发现,直接使用2D正弦位置编码,模型在近距离(<10m)的检测精度较高,但远距离(>60m)的召回率偏低。分析后确认:正弦编码在低频段(对应远距离)的区分度不足。解决方案是采用可学习的归一化坐标编码——将BEV网格的x、y坐标归一化到[-1, 1]后,通过两个独立的MLP映射为256维向量,再与特征相加。调优后,远距离目标的Recall@0.5从71.2%提升至78.6%,且训练收敛速度加快15%。
2.4 编码器-解码器结构:从感知到规划的桥梁
核心原理
编码器-解码器(Encoder-Decoder)结构是Transformer的经典框架。编码器负责将输入序列(如BEV特征、历史轨迹)编码为上下文丰富的特征表示;解码器则根据编码器输出和自身已生成的内容,逐步预测目标序列(如未来轨迹、规划路径)。在自动驾驶中,这一结构被广泛用于:
- 轨迹预测:编码器处理历史轨迹和场景上下文,解码器自回归地生成未来多步轨迹。
- 端到端规划:编码器融合多传感器特征,解码器输出规划路径点或控制指令。
- 目标查询:在DETR系列检测器中,解码器通过可学习的对象查询(Object Query)与编码器特征交互,直接输出检测框。
操作流程:编码器-解码器的数据流
- 编码器前向:输入BEV特征序列X ∈ R^(N×d),经过L层编码器(每层包含多头自注意力+前馈网络+残差连接),输出上下文特征C ∈ R^(N×d)。
- 解码器输入:初始化目标查询Q ∈ R^(M×d)(M为预测目标数,如6个轨迹候选),并加入位置编码。
- 交叉注意力:解码器中的Cross-Attention层以Q为Query,以C为Key/Value,让每个查询从全局特征中提取所需信息。
- 自回归生成:在轨迹预测中,解码器逐步生成未来时间步的轨迹点,每一步将上一步输出作为下一步输入。
案例拆解:基于编码器-解码器的多模态轨迹预测
某自动驾驶团队设计了一个用于城市复杂路口的轨迹预测模型。编码器输入为:目标车辆历史轨迹(3秒,10Hz采样,共30个点)+ 周围车辆/行人/车道线编码。解码器采用6个可学习查询,每个查询对应一条未来轨迹模态(如直行、左转、右转、减速等)。训练时使用负对数似然损失,推理时选择概率最高的模态作为最终预测。在nuScenes数据集上,该模型的minADE(最小平均位移误差)达到0.82m,优于基于LSTM的基线(1.15m)。部署到实车时,通过将解码器查询数从6减至3,推理延迟从28ms降至19ms,满足系统实时性要求。
2.5 关键数学原理与工程落地要点
核心原理:缩放点积注意力的数值稳定性
在FP16推理时,Q·Kᵀ的结果可能超过FP16的最大表示范围(65504),导致softmax输出NaN。解决方案包括:
# 在FP16下,对Q·Kᵀ进行缩放后再softmax
scale = 1.0 / sqrt(d_k)
scores = torch.matmul(Q, K.transpose(-2, -1)) * scale
# 可选:在softmax前减去最大值(max-subtraction)
scores = scores - scores.max(dim=-1, keepdim=True).values
probs = torch.softmax(scores, dim=-1)
判断方法:计算复杂度与显存估算
| 模块 | 计算量(FLOPs) | 显存占用(N=10000, d=256, h=8) |
|---|---|---|
| Q、K、V投影 | 3·N·d² | 约 3×10000×256×4B = 30MB |
| Q·Kᵀ | N²·d | 10000²×4B = 400MB |
| Softmax | N² | 10000²×4B = 400MB |
| Attention·V | N²·d | 400MB |
可见,N=10000时,单层多头注意力的显存峰值约为1.2GB。在Orin(显存32GB)上可运行,但在嵌入式平台(如Jetson Xavier,16GB)上需谨慎设计。常用优化手段包括:窗口注意力(将N划分为多个局部窗口)、稀疏注意力(只计算Top-k个相关位置)、FlashAttention(通过分块计算避免存储完整注意力矩阵)。
案例拆解:FlashAttention在BEV Transformer中的加速效果
某团队在Jetson AGX Orin上部署BEV感知模型,原始多头注意力在N=2500(50×50网格)时,单层耗时12ms。引入FlashAttention后,通过IO感知的块级计算,将注意力矩阵的分块计算与片上SRAM访问优化,单层耗时降至4.5ms,加速2.7倍。同时,由于避免了中间矩阵的显存读写,整体显存占用从2.1GB降至1.3GB。最终,整个BEV感知模型(含骨干网络和Transformer编码器)在FP16下达到28ms/帧,满足25FPS的实时性要求。