Lecture5量化

在IEEE 754标准中表示32位浮点数方法,分为标准化和非标准化。在这里插入图片描述
左边是标准化浮点数,分为符号位,指数位和尾数位,

  • Sign(符号位):1位,0表示正数,1表示负数。
  • Exponent(指数):8位,用于表示浮点数的指数。存储时使用偏移量(bias)127进行偏移,即存储的值实际是Exponent + 127。
  • Fraction(尾数):23位,存储浮点数的小数部分。
  • 所以标准化浮点数的计算公式:

( − 1 ) s i g n ∗ ( 1 + F r a c t i o n ) ∗ 2 E x p o n e n t − 127 (-1)^{sign} * (1+Fraction) * 2^{Exponent-127} (1)sign(1+Fraction)2Exponent127

这里的1 + Fraction表示还原出实际的尾数值。
图中的例子表示一个具体的32位浮点数,符号位0表正数,指部分01111101->二进制转10进制是125,减去偏移量127,得到指数为-2。尾数部分00010000000000000000000,表示0.0625。所以计算实际值得到
0.265625 = 1.0625 ∗ 2 − 2 = ( 1 + 0.0625 ) ∗ 2 125 − 127 0.265625 = 1.0625 * 2^{-2} = (1+0.0625)*2^{125-127} 0.265625=1.062522=(1+0.0625)2125127

右边是非标准化浮点数,对于指数部分全为0的浮点数,它们被视为“非标准化”浮点数,意味着它们没有最高有效位1。
非标准化浮点数的计算公式是:
( − 1 ) s i g n ∗ F r a c t i o n ∗ 2 E x p o n e n t b i a s − b i a s (-1)^{sign} * Fraction * 2^{Exponent bias-bias} (1)signFraction2Exponentbiasbias
这里的exponent bias = 1,bias = 127.
只有指数全为0,我们采用subnormal,指数不为0的话我们就用normal、
由于指数全为0,因此此时的指数实际上固定为1 - 127 = -126,且尾数没有默认的隐含位1。
图中展示了符号位和指数位都为0的,所以就是0*0

那最小的subnormal Number/normal number是多少?
最小的normal number根据前面的公式来看,符号位0,指数部分为1,尾数部分fraction为0,所以就是
在这里插入图片描述
那subnormal部分:
符号位为0,指数exponent 是0,尾数部分fraction为1.
表示出来如下
在这里插入图片描述
那么最大的正数是多少呢?
在normal number中直接通过exponent指数部分全设置为1就可以。在IEEE 754标准中,当指数部分为255且尾数部分全为0时,浮点数被解释为无穷大。符号位决定无穷大的正负。在这里插入图片描述
如果是负无穷的话把符号位变为1,指数尾数不变。
无穷大主要用于表示溢出的计算结果,比如一个非常大的正数或负数超出了浮点数的表示范围。

而右侧subnormal number却发现乘NAN了。因为它大不了多少,表达最大值没意义。

所以我们需要用两种模式来表示最大值和最小值。
在这里插入图片描述
可以看到在表示最大值的区间内使用normal mode,在 2 − 149 2^{-149} 2149的区间是用subnormalmode的。为啥这样呢?
在标准化模式(normal mode)下,浮点数的表示遵循
1+Fraction…其中尾数部分始终有一个隐含的1。因此,当指数较小时(靠近0),最小可表示的数值相对较大。

如果没有非标准化模式(subnormal mode),当指数变为0时,数值将直接跳跃到0,这会造成数值表示范围的突然断裂,也就是所谓的“underflow”问题。为了避免这种突变,非标准化模式被引入,用于表示非常接近0的数值。

所以分成两种模式的好处:
保证浮点数的连续性:非标准化模式确保数值从正常化的最小值向0平滑过渡,避免出现数值突然从一个最小的正数跳变到0的情况。
增加小数值的表示范围:非标准化数可以表示接近0的非常小的数值,有效地增加了浮点数的可表示范围,从而增强了在处理小数值时的表现能力。

FP16

再来看看FP16的表示
在这里插入图片描述
符号位为1,表示负数,指数部分为10001,尾数部分表示1100000000,。
指数部分换算10进制为17,指数的bias是15,所以实际的指数是17-15=2.
尾数部分是1100000000,用小数表示1+Fraction = 1 + 0.75 = 1.75.
用十进制公式计算:
( − 1 ) s i g n ∗ ( 1 + F r a c t i o n ) ∗ 2 E x p o n e n t − B i a s (-1)^{sign} *(1+Fraction) * 2^{Exponent-Bias} (1)sign(1+Fraction)2ExponentBias
-1 * 1.75*4 = -7

BF16也可以计算下,在十进制的2.5,在BF16中如何表示?
2.5 = 1.25 * 2
所以分局normal number公式
fraction等于0.25,exponent部分是128,所以得到1.25 * 2;
在这里插入图片描述
最近比较火热的是FP8 E4M3格式,指数部分有4,尾数有3。最大的正常值用1111_110表示(对应最大值是448)。NAN用1111_111表示.
还有反向传播中梯度计算的E5M2格式,

在这里插入图片描述
下面还有部署LLM的int4和FP4
在这里插入图片描述
这里我们之前学的:指数部分为0的时候我们用subnormal,也就是
( − 1 ) s i g n ∗ 2 ∗ 1 − b i a s (-1)^{sign} * 2*^{1 - bias} (1)sign21bias
指数不为0的时候用normal公式:
( − 1 ) s i g n ∗ ( 1 + F r a c t i o n ) ∗ 2 E x p o n e n t − 127 (-1)^{sign} * (1 + Fraction) * 2^{Exponent-127} (1)sign(1+Fraction)2Exponent127
是仅仅针对浮点数的形式,例如说INT4,这都是整数int型了。。所以直接2的次方就可以了。

FP4(E2M1)也是相同的算法,normal情况下
(1+0.5)*2^(3-1) = 6

AUTO Quantization

在这里插入图片描述
量化的过程是将连续信号映射到一个离散值集合。这样做的结果是,连续信号的某些值会被映射到相邻的离散值,这就会产生一种误差,称为 量化误差)。这就是将输入值从一个连续或较大的范围限制到一个较小的离散范围时产生的误差。
这里用图像示例来展示量化。左边是原始图像,右边是经过量化处理后仅有 16 种颜色 的图像。这个过程类似于 调色板化,即将原始图像中连续的颜色范围限制到一个较小的颜色集合,从而减少图像的色彩细节。
量化是将一个连续或较大的输入值范围缩减到一个离散的较小值范围的过程。它在信号处理中通常会产生量化误差,而在图像处理中会造成颜色细节的丢失,降低图像质量,但可以达到降低存储空间或计算资源消耗的目的。

常见的量化方法

K-Means-based Quantization

在这里插入图片描述

利用 K-Means 聚类方法,将原始的浮点权重(左侧矩阵)聚类成固定的离散簇中心,然后用这些中心值来替代原始权重。可以显著减少权重的不同取值数量,用簇编号来代替原始浮点数权重,降低存储需求。
可以看到未量化之前的矩阵有很多小数啥的,量化完的很整洁。然后聚类结束的时候储存的是簇编号和簇中心值,因此存储需求远小于原始浮点权重。,只存了2.00,1.50,.0…,-1.00这四个值构成的编号和值。结果是浮点数是因为反量化的结果。

具体量化过程如下:

在这里插入图片描述
未量化之前是4*4矩阵,首先把权重值给int,然后我们在进行聚类,将权重分为4个簇,每个簇对应一个中心值。量化后的矩阵变成了簇索引,矩阵中每个权重都用一个2bit整数来表示其属于哪个簇。
例如,2-bit 的整数可以表示 4 个簇(0, 1, 2, 3)的索引,每个索引对应一个中心值。例如第一个元素3,簇索引就是3,他是属于第三个簇的,第三个簇的value是2.那16个元素每个元素都有一个索引,照着索引找他的排序就可以了。
所以索引存储需求 2 * 16 = 32bit。32/8=4B。
中心值查找表存储了所有簇的中心值,一共4个浮点数,每个占用32bit,所以查找表的存储需求:
32 * 4 = 128bit = 16B。
16+4 = 20B,相比于原来的64B少了3.2倍
我们在根据索引值重构矩阵时得到的结果如下:
在这里插入图片描述

量化误差也并不是很大。

Linear Quantiaztion

线性量化是一种常见的量化方式,将浮点数权重映射到一个离散的整数范围,然后用一个缩放因子来恢复精度。
量化权重 W q W_q Wq是由round(W/△)得到的。
在这里插入图片描述
可以看到对权重进行kmeans那种索引量化,每个元素都根据索引值找到自己的元素值,然后在乘量化公式,bias是-1,scale是1.07,得到重构的矩阵权重在右边,然后根据原矩阵可以找到量化误差。
所以r = (q - z ) * s
那么我们计算量化后的值就是
Q = ( r / s + z ) Q = (r/s + z) Q=(r/s+z)
在这里插入图片描述
原始权重𝑟和缩放参数𝑆都是浮点数,分别用于描述模型的实际权重和量化到浮点数之间的比例。
量化后的权重𝑞和零点𝑍是整数。零点𝑍是一个量化参数,通常用于确保浮点数0能够准确表示为某个量化整数,减少偏差。

在这里插入图片描述

这部分就是量化过程中的细节,浮点数的范围定义在 [ r m i n , r m a x ] [r_{min},r_{max}] [rmin,rmax]之间,量化后的权重范围定义在 [ q m i n , q m a x ] [q_{min},q_{max}] [qmin,qmax]之间。

其中 r m a x = S ∗ ( q m a x − Z ) r_{max} = S * (q_{max} - Z) rmax=S(qmaxZ)
r m i n = S ∗ ( q m i n − Z ) r_{min} = S * (q_{min} - Z) rmin=S(qminZ)
两个公式相减,得到:
r m a x − r m i n = S ∗ ( q m a x − q m i n ) r_{max} - r_{min} = S * (q_{max} - q_{min}) rmaxrmin=S(qmaxqmin)
S = ( r m a x − r m i n ) / q m a x − q m i n S = (r_{max} - r_{min}) / q_{max} - q_{min} S=(rmaxrmin)/qmaxqmin

这里我们还有一个z要计算,这个z咋计算呢
在这里插入图片描述
上图已经给出计算过程了。。。

矩阵量化

线性量化在矩阵乘法中的应用。我们要知道线性量化将整数映射到实数:r = S*(q-Z)

S是缩放系数,q是量化后的值,z是偏置。

假设我们要计算矩阵乘法Y = W * X
W和X事两个浮点矩阵,Y是结果矩阵
由于我们希望在量化后进行计算,因此我们引入量化矩阵 q W , q X , q Y q_W,q_X,q_Y qW,qX,qY 以及它们对应的缩放参数和零点。

所以我们采用量化参数表示Y=W*X:
在这里插入图片描述
然后可以根据这个公式求解量化后的qY,同时还可以展开求解的qY公式
在这里插入图片描述
在这里插入图片描述

根据经验:
在这里插入图片描述
所以为了加快运算速度,还真是费尽心思,把定点乘法改成了位移操作,这个乘除运算等效成了一个 2 − n M 0 2^{-n}M_0 2nM0
在这里插入图片描述
如果是对称量化,也就是ZW等于0的话,那么这个量化公式仅剩下
q Y = ( S W ∗ S X ) / S Y ∗ ( q W q x − Z x q W ) + Z Y q_Y = (S_W*S_X)/S_Y *(q_Wq_x - Z_xq_W) + Z_Y qY=(SWSX)/SY(qWqxZxqW)+ZY

刚才我们讲的都是不带bias的,现在带了偏置该如何处置呢?
比如说在全连接层,Y = WX+b
那么量化后的公式就是

在这里插入图片描述
假设这里的 Z W Z_W ZW依旧是0的,那么我们可以把公式简化为

在这里插入图片描述

我们在把Zb设置为0,Sb = SwSx
得到
在这里插入图片描述
然后又因为qb是个常数,Zxqw相乘也是个常数(虽然我不知道怎么得来的) 把qbias = qb-Zxqw
得到
在这里插入图片描述

简化的太多了,看的有点云里雾里的。

卷积量化

卷积量化承接上面的矩阵量化,套路跟矩阵相乘是一样的,
Y = C o n v ( W , X ) + b Y = Conv(W,X)+b Y=Conv(W,X)+b
这里面我们把Zw = 0,Zb = 0,Sb = SwSx
qbias = qb-Conv(qw,zx)
得到:
在这里插入图片描述

Binary/Ternary Quantization

二值或三值量化是将权重压缩到只有两种(二值:{1, -1})或三种(三值:{1, 0, -1})可能取值的方式。这是极端的量化策略,可以大幅降低计算复杂度。
二值/三值乘法可以转化为简单的加减法和符号判断,大幅提高计算效率。

压缩流程

在这里插入图片描述
三个主要技术:剪枝量化和哈夫曼编码。
剪枝的主要目标是减少模型中的权重数量。
流程:

  • Train Connectivity(训练连接性):在原始网络结构上进行训练,以找到连接的重要性。
  • Prune Connections(剪枝连接):剪掉不重要的连接,保留重要的权重。
  • Train Weights(重新训练权重):剪枝后重新训练保留的权重,使模型在更小规模的参数下保持准确性。

量化旨在减少每个权重的比特数,使模型更加紧凑。

  • Cluster the Weights(聚类权重):将权重聚类,划分为若干组。
  • Generate Code Book(生成编码字典):为每个权重组生成对应的编码。
  • Quantize the Weights with Code Book(使用编码字典量化权重):利用生成的编码字典对权重进行量化。
  • Retrain Code Book(重新训练编码字典):对编码字典进行优化,使量化后的模型在保持准确度的情况下减少参数表示的比特数。

哈夫曼编码通过对权重和索引进行编码,以进一步压缩模型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值