第一章:课程导论与预备知识
各位同学,欢迎来到《Transformer端到端自动驾驶实战课程》。我是你们这门课的主讲人,一个在自动驾驶行业摸爬滚打了七八年的老兵。今天咱们先不急着写代码,把地基打牢了,后面盖楼才稳当。
1.1 自动驾驶发展史:从梦想到现实
自动驾驶这个概念,其实比大多数人想象的要老得多。早在上世纪20年代,就有人搞过“无线电控制的汽车”,说白了就是遥控车。但真正意义上的现代自动驾驶,得从2004年DARPA挑战赛说起。
那会儿我还在读大学,记得当时看比赛视频,参赛车辆在沙漠里跑得歪歪扭扭,最远的一辆也就跑了十几公里。嗯,跟现在比确实挺寒碜的。但正是那次比赛,点燃了整个行业。
后来发展脉络大致是这样的:
- 2009-2015年:谷歌开始搞无人车,Waymo诞生。这个阶段主要是“规则驱动”,写一大堆if-else逻辑。我在实习时接触过这类系统,说实话,维护起来特别痛苦——你永远不知道下一个corner case在哪。
- 2016-2019年:深度学习爆发。卷积神经网络(CNN)开始用在目标检测上,比如YOLO、Faster R-CNN。这时候大家发现,与其手写规则,不如让模型自己学。
- 2020年至今:Transformer架构席卷一切。从NLP跨界到CV,再到自动驾驶。端到端方案开始崭露头角,特斯拉的FSD Beta就是典型代表。
我个人习惯把自动驾驶的发展分成三个阶段:规则时代、感知时代、端到端时代。我们现在正处在第三个阶段的起点。
1.2 端到端方案对比:为什么是Transformer?
传统的自动驾驶系统长什么样?我画个简图给你看:
传感器 → 感知模块 → 预测模块 → 规划模块 → 控制模块
每个模块都是独立训练的,最后拼在一起。这有什么问题?说白了就是“各扫门前雪”。感知模块觉得自己检测得挺准,但规划模块可能根本不买账。我在项目中遇到过这种情况:感知模块把行人框得死死的,但规划模块还是撞上去了——因为两个模块的“语言”不通。
端到端方案就不一样了:
传感器 → 神经网络 → 控制信号
一个模型,从输入到输出,全部搞定。这样做的好处很明显:
- 全局最优:整个系统朝着同一个目标优化,不会出现模块间扯皮的情况。
- 简化流程:不用手动设计中间特征,模型自己学什么有用就用什么。
- 数据驱动:只要有足够的数据,模型就能不断进化。
那为什么选Transformer?你想想看,自动驾驶本质上是一个序列决策问题。当前时刻的决策,依赖于之前时刻的状态。Transformer的自注意力机制,天然适合处理这种时序依赖。相比之下,RNN/LSTM虽然也能处理序列,但长距离依赖能力差,训练效率也低。
核心观点:Transformer让自动驾驶从“拼积木”变成了“整体铸造”。虽然训练难度大了,但上限也高了。
1.3 Transformer基础回顾:注意力机制与自注意力
Transformer的核心就两个东西:注意力机制和自注意力机制。咱们一个一个说。
1.3.1 注意力机制
注意力机制,说白了就是“加权求和”。你想想看,当你看一张图片时,你不会均匀地看每个像素,而是把注意力集中在关键区域。注意力机制就是干这个的。
数学上,它长这样:
Attention(Q, K, V) = softmax(QK^T / sqrt(d_k)) V
其中:
- Q(Query):查询向量,表示“我想找什么”
- K(Key):键向量,表示“我有什么”
- V(Value):值向量,表示“我能提供什么”
Q和K做点积,得到相似度分数。然后softmax归一化,得到权重。最后用权重对V做加权求和。就这么简单。
小技巧:除以sqrt(d_k)是为了防止点积结果太大,导致softmax梯度消失。我刚开始学的时候老忘这一步,结果模型怎么训都不收敛。后来查了半天才发现是这个问题。
1.3.2 自注意力机制
自注意力跟普通注意力有什么区别?区别在于Q、K、V都来自同一个输入。也就是说,模型在输入序列内部做注意力——每个位置都跟其他位置做交互。
举个例子,句子“我昨天看到一只猫,它很可爱”。自注意力能让“它”这个字跟“猫”关联起来,从而理解“它”指代的是猫。在自动驾驶里,自注意力能让当前帧的车辆跟上一帧的同一辆车关联起来,实现跟踪。
Transformer的编码器就是由多个自注意力层和前馈网络堆叠而成的。每个自注意力层都让模型更好地理解上下文。
1.3.3 位置编码
自注意力有个问题:它不关心顺序。比如“我打你”和“你打我”,在自注意力看来是一样的。这显然不行。所以我们需要位置编码,给每个位置一个独特的标识。
Transformer用的是正弦余弦编码:
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
为什么用这个?因为它能让模型学到相对位置关系。sin和cos的周期性,让不同位置之间的编码有规律可循。
注意:在自动驾驶场景中,位置编码不只是位置索引,还包括时间戳、速度等信息。我曾经在项目中直接把时间戳作为位置编码的一部分,效果出奇地好。你可以试试。
1.4 环境配置:Python、PyTorch、CUDA
好了,理论讲完了,咱们来点实际的。先把环境搭好,后面才能跑代码。
1.4.1 Python环境
我建议用Python 3.8或3.10。3.8比较稳定,3.10支持一些新特性。我个人习惯用Anaconda管理环境,方便隔离。
# 创建虚拟环境
conda create -n autodrive python=3.10
conda activate autodrive
1.4.2 PyTorch安装
PyTorch的安装取决于你的CUDA版本。先看看你的显卡支持什么:
nvidia-smi # 查看CUDA版本
然后去PyTorch官网选对应的命令。比如CUDA 11.8:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
避坑指南:我曾经在CUDA版本上吃过亏。装了个12.0的PyTorch,结果显卡驱动只支持11.8,跑起来各种报错。所以一定要先确认驱动版本,再装PyTorch。
1.4.3 CUDA与cuDNN
CUDA是NVIDIA的并行计算平台,cuDNN是深度神经网络的加速库。如果你用conda装PyTorch,它会自动帮你装好CUDA和cuDNN。但如果你用pip,可能需要手动装。
手动装的话,去NVIDIA官网下载对应版本。注意:CUDA版本要跟PyTorch匹配,cuDNN版本要跟CUDA匹配。
# 验证CUDA是否可用
python -c "import torch; print(torch.cuda.is_available())"
# 输出True就对了
1.4.4 其他依赖
咱们课程还会用到一些常用库,一次性装好:
pip install numpy matplotlib opencv-python pillow tqdm tensorboard
嗯,到这里环境就配好了。如果你在安装过程中遇到问题,别慌。大概率是版本不匹配。先检查CUDA版本,再检查PyTorch版本,最后检查cuDNN版本。按这个顺序排查,90%的问题都能解决。
小结
这一章我们聊了自动驾驶的发展史,对比了传统方案和端到端方案,回顾了Transformer的核心机制,最后把环境搭好了。下一章咱们就开始动手写代码,实现一个简单的端到端模型。
记住,基础不牢,地动山摇。这一章的内容虽然偏理论,但后面每个知识点都会用到。建议你把Transformer的注意力机制手推一遍,真的很有帮助。
好了,咱们下章见。