概述
越来越多的神经网络模型在部署的时候采用 8 位浮点数,感到有些好奇,所以粗略了解一下,聊聊这个话题。
1.浮点数的格式
先说说浮点数的表示方法。任意二进制数N可以写成 N = 2^e * M 的形式,其中 M 称为浮点数的尾数,是一个纯小数。e 是比例因子的指数,称为浮点数的指数,是一个整数。比例因子的基数 2 对二进记数制的机器是一个常数。
我们参照 IEEE R32.24 标准,看看 float32 的格式:
下面我们来看一个实际例子, 8.25 8.25 8.25 用十进制表示是 82.5 × 1 0 − 1 82.5 times 10^{-1} 82.5×10−1, 那么用二进制表示是多少呢?
8.25 → 1000.01 × 2 0 → 1.00001 × 2 3 8.25 to 1000.01times 2^0 to 1.00001 times 2^3 8.25→1000.01×20→1.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=224−1=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....
2. 谈谈 8 位浮点数
尽管这两年 8 位浮点数很受关注,可是我并没有搜到正式的国际标准,根据道听途说的资料,给出下面的格式,同时附上 8.25 的表示方法。如果谁发现更确切的标准,请给我留言。
如果按照上属格式,可以判断出,阶码取值范围是 -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] 后营马族子弟 : 浮点数在计算机中的表示方法
最后
以上就是清脆乐曲为你收集整理的聊聊 8 位浮点数的全部内容,希望文章能够帮你解决聊聊 8 位浮点数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复