目录
本文只讨论CMSIS-NN中所使用的tensorflow lite的8位量化规范,其他的量化方法,你也许可以查看以下的系列文章:
简介
tensorflow lite所规范的8位量化使用了如下的公式进行定点到浮点的转换:
perchannel或者perlayer的权重量化后定点值由int8补码表示,其中零点表示为0,其范围为[-127,127]。 perlayer的激活/输入由int8补码表示,范围为[-128,127],零点范围为[-128,127]。
规范要点
tensorflow lite规范了以下的量化约束来权衡在资源受限设备上的神经网络运行精度和性能:
优先考虑int8量化(虽然在之前的版本中,也有一些特定运算支持非对称uint8量化),但是实际上int8的非对称和uint8的非对称没什么区别,但使用int8的非对称在一些情况下也许可以方便替换为int8对称量化
通常,perchannel的量化是指在卷积权重的outputchannel上进行的
激活值使用int8非对称量化,而权重使用int8对称量化,偏置使用int32对称量化且其scale为 \(scale_i*scale_w\) ,激活值使用非对称是为了以相对廉价方式获得额外的精度,权重使用对称量化主要是可以减少一些权重零点与激活值相乘的额外开销
规范中,conv_2d和depthwise_conv_2d的权重和偏置配置perchannel量化, fc的权重和偏置配置perlayer量化,其余输入、输出均配置perlayer量化
规范中,限制了{avg_pool_2d, concat, maxpool_2d, reshape, resize_bilinear, space_to_depth, pad, gather, batch_to_space_nd, space_to_batch_nd, transpose, squeeze, max, min, slice}输入输出需要相同的zp和scale
规范中,限制了l2_norm和tanh的输出scale为1./128.,zp为0
规范中,限制了sigmoid和softmax的输出scale为1./256.,zp为-128
规范中,限制了log_softmax的输出scale为16./256.,zp为127
在CMSIS-NN平台的变更
在cmsis-nn平台,kernel也同样使用q7_t命名int8,q15_t命名int16的数据类型。量化使用power of two的scale,realvalue将被表示为 \(Q*2^-fl\) ,此时scaling操作将通过移位进行。不使用tensorflow lite规范的8位量化方案的原因是在一些Arm Cortex-M CPUs上可能没有专用浮点计算单元(fpu),为了避免在层之间需要进行的浮点反量化,另一个好处是我们可以使用更简单的激活函数查找表。
参考文档: