深入理解 Self Attention:Transformer 的核心机制
Self Attention(自注意力)是 Transformer 模型的核心创新,它让模型能够同时关注输入序列中所有位置的信息,彻底改变了自然语言处理的方式。
为什么需要 Self Attention?
在 Self Attention 出现之前,处理序列数据主要依赖 RNN(循环神经网络)和 LSTM。它们的核心问题是串行处理:必须一步步从前到后处理每个词,无法并行。
RNN 的处理方式:
步骤 1: 处理 "我" → 隐藏状态 h1
步骤 2: 处理 "喜欢" → 结合 h1 → 隐藏状态 h2
步骤 3: 处理 "吃" → 结合 h2 → 隐藏状态 h3
步骤 4: 处理 "苹果" → 结合 h3 → 最终输出
问题:信息逐层传递,距离越远越容易丢失
Self Attention 的解决方案:让每个词直接看到所有其他词,不需要排队。
Self Attention 的处理方式:
"我" → 直接关联 → "喜欢" "吃" "苹果"(所有词同时可见)
"喜欢" → 直接关联 → "我" "吃" "苹果"
"吃" → 直接关联 → "我" "喜欢" "苹果"
"苹果" → 直接关联 → "我" "喜欢" "吃"
Self Attention 的三个核心概念
1. Query、Key、Value
每个输入词都会生成三个向量:
- Query(查询):当前词在"寻找"什么信息
- Key(键):当前词"提供"什么索引信息
- Value(值):当前词实际"携带"的内容信息
# 概念示意
词向量 x → 三个线性变换:
Q = x @ W_Q # 我在找什么?
K = x @ W_K # 我能提供什么?
V = x @ W_V # 我的实际内容
2. 注意力分数计算
通过 Query 和 Key 的点积计算每个词对其他词的"关注度":
注意力分数 = Q · K^T / √d_k
其中 d_k 是 Key 向量的维度(用于缩放,防止梯度消失)
"吃" 对 "苹果" 的注意力分数 = Q_吃 · K_苹果 / √d_k
3. Softmax 归一化
将原始分数转换为概率分布(和为 1):
原始分数: [2.1, 0.5, 1.8, 3.2]
Softmax: [0.24, 0.04, 0.19, 0.53]
"我" "喜欢" "吃" "苹果"
含义:"吃" 这个词最关注 "苹果"(53%),其次是 "我"(24%)
完整计算流程
用一个完整例子走一遍:
输入句子:"小猫 吃 鱼"
步骤 1: 生成 Q, K, V
小猫: Q1=[0.2,0.8], K1=[0.1,0.9], V1=[0.3,0.7]
吃: Q2=[0.5,0.5], K2=[0.6,0.4], V2=[0.8,0.2]
鱼: Q3=[0.9,0.1], K3=[0.8,0.2], V3=[0.4,0.6]
步骤 2: 计算注意力分数
小猫 对 所有词: Q1·[K1,K2,K3]^T = [0.82, 0.50, 0.26]
吃 对 所有词: Q2·[K1,K2,K3]^T = [0.50, 0.52, 0.50]
鱼 对 所有词: Q3·[K1,K2,K3]^T = [0.17, 0.52, 0.74]
步骤 3: Scale + Softmax
注意力权重矩阵:
小猫 吃 鱼
小猫: [0.40, 0.30, 0.30]
吃: [0.33, 0.34, 0.33]
鱼: [0.22, 0.34, 0.44]
步骤 4: 加权求和
输出_小猫 = 0.40×V1 + 0.30×V2 + 0.30×V3
输出_吃 = 0.33×V1 + 0.34×V2 + 0.33×V3
输出_鱼 = 0.22×V1 + 0.34×V2 + 0.44×V3
Self Attention 的优势
| 特性 | RNN/LSTM | Self Attention |
|---|---|---|
| 并行计算 | ❌ 串行 | ✅ 完全并行 |
| 长距离依赖 | 信息随距离衰减 | 任意距离直接连接 |
| 计算复杂度 | O(n) | O(n²) |
| 可解释性 | 难以解释 | 注意力权重可视化 |
实际应用中的 Self Attention
在 GPT、BERT 等模型中,Self Attention 被扩展为多头注意力(Multi-Head Attention),即同时运行多组独立的 Attention,每组关注不同方面的信息。
例如在句子 "苹果发布了新 iPhone" 中:
- 头 1 可能关注语法关系("苹果" → "发布")
- 头 2 可能关注语义关系("苹果" → "iPhone")
- 头 3 可能关注指代关系("苹果" → 公司而非水果)
总结
Self Attention 的核心思想可以用一句话概括:让序列中的每个位置都能直接访问其他所有位置的信息,并根据相关性加权聚合。这种"全局视野"的设计,使 Transformer 能够高效处理长文本,并成为现代大语言模型的基石。