---
# System prepended metadata

title: '【機器學習2021】36~37 神經網路壓縮 '
tags: [機器學習]

---

20251008 筆記，內容可能有錯，請參考來源影片。

[李宏毅機器學習2021影片](https://www.youtube.com/playlist?list=PLJV_el3uVTsMhtt7_Y6sgTHGHp1Vb2P2J)


今天影片內容

[【機器學習2021】神經網路壓縮 (Network Compression) (一) - 類神經網路剪枝 (Pruning) 與大樂透假說 (Lottery Ticket Hypothesis)](https://youtu.be/utk3EnAUh-g?si=3Ir8oeOytknfMj_M)


[【機器學習2021】神經網路壓縮 (Network Compression) (二) - 從各種不同的面向來壓縮神經網路](https://youtu.be/xrlbLPaq_Og?si=Lawar9dH9U1gjwlQ)



### 【機器學習2021】神經網路壓縮 (Network Compression) (一) - 類神經網路剪枝 (Pruning) 與大樂透假說 (Lottery Ticket Hypothesis) 大綱

### I. 網路壓縮 (Network Compression) 簡介與動機
A. 目標：將龐大的模型縮小，同時維持效能。
B. 應用場景：資源受限的環境。
C. 動機：

    1. 延遲 (Latency)：避免資料傳輸至雲端的延遲。
    2. 隱私 (Privacy)：在裝置上直接運算，保障用戶隱私。
D. 範疇：只討論軟體導向的壓縮技術。

### II. 技術一：網路修剪 (Network Pruning)
A. 基本概念：修剪網路中無用參數。
B. Pruning 的框架：
    1. 訓練一個最大的網路。
    2. 評估參數或神經元的重要性。
    3. 修剪不重要的參數。
    4. 對剩餘較小的網路進行微調 (Fine-tune)。
    5. 可反覆迭代執行步驟 2 至 4。
C. 評估重要性的方法：
    1. 參數的絕對值：絕對值越接近零，越不重要。
    2. 借用 Lifelong Learning 的概念：計算參數對損失的敏感度 $B_i$。

### III. Pruning 的挑戰：修剪單位的選擇與實作問題
A. 以參數 (Weights) 為單位修剪：

    1. 實作問題：修剪後的網路形狀不規則，難以實作於 PyTorch 等函式庫。
    2. 加速問題：不規則的網路難以用矩陣乘法進行 GPU 加速。
    3. 解決方案：將被修剪的權重設為零。
    4. 結果：設為零並未真正縮小網路的記憶體佔用，且實證顯示修剪 95% 參數後，加速效果仍不顯著。
    
B. 以神經元 (Neurons) 為單位修剪：神經元的輸出不為零的次數等。

### IV. 大樂透假說 (Lottery Ticket Hypothesis)
A. 核心問題：為何不直接訓練一個小網路，而要先訓練大網路再修剪？ 
B. 假說內容：

    1. 類比：大網路可視為許多小子網路 (Subnetworks) 的組合。
    2. 訓練大網路就像買多張彩券，增加了抽到「幸運」子網路的機率。
    3. 只有當修剪出來的小網路保留了大網路的原始初始化參數時，才能被成功訓練起來，若重新隨機初始化則會失敗。
    4. 結論：訓練的過程是找到幸運的初始化參數，而不是單純找到最終參數。

### V. 假說的後續研究與爭議
A. 解構大樂透：

    1. 關鍵發現：參數的正負號 (Sign) 對於訓練成功至關重要，而非參數的絕對值。
    2. Weight agnostic neural network：有研究顯示，即使網路參數都是隨機或設定為某個常數 (如 1.5)，仍能獲得一定的分類表現。
B. 反對意見：

    1. 該論文挑戰大樂透假說，認為小網路訓練不起來可能是因為訓練回合數太少。
    2. 實證顯示，若給予小網路更多的訓練回合，其表現可以超越修剪後再微調的大網路，這暗示 Pruning 的優勢可能只是一個幻覺。

---



### I. 網路壓縮 (Network Compression) 簡介與動機

*   **定義**：網路壓縮的目標是將 **BERT 或 GPT** 等龐大的模型縮小，讓它們擁有較少量的參數，但效能與原模型相差不大。
*   **動機：資源受限環境**：我們需要將模型應用於資源有限的環境下，例如在智慧手錶或 IoT 裝置等 **Edge Device** 上。這些裝置的記憶體和計算能力都比較少。
*   **動機：延遲 (Latency)**：在許多應用中（如自駕車的感測器），需要非常即時的回應。如果將資料傳到雲端運算再傳回 Edge Device，中間的延遲可能過長，無法接受。
*   **動機：隱私 (Privacy)**：為了保障用戶隱私，人們不希望將資料傳送到雲端，因此在 Edge Device 上直接進行運算和決策是一種可以保障隱私的做法。
*   **範疇**：本次課程介紹的技術都是**軟體導向**的壓縮方法，不涉及硬體加速部分。

### II. 技術一：網路修剪 (Network Pruning)

*   **概念**：網路修剪 (Network Pruning) 就像俗話說的「樹大必有枯枝」。一個巨大的網路中有很多參數可能在滑水。Pruning 的基本概念就是找出這些無用的參數並將其移除。
*   **歷史**：這不是新概念，早在 90 年代就有論文討論 Pruning，該論文將修剪權重比喻為「腦損傷 (Brain Damage)」，而 Pruning 旨在找到**最佳修剪方法 (Optimal)** 來使損傷最小。
*   **Pruning 流程**：
    1.  **訓練**一個最大的網路。
    2.  **評估**網路中參數或神經元的**重要性**。
    3.  **修剪**掉不重要的參數或神經元。
    4.  對剩餘的小網路進行**微調 (Fine-tune)**，讓效能回升。
    5.  這個過程可以**反覆進行多次**。
*   **重要性評估**：
    *   **最簡單方法**：觀察參數的絕對值，絕對值越接近零，對網路的影響越小，越不重要。
    *   **進階方法**：可以套用終身學習（Lifelong Learning）的概念，計算每個參數對舊任務損失的影響程度（即 $B_i$ 值），將不重要的參數修剪掉。

### III. Pruning 的挑戰：實作上的問題

*   **修剪單位的選擇**：修剪的單位可以是單一參數 (Weight) 或整個**神經元** (Neuron)。
*   **以參數為單位的問題**：
    *   **不規則形狀**：如果以參數為單位修剪，得到的網路形狀會是**不規則**的。
    *   **實作困難**：不規則網路難以在 PyTorch 等函式庫中實作，因為函式庫通常要求定義每層的神經元數量。
    *   **加速困難**：不規則網路難以利用矩陣乘法進行 **GPU 加速**。
    *   **業界實作**：為了方便實作和 GPU 加速，實際操作中會將被修剪的權重設為**零**，而非真正移除。
    *   **結果**：這種補零的做法**並未真正縮小網路**的記憶體佔用。實證顯示，即使修剪掉超過 95% 的參**數**，其運算速度的加速程度也**不顯著**。

### IV. 大樂透假說 (Lottery Ticket Hypothesis)

*   **核心疑問**：既然修剪後的小網路效能跟大網路差不多，為什麼不直接訓練一個小網路，而要先訓練大網路再修剪？ 
*   **普遍答案**：直接訓練一個小網路，其效能通常**無法達到**先訓練大網路再修剪後小網路的準確度。
*   **大樂透假說的解釋**：
    *   **概念**：一個大的網路可以被視為許多小的子網路 (Subnetwork) 的組合。
    *   **訓練**：訓練大網路的過程就像**買多張彩券**，增加了抽到「幸運」的初始化參**數**組合的機率。
    *   **實驗證明**：
        1.  訓練一個大網路，修剪出一個小網路。
        2.  如果將這個小網路的參數重新隨機初始化並訓練，它會訓練不起來。
        3.  但如果將這個小網路的參數沿用大網路的原始初始化值（在訓練大網路前的那組隨機值），它就**可以訓練起來**。
    *   **結論**：訓練大網路的價值在於它幫助我們找到了那些「幸運」的、能夠成功訓練的初始化參數子集。

### V. 假說的後續研究與爭議

*   **解構大樂透的發現**：
    *   **參**數**的關鍵**：研究發現，初始化參**數**的**正負號 (Sign)** 對於訓練成功是關鍵，參**數**的**絕對值**並不重要。
    *   **無需訓練的子網路**：甚至有研究指出，一個大網路中可能存在一個子網路，**無需訓練**，其隨機參**數**就能獲得不錯的分類結果（如 **Weight Agnostic Neural Network**）。
*   **反對意見**：
    *   有論文質疑大樂透假說，認為小網路訓練不起來可能是因為訓練的 **Epoch 數太少**。
    *   如果給予直接訓練的小網路更多的訓練回合，它的表現可以超越修剪後的小網路。
    *   這意味著大網路優於小網路的現象，可能只是一個**幻覺 (Illusion)**。這項爭議的結果仍有待未來更多研究證實。

### 【機器學習2021】神經網路壓縮 (Network Compression) (二) - 從各種不同的面向來壓縮神經網路 大綱




I. **Knowledge Distillation**（知識蒸餾）
II. **Parameter Quantization**（參數量化）
III. **Network Architecture Design**（網路架構設計）

    1. Depthwise Separable Convolution 
    2. Low-Rank Approximation 
IV. **Dynamic Computation**

    1. Dynamic Depth 
    2. Dynamic Width 
    3. Network Self-Adjustment

V. **Summary**

---



知識蒸餾（$\text{Knowledge Destillation}$）是一種讓網路變小的方法。

*   **基本概念：**
    *   首先訓練一個**大網路**，稱為**教師網路**（$\text{teacher network}$）。
    *   訓練一個**小網路**，稱為**學生網路**（$\text{student network}$）。
    *   學生網路是根據教師網路來學習的。
*   **與 Network Pruning 的差異：**
    *   在 $\text{Network Pruning}$ 中，是直接修剪大網路得到小網路。
    *   在 $\text{Knowledge Destillation}$ 中，小網路是根據大網路的輸出進行學習。
*   **學習方法：**
    *   教師網路的輸出通常是**分類的分佈**（$\text{distribution}$）。
    *   學生網路使用相同的輸入圖片，但**不是去看圖片的正確答案**（$\text{Ground Truth}$）來學習。
    *   學生網路將**老師的輸出視為「正確答案」**，目標是讓學生的輸出盡量逼近老師的輸出。
    *   即使老師的答案是錯的，學生仍會根據老師的答案學習。
*   **優勢：**
    *   直接訓練一個小網路（$\text{from scratch}$）的結果，往往不如小網路根據大網路學習（蒸餾）而來的結果。
    *   教師網路的輸出提供了**額外的資訊**，例如不同數字之間可能存在的相似性（例如 1、7、9 之間的關係）。這能讓學生網路學習得更好。
*   **應用：**
    *   教師網路不一定是單一巨大網路，也可以是**多個網路的集合**（$\text{ensemble}$）。
    *   在這種情況下，教師網路的輸出是多個模型**投票**或**平均**的結果。學生網路學習這個集合的結果，使其能逼近集合網路的準確度。
*   **使用技巧：Temperature (T)**
    *   在 $\text{softmax}$ 函數中加入一個 $\text{temperature}$ 參數 $T$。
    *   在計算 $\text{exponential}$ 之前，將每個數值都除以 $T$。
    *   若 $T>1$，其作用是把原本**比較集中**（$\text{sharp}$）的分佈，變得**比較平滑**（比較平均）。
    *   若老師的輸出非常集中（某類別分數接近 1，其他接近 0），則與直接跟正確答案學習沒有不同。
    *   透過 $\text{temperature}$ 讓分佈平滑，才能讓 $\text{student}$ 網路學得更好。
    *   $T$ 是一個需要調整的超參數。
*   **進階限制：**
    *   除了輸出結果外，還可以限制學生網路的**中間層**（例如第 6 層）要像老師網路的特定層（例如第 12 層），通常這種限制可以得到更好的結果。

### II. Parameter Quantization（參數量化）

*   **目的：** 使用較少空間儲存參數，從而減少網路的大小。
    *   例如，將儲存一個參數所需的 $\text{bit}$ 數從 64 或 32 減少到 16 或 8。
*   **Clustering（分群）：**
    *   對網路的參數數值進行分群。數值接近的參數被歸為一組。
    *   **方法：** 事先設定分群數量（例如分成四群）。每群只拿**一個數值**（例如所有數值的平均值）來代表它。
    *   **儲存：** 只需要記錄一個表格（記錄每群代表的數值）以及記錄每個參數屬於哪一群。
    *   如果只設四群，儲存一個參數只需要 2 $\text{bit}$。
    *   **訓練考量：** 雖然有簡單的做法是先訓練完網路再做分群，但若希望結果更好，可以將「要求網路參數位彼此接近」作為 $\text{loss}$ 的一部分，塞到訓練過程中。
*   **Huffman Encoding（霍夫曼編碼）：**
    *   利用編碼技巧進一步壓縮參數。
    *   較常出現的數值用較少 $\text{bit}$ 描述，較罕見的數值用較多 $\text{bit}$ 描述，從而減少平均儲存所需的 $\text{bit}$ 數。
*   **Binary Weights（二元權重）：**
    *   **極致壓縮：** 每個參數只用 1 $\text{bit}$ 儲存，權重只能是**正一**或**負一**。
    *   **性能：** 有研究發現使用 $\text{binary network}$ 的結果，$\text{performance}$ 甚至比正常網路更好。
    *   **原因：** 這可能是因為給予網路較大限制，反而能達到**防止 overfeitting** 的效果。

### III. Network Architecture Design（網路架構設計）

透過設計網路架構來減少參數數量

#### 1. Depthwise Separable Convolution

深度可分離卷積分成兩個步驟：

*   **第一步：Depthwise Convolution**
    *   **運算邏輯：** 輸入有幾個 $\text{channel}$，就設置幾個 $\text{filter}$。
    *   **過濾器：** 每個 $\text{filter}$ **只負責一個 channel**。
    *   **結果：** 輸入和輸出的 $\text{channel}$ 數目是**一模一樣**的。
    *   **限制：** 由於每個 $\text{filter}$ 只看單一 $\text{channel}$，因此**不同 channel 之間沒有任何互動**。
*   **第二步：Pointwise Convolution**
    *   **運算邏輯：** 使用 $\mathbf{1 \times 1}$ 大小的 $\text{filter}$。
    *   **目的：** 專注於考量 **channel 和 channel 之間的關係**。
    *   **結果：** 輸入和輸出的 $\text{channel}$ 數目可以不一。

*   **參數數量比較：**
    *   假設 $\text{kernel size}$ 為 $K \times K$，輸入 $\text{channel}$ 數 $I$，輸出 $\text{channel}$ 數 $O$。
    *   一般 $\text{Convolution}$ 的參數總量是 $K \times K \times I \times O$。
    *   $\text{Depthwise}$ 部分的參數量是 $K \times K \times I$。
    *   $\text{Pointwise}$ 部分的參數量是 $I \times O$。
    *   兩種方法的參數量比例約為 $\frac{1}{O} + \frac{1}{K \times K}$。若 $\text{kernel size}$ 為 $3 \times 3$ (即 $K=3$)，網路大小可以變成原來的 $\frac{1}{9}$。

#### 2. Low-Rank Approximation

*   **原理：** $\text{Depthwise separable convolution}$ 的概念是將一層 $\text{network}$ **拆解成兩層**。
*   **類比：** 這與使用 $\text{low-rank approximation}$ 減少參數量的做法是一致的。
    *   如果一層網路輸入有 $N$ 個 $\text{neuron}$、輸出有 $n$ 個 $\text{neuron}$，參數量是 $N \times n$。
    *   若在中間插入一層只有 $K$ 個 $\text{neuron}$（且無 $\text{activation function}$），則參數量變成 $(N \times K) + (K \times n)$。
    *   若 $K$ 遠小於 $N$ 和 $n$，則 $\text{U}$ 和 $\text{V}$ 兩層的參數總量會比原來的 $W$ 少得多。

### IV. Dynamic Computation

動態運算（$\text{Dynamic Computation}$）的目標是讓網路能**自由調整**所需的**運算量**。

*   **動機：**
    *   **跨設備：** 應付不同 $\text{device}$ 擁有不同的運算資源。
    *   **情境變化：** 即使在同一個 $\text{device}$ 上，也可能需要根據電量等現有資源來調整運算量。
    *   **避免冗餘：** 避免為應付所有情況而訓練大量 $\text{network}$ 導致儲存空間有限。

#### 1. Dynamic Depth

*   **設計：** 訓練一個很深的網路，但在中間層加入**額外的 $\text{layer}$**，讓網路可以根據 $\text{hidden layer}$ 的輸出決定分類結果。
*   **訓練方法：**
    *   在訓練時，除了最後一層，也要求**每一個額外 $\text{layer}$ 的輸出**都與 $\text{Ground Truth}$ 越接近越好。
    *   將所有輸出的 $\text{loss}$（與 $\text{Ground Truth}$ 的 $\text{cross entropy}$）加總後最小化。
*   **應用：** 運算資源不足時，可讓網路在較淺的 $\text{layer}$ 提前輸出結果。

#### 2. Dynamic Width

*   **設計：** 網路本身可以選擇不同的寬度（使用的 $\text{neuron}$ 數量）。
*   **關鍵：** 這些不同寬度下的網路**是同一個網路**，只是選擇性地使用部分 $\text{neuron}$（例如使用 75% 參數或 50% 參數）。
*   **訓練方法：** 將所有不同寬度的輸出都與 $\text{Ground Truth}$ 計算距離，並最小化 $\text{loss}$。

#### 3. Network Self-Adjustment

*   **目標：** 讓網路**自行決定**寬度或深度。
*   **動機：** 即使資源充足，也希望簡單的輸入使用較少運算。
*   **例如：** 對於簡單的影像，網路只需通過第一層即停止；對於比較困難的影像（例如被做成墨西哥捲餅的貓），則需要跑到最後一層才能正確判斷。

### V. 總結

$\text{Network Compression}$（網路壓縮）的各個技術，包括網路架構設計、知識蒸餾、網路修剪和參數量化等，**並非互相排斥**。如果目標是將網路壓縮到極小的程度，這些方法可以**一起組合使用**。

[【機器學習2021】01~02 機器學習和深度學習基本概念簡介](https://hackmd.io/@JuitingChen/SyoNXkdslx)
[【機器學習2021】03~08 機器學習任務攻略和最佳化技巧](https://hackmd.io/@JuitingChen/BJ6mXy_slg)
[【機器學習2021】09~11 CNN 和 Self attention](https://hackmd.io/@JuitingChen/r1ahLgUngl)
[【機器學習2021】12~13 Transformer](https://hackmd.io/@JuitingChen/H1tfXy_ige)
[【機器學習2021】14~17 GAN](https://hackmd.io/@JuitingChen/S1adiwvhxg)
[【機器學習2021】18~21 自監督式學習](https://hackmd.io/@JuitingChen/ryQG7J_sgl)
[【機器學習2021】22~23 Auto-encoder](https://hackmd.io/@JuitingChen/r1sLPr92ge)
[【機器學習2021】24~25 Adversarial Attack ](https://hackmd.io/@JuitingChen/HJ6jJIq3ge)
[【機器學習2021】26~28 Explainable ML 和 Domain Adaptation](https://hackmd.io/@JuitingChen/SJZzQkdslg)
[【機器學習2021】29-30 強化學習-1](https://hackmd.io/@JuitingChen/HJYziZR3gx)
[【機器學習2021】31~33 強化學習-2](https://hackmd.io/@JuitingChen/Sy5DoWA3xl)
[【機器學習2021】34~35 機器終身學習](https://hackmd.io/@JuitingChen/BytWmyuilg)
[【機器學習2021】36~37 神經網路壓縮 ](https://hackmd.io/@JuitingChen/Bk7-m1_jlx)
[【機器學習2021】37~40 Meta Learning](https://hackmd.io/@JuitingChen/SkkC6rT2gl)

