花了幾天看了三篇EMNLP 2020中關於Transformer模型量化的相關論文,快速記一下要點。
Fully Quantized Transformer for Machine Translation
這篇是華爲諾亞方舟實驗室和蒙特利爾大學合做的,發表在findings上面。git
「論文地址:」 https://www.aclweb.org/anthology/2020.findings-emnlp.1.pdfgithub


方法
針對Transformer結構的計算密集型算子進行了activation量化,除了bias之外的全部weight進行了量化,這一點其實咱們組也都作過了。web
採用的是量化感知訓練(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位的話影響就很大了。結果也是符合咱們組實踐效果的。spa
評價
自我感受這篇沒啥創新,不過最後也只是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,壓縮率都很高。第二篇根據詞頻或重要性區分不一樣參數的量化位數,在超低比特狀況下還能保持很好的效果。第三篇直接超低比特量化,可是用了蒸餾等一系列操做把性能提高了上去,遺憾的是沒有作機器翻譯任務,讓人產生懷疑。
不過最後只有第三篇中了主會,無論怎麼樣,仍是有不少值得借鑑的地方的。