MODEL COMPRESSION VIA DISTILLATION AND QUANTIZATION 论文笔记
- 摘要
深度神經網絡(DNN)繼續(xù)取得重大進展,解決從圖像分類到翻譯或強化學習的任務。受到相當大關注的領域的一個方面是在資源受限的環(huán)境中有效地執(zhí)行深度模型,例如移動或嵌入式設備。本文重點討論了這個問題,并提出了兩種新的壓縮方法,它們共同利用大型網絡稱為“教師”的權重量化和蒸餾,進入壓縮的“學生”網絡。我們提出的第一種方法稱為量化蒸餾,并在訓練過程中利用蒸餾,將蒸餾損失(相對于教師網絡表示)納入較小的學生網絡的訓練,其權重被量化為有限的一組水平。第二種方法,可微分量化,通過隨機梯度下降優(yōu)化量化點的位置,以更好地適應教師模型的行為。我們通過卷積和循環(huán)體系結構的實驗來驗證這兩種方法。我們表明,量化的淺學生可以達到與最先進的全精度教師模型相似的準確度水平,同時提供高達數量級的壓縮,并且推理加速在深度減少中幾乎是線性的。總而言之,我們的結果使得資源受限環(huán)境的DNN能夠利用在功能更強大的設備上開發(fā)的架構和精度提升。
- 預處理
- 量化過程
我們首先定義一個縮放函數sc:R->[0; 1],將值從任意范圍得到的矢量歸一化為值為[0;1]。 給定這樣的函數,量化函數的一般結構如下:(見論文公式1)
縮放。 縮放功能有各種規(guī)格; 在本文中,我們將使用線性縮放,量化函數可以改寫為論文公式2
Bucketing。 該公式的一個問題是對于整個矢量使用相同的比例因子,其維度可能很大。 幅度不平衡會導致精度的顯著損失,其中縮放矢量的大多數元素被推到零。 為避免這種情況,我們將使用分段,例如 Alistarh等人(2016),也就是說,我們將縮放函數分別應用于某個固定大小的連續(xù)值的bucketing。 這里的權衡是我們?yōu)槊總€bucketing獲得更好的量化精度,但是必須為每個bucketing存儲兩個浮點縮放因子。 我們在第5節(jié)中描述了壓縮比較。函數Q^也可以用幾種方式定義。 我們將考慮量化點的均勻和非均勻放置。
均勻量化。 我們固定了參數s≥1,描述了所采用的量化級數。 直觀地,均勻量化考慮在0和1之間的s + 1個等間隔點(包括這些端點)。 確定性版本將每個(縮放的)矢量坐標vi分配給最接近的量化點,而在隨機版本中,我們概率地執(zhí)行舍入,使得得到的值是的vi的無偏估計,具有最小方差。
非均勻量化。 非均勻量化將一組量化點作為輸入p1::: ps并將每個元素vi量化為這些點中最接近的點。 為簡單起見,我們僅定義此函數的確定性版本。
- 隨機量化等于增加高斯噪聲
在本節(jié)中,我們列出了均勻量化函數的一些有趣的數學屬性。 顯然,隨機均勻量化是其輸入的無偏估計E[Q(v)]=v
我們感興趣的是將此功能應用于神經網絡; 由于標量積是神經網絡最常用的運算,我們想研究QT(v)?x的性質,其中v是網絡中某個層的權重向量,x是輸入。 見論文公式(5)
這意味著量化權重等效于向每個層的輸出(在激活函數之前)添加漸近正態(tài)分布的零均值誤差項。 該誤差項的方差取決于s。 這將量化與主張將噪聲添加到神經網絡的中間激活中作為正則化器聯系起來,例如 Gulcehre等(2016)。
- 量化蒸餾
上下文如下:給定一項任務,我們考慮一個訓練有素的最先進的深層模型來解決它 - 教師和壓縮的學生模型。 學生被壓縮的意思是1)它比老師淺; 2)它的量化是在其權重以有限的比特寬度表示的意義上。 標準蒸餾(Ba&Caruana,2013; Hinton等,2015)的策略是讓學生利用訓練好的教師模型達到類似的準確度。 我們注意到先前已經使用蒸餾來獲得緊湊的高精度合奏編碼(Hinton等,2015),我們相信這是第一次通過量化用于模型壓縮。
鑒于此設置,我們需要解決兩個問題。 首先是如何將知識從老師轉移到學生。 為此,學生將使用Hinton等人定義的蒸餾損失(2015),作為兩個目標函數之間的加權平均值:具有軟目標的交叉熵,由溫度參數T控制,以及具有正確標簽的交叉熵。 我們將讀者推薦給Hinton等人。 (2015)關于蒸餾損失的精確定義。
第二個問題是如何在量化神經網絡的背景下使用蒸餾損失。一種直觀的方法是依靠投影梯度下降,其中在全精度訓練中采用梯度步驟,然后將新參數投影到一組有效解。關鍵的是,我們將每個投影步驟的誤差累積到下一步的梯度中。人們可以將這個過程想象成收集每個權重是否需要移動到下一個量化點的證據。至關重要的是,如果梯度很小,誤差累積會阻止算法卡在當前解決方案中,這會在天真的投影梯度方法中發(fā)生。這與BinaryConnect技術采用的方法類似,但存在一些差異。李等人(2017)也詳細檢查了這些動態(tài)。與BinnaryConnect相比,我們使用蒸餾而不是從頭開始學習,因此學習更有效。我們也不限于二進制表示,而是使用可變的位寬量化功能和bucketing,如第2節(jié)中所定義。
圖1所示的該過程的另一種觀點是,我們在全精度模型上執(zhí)行SGD步驟,但計算量化模型上的梯度,表示相對于蒸餾損失。 考慮到這一切,我們提出的算法是:
- 可區(qū)分的量化
- 一般說明
我們通過利用非均勻量化點放置,引入可微分量化作為提高量化神經網絡精度的一般方法。 特別是,我們將使用2.1節(jié)中定義的非均勻量化函數。 實驗上,我們發(fā)現在這種情況下隨機和確定性量化之間幾乎沒有區(qū)別,因此這里將集中于更簡單的確定性量化函數。
令p =(p1; :::; ps)為量化點的矢量,并且讓為我們的量化函數,如前所述。 理想情況下,我們希望找到一組量化點p,它們在使用Q(v; p)量化模型時最小化精度損失。 關鍵的觀察是,為了找到這個集合p,我們可以使用隨機梯度下降,因為我們能夠計算Q相對于p的梯度。
量化神經網絡的一個主要問題是,pi應該替換給定權重的決定是離散的,因此梯度為零:?Q(v; p)/?v=0幾乎無處不在:這意味著我們不能通過量化函數反向傳播梯度。 為了解決這個問題,通常使用直通估計器的變體,參見例如 Bengio等(2013)Hubara等(2016)。 另一方面,作為所選擇的pi的函數的模型是連續(xù)的并且可以區(qū)分; 關于pj的Q(v; p)i的梯度幾乎無處不在,并且很簡單
?
其中αi是縮放因子的第i個元素,假設我們使用的是bucketing方案。 如果沒有使用bucketing,則αi =α。 否則它會根據權重vi所屬的bucketing而改變。
因此,我們可以使用我們在訓練原始模型時使用的相同損失函數,并且利用上述公式和通常的反向傳播算法,我們能夠相對于量化點p計算其梯度。 然后我們可以使用標準SGD算法最小化關于p的損失函數。 然后算法變?yōu)橐韵?#xff1a;
關于效率的說明。 優(yōu)化點p可能比訓練原始網絡慢,因為我們必須執(zhí)行正常的前向和后向傳遞,此外我們需要量化模型的權重并執(zhí)行向后傳遞以獲得p的梯度。 然而,根據我們的經驗,差分量化需要一個數量級的迭代,以便收斂到一個好的解決方案,并且可以有效地實現。
權重共享。 經過仔細檢查,這種方法可以與權重共享聯系起來,Han等人(2015年)。 權重共享使用k均值聚類算法來找到權重的良好聚類,采用質心作為聚類的量化點。 訓練網絡修改質心的值,以類似的方式聚合梯度。 不同之處在于對質心點的初始分配,更重要的是,質心的權重分配從未改變。 相反,在每次迭代時,我們將權重重新分配給最接近的量化點,并使用不同的初始化。
- 討論和附加的啟發(fā)式
雖然損失關于p是連續(xù)的,但是改變每個權重量化的方式時會產生間接影響。 這會對學習過程產生重大影響。 作為一個極端的例子,我們可以有退化,其中所有權重都由相同的量化點表示,使得學習變得不可能。 或者pi的多樣性減少,導致非常少的權重以非常高的精度表示,而其余的權重被迫以更低的分辨率表示。
為避免此類問題,我們依賴于以下一組啟發(fā)式方法。 未來的工作將考慮為如何將pi分配給權重添加強化學習損失。
選擇好的起點。 初始化起始量化點的一種方法是使它們均勻間隔,這將對應于用作均勻量化函數的起始點。 可微分量化算法需要能夠使用量化點來更新它; 因此,為了確保使用每個量化點,我們將點初始化為權重值的分位數。 這確保了每個量化點與相同數量的值相關聯,并且我們能夠更新它。
在重要的位置重新分配位。 并非網絡中的所有層都需要相同的準確度。 每個權重對最終預測的重要程度的度量是每個權重向量的梯度的范數。 因此,在初始階段,我們運行前向和后向傳遞一定次數來估計每層中權重向量的梯度,我們計算多個minibatchs的平均梯度并計算范數; 然后,我們根據簡單的線性比例分配與每個權重相關聯的點數。 總之,我們估計
我們使用此值來確定哪些層對量化最敏感
使用此過程時,我們將在某些層中使用超過指定位數的值,而在其他層中使用的位數則更少。 我們可以通過使用霍夫曼編碼來減少這種效應的影響,參見第5節(jié); 在任何情況下,請注意,雖然點的總數保持不變,但如果圖層具有較大比例的權重,則為圖層分配更多點將增加整體位復雜度。
使用蒸餾損失。 在上面描述的算法中,損失是指我們用于訓練原始模型的損失。 另一種可能的規(guī)范是將未量化的模型視為教師模型,將量化模型視為學生,并將未量化和量化模型的輸出之間的蒸餾損失用作損失。 在這種情況下,我們正在優(yōu)化我們的量化模型,使其不是在原始損失方面表現最佳,而是模仿未量化模型的結果,這應該更容易學習模型并提供更好的結果。
超參數優(yōu)化。 上述算法是一個與原始算法非常相似的優(yōu)化問題。 像往常一樣,為了獲得最佳結果,我們應該嘗試使用超參數優(yōu)化和不同的梯度下降變體。
- 壓縮
我們現在分析使用b位和bucketing大小為k時節(jié)省的空間。 令f為全精度權重(32位)的大小,并且令N為“vector”的大小,我們正在量化。 全精度需要fN位,而量化矢量需要bN + 2fN/k。 (我們使用每權重b位,為每個bucketing加上縮放因子)。 因此,尺寸增加
對于可微分量化,我們還必須存儲量化點的值。 由于這個數字不依賴于N,所需的空間量可以忽略不計,為簡單起見我們忽略它。 例如,在256個bucketing大小時,每個組件使用2個比特對于全精度可以節(jié)省14.2倍的空間,而4位可節(jié)省7.52倍的空間。 在512個bucketing大小時,2比特節(jié)省是15.05倍,而4比特產生7.75倍壓縮。
霍夫曼編碼。 為了節(jié)省額外的空間,我們可以使用霍夫曼編碼來表示量化值。 實際上,每個量化值可以被認為是指向全精度值的指針; 在非均勻量化的情況下是pk,在均勻量化的情況下是k = s。 然后,我們可以計算模型所有權重的每個索引的頻率,并計算最佳霍夫曼編碼。 最佳編碼的平均比特長度是我們實際用于編碼值的比特量。 這解釋了附錄中某些尺寸增益表中存在小數位。
- 實驗結果
- 小數據集
方法。 我們將從較小數據集的一組實驗開始,這使我們可以更仔細地覆蓋參數空間。 我們將以下方式描述的方法的性能進行比較:我們將教師模型,蒸餾模型和較小模型視為基線:蒸餾模型和較小模型具有相同的結構,但蒸餾模型在有老師網絡的情況下使用蒸餾損失進行訓練。而較小的模型直接訓練目標。 此外,我們比較量化蒸餾和可微分量化的性能。 此外,我們還將在有和沒有bucketing的情況下使用PM(“事后”)量化,其在訓練之后均勻地量化權重而無需任何額外的操作。 所有結果都是在bucketing大小為256的情況下獲得的,我們發(fā)現這些結果可憑經驗提供良好的壓縮精度權衡。 有關數據集和模型的詳細信息,請參閱附錄A.
CIFAR-10實驗。 對于CIFAR-10上的圖像分類,我們測試了不同訓練技術對蒸餾模型精度的影響,同時改變了CNN架構的參數,例如量化級別和模型大小。 表1包含全精度訓練,有和沒有bucketing的PM量化以及我們的方法的結果。 定義的學生模型的下方左側的百分比分別是普通模型和蒸餾模型的精度(以全精度訓練)。 更多細節(jié)見附錄表11。 我們還嘗試了一個額外的模型,其中學生比老師更深,在那里我們獲得量化為4位的學生能夠比老師獲得更高的準確度,壓縮率大于7倍。
我們使用廣泛的殘差網絡(Zagoruyko&Komodakis,2016)進行了可進行差分量化的額外實驗,從而獲得更高的精度; 見表3。
總的來說,量化蒸餾似乎是在整個位寬和體系結構范圍內具有最佳精度的方法。 它對于2位和4位量化顯著優(yōu)于PM,在較大的8bits學生模型上比教師的獲得相差0.2%以內的準確度,在4位量化時實現相對較小的準確度損失。 在所有實驗中,可微分量化是緊隨其后的第二,但它具有更快的收斂速度。 此外,我們強調了在更高的位寬(4和8位)更簡單的帶bucketing的PM量化方法的良好準確性。
?
轉載于:https://www.cnblogs.com/dushuxiang/p/10304622.html
總結
以上是生活随笔為你收集整理的MODEL COMPRESSION VIA DISTILLATION AND QUANTIZATION 论文笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 26 Remove D
- 下一篇: 解决 WIndows,Linux 以及