本文目录
1 大语言模型中的超大激活值
(来自 CMU, Meta AI)
1.1 大语言模型的内部机制探索
1.2 超大激活值的定义
1.3 超大激活值的性质
1.4 超大激活值的位置
1.5 与异常特征的关系
1.6 超大激活值作为 LLM 中的偏置项
1.7 注意力集中在超大激活值上
1.8 超大激活值强加在隐式注意力偏差
1.9 施加显式的注意力偏置项来消除超大激活值
1.10 视觉 Transformer 中的超大激活值
太长不看版
本文作者观察到大语言模型 (LLM) 中的一个现象:即一些小部分激活值比其他激活值大很多 (比如 100,000 倍)。作者把这种现象称之为 "超大激活值 (massive activations)"。
-
关于超大激活值的位置:本文展示了各种 LLM 中超大激活值广泛存在,并描述了它们的位置。
-
关于超大激活值的性质:本文发现无论输入是什么,超大激活值的值很大程度上保持不变,其作用相当于 LLM 中不可或缺的偏置项。
-
关于超大激活值的功能:超大激活值导致 Self-Attention 更多注意其对应的 tokens。
本文还研究了 Vision Transformer 中的超大激活值。
本文得出了哪些具体的结论
1) 作者首先探索了超大激活值在 LLM 中的位置。
在 Depth 这个维度,超大激活值的出现很突然:在单层计算之后突然出现,并且在最后几层减少。而且,作者发现超大激活值出现在少量的特征维度中。许多超大激活值都是在起始词 token 和分隔符 token 中找到的。
2) 本文表明,超大激活值在 LLM 中充当固定但关键的 bias 项。
这里 bias 项的含义是与输入无关的模型的某些内部状态,类似于线性层类似于线性层
中的 bias 项
。首先,作者表明超大激活值在 LLM 中起着至关重要的作用。例如,在 LLAMA2-7B 中,仅将 4 个超大激活值设置为 0 将导致模型性能发生灾难性崩溃。但是将它们设置为平均值就不会损害模型,这表明它们的作用等同于简单的恒定 bias。本文分析表明,在初始层之后,LLM 重新利用与超大激活值相关的 tokens 来存储这些重要的 bias。
3) 超大激活值与 Self-Attention 紧密相关。本文展示了超大激活值导致注意力被与它们相关的 tokens 所吸引。
本文的分析表明,LLM 在预训练阶段试图通过超大激活值来学习 Self-Attention 中的隐式偏差。
4) 作者也观察到了 Vision Transformer 中的超大激活值。
它们出现的频率低于 LLM,但仍在很多 ViT 中都有出现。ViT 中的超大激活值往往出现在固定的特征维度上,但在不同的 Patch token 上。而且,作者发现这些激活值的行为类似于固定的偏置。此外也研究了超大激活值和 "register tokens
[1]
" 的关系。本文表明它们都学习到了独立于输入图像的值,来充当固定的偏置。
1 大语言模型中的超大激活值
论文名称:Massive Activations in Large Language Models
论文地址:
https://arxiv.org/pdf/2402.17762.pdf
代码链接:
http://github.com/locuslab/massive-activations
1.1 大语言模型的内部机制探索
之前的研究主要集中在大语言模型 (LLM) 的能力方面,比如评估它们在各种任务上的表现,或者设计能够带来准确回答的 prompt。这些研究比较注重 LLM 的潜力,但是本文作者认为深入了解其内部机制同样重要。尤其是当 LLM 越来越广泛被应用到现实世界中。但是,对这些模型内部工作机制的研究仍十分有限。
本文作者探索并研究了 LLM 的内部表征中一个令人惊讶的现象。通过检查 LLM 中的内部状态,作者发现尽管模型中间存在归一化层,但某些激活值表现出了巨大的幅值,比如大于中位数 4 个数量级以上,并且比如在 LLaMA-2-70B 中取值大于 15,000。这些激活也非常罕见,通常在数以百万计的激活值中,其数量也不到 10。下图 1 说明了 LLAMA2--7B 中的这种现象。由于这些激活的幅度相比常规的激活值大得多,作者将其命名为 "超大激活值 (massive activations)"。也证明了超大激活值在跨越尺寸大小和模型家族的一众 LLM 中都存在。
图1:LLaMA2-7B 中的激活值 (z 轴)。x 和 y 轴是序列和特征维度。对于这个特定的模型,作者观察到超大激活值出现在两个固定特征维度 (1415, 2533) 和两种类型的 tokens,即起始 token 和第1个句号 (.) 或换行 token (\n)
1.2 超大激活值的定义
由
个 Block 构建的自回归 Transformer。每一层
将前一个隐藏状态
作为输
, 输出一个隐藏状态
, 其中
是 token 的数量,
是特征的数量。
式中,
是残差变换。残差操作包括 Attention 和 MLP Block。除非另有说明, 本文研究的是隐藏状态
, 即残差求和的输出, 不研究
中的任何中间状态。
在上图 1 中,作者可视化了中间特征
。作者为这个模型输入短句子,并在中间层可视化隐藏状态的激活幅值 (z轴)。作者观察到多达 4 个激活值的幅值很大。最大的激活值 (约 2,000) 大约是中值幅值 (约 0.2) 的 10,000 倍。因此,作者将这些特殊的激活值称为 "超大激活值 (massive activations)"。
超大激活值不仅在 LLaMA-2-7B
[2]
中存在,而且在一大批 LLM 中同样存在,如下图 2 和 3 所示,作者展示了 LLAMA2-13B 和 Mixstral-8x7B
[3]
中也存在超大激活值。
图2:LLaMA-2-13B 中的超大激活值
图3:Mixtral-8×7B 中的超大激活值
1.3 超大激活值的性质
作者总结了大量激活的两个主要性质。其最显著的性质是它们的幅值很大,而且大小明显大于其他的激活值,通常是大几个数量级。另一个性质是超大激活值的数量很少。对于图1中的 LLaMA-2-7B 来讲,每个隐藏状态大概有 40,000 个激活值,但最多能找到4个超大激活值。
在数量上,作者在图4中展示了几种架构中的幅值和大小,还提供了一个松散但宽泛的定义:如果激活值的幅度超过 100,并且至少或大约是其隐藏状态的中值幅度的 1,000 倍,则该激活有资格称为超大激活值。如图4中的粗体。
图4:几种架构中的比较大的幅值与大小。超大激活值使用粗体表示
1.4 超大激活值的位置
作者从 RedPajama 上收集 100 个序列 (每个序列有 4,096 个 tokens)。在这 100 个序列上运行 LLM,并从每一层收集隐藏状态。
超大激活值在哪一层?
答:大部分中间层都存在超大激活值,并且它们保持基本恒定的值。它们在初始的层中就已经出现,并在最后几层开始减少。
图5:3个模型 LLaMA-2-7B, 13B 和 Phi-2 每个层的隐藏状态的3个 top 值以及中值
作者检查了3个模型:LLaMA2-7B、13B 和 Phi-2
[4]
。上图5为其中每个层的隐藏状态的3个 top 值及其中值。在 LLAMA2--7B 中,大量激活首先出现在第 2 层,并在第 30 层之前保持几乎恒定的值。有趣的是,对于 LLAMA2-7B 和 13B,大规模激活从一层计算中非常迅速出现,例如第 2 层和第 4 层。这意味着它们不会随着许多层的逐渐积累而出现,并且是由完全不同的机制引起的。
超大激活值在哪个特征维度?哪个序列维度?
答:对于特征维度,超大激活值始终存在于很少的固定维度中。
对于序列维度,作者根据超大激活值的位置将 LLM 分为3类:
仅 starting token,模型包括 LLaMA-2-13B、MPT 和 GPT-2。
starting token 和第1个 "强" 分隔符 token (即 "." 或 "\n"),模型包括 LLaMA-2-7B 和 LLaMA-2-7B-Chat。
starting token,分隔符 token (即 ".","\n",","),以及某些语义较弱的词 token (比如 "and"、"from"、"of" 或 "2"),模型包括 LLaMA-2-70B, Mistral-7B, Mixtral-8x7B, Falcon-40B 和 Phi-2。
1.5 与异常特征的关系
作者讨论它们和异常特征 (Outlier Features) 之间的差异,异常特征 (Outlier Features) 也是 LLM 中一个类似的现象。LLM.int8()
[5]
这个工作已经确定了llm中量级较大的离群特征的存在。本文的超大激活值与异常特征的不同是:
从概念上讲,
超大激活值
是一个
标量
,由
序列维度
和
特征维度
共同决定;相比之下,
异常特征
是一个
向量
,对应于
所有 token 的激活值
。此外,超大激活值存在于极少的 token 中。
在实践中,作者发现超大激活值与异常特征在 channel 维度上面并不重叠。作者使用 LLM.int8()
[5]
的定义识别LLaMA-2-7B 和 13B 中的离群值特征:如果 100 个序列里面超过 90 个,超过 25% 层和 6% tokens 的激活值幅值超过 6.0,则特征被视为离群值特征。作者分别在这两个模型中发现 10 和 25 个异常特征。然而,它们都没有对应于超大激活值的特征维度,说明超大激活值与异常特征在 channel 维度上面并不重叠。
1.6 超大激活值作为 LLM 中的偏置项
虽然已经证明了超大激活值的存在并确定了其位置,但它们在 LLM 中的功能作用尚不清楚。
它们对内部的计算重要吗?
它们只是冗余没有什么用的激活值吗?
与之前的被动观察不同,在本节中,作者通过检查修改超大激活值如何影响 LLM 的外部行为来探索超大激活值的功能。
作者首先测量输入序列中超大激活值的方差。除了超大激活值外,作者根据它们的平均幅度选择其他 3 个位置,对应于前 1%/10%,隐藏状态内的中位数。如下图6所示,作者发现,与其他激活值相比,超大激活值的方差相对于其均值要小得多。
图6:激活值在几个位置的均值和方差。与其他激活值相比,超大激活值的变化显著降低
然后,作者通过在某一层中人为修改超大激活值,来干预 LLM 的推理过程:手动将这些激活设置为选定的固定值,然后将改变的隐藏状态输入下一层,然后接着正常做后面的计算。模型选择的是 LLaMA-2-7B 和 13B,评估了 WikiText、C4 和 PG-19 的困惑度以及 BoolQ、PIQA、WinoGrande、Arc-Easy 和 Arc-Challenge 的平均 Zero-Shot 精度。对于每个模型,对首先出现超大激活值的隐藏状态执行一次干预,对应于 LLaMA-2-7B 和 13B 中的第2层和第4层。
将超大激活值设置为 0。
作者在没有超大激活值的情况下评估 LLM 的性能。当它们第 1 次出现时,将它们值设置为 0,即从干预的 LLM 中删除超大激活值。结果如图7所示。有趣的是,模型性能显著下降。作者为了严谨点还做了对照试验:把相同数量的,幅值接近中值的激活值也设置为 0,且发现这不会导致性能下降。这些结果超大激活值在 LLM 内部计算中起到的关键作用。
图7:LLaMA-2-7B 和 13B 中超大激活值的干预分析
将超大激活值设置为均值。
作者删除了大量激活值的微小变化,将大量激活的值调整为它们的经验平均值。均值是根据 RedPajama 的 100 个序列计算得出的。这种干预的结果如图7所示。作者发现困惑度和 Zero-Shot 精度的变化可以忽略不计。这表明它们的值是常量和输入不可知的,即功能类似于偏置项。
因此,结论是:
超大激活值是 LLM 中固定但重要的偏置项。
为什么这些层和 tokens?
超大激活值充当了偏置项的事实可能会解释为什么 LLM 在某些层和 tokens 上存储它们:
-
这些激活出现在 starting token 的趋势可以归因于每个自回归训练实例都包含 1 个 starting token 这个事实。由于 LLM 基于 next-token prediction,因此 starting token 是序列中所有前向传递中使用的唯一标记。
-
分隔符 token 中存在这些超大激活值的原因可能是这些 tokens 的语义值相对较低,用它们来存储偏置的成本也低。相反,语义丰富的 tokens 如果用来存储这些偏置项,就会严重丢失输入信息。
-
超大激活值仅在几个初始层之后出现,这可能是因为 LLM 需要一些初始层来处理与超大激活值相关的 tokens 的含义。在这些层中,它们的语义可以通过 Self-Attention 转移到其他 token 的位置,并保留向前移动。
1.7 注意力集中在超大激活值上
作者观察到与注意力的模式形成鲜明对比。下图 8 显示了 Softmax 之前的注意力 logits,在 LLaMA-2-7B 中每层的所有 head 进行平均。输入是 MMLU
[6]
中的 prompt:"The following are multiple choice questions (with answers) about machine learning.\n\n ..."
图8:LLaMA-2-7B 中出现超大激活值前后的注意力模式
在 LLaMA-2-7B 中,超大激活值首先出现在第 2 层的输出中。作者发现在第 3 层和第更深的层 (例如第 31 层) 中,注意力主要集中在与大量激活相关的 2 个 token 上。作者的观察结果在其他 LLM 中也是一致的。图 9 展示了 LLaMA-2-13B 和 Phi-2 在相同输入上的这种注意力模式。
在图 8 和图 9 中,许多 attention logits 往往是负的。其主要是由不涉及超大激活值的 tokens 的 Query 和 Key 计算得到。但是,对于那些 Key 值所在的 token 有超大激活值的 Key 来讲,此时算出来的 attention logits 就是偏正的。因此,在注意力 Softmax 操作 (沿着每一行计算) 中,超大激活值相关的 attention logits 会吸引大部分注意力概率。
图9:LLaMA2-13B (左) 和 Phi-2 (右) 中出现超大激活值后的注意力模式
Attention sink
[7]
这个工作表明 LLM 严重依赖 starting token。本文在图 9(a) 中对 LLaMA-2-13B 的发现与他们的结果一致。对于那些超大激活值只在 starting token 的 LLM 而言,就是这种结果。本文在 LLaMA-2-7B 和 Phi-2 上的结果表明 LLM 还为其他 tokens 分配了大量的 attention,并且它们与超大激活值相关联。
1.8 超大激活值强加在隐式注意力偏差
本节中,作者证明 LLM 使用超大激活值来加强 Self-Attention 中的隐式偏差项。
作者首先研究了超大激活值对 Self-Attention 中的 Query,Key 和 Value 的影响。在 LLM 中,在每层,输入特征输入 LN 之后,然后通过 Linear Projection 转换为 Query,Key 和 Value,如下图10所示。这种范式从 GPT-2
[8]
开始,在 LLM 中沿用至今。
图10:Self-Attention 的 Layer Norm 机制以及 QKV 投影
那么这些层里面的激活值都是什么样子的?作者做了图11的可视化 (LLaMA-2-7B, layer 3)。可以发现,与超大激活值相关的 2 个 token 的特征与其他的 tokens 有很大不同:
-
Normalize 的第一步之后:这 2 个 token 的 embedding 显示为 2 个具有不同非零值的稀疏向量。
-
Query,Key 和 Value:这 2 个 token 的每个 embedding 都表现出了很小的变化。
图11:LLaMA-2-7B, layer 3 可视化结果。highlight 了超大激活值的两个标记的嵌入:starting token 和句号 token
接下来, 作者把 Attention 的输出做了分解。作者想看看超大激活值对应的 token 对注意力输出 (Attention matrix 乘以 Value 向量) 的变化。在下式 2 中, 作者将每个 token
处的注意力输出分解为 2 部分:来自注意力集中的 token
的输出,以及从其他 token 的输出。
式中,
代表第
个 token 到第
个 token 的注意力分布,
代表第
个 token 的 Value 向量。下图12是 LLaMA-2-7B 注意力图输出的分解结果可视化。输出 prompt 是 "Summer is warm. Winter is cold."。集合
包括 Summer 这个 token 和第 1 个句号这个 token。
图12:与超大激活值相关的 token 的注意力的输出可视化
可以看到,集合 C 中的值更新在各个 token 之间
几乎相同
,即它们可以被视为一种加性偏置项。而且可以注意到这种模式在各种输入中非常相似。
结论:LLM 使用超大激活值来在某些 token 上分配大量注意力。然后在计算注意力的输出时,这些 token 被用来形成恒定的偏置项。
1.9 施加显式的注意力偏置项来消除超大激活值
考虑到 LLM 在预训练期间会学习隐式注意力偏置项,因此作者尝试用额外的偏置项直接增强 Self-Attention。有趣的是,作者发现用显式注意力偏差增强的模型没有表现出超大激活值。
作者为 Self-Attention 引入了额外的可学习参数, 对每个 head 加一个
。具体来讲给定
, 带有显式注意力偏置项的增强的 Self-Attention 的计算如下:
其中
和
都与键和值矩阵 K/V 拼接。所提出的 Self-Attention 可以用作标准 Self-Attention 的替代品。
作者训练了 3 个 GPT-2 模型:标准的 GPT-2 模型,配备了 Sink token 的 GPT-2 模型,使用 Attention Bias 的 GPT-2 模型。可以发现这 3 个模型在收敛时具有相同的性能,但超大激活值存在显着差异,如下图 13 所示。值得注意的是,在显式注意力偏差的 GPT-2 中,与默认 GPT-2 和 Sink token 的版本相比,超大激活值现象消失了。
图13:当使用额外的注意力偏置项训练 GPT-2 时,超大激活值消失了
图 14 展示了每层的 3 个最大激活幅值。值得注意的是,通过明确的显式注意力偏置项,随着层的深入,GPT-2 中的 top 激活值的幅值逐渐增加。这些结果表明,显式的注意力偏置项使得 LLM 在训练中无需开发超大激活值。
图14:3 个 GPT-2 模型每层输出特征中 3 个最大的激活幅值
结论:
超大激活值与 Self-Attention 有关。LLM 使用超大激活值将注意力集中在非常少的 token 上,在 Attention 计算输出时引入隐式的偏置项。此外,可以通过用显示的 Attention 偏置项增强 LLM,来消除超大激活值。
1.10 视觉 Transformer 中的超大激活值
作者探索了几种视觉 Transformer 架构:CLIP
[9]
, MAE
[10]
和 DINOv2
[11]
,结果如下图15所示是倒数第2层的激活幅值。可以发现 CLIP 和 DINOv2 的 ViT-L 中存在超大激活值。在这 2 个模型中,超大激活值极少 (少于 4 个),比其他模型大得多。此外,这些激活值位于特定的特征维度中,并出现在随机的 Patch token 中。
图15:CLIP 和 DINOv2 的 ViT-L 中存在超大激活值,但是 MAE 的里面没有
超大激活值是 ViT 中的偏置项。
图 16 显示了 CLIP 和 DINOv2 的 ViT-L 中每层的 3 个最大激活幅值和中值,这个结果是超过 1K 张图像的平均。可以发现超大激活值一直存在于图像中,并且其值在均值周围基本维持不变。而且,与 LLM 不同,超大激活值只出现在 ViT 的后期。
图16:CLIP 和 DINOv2 ViT-L 中每层的激活幅值和中值幅值
按照本文提出的方法,作者对 CLIP ViT-L 进行了干预分析:将 2 个最大的超大激活值分别修改为 0 值和均值。干预是在第 13 层进行的。结果如图 17 所示,作者评估了 ImageNet 上的 Zero-Shot 精度。可以看到,将超大激活值设置为 0 会导致精度显著下降,但设置为均值导致的精度下降却可以忽略不计。这些结果表明,超大激活值是 ViT 中固定但关键的偏置项,这与 LLM 的观察结果一致。
Register token 也是模型的偏置项。
Register token
[1]
是一种增强 ViT 的新技术。使用 Register token 训练的 ViT 可以带来平滑的注意力图,且比如 DINOv2-reg 可以比 DINOv2 实现更卓越的下游任务性能。检查 DINOv2-reg 中最大的 ViT-G 模型,作者观察到了超大激活值的存在,如图 17 所示。
然而,与标准的 ViT 不同,超大激活值没有出现在 Patch token 中,但仅出现在固定的 Register token 中,即 Reg 3。
这表明模型使用 Reg 3 来存储这些激活值。图 18 显示了最后 1 层的 [CLS] token 的注意力分布。可以发现大多数注意力都分配给了 Reg 3,呼应之前的注意力模式发现。
图17:DINOv2-reg ViT-G
图18:[CLS] token 的注意力分布
作者进一步进行了干预分析来分析 Register token 的作用:将每层的输出中的所有 Register 的特征替换为其均值,平均了超过 10K 的 ImageNet 训练图像。这种干预消除了 Register token 聚合全局输入信息的预期目的。结果如图19所示,可以发现具有固定 Register 特征的 ViT 实现了与原始模型相当的精度。这表明 Register token 充当了 ViT 中的可学习偏置项。这说明 Register token 处有恒定的 Key 和 Value, 意味着其会为 Self-Attention 引入额外的偏置项 (类似于式 3 中的