从基础概念开始,逐步深入介绍Attention机制。

1. Attention机制的核心思想

注意力机制模仿了人类视觉注意力:当我们观察图像或阅读文本时,不会平等处理所有信息,而是将注意力集中在重点部分。

核心公式(基础形式):

Attention(Q,K,V) = softmax(QK^T/√d_k) V
  • Q (Query):当前关注点的表示

  • K (Key):所有位置的标识(标签)

  • V (Value):所有位置的实际内容

  • d_k:缩放因子(防止内积过大)

2. 传统Attention(Encoder-Decoder Attention)

2.1 应用场景

最早用于神经机器翻译(Neural Machine Translation),在Seq2Seq模型中连接编码器和解码器。

2.2 工作原理

# 伪代码示例
编码器输出: 源语言句子各词的隐藏状态 (K和V)
解码器输入: 当前要生成的目标语言词的状态 (Q)

计算过程:
1. Q与每个K计算相似度 → 得到权重分布
2. 对权重进行softmax归一化
3. 用权重加权求和V → 得到上下文向量
4. 上下文向量指导当前词的生成

2.3 特点

  • Q来自解码器K和V来自编码器

  • 解决长距离依赖问题

  • 让解码器在生成每个词时"回看"源序列的不同部分

3. Self-Attention(自注意力)

3.1 核心概念

序列内部自己对自己的注意力。在同一序列中,每个位置都可以关注其他所有位置。

3.2 计算过程

输入序列: [x1, x2, x3, x4]

对每个xi:
1. 生成Qi, Ki, Vi(通过线性变换)
2. Qi与所有Kj计算相似度
3. softmax得到对每个位置的注意力权重
4. 加权求和所有Vj得到xi的新表示

3.3 关键优势

  • 捕获长距离依赖:任意两个位置可以直接交互

  • 并行计算:不像RNN需要逐步计算

  • 全局感受野:每个位置能看到整个序列

4. Multi-Head Attention(多头注意力)

4.1 思想

将Q、K、V投影到多个子空间,并行执行多次注意力,最后拼接结果。

MultiHead(Q,K,V) = Concat(head1,...,headh)W^O
其中 headi = Attention(QW_i^Q, KW_i^K, VW_i^V)

4.2 作用

  • 捕获不同类型的关系(语法、语义等)

  • 增加模型的表达能力

  • 类似卷积神经网络中的多通道

5. Transformer中的三种Attention

5.1 编码器的Self-Attention

  • Q、K、V都来自编码器输入

  • 每个位置可以看到所有位置(包括自己)

5.2 解码器的Masked Self-Attention

  • 只允许看到当前位置及之前的位置

  • 使用掩码机制防止看到未来信息

  • 确保自回归生成特性

5.3 编码器-解码器Attention

  • Q来自解码器,K、V来自编码器输出

  • 让解码器关注输入序列的相关部分

  • 类似传统Attention机制

6. 变体和改进

6.1 位置编码

由于Self-Attention没有位置概念,需要加入位置编码:

PE(pos, 2i) = sin(pos/10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos/10000^(2i/d_model))

6.2 高效变体

  • Sparse Attention:限制注意力范围

  • Linear Attention:将计算复杂度从O(n²)降到O(n)

  • Reformer:使用局部敏感哈希

  • Performer:使用核方法近似

7. 应用实例

7.1 BERT中的Attention

# BERT使用双向Transformer
输入: [CLS] 我 爱 自然语言处理 [SEP]
# 每个词可以关注所有词(包括左右上下文)

7.2 GPT中的Attention

# GPT使用单向(因果)Transformer
输入: 人工智能 是 未来
# 生成"未来"时只能看到"人工智能"和"是"

8. 优缺点总结

优点:

  • ✅ 捕获长距离依赖

  • ✅ 并行计算能力强

  • ✅ 模型可解释性较好(可可视化注意力权重)

  • ✅ 能捕获多层次的关系

缺点:

  • ❌ 计算复杂度O(n²)(n是序列长度)

  • ❌ 对位置信息不敏感(需要额外位置编码)

  • ❌ 深层堆叠可能带来优化困难

  • ❌ 需要大量数据和算力训练

9. 实践建议

  1. 序列长度较短(<512):使用标准Self-Attention

  2. 长文本处理:考虑稀疏注意力或线性注意力变体

  3. 需要位置信息:添加位置编码(绝对或相对)

  4. 多任务学习:多头注意力往往效果好

  5. 训练稳定性:注意层归一化和残差连接

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐