找回密码
 立即注册
首页 业界区 业界 探秘Transformer系列之(35)--- 大模型量化基础 ...

探秘Transformer系列之(35)--- 大模型量化基础

侧胥咽 4 天前
探秘Transformer系列之(35)--- 大模型量化基础


目录

  • 探秘Transformer系列之(35)--- 大模型量化基础

    • 0x00 概述
    • 0x01 outlier

      • 1.1 定义
      • 1.2 特点
      • 1.3 出现过程
      • 1.4 分布规律
      • 1.5 出现原因

        • 1.5.1 softmax

          • LLM模型
          • VIT模型

        • 1.5.2 RoPE

          • 现象
          • 分析

        • 1.5.3 FFN

          • 矩阵乘法的动态性分析
          • FFN主要计算

        • 1.5.4 LayerNorm
        • 1.5.5 RMSNorm

      • 1.6 作用

        • 1.6.1 负面作用
        • 1.6.2 正面作用

          • 保持性能
          • 上下文理解


      • 1.7 难点

    • 0x02 超异常值

      • 2.1 超级权重

        • 2.2.1 作用
        • 2.2.2 识别

      • 2.2 massive outlier

        • 2.2.1 定义
        • 2.2.2 作用

          • 特点
          • 论证

        • 2.2.3 难点


    • 0x03 Transformer量化

      • 3.1 原理分析

        • 3.1.1 推理特点
        • 3.1.2 对框架的要求

      • 3.2 量化模块
      • 3.3 分类

        • 3.3.1 PTQ

          • weight-only quantization
          • weight-activation quantization

        • 3.3.2 QAT

          • 减少数据需求
          • 减少计算量

        • 3.3.3 常见方案

          • 优化
          • 转移
          • 旋转
          • 可学习
          • 查表和VQ
          • 基于Attention Sink的量化方法


      • 3.4 效果

        • 3.4.1 对比实验与分析
        • 3.4.2 量化准确度
        • 3.4.3 QAT和PTQ


    • 0xFF 参考


0x00 概述

将现有的量化技术直接应用于大模型存在困难,会出现较大量化误差和精度下降。这主要是因为大模型的特点是规模和复杂性。与较小的模型相比,大模型的权重和激活通常表现出更多的outlier(离群值),并且具有更宽的分布范围。LLM.int()的作者就发现:

  • 与较小的模型不同,LLM 表现出独特的权重和激活分布,其特点是存在大量的outlier。因为outlier 的存在,如果我们使用 INT8 量化,大多正常数值将被清零。
  • Emergent Features的phase shift出现在模型参数量达到6.7B时,这说明参数量在6.7B之前和在6.7B之后的模型表现非常不一样。
这些异常值对量化过程有显著影响,因为它们会增加量化步长,同时降低中间值的精度。因此,将参数量在6.7B之下的transformer模型上适用的方法泛化到参数量在6.7B以上的模型时要十分谨慎。比如,针对小型模型的最好的量化裁剪(clipping)方法对于LLM来说并不是开箱即用的。 这需要我们开发量身定制的量化技术,以便在不影响模型性能或效率的情况下处理这些独特的特征。
0x01 outlier

在模型内部,数据通常以多维张量(可以理解为多维数组)表示。对于注意力机制,这些张量包含批次大小、序列长度、注意力头数量和头部维度等维度。而大规模值是指在LLM的注意力头部维度中,某些元素的数值明显高于该头部其他维度平均值的情况(通常为5倍以上)。
1.1 定义

LLM.int8()作者给出了outlier的如下定义:
对于一个有 l 层的transformer,隐状态(hidden state)为\(X_l ∈ R^{s×ℎ},l=0…L\),其中s是sequence维度,ℎ是feature维度。我们定义一个feature \(h_i\)为隐状态\(X_{l_i}\)里面一个特定的维度。我们在所有层里面跟踪每个维度\(h_i\),0≤i≤ℎ, 如果某个维度满足以下条件,我们称之为一个outlier:

  • 至少有一个值的绝对值(magnitude)大于等于6;
  • 满足条件1的\(h_i\)在transformer的至少25%的层里出现;
  • 满足条件1的\(h_i\)至少在6%的sequence dimension的隐状态中出现。
1.jpeg

上面是一个outlier示例(一共有4个黄色的outliear feature),横轴是hidden_dim维度,纵轴是sequence维度。上图中seq_len = 3,所以一个outlier feature是一个3×1的向量。
1.2 特点

研究人员发现,量化前权重和激活值分布的平坦度 (flatness) 是影响 LLM 量化误差的关键因素。直观来看,分布越平坦,离群值就越少,量化时的精度也就越高。激活和权重分布越不均匀时候,量化误差越大。
下图展示了激活和权重上异常值的特点。红色为激活,绿色为异常值。
2.jpeg

激活
对于激活来说,其异常值特点如下:

  • 在训练开始后,残差激活值迅速从高斯分布转变为逻辑分布(Logistic Distribution),并且出现较大的outlier。
  • 当模型参数超过某个阈值之后,异常点比例突然增大。
  • 激活的每个channel在不同token分布相似,比如在某个token权重数值量级很大的channel,在其它token上数值量级也很大。
权重
对于权重来说,其异常值特点如下:

  • 权重分布相当均匀,平坦,易于量化。用 INT8 甚至 INT4 量化 LLM 的权重不会降低精度。
  • FFN部分权重从随机初始化的高斯分布,开始时较为稳定;在训练一定阶段后开始剧烈变化;随后整体分布再次稳定下来。权重整体保留了高斯分布,但是存在一些不是非常大的outlier。
  • LLM的离群值很少,集中于确定的几列,这几列可能存储了一些上下文无关的信息。
  • 另外,在具有门控线性单元(GLU)的模型中,激活和权重大多是对称分布的,使得使用对称量化成为最佳选择。
梯度
梯度分布的变化趋势与权重类似,训练过程也未出现较大的outlier,说明梯度本身也具备较好的稳定性,存在低精度计算和存储的可能性。
1.3 出现过程

LLM.int8()作者Tim Dettmers在其博客 LLM.int8() and Emergent Features 中提到了Emergent Features这个概念。Emergent Features就是Emergent outlier features。
The other pitch talks about emergent outliers in transformers and how they radically change what transformers learn and how they function.
This blog post is a more speculative version of the paper that teases out the super curious details about the fascinating properties surrounding the emergent outlier features I found.
“Emergent”描述的是这些离群值逐渐增长,并在经历phase shift(指离群值会突然迅速增长的现象)之后,对模型性能产生严重影响的现象。此处的增长是指:离群值的数值变大,数量变多,受该离群值影响的token数和模型层数变多。
LLM.int8()论文中的实验发现,在我们把transformers规模扩大到6B的时候,异常值首次在25%的transformer层出现,然后逐渐向其它层扩散。当模型达到6.7B的时候,所有的transformer层都会受到异常值的影响,受到影响的sequence维度也从35%扩大到75%。它们的分布在所有的transformer层中集中在6个feature维度。下图展示了 Transformer 中,受到异常值特征影响的层的百分比和序列维度的百分比,这些数值和模型大小存在相关性。
3.jpeg

论文作者在博客中也介绍了Emergent Features随着模型参数量的增加而增长的过程。

  • 即使在参数量为125M的比较小的Transformer模型中,Emergent Features也是存在的。但此时Emergent Features只存在注意力投影层(attention projection, query/key/value/output)的输出中。
  • 当Transformer模型的参数量提高到350M至1.3亿,Emergent Features开始出现在注意力和FFN的输出中,并且出现在同一个维度上,但在不同的mini-batch或者不同层中出现的位置是不一样的。原博客认为这种一致性在一定程度上代表了模型各个层的协作。同时,Emergent Features分布开始呈现一些规律。
  • 当模型的参数量达到2.7B至6B时,在60%的层中,Emergent Features出现在同样的维度上。
  • Transformer 所有层上的大幅异常值特征突然出现在 6B 和 6.7B 参数之间,即出现了phase shift。原博客还描述了在这种情况下,模型内出现的一些变化:

    • 受到异常值影响的层的数量百分比从 65% 增加到 100%,受到异常值影响的 token 的数量百分比从 35% 增加到 75%。同时,量化开始失败。量化方法从 6.7B 开始失败的核心原因可能是:量化分布的范围太大,导致大多数量化 bins 为空,小的量化值被量化为零,基本上消除了有效信息。
    • 注意力层变得非常稀疏;FFN层变得更密集;Transformer变得更稳定。如果将离群值从模型中分离出来,剩下的部分可以用8-bit甚至更低的精度进行运算。

1.4 分布规律

新出现的离群特征(Emergent Features)的分布是有规律的。LLM.int8()作者在博客总结了原论文中报告的关于Emergent Features的几个现象:

  • Emergent Features在大型模型中是系统性的:要么出现在大多数层中,要么不出现。但是,在小型模型中是概率性出现的:只是有时出现在某些层中。
  • Emergent Features容易出现的潜在位置包括:注意力投影层(attention projection, query/key/value/output)、FFN的第一层。
  • 激活中的异常值集中在一小部分通道中。通常,这些离群特征只分布在 Transformer 层的少数几个维度。比如对于一个参数量为6.7亿的transformer模型来说,如果输入句子序列长度是2048,每个序列在整个模型中找到大约 150k 个异常值特征,但它们仅集中在 6 个不同的特征维度中。
  • 这些激活上的离群点会出现在几乎所有的 token 上,但是局限于隐层维度上的固定的 channel 中;给定一个 token,不同 channels 间的方差会很大,但是对于不同的 token,相同 channel 内的方差很小。考虑到激活中的这些离群点通常是其他激活值的 100 倍,这使得激活量化变得困难。
  • Emergent Features是随着ppl指数增长的,与模型大小无关。
如下图所示,大量异常值特征的出现呈现一种平滑的趋势,而且基本体现为随着困惑度变化的指数函数。这表明异常值的出现并不是突然的。并且通过研究较小模型中的指数趋势,论文作者能够在相移(相位移动,Phase shift,它指的是一个波形在时间上发生的移位现象)发生之前就检测到异常值特征的出现。这也表明,异常值的出现不仅与模型大小有关,还涉及困惑度,也与所使用的训练数据量和数据质量等多个附加因素有关。论文作者推测模型大小只是离散特征出现所需的众多协变量中的一个重要协变量。
4.jpeg

另外,这些大规模值还有个奇特现象:它们在不同的注意力头部中呈现出惊人的一致性,集中分布在相似的位置索引上。这打破了我们的传统理解——各注意力头部应该独立运作,处理不同类型的信息。想象一下,如果10个人思考同一个问题,正常情况下他们会关注不同的角度,但现在研究发现,他们都不约而同地关注了相同的几个点,这非常反直觉。你可能注意到,这些值的分布并非随机,而是遵循某种结构化模式,这暗示着它们在模型的信息处理中扮演着特定且关键的角色。
1.5 出现原因

关于outlier出现的原因,人们也做了研究,提出了很多观点。总结大致如下:softmax 和 RoPE 是产生异常值的起点,当token在Transformer架构中流动时,FFN、Norm等模块会对异常值做进一步放大,我们接下来就逐一分析。
1.5.1 softmax

有一种观点认为,outlier和softmax的机制有关系。在 LLM 上下文中,outlier产生的原因是,因为某个注意力头不想关注某些有实际语义的token,所以就把更多的关注放在非语义 token(逗号等)上。如何才能把更多的关注放在非语义token上呢?这就是通过进行大量加权来产生outlier。我们使用论文“Quantizable Transformers: Removing Outliers by Helping Attention Heads Do Nothing”和“StableMask: Refining Causal Masking in Decoder-only Transformer”来进行学习。
LLM模型

论文“Quantizable Transformers: Removing Outliers by Helping Attention Heads Do Nothing”研究结果如下:

  • 超过97%的离群值都是分割符token,如[SEP],逗号","和句号"."等。
    5.jpeg

  • 注意力头部将几乎所有的概率分配给[SEP]token和其他信息量较小的token,如点/逗号(下图(a)中左侧),而这些token对应的value很小(下图(a)中间)。这导致两者之间的乘积很小(下图(a)中右侧)。
  • 在其他情况下(图b和c),我们观察到,很大一部分注意力概率仍然分配给了分隔符token。然而,通过在其他token上分配一些概率,这会引起hidden representation的(软)选择性更新。
6.jpeg

上图其实就展示了Attention的“不注意/不更新”机制,具体解释如下:

  • 序列中存在一些不相关的token,如初始token或标点符号等非功能性单词,这些token更常被其他token观察到,我们可以称之为非语义 token。
  • 注意力机制通常需要很少的重要token,其他token可能只是干扰。注意力机制应该只更新这些重要token的权重参数。对于这种干扰token,理想状态是把它们的注意力得分归零。毕竟不是所有token都需要学的,即不是所有token参与权重参数的更新。
  • 在某些情况下,模型可能会发现“没什么token值得注意的”,这时它选择将不成比例的注意力(disproportional attention)放到非语义 token上,尽量不给其它token分配注意力概率,这种非语义 token会输出较小的value。这样才不会误更新那些有意义的token,起到“不注意/不更新”的作用。作者把这种机制称为attention的“no-op” 现象。
论文“Quantizable Transformers: Removing Outliers by Helping Attention Heads Do Nothing”作者对“no-op” 现象给出了几点假设和推理,我们结合论文“StableMask: Refining Causal Masking in Decoder-only Transformer”的思路一并分析:

  • 为了让注意力模块在残差上不更新一个token的表示,一些注意力头希望将它们大部分的注意力概率分配给一些固定且常见的具有低信息量(例如,分隔符token或背景块)的token,这些token在学习之后可以产生小的value。
  • 从softmax函数的定义中可以很容易地看出,这将使得softmax的输入具有相对较大的动态范围。实际上,在softmax恰好为零的极限情况下,此动态范围将无限大。
    7.jpeg

  • 由于层归一化(Layer Normalization)会归一化离群值,前一层FFN输出的大小必须非常高,这样才可以在LayerNorm之后,仍然产生足够大的动态范围。注意,这也适用于在自注意力或线性变换之前应用LayerNorm的Transformer模型。
  • 在原始的softmax函数中,所有的输入都会被映射到0到1之间,并且所有的输出值之和为1,因此需要在所有可见token上不可避免地分配注意力。在这种情况下,softmax函数所施加的要求阻止了模型有效地将无关token的注意力得分归零。这意味着即使某些输入值非常小,它们在softmax函数处理后也会有一个非零的输出值。由于softmax永远不会输出精确的零,它总是会反向传播梯度信号以产生更大的离群值。因此,网络训练的时间越长,异常值的幅度就越大。
  • 在Decoder Only模型中,序列最前面的token更容易成为离群值。这可能因为在序列逐渐被mask的过程中,序列最前面的token所占注意力较高,因为刚开始输入时还没有几个token,做softmax后由于分母的项少所以更容易分得更多注意力。而随着token数量的增加,更多的token参与了softmax操作,甚至为每个token分配非常小的概率也会导致显著的累积概率。因此,sink token不能像在序列开始时那样获得那么多的关注值。而且,因为初始token对几乎所有后续的token都是可见的,因此最初的token更容易被训练成为注意力汇集点,吸引一些不必要的注意力。
下图是BERT中注意力层的示意图,该图展示了前一层中的异常值如何影响下一层中注意力机制的行为。隐激活张量用x表示。生成幅度最大异常值的FFN的输出以红色来突出显示。
8.jpeg

VIT模型

论文“Quantizable Transformers: Removing Outliers by Helping Attention Heads Do Nothing”通过分析ViT模型的特征图,发现其也是有离群值的。ViT中的离群值主要出现在图片背景上,背景token也都是没什么信息的。下图给出了在ImageNet验证集中的随机图像上展示的ViT异常值分析摘要。(a) 输入图像。(b) 第11层输出中的异常值。(c)在注意力头#1、层#12的每个补丁上花费的累积注意力权重(按行求和的注意力概率矩阵)。(d) 相应的注意力概率矩阵。(e) 异常值和非异常值补丁(patches)的平均值大小。

论文“Vision Transformers Need Registers”的观点如下:

  • 和Quantizable Transformer一样,作者观察几种视觉Transformer模型发现:其特征图中有许多离群值特征,离群值特征就是L2范数很大的特征,并且更多地出现在更深的层、较大型模型的长时间训练中。
  • 通过测量离群特征和相邻的四个token特征的余弦相似度,作者发现这些特征之间是高度相似的,进而暗示着离群特征的信息是高度冗余的。
  • 作者推测离群特征包含更少的位置信息与像素信息。
  • 作者又设计了一个实验,拿单个的离群特征和正常特征去预测其token所属图片的类别,结果是离群token分类的准确率更高,从而说明了离群token可能包含更多的全局信息。
  • 作者的猜测和之前的研究差不多:充分训练的大模型在训练的时候会识别一些冗余的token,用这些token来处理、存储、检索一些全局信息。作者假定这种行为模式本身并不坏,但是对于模型的输出如果包含这种 tokens 就不太可取。事实上,这种异常的 tokens 会引导模型丢弃局部的信息,导致密集预测任务性能的降低。
1.5.2 RoPE

论文"Massive Values in Self-Attention Modules are the Key to Contextual Knowledge Understanding"作者认为,RoPE 是驱动 QK 表征中结构化“离群值”出现的根本原因。
现象

论文发现的现象如下:

  • 在使用RoPE的模型中(如Llama、Gemma、Qwen等),注意力机制的查询(Q)和键(K)组件中存在显著的大规模值(massive values),这些值集中分布在特定区域,而在值(V)组件中却不存在此类现象。
  • 而未使用 RoPE的模型(如GPT-2、OPT等)中并未观察到上述特性。
  • 那些特意保留这些极端数值的量化技术(例如 AWQ 和 SmoothQuant)能够维持模型的原有性能;反之,若采用未能保留这些数值的方法(例如 GPTQ),模型的上下文推理能力将遭受重创。
  • 在涵盖自回归 LLM(大语言模型)及多模态模型等多种 Transformer 架构中,作者均一致地观察到了这种“巨大值”集中的现象。
  • 大规模值从第一层就开始出现,且在应用RoPE前后保持相对一致的模式。这表明大规模值的形成是模型训练过程中逐步形成的结果,而非简单由RoPE添加导致。
分析

论文作者认为,RoPE 机制通过将嵌入维度划分为成对并应用不同频率的旋转操作,使得低频区域编码了丰富的语义内容而非位置信息,从而促成了大规模值的集中分布。这种模式在未采用 RoPE 的 LLMs(大语言模型)中则不会存在。
1.5.3 FFN

下面文字摘录自 从Training Dynamics到Outlier——LLM模型训练过程中的数值特性分析。
矩阵乘法的动态性分析

给定矩阵乘法 \(C = A \times B \in \mathbb{R}^{m×n}\),可将其元素分解为:

\[C = A \times B = \begin{bmatrix} a_0 \\ a_1 \\ \vdots \end{bmatrix} \times \begin{bmatrix} b_0 ; b_1; \dots \end{bmatrix} = \begin{bmatrix} a_0 b_0 & a_0 b_1 & \dots \\ a_1 b_0 & a_1 b_1 & \dots \\ \vdots & \vdots & \ddots \\ \end{bmatrix} = [c_{ij}] = [a_i \cdot b_j]  \]
进一步有:

\[c_{ij} = \|a_i\| \|b_j\| \left [ \frac{a_i \cdot b_j}{\|a_i\| \|b_j\|} \right ] = \|a_i\| \|b_j\|\cos{\theta_{ij}}  c_{ij} = \langle a_i, b_j \rangle = \|a_i\| \|b_j\| \left( \frac{\langle a_i, b_j \rangle}{\|a_i\| \|b_j\|} \right) = \underbrace{\|a_i\|\|b_j\|}_{\text{能量项}} \cdot \underbrace{\cos\theta_{ij}}_{\text{相关性项}}\]
其中 \(\theta_{ij}\) 为两个向量的夹角,若两者均值为零,则 \(\cos{\theta_{ij}}\) 与两向量线性相关性 \(\rho\) 相等。根据上述分析,可以将矩阵乘法分解成两部分:

\[C = \underbrace{[\|a_i\| \|b_j\|]}_{能量矩阵} \odot \overbrace{[\cos \theta_{i,j}]}^{相关性矩阵} = \mathbf{E} \odot \mathbf{R}\]
其中 \(a_i\) 表示的是每个token的能量, \(b_j\) 表示权重矩阵对每个特征通道的固有缩放。两者张成的能量矩阵 \(\mathbf{E}\) 表示了输入到矩阵乘法环节的总能量分布,而相关性矩阵 \(\mathbf{R}\) 则表示了能量传输效率与信息选择。通常来说,能量矩阵 \(\mathbf{E}\) 具有较高的动态范围,而相关性矩阵 \(\mathbf{R}\) 需要较高的计算精度。
FFN主要计算

FFN的主要计算如下:

\[y = \left[ \text{Swish}(xW_1)\odot xW_2 \right] W_3  \]
其中三次线性变换 \(W_1\) 被称为gate projection, \(W_2\) 被称为up projection,而 \(W_3\) 被称为down projection。这三次projection的能量矩阵与相关性矩阵之间的特性如下:

  • 权重矩阵分布基本服从正态分布且较为稳定,而激活输入则经常出现显著的异常值(outlier);
  • 相关性矩阵与能量矩阵之间没有相关性;
  • 能量矩阵 \(\mathbf{E}\)与输出激活值之间相关性较弱,对异常值的产生影响有限;
  • 相关性矩阵\(\mathbf{R}\)与输出激活值呈明显的线性相关关系,是产生大幅异常值的主导因素;
我们再来对SwiGLU的异常值产生过程进行数学机理分析:SwiGLU可看作一个门控选择放大单元,其计算可以分解为:

\[\overbrace{\text{Swish}(W_{gate}x)}^{门控向量} \odot \underbrace{W_{up}x}_{特征向量}\]
这使得门控向量成为特征选择器,仅允许正相关特征通过。门控放大单元的机制也导致了以下作用:

  • 异常值协同放大作用,当门控单元处于线性区,即\(W_{\text{gate}}x > 0\)时,\(\text{Swish}(z) \approx z\),此时门控输出对up projection进行线性放大。当门控值与up projection都比较大时,up projection与gate projection中的outlier“撞”到了一起,相乘之后输出了非常大的数值,致使down projection输入激活值分布通常呈现高度尖锐特性。
  • 零值聚集效应,当门控单元处于饱和区, 当 \(W_{\text{gate}}x < 0\) 时, \(\text{Swish}(z) \rightarrow 0\),导致大量激活值被拉到零附近,进而导致了down projection的输入的动态范围被压缩。至此,down projection即包含了远远偏离零的outlier,又包含了非常靠近零的小值,最后导致该input对低精度训练来讲非常难以处理。
1.5.4 LayerNorm

LayerNorm结构中的尺度参数γ作为一个放大器,也会放大输出中的离群值。
下图给出了BERT-ST-2上LayerNorm的异常值表示,可以看出,维度308处具有更尖锐的值,而且,乘数γ和输出\(\widetilde X\)在相同的嵌入维度上包含异常值。如果删除γ,则可以发现\(X'\)的分布就更加平缓。
10.jpeg

1.5.5 RMSNorm

RMSNorm层是当前主流大模型所使用的归一化层,相较传统的LayerNorm减少了对均值的计算,进而是的归一化层的计算更加高效。RMSNorm定义如下:

\[\bar{x_i} = \frac{x_i}{RMS(x)}w_i, RMS(x) = \sqrt{\frac{1}{H}\sum_{i=0}^H x_i^2}\]
在大模型中,RMSNorm先对每个token的表达进行归一化,再对每个channel进行缩放。我们可以直观的看到归一化与缩放两个阶段对数值范围的影响。归一化能够较好的抑制outlier,而缩放过程会放大某些重要的channel,但也会导致部分数值变得很大,反而加剧了outlier的情况。总的来说,RMSNorm主要作用是对outlier进行动态范围的压缩,这种压缩作用大多数情况能成功,但部分layer只能提供很少的压缩比。在这种情况下,就会对离群值
1.6 作用

1.6.1 负面作用

异常值(离群值)会给量化带来什么影响?根据 Llm.int8() 和 Smoothquant 中的发现,LLM中,权重和激活都存在显著的异常值 。 这些异常值对量化过程有显著影响,因为它们会增加量化步长,同时降低中间值的精度。保留这些稀疏离群值也会导致速度大幅下降(例如1.5%的离群值导致SpQR的速度下降超过30%)。
假设有一个向量A=[-0.10, -0.23, 0.08, -0.38, -0.28, -0.29, -2.11, 0.34, -0.53, -67.0]。我们可以看到异常值是有害的:

  • 如果我们在保留emergent feature -67.0的情况下对该向量做量化和反量化,处理后的结果是:[ -0.00, -0.00, 0.00, -0.53, -0.53, -0.53, -2.11, 0.53, -0.53, -67.00],大部分信息在处理后都丢失了。
  • 如果我们去掉emergent feature -67.0对向量A做量化和反量化,处理后的结果是:[-0.10, -0.23, 0.08, -0.38, -0.28, -0.28, -2.11, 0.33, -0.53]。出现的误差只有其中一个数值-0.29变成了-0.28。
我们再用数学公式来推导下。
11.jpeg

请注意,计算 \(\Delta\) 时使用的是最大值,因此 X 中的超离群值会大大增加步长。导致离群值平均会被舍入到更远的值,从而增加量化误差。随着超离群值的增加,离群值被舍入到更少的离散值中,更多的量化 bin 未被使用。这样,超离群值就会导致量化保真度降低。
1.6.2 正面作用

保持性能

LLM.int8()作者发现,异常值特征强烈影响 Attention 和 Transformer 的整体性能。事实证明,在量化过程中裁剪这些异常值不利于 LLM 的性能。保留异常值对于大语言模型的性能至关重要。 比如:

  • 在训练的初始阶段,任何基于裁剪的方法都会导致异常高的困惑度(perplexity)分数(即> 10000),从而导致大量信息丢失,很难通过微调来恢复。而且,对于越大的模型,离群值对于模型性能的影响越大,模型对outlier的依赖更强。
  • 保留稀疏离群值可以提高准确率。如果去除异常值,即使最多有 7 个异常值特征维度,top-1 softmax 概率就会从约 40% 降低到约 20%,验证集困惑度增加了 600-1000%。当改为删除 7 个随机特征维度时,top-1 概率仅下降 0.02-0.3%,困惑度增加 0.1%。这些结果突出了异常值特征的关键性质。这些异常值特征的量化精度至关重要,因为即使是微小的误差也会极大地影响模型性能。
上下文理解

在理解大规模值的作用前,我们需要区分两种知识类型。"参数知识"是指模型在训练过程中学到并存储在其参数中的知识,例如"巴黎是法国首都";而"上下文知识"是指模型从当前输入上下文中获取的信息,例如理解一篇文章后回答其中提到的细节。
论文"Massive Values in Self-Attention Modules are the Key to Contextual Knowledge Understanding"作者认为,大规模值在处理上下文知识(contextual knowledge)方面扮演至关重要的角色,而对参数知识(parametric knowledge)的影响相对较小。

  • 此类极端数值对模型的上下文理解能力至关重要,相较之下,其对于参数化知识的倚重程度则较低。实验显示,若此类数值受到干扰,模型仍能回忆既有事实(例如,回答“中国首都是哪里?”),但在需要依赖上下文的任务中(如 GSM8K 数学推理测试),其表现则会显著下滑。
  • 当作者刻意让上下文信息与模型的内在知识产生冲突时(例如"地理知识已改变,纽约现已成为英国的一个城市"),发现 LLMs(大语言模型)的表现与随机猜测无异。然而,当大规模值被破坏后,模型的准确率反而显著高于随机水平。这暗示 LLMs(大语言模型)在默认情况下更倾向于依赖其内部知识,而这些“巨大值”则在引导模型理解上下文方面扮演着关键角色。当大规模值被破坏后,模型失去了处理误导性上下文信息的能力,转而默认使用其参数知识,有效地忽略了矛盾的上下文。
  • 这些“巨大值”对于需要依赖上下文的任务——例如密钥信息检索、文本情感分析以及逻辑推理——具有不可或缺的作用,而对于参数化知识的直接调取,其影响则相对有限。
因此,人们往往选择保留这些异常值。 朴素且高效的量化方法(W8A8、ZeroQuant等)会导致量化误差增大,精度下降。而GPTQ不特别保护大规模值,在上下文知识理解任务上表现显著下降(准确率降至约75%,归一化后),但在参数知识检索任务上依然表现不错。为了更有效地处理异常值,LLM.int8()提出了混合精度分解,以确保激活中的一些异常值的准确性。SmoothQuant通过平滑激活中的异常值来降低量化的难度。SpQR识别敏感权重以确保其精度,同时将其他权重量化到较低的比特宽度。AWQ通过在量化过程中选择性地保护"重要"权重来维持大规模值,在所有任务上保持较强的性能表现。
1.7 难点

我们总结大模型量化困难的原因为如下几点:
<ul>激活比权重更难量化。权重分布较均匀,易于量化。有研究表明 LLMs 的权重量化到 INT8 甚至 INT4 并不会影响精度。

激活难以量化的原因是因为异常值。在 per-tensor 量化的情况下,大的异常值主导了最大幅度,异常值规模比大多数激活值大约 100 倍。这压缩了非异常通道的有效量化位数,导致非离群点 channel 的有效量化 bits/levels 较低:假设 channel
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册