我們衡量 LLM 壓縮的方式可能錯了
我們都在參加一場競賽。一場將龐大的大型語言模型(LLM)縮小到可以在我們的筆記型電腦、手機,甚至有一天可能在我們的智慧烤麵包機上執行的競賽。首選技術是什麼?量化。將構成模型權重的那些笨重的 16 位浮點數,壓縮到 8 位、4 位甚至 2 位。
社群在這方面已經做得非常出色。我們每週都會看到這樣的頭條新聞:“Mixtral 8x7B 以 4 位執行”、“Llama 3 70B 以 3 位執行”,然後我們都爭相下載 GGUF 或 AWQ 版本。我們檢查 MMLU 分數,發現它只下降了一兩分,就稱之為勝利。
但如果我告訴你,MMLU 分數背後隱藏著一個黑暗的秘密呢?如果我們衡量量化模型“好壞”的整個方法從根本上就是錯誤的呢?
讓我們一起踏上一段小小的旅程。我們將從我們思考量化的標準方式開始,然後慢慢揭開層層面紗,以展示一種更細緻、更強大,坦白說,也更*正確*的方法。
等等,穩定的準確率也可能是壞事?來認識一下“翻轉”
讓我們想象一下你是一名老師。你給你最優秀的學生“FP16-Model”一份有 100 道題的歷史測驗。他們答對了 90 道題。這是你的基準。
現在,你透過一個神秘的過程(量化)建立了這個學生的“克隆體”,名為“INT4-Model”。你給這個克隆體同樣的測驗。他們*也*得了 90/100。太棒了,對吧?這個克隆體同樣聰明!
但當你仔細觀察時,你將他們的答題卡並排比較,發現了一些令人不安的事情。
- FP16-Model 答對的 5 道題,INT4-Model 答錯了。
- FP16-Model 答錯的另外 5 道題,INT4-Model 憑著純粹的運氣或推理方式的改變,答對了。
最終分數完全相同,但學生的*知識*已經被悄悄地破壞了。行為發生了改變。這就是“翻轉”背後的核心思想,這個術語在研究論文 **“你需要的不僅僅是準確率”** 中得到了精彩的闡述。
翻轉是指模型對問題的答案在量化後從錯誤變為正確,或者更令人擔憂地,從正確變為錯誤的任何情況。
這不僅僅是一個假設。看看論文中的資料。他們使用了一個 Llama2-13B 模型並開始對其進行壓縮,同時測量 MMLU 準確率的下降和翻轉的百分比。
看圖的左側。當他們丟棄網路的最後幾層時(在 x 軸上從 0.0 移動到 0.1),藍色的線“準確率差異”幾乎沒有移動。它保持在零附近。按照傳統指標,這個模型是完美的!但看看紅色的線,“翻轉”。它立即躍升到超過 5%。這意味著每 20 個答案中就有 1 個發生了改變,即使最終得分保持不變。模型的行為已經開始出現顯著的偏差。
我們量化的目標不僅僅是讓模型在基準測試中獲得高分。**我們的目標是建立一個與*原始*模型行為儘可能一致的較小版本。**我們希望保留其推理路徑、安全訓練和個性。高翻轉率是一個危險訊號,表明我們創造了一個科學怪人——它外表看起來一樣,但內在卻截然不同。
好吧,那我們該如何衡量這種損害呢?KL 散度登場。
“我明白了,”你可能會說。“翻轉是壞事,準確率分數會騙人。那麼,我們如何在不執行百萬次基準測試的情況下衡量翻轉的可能性呢?”
很長一段時間裡,社群的答案是**困惑度(Perplexity,PPL)**。它衡量模型對一段文字序列的“驚訝”程度。它似乎是模型質量的一個不錯的替代指標,所以它也應該是量化誤差的一個好替代指標,對吧?
錯了。對於這項任務來說,困惑度是一個出人意料的欺騙性指標。
想象一下原始模型正在預測“The cat sat on the ___”中的下一個詞。它的輸出機率分佈可能如下:
墊子
: 40%地毯
: 30%地板
: 10%- ...(其他所有詞的機率都非常低)
現在,看我們量化模型的預測:
墊子
: 35%地毯
: 34%地板
: 5%桌子
: 4%- ...(其他機率發生了變化)
困惑度主要關心的是分配給*正確*詞元(`mat`)的機率。它看到機率從 40% 降到了 35%——這是一個很小的下降,所以 PPL 的變化會很小。但看看全域性!模型確定性的整體“形狀”已經被扭曲了。困惑度透過只關注一個點,錯過了這種幾何上的變化。這就像只看左上角的畫素來判斷兩張圖片是否相同。
這就是 **Kullback-Leibler (KL) 散度**發揮作用的地方。
KLD 並不是一個新概念,但將其作為量化誤差的黃金標準來應用,卻是一項顛覆性的改變。KLD 衡量兩個機率分佈之間的“距離”。它不只看一個詞元;它比較從原始模型到量化模型的*整個*機率向量。它會問:“當我們用量化分佈來近似原始分佈時,會損失多少資訊?”
再次引用《你需要的不僅僅是準確率》這篇論文中的一個絕對關鍵的發現:**KL 散度與翻轉高度相關。** 這就是我們的羅塞塔石碑。
看看這些圖表。每個藍點都是一個模型的不同壓縮版本。X 軸是翻轉的百分比。Y 軸是測得的 KL 散度。這種關係是不可否認的。這些點形成了一條清晰的上升直線。斯皮爾曼相關係數達到了驚人的 `0.96` 和 `0.97`!
這就是我們需要的證據。透過最小化原始模型和量化模型輸出之間的 KLD,我們正在直接且可靠地最小化翻轉的風險。我們現在有了一個敏感且理論上合理的指標來指導我們的整個量化策略。
那麼,什麼是明智的量化方式?
有了這個新目標(最小化翻轉)和我們的北極星指標(最小化 KLD),我們的策略會如何改變?
當前流行的方法是*統一量化*:載入一個模型,選擇一種格式(如 NF4),然後將其應用於網路中幾乎所有的線性層。這種方法簡單,但它是一個笨拙的工具。就像用大錘做手術一樣。
關鍵的洞見是**並非所有層都是生而平等的。**
想想現代的混合專家(MoE)模型,比如 Mixtral 或 Grok。這些模型體量巨大,但方式很巧妙。對於每個詞元,它們只使用其總引數的一小部分。它們的大部分體積來自於“專家”,這些專家本質上是龐大的前饋網路(FFN)。
這種架構給了我們一個獨特的機會。如果我們不把所有東西都量化到 4 位呢?如果我們更有策略地處理這個問題呢?
高影響、低敏感度層: MoE 專家層是進行激進量化的完美候選者。它們佔模型總引數的*巨大*百分比。將它們從 16 位量化到,比如說,2 位或 3 位,可以極大地減小模型大小。關鍵在於,因為任何單個專家只用於一小部分詞元,所以對其進行重度量化所引入的誤差通常會被網路的其餘部分“淹沒”或補償。
低影響、高敏感度層: 現在,想想注意力機制——`Q`、`K` 和 `V` 投影。這些層用於*每一個詞元*。它們是模型理解詞元之間關係能力的中堅力量。它們極其敏感。即使將這些層量化到 4 位,引起的 KLD 飆升也可能是巨大的。
這就是權衡的體現:**我們在最不重要的地方(MoE 專家)犧牲精度,以保留在最重要的地方(注意力、嵌入層)的精度。**
付諸實踐:智慧量化藍圖
這不僅僅是理論。以下是你如何實際實現這種智慧、選擇性的量化方法:
分析你的模型: 不要猜測哪些層是敏感的,要去測量它。使用你的 FP16 模型和一個校準資料集(從多樣化的語料庫中選取幾百個樣本就足夠了)。
- 對於每一層(或每種型別的層),進行一次“模擬”量化。只量化*那一層*,然後測量最終輸出 logits 與原始模型相比的平均 KL 散度。
- 這會給你網路中每個部分的“敏感度得分”。你很可能會發現 `attention.q_proj` 的 KLD 敏感度比 `block_sparse_moe.experts.0.w1` 高得多。
設定你的位元預算: 決定你的目標最終模型大小。這就是你的“位元預算”。例如,你希望將 90GB 的 FP16 模型壓縮到 25GB 左右。
智慧分配位元: 現在,你需要解決一個最佳化問題。
- MoE FFNs: 這些層顯示出較低的 KLD 敏感度,但體積龐大。給它們分配最少的位元(例如,2.5 位元)。這能在減小尺寸方面給你帶來最大的效益。
- 注意力層(QKV/O): 這些層非常敏感。它們獲得最多的位元。將它們保持在 6 位、8 位,甚至 bfloat16。它們不佔用太多空間,所以保持它們高精度的“成本”很低。
- 其他層: 填補中間部分。也許 MLP 的 `gate` 和 `down_proj` 層可以處理 4 位,而嵌入層需要 8 位。你的分析資料將指導你做出決定。
結果是一個混合、混合精度的模型,它被智慧地壓縮了。它比原始模型小得多,但透過保留網路中最敏感的部分,它具有比同樣大小的統一量化模型低得多的 KLD,因此翻轉率也低得多。
是時候用不同的方式來處理量化了
一刀切的量化時代即將結束。隨著模型變得越來越複雜,我們對它們既要強大又要易於訪問的需求日益增長,我們的壓縮技術也必須隨之進化。
- 超越基準測試: 停止僅僅依賴 MMLU。開始測量**翻轉**,以瞭解你是否保留了模型的真實行為。
- 使用 KL 散度: 將平均 KLD 作為量化誤差的基準指標。正如我們所見,它比困惑度更可靠,是翻轉的一個極佳的代理指標。
- 智慧量化,而非粗暴量化: 分析你的模型。對大型、魯棒的元件(如 MoE 專家)應用激進的低位元量化,並用更高的精度保護脆弱、關鍵的層(如注意力層)。
這就是我們如何精巧地處理問題,構建出的模型不僅更小,而且更忠實於它們所源自的原始巨型模型。