SNPE量化分析(2)

一、量化模式

其支持两种8bit定点的模式,主要区别在于量化参数的选择。
• 第一种方式,默认量化方式,即前面算法描述中提到的。特点是使用数据真实的最大最小来做量化,有一个最小区间阈值0.01,0要被精确表示(而且也会影响到对最大最小值的修正);
• 第二种方式,增强量化方式,给量化命令snpe-dlc-quantize传入use_enhanced_quantizer从而调用。该模式会计算出一组更好的量化参数,而且也要求最小范围range阈值为0.01,确保0被精确量化(类似默认量化方式)。但从表象上来说也有几点不同:
• 该方式选出的最大最小值,可能和默认量化方式的不同;
• 设置的range范围可能权重或者激活值并没不会出现在这个范围内;
• 更适用于具有长尾性质的权重或者激活值(如大多数权重位于-100到1000之间,但是有几一些值远远小于-100,大于1000)。在某些情况下,这种长尾值因为被忽略掉(比用真实最大最小计算量化范围的量化方式,如默认方式),有更好的分类精度。
但第二种方式的计算精度,在某些长尾情况下,比简单直接使用真实最大最小的情况要好。

二、量化影响

量化对模型对DSP是必不可少,因为DSP只能跑定点模型,而定点模型又会影响到精度,某些模型量化效果不好甚至出现错误结果。根据SNPE文档,评估量化模型的指标有:
1、Mean Average Precision
2、Top1误差:概率最高的类别不是真实类别;
3、Top5误差:真实类别不在概率前5类别中。

新卷积模块设计
因为int8精度低的问题,高通官方提出一种方法:A Quantization-Friendly Separable Convolution for MobileNets,一种新的MobileNet卷积核心模块。同时根据tensorflow的文档说明:
This is useful in making the networks ready for fixed-point inference. If you unbound the upper limit, you lose too many bits to the Q part of a Q.f number. Keeping the ReLUs bounded by 6 will let them take a max of 3 bits (upto 8) leaving 4/5 bits for .f this used to be called a “hard sigmoid” paper:Convolutional Deep Belief Networks on CIFAR-10
关于6 in relu6,有以下的解释:
Our ReLU units differ from those of [8] in two respects. First, we cap the units at 6, so our ReLU activation function is y = min(max(x, 0), 6).
In our tests, this encourages the model to learn sparse features earlier. In the formulation of [8], this is equivalent to imagining that each ReLU unit consists of only 6 replicated bias-shifted Bernoulli units, rather than an infinute amount. We will refer to ReLU units capped at n as ReLU-n units.
表明ReLU6是为定点推理设计的,通过限制上限让值域在[0, 6],2^3=8,则0-6占了7个,可以实现低bit模型量化,如无符号int2定点,或有符号int3。从下图其ReLU6的函数图像上,可以看出类似Sigmoid(x) = 1 / (1+e^(-x)),sigmoid函数图象是值域为(0, 1)的S型曲线,与ReLU6作为对照,ReLU6位于[0, 6)的输入区间是线性的,而输入大于等于6时的值域为6,因此也被称为Hard Sigomid。

也可以换个方式解释下:
普通relu, y=max(0, x), 相当于无限多个bernoulli分布,即无限多个骰子;
relu6, y= min(max(0,x), 6), 相当于有六个bernoulli分布,即6个硬币,同时抛出正面,这样鼓励网络学习到稀疏特征。
网络里面每一个输出n,相当于n个bernoulli分布的叠加。
通过实验发现,用6,效果比较好。所以选用了6

ReLU6:
首先说明一下ReLU6,卷积之后通常会接一个ReLU非线性激活,在Mobile v1里面使用ReLU6,ReLU6就是普通的ReLU但是限制最大输出值为6(对输出值做clip),这是为了在移动端设备float16的低精度的时候,也能有很好的数值分辨率,如果对ReLU的激活范围不加限制,输出范围为0到正无穷,如果激活值非常大,分布在一个很大的范围内,则低精度的float16无法很好地精确描述如此大范围的数值,带来精度损失。

参考github上ReLU6的正向计算实现:out[i] = min( max(x[i], 0)+negative_slope*min(x[i], 0), 6 ),relu6一般在低精度运算中使用,尤其移动端设备。和relu相比,relu6的输出被限制在了一个固定区间内。
ReLU6在训练阶段会早早地学到稀疏化特征,不知是针对当前这一层还是最后一层的feature map。对于提到的伯努利units这块,对原文翻译是:每个ReLU6单元只包含6个偏移贝努利单元,而不是一个无限量,我们将RELU单元称为RELU-N单元,上限为N。同时伯努利单元可以理解为:
relu(x) = max(0, x),而relu6(x) = min(max(0, x), 6),与relu不同的relu6并非上界是无限量,而是上界限定为6,因为Bernoulli units 是 0-1分布,那么6 replicated bias-shifted Bernoulli units 就是 min(max(0, x), 1) + min(max(1, x), 2) + … + min(max(5, x), 6) 。
6个函数的叠加(6 replicated),每个函数的上下界差1,而下界不再为0,所以称为bias-shifted。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值