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_0

1.2 普遍性

经验发现(Xiao et al. 2023, Gu et al. 2024 等):

  1. 几乎所有 LLM 都表现出 Attention Sink
    • LLaMA, Mistral, Qwen, Gemma, Pythia, GPT-2 等
  2. Sink 通常是初始 token(BOS、<s><|endoftext|> 等)
  3. 不同头/层有不同的 sink 强度
  4. 训练过程中逐渐涌现

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.

贡献

  1. 首次系统命名:“Attention Sink”
  2. StreamingLLM:利用 sink 现象实现无限长度生成
  3. 冷热 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 的隐藏状态 ,如果:

  1. 存在维度 使得
  2. 该维度的投影矩阵 不为零

那么在注意力矩阵中,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 任务。

推导:

  1. 没有 sink → 注意力必须”按内容”分配
  2. 但 trigger 在测试时可能不出现
  3. 模型无法区分”未出现”和”出现但被忽略”
  4. 矛盾

结论: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 sinks

11. 未来研究方向

11.1 未解决问题

  1. 设计替代:能否设计出”无 sink”的注意力?代价是什么?
  2. sink 的最优数量:模型需要几个 sink?
  3. sink 与推理能力的关系:sink 强度是否反映模型能力?

11.2 潜在应用

  1. 模型压缩:基于 sink 模式的剪枝
  2. 推理加速:基于 sink 的 KV Cache 优化
  3. 异常检测:sink 模式异常可能预示模型问题

11.3 与其他现象的统一

Attention Sink + Massive Activations + Token Outlier

这三个现象可能是同一根本原因的不同表现

  • Massive Activations:极端的隐藏激活
  • Token Outliers:极端的 token 表示
  • Attention Sink:注意力集中在 outlier token

统一理论:Transformer 的隐藏空间存在”异常维度/位置”,这些异常是 softmax + 多层堆叠的涌现特征


12. 关键论文清单

现象命名与初步分析

  1. Xiao et al. (2023) — StreamingLLM (arXiv:2309.17453)
  2. Sun et al. (2026) — Spike, Sparse, Sink (arXiv:2603.05498)

结构起源

  1. Li et al. (2026) — Structural Origin of Attention Sink (arXiv:2605.06611)
  2. Gu et al. (2024) — When Attention Sink Emerges (arXiv:2410.10781)

必要性证明

  1. Ran-Milo (2026) — Provably Necessary (arXiv:2603.11487)

架构应用

  1. Zhang et al. (2023) — H2O (NeurIPS 2023)
  2. 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_sink

13.2 KV Cache 优化选择

如果模型有 Attention Sink

  • ✅ StreamingLLM 适用
  • ✅ H2O 适用
  • ✅ 各种 KV Cache 压缩方法

如果没有(罕见)

  • 需要更保守的剪枝
  • 性能损失可能更大

13.3 训练建议

对于新训练的 Transformer

  1. 不要刻意抑制 sink:sink 是有用的涌现特征
  2. 监控 sink 强度:作为训练健康的指标
  3. 设计推理优化:基于 sink 模式的 KV Cache 管理

14. 与相关专题的连接

14.1 Transformer 架构专题

14.2 应用

14.3 数学基础


最后更新:2026-06-21

Footnotes

  1. Li et al. (2026). The Structural Origin of Attention Sink. arXiv:2605.06611.

  2. Ran-Milo (2026). Attention Sinks Are Provably Necessary. arXiv:2603.11487.

  3. Gu et al. (2024). When Attention Sink Emerges in Language Models. arXiv:2410.10781.

  4. Sun et al. (2026). The Spike, the Sparse and the Sink. arXiv:2603.05498.