機器學習2021 — 神經網路壓縮 (Network Compression)
機器學習2021 — 神經網路壓縮 (Network Compression)¶
一、 深度學習模型的優化與關鍵點 (Optimization and Critical Points)
在深度學習模型的訓練過程中,優化(Optimization)是一個尋找最低損失(loss)的關鍵步驟。對於大型網路,我們對損失曲面(error surface)的理解與傳統優化理論有所不同。
- 局部最小值與全域最佳值的傳說
• 在深度學習領域,有一個廣為流傳的推論:幾乎所有局部最小值(local minimum)的損失都與全域最佳值(global optimum)的損失相差無幾。
• 因此,訓練時即使卡在局部最小值,也不需過度驚慌,因為其損失值可能已經足夠好,與全域最小值的差距不大。
• 這個說法最早由 Yann LeCun 在十多年前(約 2006 或 2007 年)憑藉直覺提出。雖然當時沒有證明,但到了 2017 年已有論文對此假說提供了證明。
- 鞍點 (Saddle Point) 的主導性
• 梯度下降(gradient descent)最終會停在一個臨界點(critical point),這個點可能是局部最小值或鞍點。
• 分析臨界點的性質需要透過海森矩陣(Hessian, H)及其特徵值 (λ)。網路參數數量(N)決定了 H 矩陣的大小(N*N)。
◦ 若所有特徵值都是正值,該點是局部最小值。
◦ 若特徵值有正有負,該點是鞍點。
• 參數數量與臨界點的關係:
◦ 當網路參數很多時(N 很大),若假設特徵值為正或負的機率各半(1/2),則遇到局部最小值的機率會變得非常低。
◦ 參數數量越多的網路,其碰到的臨界點就越不可能是局部最小值,而越可能是鞍點。
- 損失值與臨界點類型的關聯
• 理論與實驗都支持:鞍點更常出現在損失值高的地方,而局部最小值則更常出現在損失值低的地方。
• 這符合直覺:當損失很大時(訓練剛開始),應該有很多條路徑可以讓損失繼續降低(負的特徵值代表可以往下走),因此更容易找到鞍點。
•實驗佐證:對特定網路進行分析顯示,訓練誤差很低的臨界點(例如錯誤率 1.3%)其特徵值幾乎全為正,是局部最小值;而誤差較高的臨界點(例如錯誤率 23% 或 28%)則同時有正負特徵值,是鞍點。
二、 網路壓縮技術 (Network Compression)
網路壓縮的目標是縮小模型,使其在不大幅犧牲效能的前提下,能夠應用於資源受限(Resource-constrained)的環境,例如智能手錶、無人機等邊緣設備(Edge Device)。
- 網路壓縮的需求與動機
• 資源限制:邊緣設備通常記憶體(Memory)較少,運算能力(Computing Power)較弱。
• 延遲性 (Latency):將資料傳到雲端運算再傳回會產生時間差。對於需要即時反應的應用(如自駕車感測器),長延遲是不可接受的。
• 隱私保護 (Privacy):在本地設備上直接運算和決策,可以避免將資料傳輸到雲端,從而保障用戶隱私。
- 核心壓縮技術
網路壓縮的技術包括軟體導向的方法,且這些方法可以互相結合使用:
A. 網路修剪 (Network Pruning)
• 概念:修剪掉網路中不重要的參數或神經元。
• 流程:先訓練一個大型網路,接著評估各參數或神經元的重要性(例如透過絕對值或類似於 Lifelong Learning 中的重要性指標 bi),然後將不重要的部分移除。
• 實作細節:
◦ 若以參數為單位修剪(Weight Pruning),會產生不規則的網路結構,不利於 PyTorch 實作和 GPU 加速。通常做法是將被修剪的權重直接設為零,但這並未真正減少儲存空間。
◦ 若以神經元為單位修剪(Neuron Pruning),網路架構仍保持規律,實作和 GPU 加速相對容易。
• 分階段修剪:通常一次只修剪一小部分(例如 10%),然後重新微調(Fine-tune)剩下的網路,再反覆進行,以避免對網路造成過大的損傷。
B. 知識蒸餾 (Knowledge Distillation)
• 概念:先訓練一個大型的教師網路(Teacher Network),再根據教師網路的輸出分佈,訓練一個較小的學生網路(Student Network)。
• 優勢:小型網路直接從頭訓練(Train From Scratch)通常效果不好。教師網路可以提供額外的軟資訊(例如分類 1 時,教師輸出 7 的分數是 0.2,表示 1 和 7 有點像),這讓學生網路學習得比直接依據硬性正確標籤學習要好。
• 應用:知識蒸餾可用於將多個網路的集成(Ensemble)結果濃縮到一個單一的學生網路中,以降低實用上的計算量。
• 技巧:Softmax 溫度 (Temperature):在 Softmax 函數中加入一個超參數 T (Temperature),將輸入數值除以 T 再進行指數運算。當 T>1 時,輸出分佈會變得比較平滑,這樣學生網路才能學到類別間的相似關係,否則如果教師輸出過於集中(接近硬性標籤),蒸餾的意義就不大。
C. 參數量化 (Parameter Quantization)
• 概念:減少儲存單一參數所需的位元數(Bits),從而壓縮網路大小。
• 方法:例如從 32 Bits 降低到 8 Bits,或是極端地使用 Binary Weights,讓權重值僅限於 +1 或 -1,每個權重只需 1 Bit 儲存空間。
◦ 有趣發現:有時使用 Binary Network 反而能提供更大的限制,達到防止過度擬合(Overfitting)的效果,甚至比正常網路表現更好。
• 權重聚類 (Weight Clustering):將數值相近的參數分群,每群只用一個代表數值來表示,進一步減少儲存參數所需的空間。
• 編碼:可使用如 Huffman Encoding 等通訊技巧,讓常出現的數值使用較少的 Bits 描述。
D. 網路架構設計:深度可分離卷積 (Depthwise Separable Convolution)
• 這是一種透過改變網路架構來減少參數的方法。
• 原理:將標準卷積層拆解成兩個步驟,概念上類似於全連接層中的 Low Rank Approximation(將一層 W 拆解為兩層 U 和 V,若中間層 K 夠小,參數總量會減少)。
• 步驟:
-
深度卷積 (Depthwise Convolution):每個 Filter 只負責處理一個 Input Channel。 Input 與 Output 的 Channel 數目相同。
-
點狀卷積 (Pointwise Convolution):使用 1x1 的 Filter 來混合(考慮)不同 Channel 之間的關係。
• 參數效益:這種組合可以大幅減少參數數量。若使用 k×k 的 Kernel Size,參數總量約為標準卷積的 1/(k×k) 倍,例如 3×3 的 Kernel Size 可將網路大小壓縮到原來的 1/9 左右。
E. 動態計算 (Dynamic Computation)
• 概念:讓網路可以根據環境(如設備電力或運算資源)或輸入資料的難易度,自由調整所需的運算量。
• 動態深度:在不同的隱藏層中加入額外的輸出層(Extra Layer),允許網路在運算資源不足時提早輸出結果。
• 動態寬度:在同一個網路內,預先決定在特定運算量下,哪些神經元會被使用(例如只用 75% 的參數),並同時訓練所有寬度的狀況。
三、 網路訓練與修剪的假說:大樂透假說 (The Lottery Ticket Hypothesis, LTH)
大樂透假說試圖解釋為何「先訓練大網路再修剪」的效果,優於「直接訓練相同大小的小網路」。
• 假說內容:
◦ 訓練大網路就像買了許多彩券(許多小的子網路,Sub-network)。
◦ 大型網路增加了抽到「幸運初始參數」(可以成功被訓練的子網路)的機率。
◦ 修剪過程保留下來的,就是那些「幸運的參數」。
• 關鍵發現:小型網路之所以能被訓練成功,關鍵在於保留了大型網路隨機初始化時對應參數的「正負號」(Sign)。只要不改變參數的正負號,即使絕對值改變,該子網路仍能訓練起來。
• 挑戰與反思:
◦ 有論文對 LTH 提出質疑,認為 LTH 觀察到的現象可能是一種幻覺(Illusion)。
◦ 實驗顯示,如果直接訓練小型網路時,增加訓練的回合數(Epochs)或調整 Learning Rate,其表現可以與修剪後再微調的結果相當甚至更好。這表明,先前認為小型網路訓練不起來,可能只是訓練設定不足導致的。
Comments
Loading comments…
Leave a Comment