---
title: 量化算法原理
description: "量化常用的算法有二值化、线性量化、对数量化，线性量化又可根据是否有offset细分为对称(Symmetric)，非对称(Asymmetric)两种。AMCT与昇腾芯片配套的是采用线性量化方式，并将对称和非对称量化方式进行了归一，以INT8量化为例，其应用表达式为："
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/devaids/amct/atlasamct_16_0385.html
sourcePath: /source/zh/canncommercial/900/devaids/amct/atlasamct_16_0385.html
indexId: 3f6fba9e7c607855dd243a9257ff4a51d6657d56e5191afe9e5907c86e54782b65
---
# 量化算法原理

量化常用的算法有二值化、线性量化、对数量化，线性量化又可根据是否有offset细分为对称(Symmetric)，非对称(Asymmetric)两种。AMCT与昇腾芯片配套的是采用线性量化方式，并将对称和非对称量化方式进行了归一，以INT8量化为例，其应用表达式为：


对于量化层数据和权重分别需要提供量化因子scale（浮点数的缩放因子），offset（偏移量）两项，支持的取值范围为：

- 
- 

下面介绍上述表达式的由来。

#### 对称量化算法原理

原始高精度数据和量化后INT8数据的转换为：，其中scale是float32的浮点数，为了能够表示正负数，采用signed INT8的数据类型，通过原始高精度数据转换到INT8数据的操作如下，其中round为取整函数，量化算法需要确定的数值即为常数scale：


对权值和数据的量化可以归结为寻找scale的过程，由于为有符号数，要保证正负数值表示范围的对称性，因此对所有数据首先进行取绝对值的操作，使待量化数据的范围变换为，再来确定scale。由于INT8在正数范围内能表示的数值范围为[0,127]，因此scale可以通过如下方式计算得到：


确定了scale之后，INT8数据对应的表示范围为，量化操作即为对量化数据以进行饱和，即超过范围的数据饱和到边界值，然后进行公式所示量化操作即可。


#### 非对称量化算法原理

与对称量化算法主要区别在于数据转换的方式不同，如下，同样需要确定scale与offset这两个常数。


确定后通过原始高精度数据计算得到UINT8数据的转换，即为如下公式所示：


其中，scale是float32浮点数，为unsigned INT8定点数，offset是INT8定点数，其表示的数据范围为。若待量化数据的取值范围为，则scale和offset的计算方式如下：

、


#### 量化数据格式归一

AMCT采用的是归一的量化数据格式，即量化数据格式归一：

通过将非对称量化公式进行简单的数据变换，可以使得量化后的数据与对称量化算法在数据格式上保持一致，均为int格式。具体变换过程如下：

以INT8量化为例进行说明，公式符号与之前保持一致，输入原始高精度浮点数据为，原始量化后的定点数为，量化scale，原始量化（算法要求强制过零点，否则可能会出现精度问题），原始量化的计算原理公式如下：


其中。通过上述变换，可以将量化数据也转成INT8格式。确定scale和变换后的offset'后，通过原始高精度浮点数据计算得到INT8数据的转换，即为如下公式所示：
