神经网络量化入门--基本原理

本文介绍了神经网络量化的基本原理,包括背景知识、矩阵运算量化和卷积网络的量化。通过浮点到定点的转换,展示了如何在矩阵乘法和卷积运算中实现量化,以达到减少计算资源和内存需求的目的。文章以Pytorch为例,阐述了量化模型的构建和推理过程,为初学者提供了一个简明的入门教程。
摘要由CSDN通过智能技术生成

(本文首发于公众号)

最近打算写一个关于神经网络量化的入门教程,包括网络量化的基本原理、离线量化、量化训练,以及全量化模型的推理过程,最后我会用 pytorch 从零构建一个量化模型,帮助读者形成更深刻的理解。

之所以要写这系列教程,主要是想帮助初次接触量化的同学快速入门。笔者在刚开始接触模型量化时走了很多弯路,并且发现网上的资料和论文对初学者来说太不友好。目前学术界的量化方法都过于花俏,能落地的极少,工业界广泛使用的还是 Google TFLite 那一套量化方法,而 TFLite 对应的大部分资料都只告诉你如何使用,能讲清楚原理的也非常少。这系列教程不会涉及学术上那些花俏的量化方法,主要是想介绍工业界用得最多的量化方案 (即 TFLite 的量化原理,对应 Google 的论文 Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference )

话不多说,我们开始。这一章中,主要介绍网络量化的基本原理,以及推理的时候如何跑量化模型。

背景知识

量化并不是什么新知识,我们在对图像做预处理时就用到了量化。回想一下,我们通常会将一张 uint8 类型、数值范围在 0~255 的图片归一成 float32 类型、数值范围在 0.0~1.0 的张量,这个过程就是反量化。类似地,我们经常将网络输出的范围在 0.0~1.0 之间的张量调整成数值为 0~255、uint8 类型的图片数据,这个过程就是量化。所以量化本质上只是对数值范围的重新调整,可以「粗略」理解为是一种线性映射。(之所以加「粗略」二字,是因为有些论文会用非线性量化,但目前在工业界落地的还都是线性量化,所以本文只讨论线性量化的方案)。

不过,可以明显看出,反量化一般没有信息损失,而量化一般都会有精度损失。这也非常好理解,float32 能保存的数值范围本身就比 uint8 多,因此必定有大量数值无法用 uint8 表示,只能四舍五入成 uint8 型的数值。量化模型和全精度模型的误差也来自四舍五入的 clip 操作。

这篇文章中会用到一些公式,这里我们用 r r r 表示浮点实数, q q q 表示量化后的定点整数。浮点和整型之间的换算公式为:
r = S ( q − Z ) (1) r = S(q-Z) \tag{1} r=S(qZ)(1)

q = r o u n d ( r S + Z ) (2) q = round(\frac{r}{S}+Z) \tag{2} q=round(Sr+Z)(2)

其中, S S S 是 scale,表示实数和整数之间的比例关系, Z Z Z 是 zero point,表示实数中的 0 经过量化后对应的整数,它们的计算方法为:
S = r m a x − r m i n q m a x − q m i n (3) S = \frac{r_{max}-r_{min}}{q_{max}-q_{min}} \tag{3} S=qmaxqminrmaxrmin(3)

Z = r o u n d ( q m a x − r m a x S ) (4) Z = round(q_{max} - \frac{r_{max}}{S}) \tag{4} Z=round(qmaxSrmax)(4)

r m a x r_{max} rmax r m i n r_{min} rmin分别是 r r r 的最大值和最小值, q m i n q_{min} qmin q m a x q_{max} qmax同理。这个公式的推导比较简单,很多资料也有详细的介绍,这里不过多介绍。需要强调的一点是,定点整数的 zero point 就代表浮点实数的 0,二者之间的换算不存在精度损失,这一点可以从公式 (2) 中看出来,把 r = 0 r=0 r=0 代入后就可以得到 q = Z q=Z q=Z。这么做的目的是为了在 padding 时保证浮点数值的 0 和定点整数的 zero point 完全等价,保证定点和浮点之间的表征能够一致。

矩阵运算的量化

由于卷积网络中的卷积层和全连接层本质上都是一堆矩阵乘法,因此我们先看如何将浮点运算上的矩阵转换为定点运算。

假设 r 1 r_1 r1 r 2 r_2 r2 是浮点实数上的两个 N × N N \times N N×N 的矩阵, r 3 r_3 r3 r 1 r_1 r1 r 2 r_2 r2 相乘后的矩阵:
r 3 i , k = ∑ j = 1 N r 1 i , j r 2 j , k (5) r_3^{i,k}=\sum_{j=1}^N r_1^{i,j}r_2^{j,k} \tag{5} r3i,k=j=1Nr1i,jr

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值