上篇聊了RNN和LSTM在序列建模中的作用。LSTM解决了梯度消失的问题,在很长一段时间里是序列建模的主力。但2017年Google的那篇"Attention Is All You Need"改变了游戏规则。

Transformer完全抛弃了循环结构,用自注意力机制(Self-Attention)来处理序列数据。这个架构在NLP领域引发了革命(GPT、BERT都是Transformer的变体),现在也深刻影响了计算机视觉和机器人领域。

自注意力机制的直觉

自注意力的核心思想很直观:对于序列中的每个元素,看看它跟其他所有元素的关系有多强,然后根据这个关系加权聚合信息。

举个机器人的例子。你有一串IMU数据,要判断当前时刻机器人的运动状态。第100步的数据可能跟第50步(开始转弯)和第80步(加速)都有关系,但关系的强度不同。自注意力就是让网络自己学习这些关系的权重。

# 自注意力的核心计算
# Q, K, V 分别是query, key, value矩阵
# 由输入x经过线性变换得到
def self_attention(Q, K, V):
    scores = Q @ K.T / sqrt(d_k)  # 计算注意力分数
    weights = softmax(scores, dim=-1)  # 归一化成权重
    output = weights @ V  # 加权求和
    return output

除以sqrt(d_k)是为了防止点积过大导致softmax梯度消失。当维度d_k比较大时,两个随机向量的点积方差也会很大,导致softmax的输出接近one-hot分布,梯度几乎为零。除以sqrt(d_k)起到了方差归一化的作用。这个细节面试时经常被问到,要能解释清楚背后的数学直觉。

多头注意力(Multi-Head Attention)是把Q、K、V分成多组,每组独立计算注意力,然后拼接起来。不同的"头"可以关注不同方面的关系——一个头关注时间上的邻近关系,另一个头关注周期性的模式。原始论文用了8个头,每个头的维度是d_model/8,总计算量和单头差不多。实际使用中,头的数量是个超参数,一般4到16个头。太多头反而可能降低效果,因为每个头的维度太小了,表达能力受限。

还有一个重要的组件是前馈网络(FFN)。每一层Transformer除了注意力之外,还有一个逐位置的前馈网络(通常是两层线性变换加一个ReLU或GELU激活)。FFN的作用是对注意力聚合后的特征做非线性变换,增加模型的表达能力。很多人把注意力当成Transformer的全部,其实FFN同样重要。

位置编码:弥补丢失的顺序信息

自注意力有个特点:它对所有位置是一视同仁的。不管两个元素在序列中相距多远,注意力的计算方式都一样。这跟LSTM不同,LSTM天然有顺序的概念(信息一步步传递)。

但序列的顺序信息很重要。"机器人先左转再直行"和"先直行再左转"是完全不同的轨迹。Transformer用位置编码(Positional Encoding)来注入位置信息。

原始论文用的是正弦余弦函数来生成位置编码。不同频率的正弦波叠加,给每个位置一个独特的向量表示。这种编码方式有个好处:相对位置可以通过线性变换来表示,这有助于模型学习位置之间的关系。后来的工作(比如RoPE、ALiBi)提出了更好的位置编码方案,特别是在处理长序列时。RoPE把位置信息编码到旋转矩阵中,在LLaMA等大模型中广泛使用。ALiBi更简单粗暴,直接在注意力分数上减一个跟距离成正比的惩罚项。

# 正弦余弦位置编码
def positional_encoding(seq_len, d_model):
    pos = np.arange(seq_len)[:, None]
    i = np.arange(d_model)[None, :]
    angles = pos / np.power(10000, 2*i/d_model)
    pe = np.zeros((seq_len, d_model))
    pe[:, 0::2] = np.sin(angles[:, 0::2])
    pe[:, 1::2] = np.cos(angles[:, 1::2])
    return pe  # (seq_len, d_model)

Transformer在视觉中的应用

Vision Transformer(ViT,2020)证明了Transformer可以直接用于图像分类。做法很暴力:把图像切成16×16的小块(patch),每个patch展平后当作一个token,跟NLP中的词向量一样处理。

ViT在大数据集上训练后,精度超过了同参数量的CNN。但它在小数据集上表现不如CNN,原因是Transformer缺少CNN的归纳偏置(平移不变性、局部性)。

在机器人领域,ViT的思路被进一步扩展。BEVFormer(2022)用Transformer把多相机图像特征转换到鸟瞰图(BEV)空间,用于自动驾驶的3D感知。这个方案的核心是用空间交叉注意力(Spatial Cross-Attention)来建立2D图像特征和3D BEV特征之间的对应关系。

Transformer在机器人控制中的应用

近年来Transformer在机器人控制中越来越受关注。几个代表性工作值得一提。

Decision Transformer(2021)把强化学习重新定义为一个序列建模问题。把状态、动作、回报组成的序列喂给Transformer,让它预测下一步的动作。这跟GPT预测下一个token的思路完全一样。好处是可以利用Transformer强大的序列建模能力,坏处是推理速度比传统RL策略慢。

RT-2(Robotics Transformer 2,2023)是Google DeepMind的工作,把机器人的视觉-语言-动作统一在一个Transformer模型中。输入是语言指令和相机图像,输出是机器人的动作token。比如你对机器人说"把红色的杯子放到桌子上",模型会根据相机看到的画面,输出机械臂的关节角度或末端位姿。这个模型展示了大规模预训练在机器人领域的潜力,55亿参数的模型能泛化到没见过的物体和指令组合。

Octo(2024)是一个开源的通用机器人策略模型,基于Transformer架构,在多个机器人数据集上联合训练。它的设计目标是做一个能跨机器人本体泛化的基础模型——在一种机器人上训练的策略,迁移到另一种形态的机器人上也能用。这离真正的通用机器人还有距离,但方向是对的。

面试高频问题

面试官问Transformer,最常追问的几个方向。

自注意力的计算复杂度。对于长度为n的序列,自注意力的时间和空间复杂度都是O(n²)。这是因为每个位置都要跟所有其他位置计算注意力分数。对于长序列(比如机器人长时间运行的传感器数据),这个开销很大。解决方案包括:稀疏注意力(只关注附近的窗口)、线性注意力(用核函数近似softmax)、FlashAttention(优化GPU内存访问)。

Transformer和CNN的对比。CNN有局部性和平移不变性的归纳偏置,适合处理空间结构化的数据。Transformer更灵活,能建模全局依赖,但需要更多数据来学习这些结构。在实际项目中,很多方案会结合两者——用CNN提取局部特征,用Transformer建模全局关系。

推理延迟的问题。Transformer的推理速度通常比LSTM慢,因为自注意力需要处理整个序列。在机器人的实时控制中(比如1kHz的控制频率),这个延迟可能是致命的。实际部署时通常需要做模型压缩:量化、剪枝、知识蒸馏,或者限制序列长度。

给你的建议

Transformer是现在深度学习的基础架构,不管你做不做机器人,都必须掌握。建议按这个顺序学习:先理解自注意力的数学原理,再读原始论文"Attention Is All You Need",然后跑一个ViT的示例。

在机器人方向,重点关注Transformer在感知(BEV感知、点云处理)和控制(Decision Transformer、VLA模型)两个方面的应用。这两块是面试热点,也是工业界正在探索的方向。

动手实践方面,HuggingFace的transformers库是入门的好工具。你可以用它快速搭建一个Transformer模型,在简单的机器人数据集上跑个实验。理解架构原理后,再去看Decision Transformer和RT-2的论文,会容易很多。


上一篇:第299篇 RNN与LSTM——序列建模的基础

下一篇预告:第301篇 强化学习基础——马尔可夫决策过程

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐