作者:Sheng Shen, Zhen Dong, Jiayu Ye, Linjian Ma, Zhewei Yao, Amir Gholami, Michael W. Mahoney, Kurt Keutzer
发表单位:University of California at Berkeley 加州大学伯克利分校
会议:AAAI 2020
发表时间:2019.9.25
该论文对基于 BERT 的模型执行超低精度量化,旨在最小化性能下降幅度,同时保持硬件效率。
微调后的 BERT_BASE 模型包含三部分:
嵌入层 91MB、编码器325MB、输出层 0.01MB
由于输出层的规模极小,该研究并未对这部分执行量化。因此,本文研究用不同方式对嵌入和编码器参数执行量化。
前作:HAWQ: Hessian AWare Quantization of Neural Networks with Mixed-Precision
混合精度主要针对weight参数,本文activation的bit位宽统一设置为8bit,
确定每层的bit-width:
首先,计算每层参数hessian矩阵的最大特征值,流程如下:
其次,输入一些训练数据,统计输入不同数据训练时的最大特征值的均值。另外,针对NLP任务需要加入方差完善统计信息。
特征值越大说明对量化越敏感,需要分配越高的bit-width,特征值越小说明对量化越不敏感,扰动对应的loss lanscape越平滑,分配更少的bit-width即可。
对于NLP任务不同输入数据的最大特征值的方差很大,仅依靠均值并不好,所以加入了方差来进一步完善统计信息,利用了10%的训练数据来进行统计。
假设输入序列中有 n 个词,每个词有一个 d 维嵌入向量(BERT_BASE 中 d = 768)。在 Transformer 编码器中,每一个自注意力头(self-attention)具备 4 个密集矩阵,每个自注意力头按一下公式计算加权和:
直接使用相同的量化策略来量化不同Head中这四个矩阵,精度会下降很多!
组量化机制:
将多头自注意力(MHSA)的密集矩阵中每个head矩阵W看作一个组。例如,12个head一共有 12 组。在每个组中,将多个顺序输出weight看作一个子组,每个子组具备自己的量化范围。
本文采取每
d
/
(
2
∗
N
h
)
d/(2*N_h)
d/(2∗Nh)个连续一组,其中d是embedding长度,
N
h
N_h
Nh是head个数。
对比模型:
除了baseline模型之外的所有模型都是用8位激活,直接量化的Q-BERT未使用混合精度或组量化。
注释:
- w-bits:权重量化
- e-bits:嵌入量化
- size-w/o-e:以MB为单位非嵌入层的模型大小
总结:Q-BERT 达到了 13 倍的权重压缩率,模型大小仅位原来的1/8,且准确率损失在 2.3% 以内。
Q-BERT组量化对三种任务的影响。所有任务的权重量化位设为4,嵌入量化位设为8,激活量化位设为8。
增加组的数量,查看对模型精度的影响:
结果:
启示:最好不要设置太大的组数
因为这样会增加每个矩阵乘法所需的查找表(lut)的数量。这可能会对硬件性能产生不利影响,根据我们的结果,精确度方面的回报正在减少。这也是为什么本文其他实验都采用128组量化。
如上图所示:
注:4/8表示 4bit单词嵌入和8bit位置嵌入。
在性能下降约0.5%的情况下,嵌入表大小可以减少到11.6MB。
使用注意力信息进行定性分析Q-BERT与DirectQ差异:
计算了量化的BERT和全精度BERT对相同输入的注意力信息的分布之间的Kullback-Leibler (KL)散度。
KL分布是用来衡量2个数据分布的距离的, KL散度越小,说明两种模型的多头注意力输出越接近。
如上图所示:Q-BERT与Baseline的距离远小于DirectQ与Baseline的距离
这个内容可以查看实验三部分,嵌入层与权重及自注意力层与全连接层的量化敏感度。
HAWQ团队的工作都可以多看看,好像都有开源出来!