Transformer
Transformer 是一种基于自注意力的神经网络,可并行处理整个序列。了解其工作原理、变体以及在视觉领域的应用。
Transformer 是一种神经网络架构,它处理由词元(例如词语或图像块)组成的序列,让每个词元通过自注意力从其他所有词元中获取信息。Google 研究人员于 2017 年在《Attention Is All You Need》中提出了这种架构,用于机器翻译。早期的循环神经网络 (RNNs)逐词读取句子,因此无法按位置并行训练。Transformer 可以一次处理所有位置,其基础模型在 8 块 GPU 上训练 12 小时后,实现了英语到德语翻译的当时最优水平。如今,Transformer 已成为大型语言模型 (LLMs)、视觉 Transformer、语音识别以及许多目标检测和图像生成模型的基础。
Transformer 的工作原理#
输入词元首先会转换为嵌入向量,即具有固定宽度的向量(原始模型中为 512)。随后,Transformer 会依次应用一组相同的层,每层包含两个子层:
- 多头自注意力:每个词元都会生成一个查询向量、一个键向量和一个值向量。一个词元的输出是所有值向量的加权平均值,权重取决于其查询与各个键的匹配程度,具体如注意力机制所述。多个注意力头会并行运行,原始模型使用 8 个,因此不同的头可以跟踪不同的关系。
- 前馈网络:一个逐个应用于每个词元的两层网络,用于转换注意力机制收集到的信息。
每个子层外都有一个残差连接,而层归一化可保持激活值稳定。原始模型在编码器中堆叠了 6 个这样的层来读取源句子,在解码器中也堆叠了 6 个来逐个词元生成译文。每个解码器层还会增加一个屏蔽未来词元的掩码自注意力步骤,以及一个读取编码器输出的交叉注意力步骤:
注意力只根据内容比较词元,因此 Transformer 层本身不具备顺序概念:打乱输入词元只会打乱输出。因此,需要将位置信息添加到词元嵌入中,方式包括原始论文中的固定正弦和余弦模式、BERT 和 ViT 中的可学习位置向量,或大多数当前 LLM 使用的旋转位置嵌入 (RoPE)。下面的 PyTorch 代码展示了一个编码器层的效果:
import torch
from torch import nn
# 一个 Transformer 编码器层和由 5 个词元嵌入组成的序列
torch.manual_seed(0)
layer = nn.TransformerEncoderLayer(d_model=32, nhead=4, batch_first=True).eval()
tokens = torch.randn(1, 5, 32)
reverse = torch.arange(4, -1, -1)
# 单独使用自注意力时会忽略顺序:反转输入只会反转输出
print(torch.allclose(layer(tokens[:, reverse])[:, reverse], layer(tokens), atol=1e-5))
# 为每个位置添加一个可学习向量后,每个输出都会取决于其词元所在的位置
positions = nn.Embedding(5, 32).weight
reordered = layer(tokens[:, reverse] + positions)[:, reverse]
print(torch.allclose(reordered, layer(tokens + positions), atol=1e-5))它会先输出 True,然后输出 False:添加位置向量之前,反转词元只会反转输出;添加位置向量之后,词元顺序会改变每个词元的输出。
编码器、解码器和编码器-解码器模型#
使用原始堆栈的三种方式分别适用于不同任务:
- 仅编码器:每个词元都能双向关注整个输入,适合理解类任务。文本模型 BERT 和图像模型 ViT 都采用仅编码器架构。
- 仅解码器:每个词元只能关注它之前的词元,因此模型会逐个词元生成文本。GPT 模型和大多数当前 LLM 都采用这种设计。
- 编码器-解码器:编码器读取一个序列,解码器在关注该序列的同时生成另一个序列,翻译模型、T5 和 Whisper 语音识别器都采用这种架构。
计算机视觉中的 Transformer#
视觉 Transformer (ViT) 将图像视为由 16×16 像素图像块组成的序列,并应用未经修改的 Transformer 编码器;Swin Transformer 则将注意力限制在局部窗口内,从而适用于高分辨率图像。DETR 将检测重新定义为集合预测:Transformer 解码器将一组固定数量的可学习目标查询转换为边界框,每个查询对应一个目标,从而无需使用非极大值抑制 (NMS) 和人工设计的锚框。Ultralytics 软件包可运行百度的 RT-DETR,这是这种设计的实时版本。它的混合编码器仅对步幅为 32 的特征图应用一个 Transformer 编码器层;对于 640×640 图像,该特征图包含 400 个词元。其 6 层解码器会优化 300 个目标查询,生成最终检测结果,无需使用 NMS。Transformer 也能生成图像:近期的文本生成图像和视频模型已使用扩散 Transformer取代 U-Net,而视觉语言模型则将图像词元输入仅解码器 LLM。
Transformer 与相关架构的比较#
- 卷积神经网络 (CNNs):卷积会使用同一个滤波器在每个位置观察一个小邻域,这种内置假设有助于处理小型数据集。注意力可以在一个层内连接任意两个位置,但必须从数据中学习空间结构,因此 Transformer 通常需要更多训练数据或预训练,才能胜过 CNN。
- RNN 和 LSTM:它们会在各时间步之间传递固定大小的状态,因此每个词元的内存占用保持恒定,但训练过程是顺序进行的。Transformer 会保留所有过去的词元,并支持并行训练。
- 状态空间模型:Mamba 等架构使用循环状态处理序列,其计算成本随序列长度线性增长;混合模型则会将这类架构与注意力层交错组合。
自注意力会将每个词元与其他所有词元进行比较,因此计算成本会随序列长度的平方增长。长度为 4,096 的序列在每层的每个注意力头中约有 1,680 万个查询-键对;长度翻倍至 8,192 后,这一数量会增至约 6,700 万,是原来的 4 倍。FlashAttention 可减少这项计算的内存流量,而 KV 缓存会存储较早词元的键和值,使解码器在生成过程中只需计算它们一次。










