輕鬆理解大模型壓縮技術
大型語言模型如 ChatGPT 在人工智能領域取得了重大突破,但其龐大的規模和高計算需求限制了部署。模型壓縮技術旨在縮小模型規模,降低存儲和計算需求,使其能在資源受限設備上運行,同時儘可能保持模型的性能和準確性。本文將介紹幾種主要的大模型壓縮方法。
- 剪枝 (Pruning)
1.1 原理
剪枝技術的本質是基於這樣一個觀察:在神經網絡中,並非所有參數都同等重要。通過識別並移除那些對模型輸出影響較小的參數或結構,我們可以在保持模型性能的同時顯著減少計算複雜度。這就像修剪一棵樹,去除不必要的枝葉,使其更加精簡高效,同時保持其主要功能。
主要有兩種剪枝方式:
-
非結構化剪枝:這種方法識別並移除權重較小的個別參數,得到稀疏的權重矩陣。它可以在不改變網絡整體結構的情況下大幅減少參數數量。然而,由於結果是不規則的稀疏矩陣,可能難以在硬件上高效實現。
-
結構化剪枝:這種方法移除整個神經元、卷積通道或層,保持模型結構的規整性。雖然可能導致更大的精度損失,但結構化剪枝更容易在實際硬件上實現加速。
剪枝過程通常包括幾個步驟:首先訓練一個過參數化的模型,然後根據某些重要性標準(如權重大小、激活值、梯度等)識別不重要的參數,接着移除這些參數,最後對剪枝後的模型進行微調以恢復性能。
值得注意的是,剪枝技術不僅可以減少模型大小和計算需求,還可能起到正則化的作用,有助於防止過擬合。然而,過度剪枝可能導致模型性能顯著下降,因此在實踐中需要在模型大小和性能之間找到平衡點。
1.2 舉例說明
想象一個具有 100 個輸入神經元、50 個隱藏神經元和 10 個輸出神經元的神經網絡。這個網絡總共有 100 * 50 + 50 * 10 = 5500 個連接(權重)。
在訓練後,我們可能會發現:
某些連接的權重非常接近於零,比如只有 0.0001 這麼小。
某些隱藏神經元的輸出幾乎總是接近零,不論輸入是什麼。
剪枝就是移除這些 " 不重要 " 的部分:
對於非結構化剪枝,我們可能會將所有絕對值小於 0.01 的權重直接設爲 0。這可能會使 40% 的連接變爲 0,從而使網絡變得稀疏。
對於結構化剪枝,我們可能會完全移除那些輸出總是接近零的隱藏神經元。比如,我們可能會發現 50 個隱藏神經元中有 10 個是這樣的,於是我們把這 10 個神經元及其所有相關連接都移除。
經過這樣的剪枝,我們的網絡可能就只剩下 3300 個非零連接和 40 個隱藏神經元,但它的性能可能仍然與原始網絡相當。
- 量化 (Quantization)
量化是將模型的權重和激活值用更少的位數來表示的過程, 從而減少存儲需求和計算複雜度。例如, 可以將 32 位浮點數轉換爲 16 位浮點數或 8 位整數。爲了補償精度損失, 通常會引入縮放因子。量化可以在訓練期間 (量化感知訓練,QAT) 或訓練後 (訓練後量化,PTQ) 進行。QAT 在訓練過程中就考慮量化的影響, 而 PTQ 則是在模型訓練完成後應用量化。
量化的主要優勢在於顯著減少模型大小和推理時間, 同時保持可接受的性能水平。這使得在資源受限的設備 (如移動設備或嵌入式系統) 上部署複雜的深度學習模型成爲可能。然而, 量化也可能導致模型精度的輕微下降, 因此在實際應用中需要權衡模型大小、速度和精度之間的關係。
常見的量化方法包括線性量化、非線性量化和混合精度量化。線性量化是最簡單和最常用的方法, 它將浮點數線性映射到整數範圍。非線性量化則採用更復雜的映射函數, 可以在某些情況下提供更好的精度。混合精度量化允許在同一模型中使用不同的位寬, 爲不同的層或操作選擇最適合的精度級別。
- 知識蒸餾 (Knowledge Distillation)
3.1 原理
知識蒸餾是一種將大型教師模型的知識轉移到小型學生模型的技術。學生模型通過模仿教師模型的輸出分佈來學習, 從而獲得接近教師模型的泛化能力, 但參數量大大減少。這種方法不僅可以壓縮模型大小, 還能保持或甚至提高模型性能, 因此在資源受限的環境中特別有用。
知識蒸餾分爲黑盒和白盒兩種:
-
黑盒蒸餾: 學生模型只能訪問教師模型的預測結果(軟標籤)。這種方法更加靈活, 可以應用於任何類型的模型, 但可能會丟失一些細粒度的信息。
-
白盒蒸餾: 學生模型可以訪問教師模型的參數、激活值和中間表示。這種方法可以傳遞更多詳細信息, 但要求教師和學生模型具有相似的架構。
在實踐中, 知識蒸餾通常涉及兩個步驟: 首先, 訓練一個大型、複雜的教師模型; 然後, 使用教師模型的輸出來訓練一個更小的學生模型。這個過程中, 學生模型不僅學習真實的標籤, 還學習教師模型的 " 軟標籤 "(即概率分佈), 這些軟標籤包含了教師模型學到的更豐富的信息。
3.2 舉例說明
假設我們有一個複雜的卷積神經網絡 (CNN) 模型, 它在識別貓和狗的圖片方面表現出色。這就是我們的 " 教師 " 模型。現在, 我們想創建一個更小、更快的模型來部署在移動設備上。這就是我們的 " 學生 " 模型。
知識蒸餾的過程如下:
-
教師模型輸出: 對於一張狗的圖片, 教師模型可能輸出 [0.1, 0.9](10% 是貓,90% 是狗)。
-
學生訓練: 學生模型不僅學習硬標籤 (這是狗), 還學習教師模型的概率分佈(軟標籤)。
-
軟標籤: 這個 [0.1, 0.9] 的分佈比簡單的 [0, 1] 標籤包含更多信息, 因爲它反映了圖像的細微特徵。
- 低秩分解 (Low-Rank Factorization)
4.1 原理
低秩分解是一種強大的矩陣壓縮技術, 它將高階矩陣分解爲兩個或多個低階矩陣的乘積。在大模型的壓縮中, 這種方法可以將權重矩陣或張量分解爲低秩表示, 從而有效地壓縮模型。這種方法的核心思想是, 許多自然數據集中的矩陣實際上可以用比其原始維度小得多的秩來近似表示。
低秩分解的主要優勢在於它可以顯著減少參數數量, 同時保留原始矩陣的主要結構信息。這意味着我們可以在保持模型性能的同時, 大幅降低計算和存儲需求。例如, 一個原始維度爲 m×n 的矩陣可以被分解爲兩個較小的矩陣, 分別爲 m×r 和 r×n, 其中 r 遠小於 m 和 n。這種分解可以將參數數量從 m×n 減少到 r×(m+n)。(基本原理也可參看這篇文章:理解 Lora 微調只需一個公式 )
在實踐中, 低秩分解可以通過多種算法實現, 如奇異值分解 (SVD)、主成分分析 (PCA) 或非負矩陣分解 (NMF) 等。這些方法各有特點, 可以根據具體應用場景選擇最合適的算法。對於大模型, 低秩分解不僅可以應用於全連接層, 還可以用於注意力機制中的權重矩陣, 從而全面壓縮模型。
然而, 低秩分解也面臨一些挑戰。首先, 確定最優的秩 r 是一個需要權衡的問題, 過低的秩可能導致信息丟失, 而過高的秩則可能無法達到預期的壓縮效果。其次, 對於非線性激活函數, 低秩分解的效果可能會受到限制。因此, 在應用低秩分解時, 通常需要結合其他壓縮技術, 如量化或剪枝, 以獲得最佳的壓縮效果。
4.2 舉例說明
a. 什麼是秩:
矩陣的秩是指矩陣中線性無關的行或列的最大數量。簡單來說, 它表示矩陣中包含的獨立信息量。
b. 低秩分解示例:
假設我們有一個 4x4 的矩陣 A:
A = [2 4 6 8]
[1 2 3 4]
[3 6 9 12]
[4 8 12 16]
觀察可以發現, 這個矩陣的每一行都是第二行的倍數。因此, 這個矩陣的秩爲 1。
我們可以將 A 分解爲兩個較小矩陣的乘積:
A = U * V
U = [2] V = [1 2 3 4]
[1]
[3]
[4]
這裏,U 是一個 4x1 的矩陣,V 是一個 1x4 的矩陣。它們的乘積可以重構原始矩陣 A。
c. 從小矩陣擴展到大矩陣的低秩分解:
對於更大的矩陣, 過程是類似的, 但可能會更復雜:
-
首先, 使用奇異值分解 (SVD) 或其他技術來分析原始大矩陣。
-
確定一個合適的秩 r, 這個秩應該足夠小以實現壓縮, 但又要足夠大以保持足夠的信息。
-
保留前 r 個最大的奇異值及其對應的左右奇異向量。
-
使用這些保留的向量和值來構造兩個較小的矩陣 U 和 V。
-
U 和 V 的乘積將近似原始大矩陣。
結論
大模型壓縮技術爲解決大模型的規模挑戰提供了有效的解決方案。通過這些技術, 我們可以將模型大小減小几倍甚至更多, 同時保持接近原始性能的水平。這不僅降低了部署和運行成本, 還使得在移動設備、嵌入式系統等資源受限環境中使用大模型成爲可能。
參考及附圖來源:
1.https://www.goml.io/shrinking-giants-innovative-techniques-for-compressing-llms/
2.https://smashinggradient.com/2023/05/23/30-compression-of-llms-with-low-rank-decomposition-of-attention-weight-matrices/
3.https://www.51cto.com/article/773890.html
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/qja6p_ImHdUatg_RknmVnw