量化到低于16bit的神经网络已经很常见了,浮点数据类型主要有float16和double32,8bit以下的数据类型表示在程序中是怎么进行的一直很疑惑。
从github中找到的代码中,量化函数的完成方式为:
//真正起作用的量化函数
class Quantizer(Function):
@staticmethod
def forward(ctx, input, nbit):
scale = 2 ** nbit - 1
return torch.round(input * scale) / scale
@staticmethod
def backward(ctx, grad_output):
return grad_output, None
可以看到,代码使用的是STE量化,量化位宽决定了scale的大小,而scale的大小决定了有效数字的位数,从数学角度来看,确实是实现了低bit量化。
但是,此处返回的量化值很明显还是float类型的,所以并没有真正在存储层面实现定点低bit量化。
不过在FPGA中,本身就有低位宽的表示方式:
ap_int<4>
在存储时,可以考虑将scale乘回weight和activation,将它们转换为字符串存储即可实现低bit的存储。
[1] https://github.com/coldlarry/YOLOv3-complete-pruning
[2] Zhou, Shuchang, et al. “Dorefa-net: Training low bitwidth convolutional neural networks with low bitwidth gradients.” arXiv preprint arXiv:1606.06160 (2016).