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的导数:
xq 是x伪量化后的 结果,将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位量化,没有太大的参考价值。
Q8BERT: Quantized 8Bit BERT相关推荐
- 15篇论文全面概览BERT压缩方法
作者 | Mitchell A. Gordon 译者 | 孙薇 出品 | AI科技大本营(ID:rgznai100) 模型压缩可减少受训神经网络的冗余--由于几乎没有BERT或者BERT-Large模 ...
- 软硬兼施极限轻量BERT!能比ALBERT再轻13倍?!
点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达文 | Sheryc_王苏 源 | 夕小瑶的卖萌屋 这个世界上有两种极具难度的工程:第一 ...
- 【BERT】BERT模型压缩技术概览
由于BERT参数众多,模型庞大,推理速度较慢,在一些实时性要求较高.计算资源受限的场景,其应用会受到限制.因此,讨论如何在不过多的损失BERT性能的条件下,对BERT进行模型压缩,是一个非常有现实意义 ...
- 预训练模型参数量越来越大?这里有你需要的BERT推理加速技术指南
©作者 | 徐超 单位 | 微软亚洲互联网工程院 研究方向 | 文本相关性.多语言扩展 基于 Transformer 的预训练模型,尤其是 BERT,给各种 NLP 任务的 performance 带 ...
- EdgeBERT:极限压缩,比ALBERT再轻13倍!树莓派上跑BERT的日子要来了?
文 | Sheryc_王苏 本文首发于NLP宝藏公号[夕小瑶的卖萌屋],疯狂暗示! 这个世界上有两种极具难度的工程:第一种是把很平常的东西做到最大,例如把语言模型扩大成能够写诗写文写代码的GPT-3: ...
- 李宏毅DLHLP.18.BERT and its family.2/2.ELMo,BERT,GPT,XLNet,MASS,BART,UniLM,ELECTRA
文章目录 介绍 How to pre-train Context Vector (CoVe) Self-supervised Learning Predict Next Token Predict N ...
- ICLR 2022|唯快不破!面向极限压缩的全二值化BiBERT
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者 秦浩桐 量子位 转载 | 公众号 QbitAI 近年来,预训练 ...
- 预训练语言模型论文分类整理:综述、基准数据集、PLM的设计和分析
©作者 | 王晓磊 学校 | 中国人民大学博士生 研究方向 | 对话系统 1. 引言 近年来,以 BERT 和 GPT 系列为代表的大规模预训练语言模型(Pre-trained Language Mo ...
- 预训练语言模型论文分类整理
© 作者|王晓磊 机构|中国人民大学高瓴人工智能学院博士生 导师|赵鑫教授 研究方向 | 对话系统 1. 引言 近年来,以 BERT 和 GPT 系列为代表的大规模预训练语言模型(Pre-traine ...
最新文章
- 什么是闭包,我的理解
- 布线须知:机柜在数据中心机房的三个新用途
- NanoPi NEO Air使用三:OverlayFS、CPU温度和频率、wifi、蓝牙、npi-config
- 编程入门:C语言基础知识全网超全不用到处找了!
- java 中断代码_你的java代码可中断吗?(2)
- 计算机中丢失dinput8,修复dnfdinput8.dll
- WCF 第十二章 对等网 System.Net.PeerToPeer.Collaboration
- HDU2072 tri树/map/set/字符串hash
- ibatis简例1-用ibator插件自动生成sqlmap
- kaggle谷歌商店预测竞赛
- [Matlab科学绘图] Matlab画图常用函数和命令
- ffmpeg(七)合并音视频文件
- getResource和getResourceAsStream
- linuxptp分析
- 集团企业邮箱申请哪家的好,怎么选择?
- 啤酒和饮料,切面条(python)
- 省市区镇(可以选四级)联动点击自动展开下一级
- Spring Boot缓存实战 Redis
- 贪心算法 003:Tian Ji -- The Horse Racing
- [C语言]程序改错题。爱因斯坦曾出过这样的一道数学题:有一条长阶梯,若每步跨2阶,最后剩下1阶;若每步跨3阶,最后剩下2阶;若每步跨5阶,最后剩下4阶;若每步跨6阶,最后剩下5阶;只有每步跨7阶...