深度学习是否需要全部float 32类型

1. 是否需要全部float32

从硬件实现的角度来看,8位乘法器与32位相比功耗位1/18,面积位1/27,速度则为4倍,能更多的使用低位宽的数据类型当然更好。现在很多科学计算、深度学习中常常采用的是float32类型,但是深度学习是否全部都需要是float 32类型?

答案是否定的,并不需要

有人可能会担心,说如果改用更低位宽的数据类型是否会导致精度降低,理论上来说是会降低精度,但是这个精度有时候可能在我们可以接受的范围内。如下图所示是一个识别手写数字的二维可视化图,可以看的不同类别之间存在一定的间距,这些“大间距”也就意味着可以接受一定的非精确计算

深度学习是否需要全部float 32类型_第1张图片

 

2. 如何设计低位宽

在深度学习计算中,不同的数据对于位宽的需求是不同的,以前都用32位浮点,但是每一层数据到底用什么样的位宽才合适?

以AlexNet网络为例,如下图所示。比如AlexNet_Conv1,数据分布比较平缓(如红色线条),用8位定点即可,但是对于分布较为陡峭的AlexNet_fc0需要使用32位。:

深度学习是否需要全部float 32类型_第2张图片

 

到底如何设计位宽?

如果有一层数据分布用32位浮点表示出来的结果和8位定点一样那么使用8位定点即可,和4位一样那就使用4位。所以每一层位宽的设计,需要找到使得32位分布不变的最低位宽

总结规律:

        每层数据都有其保持网络收敛的最低位宽需求;

        每层数据的位宽需求与数据分布之间存在关系

3. 实验结果

CNN网络,分类、检测、分割任务下的低位宽训练:

如下表所示,其实神经元和权值自适应8bit,梯度8、16bit都有,最终结论是更新低位宽后和float32相比精度基本没有损失(float32 Acc和Adaptive Acc两列对比)。

深度学习是否需要全部float 32类型_第3张图片

 

你可能感兴趣的:(深度学习,深度学习)