量化(quantization)
/ kwon-tih-ZAY-shun /
量化,是透過用「精度低得多」的方式來儲存模型的數字,從而把一個練好的模型縮小——拿粗糙的整數台階,去替代精細的小數值。想像你描述每一種油漆顏色時,都不再給出精確配方,而只報它在一本 256 色色卡裡最接近的那一格。你失去了一些微妙,可描述本身急劇變小、處理起來也快了許多。模型那數以百萬計的參數,本來以詳盡的 32 位元或 16 位元數字存著,如今被捨入到一張粗得多的網格上——通常是 8 位元,有時低到 4 位元。
回報是實打實而且很大的:一個 8 位元模型大約只有 32 位元版本的四分之一大,佔的記憶體更少,跑得也更快,因為晶片搬運和相乘的都是更小的數字。正是這一點,讓一個曾經需要機房 GPU 的模型,能在手機或筆電上跑起來。代價,是捨入帶來的一點點準確度損失——仔細做的話通常微不足道,但若壓得太狠、或用在一個脆弱的模型上,偶爾也會變得嚴重。
為什麼這很重要:量化是讓大模型便宜到足以被廣泛部署的、最常用的一招,尤其是在邊緣設備和消費級硬體上。誠實的提醒是:它在定義上就是有損的,損害難以預料、只能去測量而不能想當然,而最省的 4 位元版本,可能悄悄地把品質拉低——這種拉低,要等到用戶撞上某個不巧的問題時才顯形。它是大小、速度與保真度之間一樁實打實的權衡,絕非免費的午餐。
一個在 32 位元裡存為 0.7341892 的權重,被捨入到 8 位元網格上最接近的那一格——比如 0.73。在十億個權重上如此這般,模型就縮小到四分之一,每個值只差那麼一點點。大多數時候這些誤差會相互抵消;偶爾它們也會堆積起來,造成傷害。
把每個值捨入到更粗的網格上——通常以微小的準確度代價,換來四倍的瘦身。
永遠別想當然地以為量化後的模型「基本上一樣」。事後務必拿真實任務重新測一遍它的準確度。損失通常很小,可有時偏偏集中在你最在乎的那些罕見、棘手的情形上——而一個平均分,恰恰能把這一點藏起來。