<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          神經網絡壓縮方法:模型量化的概念簡介

          共 3807字,需瀏覽 8分鐘

           ·

          2022-01-04 18:09

          來源:DeepHub IMBA

          本文約3200字,建議閱讀6分鐘?

          本文為你介紹如何使用量化的方法優(yōu)化重型深度神經網絡模型。


          在過去的十年中,深度學習在解決許多以前被認為無法解決的問題方面發(fā)揮了重要作用,并且在某些任務上的準確性也與人類水平相當甚至超過了人類水平。如下圖所示,更深的網絡具有更高的準確度,這一點也被廣泛接受并且證明。



          使用更深層次的網絡模型追求人類級別的準確性會帶來一系列挑戰(zhàn),例如:
          • 更長的推理時間
          • 更高的計算要求
          • 更長的訓練時間

          高計算量的深度模型需要較長訓練時間,對于線下訓練還是可以接受的,因為訓練通常進行一次或以固定的時間間隔進行,但在高吞吐量生產環(huán)境中進行線上部署變得極其困難。在這種情況下模型壓縮技術變得至關重要,因為壓縮能夠在不影響準確性的情況下減少龐大模型的占用空間。這篇介紹性文章將討論可用于優(yōu)化重型深度神經網絡模型的不同技術。


          模型壓縮方法


          目前用于現代深度學習的模型壓縮的主流方法有三個:

          基于量化的方法:量化涉及使用較低精度的數據類型來存儲模型權重和執(zhí)行計算(例如:8 位整數而不是 32 位浮點數)。

          模型剪枝:模型修剪涉及清除對模型性能的貢獻較小的神經元或某些神經元之間的連接。剪枝之所以有效是因為深度神經網絡本質上是稀疏的,正如 Frankle 等人在他們的論文 The Lottery Ticket Hypothesis:Finding Sparse, Trainable Neural Networks 中所描述的那樣。

          知識蒸餾:這種方法訓練一個小模型來模擬更大、更準確的預訓練模型的軟標簽。

          軟標簽允許學生模型很好地泛化,因為軟標簽代表了更高級別的抽象和對不同類別相似性的理解,而不是峰值的獨熱編碼表示。

          在以下部分中,我們詳細介紹模型量化,這是最廣泛使用的模型壓縮形式。

          什么是量化?


          根據定義,量化是將值從大集合映射到較小集合的過程,其目標是在轉換中具有最少的信息損失。這個過程被廣泛應用于各個領域,包括信號處理、數據壓縮、信號轉換等等。
          量化應用于連續(xù)模擬信號,通過采樣和四舍五入到最接近的可表示量化值將它們轉換為離散數字信號。

          浮點數表示

          1985 年創(chuàng)建的 IEEE 754 標準是現代計算機中浮點值二進制表示的技術標準。根據 IEEE 754,定義了可用于表示浮點數的級別,范圍從 16 位(半精度)到 256 位(八位精度)。浮點數的表示包括三個部分:符號位、有效數(小數)和指數位。

          這些二進制形式的值被連接起來以表示內存中的數字。下圖描述了 32 位精度浮點數的表示:


          對于離散整數表示,我們最多可以使用 n 位表示 2^n 個不同的數字。使用浮點表示法使我們能夠在數軸上表示更大范圍的數字,如下圖所示:


          還需要注意的是 不同精度的浮點數使用不同的位來表示指數位和有效位,因此所表示的范圍也有所不同。下表顯示了數據類型 FP32、FP16 和 INT8 表示的范圍和最小值。


          量化操作

          可表示范圍的方差對不同數據類型中固定值的表示是有影響的。以??的數值為例,該值隨表示它的不同數據類型而變化。


          從表中可以明顯看出,將數字從較高精度的數據類型直接轉換為較低精度的數據類型可能會導致值的表示誤差。這些誤差稱為量化誤差。在深度神經網絡中出現此類誤差可能造成嚴重的后果的,因此將模型直接類型轉換為較低的精度并非易事。我們將在本節(jié)討論最小化此類誤差的方法。

          理論上我們可以使用 n 位表示最多 2^n 個不同的值。由于鴿巢原理(pigeonhole principle,狄利克雷抽屜原理),由較高精度數據類型表示的整個范圍映射到較低精度數據類型必然會增加量化誤差。但是如果我們知道要先驗轉換的分布的知識,那么它能被用來最小化誤差嗎?


          從FP32到INT8 的代表性映射。

          FP32 可以表示介于 3.4 * 103? 和 -3.4 * 103? 之間的范圍。但是大多數深度網絡模型的權重在它們的權重和激活方面沒有如此大的變化。如果我們事先知道或可以估計我們的輸入范圍,我們就可以確定我們輸入數據的范圍(而不是整個 FP32 范圍)與較低精度數據類型的整個范圍之間的關系,這就可以使映射變得更優(yōu)化。

          讓我們假設輸入數據的分布范圍是先驗已知的,并以從浮點集(FP32)到整數(INT8)的轉換為例討論轉換過程。


          深度學習中的量化


          現在讓我們介紹一下量化在深度學習中的應用。在深度神經網絡中模型參數存儲為浮點值,模型的前向纏脖涉及一系列浮點運算。所以對于深度學習量化是指對精度要求較低的數據類型中的權重和激活進行量化,如下圖所示。


          偏置層沒有量化嗎?在實踐中,偏置層通常從浮點數量化到 INT32 精度,而不是降低到 INT8 精度,因為偏置的數量比權重/卷積層少得多。使用更大尺寸的 INT32 對深度神經網絡模型的體量來說是微不足道的。

          量化權重向量

          在實踐中這是一個簡單的步驟,因為我們通常可以看到模型的權重并且在量化給定層的情況下,權重可以用作先驗。我們觀察到神經網絡權值的分布通常在一個很小的范圍內,非常接近于0。下圖顯示了Alexnet模型和MobileNet v1模型中一些卷積和全連接層的權重分布。這個有限的范圍使得映射到較低精度的數據類型更不容易出現量化誤差。


          量化激活

          與模型的權重不同,神經網絡層的激活根據提供給模型的輸入數據而變化,并且為了估計激活范圍,需要一組具有代表性的輸入數據樣本。因此量化激活是一個依賴于數據的過程,需要額外的數據來校準神經網絡層的輸出。我們可以使用不同的方法來確定比例因子和模型權重和激活的零點,我們將在下一節(jié)中討論。

          量化類型


          Pytorch、Tensorflow 等現代深度學習框架都支持不同類型的量化。我們可以將量化算法分類成兩大類:

          1. 訓練后量化:在模型完全訓練后執(zhí)行
          2. 量化感知訓練:訓練是在量化約束下完成的

          1)訓練后量化

          在這種方法中,量化是在模型完全訓練后執(zhí)行的。由于權重在訓練后是固定的權重的映射很容易計算,因為層的激活值根據傳遞的輸入張量而變化, 所以在訓練后計算激活范圍就比較麻煩,這里有兩種處理方法:

          a) 動態(tài)訓練后量化:

          這涉及根據運行時輸入到模型的數據分布,在推理過程中動態(tài)微調激活范圍。這種方法最容易實現,因為量化不需要額外的步驟。由于不需要額外的數據,這種方法最適合難以生成詳盡數據分布的情況——例如:序列到序列模型。但是在運行時使用指數移動平均線來估計激活范圍會增加模型延遲。

          b) 靜態(tài)訓練后量化:

          這種方法會涉及額外的校準步驟,例如使用代表性數據集來估計使數據集變化的激活范圍。為保證最大程度地減少誤差,這種估計會以全精度數據進行,然后將激活按比例縮小到較低精度的數據類型。由于在運行期間的推理過程中沒有進行額外的計算,因此這種方法生成的模型速度最快(延遲最少)。

          使用訓練后量化的主要優(yōu)點是不需要在整個數據集上進行訓練,8 位或 16 位量化可以應用于任何現有的預訓練模型。像 Pytorch 和 Tensorflow 這樣的現代深度學習框架對這些方法都有官方實現。但是這種策略會由于量化誤差而導致一些(通常是輕微的)精度損失。這些誤差可以在訓練過程中通過使用一個技巧來進一步減輕,我們將在下一節(jié)討論。

          2)量化感知訓練

          量化感知訓練 (QAT) 試圖解決由于模型訓練過程中的量化誤差而導致的精度損失的問題。在前向傳遞中QAT 在權重和激活計算期間復制量化行為,而損失計算和損失的反向傳播保持不變(保持更高的精度)。這個想法是由 Jacob等人提出的。


          使用 QAT,所有模型權重和激活在前向傳遞期間都被“偽量化”:也就是說浮點值被四舍五入以模擬較低精度(通常是 int8)值,但所有其他計算仍然使用浮點數完成。由于訓練過程中的所有權重調整都是在“意識到”模型最終會被量化的情況下進行的,因此在量化之后這種方法通常會產生比其他方法更高的準確率,并且訓練后的量化模型與全精度相比幾乎無損。

          自動混合精度量化

          作為QAT的擴展,在某些情況下仍不可能將某些層的輸入域的整個范圍完全擬合到較低精度的量化范圍中。這種情況下使用更高的精度值保留這些層是有益的。隨著自動混合精度訓練的引入這一問題在很大程度上得到了解決,自動混合精度訓練涉及到在訓練時間內根據層的激活范圍來確定單個層的量化,并且對模型的精度沒有影響。

          量化類型的總結

          下表從數據集需求和涉及的權衡方面總結了上面的討論。


          可概括為以下流程圖:


          模型的基準測試


          在本節(jié)中,我們將研究這些量化方法在各種實際模型中的影響。正如預期的那樣,我們看到量化感知訓練(QAT)在準確性和延遲方面比訓練后量化表現得更好。經過量化后大多數模型的精度都有小幅下降,但從整體上看延遲的改善可能掩蓋了實際應用中性能的小幅下降。

          CNN 模型對比


          BERT模型對比


          各種類型的量化速度對比


          總結


          在這篇文章中我們討論了各種量化方法,這些方法可用于壓縮深度神經網絡,同時對模型的準確性影響最小。我們經常使用包括量化在內的各種技術來優(yōu)化我們的模型。量化作為常用的模型壓縮方式,在生產環(huán)境中得到了廣泛的應用。

          編輯:于騰凱
          校對:李敏
          瀏覽 70
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美一级看片a免费观看 | 日本黄色视频一级 | 欧美性爱第四页 | 欧美成人性爱在线观看 | 黄色小说片五月 |