模型剪枝 是什麼?
Pruning:模型剪枝 的完整解釋
模型剪枝是一種減少模型大小和計算複雜度的技術,透過移除模型中不重要的權重或神經元來實現。
容易混淆
剪枝 vs 量化 量化是把數值精度壓低。 剪枝是把不重要的權重或神經元直接移除。 最關鍵的區別:一個改數字表示,一個砍連結。
剪枝 vs 知識蒸餾 知識蒸餾是用大模型教小模型。 剪枝是直接把原模型縮小。 最關鍵的區別:一個重新學,一個直接瘦身。
剪枝 vs 正則化 正則化是在訓練時限制模型別長太複雜。 剪枝是在訓練後或訓練中把多餘部分移除。 最關鍵的區別:一個管學習過程,一個管模型結構。
記住這句就好
砍掉不重要的連結,讓模型更輕更快。
實際案例
手機端分類器 把影像分類模型裡很少被用到的權重剪掉後,裝置端推論會明顯變快。 如果準度幾乎不變,這種縮小就很划算。
雲端服務降成本 服務端想降低 GPU 成本時,會先看能不能用結構化剪枝減少計算量。 這比單純換更大的主機更省。
算法與應用
常見做法有非結構化剪枝和結構化剪枝,前者砍零散權重,後者砍整個通道或神經元。 判斷哪些部分重要,常會看權重大小、梯度或對驗證集的影響。 剪完通常還要再微調,否則準度容易掉太多。
中英對照與常見說法
| 說法 | 出現場合 |
|---|---|
| 剪枝 / 模型剪枝 | 中文正式用語,台灣與中國大陸通用 |
| Pruning / Model Pruning | 英文原名 |
| 修剪、裁剪 | 口語說法,意思相同 |
| Network Pruning | 論文裡常見的完整說法 |
注意「剪枝」在決策樹的脈絡下是另一件事:那裡指的是把樹的分支砍掉以避免過度擬合(pre-pruning 與 post-pruning),跟神經網路剪枝的目的不同,一個為了泛化,一個為了效率。
結構化與非結構化,這是最關鍵的分野
| 非結構化剪枝 | 結構化剪枝 | |
|---|---|---|
| 移除單位 | 單個權重 | 整個通道、濾波器或注意力頭 |
| 壓縮率 | 高,可以移除九成以上權重 | 較低,通常三成到五成 |
| 實際加速 | 需要稀疏運算支援,一般硬體上常常沒有加速 | 直接變小,任何硬體都會變快 |
| 精度損失 | 相對小 | 相對大,需要較多微調 |
選哪一種取決於部署環境。目標是通用 GPU 或手機,通常只有結構化剪枝才拿得到真實的速度提升。目標硬體支援稀疏矩陣運算時,非結構化剪枝才划算。
標準流程與判準
標準三步是訓練、剪枝、微調,而且常常要迭代多輪。一次剪掉八成通常救不回來,分成四輪每輪剪一半再微調,最終精度會好很多。
怎麼決定剪哪些:最簡單也最常用的判準是權重的絕對值大小,小的先剪。進階做法會看梯度或用泰勒展開估計「移除這個權重會讓損失上升多少」,準確度較高但計算成本也高。
每層的剪枝率不該相同。淺層通常對精度較敏感,深層冗餘較多。統一設一個比例是最省事但也最容易掉精度的做法。
樂透假說(Lottery Ticket Hypothesis) 指出,一個大網路裡存在一個小的子網路,如果從一開始就用原本的初始值單獨訓練它,能達到接近原網路的表現。這個發現的實務意義是:剪枝之後把權重重設回原始初始值再訓練,有時比直接微調更好。
情境判斷
Q1(直覺題): 你已經有一個訓練好的模型,只想讓它跑得更快,先考慮什麼?
→ 先看剪枝或量化,因為它們都是為了把現有模型變輕巧。
Q2(判斷題): 如果你想大幅縮小模型,但不太想改變數值精度,剪枝一定是唯一選項嗎?
→ 不是,還可以考慮蒸餾或量化,要看你比較在意結構大小還是數值壓縮。
相關術語
常見問題
剪枝會不會讓模型準度暴跌?
有可能,所以通常要控制剪枝比例,並在剪完後再微調。
只剪權重不剪神經元有用嗎?
有用,但如果硬體不吃稀疏矩陣,實際加速可能有限。
剪枝適合所有模型嗎?
不一定,結構、部署環境和效能目標都會影響它值不值得做。