在 BitNet.cpp 中,采用三进制表示是将模型参数表示为 {-1, 0, 1} 这三种状态。它并非传统意义上像十进制或二进制那样,每三个比特就进位到下一级。这里的三进制主要是指参数取值只有三种可能,不是基于位运算的常规三进制计数方式。
每个参数用 1.58 位来表示,是因为在信息论中,当对参数进行量化为 {-1, 0, 1} 三值时,根据香农熵的计算,平均每个参数所需要的信息量约为 1.58 位。简单来说,就是通过这种量化方式,平均每个参数能够用 1.58 位的信息来进行有效表示,从而实现模型的压缩和高效计算,这是一种对存储和计算资源进行优化的方式,并非是真正存在小数位的比特,也不是变长表示。
BF16 是 16 位浮点数格式,它用 16 个比特来表示一个浮点数,能够表示的数值范围和精度是确定的。而 BitNet.cpp 的 1.58 位量化是一种特殊的量化策略,通过将参数限制在 {-1, 0, 1},并利用特定的量化函数和架构设计,在大大减少存储和计算需求的同时,尽可能保持模型的精度和性能,与 BF16 这种常规的浮点数表示方式有很大的不同。