花了几天看了三篇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,也就是将参数

表示成
(量化位数)个相同维度的二值向量
的线性组合,最后矩阵和向量相乘可以变为:
,具体这里可以怎么加速可以参看三星之前的论文:BiQGEMM: Matrix Multiplication with Lookup Table For Binary-Coding-based Quantized DNNs。

这篇针对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量化论文相关推荐

  1. 量化感知训练_如何评估训练质量?常被训练者忽视的内部负荷

    柏龄注:本文为龄动馆教练沈楚涵撰写.这篇文章提出了一个标准,一个简化训练质量和主观疲劳值的标准.希望这篇文章能给你一些启发.以下为正文: <量化健身>书中提到:在实际训练中,如果健身者想要 ...

  2. 量化感知训练_《量化健身 动作精讲》:专业解读健身动作的秘密

    想要完美曲线,又不想费吹灰之力,可能性太小.无论是T台上曼妙的模特儿,还是赛场上健美的运动员,都得通过锻炼和饮食相结合的方法,才能拥有肌肉紧实.曲线优美的完美身材. 看着别人的马甲线和蜜桃臀,你是不是 ...

  3. 速览EMNLP 2020上录取的知识图谱相关论文

    文 | 泽宇 源 | 知乎 前不久,自然语言处理领域三大顶会之一的 EMNLP 2020 发布了论文录取的结果.在EMNLP 2020论文正式出版之前,泽宇搜集了目前Arxiv上已经发布出来的录取在E ...

  4. 深度学习框架量化感知训练的思考及OneFlow的解决方案

    作者 | BBuf 原文首发于公众号GiantPandaCV 0x0.总览 相信不少小伙伴都了解或者使用了一些深度学习框架比如PyTorch,TensorFlow,OneFlow(也是笔者目前正在参与 ...

  5. 深度学习框架量化感知训练的思考及OneFlow的一种解决方案

    [GiantPandaCV导语]这篇文章分享的是笔者最近在OneFlow做的一个项目,将Pytorch FX移植到OneFlow之后实现了自动量化感知训练动态图模型(在Pytorch和OneFlow中 ...

  6. 适配PyTorch FX,OneFlow让量化感知训练更简单

    作者 | 刘耀辉 审稿 | BBuf.许啸宇 1 背景 近年来,量化感知训练是一个较为热点的问题,可以大大优化量化后训练造成精度损失的问题,使得训练过程更加高效. Torch.fx在这一问题上走在了前 ...

  7. Fast and Effective!一文速览轻量化Transformer各领域研究进展

    每天给你送来NLP技术干货! © 作者|刘子康 机构|中国人民大学高瓴人工智能学院 研究方向 | 多模态学习 来自 | RUC AI Box 本文梳理了一些Transformer常用的轻量化方法,并分 ...

  8. 基于pytorch量化感知训练(mnist分类)--浮点训练vs多bit后量化vs多bit量化感知训练效果对比

    基于pytorch量化感知训练–浮点训练vs多bit后量化vs多bit量化感知训练效果对比 代码下载地址:下载地址 灰色线是量化训练,橙色线是后训练量化,可以看到,在 bit = 2.3 的时候,量化 ...

  9. 基于pytorch后量化(mnist分类)---浮点训练vs多bit后量化vs多bit量化感知训练效果对比

    基于pytorch后量化(mnist分类)-浮点训练vs多bit后量化vs多bit量化感知训练效果对比 代码下载地址:下载地址 试了 bit 数为 1-8 的准确率,得到下面这张折线图: 发现,当 b ...

最新文章

  1. Can't create handler inside thread Thread that has not called Looper.prepare()
  2. docker 容器基本的操作
  3. OpenCV行人检测
  4. SOCKET,TCP/UDP,HTTP,FTP
  5. 不要打2岁内和6岁后的孩子 父母必看
  6. c# 低功耗蓝牙_c# - 如何使用C#手动绑定到WinForm中的蓝牙低能耗设备? - 堆栈内存溢出...
  7. matlab unicode,MATLAB中的汉字编码
  8. c++vector(入门级)
  9. 实践项目2 图书管理系统
  10. SPSS-PROCESS插件的使用
  11. 金橙子打标卡二次开发应用
  12. CSS盒模型与box-sizing详解
  13. 服务器租用带宽不够会出现哪些情况
  14. HTTPS是如何保证安全的
  15. iOS 微信8.0.11更新,新功能,新变化
  16. 4:3 背景图片素材
  17. EBookMgr 开源电子书管理软件 技术预览版 20090924
  18. sql server基础语句大全
  19. Python基础-测试代码-test2.py
  20. ios apple语音性别_iOS 14:Apple终于听了

热门文章

  1. c++多数据平均数_定量分析中的几个概念-平均数、算数平均数、调和平均数以及权重及应用...
  2. jmeter学习总结
  3. 计算机一级ftp协议传输,文件传输协议(FTP)必将消亡
  4. 最大公约数之辗转相除法
  5. vc6.0转vc2010编程中遇到的问题
  6. Matlab常用快捷键
  7. Python基础学习3——集合、文件、函数
  8. jenkins 关联 钉钉机器人
  9. Redis学习记录之Java中的初步使用
  10. MySQL的show profile(已过时)简介以及该功能在MySQL 5.7中performance_schema中的替代