[22.12] QARepVGG
讓 RepVGG 再次偉大
Make RepVGG Greater Again: A Quantization-Aware Approach
RepVGG 在訓練階段利用多個 分支形式的過度參數化網絡,並在推理過程中將分支相同地融合為一個,稱為「重新參數化」。
定義問題
這種「重新參數化」設計在許多場景中作為基本組件被廣泛使用,涵蓋低階和高階視覺任務。
近年流行的目標檢測方法,如 YOLOv6 和 YOLOv7 都是基於這樣的組件構建的。
但是...
RepVGG,它不能量化!
量化是一種有效的模型壓縮方法,它將網路權重和輸入資料映射到較低的精度(通常 INT8)以進行快速計算,這極大地提高了計算效率。
- 訓練後量化(PTQ)是最常見的方案,因為它只需要幾批影像來校準量化參數,並且不需要額外的訓練。
- 量化感知訓練(QAT)方法也被提出來提高量化精度,由於 QAT 通常涉及對訓練代碼的侵入並且需要額外的成本,通常只在訓練代碼手頭並且 PTQ 無法產生令人滿意的結果時才使用它。
有得必有失,不管是什麼量化方式,通常伴隨著精度下降,因此只要能在「不影響太多」性能的情況下,用於在部署作業上。
- 但 是 RepVGG 量化之後,精度降了 20%!
這完全沒有實用價值!
首先,為什麼?
作者首先使用官方發布的代碼評估幾個 RepVGG 模型的性能,如上表,RepVGG-A0 在標準的 PTQ(後訓練量化)後,在 ImageNet 驗證數據集上的 Top-1 準確率從 72.4% 大幅下降到 52.2%,總共下降 20.2% !
對於張量 的量化操作通常表示為:
其中 使用天花板取整將浮點值四捨五入為整數, 則截斷超出量化域範圍的值。 是一個比例因子,用於將張量映射到給定範圍內,定義為:
其中 和 是一對邊界值,選擇它們是為了更好地表示的值分佈。量化誤差的方差計算為 。因此,問題變成如何減少 和 之間的範圍。
在實踐中,它們是以各種方式選擇的。有時最大值和最小值會被直接使用,例如權重量化;有時它們是通過優化量化誤差的 MSE 或熵來選擇的,這通常用於量化激活值。選擇的質量取決於許多因素,例如張量的方差、是否存在一些異常值等。
對於神經網絡來說,有兩個主要組成部分需要量化並可能導致準確度下降,即權重和激活。激活還作為下一層的輸入,因此誤差會逐層累積和增加。因此,神經網絡的良好量化性能主要需要兩個基本條件:
- :權重分佈對量化友好且範圍可行,
- :激活分佈(即模型對輸入特徵的響應)對量化也友好。
經驗上,我們將具有小方差和少量異常值的權重或激活分佈定義為對量化友好,違反上述任何一個條件都會導致較差的量化性能。
作者接著展示 RepVGG-A0 模型的權重分佈:
上圖是每一層的權重分佈,和對應的標準差。
觀察發現,這些權重均勻分佈在零附近,沒有特別的異常值,滿足了 C1 的條件。這促使作者進一步驗證 C2,檢查是否是激活函數大大惡化了量化效果。不幸的是,激活函數是依賴於輸入且與學習到的權重耦合在一起的。
因此,作者不對權重或激活函數的分佈做任何假設,並分析每個分支的偏差。
正則化擴大激活方差
在進一步討論之前,我們先來介紹典型 RepVGG 區塊中的計算操作。
這裡作者使用與 RepVGG 相同的命名約定,以便更好地理解。
這裡用