量化感知训练_一文速览EMNLP 2020中的Transformer量化论文
花了几天看了三篇EMNLP 2020中关于Transformer模型量化的相关论文,快速记一下要点。
Fully Quantized Transformer for Machine Translation
这篇是华为诺亚方舟实验室和蒙特利尔大学合作的,发表在findings上面。
「论文地址:」 https://www.aclweb.org/anthology/2020.findings-emnlp.1.pdf
方法
针对Transformer结构的计算密集型算子进行了activation量化,除了bias以外的所有weight进行了量化,这一点其实我们组也都做过了。
采用的是量化感知训练(QAT),反向传播采用的是straight-through estimator。
考虑到每个channel的分布有差异,因此针对每个channel单独学习量化的scale参数。
零值的处理:padding无需考虑,反正会被mask掉。ReLU和attention softmax之后的量化强制定义量化下界为0。量化全部加在dropout之前。
剪枝采用结构化剪枝,因为稀疏性剪枝需要硬件或库支持,比较麻烦。这里只对FFN参数进行剪枝,而且不是采用传统的百分比阈值,而是根据ReLU之后值计算出第一层FFN输出的每一列的max值,根据max值是否超过一定阈值来剪枝,这个阈值设定为所有列max值的方差乘上一个常数。这里好处就是剪枝的百分比不固定了,每一层动态剪,可多可少。
实验结果
可以看出训练后量化(PTQ)降得还是略多的,而QAT的8位或6位基本没怎么降,4位的话影响就很大了。结果也是符合我们组实践效果的。
评价
自我感觉这篇没啥创新,不过最后也只是findings,没有中主会。量化位置和一些trick也都是很容易想到的,而每个channel单独量化其实实践下来意义也不大,不加这个trick效果也很好了已经。FFN最后也并没有剪去多少参数。
Extremely Low Bit Transformer Quantization for On-Device Neural Machine Translation
这篇是三星做的,也发表在findings上面。
「论文地址:」 https://www.aclweb.org/anthology/2020.findings-emnlp.433.pdf
方法
这篇没有采用比较常用的uniform量化方式(也就是将浮点数区间等比例映射到整数区间),而是采用binary-code,也就是将参数
这篇针对embedding的不同词频采用了不同的量化位数,具体方案可以看下面的伪代码:
总之就是词频越高,量化位数越多。而大多数单词词频都很低,1%的单词占据了95%的词频,所以他们位数高一点影响不大。针对每个词向量,采用的是不同的量化参数,这也是考虑到每个词向量的空间分布有差异。
针对encoder和decoder中的不同类型attention,论文也是采用了不同的量化位数。
训练策略上,这里finetune阶段每2000步开启一次量化,为了节约训练时间。
实验结果
可以看出embedding量化影响还是比较大的,特别是量化到2位以下时。而全部采用2位量化效果很差。如果用本文的量化方法,可以看出大部分配置下,损失都在1个点以内,效果还是不错的。
评价
这篇采用non-uniform量化方式,实现起来还是更复杂一点的,而且在矩阵相乘的加速优化方面,并没有过多阐述怎么实现。此外没有对比uniform量化和non-uniform量化方式的差距,不清楚性能的提升是non-uniform量化占主导,还是根据词频和不同attention类型采用不同量化位数占了主导。最后人工设计因素过多,比如attention的量化位数都得人来定好,应用起来不是很灵活。
TernaryBERT: Distillation-aware Ultra-low Bit BERT
这篇还是华为诺亚方舟实验室做的,发表在EMNLP主会上面。
「论文地址:」 https://www.aclweb.org/anthology/2020.emnlp-main.37.pdf
方法
如上图所示,这篇在量化基础上还加上了蒸馏。
首先对于weight量化,采用三值量化,训练方法用的是TWN或者LAT,具体原理可以去看侯璐的论文:https://houlu369.github.io/,而activation还是采用一般的min-max量化。
量化参数的话,embedding每一行采用一套参数,而其他所有weight都是一整个采用一套参数。
蒸馏采用三个loss:hidden state、attention和logits。teacher是全精度的,student有两个,第一个是全精度的,模型和teacher一模一样。然后采用TWN或LAT量化得到三值网络,计算loss,最后反向传播更新全精度student的参数。
此外还有两个trick,一是用了数据增强,二是全精度的student模型初始化是用的finetune后的teacher。
实验结果
在GLUE上做的实验,最大压缩率可以达到23倍,看起来效果比普通的Q-BERT、Q8-BERT还是好了不少的,比BERT也只差了1个点左右。这里所有的activation都只量化到了8位,估计再低试了效果也不好。
评价
GLUE和SQUAD上看起来效果很不错,压缩率也很高,但是融合的手段有点多:蒸馏、数据增强、模型初始化等,消融实验也可以看出来去掉蒸馏和数据增强后效果降了非常多,因此TWN和LAT相比于一般的min-max量化实际中到底有多大优势不得而知。最后这篇论文没有做机器翻译任务,都是做的分类任务,如果在更困难的生成任务上效果也很好,才真的有说服力。
总结
综合看下来,这三篇论文采用了三种完全不同的量化方法。第一篇最好实现,TensorFlow自带的量化也是采用这种方式,8比特效果也近乎无损,但是更低的话就不大行了。后两篇都是超低比特量化,一个用的是binary-code,一个是TWN或LAT,压缩率都很高。第二篇根据词频或重要性区分不同参数的量化位数,在超低比特情况下还能保持很好的效果。第三篇直接超低比特量化,但是用了蒸馏等一系列操作把性能提升了上去,遗憾的是没有做机器翻译任务,让人产生怀疑。
不过最后只有第三篇中了主会,不管怎么样,还是有很多值得借鉴的地方的。
量化感知训练_一文速览EMNLP 2020中的Transformer量化论文相关推荐
- 量化感知训练_如何评估训练质量?常被训练者忽视的内部负荷
柏龄注:本文为龄动馆教练沈楚涵撰写.这篇文章提出了一个标准,一个简化训练质量和主观疲劳值的标准.希望这篇文章能给你一些启发.以下为正文: <量化健身>书中提到:在实际训练中,如果健身者想要 ...
- 量化感知训练_《量化健身 动作精讲》:专业解读健身动作的秘密
想要完美曲线,又不想费吹灰之力,可能性太小.无论是T台上曼妙的模特儿,还是赛场上健美的运动员,都得通过锻炼和饮食相结合的方法,才能拥有肌肉紧实.曲线优美的完美身材. 看着别人的马甲线和蜜桃臀,你是不是 ...
- 速览EMNLP 2020上录取的知识图谱相关论文
文 | 泽宇 源 | 知乎 前不久,自然语言处理领域三大顶会之一的 EMNLP 2020 发布了论文录取的结果.在EMNLP 2020论文正式出版之前,泽宇搜集了目前Arxiv上已经发布出来的录取在E ...
- 深度学习框架量化感知训练的思考及OneFlow的解决方案
作者 | BBuf 原文首发于公众号GiantPandaCV 0x0.总览 相信不少小伙伴都了解或者使用了一些深度学习框架比如PyTorch,TensorFlow,OneFlow(也是笔者目前正在参与 ...
- 深度学习框架量化感知训练的思考及OneFlow的一种解决方案
[GiantPandaCV导语]这篇文章分享的是笔者最近在OneFlow做的一个项目,将Pytorch FX移植到OneFlow之后实现了自动量化感知训练动态图模型(在Pytorch和OneFlow中 ...
- 适配PyTorch FX,OneFlow让量化感知训练更简单
作者 | 刘耀辉 审稿 | BBuf.许啸宇 1 背景 近年来,量化感知训练是一个较为热点的问题,可以大大优化量化后训练造成精度损失的问题,使得训练过程更加高效. Torch.fx在这一问题上走在了前 ...
- Fast and Effective!一文速览轻量化Transformer各领域研究进展
每天给你送来NLP技术干货! © 作者|刘子康 机构|中国人民大学高瓴人工智能学院 研究方向 | 多模态学习 来自 | RUC AI Box 本文梳理了一些Transformer常用的轻量化方法,并分 ...
- 基于pytorch量化感知训练(mnist分类)--浮点训练vs多bit后量化vs多bit量化感知训练效果对比
基于pytorch量化感知训练–浮点训练vs多bit后量化vs多bit量化感知训练效果对比 代码下载地址:下载地址 灰色线是量化训练,橙色线是后训练量化,可以看到,在 bit = 2.3 的时候,量化 ...
- 基于pytorch后量化(mnist分类)---浮点训练vs多bit后量化vs多bit量化感知训练效果对比
基于pytorch后量化(mnist分类)-浮点训练vs多bit后量化vs多bit量化感知训练效果对比 代码下载地址:下载地址 试了 bit 数为 1-8 的准确率,得到下面这张折线图: 发现,当 b ...
最新文章
- Can't create handler inside thread Thread that has not called Looper.prepare()
- docker 容器基本的操作
- OpenCV行人检测
- SOCKET,TCP/UDP,HTTP,FTP
- 不要打2岁内和6岁后的孩子 父母必看
- c# 低功耗蓝牙_c# - 如何使用C#手动绑定到WinForm中的蓝牙低能耗设备? - 堆栈内存溢出...
- matlab unicode,MATLAB中的汉字编码
- c++vector(入门级)
- 实践项目2 图书管理系统
- SPSS-PROCESS插件的使用
- 金橙子打标卡二次开发应用
- CSS盒模型与box-sizing详解
- 服务器租用带宽不够会出现哪些情况
- HTTPS是如何保证安全的
- iOS 微信8.0.11更新,新功能,新变化
- 4:3 背景图片素材
- EBookMgr 开源电子书管理软件 技术预览版 20090924
- sql server基础语句大全
- Python基础-测试代码-test2.py
- ios apple语音性别_iOS 14:Apple终于听了
热门文章
- c++多数据平均数_定量分析中的几个概念-平均数、算数平均数、调和平均数以及权重及应用...
- jmeter学习总结
- 计算机一级ftp协议传输,文件传输协议(FTP)必将消亡
- 最大公约数之辗转相除法
- vc6.0转vc2010编程中遇到的问题
- Matlab常用快捷键
- Python基础学习3——集合、文件、函数
- jenkins 关联 钉钉机器人
- Redis学习记录之Java中的初步使用
- MySQL的show profile(已过时)简介以及该功能在MySQL 5.7中performance_schema中的替代