Attention Sink 理论分析
Attention Sink(注意力沉没)是现代 Transformer LLM 中一个普遍存在但长期被忽视的现象:指训练后的模型中,少数 token(通常是初始 token)会”吸收”大量注意力权重。本文系统整理 2024-2026 年关于 Attention Sink 的最新理论成果,包括结构起源、必要性证明、架构影响和实践应用。
1. 现象观察
1.1 什么是 Attention Sink
定义 1.1(Attention Sink):在 Transformer 注意力矩阵 中,存在某个(或某几个)token 位置 ,使得:
即大量行的注意力权重集中在列 。
典型表现:
# 假设注意力矩阵可视化
# 假设模型已经训练过
# 大多数头/层都会显示类似模式:
#
# 行: query positions
# 列: key positions
#
# | tok_0 | tok_1 | tok_2 | ... | tok_{n-1}
# ----------|-------|-------|-------|-----|----------
# tok_0 | 0.05 | 0.05 | 0.05 | ... | 0.05
# tok_1 | 0.40 | 0.10 | 0.05 | ... | 0.05 ← 大部分权重给 tok_0
# tok_2 | 0.45 | 0.05 | 0.10 | ... | 0.05 ← 大部分权重给 tok_0
# ...
# tok_{n-1} | 0.50 | 0.03 | 0.03 | ... | 0.03 ← 大部分权重给 tok_01.2 普遍性
经验发现(Xiao et al. 2023, Gu et al. 2024 等):
- 几乎所有 LLM 都表现出 Attention Sink
- LLaMA, Mistral, Qwen, Gemma, Pythia, GPT-2 等
- Sink 通常是初始 token(BOS、
<s>、<|endoftext|>等) - 不同头/层有不同的 sink 强度
- 训练过程中逐渐涌现
1.3 一个令人困惑的现象
为什么初始 token 会吸引如此多的注意力?
直观上,BOS token 似乎不应该有如此”特殊”的语义角色。但训练后的模型却集体”选择”了这个模式。
2. 早期观察与命名
2.1 Xiao et al. (2023) - StreamingLLM
核心论文:Xiao, Tan, Banburry, Liu (2023). Efficient Streaming Language Models with Attention Sinks. arXiv:2309.17453.
贡献:
- 首次系统命名:“Attention Sink”
- StreamingLLM:利用 sink 现象实现无限长度生成
- 冷热 token 分离策略
关键观察:
在 LLM 推理中,初始 token 总是被分配大量注意力,无论其语义内容如何。
2.2 StreamingLLM 的实践价值
问题:LLM 处理长序列时,KV Cache 内存爆炸。
解决方案:
- 保留”热”token(最近若干)
- 保留”sink”token(初始几个)
- 丢弃”冷”token
效果:在多个任务上性能保持 90%+。
2.3 现象的早期解释
当时的解释(直觉):
- Softmax 的归一化性质导致必须存在”主导”
- 初始 token 容易被选为”主导”
- 模型”发现”这种模式是有用的
这种解释直觉但非严格。下面我们看更深入的理论分析。
3. 结构起源理论(Li et al. 2026)
3.1 核心论文
Li, Jiang, Sun, Hu (2026). The Structural Origin of Attention Sink: Variance Discrepancy, Super Neurons, and Dimension Disparity. arXiv:2605.06611.1
3.2 三个结构因素
论文提出了 Attention Sink 的三个结构起源:
3.2.1 方差差异(Variance Discrepancy)
观察:不同 token 的激活方差差异巨大。
形式化:设 token 的 hidden state 为 ,定义:
关键发现:
- 初始 token 的方差通常显著大于其他 token
- 因为后续 token 都”看过”初始 token,特征空间被”压缩”
数学含义:
注意力分数:
其中 。
当 方差大时, 的范数也大,导致注意力分数差异大。
3.2.2 超神经元(Super Neurons)
观察:某些隐藏维度对所有 token 都有极端大的激活值。
形式化:存在维度 使得:
关键发现:
- 这种”超级神经元”在大多数 LLM 中存在
- 它们产生 Attention Sink 的”载体”
为什么存在:训练过程中,某些维度被”特化”用于承载位置信息或全局信号。
3.2.3 维度差异(Dimension Disparity)
观察:不同维度的注意力贡献不均匀。
形式化:在多头注意力中,某些头专门用于全局信号,这些头倾向于产生 Attention Sink。
关键发现:
- 不是所有头都有 sink
- 拥有 sink 的头通常承担”全局协调”功能
3.3 形式化理论
定理 3.1(Li et al. 2026,简化):
设 token 的隐藏状态 ,如果:
- 存在维度 使得
- 该维度的投影矩阵 和 不为零
那么在注意力矩阵中,token 会成为 sink。
推论:Attention Sink 是特定维度的极端激活导致的副作用。
3.4 实验验证
import torch
def analyze_attention_sink(attn_matrix, threshold=0.3):
"""分析 Attention Sink 现象"""
n = attn_matrix.shape[-1]
# 1. 计算每列接收的总注意力
col_attention = attn_matrix.sum(dim=0) # [n]
# 2. 识别 sink 候选
avg_attention = 1.0
sink_candidates = (col_attention > threshold).nonzero().squeeze()
# 3. 度量 sink 强度
sink_strength = col_attention[sink_candidates] if len(sink_candidates) > 0 else torch.tensor([0.0])
return {
'sink_positions': sink_candidates.tolist() if sink_candidates.dim() > 0 else [sink_candidates.item()],
'sink_strength': sink_strength.tolist(),
'concentration_ratio': col_attention.max().item() / avg_attention,
}
def detect_super_neurons(hidden_states):
"""检测超神经元"""
# hidden_states: [B, n, d]
# 沿序列维度的统计
mean = hidden_states.mean(dim=1, keepdim=True)
std = hidden_states.std(dim=1, keepdim=True)
# Z-score
z_scores = (hidden_states - mean) / (std + 1e-6)
# 检测极端维度
max_z_per_dim = z_scores.abs().max(dim=1).values # [B, d]
# 超级神经元:Z-score 经常超过阈值
super_neuron_score = max_z_per_dim.mean(dim=0) # [d]
super_neurons = (super_neuron_score > 3.0).nonzero().squeeze()
return {
'super_neurons': super_neurons.tolist() if super_neurons.dim() > 0 else [super_neurons.item()],
'scores': super_neuron_score.tolist(),
}4. 必要性证明(Ran-Milo 2026)
4.1 核心论文
Ran-Milo (2026). Attention Sinks Are Provably Necessary in Softmax Transformers: Evidence from Trigger-Conditional Tasks. arXiv:2603.11487.2
4.2 关键问题
Attention Sink 是优化的副产品,还是功能上必需的?
4.3 实验设计:Trigger-Conditional Tasks
任务设置:
- 训练 Transformer 完成”条件任务”
- 任务:仅当特定 trigger token 出现时才执行某个动作
- 例:仅当看到”魔术词”才输出特定字符串
4.4 关键发现
Theorem 4.1(Ran-Milo 2026,简化):
对于 softmax Transformer,任何能够可靠解决 trigger-conditional 任务的训练过程,必然导致 Attention Sink 的涌现。
直觉解释:
- 模型需要”记住”是否看到 trigger
- 由于没有显式记忆机制,注意力被用作”软记忆”
- 自然涌现出 sink 模式
4.5 数学证明的要点
反证思路:
假设训练后的 Transformer 没有 Attention Sink,且能可靠解决 trigger-conditional 任务。
推导:
- 没有 sink → 注意力必须”按内容”分配
- 但 trigger 在测试时可能不出现
- 模型无法区分”未出现”和”出现但被忽略”
- 矛盾
结论:Attention Sink 是 softmax Transformer 的必然特征。
4.6 与 Softmax 的关系
关键论证:
强制”主导”:
如果某行所有元素相等 = ,则该行是”均匀注意力”。
要让某行”集中”在某个 key,必须有 。
Attention Sink 是 softmax 的副产品:
- 必须存在某些 key 被”偏好”
- 这些 key 自然涌现为 sink
5. 涌现时机:何时出现
5.1 核心论文
Gu, Pang, Du, Liu, Zhang, Du, Wang, Lin (2024). When Attention Sink Emerges in Language Models: An Empirical View. arXiv:2410.10781.3
5.2 涌现时机
实验观察:
- Attention Sink 在训练早期就开始涌现
- 通常在 100-1000 步内出现
- 与大规模训练目标相关
5.3 涌现过程
阶段 1(步骤 0-100):随机初始化,注意力几乎均匀。
阶段 2(步骤 100-1000):sink 开始形成。
阶段 3(步骤 1000+):sink 稳定存在。
5.4 与 Massive Activations 的关系
Massive Activations:某些隐藏维度对所有 token 都有极大激活值。
Sun, Canziani, LeCun, Zhu (2026). The Spike, the Sparse and the Sink: Anatomy of Massive Activations and Attention Sinks. arXiv:2603.05498.4
关系:
- Massive Activations是 Attention Sink 的原因之一
- 它们共同构成 Transformer 的”异常激活”现象
def analyze_massive_activations(hidden_states, threshold=6.0):
"""分析 Massive Activations 与 Attention Sink 的关系"""
# 标准化
mean = hidden_states.mean(dim=-1, keepdim=True)
std = hidden_states.std(dim=-1, keepdim=True)
z = (hidden_states - mean) / (std + 1e-6)
# 检测 massive activations
massive = (z.abs() > threshold).float()
# 计算维度级别的 massive 比例
dim_massive_ratio = massive.mean(dim=(0, 1)) # [d]
return {
'massive_dims': (dim_massive_ratio > 0.1).nonzero().squeeze().tolist(),
'dim_ratios': dim_massive_ratio.tolist(),
}6. 与共识机制的连接
6.1 共识视角
新视角(参考 注意力机制现代理论):
Attention Sink 是共识传播的副产品。
类比:
- 多智能体系统需要”媒介”达成共识
- Transformer 中的 sink token 是”共识媒介”
6.2 数学联系
定义:对于注意力输出:
如果 集中在某个 sink token :
这等价于:所有 token 共识”指向” sink。
6.3 共识传播的副产品
从共识角度:
- 多 token 共识需要”主导”
- 这个”主导”就是 sink
- sink 不必在内容上有特殊意义,但必须在位置上可识别
初始 token 自然满足:
- 所有 token 都”看到”过它(causal attention)
- 它是天然的”锚点”
7. 架构影响
7.1 StreamingLLM 与冷热分离
核心思想:
- 热 token:最近的 个 token,保留
- Sink token:初始 个 token,保留
- 冷 token:中间的 token,丢弃
内存节省:从 到
class StreamingLLMAttention(nn.Module):
"""StreamingLLM 风格的注意力"""
def __init__(self, d_model, num_heads, window_size=512, num_sink_tokens=4):
super().__init__()
self.num_heads = num_heads
self.d_k = d_model // num_heads
self.window_size = window_size
self.num_sink_tokens = num_sink_tokens
self.W_q = nn.Linear(d_model, d_model, bias=False)
self.W_k = nn.Linear(d_model, d_model, bias=False)
self.W_v = nn.Linear(d_model, d_model, bias=False)
self.W_o = nn.Linear(d_model, d_model)
def forward(self, x, past_kv=None):
B, n_new, _ = x.shape
Q = self.W_q(x).view(B, n_new, self.num_heads, self.d_k).transpose(1, 2)
K_new = self.W_k(x).view(B, n_new, self.num_heads, self.d_k).transpose(1, 2)
V_new = self.W_v(x).view(B, n_new, self.num_heads, self.d_k).transpose(1, 2)
if past_kv is not None:
K_past, V_past = past_kv
K = torch.cat([K_past, K_new], dim=2)
V = torch.cat([V_past, V_new], dim=2)
else:
K = K_new
V = V_new
n_total = K.size(2)
# 保留 sink + 最近的 window
if n_total > self.window_size + self.num_sink_tokens:
# 保留 sink tokens 和最后的 window
keep_indices = list(range(self.num_sink_tokens)) + \
list(range(n_total - self.window_size, n_total))
K = K[:, :, keep_indices, :]
V = V[:, :, keep_indices, :]
# 计算注意力
scores = (Q @ K.transpose(-2, -1)) / (self.d_k ** 0.5)
attn = torch.softmax(scores, dim=-1)
out = attn @ V
out = out.transpose(1, 2).contiguous().view(B, n_new, -1)
return self.W_o(out), (K, V)7.2 H2O(Heavy-Hitter Oracle)
核心论文:Zhang, Zeng, Wei, et al. (2023). H2O: Heavy-Hitter Oracle for Efficient Generative Inference of Large Language Models. NeurIPS 2023.
核心思想:
- 跟踪每个 token 的累积注意力分数
- 保留”重击”(heavy-hitter)token
- 动态淘汰低注意力 token
7.3 PyramidKV
核心论文:Cai et al. (2024). PyramidKV: Dynamic KV Cache Compression based on Pyramidal Information Funneling.
核心思想:
- 不同层需要不同 KV 数量
- 浅层需要更多 KV(信息丰富)
- 深层需要更少 KV(已聚合)
7.4 DuoAttention
核心思想:
- 分离”检索头”和”流式头”
- 检索头需要完整 KV
- 流式头只需少量 KV
8. 实验:Attention Sink 的功能分析
8.1 移除 Sink 的影响
实验 1:在 LLM 推理时,移除 sink token 的 KV Cache。
结果:
- 性能急剧下降
- 模型产生重复或无意义输出
- 即使 sink token 没有任何语义内容
结论:Sink 在功能上不可替代。
8.2 替换 Sink 的影响
实验 2:将 sink 替换为随机噪声 token。
结果:
- 性能基本保持
- 模型仍能正常运行
结论:Sink 的位置比内容更重要。
8.3 这与 Ran-Milo 的必要性证明一致
- 位置:sink 必须在固定位置(模型”知道”看哪里)
- 内容:不重要(只是”占位符”)
9. Attention Sink 与训练目标
9.1 与 Softmax 的内在联系
关键观察:Attention Sink 现象与 softmax 的数学性质密切相关。
强制约束:
含义:
- 每行必须”分配”全部注意力质量
- 不允许”无注意力”(每行都和为1)
后果:
- 当模型”不想”关注任何特定 token 时
- 它被迫选择某个”中性”token
- sink 成为天然选择
9.2 与替代激活函数的对比
实验:使用 sigmoid 注意力(每元素独立):
结果:没有 Attention Sink 涌现。
含义:Attention Sink 是 softmax 的特有现象。
9.3 与位置编码的关系
观察:使用 RoPE 等相对位置编码时,sink 仍然存在。
含义:sink 是注意力机制本身的特征,与位置编码无关。
10. 实际应用
10.1 长上下文处理
问题:标准 LLM 在长序列上内存爆炸。
Sink-aware 解决方案:
def sink_aware_cache_management(kv_cache, num_sink=4, window=512):
"""管理 KV Cache,保留 sink"""
if kv_cache.shape[2] <= window + num_sink:
return kv_cache
# 保留 sink 和最近窗口
sink_part = kv_cache[:, :, :num_sink, :]
recent_part = kv_cache[:, :, -window:, :]
return torch.cat([sink_part, recent_part], dim=2)10.2 推理加速
H2O 加速:
def h2o_eviction(kv_cache, attention_scores, budget):
"""H2O 风格的 KV Cache 淘汰"""
# 计算每个 token 的累积注意力
cumulative_attn = attention_scores.sum(dim=1).sum(dim=0) # [n]
# 保留 sink + heavy hitter
sink_part = cumulative_attn[:4] # 假设 sink 是前4个
rest = cumulative_attn[4:]
# 选择 top-budget 个
top_k = torch.topk(rest, budget - 4)
# 重组
keep_indices = list(range(4)) + (top_k.indices + 4).tolist()
return kv_cache[:, :, keep_indices, :]10.3 模型分析
检查模型的 Attention Sink 模式:
def profile_attention_sinks(model, sample_inputs):
"""分析模型的 Attention Sink 模式"""
sinks = []
def hook(module, input, output):
if hasattr(output, '__len__') and len(output) > 1:
attn_weights = output[1]
# 分析 sink
sink_info = analyze_attention_sink(attn_weights[0, 0])
sinks.append({
'layer': id(module),
**sink_info,
})
hooks = []
for name, module in model.named_modules():
if isinstance(module, nn.MultiheadAttention):
module.register_forward_hook(hook)
hooks.append(module)
with torch.no_grad():
model(sample_inputs)
for hook in hooks:
hook.remove()
return sinks11. 未来研究方向
11.1 未解决问题
- 设计替代:能否设计出”无 sink”的注意力?代价是什么?
- sink 的最优数量:模型需要几个 sink?
- sink 与推理能力的关系:sink 强度是否反映模型能力?
11.2 潜在应用
- 模型压缩:基于 sink 模式的剪枝
- 推理加速:基于 sink 的 KV Cache 优化
- 异常检测:sink 模式异常可能预示模型问题
11.3 与其他现象的统一
Attention Sink + Massive Activations + Token Outlier
这三个现象可能是同一根本原因的不同表现:
- Massive Activations:极端的隐藏激活
- Token Outliers:极端的 token 表示
- Attention Sink:注意力集中在 outlier token
统一理论:Transformer 的隐藏空间存在”异常维度/位置”,这些异常是 softmax + 多层堆叠的涌现特征。
12. 关键论文清单
现象命名与初步分析
- Xiao et al. (2023) — StreamingLLM (arXiv:2309.17453)
- Sun et al. (2026) — Spike, Sparse, Sink (arXiv:2603.05498)
结构起源
- Li et al. (2026) — Structural Origin of Attention Sink (arXiv:2605.06611)
- Gu et al. (2024) — When Attention Sink Emerges (arXiv:2410.10781)
必要性证明
- Ran-Milo (2026) — Provably Necessary (arXiv:2603.11487)
架构应用
- Zhang et al. (2023) — H2O (NeurIPS 2023)
- Cai et al. (2024) — PyramidKV
13. 实践指南
13.1 检测 Attention Sink
def has_attention_sink(model, sample_data, threshold=0.2):
"""检查模型是否有 Attention Sink"""
sinks_per_layer = []
# 注册 hook 捕获注意力
# ... (类似前面的代码)
# 判断是否存在显著 sink
has_sink = any(
sink['concentration_ratio'] > 1 + threshold
for sink in sinks_per_layer
)
return has_sink13.2 KV Cache 优化选择
如果模型有 Attention Sink:
- ✅ StreamingLLM 适用
- ✅ H2O 适用
- ✅ 各种 KV Cache 压缩方法
如果没有(罕见):
- 需要更保守的剪枝
- 性能损失可能更大
13.3 训练建议
对于新训练的 Transformer:
- 不要刻意抑制 sink:sink 是有用的涌现特征
- 监控 sink 强度:作为训练健康的指标
- 设计推理优化:基于 sink 模式的 KV Cache 管理
14. 与相关专题的连接
14.1 Transformer 架构专题
14.2 应用
14.3 数学基础
最后更新:2026-06-21
Footnotes
-
Li et al. (2026). The Structural Origin of Attention Sink. arXiv:2605.06611. ↩
-
Ran-Milo (2026). Attention Sinks Are Provably Necessary. arXiv:2603.11487. ↩
-
Gu et al. (2024). When Attention Sink Emerges in Language Models. arXiv:2410.10781. ↩
-
Sun et al. (2026). The Spike, the Sparse and the Sink. arXiv:2603.05498. ↩