Attention Sink

Attention Sink是指某些(初始)token具有较大的注意力得分。最早明确提出于StreamingLLM (2309.17453)。

Attention Sink有用武之地

StreamingLLM:Attention Sink用来实现长度外推

(ICLR 2024)

长度外推性是指我们在短序列上训练的模型,能否不用微调地用到长序列上并依然保持不错的效果。

像ROPE这种带有旋转周期特性的,自带外推属性,但一旦超过一定角度,外推就会失效。(苏神:像RoPE算是外推能力较好的位置编码,也只能外推10%到20%左右的长度而保持效果不变差。

所以就需要对此进行特殊设计。

StreamingLLM认为,主要挑战有外推性和解码阶段KV缓存过大。

一个直观的方法就是窗口注意力,既能减少KV缓存,又能适当地解决了外推问题,避免了推理阶段出现了没见过的相对距离。

但这些方法要么时间复杂度较高,要么表现不好。

为了理解为什么窗口注意力失败,StreamingLLM作者发现自回归大语言模型中存在一个有趣的现象:无论这些初始词元与语言模型任务的相关性如何,都会分配出大量注意力得分。

作者认为认为这是因为 Softmax 操作要求所有上下文词元的注意力得分之和为一。因此,即使当前查询在许多先前词元中没有强烈的匹配,模型仍然需要将这些不需要的注意力值分配到某处,以使总和为一。

也有从softmax入手解决以上问题的,比如SoftMax-Off-by-OneSoftpick

初始词元作为黑洞词元的原因是直观的:由于自回归语言模型的特性,初始词元对几乎所有后续词元都是可见的,这使得它们更容易被训练成注意力黑洞。

故作者在窗口注意力的基础上,保留保留注意力汇聚词元的 KV——4个初始词元。

总之,StreamingLLM 能够在不扩展 LLMs 上下文长度的情况下,从 KV 缓存中的词元高效生成连贯文本。

此外,类似的论文还有LM-Infinite(2308.16137)和Perpetual Sampling ,它们都指出初始tokens的重要性,但没有更深入地指出attention sink这一现象。

FastGen:四种特殊tokens策略

同年ICLR2024的FastGen(2310.01801)进一步考虑了更多的KV缓存种类。

特殊词元。例如句子开始词元 < s> ,指令词元 [INST] 等。此策略称为 $C_{special}$。

标点符号。仅在 KV 缓存中保留标点符号,称之为$C_{punct}$。

局部性。类似窗口注意力。称之为$C_{local}$

频繁项。监控每个词元的注意力得分的累积和,然后将这些得分视为词元 频率,并在 KV 缓存中仅保留最频繁的词元。称之为$C_{frequent}$。

H2O:更灵活的位置

2306.14048

(NeurIPS 2023)

H2O(Heavy Hitter Oracle)可以说是StreamingLLM的前身,StreamingLLM作者也从中得到启发。它没从长度外推入手,而是只从KV cache入手。

相当于仍保持StreamingLLM的特殊Tokens数不变,但不限制其位置为初始,而使用贪心算法来实现。

伪代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
def generation_loop (...):
# Prologue
...
# Generate
for i in range( gen_len ):
for j in range( num_layers ):
for k in range( num_gpu_batches ):
load_weight (i, j+1, k)
load_cache (i, j, k+1)
store_hidden (i, j, k -1)
load_hidden (i, j, k+1)
compute_layer (i, j, k)
store_cache (i, j, k -1)
sync ()
# Epilogue
...
# h is the hidden states ( activations )
def attention_forward (h, ...):
# the read/write buffer are intermediate stops for prefetching
if prefill :
h, new_k_cache , new_v_cache = compute_attention (h, ...)
# select K heavy hitters and K recent tokens
new_k_cache , new_v_cache = select(new_k_cache , new_v_cache , K)
cache_write_buffer .store(new_k_cache , new_v_cache )
else:
k_cache , v_cache = cache_read_buf .pop ()
# evict_ids track the entries that will be evicted
h, new_k_cache , new_v_cache , evict_ids =
compute_attention (h, k_cache , v_cache , ...)
cache_write_buffer .store(new_k_cache , new_v_cache , evict_ids )
return h
def store_cache (...):
if prefill :
# store cache directly
...
else:
k_new , v_new , evict_ids = cache_write_buffer .pop ()
# circular queue for the last K entries
# extract the index for the oldest token at i-th iteration
oldest = ((i - 1)
# update the KV cache (k_home and v_home )
cache_replace (k_home , evict_ids , k_new , K, oldest)
cache_replace (v_home , evict_ids , v_new , K, oldest)

PyramidKV:初始token以外的attention sink

(拒 ICLR 2025)

作者发现注意力不仅在除了初始tokens以外的位置也会呈现出attention sink,而且还会呈现出阶梯状。

故可以在不同层动态调整键值缓存大小,在较低层分配更多缓存,在较高层分配较少缓存。

该论文的发现和《Attention Sinks and Outlier Features: A ‘Catch, Tag, and Release’ Mechanism for Embeddings》的观点类似。

验证了attention sink是由低秩结构产生的。

并从数学的角度考虑了一个双层attention、能求平均值的模型的attention map,得出其形状为:

SepLLM:针对标点符号的attention sink

作者发现,LLMs 并未将注意力集中在具有语义意义的 token(如名词和动词)上,而是倾向于优先关注看似“无意义”的分隔符 token(如“.”或“\n”)以进行信息检索。这一观察表明,段落信息被压缩并嵌入到这些分隔符 token 中,从而无需直接从内容 token中提取即可实现高效的信息检索。

但作者其实并不只使用标点符号,也加入了StreamingLLM所用的初始tokens。具体如下图所示:

其和FastGen有些类似,FastGen相当于Past Window Cache为无限大,而不是局部的。

Attention Sink是必要的吗?

Attention Sink已广泛应用于流式/长上下文生成、KV 缓存优化、推理加速、模型量化等场景。

ICLR 2025的《When Attention Sink Emerges in Language Models: An Empirical View》详细研究了attention sink,但仍表示“是否有利于语言模型的下游性能仍不明确”。

此外,也涌现了Softpick、gated attention等无attention sink的模型,足以说明并不一定是必需的。

Attention Sink 的产生

(ICLR 2025)的《When Attention Sink Emerges in Language Models: An Empirical View》指出:

1. 在语言模型通过充足训练数据进行有效训练后,注意力汇聚现象显现。采用较小学习率训练的语言模型中,此现象显得不那么明显。而权重衰减则促进了注意力汇聚的形成。

2. 汇点位置与损失函数及数据分布高度相关,并可移动至除首个 token 之外的其他位置。

3. 位置嵌入、FFN 设计、LN 位置以及多头设计不会影响注意力汇的出现。注意力汇聚点更像是一种键偏置,它存储了额外的注意力,同时不参与价值计算。这一现象(至少部分)源于 token 对注意力得分的内部依赖,这种依赖是由Softmax 规范化引起的。通过用其他注意力操作(如无规范化的 Sigmoid 注意力)替代 Softmax 注意力来缓解这种依赖后,在参数规模高达 1B 的语言模型中,注意力汇聚点不再出现。

《Why do LLMs attend to the first token?》指出:

1.attention sinks对于控制秩崩溃、表示崩溃和过度挤压是有用的。

2.更大的模型和经过更长上下文训练的模型应该具有更强的汇点。

3.无论在预训练期间是否包含 〈bos〉 ,attention sinks都会形成。

(COLM 2024)《Massive Activations in Large Language Models》提出了Massive Activations的特征,并指出与attention sink。

layernorm可以消除影响。

Massive Activations本质上是充当bias的作用。

《Unveiling Super Experts in Mixture-of-Experts Large Language Models》进一步研究了MOE中的Massive Activations,并发现了超级专家。

ICLR 2025 的《Systematic Outliers in Large Language Models》研究了更多的情况。

出现异常的位置:

另外,该文还发现尽管这些token受到了显著的注意力,其对应的值向量(V)却显示出相对较小的幅度。这表明,虽然异常值token吸引了注意力,但它们可能对最终输出的直接贡献较少。

论文中没有提到,但是可以从论文中看到的一点是,rmsnorm和layernorm类似,也可以消除一定影响。

Attention Sink是引起幻觉的元凶

像博客之前介绍过的OPERA则指出了这一点。


Attention Sink
https://lijianxiong.space/2025/20250726/
作者
LJX
发布于
2025年7月26日
许可协议