A Quantization-Friendly Separable Convolution for MobileNets
論文:《A Quantization-Friendly Separable Convolution for MobileNets》
論文地址:https://arxiv.org/pdf/1803.08607.pdf
這篇是高通在 2018 年發表的一篇論文,主要是針對在量化方面效果很差的 MobileNetV1 網絡進行研究,探索其量化掉點很嚴重的原因(從浮點模型的 70.5%到量化模型的 1.8%),發現根因主要是來自可分離卷積,盡管它使得 MobileNetV1 大大減少了參數量和存儲量,但副作用就是導致量化效果很差,因此作者提出了3 種改進來解決這個問題,提升了 MobileNetV1 的量化效果:
去掉可分離卷積中的 BN 和 ReLU6 ;
在其它網絡層中使用 ReLU 替代 ReLU6;
可分離卷積層中使用 L2 正則化
上述的操作最終是提升了量化效果,從只有 1.8% 提升到 68.03%,大大減少了量化掉點的問題。
聯系方式:
Github:https://github.com/ccc013/AI_algorithm_notes
知乎專欄:機器學習與計算機視覺,AI 論文筆記
微信公眾號:AI 算法筆記
1. 簡介
量化對于在手機、IoT 平臺上運行深度學習的推理操作是非常關鍵的,主要是這些平臺在功耗和存儲使用方面有比較大的限制,而這些平臺其實非常依賴如同數字信號處理器 (DSP)這樣的定點計算硬件模塊來實現比 GPU 更高效的表現。而在這樣的平臺上,常用的深度網絡結構,比如 VGG,GoogleNet,ResNet 等都因為其參數量、計算量過大,很難部署在手機平臺上,而一些輕量網絡,則可以通過將標準卷積替換為深度可分離卷積的方法來取得準確率和效率之間的平衡,如下圖 a 和 b 所示,比如谷歌提出的 MobileNetV1,大大降低了參數量和存儲量,因此是常用的部署到手機上的網絡結構。不過副作用就是使用的分離卷積層造成了巨大的量化損失,從而使得其量化效果非常差。
為了上述說的量化問題,作者使用 TensorFlow 框架來實現了 MobileNetV1 和 InceptionV3,并對比浮點模型和量化后頂點模型的準確率,如下圖所示,可以看到 InceptionV3 的準確率在量化后并沒有下降太多,反倒是 MobileNetV1 量化后的準確率大幅度下降,作者也給出對兩個網絡的評價,前者是只有標準卷積,而后者主要用了可分離卷積。
有幾種方法是有可能解決這個量化掉點嚴重的問題:
最直接的方法就是使用更多bits 的量化,比如從 8bit 提升到 16bit 是可以提升準確率的,但是也會提升模型的參數量和計算量,這個受到目標平臺的容量限制;
第二種方法就是可以重新訓練一個專門用于定點推理的量化模型;
對于第二個方法,谷歌在論文《Quantization and Training of Neural Net works for Efficient Integer-Arithmetic-Only Inference》中提出了一個量化訓練的框架,它可以在前向訓練中模擬量化效果,而在反向傳播中保持原來的浮點訓練的操作。這個框架是通過了額外的訓練能減少量化損失,不過對于多個不同的平臺需要維護多個模型。
而在本文中,作者是對可分離卷積層使用了新的結構設計從而構建了一個輕量級的量化友好的網絡。新的結構只需要單次浮點訓練,訓練得到的模型可以部署到不同的平臺,無論是浮點還是定點推理,都是最小的精度損失。為了實現這個目的,作者是通過查找 MobileNetV1 在量化上精度損失的根因,并基于發現的原因設計了一個新的量化友好的 MobileNetV1,在浮點模型方面可以保持準確率,并且在量化后的定點模型的精度大大提升。
本文的貢獻在于:
作者認為 bn 和 ReLU6 是造成 MobileNetV1 量化損失較大的主要原因;
提出了一個量化友好的可分離卷積,并且在浮點訓練和量化定點中證明了其在 MobileNetV1 上的效率;
2. 量化方案和損失分析
本節將研究基于 TensorFlow(TF) 實現的 8bit 量化的 MobileNetV1 模型在定點 pipeline 中精度損失的根因,下圖展示了一個經典的 8bit 量化流程。一個 TF 的 8bit 量化模型首先是直接從預訓練的浮點模型中生成,其權重首先是離線量化的,然后在推理階段,所有的浮點輸入都先量化為一個 8bit 的無符號數值,然后再傳到一個頂點的運行時操作,比如 QuantizedConv2d, QuantizedAdd, QuantizedMul 等,它們會生成 32 位的累計結果,然后通過激活反量化(activation re-quantization)步驟轉成一個 8bit 的輸出,然后這個輸出再傳給下一個操作。
2.1 TensorFlow 的 8bit 量化方案
TensorFlow 的 8bit 量化使用一個均勻量化器,也就是說所有的量化步長都是等長的。
讓 表示浮點輸入 x,而 TensorFlow 量化后的 8bit 數值表示為 ,則其計算公式如下:
其中 表示的就是量化步長,b 表示位寬,比如本文提到的 8bit,就是 b=8,而 表示偏置值,而 分布表示浮點數值范圍的最小值和最大值,另外 表示最近的湊整操作,在 TensorFlow 中的實現是如下所示:
基于上述的定義,對于一個卷積操作的累計結果的計算如下所示:
最后,給定輸出的已知的最大值和最小值,將上述 (1)-(4) 公式結合起來,反量化得到的輸出可以通過下述公式計算得到:
2.2 量化損失的度量
正如上述圖 2 中所示,在這個量化的流程中有 5 種類型的損失,包括了輸入的量化損失、權重量化損失、運行時飽和損失、激活值反量化損失和可能的對確定的非線性操作的修建損失,如 ReLU6。為了更好的了解不同類型的損失提供的貢獻,本文采用了信號到量化的信噪比(Signal-to-Quantization-Noise Ratio ,SQNR)作為評估每個網絡層輸出的量化精度,SQNR 的計算如下所示,其定義為非量化的信號 x 的能量除以量化誤差 n 的能量:
由于輸入信號 x 的平均量級是遠大于量化步長 ,所以一個合理的假設是量化誤差是一個服從 0 均值的均勻分布,并且其概率密度函數(PDF) 是結合為 1,因此,對于一個 8bit 的線性量化器,其噪音能量可以如下計算得到:
結合(2),(7)和(6),可以得到如下公式:
SQNR 和信號的分布關系很大,根據(8)式,SQNR 很明顯是由x 的能量以及量化范圍決定的,因此增加輸入信號的能力或者減少量化的范圍都可以提升輸出的 SQNR。
2.3 對 MobileNetV1 的量化損失分析
2.3.1 深度卷積層中的 BN
如下圖(b) 所示,MobileNetV1 的核心層包含了一個深度卷積(depthwise convolution)和逐點卷積(pointwise convolution),并且它們后面都跟著一個 BN 和 非線性激活函數,比如 ReLU 或者 ReLU6。而在 TensorFlow 的實現中這里是使用 ReLU6 作為非線性激活函數的。
假設 x 是每層的輸入,它包括 d 個通道,每個 batch 的大小是 m,則在深度卷積中 BN 是獨立的在每個通道中進行轉換,其計算公式如下:
其中 表示經過歸一化的在通道 k 的第 i 個輸入值 ,而 表示整個 batch 的均值和方差, 表示大小和轉移值。而 是一個設定好的非常小的常數,在 TensorFlow 的實現中,其數值是 0.0010000000475。
在定點流程中,BN 的轉換可以被折疊起來,首先令:
則(9)式可以重寫為:
在 TensorFlow 的實現中,每個通道 k 中, 可以結合權重并折疊到卷積操作中從而減小計算消耗。
雖然深度卷積是單獨應用到每個通道中,但是權重量化的最小值和最大值的選擇范圍是所有的通道,這會導致一個問題就是某個通道的一個離群點很可能導致整個模型的巨大的量化損失,因為離群點會加大了數據的數值范圍。
此外,沒有跨通道的修正操作,深度卷積很可能在一個通道里產生全 0 的數值,這導致該通道的方差是 0,并且這種情況在 MobileNetV1 種是很常見的。而根據公式(10),方差是 0 的時候由于設置的非常小的常數 , 會非常大,如下圖所示,測量了32 個通道中的 數值,由于零方差導致的 6 個離群點 是增大了量化范圍,這導致的結果就是量化位數會由于要保持這些來自全 0 通道的巨大的數值而浪費了,相反那些帶有信息的通道的較小的 反而沒有被保留下來,使得整個模型的表征能力變差很多。
從實驗中可以知道,在沒有重新訓練的情況下,通過將這些全 0 通道的方差改為其余通道的方差的均值,可以很好的解決這個問題,這可以讓量化后的 MobileNetV1 模型在 ImageNet2012 驗證集上的精度從之前的 1.8%提升到 45.73%。
標準的卷積層是在一個步驟中完成了對輸入的濾波和合并得到新的輸出數值,而在 MobileNetV1 中深度可分離卷積將這個操作分成兩層,深度卷積實現濾波的操作,而逐點卷積實現合并的操作,從而大大減小了計算代價和模型大小,并且可以保持模型精度。
基于上述的原則,本文是考慮移除了深度卷積后的 BN 和 ReLU6,讓深度卷積來學習合適的權重從而替代了 BN 的作用,這樣的操作即可以保持特征的表征能力,又使得模型能很好實現量化操作。
如下圖所示,這里使用 SQNR 來觀察每層的量化損失,其中黑線表示原始版本的將 折疊到卷積權重里的 MobileNetV1,藍線則表示在所有深度卷積層中移除了 BN 和 ReLU6 ,紅線表示的是在移除深度卷積層的 BN 和 ReLU6 后,還在逐點卷積層中使用 ReLU 而不是 ReLU6,另外保留逐點卷積層中的 BN 和 ReLU6,然后使用的圖片是從 ImageNet2012的驗證集中每個類別隨機選擇 1 張圖片,總共 1000 張圖片,從實驗結果可以知道保留深度卷積層里的 BN 和 ReLU6 會大大降低每層輸出的 SQNR。
2.3.2 ReLU6 還是 ReLU
本節還是用 SQNR 作為評價標準,依然是上圖所示,這里主要是探討在逐點卷積層中使用的非線性激活函數,ReLU6 還是 ReLU。需要注意的是對于一個線性量化器,當輸入信號分布越均勻,SQNR 就越高,否則就越低;
從上圖中首先可以觀察到,使用 ReLU6 的時候在第一個煮點卷積層的時候SQNR 都是有明顯的降低,根據公式(8),盡管 ReLU6 是可以降低量化范圍,但是輸入信號的能量也因為 clip 操作被降低了。理想的情況是其 SQNR 應該和 ReLU 相似,但實際上 clip 操作的副作用是在前面幾個網絡層的時候會扭曲了輸入信號的分布,使其對量化不夠友好,從實驗結果來看就是導致第一層到其它層的時候SQNR 的降幅很大;
2.3.3 對權重的 L2 正則化
正如前文說的 SQNR 跟信號的分布關系很大,作者進一步在訓練中對所有的深度卷積層的權重使用了 L2 正則化,L2 正則化可以懲罰大量級的權重,而較大的權重是可能導致增大量化范圍,使得權重分布變得不夠均勻,從而導致量化損失較大,而一個更好的權重分布是能得到一個精度更好的量化模型。
3. MobileNets 的量化友好的卷積
基于第二節對量化損失的分析,作者提出了一個用于 MobileNet 的量化友好的分離卷積框架,其目標是解決巨大的量化損失從而在不用重新訓練的情況下,量化模型可以得到和浮點模型相似的準確率。
如下圖 c 所示即為作者提出的新的分離卷積層,這包含了 3 個主要的改變來使得可分離卷積變得量化友好:
從所有的深度卷積層中移除了 BN 和 ReLU6。
在其余層中用 ReLU 代替 ReLU6。作者認為 6 是非常隨意的一個數值,ReLU6 盡管可以讓模型在較早的學習到稀疏的特征,但是它的 clip 操作也在較早的層里扭曲了輸入的分布,導致得到對量化并不好的分布,從而會降低每層的 SQNR。
訓練的時候,在所有深度卷積層中對權重使用 L2 正則化。
最終本文提出的量化友好的 MobileNetV1 的網絡結構如下表所示,在移除了深度卷積的 BN 和 ReLU6 后,該網絡結構還保留原有的降低計算損失和模型大小的優點,并且能讓量化模型的精度和浮點模型接近。
4. 實驗
本文的實驗使用了 TensorFlow 來實現的修改后的 MobileNetV1,訓練參數和原始版本一樣,修改的地方是 batch 大小是 128,顯卡使用的是 Nvidia 的 GeForce GTX TITAN X,使用 ImageNet2012 數據集作為訓練集和驗證集,并且訓練只是用于浮點模型。
實驗結果如下圖所示,分別展示了不同版本下的浮點模型和量化模型的準確率,原版本的準確率分別是 70.5%和 1.8%,然后對于本文的提出三個改變,分別做了實驗和測試:
僅僅移除深度卷積層的 BN 和 ReLU6,浮點模型的準確率略微提升到 70.55%,而量化模型則是大大提升到 61.5%;
在 1 的基礎上將 ReLU6 都變為 ReLU,浮點模型提升到 70.8%,而量化模型則提升到了 67.8%;
繼續增加對權重的 L2 正則化,浮點模型略微降低到 70.77%,但量化模型繼續提升到了 68.03%。
5. 結論
本文是分析了輕量級網絡 MobileNetV1 難以量化(量化掉點嚴重)的根因,發現主要是由于深度卷積中的 BN 和 ReLU6 導致的,因為深度卷積的特性是對每個通道進行操作,它很容易導致整個通道都是 0 的數值,這會導致該通道的方差為 0,而根據 BN 的計算公式,就會導致產生的 非常大,即產生了較大的離群點,這會影響量化范圍,使得信息量較大但數值較小的數值都量化到同個定點,而這些離群點并不包含或者包含較少信息,反而被保留下來,這會大大降低量化模型的特征表征能力,從而降低了量化模型的精度。
基于這個發現,作者是直接移除了深度卷積的 BN 和 ReLU6,并且實驗結果也驗證了這個操作的可行性,而之后做的兩個改變,使用 ReLU 代替其它層的 ReLU6 的提升效果也很明顯,而 L2 正則化提升則比較一般,當然這里作者似乎沒有做個實驗來比較 L2 正則化對量化模型提升更大,還是都使用 ReLU 提升更大;
此外,目前僅在 MobileNetV1 上做了實驗,作者也提到需要在其他也使用了可分離卷積的網絡中驗證這個方法,比如 MobileNetV2,ShuffleNet,以及本文做的是分類,還需要驗證在其他的任務,比如檢測、分割上是否也有效果。
推薦閱讀的學習筆記
14. Focal Loss 論文筆記
11.神經網絡不收斂怎么辦?看看是不是這些原因
09. MCN 搭配評價模型論文筆記
公眾號后臺回復這些關鍵詞,可以獲得相應的資料:
回復”入門書籍“,獲取機器學習入門資源,包括書籍、視頻以及 python 入門書籍;
回復”數據結構“,獲取數據結構算法書籍和 leetcode 題解;
回復”多標簽“,獲取使用 keras 實現的多標簽圖像分類代碼和數據集
回復“pytorch 遷移學習”,獲取 pytorch 的遷移學習教程代碼
回復“py_ml",獲取初學者的機器學習入門教程代碼和數據集
總結
以上是生活随笔為你收集整理的A Quantization-Friendly Separable Convolution for MobileNets的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Git rebase 和 Git mer
- 下一篇: 电脑小白来一起学习计算机基础知识!