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)