Hello大家好,在之前的視頻中我們的講解主要集中在訓練后量化,也就是PTQ,那么這期視頻我們就再來講一下另一種主要的量化類型,量化感知訓練,我們暫且不會涉及到QAT在TPU-MLIR中的應用,只是先停留在理論層面進行一個介紹。
我們在學習PTQ的時候知道了量化其實就是一個尋找合適的量化參數,將高位數據流映射為低位數據流的過程,實現模型輕量化并且提高推理效率,但在這個過程中模型的精度不可避免地會下降。
造成精度下降的原因有很多,其中主要有:
量化誤差的引入,就像右邊這張信號圖所示,我們在量化時做的取整操作其實就是用有限的離散取值去近似無限的連續取值,會不可避免的導致量化后的信號與量化前的信號有一定的偏差,當這種偏差越大時量化誤差往往也就越大。
而且Weight 與activation tensor用INT8來表示則不可避免地也會出現一定的信息損失,例如我們之前提到的截斷誤差,并且模型在進行Multiply-Accumulate操作中會采用INT32來接收累加的結果,然后將累加的結果再轉換回INT8,這個過程可能也會導致一定的截斷誤差。上一期視頻中我們介紹的校準方法只能在截斷誤差與量化誤差之間做一個權衡,而不能完全消除它們。
還有就是我們量化推導那期視頻中提到過的用Multiplier與rShift代替Scale的表示也會產生些許誤差
QAT就是通過end-to-end training微調訓練后的模型參數,讓模型對量化的魯棒性更強,從而緩和造成的精度下降問題,而且通過QAT,我們也能夠達成更低位,例如INT4的量化,從而進一步輕量化模型與提高推理效率
實現方式就是在訓練過程中進行模擬量化,或者說是插入FakeQuant偽量化算子,對weight與activation tensor進行量化,然后再做反量化引入量化誤差進行訓練,所以在fine-tune的過程中模型還是以FP32精度進行運算的,并不是像推理過程中的低位運算。之后我們通過反向傳播與梯度下降的方式微調模型權重。
對于量化參數的確定,weight tensor的量化參數通常采用絕對最大值除以127的方式確定,而activation tensor量化參數則根據QAT算法的不同可能也有所不同。早期的QAT算法采用滑動平均的方式在訓練過程中對量化取值范圍進行統計更新,而近些年來主流的QAT算法直接將量化參數定位可學習參數在反向傳播過程中通過梯度下降進行更新。
這樣的做法在實際實現過程中我們主要會遇到一個問題,就是偽量化算子中的round函數梯度要怎么計算,我們既然在原模型插入了偽量化算子,又要對模型進行重新訓練,就不得不考慮反向傳播時怎么計算它的梯度。
首先我們之前有看過量化后的信號波形圖其實是一個離散的階梯函數,這樣的函數是不可導的,或者說它們的梯度是處處為0的,這就導致權重無法得到更新。所以我們需要想辦法去對它做近似操作。
一種傳統的方式是用Straight-Through Estimator在反向傳播過程中讓偽量化算子輸入的梯度等于輸出的梯度,或者說使他梯度為1。
由這種方法延伸出了一系列的QAT算法,例如DoReFaNet,這個算法將activation和weight都壓縮在0,1之間進行量化,后面會繼續講解基于STE的QAT算法,敬請期待。
審核編輯:彭菁
-
函數
+關注
關注
3文章
4346瀏覽量
62977 -
模型
+關注
關注
1文章
3313瀏覽量
49229 -
數據流
+關注
關注
0文章
121瀏覽量
14440
發布評論請先 登錄
相關推薦
評論