當前位置:
首頁 > 最新 > Google Tensorflow Lite 8bit 量化論文

Google Tensorflow Lite 8bit 量化論文

1. 簡介

本文主要介紹Google在2017年12月份上傳到arXiv上的一篇8bit量化論文《Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference》(這幾天看到國內某博客說這篇文章被CVPR2018接收了,自己去各種權威網站以及作者主頁求證,均沒有發現相關的消息)。這篇論文主要介紹了Tensorflow Lite 中8bit量化的原理以及量化模型的Training和Inference過程。文章中8bit量化與普通的量化過程基本一樣,主要的貢獻在於:(1)在8bit量化的公式基礎上,通過公式變化以及設計,使得整個inference過程中只需要做整數計算;(2)提出了一種模擬量化訓練的框架,在訓練模型的過程中模擬量化的過程; (3)該文章的實驗部分都是針對mobileNet這種精簡模型進行量化實驗,並且在實際的手機CPU上做性能測試,來充分展示量化演算法的實用性。


當前圖像領域的一些標誌性網路例如AlexNet, VGG, GoogleNet, ResNet等在設計的時候主要考慮的是提升模型準確性,缺乏對於模型複雜性以及計算有效性的考慮。目前在移動端(手機,VR/AR,攝像頭等)存在著大量的演算法需求,而這些設備在存儲以及模型運算速度上有很大的限制。當前主要的解決思路有兩個:(1)設計一些特需的網路結構來減少網路參數並且加速計算,例如SqueezeNet, Xception, ShuffleNet, MobileNet(v1,v2)等等;(2)將模型參數(權重,激勵)量化到更低的位寬來表示,例如TWN, BNN, XNOR-net, INQ等等。目前很多的量化演算法都是在一些標誌性的網路(AlexNet, VGG等等)做實驗,由於這些網路設計時本身就存在很大的參數冗餘,因此往往能得到較好的模型壓縮比以及較大的速度提升,在作者看來這些並沒有太大意義(我個人也非常贊同,本身在大公司的實際業務場景中,根本不用這些標誌性網路,反而MobileNet,Xception, InceptionV4, MobileNet SSD這些才真正用的比較多,畢竟實際業務中速度還是非常重要的)。故而作者的關注重點在於將量化演算法應用於本身就已經非常精簡的網路(例如MobileNet)。其次,目前很多量化演算法主要考慮的是減少模型在移動設備上的存儲,而較少的去考慮模型在設備上的計算有效性,因此該論文著重關注量化後的演算法在真實的移動CPU(例如高通驍龍835, 821等等)上計算的有效性。


本文提出了一種8 bit量化的方式,將權重以及輸入都做8bit的量化;其次在整個inference的過程中只進行整數的運算(傳統的量化只是為了減少存儲,計算時需要將量化的值恢復到原始的浮點數,進行浮點運算)。首先我將講解該論文是如何設計8 bit的量化方案;其次講解如何在inference的過程中只做整數的運算;最後講解下該文章提出的模擬量化訓練框架,通過這種模擬量化訓練,使得量化演算法在MobileNet上也能有較大的速度提升,並且保證一定的精度損失。

按如下公式進行8bit 量化:

其中r為需要量化的實數,S為浮點的scale係數,q為量化後的無符號整數(uint8),Z為量化後的零點,也是無符號整數(uint8),當然也可量化成其他位寬的整數。數據格式採用如下的c++模板來表述:

下面我將詳細分析下這種量化方式與傳統的量化的差別:

上所示,主要的差別在於最小值的位移偏差,google的量化方式將位移的最小偏差也做了量化,可以理解為是以原始0點為基準做的量化,這樣還原回去的r偏差會更大一些,當然這種量化的方式主要是為了在inference的過程中直接使用量化後的值做乘加運算而不必還原回去。綜上分析可以知道,這種量化方式相比於傳統的量化方式在精度上會損失一些。


這裡主要解決三個問題:(1)如何將兩個不同量化的數直接做乘加操作而不用還原到實數 (2)上面的量化公式中浮點係數S如何變成整數操作(3)如何將bias和激勵函數加到整數操作中。

第一步: 首先定義兩個實數矩陣相乘,採用上述的量化表示方式可以推理得到如下公式:

第二步: 上面的公式(4)中每個數都需要先減對應的零點再做相乘操作,這樣會進行較多的加減操作,在公式(4)的基礎上可以進一步的推理變換如下形式:

作者發現上述的量化以及Inference策略直接應用在大模型上能取得較好效果,但是應用在小模型上準確率很差,作者覺得有兩個原因導致的:(1)不同的輸出channel 對應的weights存在較大的差異(more than 100x)(2)一些明顯的outlier權重值會使其他權重值量化時的精度偏低。

本文提出了一種模擬量化的訓練方式即添加一些偽量化操作,這些偽量化的位置與前向過程中量化的位置保持一致。訓練過程中的一些關鍵點如下:

(1)對比前向過程,在相同位置插入偽量化操作

(2)求導過程依然不變,即偽量化操作不參與求導,參數更新依然在原始的權值上面

(3)所有的weight和bias是採用原始的float方式存儲

(4)對於存在BN的網路,在做偽量化之前,將BN的參數「folded into」權重weight中

(5)對於存在連接的網路(ResNet),在連接操作後做偽量化操作

第一步:偽量化過程如下:

即在訓練過程中,模擬量化的精度損失,將weight先做量化再還原回去,這裡需要注意的是該還原過程採用的是傳統的量化還原方式,沒有採用本文提出的量化公式進行還原。

第二步:一個不帶BN層的模擬量化訓練流程:

其結構圖如下:

訓練的過程中需要學習兩個東西: (1)學習權重等參數(2)學習權重和激勵值的量化區間,對於權重而言,只需要統計統計其最大最小值作為量化區間;對於激勵值,激勵值在inference的過程中會隨著輸入的不同而不斷變化,因此需要做類似BN層中的(均值和方差)一樣的操作,在訓練的過程中通過EMA演算法統計出激勵值的量化區間,EMA演算法統計的過程如下:

第三步: 一個帶BN層的模擬量化訓練流程:

這裡我們先複習下BN的計算過程如下:

上面展示了BN的計算過程,在Inference的過程中,一般會將BN的參數融於卷積運算過程中具體如下:


本文在MobileNet的基礎上做8bit的訓練以及量化inference,在google pixel手機(高通驍龍 835和821)上做ImageNet測試實驗,發現8bit精度相對於浮點精度只低了1到2個點,在速度上卻快很多。其次還採用mobileNet SSD結構做了一些物體檢測實驗,均發現效果以及速度都有很好的表現。由於文章篇幅有限,此處就不詳細說明文章的實驗結果,感興趣的可以看下論文。文章提出的這種模擬inference的精度損失過程來訓練模型的想法感覺挺有意思,也許這種想法會進一步的發展下去。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI晶元演算法 的精彩文章:

TAG:AI晶元演算法 |