注意力机制(Attention Mechanism)是深度学习领域最具影响力的创新之一,其灵感来源于人类视觉认知系统的选择性注意力现象。人类在处理视觉信息时,并非均匀关注整个场景,而是将有限的认知资源集中在最相关的区域上。注意力机制正是借鉴了这一思想,让神经网络学会"关注"输入中的重要部分,忽略不相关的信息。
在Encoder-Decoder架构中,注意力机制的工作原理是:解码器在生成每个输出词时,动态地计算编码器所有隐藏状态的加权和,权重由当前解码状态与各编码器状态的匹配程度决定。这使得模型不需要将全部输入信息压缩进一个固定向量,而是可以灵活地"查阅"原始输入中的相关内容。
给定查询(Query)和一组键值对(Key-Value pairs),注意力输出是值的加权和:
其中 score 函数衡量查询 Q 和键 K 之间的匹配程度,softmax将得分归一化为概率分布,最后与值 V 加权求和得到最终的注意力输出。
Seq2Seq(Sequence-to-Sequence)模型由编码器(Encoder)和解码器(Decoder)两个RNN组成。编码器将输入序列读取为一个固定长度的上下文向量,解码器则根据这个上下文向量逐步生成输出序列。这种结构在机器翻译、文本摘要、对话生成等任务中取得了显著成功,但其瓶颈也很明显——固定长度的上下文向量难以完整保存长序列的信息。
2015年,Bahdanau等人首次将注意力机制引入神经机器翻译,提出加性注意力(Additive Attention)。其核心思想是:在解码器生成每个词时,重新计算编码器各隐藏状态的注意力分布,而非仅依赖一个固定的上下文向量。
加性注意力的得分计算方式为:
其中 st 是解码器当前隐藏状态,hi 是编码器第 i 个隐藏状态,Wa 和 v 是可学习的参数。这种方法通过一个小型前馈神经网络来计算匹配得分,因此称为"加性"注意力。
2015年,Luong等人在Bahdanau工作的基础上提出了改进方案,称为乘性注意力(Multiplicative Attention)或全局注意力。Luong注意力提供了三种得分计算方式:
注意力机制的一个巨大优势是其可解释性。通过将注意力权重矩阵以热力图的形式可视化,我们可以直观地看到模型在生成每个输出词时,关注了输入序列的哪些部分。例如在机器翻译中,"I love you"翻译为"我爱你"时,可以看到"我"对应"I"、"爱"对应"love"、"你"对应"you"的对齐关系。这种可视化不仅帮助理解模型行为,还可以用于诊断翻译错误——如果注意力对齐不正确,翻译结果往往也会出错。
自注意力(Self-Attention),也称为内部注意力(Intra-Attention),是注意力机制中最重要的发展之一。与Seq2Seq中编码器和解码器之间的交叉注意力不同,自注意力在同一序列内部计算注意力分布——每个位置都可以关注序列中所有其他位置。这使得模型能够捕捉序列内部的长距离依赖关系,同时保持计算的高效性。
自注意力的核心是通过三个可学习的权重矩阵,将每个输入向量映射为三个不同的表示:
类比理解:可以将注意力机制想象为一个信息检索系统。Query是你的搜索词,Key是文档的索引标签,Value是文档的实际内容。系统首先计算搜索词与各文档标签的匹配度,然后根据匹配度从各文档提取相关内容的加权和。
Transformer使用的自注意力具体形式是缩放点积注意力,其计算步骤如下:
为什么需要缩放因子 sqrt(dk)?当 dk 较大时,点积 Q · KT 的值会随维度增加而变大,使得softmax函数的输入进入梯度极小区域(即softmax的两端),导致梯度极度趋近于零,模型训练变得非常困难。通过除以 sqrt(dk) 进行缩放,可以将方差控制为1,确保softmax函数工作在梯度适中的区域,保持梯度稳定传播。
单一注意力函数虽然在很多任务上表现良好,但其表达能力存在局限——单次注意力只能在一种表示子空间中计算相关性。现实中,序列中元素之间的关系往往是复杂的、多层面的。例如在句子"苹果很好吃,但是太贵了"中,"苹果"与"好吃"存在口味关系,与"贵"存在价格关系,与"太"存在程度关系。单一注意力难以同时捕捉这些不同类型的关联。
多头注意力(Multi-Head Attention) 将注意力计算拆分为多个并行的"头",每个头在不同的表示子空间中独立计算注意力,最后将所有头的输出拼接起来。通过这种方式,模型可以从多个角度同时关注输入的不同部分,极大地提升了注意力机制的表示能力。
| 对比维度 | 单头注意力 | 多头注意力 |
|---|---|---|
| 表示子空间 | 单一子空间 | 多个不同子空间 |
| 关注模式 | 一种对齐方式 | 多种对齐方式(语法、语义等) |
| 参数数量 | 较少 | 较多(但更有效) |
| 计算复杂度 | O(n² · d) | O(n² · d)(与单头相同,因每个头维度按比例减小) |
| 表达能力 | 有限 | 强(多头集成效果更佳) |
值得注意的是,虽然多头注意力有更多参数和计算,但通过将每个头的维度减小为 dmodel / h,总计算量与单头(维度为 dmodel)注意力基本持平。Transformer原论文中设置 h=8,dmodel=512,即每个头的维度为64。
2017年,Vaswani等人在论文《Attention Is All You Need》中提出了Transformer架构,彻底摒弃了循环和卷积结构,完全基于注意力机制构建。Transformer采用编码器-解码器结构,编码器由 N 个相同的层堆叠而成,解码器同样由 N 个相同的层堆叠而成。
每个子层都使用了残差连接(Residual Connection)和层归一化(Layer Normalization),即:LayerNorm(x + Sublayer(x))。
自注意力机制本身是排列不变(Permutation Invariant)的——如果打乱输入序列的顺序,输出也会以相同方式打乱,但值不变。这意味着自注意力无法感知序列中元素的先后顺序,而这在自然语言中至关重要("我打你" ≠ "你打我")。
为了解决这个问题,Transformer引入了位置编码(Positional Encoding),将位置信息注入输入表示中:
使用正弦和余弦函数的好处:
残差连接(Residual Connection):将子层的输入直接与输出相加,使得梯度可以直接通过"捷径"流回浅层,有效缓解深层网络中的梯度消失问题。正是残差连接让Transformer能够堆叠到很深的层数(如BERT-base有12层,BERT-large有24层)。
层归一化(Layer Normalization):对每个样本的所有特征维度进行归一化(计算均值和方差),使得每层的输出分布更加稳定,加速模型收敛。与批归一化(Batch Normalization)不同,层归一化的计算不依赖批次大小,更适合处理变长序列。
Transformer中的FFN是一个两层的全连接网络,中间使用ReLU激活函数:
其中中间层的维度 dff 通常远大于输入输出维度 dmodel。在Transformer-base中,dmodel=512,dff=2048(4倍)。这个扩大-压缩的结构使模型能够在更高维的空间中进行特征变换,增强非线性表达能力。
解码器中的自注意力使用上三角掩码矩阵,将当前位置之后的所有位置对应的注意力权重设置为 -∞(经过softmax后趋近于0)。这确保了模型在生成第 t 个词时,只能看到前 t-1 个词的信息,而看不到未来的词。这种设计保持了自回归生成的一致性——训练和推理时的信息流是一致的。
BERT(Bidirectional Encoder Representations from Transformers)由Google于2018年提出,使用Transformer的编码器部分,通过掩码语言模型(Masked Language Model, MLM)和下一句预测(Next Sentence Prediction, NSP)两个预训练任务,从大规模无标注文本中学习通用的语言表示。BERT的关键贡献在于:
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 |
2020年,Dosovitskiy等人将Transformer应用于计算机视觉,提出了Vision Transformer(ViT)。ViT将图像分割为固定大小的patches(如16x16),将每个patch展平后做线性投影作为token,加上位置编码后送入标准的Transformer编码器处理。ViT在ImageNet等大规模图像分类任务上超越了当时最先进的卷积神经网络(如ResNet、EfficientNet),证明了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²) 的计算瓶颈,研究者提出了多种高效Transformer变体:
随着模型规模的不断增大(GPT-3 175B、PaLM 540B、LLaMA 65B),大规模预训练成为Transformer应用的核心范式。预训练的关键技术包括:
Transformer自2017年诞生以来,已经从NLP领域扩展到计算机视觉(ViT)、语音处理(Speech Transformer)、多模态学习(CLIP、DALL-E)、科学计算(AlphaFold2)等几乎所有AI领域,成为深度学习中最基础、最重要的架构之一。
理解Transformer的原理不仅对深度学习研究至关重要,也是掌握现代AI技术体系的基石。从注意力机制出发,逐步理解Transformer的各组件设计,再到BERT、GPT等代表性模型的应用,是一条系统学习和掌握现代自然语言处理技术的有效路径。