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位量化,没有太大的参考价值。

Q8BERT: Quantized 8Bit BERT相关推荐

  1. 15篇论文全面概览BERT压缩方法

    作者 | Mitchell A. Gordon 译者 | 孙薇 出品 | AI科技大本营(ID:rgznai100) 模型压缩可减少受训神经网络的冗余--由于几乎没有BERT或者BERT-Large模 ...

  2. 软硬兼施极限轻量BERT!能比ALBERT再轻13倍?!

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达文 | Sheryc_王苏 源 | 夕小瑶的卖萌屋 这个世界上有两种极具难度的工程:第一 ...

  3. 【BERT】BERT模型压缩技术概览

    由于BERT参数众多,模型庞大,推理速度较慢,在一些实时性要求较高.计算资源受限的场景,其应用会受到限制.因此,讨论如何在不过多的损失BERT性能的条件下,对BERT进行模型压缩,是一个非常有现实意义 ...

  4. 预训练模型参数量越来越大?这里有你需要的BERT推理加速技术指南

    ©作者 | 徐超 单位 | 微软亚洲互联网工程院 研究方向 | 文本相关性.多语言扩展 基于 Transformer 的预训练模型,尤其是 BERT,给各种 NLP 任务的 performance 带 ...

  5. EdgeBERT:极限压缩,比ALBERT再轻13倍!树莓派上跑BERT的日子要来了?

    文 | Sheryc_王苏 本文首发于NLP宝藏公号[夕小瑶的卖萌屋],疯狂暗示! 这个世界上有两种极具难度的工程:第一种是把很平常的东西做到最大,例如把语言模型扩大成能够写诗写文写代码的GPT-3: ...

  6. 李宏毅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 ...

  7. ICLR 2022|唯快不破!面向极限压缩的全二值化BiBERT

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者 秦浩桐 量子位 转载 | 公众号 QbitAI 近年来,预训练 ...

  8. 预训练语言模型论文分类整理:综述、基准数据集、PLM的设计和分析

    ©作者 | 王晓磊 学校 | 中国人民大学博士生 研究方向 | 对话系统 1. 引言 近年来,以 BERT 和 GPT 系列为代表的大规模预训练语言模型(Pre-trained Language Mo ...

  9. 预训练语言模型论文分类整理

    © 作者|王晓磊 机构|中国人民大学高瓴人工智能学院博士生 导师|赵鑫教授 研究方向 | 对话系统 1. 引言 近年来,以 BERT 和 GPT 系列为代表的大规模预训练语言模型(Pre-traine ...

最新文章

  1. 什么是闭包,我的理解
  2. 布线须知:机柜在数据中心机房的三个新用途
  3. NanoPi NEO Air使用三:OverlayFS、CPU温度和频率、wifi、蓝牙、npi-config
  4. 编程入门:C语言基础知识全网超全不用到处找了!
  5. java 中断代码_你的java代码可中断吗?(2)
  6. 计算机中丢失dinput8,修复dnfdinput8.dll
  7. WCF 第十二章 对等网 System.Net.PeerToPeer.Collaboration
  8. HDU2072 tri树/map/set/字符串hash
  9. ibatis简例1-用ibator插件自动生成sqlmap
  10. kaggle谷歌商店预测竞赛
  11. [Matlab科学绘图] Matlab画图常用函数和命令
  12. ffmpeg(七)合并音视频文件
  13. getResource和getResourceAsStream
  14. linuxptp分析
  15. 集团企业邮箱申请哪家的好,怎么选择?
  16. 啤酒和饮料,切面条(python)
  17. 省市区镇(可以选四级)联动点击自动展开下一级
  18. Spring Boot缓存实战 Redis
  19. 贪心算法 003:Tian Ji -- The Horse Racing
  20. [C语言]程序改错题。爱因斯坦曾出过这样的一道数学题:有一条长阶梯,若每步跨2阶,最后剩下1阶;若每步跨3阶,最后剩下2阶;若每步跨5阶,最后剩下4阶;若每步跨6阶,最后剩下5阶;只有每步跨7阶...

热门文章

  1. python开发ps插件_Python实现PS滤镜中的USM锐化效果
  2. 不知道该说什么,也不知道该做什么,只觉得很多事情等着去做
  3. MySql的DDL和DML和DQL的基本语法
  4. 七段S形速度曲线轨迹规划
  5. 数据结构中集合运算(c++类实现class)交集并集差集子集包含判断
  6. 电子皮带秤称重传感器电阻如何测量好坏判断
  7. Wordpress站点进阶1——简单的类微信排版导入
  8. Linux下hdparm硬盘测速
  9. JavaScript拳皇特效(图片自己找哦)
  10. APS在印刷行业的应用前景和应用效益