Q8BERT: Quantized 8Bit BERT

Q8BERT

Q8BERT这篇文章的思想是把所有的FC层和embedding层的权值都量化成了8bit,因为这些权值占据了全部权值的99%。所以可以达到4x的压缩效果,同时把精度损失降到了最低。同时如果有一个针对8位的通用矩阵乘做了优化的硬件,将量化的模型布置上去后能够加速模型的推理性能,同时表明本文只做了量化工作,没有做硬件的设计。

方法

使用的symmetric linear quantization和quantization-aware training方法。

对称线性量化(symmetric linear quantization)

使用symmetric linear quantization把weights和activations转化为8位整型。
在这里插入图片描述
其中:

  • Sx 是量化因子
  • ⌊ ⌉表示四舍五入到最近的整数
  • M = 2b-1 - 1
    • b表示量化后的位数,本文是8

对于weights的量化因子计算公式如下:
在这里插入图片描述
对于activations的量化因子计算公式如下:
在这里插入图片描述
采用了EMA(滑动平均)来对输入中的最大值计算得到

训练中引入量化(quantization aware training)

量化一般可以分为两种模式:训练后的量化(post training quantizated)和训练中引入量化(quantization aware training)。

训练后的量化理解起来比较简单,将训练后的模型中的权重由float32量化到int8,并以int8的形式保存,但是在实际inference时,还需要反量化为float类型进行计算。这种量化的方法在大模型上表现比较好,因为大模型的抗噪能力很强,但是在小模型上效果就很差。

训练中引入量化是指在训练的过程中引入fake quantized(伪量化)操作,伪量化是一种模拟浮点值中的舍入效果的操作。在前向传播时,采用伪量化后的权重和激活,但是在反向传播时仍是对float类型的权重做梯度更新;由于舍入操作没法求导,所以本文使用Straight-Through Estimator (STE)来估计fake quantized的导数:

在这里插入图片描述
xqx伪量化后的 结果,将fake quantized和STE结合在一起可以克服量化误差。

实现

本文的目标是将BERT模型中的FC层和embedding层的权值量化为8位。为了实现这个目标,在训练阶段Embedding层返回一个fake quantized embedding向量,然后量化的FC层执行fake quantized inputs和fake quantized weights的矩阵乘法;紧接着将结果与bias相加,bias会在随后被量化成32位int型整数。

在inference阶段,量化后的embedding层返回一个数据格式是int8的embedding向量,然后量化后的FC层执行数据格式是int8的通用矩阵乘再加到int32的bias上。虽然bias量化为32位,但是由于bias数量比较少,所以对于模型的压缩效果不会影响很大。

对于需要高精度的运算,比如Softmax, Layer Normalization and GELU,仍然是保持着float32的数据格式。

实验结果

为了表示本文提出的quantization aware training效果较好,作者把quantization aware traning的实验结果和BERT、Dynamic Quantization做对比。
Dynamic Quantization是一种训练后的量化(post training quantizated),他把weights和activations采用和quantization aware traning相同的量化方式,唯一不同的就是activations的量化因子计算公式与weights的量化因子计算公式一样。
在这里插入图片描述
上表第一列在表示实在是GLUE中的各种任务和SQuAD上完成的;第二列是实验结果的评价量度;第三列是BERT的结果;第四列是Quantization-Aware Training(QAT)的结果;第五列是Dynamically Quantized(DQ)的结果。

实验结果是五次实验取均值,括号里表示这五次的标准差,如果Dadaset这一列的任务后面没有加上-Large表示实验是在BERT-Base上完成,否则是在BERT-Large上完成。

在这里插入图片描述
上表是描述引入了量化以后的准去率的相对损失,是与BERT相比得出来的。综合试验结果可以得出QAT这种训练时引入量化的方法较好,可以在除RTE以外的任务上把准确率的相对损失降低到了不到1%,并且得到了4x的压缩比,而DQ这种训练后量化方法则准确率损失较大。

一些反思

本文的量化思想基本上全都是来自《Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference》这一篇文章,所以在量化方法上的叙述比较简要,直接把方法用在了BERT上。而最后做的对比实验,也就是把QAT和DQ做的对比,个人认为对于DQ的处理太简单粗暴了,就只是将一个训练好的BERT模型的FC层和Embedding层进行了简单的8位量化,没有太大的参考价值。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值