BFloat16精度

Brain Floating 16

Bfloat16是由Google Brain开发的数据格式 [1]。如今在很多AI处理中得到应用,比如Nervana NNP-L1000,Xeon processors (AVX-512 BF16 extensions) 以及Intel FPGAs,Google Cloud TPUs,[9][10]和TensorFlow。ARMv8.6-A,AMD ROCm和CUDA也同样支持bfloat16数据精度。在训练时,可以使用混合加速,即使用FP16/BF16做乘法以及存储,使用FP32做加法。

引入BF16的原因 [2]

  • 提高了16bit数值的dynamic range(5->8)
  • 硬件乘法器的面积(晶体管数量)大致与mentissa数据宽度的平方成正比,因此,mentisa由10降低为7之后,乘法器的面积减少约50%

以下复习一下FP16/32并于BF16作比较。

typesign bitexponent bitfraction/mentissa bit
FP161510
FP321823
BF16187

FP16的计算方法
v a l u e F P 16 = ( − 1 ) s i g n × 2 ( e x p o n e n t − 15 ) × ( 1 + f r a c t i o n 1024 ) value_{FP16} = (-1)^{sign}\times 2^{(exponent-15)}\times (1+\frac{fraction}{1024}) valueFP16=(1)sign×2(exponent15)×(1+1024fraction)
BF16的计算方法
v a l u e B F 16 = ( − 1 ) s i g n × 2 ( e x p o n e n t − 127 ) × ( 1 + f r a c t i o n 128 ) value_{BF16} = (-1)^{sign}\times 2^{(exponent-127)}\times (1+\frac{fraction}{128}) valueBF16=(1)sign×2(exponent127)×(1+128fraction)

两个特例

  • 当exponent全为0时,BF16浮点数值得计算方法改为
    v a l u e = ( − 1 ) s i g n × 2 ( e x p o n e n t − 126 ) × ( 0 + f r a c t i o n 128 ) value = (-1)^{sign}\times 2^{(exponent-126)}\times (0+\frac{fraction}{128}) value=(1)sign×2(exponent126)×(0+128fraction)
  • 当exponent全为1时,
    (a) 当fraction全为0时,BF16表示+inf或者-inf
    (b) 当fraction不全为0时,表示NaN

Denormalized Number

此处还有一个normal number和subnormal (denormalized) number的概念。引入denormalized数的原因:

  • 是用来表示数值0,因为normal数的表示方式里是用1+fraction部分,这样就无法表达0,因此在exponent全部为0的特例中,使用了0+fraction的方式。但是这种情况会产生+0和-0两种数值0的表达方式
  • 另一个功能是表示非常接近于0的数,可能的数值分布均匀的接近0.0
    dfdf
    denormalized数的精确度要比normalized数更高。因此,可以避免非常小的数值被认为是0的情况发生。但是从硬件角度出发,denormalized需要额外的硬件支持(或者软件支持)。因为处理denormalized数的效率比较低。

其他

Facebook对于深度学习的数值表示精度也有一篇文章《Rethinking floating point for deep learning》。感兴趣的读者可以去了解一下。

参考文献

[1] Abadi, Martín; Barham, Paul; Chen, Jianmin; Chen, Zhifeng; Davis, Andy; Dean, Jeffrey; Devin, Matthieu; Ghemawat, Sanjay; Irving, Geoffrey; Isard, Michael; Kudlur, Manjunath; Levenberg, Josh; Monga, Rajat; Moore, Sherry; Murray, Derek G.; Steiner, Benoit; Tucker, Paul; Vasudevan, Vijay; Warden, Pete; Wicke, Martin; Yu, Yuan; Zheng, Xiaoqiang (2016). “TensorFlow: A System for Large-Scale Machine Learning” (PDF). arXiv:1605.08695.
[2] BFloat16: The secret to high performance on Cloud TPUs
[3] 你应该知道的浮点数基础知识

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值