一, 转化流程
要将浮点数转换为定点数,需要执行以下步骤:
- 选择定点数表示方式: 定点数通常表示为整数和小数部分的组合,决定小数部分的位数。例如,16位定点数可以有8位整数部分和8位小数部分。
- 确定定点数的分辨率: 分辨率是指小数部分可以表示的最小单位。例如,如果使用8位小数部分,则分辨率是1/256=0.00390625。
- 计算缩放因子: 缩放因子用于将浮点数转换为定点数表示的整数。缩放因子是小数部分的最大值。例如,若小数部分有8位,缩放因子为2^8=256 。
- 缩放浮点数: 将浮点数乘以缩放因子。例如,若浮点数为 ,缩放因子为256,则计算结果为 1.5*256=384。
- 转换为整数: 将缩放后的值舍入或截取为整数。例如,384可以直接表示为整数。
- 定点表示: 如果定点数使用带符号表示,例如16位中的1位为符号位,7位为整数位,8位为小数位,则转换后的数字384需要转换为二进制形式并适当加入符号位。
二,示例
假设我们将浮点数7.6转换为定点数,定点数定义为8位(1位符号位,4位整数位,3位小数位):
浮点数: 1
分辨率: 1/16
缩放因子: 16
缩放浮点数: 7.6*16=122
转换为整数: 122
转换为二进制(假设带符号): 122的二进制表示为01111010。
最终结果是将浮点数7.6表示为定点数122(011111010),通过上面步骤实现浮点数到定点数的转换。
三,验证
符号位 : 0(正数)。
整数部分: 111(二进制)表示为 7(十进制),占用 3 位。
小数部分: 1010(二进制)表示为 0.625(十进制),占用 4 位。
最终定点数表示如下:
为了确定转换的正确性,将定点数01111010转回浮点数:
结果为 7.625,可以认为是进行舍入后的近似值,因此验证通过。
四,原理和理解
本质上是将将非离散值量化到离散值空间,所以浮点转定点也叫浮点量化,是一种神经网络优化方法,一来减少内存需求,而来提高读取和处理的效率。
五,浮点相乘转换为定点相乘
假设两个浮点数为 3.4 和 2.75
1. 步骤 1:定义定点数格式
采用8位定点数表示,格式如下:
1位符号位
3位整数位
4位小数位
2. 步骤 2:量化浮点数
首先,我们需要将浮点数量化为定点数。由于小数部分有4位,所以缩放因子S为16。
量化 3.4:
3.4×16=54.4;
舍入:54 (转化为整数)
54 D = 00110110 b
理解:
如果存在一个8位定点数A能无损表示3.4,那么A×16为整数且A×16===3.4,但是因为不存在,所以将54.4舍入为54(四舍五入)只是为了找到一个最近的8位定点数
量化 2.75:
2.75×16=44
无需舍入:44 (转化为整数)
44 D = 00101100 b
3. 步骤 3:用定点数相乘
量化后的两个数值为54和44。定点数相乘时,原始乘积应包含更多的位数以避免溢出。所以保持乘积并在之后进行适当缩放。
54×44=2376
4. 步骤 4:适当缩放积
由于我们使用了16(2^4)进行缩放,结果则有16 * 16 = 256 的缩放因子。因此需要将结果缩小至原来的数量级。
2376/256=9.28125
验证
实际的浮点数乘积计算:
3.4*2.75=9.35
对比与分析
量化后乘积9.28125和实际乘积 9.35之间存在一定的误差,这是由于用定点数表示及其舍入造成的。然而,通过量化再进行相乘,可以节省计算资源,并在定点数表示中保持尽可能的精度。
六,感悟
浮点数量化,实质上就是对不便于硬件计算的浮点数,通过缩放的方式,转换成便于计算的定点数。
类比
当我们计算
> 0.002 * 2000
时,对于幼儿园来讲,这个计算可能有些复杂,但是我们对其进行转化变成
> 2*(0.001)* 2 *(1000)
时,就可以便于计算,其中0.001和1000就是缩放因子,当这个转换过程被套用到浮点转换成定点时(连续到离散)就被称为浮点数量化。