赞
踩
数据类型的选择决定了所需的计算资源的数量,从而影响模型的速度和效率。在深度学习应用中,平衡精度和计算性能成为一项至关重要的练习,因为更高的精度通常意味着更大的计算需求。
在各种数据类型中,浮点数主要用于深度学习,因为它们能够以高精度表示各种值。通常,浮点数使用n位来存储数值。这些n位进一步分为三个不同的组成部分:
这种设计允许浮点数以不同的精度级别覆盖广泛的值。用于这种表示的公式是:
( − 1 ) sign × base exponent × significand \color{red}{(-1)^{\text{sign}} \times \text{base}^{\text{exponent}} \times \text{significand}} (−1)sign×baseexponent×significand
为了更好地理解这一点,让我们深入研究深度学习中一些最常用的数据类型:float32 (FP32)、float16 (FP16) 和 bfloat16 (BF16):
首先了解一下IEEE754制32位浮点数的存储方式
一个由IEEE745制的32位浮点数由三部分组成
组成部分 | 位数 | 含义 |
---|---|---|
符号位 | 1位 | 0为正,1为负 |
指数位 | 2~9位 | 类比十进制的科学计数法,此处以2为底,指数位为幂。注意还需要加上127的偏移量 |
尾数位 | 10~32位 | 省略了1. 实际为1.(尾数位),类似小数的二进制写法 |
核心逻辑:
I E E E 制浮点数 ⇒ 浮点数的二进制表示 ⇒ 浮点数的十进制表示 IEEE制浮点数⇒浮点数的二进制表示⇒浮点数的十进制表示 IEEE制浮点数⇒浮点数的二进制表示⇒浮点数的十进制表示
我们用例子来帮助理解,
我们有一个用IEEE754二进制表示的32位浮点数:
0 1000 0000 1001 0010 0001 1111 1011 011
求它所代表的十进制浮点数是多少?
第一步:
符号位为
0
⇛
正数
0⇛正数
0⇛正数
第二步:
尾数部分: 1.1001 0010 0001 1111 1011 011
如果结尾处是多个0,则将多余的0舍去
第三步:
指数位:
(
10000000
)
2
=
(
128
)
10
(10000000)_2=(128)_{10}
(10000000)2=(128)10
减去偏移量:128+(-127)=1
第四步:组合:
根据
(
−
1
)
sign
×
base
exponent
×
significand
\color{red}{(-1)^{\text{sign}} \times \text{base}^{\text{exponent}} \times \text{significand}}
(−1)sign×baseexponent×significand,计算得:
( − 1 ) 0 × 2 1 × 1. 10010010000111111011011 = 11.0010010000111111011011 (-1)^0\times 2^1 \times 1.\color{#F784EB}{1001 0010 0001 1111 1011 011}\color{black}{=11.001 0010 0001 1111 1011 011} (−1)0×21×1.10010010000111111011011=11.0010010000111111011011
至此已将IEEE制浮点转换为浮点数的二进制表示
最后再将 11.0010 0100 0011 1111 0110 11 11.0010\quad0100\quad0011\quad1111\quad0110\quad11 11.0010010000111111011011 转换为十进制:
1 × 2 1 2 + 1 × 2 0 1 + 0 × 2 − 1 0 + 0 × 2 − 2 0 + 1 × 2 − 3 0.125 + 0 × 2 − 4 0.0625 + 0 × 2 − 5 0 + 1 × 2 − 6 0.015625 + 0 × 2 − 7 0 + 0 × 2 − 8 0 + 0 × 2 − 9 0 + 0 × 2 − 10 0 + 1 × 2 − 11 0.00048828125 + 1 × 2 − 12 0.000244140625 + 1 × 2 − 13 0.0001220703125 + 1 × 2 − 14 0.00006103515625 + 1 × 2 − 15 0.000030517578125 + 1 × 2 − 16 0.0000152587890625 + 0 × 2 − 17 0 + 1 × 2 − 18 0.000003814697265625 + 1 × 2 − 19 0.0000019073486328125 + 0 × 2 − 20 0 + 1 × 2 − 21 + 1 × 2 − 22 = 3.1415927410125732 1×212+1×201+0×2−10+0×2−20+1×2−30.125+0×2−40.0625+0×2−50+1×2−60.015625+0×2−70+0×2−80+0×2−90+0×2−100+1×2−110.00048828125+1×2−120.000244140625+1×2−130.0001220703125+1×2−140.00006103515625+1×2−150.000030517578125+1×2−160.0000152587890625+0×2−170+1×2−180.000003814697265625+1×2−190.0000019073486328125+0×2−200+1×2−21+1×2−22=3.1415927410125732 1×21+1×20+0×2−1+0×2−2+1×2−3+0×2−4+0×2−5+1×2−6+0×2−7+0×2−8+0×2−9+0×2−10+1×2−11+1×2−12+1×2−13+1×2−14+1×2−15+1×2−16+0×2−17+1×2−18+1×2−19+0×2−20+1×2−21+1×2−22=21000.1250.062500.01562500000.000488281250.0002441406250.00012207031250.000061035156250.0000305175781250.000015258789062500.0000038146972656250.000001907348632812503.1415927410125732
我们有一个用IEEE754二进制表示的32位浮点数:
0 1000 0011 0100 1000 0000 0000 0000 000
求它所代表的十进制浮点数是多少?
第一步:
符号位为
0
⇛
正数
0⇛正数
0⇛正数
第二步:
尾数部分: 1.0100 1000 0000 0000 0000 000
将多余0舍去得
1.0100 1
第三步:
指数位:
(
10000011
)
2
=
(
131
)
10
(1000 0011)_2=(131)_{10}
(10000011)2=(131)10
减去偏移量:131+(-127)=4
第四步:组合:
1.01001 × 2 4 = 10100.1 1.01001\times2^4=10100.1 1.01001×24=10100.1
至此已将IEEE制浮点转换为浮点数的二进制表示
最后再将 10100.1 10100.1 10100.1 转换为十进制:
1 × 2 4 16 + 0 × 2 3 0 + 1 × 2 2 4 + 0 × 2 1 0 + 0 × 2 0 0 + 1 × 2 − 1 0.5 = 20.5 1×2416+0×230+1×224+0×210+0×200+1×2−10.5=20.5 1×24+0×23+1×22+0×21+0×20+1×2−1=1604000.520.5
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。