神經(jīng)網(wǎng)絡(luò)中的量化與蒸餾
本文將深入研究深度學習中精簡模型的技術(shù):量化和蒸餾
深度學習模型,特別是那些具有大量參數(shù)的模型,在資源受限環(huán)境中的部署幾乎是不可能的。所以就出現(xiàn)了兩種流行的技術(shù),量化和蒸餾,它們都是可以使模型更加輕量級,而不會對性能造成太大影響。但是它們需要什么,它們又如何比較呢?
量化:犧牲精度換取效率
量化是關(guān)于數(shù)字精度的。通過減少模型中權(quán)重和激活的位寬度,縮小模型大小,從而潛在地提高推理速度。
神經(jīng)網(wǎng)絡(luò)有相互連接的神經(jīng)元,每個神經(jīng)元都有在訓練過程中調(diào)整的權(quán)重和偏差。這些參數(shù)值一般存儲在32位浮點數(shù)中,這樣雖然保證了精度,但占用了大量內(nèi)存。例如,一個50層的ResNet需要168MB來存儲2600萬32位權(quán)重值和1600萬32位激活值。
量化旨在通過使用較低的位數(shù)(如8位整數(shù))來表示權(quán)重和激活,來減少內(nèi)存占用。但這引入了量化誤差,所以量化的目標是在精度和內(nèi)存使用之間取得平衡。像每通道量化、隨機舍入和再訓練這樣的先進技術(shù)可以最大限度地減少對模型精度的影響。
最常見的兩種量化情況是:float32 -> float16和float32 -> int8。
量化背后的數(shù)學理論:
上面公式提供了一種將實數(shù)轉(zhuǎn)換為量化整數(shù)的簡單且計算效率高的方法,使其成為許多量化方案中的流行選擇。
如何量化機器學習模型?
訓練后量化:這就像用一支普通的筆寫整本書,在你寫完之后,用一支更好的更細筆重寫它,使它更小。你不需要改變故事的任何內(nèi)容;只要把字改小一點就行了。這是非常容易的,但有時較小的文字可能更難閱讀(這意味著神經(jīng)網(wǎng)絡(luò)的準確性可能會下降)。
量化感知訓練:這就像從一開始就用一支好筆寫書。當你寫的時候,你會意識到字母應(yīng)該有多小,所以你會在寫的時候調(diào)整你的寫作風格。這樣最終小版本從一開始就更容易閱讀,因為你一直在為小版本的書進行考慮(這意味著神經(jīng)網(wǎng)絡(luò)從一開始就被訓練成可以很好地與更小的量化版本一起工作)。
在這兩種情況下,目標都是使書(或神經(jīng)網(wǎng)絡(luò))更小、更高效,同時又不失去故事的本質(zhì)(或網(wǎng)絡(luò)的準確性)。
優(yōu)點:
- 減小模型大小:例如,從32位浮點數(shù)轉(zhuǎn)換為8位整數(shù)可以將模型大小減小四倍。
- 速度和硬件兼容性:在特定的硬件加速器上,低精度的算法可以更快。
- 內(nèi)存效率:更少的數(shù)據(jù)意味著更少的內(nèi)存帶寬需求。
缺點
- 準確性權(quán)衡:較低的精度有時會影響模型性能。
- 實現(xiàn)挑戰(zhàn):量化,特別是量化感知訓練,可能會很棘手。
蒸餾:老師到學生傳遞知識
蒸餾包括訓練一個較小的神經(jīng)網(wǎng)絡(luò)(稱為學生)來模仿一個更大的預訓練網(wǎng)絡(luò)(即教師)。
下面的舉例我們都以書籍寫作為例,這樣可以更加清晰
從廣義上講,蒸餾有三種類型的分類:
離線蒸餾:一個作家正在從一本已經(jīng)出版的成功的書中學習。出版的書(教師模型)是完整和固定的。新作者(學生模式)從這本書中學習,試圖根據(jù)所獲得的見解寫出自己的作品。在神經(jīng)網(wǎng)絡(luò)的背景下,這就像使用一個經(jīng)過充分訓練的、復雜的神經(jīng)網(wǎng)絡(luò)來訓練一個更簡單、更有效的網(wǎng)絡(luò)。學生網(wǎng)絡(luò)從教師的既定知識中學習,而不修改它。
在線蒸餾:想象一個有作家和一個經(jīng)驗豐富的作家同時寫他們的書。當經(jīng)驗豐富的作者開發(fā)新的章節(jié)(更新教師模型)時,新作者也會編寫他們的章節(jié)(更新學生模型),并在此過程中向經(jīng)驗豐富的作者學習。這兩本書同時寫作,兩個作者的作品相互啟發(fā)。在神經(jīng)網(wǎng)絡(luò)中,這意味著同時訓練教師和學生模型,讓他們一起學習和適應(yīng),增強學生模型的學習過程。
自蒸餾:一本書作者既是老師又是學生。他以目前的技能水平開始寫書。當他獲得新的見解并提高寫作水平時,會修改前面的章節(jié)。這是一種自學習的模式,作者根據(jù)自己不斷發(fā)展的理解不斷完善自己的作品。在神經(jīng)網(wǎng)絡(luò)中,這種方法涉及單個網(wǎng)絡(luò)學習和自我改進,使用其更高級的層或后期的訓練來增強其較早的層或初始階段,有效地教會自己變得更高效和準確。
蒸餾背后的數(shù)學理論:
精餾的目的是盡量減少教師預測和學生預測之間的差異。這種散度最常用的度量是Kullback-Leibler散度:
優(yōu)點
- 大小靈活性:學生模型的架構(gòu)或大小可以定制,從而在大小和性能之間提供平衡。
- 精度更好:一個訓練有素的學生模型可以達到接近老師的成績,并且更小。
缺點
- 再訓練是必須的:與量化不同,蒸餾要求對學生模型進行再訓練
- 訓練開銷:訓練學生模型需要時間和計算資源。
總結(jié)
量化通常在特定于硬件的部署中找到它的位置,而精餾則是在需要性能接近大型對應(yīng)模型的輕量級模型時需要的方法。在許多情況下,兩者可以結(jié)合——提煉一個模型,然后量化它——可以帶來兩個方法的好處。將選擇與部署需求、可用資源以及在準確性和效率方面的可接受權(quán)衡相結(jié)合是至關(guān)重要的。