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