聊聊 8 位浮点数

越来越多的神经网络模型在部署的时候采用 8 位浮点数,感到有些好奇,所以粗略了解一下,聊聊这个话题。

1.浮点数的格式

先说说浮点数的表示方法。任意二进制数N可以写成 N = 2^e * M 的形式,其中 M 称为浮点数的尾数,是一个纯小数。e 是比例因子的指数,称为浮点数的指数,是一个整数。比例因子的基数 2 对二进记数制的机器是一个常数。

我们参照 IEEE R32.24 标准,看看 float32 的格式:

聊聊 8 位浮点数_第1张图片

下面我们来看一个实际例子, 8.25 8.25 8.25 用十进制表示是 82.5 × 1 0 − 1 82.5 \times 10^{-1} 82.5×101, 那么用二进制表示是多少呢?

8.25 → 1000.01 × 2 0 → 1.00001 × 2 3 8.25 \to 1000.01\times 2^0 \to 1.00001 \times 2^3 8.251000.01×201.00001×23

那么好啊,既然所有的二进制都可以表示成1.xxx * 2^xxx,那么小数点前面的肯定都是1了所以在存储到内存的时候默认都是1.xxx就好了,也没必要在内存中存储1这个bit了所以23bit的尾数部分,可以表示的精度却变成了24bit,道理就是在这里。

那24bit能精确到十进制小数点后几位呢?实际上我们看有效位数就行了。24位二进制数的最大值是:
m a x 24 = 2 24 − 1 = 16777215 max_{24}=2^{24}-1=16777215 max24=2241=16777215
因此,它的十进制位数是:
d i g i t s 10 = [ l o g 10 ( m a x 24 ) ] + 1 = [ 7.224... ] + 1 = 8 digits_{10}=[log_{10}(max_{24})]+1=[7.224...]+1=8 digits10=[log10(max24)]+1=[7.224...]+1=8

因此,float32 最多有 8 位有效数字,因为可能有些 8 位数字超出了表示范围,因此它可以确保 7 位有效数字。

对于指数部分,因为指数可正可负,8位的指数位能表示的指数范围就应该为:-127-128了,所以指数部分的存储采用移位存储,存储的数据为原数据+127,下面就看看8.25在内存中真正的存储方式。

这样的话我们得到 8.25 的 float32 表示方法:

符号位 = 0
阶码 = 127 + 3 = 130
尾数 = 00001000....

聊聊 8 位浮点数_第2张图片

2. 谈谈 8 位浮点数

尽管这两年 8 位浮点数很受关注,可是我并没有搜到正式的国际标准,根据道听途说的资料,给出下面的格式,同时附上 8.25 的表示方法。如果谁发现更确切的标准,请给我留言。
聊聊 8 位浮点数_第3张图片

如果按照上属格式,可以判断出,阶码取值范围是 -3 ~ +4,有效数字位数为
d i g i t s = [ l o g 10 15 ] + 1 = [ 1.176... ] + 1 = 2 digits = [log_{10}15]+1=[1.176...]+1=2 digits=[log1015]+1=[1.176...]+1=2
即1~2位有效数字。

3. 低精度浮点数的哲学思考

低精度浮点数在神经网络模型中大行其道,只有一个原因——人脑神经元之间的信号传递也是低精度的。

我记得有位大牛曾经总结过计算机和人脑的区别:计算机是由一大堆可靠工作的小零件组成的一个不可靠的整体,人脑是一大堆不可靠的小神经元组成的可靠的整体。其实,数字电路意味着精确、可靠,但同时数字电路也极其脆弱。以数字电路为核心的工业体系实质上是图灵机、布尔代数、冯诺依曼体系的具体实现,是人工智能领域所谓的符号学派的产物。

神经网络技术则是人工智能领域联结主义学派的产物。它并不需要精确的神经元来做基础,因此,数字电路并不适合作为神经网络技术的基础。未来,非冯诺依曼架构的计算机体系会受到神经网络理论深刻的影响。就此而论,我看好量子计算、DNA生物计算和忆阻计算这三大硬件体系,直觉认为,忆阻技术为基础的模拟计算机体系可能是近期能够实现的技术。


参考文献

[1] demon_倔强青铜: 浮点数的表示方法
[2] 后营马族子弟 : 浮点数在计算机中的表示方法

你可能感兴趣的:(神经网络,人工智能,机器学习)