量化、剪枝、蒸餾,這些大模型黑話到底說了些啥?
量化、剪枝、蒸餾,如果你經(jīng)常關(guān)注大語言模型,一定會(huì)看到這幾個(gè)詞,單看這幾個(gè)字,我們很難理解它們都干了些什么,但是這幾個(gè)詞對(duì)于現(xiàn)階段的大語言模型發(fā)展特別重要。這篇文章就帶大家來認(rèn)識(shí)認(rèn)識(shí)它們,理解其中的原理。
模型壓縮
量化、剪枝、蒸餾,其實(shí)是通用的神經(jīng)網(wǎng)絡(luò)模型壓縮技術(shù),不是大語言模型專有的。
模型壓縮的意義
通過壓縮,模型文件會(huì)變小,其使用的硬盤空間也會(huì)變小,加載到內(nèi)存或者顯存時(shí)使用的緩存空間也會(huì)變小,并且模型的運(yùn)行速度還可能會(huì)有一些提高。
通過壓縮,使用模型將消耗更少的計(jì)算資源,這可以極大的擴(kuò)展模型的應(yīng)用場(chǎng)景,特別是對(duì)模型大小和計(jì)算效率比較關(guān)注的地方,比如手機(jī)、嵌入式設(shè)備等。
壓縮的是什么?
壓縮的是模型的參數(shù),模型的參數(shù)又是什么呢?
你可能聽說過現(xiàn)在的機(jī)器學(xué)習(xí)使用的都是神經(jīng)網(wǎng)絡(luò)模型,神經(jīng)網(wǎng)絡(luò)模型就是模擬人的大腦中的神經(jīng)網(wǎng)絡(luò)。
這里我畫了一個(gè)簡(jiǎn)單的示意圖,大家可以看看。
圖片
簡(jiǎn)單起見,只描述三個(gè)神經(jīng)元:A1、A2、A3,每個(gè)神經(jīng)元都會(huì)接收別的神經(jīng)元的信號(hào),也會(huì)將信號(hào)傳遞給別的神經(jīng)元。
其中A3會(huì)接收A1、A2傳遞過來的信號(hào)I_A1、I_A2,但是A3接收A1、A2信號(hào)的強(qiáng)度是不一樣的(這個(gè)強(qiáng)度稱為“權(quán)重”),假設(shè)這里的強(qiáng)度分別是W_13和W_23,A3會(huì)對(duì)接收到信號(hào)數(shù)據(jù)進(jìn)行加工:
- 首先對(duì)信號(hào)進(jìn)行加權(quán)求和,也就是 I_A1*W_13+I_A2*W_23,
- 然后再加上A3自己的一個(gè)參數(shù) B_3(稱為“偏置”),
- 最后再把這個(gè)數(shù)據(jù)和轉(zhuǎn)換為特定的形式,并把轉(zhuǎn)換后的信號(hào)再發(fā)給下一個(gè)神經(jīng)元。
在這個(gè)信號(hào)數(shù)據(jù)的加工過程中,用到的權(quán)重(W_13、W_23)和偏置( B_3 )就是模型的參數(shù),當(dāng)然模型還有其它一些參數(shù),不過權(quán)重和偏置一般是所有參數(shù)中的大頭,如果用二八原則來劃分,應(yīng)該都在80%以上。
使用大語言模型生成文本時(shí),這些參數(shù)都已經(jīng)是預(yù)訓(xùn)練好的,我們并不能對(duì)它們進(jìn)行修改,這就像數(shù)學(xué)中多項(xiàng)式的系數(shù),我們只能傳遞未知數(shù)xyz進(jìn)去,然后得到一個(gè)輸出結(jié)果。
模型壓縮就是對(duì)模型的這些參數(shù)進(jìn)行壓縮處理,首要考慮的主要就是權(quán)重和偏置,使用的具體方法就是本文重點(diǎn)要介紹的量化、剪枝和蒸餾。
量化
量化就是降低模型參數(shù)的數(shù)值精度,比如最開始訓(xùn)練出的權(quán)重是32位的浮點(diǎn)數(shù),但是實(shí)際使用發(fā)現(xiàn)用16位來表示也幾乎沒有什么損失,但是模型文件大小降低一般,顯存使用降低一半,處理器和內(nèi)存之間的通信帶寬要求也降低了,這意味著更低的成本、更高的收益。
這就像按照菜譜做菜,你需要確定每種食材的重量。你可以使用一個(gè)非常精確的電子秤,它可以精確到0.01克,這固然很好,因?yàn)槟憧梢苑浅>_地知道每樣食材的重量。但是,如果你只是做一頓家常便飯,實(shí)際上并不需要這么高的精度,你可以使用一個(gè)簡(jiǎn)單又便宜的秤,最小刻度是1克,雖然不那么精確,但是足以用來做一頓美味的晚餐。
圖片
量化還有一個(gè)好處,那就是計(jì)算的更快。現(xiàn)代處理器中通常都包含了很多的低精度向量計(jì)算單元,模型可以充分利用這些硬件特性,執(zhí)行更多的并行運(yùn)算;同時(shí)低精度運(yùn)算通常比高精度運(yùn)算速度快,單次乘法、加法的耗時(shí)更短。這些好處還讓模型得以運(yùn)行在更低配置的機(jī)器上,比如沒有高性能GPU的普通辦公或家用電腦、手機(jī)等移動(dòng)終端。
沿著這個(gè)思路,人們繼續(xù)壓縮出了8位、4位、2位的模型,體積更小,使用的計(jì)算資源更少。不過隨著權(quán)重精度的降低,不同權(quán)重的值會(huì)越來越接近甚至相等,這會(huì)降低模型輸出的準(zhǔn)確度和精確度,模型的性能表現(xiàn)會(huì)出現(xiàn)不同程度的下降。
量化技術(shù)有很多不同的策略和技術(shù)細(xì)節(jié),比如如動(dòng)態(tài)量化、靜態(tài)量化、對(duì)稱量化、非對(duì)稱量化等,對(duì)于大語言模型,通常采用靜態(tài)量化的策略,在模型訓(xùn)練完成后,我們就對(duì)參數(shù)進(jìn)行一次量化,模型運(yùn)行時(shí)不再需要進(jìn)行量化計(jì)算,這樣可以方便地分發(fā)和部署。
剪枝
剪枝就是去掉模型中不重要的或者很少會(huì)用到的權(quán)重,這些權(quán)重的數(shù)值一般都接近于0。對(duì)于某些模型,剪枝可以產(chǎn)生比較高的壓縮比,讓模型更加緊湊和高效。這對(duì)于在資源受限的設(shè)備上或者內(nèi)存和存儲(chǔ)有限的情況下部署模型特別有用。
剪枝還會(huì)增強(qiáng)模型的可解釋性。通過刪除不必要的組件,剪枝使模型的底層結(jié)構(gòu)更加透明且更易于分析。這對(duì)于理解神經(jīng)網(wǎng)絡(luò)等復(fù)雜模型的決策過程十分重要。
剪枝不僅涉及權(quán)重參數(shù)的剪枝,還可以剪除某些神經(jīng)元節(jié)點(diǎn),如下圖所示:
圖片
注意剪枝并非適合所有的模型,對(duì)于一些稀疏模型(大部份參數(shù)都為0或者接近于0),剪枝可能沒什么效果;對(duì)于一些參數(shù)比較少的小型模型,剪枝可能導(dǎo)致模型性能的明顯下降;對(duì)于一些高精度的任務(wù)或者應(yīng)用,也不適合對(duì)模型進(jìn)行剪枝,比如醫(yī)療診斷這種人命關(guān)天的事。
在實(shí)際運(yùn)用剪枝技術(shù)時(shí),通常需要綜合考慮剪枝對(duì)模型運(yùn)行速度的提升和對(duì)模型性能的負(fù)面影響,采取一些策略,比如給模型中的每個(gè)參數(shù)打分,也就是評(píng)估參數(shù)對(duì)模型性能的貢獻(xiàn)有多大。分?jǐn)?shù)高的,就是絕對(duì)不能剪掉的重要參數(shù);分?jǐn)?shù)低的,就是可能不那么重要,可以考慮剪掉的參數(shù)。這個(gè)分?jǐn)?shù)可以通過各種方法計(jì)算,比如看參數(shù)的大小(絕對(duì)值大的通常更重要),或者通過一些更復(fù)雜的統(tǒng)計(jì)分析方法來確定。
蒸餾
蒸餾就是把大模型學(xué)習(xí)到的概率分布直接復(fù)制到一個(gè)小模型中。被復(fù)制的模型稱為教師模型,一般是參數(shù)量較大、性能很強(qiáng)的優(yōu)秀模型,新模型稱為學(xué)生模型,一般是參數(shù)比較少的小模型。
蒸餾時(shí),教師模型會(huì)根據(jù)輸入生成多個(gè)可能輸出的概率分布,然后學(xué)生模型學(xué)習(xí)這個(gè)輸入和輸出的概率分布情況。經(jīng)過大量訓(xùn)練,學(xué)生模型就可以模仿教師模型的行為,或者說學(xué)習(xí)到了教師模型的知識(shí)。
比如在圖像分類任務(wù)中,給出一張圖,教師模型可能會(huì)輸出類似如下的概率分布:
- 貓:0.7
- 狗:0.4
- 車:0.1
然后把這張圖和輸出的概率分布信息一起提交給學(xué)生模型進(jìn)行模仿學(xué)習(xí)。
圖片
因?yàn)檎麴s是把教師模型的知識(shí)壓縮到一個(gè)更小更簡(jiǎn)單的學(xué)生模型中,新的模型可能會(huì)丟失一些信息;另外學(xué)生模型可能過度依賴教師模型,導(dǎo)致模型的泛化能力不佳。
為了讓學(xué)生模型的學(xué)習(xí)效果更好,我們可以采用一些方法和策略。
引入溫度參數(shù):假設(shè)有一位老師講課速度非???,信息密度很高,學(xué)生可能有點(diǎn)難以跟上。這時(shí)如果老師放慢速度,簡(jiǎn)化信息,就會(huì)讓學(xué)生更容易理解。在模型蒸餾中,溫度參數(shù)起到的就是類似“調(diào)節(jié)講課速度”的作用,幫助學(xué)生模型(小模型)更好地理解和學(xué)習(xí)教師模型(大模型)的知識(shí)。專業(yè)點(diǎn)說就是讓模型輸出更加平滑的概率分布,方便學(xué)生模型捕捉和學(xué)習(xí)教師模型的輸出細(xì)節(jié)。
調(diào)整教師模型和學(xué)生模型的結(jié)構(gòu):一個(gè)學(xué)生想要從一個(gè)專家那里學(xué)點(diǎn)東西可能是很難的,因?yàn)樗麄冎g的知識(shí)差距太大,直接學(xué)習(xí)可能會(huì)聽不懂,這時(shí)候可以在中間加入一個(gè)老師,它既能理解專家的話,又能轉(zhuǎn)化為學(xué)生可以聽懂的語言。中間加入的這個(gè)老師可能是一些中間層或者輔助神經(jīng)網(wǎng)絡(luò),或者這個(gè)老師可以對(duì)學(xué)生模型進(jìn)行一些調(diào)整,讓它能更匹配教師模型的輸出。
上邊我們介紹了三種主要的模型壓縮技術(shù),其實(shí)這里邊還有很多的細(xì)節(jié),不過對(duì)于理解原理差不多已經(jīng)夠了,也還有其它一些模型壓縮技術(shù),比如低秩分解、參數(shù)共享、稀疏連接等,有興趣的同學(xué)可以多去查查相關(guān)內(nèi)容。
另外模型壓縮后,其性能可能會(huì)出現(xiàn)比較明顯的下降,此時(shí)我們可以對(duì)模型進(jìn)行一些微調(diào),特別是一些對(duì)模型精度要求比較高的任務(wù),比如醫(yī)學(xué)診斷、金融風(fēng)控、自動(dòng)駕駛等,微調(diào)可以讓模型的性能得到一定的恢復(fù),穩(wěn)固其在某些方面的準(zhǔn)確性和精確性。
談到模型微調(diào),最近我在AutoDL上分享了一個(gè) Text Generation WebUI 的鏡像,Text Generation WebUI 是一個(gè)使用Gradio編寫的Web程序,可以方便的對(duì)大語言模型進(jìn)行推理、微調(diào),支持多種類型的大語言模型,包括Transformers、llama.cpp(GGUF)、GPTQ、AWQ、EXL2等多種格式的模型,在最新的鏡像中,我已經(jīng)內(nèi)置了Meta最近開源的 Llama3 大模型,感興趣的同學(xué)可以去體驗(yàn)下,使用方法參見:十分鐘學(xué)會(huì)微調(diào)大語言模型
圖片
參考文章:
https://zhuanlan.zhihu.com/p/75879624
https://medium.com/fintechexplained/neural-networks-bias-and-weights-10b53e6285da
https://botpenguin.com/glossary/pruning
https://www.sciencedirect.com/science/article/abs/pii/S0925231221011917
https://medium.com/@jan_marcel_kezmann/master-the-art-of-quantization-a-practical-guide-e74d7aad24f9