六合彩AI預測賽後檢討!邊個模型預測最叻? 每次攪珠當晚10:30更新免費睇!

模型壓縮:幫你嘅機器學習模型變輕變快!

Ai

模型壓縮:令你的機器學習模型更輕巧更快

深入解析剪枝、量化、低秩分解與知識蒸餾等技術,助你打造更高效、易部署的神經網絡。

引言

無論你是準備面試還是在工作中建構機器學習系統,模型壓縮已成為必備技能。隨著大型語言模型(LLM)規模日益龐大,如何壓縮模型使其更高效、更小巧,並能在輕量級設備上運行,變得極為重要。

本文將介紹四種基本的壓縮技術,讓每位機器學習從業員都能理解和掌握:剪枝(pruning)、量化(quantization)、低秩分解(low-rank factorization)和知識蒸餾(Knowledge Distillation)。文中亦附上簡單的PyTorch代碼示例,方便實踐。

模型剪枝

剪枝是最直觀的壓縮技術,核心思想是刪除部分神經網絡的權重,通常是將「不重要」的權重設為零。

常見的剪枝方法有:

結構化剪枝:刪除整個網絡結構的部分,如權重矩陣中的整行或卷積層中的整個通道。
非結構化剪枝:刪除個別權重,不考慮其在矩陣中的位置。

還有一種叫做全局剪枝的做法,會跨多層刪除一定比例的權重,根據每層參數數量設定不同刪除比例。

PyTorch提供了方便的剪枝API,以下為部分示例:

“`python
import torch.nn.utils.prune as prune

# 1. 隨機非結構化剪枝,刪除20%權重
prune.random_unstructured(model.layer, name=”weight”, amount=0.2)

# 2. L1範數非結構化剪枝,刪除20%最小權重
prune.l1_unstructured(model.layer, name=”weight”, amount=0.2)

# 3. 全局非結構化剪枝,跨多層刪除40%權重
prune.global_unstructured(
[(model.layer1, “weight”), (model.layer2, “weight”)],
pruning_method=prune.L1Unstructured,
amount=0.4
)

# 4. 結構化剪枝,刪除30% L2範數最小的行
prune.ln_structured(model.layer, name=”weight”, amount=0.3, n=2, dim=0)
“`

值得一提的是,剪枝與正則化(如L0或L1正則化)不同,正則化是在訓練中隱式地讓部分權重趨近於零,而剪枝是在訓練後明確將權重置零。

為何剪枝有效?—樂透票假說(Lottery Ticket Hypothesis)

樂透票假說指出,在一個大模型中存在子網絡(“中獎的樂透票”)能夠以較少的參數達到與原模型相當的表現。具體方法是:

1. 訓練完整模型至收斂
2. 剪除最小權重(如10%)
3. 將剩餘權重重置為初始值
4. 重新訓練該子網絡
5. 重複以上步驟多次

經過多次迭代後,剩餘的參數僅佔原來的約4%,但性能不輸原模型。這證明了模型中存在大量冗餘,剪枝能幫助找到這些高效子網絡。

量化

量化則是將模型權重和激活值的數字精度降低,例如將32位浮點數(FP32)轉換為8位整數(INT8),從而大幅減少模型所需的存儲空間。

以INT8為例,數值範圍是-128到127,通過縮放比例將浮點數映射到這個離散區間。轉換過程中,我們需要確保模型性能不受太大影響。

量化方法主要有:

訓練後量化(Post-Training Quantization, PTQ)
– 靜態量化:訓練完成後,離線量化權重和激活值。
– 動態量化:離線量化權重,但激活值在推理時動態量化。

量化感知訓練(Quantization-Aware Training, QAT)
在訓練過程中模擬量化的影響,讓模型學會容忍量化誤差,從而保持較高精度。

以下是部分PyTorch量化示例:

“`python
import torch.quantization as tq

# 1. 靜態量化
model.eval()
model.qconfig = tq.get_default_qconfig(‘fbgemm’)
tq.prepare(model, inplace=True)
with torch.no_grad():
for data, _ in calibration_data:
model(data)
tq.convert(model, inplace=True)

# 2. 動態量化
dynamic_model = tq.quantize_dynamic(
model,
{torch.nn.Linear, torch.nn.LSTM},
dtype=torch.qint8
)

# 3. 量化感知訓練
model.train()
model.qconfig = tq.get_default_qat_qconfig(‘fbgemm’)
tq.prepare_qat(model, inplace=True)
# 訓練或微調模型
qat_model = tq.convert(model.eval(), inplace=False)
“`

量化靈活性高,可針對不同層採用不同精度設定。

低秩分解

低秩分解是基於觀察到神經網絡中的權重矩陣往往存在大量冗餘,實際有效秩遠低於矩陣維度。透過奇異值分解(SVD),可將大矩陣近似分解為兩個較小矩陣的乘積,從而大幅減少參數量。

假設權重矩陣W的尺寸為m×n,秩為r,選擇k < r的秩來近似:

W_k = U_k Σ_k V_k^T ≈ A × B

其中A為m×k,B為k×n,參數數量從m×n降至k(m+n),當k遠小於m、n時,節省非常可觀。

在PyTorch中可以用以下方法實現:

“`python
import torch

W = model.layer.weight.data
k = 64 # 設定秩
U, S, V = torch.svd_lowrank(W, q=k)

A = U * S.sqrt()
B = V.t() * S.sqrt().unsqueeze(1)

orig = model.layer
model.layer = torch.nn.Sequential(
torch.nn.Linear(orig.in_features, k, bias=False),
torch.nn.Linear(k, orig.out_features, bias=False),
)
model.layer[0].weight.data.copy_(B)
model.layer[1].weight.data.copy_(A)
“`

此外,低秩分解在LLM微調中廣受關注的LoRA(Low-Rank Adaptation)技術中發揮重要作用。LoRA通過凍結原始模型權重,僅訓練低秩更新矩陣,實現高效微調。進一步,QLoRA結合了量化和低秩微調,提升效果。

知識蒸餾

知識蒸餾的思路與前述方法不同,並非直接改變模型參數,而是將一個大型複雜模型(教師)所學到的知識「轉移」給一個較小的模型(學生),使學生模型能模仿教師的行為並達到相似的性能。

在分類問題中,教師模型的預測概率(軟目標)提供了比硬標籤更多的信息。透過調節軟目標的溫度參數(temperature),可以軟化預測分布,讓學生模型更重視教師模型在錯誤類別上的信心分佈。

訓練過程中,總損失是硬標籤的交叉熵損失與教師學生分佈的KL散度損失的加權和:

L_total = α L_hard + (1 – α) L_distill

其中L_distill是教師與學生預測分佈的KL散度。

知識蒸餾可分為:

離線蒸餾:教師模型固定,學生模型訓練模仿教師。
在線蒸餾:教師和學生模型同時訓練,知識在訓練過程中同步轉移。

以下為離線蒸餾的PyTorch示例:

“`python
import torch.nn.functional as F

def distillation_loss_fn(student_logits, teacher_logits, labels, temperature=2.0, alpha=0.5):
student_loss = F.cross_entropy(student_logits, labels)
soft_teacher_probs = F.softmax(teacher_logits / temperature, dim=-1)
soft_student_log_probs = F.log_softmax(student_logits / temperature, dim=-1)

distill_loss = F.kl_div(
soft_student_log_probs,
soft_teacher_probs.detach(),
reduction=’batchmean’
) * (temperature ** 2)

total_loss = alpha * student_loss + (1 – alpha) * distill_loss
return total_loss

teacher_model.eval()
student_model.train()
with torch.no_grad():
teacher_logits = teacher_model(inputs)
student_logits = student_model(inputs)
loss = distillation_loss_fn(student_logits, teacher_logits, labels, temperature=T, alpha=alpha)
loss.backward()
optimizer.step()
“`

結語

感謝閱讀!在LLM時代,模型參數規模動輒數十億甚至數萬億,模型壓縮成為讓模型更高效、易於部署的基石。

模型壓縮不僅是縮小模型體積,更是關於如何做出明智的設計抉擇。選擇在線或離線方法、壓縮整個網絡還是特定層或通道,都會深刻影響模型性能與實用性。當今多數模型往往結合多種壓縮技術,達成最佳效果。

希望本文不僅讓你掌握主要方法,更激發你嘗試並開發屬於自己的創新解決方案!

編輯評論

這篇文章全面而深入地介紹了機器學習模型壓縮的核心技術,從剪枝、量化、低秩分解到知識蒸餾,涵蓋了理論基礎、數學原理及實際代碼,對於有一定基礎的讀者尤其實用。

值得注意的是,隨著大型模型在產業界的普及,模型壓縮不再是學術研究的附屬品,而是商業部署的必要條件。尤其是在邊緣設備、移動端以及資源有限的環境中,如何在不大幅犧牲性能的前提下減小模型體積和推理延遲,是現實需求。

此外,作者點出壓縮技術的靈活組合與設計決策的重要性,這是實務中常被忽略的面向。實際應用時,單一技術往往難以滿足所有需求,混合使用並根據具體場景調整參數,才能達致最佳平衡。

未來,隨著量化技術的進步(如混合精度量化)、剪枝自動化(AutoML剪枝)、以及知識蒸餾在跨模態學習中的應用深化,模型壓縮將更加智能和高效。讀者若能掌握這些基礎,再結合實際場景探索,將在機器學習部署領域贏得先機。

總而言之,這是一篇值得推薦給機器學習工程師、研究者及對模型優化感興趣的技術愛好者的優質入門與進階指南。

以上文章由特價GPT API KEY所翻譯及撰寫。而圖片則由FLUX根據內容自動生成。

Chat Icon