lecture_03
**剪枝:**pruning basically turns a dense neural network into a sparse neural network. you can remove those redundant synapses, and also you can remove those redundant neurons.
剪枝的本質上是將稠密的神經網絡轉變成稀疏的神經網絡,可以去除那些冗余的突觸,同樣也能移除那些冗余的神經元。
剪枝就是“修剪”深度學習模型中多余的部分,讓模型變得更輕、更快,同時盡可能保留性能。
想象一下,養了一棵樹,長得有點太大了,有些枝葉其實沒啥用,但又占地方。想讓它更整齊、更好看,就可以修剪掉這些多余的枝葉
remove those small connections, very simple criteria, if it is small, then we remove it. remove it means setting it to zero
.
模型訓練推理過程,DRAM的訪問往往是耗費時間的主要原因之一:
- DRAM的訪問時間(延遲)比處理器的計算速度慢很多倍。現代處理器的計算能力非常強,但每次從DRAM讀取數據都需要幾百個時鐘周期;深度學習模型通常有大量的參數(權重、激活值等),這些參數無法全部裝入處理器的緩存(Cache),因此需要頻繁地從DRAM讀取
- DRAM和處理器之間的數據傳輸受限于內存帶寬。即使計算速度很快,如果數據不能及時從內存傳輸過來,也會導致“數據饑餓”
- 在推理時,模型需要從內存中逐層讀取權重,再進行矩陣運算,最后將結果寫回內存
- 對訓練的影響:
- 梯度計算和參數更新需要反復讀取和寫入參數。這些數據通常存儲在顯存(GPU)或主存(CPU的DRAM)中,如果顯存容量不足,還需要頻繁地從主存中加載數據;當模型非常大(超出顯存容量)時,訓練會因頻繁的主存和顯存交互而變得非常慢
- 推理階段通常是
以延遲為優化目標
(如實時性)。如果模型的權重或中間激活值不能在緩存中保留,就會因DRAM訪問引入額外的延遲
NVIDIA從A100GPU開始采用權重的稀疏性,實現了高達1.5倍的性能提升。
剪枝過程理解:
-
假設原始權重矩陣W:
[ 0.8 0.1 0.05 ? 0.2 0.3 0.01 0.4 ? 0.5 0.02 ] (3) \left[ \begin{matrix} 0.8 & 0.1 & 0.05 \\ -0.2 & 0.3 & 0.01 \\ 0.4 & -0.5 & 0.02 \end{matrix} \right] \tag{3} ?0.8?0.20.4?0.10.3?0.5?0.050.010.02? ?(3) -
假設我們根據權重的絕對值大小剪枝,閾值設為 𝜏 = 0.1絕對值大于𝜏則保留,小于則置為0
-
根據閾值 τ\tauτ 生成的掩碼矩陣為:
[ 1 1 0 1 1 0 1 1 0 ] (3) \left[ \begin{matrix} 1 & 1 & 0 \\ 1 & 1 & 0 \\ 1 & 1 & 0 \end{matrix} \right] \tag{3} ?111?111?000? ?(3) -
將 W 和 M 逐元素相乘:
WP = M⊙W =
[ 0.8 0.1 0 ? 0.2 0.3 0 0.4 ? 0.5 0 ] (3) \left[ \begin{matrix} 0.8 & 0.1 & 0 \\ -0.2 & 0.3 & 0 \\ 0.4 & -0.5 & 0 \end{matrix} \right] \tag{3} ?0.8?0.20.4?0.10.3?0.5?000? ?(3) -
剪枝后的損失函數可以寫為:
LP(X,Y,WP) = L(X,Y,WP) + λ∥WP∥1
剪枝顆粒度(Pruning Granularity):
權重級別剪枝:就像挑選模型中一些“小的、不重要的”權重,將它們去掉,但是網絡的架構(每一層的神經元和連接)保持不變
神經元級別剪枝:決定某些神經元(及其對應的權重)對輸出幾乎沒有影響,因此直接去除整個神經元和與之相連的所有權重
層級剪枝:刪除了一個完整的“計算模塊”,即某一層的所有神經元和連接,整個層的計算就不再進行
剪枝的敏感性分析:
敏感性分析是一種用來衡量和評估模型中不同參數或層對模型整體性能(如準確率、損失等)影響的方法。通過敏感性分析,可以確定模型中哪些參數或層對于性能不敏感,從而為剪枝提供指導,幫助選擇那些對性能影響較小的部分進行裁剪,以減少模型規模、提高推理速度,同時盡量保持模型的性能
- 逐層剪枝敏感性分析:
- 對每一層逐步減少參數(如減少一定比例的卷積核或神經元),觀察性能變化曲線
- 敏感的層通常對模型性能具有較大影響,應慎重剪枝
- 參數重要性分析:
- 使用 L1 范數:權重值的絕對值越小,越不重要
- 使用 L2 范數:權重越接近于零,則認為其對性能貢獻較小
- 基于梯度的重要性:考慮 ∣w??L/?w∣,即權重與梯度的乘積,用以衡量權重對損失的貢獻
- Hessian 矩陣方法
- 利用二階導數(Hessian 矩陣)衡量權重對損失函數的敏感性
- 理論上較為精確,但計算復雜度較高
- 激活敏感性
- 衡量神經元的激活值對最終輸出的貢獻
- 激活值較低或接近零的神經元對輸出影響較小,可以優先剪枝