模型压缩、裁剪、量化

模型压缩、裁剪、量化

压缩算法

将所有权重都表示为2的幂次方形式,参考IQN算法

将IQN所得的训练权重,用4bit形式表示(基于数据码本)

image-20210104165007992

IQN算法

image-20210104165032575

量化

背景

量化一般分两种形式,一种是训练后量化,指的是训练后的模型中的权重从float32量化到int8,并以int8形式保存,实际推理时,还需要反量化为浮点数运算。另一种时训练时量化,前向传播时,采用量化后的权重和激活值,反向传播过程仍对float类型权重梯度下降,推理时全部使用int8计算。

深度神经网络主要计算是浮点数之间的乘加运算,在FPGA程序中可以利用移位计算代替乘法计算,做到用少量的逻辑资源实现,提高FPGA计算能力,降低功耗。

激活值进行量化,可以将卷积运算通过移位来完成。

将FP32的激活值量化到int8范围内-128~127之间(char类型)。

特征图量化方法

  • 求一组数据最大值 $max_a = max(abs(T_a))$,a表示activations,T表示张量
  • 求量化系数$Q_a = round(log_2(128/max_a))$
  • 因此量化后的数据可以表示为$a_{int8} = round(2^{Q_a}.a_{fp32})$,这样$a_{int8}$的最大值就是128
  • 则卷积计算可以表示为:
    • $\left[a_{i n t 8}\right]{2}=\sum\left[a{i n t 8}\right]{1} * f i l t e r * 2^{-Q{a_{1}}} * 2^{Q_{a_{2}}}$
    • $\left[a_{i n t 8}\right]{2}=\sum\left[a{i n t 8}\right]{1} * 2^{-n} * 2^{-Q{a 1}} * 2^{Q_{a 2}}$
    • $[a_{int8}]2$是量化后输出层的值,$[a{int8}]_1$是输入层的值
  • 假设压缩后的weights表示为:
    • $weights = (-1)^s*2^m$
  • 量化后的feature_map表示为:
    • $Qfeature = feature*2^{-Q}$
  • 假设原来feature map的通道数为n,weight大小为k*k,则卷积可以表示为:
    • $result =\left(\sum_{i=1}^{N} \sum_{j=1}^{k * k}\right. feature [i][j] * weight \left.[i][j]\right)+ bias$
    • 代入后可表示为:$Qresult * 2^{Q 2}=\left(\sum_{i=1}^{N} \sum_{j=1}^{k * k}\right.Qfeature \left.[i][j] * 2^{Q 1} *(-1)^{s} * 2^{m}\right)+bias $
    • 因此:$Qresule = \sum_{i=1}^{N } \sum_{j=1 }^{k * k} Q \text { featur } e[i][j] * 2^{Q 1-Q 2} (-1)^{s} * 2^{m} + bias2^{-Q2}$
    • 上式前面那一部分可以表示成以为运算: $Qresult_part=\sum_{i=1}^{N} \sum_{j=1}^{k * k}(Qfeature[i][j] \ll(Q 1-Q 2+m)) *(-1)^{s}$
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×