欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

定量】定量原理分析

最编程 2024-04-03 08:11:44
...

2 量化基本原理

模型量化方法本质上是函数映射。建立了高精度的浮点数据 和量化后低精度的定点数据 之间的数据映射。
根据映射函数是否为线性,将其分为线性量化和非线性量化。

  • 线性量化:8bit量化(又分为对称量化、非对称量化)
  • 非线性量化:二值量化 (1 bit量化)、聚类量化、对数量化

其中最常用的是8bit量化,已在工业界中成熟使用。


2.1 线性量化

浮点模型参数与定点模型参数之间如何转换呢?

  • 浮点转定点(量化)公式为: Q = r o u n d ( R S + Z ) Q=round (\frac{R}{S}+Z) Q=round(SR+Z)定点转浮点(反量化)公式为: R = ( Q − Z ) ∗ S R=(Q-Z)*S R=(QZ)S【R】原始的浮点数据
    【Q】量化后的定点数据
    【Z】偏移量(或零点/最小值对应的量化数值),又被称为 Zero Point
    【S】缩放系数,又被成为Scale

那S和Z如何获取呢?

  • 可以知道浮点和定点参数的最值 R m a x 、 R m i n 、 Q m a x 、 Q m i n R_{max}、R_{min}、Q_{max}、Q_{min} RmaxRminQmaxQmin,则有:
    S = R m a x − R m i n Q m a x − Q m i n S=\frac{R_{max}-R_{min}}{Q_{max}-Q_{min}} S=QmaxQminRmaxRmin Z = Q m a x − R m a x S Z=Q_{max} - \frac{R_{max}}{S} Z=QmaxSRmax
2.1.1 8bit量化

(对上面的公式分情况细化)
8bit量化是目前工程上应用最为成熟的方案。该方案非常好的平衡了推理速度和精度之间的矛盾。Google的Tensorflow采用的是非对称量化,NVIDIA采用的是堆成量化。
对称量化和非对称量化,都属于线性量化,具有相同的量化公式和反量化公式(如上公式)。
但对于量化时的 S 、 Z S、Z SZ,可将其计算方式具体化。

  • 【对称量化】
    在这里插入图片描述
    操作:如上图所示,对称量化将输入数据映射到 [-128,127] 的范围内,但在实际使用中使用的是 [-127,127]。
    问题:如果将输入数据中存在偏离正常分布的较远离群点,则会导致较大的量化精度损失。
    解决:实际使用中,通常会选择介于127和 m a x ( ∣ x f ∣ ) max(|x_f|) max(xf) 之间的一个阈值T 对输入数据进行截断,以免离群点对量化精度的影响。即 量化的输入区间从 [ − m a x ( ∣ x f ∣ ) , m a x ( ∣ x f ∣ ) ] [-max(|x_f|), max(|x_f|)] [max(xf),max(xf)] 变为 [ − ∣ T ∣ , + ∣ T ∣ ] [-|T|, +|T|] [T,+T]

    对称量化需要保证【原始的输入数据中零点】通过映射公式后仍对应 [-127, 127] 区间的零点。所以Z=0,且Q=0时恰好有R=0。则整个计算过程如下,其中 R ′ R^{'} R为反量化结果
    Z = 0 S = ∣ R m a x ∣ ∣ Q m a x ∣ Q = c l i p ( r o u n d ( R S ) , − 127 , 127 ) R ′ = Q ∗ S \begin{aligned} Z&=0 \\ S&=\frac{|R_{max}|}{|Q_{max}|} \\ Q&=clip(round (\frac{R}{S}), -127, 127) \\ R^{'}&=Q*S\\ \end{aligned} ZSQR=0=QmaxRmax=clip(round(SR),127,127)=QS

  • 【非对称量化】
    在这里插入图片描述
    如上图所示,非对称量化将输入数据映射到[0,255] 的范围内。此时 Z = Q m a x − R m a x S = Q m i n Z=Q_{max}-\frac{R_{max}}{S}=Q_{min} Z=QmaxSRmax=Qmin。则整个计算过程如下,其中 R ‘ R^{`} R为反量化结果
    S = R m a x − R m i n Q m a x − Q m i n = R m a x − R m i n 255 Z = Q m a x − R m a x S = Q m i n Q = c l i p ( r o u n d ( R S + Z ) , 0 , 255 ) R ′ = ( Q − Z ) ∗ S \begin{aligned} S&=\frac{R_{max}-R_{min}}{Q_{max}-Q_{min}}=\frac{R_{max}-R_{min}}{255} \\ Z&=Q_{max}-\frac{R_{max}}{S}=Q_{min}\\ Q&=clip(round (\frac{R}{S}+Z), 0, 255) \\ R^{'}&=(Q-Z)*S\\ \end{aligned} SZQR=QmaxQminRmaxRmin=255RmaxR

    上一篇: 一种解决方案可处理从模型量化到终端部署的整个过程

    下一篇: 什么是模型量化?有哪些方法?简要概述