Transformer与注意力机制

掌握Transformer核心技术

一、注意力机制概述

注意力机制(Attention Mechanism)是深度学习领域最具影响力的创新之一,其灵感来源于人类视觉认知系统的选择性注意力现象。人类在处理视觉信息时,并非均匀关注整个场景,而是将有限的认知资源集中在最相关的区域上。注意力机制正是借鉴了这一思想,让神经网络学会"关注"输入中的重要部分,忽略不相关的信息。

为什么需要注意力机制?

  • 长序列建模困境: 传统的RNN/LSTM在处理长序列时存在严重的梯度消失/爆炸问题,难以捕捉远距离依赖关系
  • 信息筛选需求: 在机器翻译、文本摘要等任务中,输出序列的每一步都需要从输入序列的不同位置获取信息,而非机械地依赖于最后一个隐藏状态
  • 并行计算限制: RNN必须按时间步顺序计算,无法并行化,训练效率低下
  • 瓶颈问题: 传统Encoder-Decoder架构中,编码器只能将整个输入序列压缩为一个固定长度的上下文向量,形成信息瓶颈

在Encoder-Decoder架构中,注意力机制的工作原理是:解码器在生成每个输出词时,动态地计算编码器所有隐藏状态的加权和,权重由当前解码状态与各编码器状态的匹配程度决定。这使得模型不需要将全部输入信息压缩进一个固定向量,而是可以灵活地"查阅"原始输入中的相关内容。

注意力机制的核心公式

给定查询(Query)和一组键值对(Key-Value pairs),注意力输出是值的加权和:

Attention(Q, K, V) = softmax(score(Q, K)) · V

其中 score 函数衡量查询 Q 和键 K 之间的匹配程度,softmax将得分归一化为概率分布,最后与值 V 加权求和得到最终的注意力输出。

二、Seq2Seq与注意力

Seq2Seq模型回顾

Seq2Seq(Sequence-to-Sequence)模型由编码器(Encoder)和解码器(Decoder)两个RNN组成。编码器将输入序列读取为一个固定长度的上下文向量,解码器则根据这个上下文向量逐步生成输出序列。这种结构在机器翻译、文本摘要、对话生成等任务中取得了显著成功,但其瓶颈也很明显——固定长度的上下文向量难以完整保存长序列的信息。

Bahdanau注意力(加性注意力)

2015年,Bahdanau等人首次将注意力机制引入神经机器翻译,提出加性注意力(Additive Attention)。其核心思想是:在解码器生成每个词时,重新计算编码器各隐藏状态的注意力分布,而非仅依赖一个固定的上下文向量。

加性注意力的得分计算方式为:

score(st, hi) = vT · tanh(Wa · [st ; hi])

其中 st 是解码器当前隐藏状态,hi 是编码器第 i 个隐藏状态,Wa 和 v 是可学习的参数。这种方法通过一个小型前馈神经网络来计算匹配得分,因此称为"加性"注意力。

Luong注意力(乘性注意力)

2015年,Luong等人在Bahdanau工作的基础上提出了改进方案,称为乘性注意力(Multiplicative Attention)或全局注意力。Luong注意力提供了三种得分计算方式:

注意力权重的可视化

注意力机制的一个巨大优势是其可解释性。通过将注意力权重矩阵以热力图的形式可视化,我们可以直观地看到模型在生成每个输出词时,关注了输入序列的哪些部分。例如在机器翻译中,"I love you"翻译为"我爱你"时,可以看到"我"对应"I"、"爱"对应"love"、"你"对应"you"的对齐关系。这种可视化不仅帮助理解模型行为,还可以用于诊断翻译错误——如果注意力对齐不正确,翻译结果往往也会出错。

三、Self-Attention自注意力

自注意力的核心思想

自注意力(Self-Attention),也称为内部注意力(Intra-Attention),是注意力机制中最重要的发展之一。与Seq2Seq中编码器和解码器之间的交叉注意力不同,自注意力在同一序列内部计算注意力分布——每个位置都可以关注序列中所有其他位置。这使得模型能够捕捉序列内部的长距离依赖关系,同时保持计算的高效性。

QKV三矩阵

自注意力的核心是通过三个可学习的权重矩阵,将每个输入向量映射为三个不同的表示:

  • Query(查询): Q = X · WQ,表示当前"提问"的内容,即我们想从其他位置获取什么样的信息
  • Key(键): K = X · WK,表示当前"被索引"的内容,即其他位置能提供什么样的信息
  • Value(值): V = X · WV,表示当前"实际提供"的信息内容

类比理解:可以将注意力机制想象为一个信息检索系统。Query是你的搜索词,Key是文档的索引标签,Value是文档的实际内容。系统首先计算搜索词与各文档标签的匹配度,然后根据匹配度从各文档提取相关内容的加权和。

缩放点积注意力(Scaled Dot-Product Attention)

Transformer使用的自注意力具体形式是缩放点积注意力,其计算步骤如下:

  1. 计算注意力得分: 将Query矩阵与Key矩阵的转置做点积,得到一个 N×N 的注意力得分矩阵(N为序列长度)
  2. 缩放: 将得分除以 dk 的平方根(dk为Key向量的维度),防止点积结果过大
  3. Softmax归一化: 对每一行应用softmax,得到注意力权重矩阵,每行之和为1
  4. 加权求和: 将注意力权重矩阵与Value矩阵相乘,得到最终的输出
Attention(Q, K, V) = softmax(Q · KT / sqrt(dk)) · V

缩放因子的重要作用

为什么需要缩放因子 sqrt(dk)?当 dk 较大时,点积 Q · KT 的值会随维度增加而变大,使得softmax函数的输入进入梯度极小区域(即softmax的两端),导致梯度极度趋近于零,模型训练变得非常困难。通过除以 sqrt(dk) 进行缩放,可以将方差控制为1,确保softmax函数工作在梯度适中的区域,保持梯度稳定传播。

自注意力的优势

四、Multi-Head Attention多头注意力

多头注意力的动机

单一注意力函数虽然在很多任务上表现良好,但其表达能力存在局限——单次注意力只能在一种表示子空间中计算相关性。现实中,序列中元素之间的关系往往是复杂的、多层面的。例如在句子"苹果很好吃,但是太贵了"中,"苹果"与"好吃"存在口味关系,与"贵"存在价格关系,与"太"存在程度关系。单一注意力难以同时捕捉这些不同类型的关联。

多头注意力(Multi-Head Attention) 将注意力计算拆分为多个并行的"头",每个头在不同的表示子空间中独立计算注意力,最后将所有头的输出拼接起来。通过这种方式,模型可以从多个角度同时关注输入的不同部分,极大地提升了注意力机制的表示能力。

多头注意力的计算流程

  1. 线性投影: 分别使用 h 组不同的权重矩阵 (WQi, WKi, WVi) 将 Q, K, V 投影到不同的子空间,每个子空间的维度为 dk = dmodel / h
  2. 并行计算: 对 h 组投影后的 Qi, Ki, Vi 并行执行缩放点积注意力,得到 h 个不同的注意力输出
  3. 拼接与投影: 将 h 个头部的输出沿特征维度拼接,再通过一个输出投影矩阵 WO 将拼接结果映射回 dmodel 维度
MultiHead(Q, K, V) = Concat(head1, ..., headh) · WO
where headi = Attention(Q · WQi, K · WKi, V · WVi)

多头 vs 单头对比

对比维度 单头注意力 多头注意力
表示子空间 单一子空间 多个不同子空间
关注模式 一种对齐方式 多种对齐方式(语法、语义等)
参数数量 较少 较多(但更有效)
计算复杂度 O(n² · d) O(n² · d)(与单头相同,因每个头维度按比例减小)
表达能力 有限 强(多头集成效果更佳)

值得注意的是,虽然多头注意力有更多参数和计算,但通过将每个头的维度减小为 dmodel / h,总计算量与单头(维度为 dmodel)注意力基本持平。Transformer原论文中设置 h=8,dmodel=512,即每个头的维度为64。

五、Transformer架构

总体架构

2017年,Vaswani等人在论文《Attention Is All You Need》中提出了Transformer架构,彻底摒弃了循环和卷积结构,完全基于注意力机制构建。Transformer采用编码器-解码器结构,编码器由 N 个相同的层堆叠而成,解码器同样由 N 个相同的层堆叠而成。

编码器层(每层包含两个子层)

  1. 多头自注意力(Multi-Head Self-Attention): 对输入序列中的每个位置计算自注意力,捕获序列内部的依赖关系
  2. 前馈神经网络(FFN): 对注意力输出进行非线性变换,增加模型的表达能力

每个子层都使用了残差连接(Residual Connection)层归一化(Layer Normalization),即:LayerNorm(x + Sublayer(x))。

解码器层(每层包含三个子层)

  1. 掩码多头自注意力(Masked Multi-Head Self-Attention): 与编码器类似,但通过掩码阻止当前位置关注未来的位置,确保自回归属性(即预测时只能看到已生成的词)
  2. 编码器-解码器注意力(Cross-Attention): Query来自解码器,Key和Value来自编码器输出,使解码器在生成每个词时能够关注输入序列的相关部分
  3. 前馈神经网络(FFN): 与编码器相同的非线性变换

位置编码(Positional Encoding)

自注意力机制本身是排列不变(Permutation Invariant)的——如果打乱输入序列的顺序,输出也会以相同方式打乱,但值不变。这意味着自注意力无法感知序列中元素的先后顺序,而这在自然语言中至关重要("我打你" ≠ "你打我")。

为了解决这个问题,Transformer引入了位置编码(Positional Encoding),将位置信息注入输入表示中:

PE(pos, 2i) = sin(pos / 100002i / dmodel)
PE(pos, 2i+1) = cos(pos / 100002i / dmodel)

使用正弦和余弦函数的好处:

残差连接与层归一化

残差连接(Residual Connection):将子层的输入直接与输出相加,使得梯度可以直接通过"捷径"流回浅层,有效缓解深层网络中的梯度消失问题。正是残差连接让Transformer能够堆叠到很深的层数(如BERT-base有12层,BERT-large有24层)。

层归一化(Layer Normalization):对每个样本的所有特征维度进行归一化(计算均值和方差),使得每层的输出分布更加稳定,加速模型收敛。与批归一化(Batch Normalization)不同,层归一化的计算不依赖批次大小,更适合处理变长序列。

前馈神经网络(FFN)

Transformer中的FFN是一个两层的全连接网络,中间使用ReLU激活函数:

FFN(x) = max(0, x · W1 + b1) · W2 + b2

其中中间层的维度 dff 通常远大于输入输出维度 dmodel。在Transformer-base中,dmodel=512,dff=2048(4倍)。这个扩大-压缩的结构使模型能够在更高维的空间中进行特征变换,增强非线性表达能力。

掩码多头自注意力

解码器中的自注意力使用上三角掩码矩阵,将当前位置之后的所有位置对应的注意力权重设置为 -∞(经过softmax后趋近于0)。这确保了模型在生成第 t 个词时,只能看到前 t-1 个词的信息,而看不到未来的词。这种设计保持了自回归生成的一致性——训练和推理时的信息流是一致的。

六、Transformer的应用

BERT(双向编码器表示)

BERT(Bidirectional Encoder Representations from Transformers)由Google于2018年提出,使用Transformer的编码器部分,通过掩码语言模型(Masked Language Model, MLM)下一句预测(Next Sentence Prediction, NSP)两个预训练任务,从大规模无标注文本中学习通用的语言表示。BERT的关键贡献在于:

GPT系列(自回归解码器)

GPT(Generative Pre-trained Transformer)由OpenAI提出,使用Transformer的解码器部分,通过自回归语言建模(预测下一个词)进行预训练。GPT的创新之处在于:

对比维度 BERT GPT
架构 Transformer编码器 Transformer解码器
注意力方式 双向(无掩码) 单向(因果掩码)
预训练目标 MLM + NSP 自回归语言建模
擅长任务 文本分类、NER、QA 文本生成、对话、代码
代表模型 BERT、RoBERTa、ALBERT GPT-2、GPT-3、GPT-4

Vision Transformer(ViT)

2020年,Dosovitskiy等人将Transformer应用于计算机视觉,提出了Vision Transformer(ViT)。ViT将图像分割为固定大小的patches(如16x16),将每个patch展平后做线性投影作为token,加上位置编码后送入标准的Transformer编码器处理。ViT在ImageNet等大规模图像分类任务上超越了当时最先进的卷积神经网络(如ResNet、EfficientNet),证明了Transformer在视觉领域的强大潜力。

其他重要变体

七、Transformer的优势与挑战

并行计算

这是Transformer相较于RNN最显著的优势。RNN在处理序列时必须按时间步顺序计算(串行),每个时间步的计算依赖于前一个时间步的结果,无法并行化。而Transformer的自注意力计算在所有位置上同时进行,可以充分利用GPU的并行计算能力,大幅加速训练过程。这也是为什么Transformer能够在更大的数据集上训练更深、更宽的模型。

计算路径长度对比

模型 最大路径长度 计算复杂度(单层) 可并行化
RNN O(n) O(n · d²)
CNN(扩张卷积) O(log n) O(k · n · d)
Transformer(自注意力) O(1) O(n² · d)

虽然Transformer的单层计算复杂度为 O(n² · d),但考虑到其O(1)的最短路径长度和完全并行化的计算模式,在长序列建模任务中整体效率仍然优于RNN。

长距离依赖建模

自注意力机制使每个位置都能直接关注序列中的任意其他位置,信息传递只需一步,不存在RNN中的梯度消失/爆炸问题。这使得Transformer特别适合对长距离依赖关系有高要求的任务,如篇章级别的文本理解、文档摘要、蛋白质序列分析等。

计算复杂度与优化

优势

  • 全局依赖捕获一步到位
  • 完全可并行化训练
  • 动态权重,灵活适应不同输入
  • 在视觉、语音、多模态等领域广泛适用
  • 预训练-微调范式效果优异

挑战

  • 自注意力计算复杂度为 O(n²),处理超长序列时显存和计算开销巨大
  • 缺少归纳偏置(如CNN的平移等变性、RNN的时间顺序),需要大量数据学习
  • 位置编码对绝对位置的建模方式限制了外推能力
  • 大规模预训练需要巨大的计算资源和能源消耗
  • 可解释性仍然是一个开放问题

针对计算复杂度的优化方法

为克服 O(n²) 的计算瓶颈,研究者提出了多种高效Transformer变体:

大规模预训练

随着模型规模的不断增大(GPT-3 175B、PaLM 540B、LLaMA 65B),大规模预训练成为Transformer应用的核心范式。预训练的关键技术包括:

八、核心要点总结

九、进一步思考

Transformer自2017年诞生以来,已经从NLP领域扩展到计算机视觉(ViT)、语音处理(Speech Transformer)、多模态学习(CLIP、DALL-E)、科学计算(AlphaFold2)等几乎所有AI领域,成为深度学习中最基础、最重要的架构之一。

未来发展方向

  • 高效Transformer: 突破O(n²)计算瓶颈,实现百万级token的上下文窗口
  • 推理优化: KV缓存、FlashAttention、推测解码等推理加速技术
  • 多模态融合: 统一处理文本、图像、视频、音频的通用Transformer架构
  • Agent与工具使用: 将Transformer模型与外部工具、知识库、代码执行环境结合
  • 长上下文窗口: GPT-4的128K、Claude的200K、Gemini的1M token等超长上下文的探索

理解Transformer的原理不仅对深度学习研究至关重要,也是掌握现代AI技术体系的基石。从注意力机制出发,逐步理解Transformer的各组件设计,再到BERT、GPT等代表性模型的应用,是一条系统学习和掌握现代自然语言处理技术的有效路径。