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