搬動每一個權重的代價
完整微調會更新一個模型的「所有」參數。以一個 70 億參數的模型來說,這代表你得同時放著權重、它們的梯度、以及最佳化器的滾動統計量——往往超過 80 GB 的GPU 記憶體,是模型本身大小的好幾倍。這讓完整微調對多數人遙不可及,也讓每一次實驗都又慢又貴。
參數高效微調(parameter-efficient fine-tuning,PEFT)用一個賭注繞過整個問題:把那個巨大的基礎模型「凍結」起來、只訓練少量的新參數,就能抓住微調所需的大部分東西。從實證上看,這個賭注成功的次數高得驚人。
全量微调要训练矩阵的全部 d×k 个权重;PEFT 只训练 r(d+k) 个,当秩 r 很小时这只是极小的一部分。
LoRA:主力幹將
LoRA(低秩適配,Low-Rank Adaptation)是多數人講 PEFT 時心裡想的那個方法。它的洞見是:微調對一個大權重矩陣造成的「改變量」通常是低秩的——可以用兩個瘦長矩陣相乘很好地逼近。所以 LoRA 不去動那個凍結的權重,而是在它旁邊學那兩個小矩陣,再把它們的乘積加回去。最後可訓練的參數通常不到 1%。
LoRA 冻结基础矩阵 W₀,把它的更新学成低秩乘积 BA,并用 α/r 缩放。
# A typical LoRA setup
rank r = 16 # width of the low-rank update
lora_alpha = 32 # scaling applied to the update
target_modules = [q_proj, k_proj, # which weight matrices get an
v_proj, o_proj] # adapter (often the attention ones)
dropout = 0.05
# Base weights stay frozen; only the small r-sized matrices train.QLoRA:用一張顯示卡微調大模型
QLoRA把省記憶體推得更遠,做法是把 LoRA 與量化(quantization)結合:它以 4 位元精度載入凍結的基礎模型,再在上頭以正常精度訓練 LoRA 適配器。基礎模型幾乎不佔記憶體,因為它被量化了、而且永遠不更新;同時可訓練的適配器仍保持精準。這正是為什麼有人能在單張消費級或中等雲端 GPU 上,微調 13B 到 70B 的模型。
適配器與軟提示
LoRA 只是一個更大家族裡的一支。適配器模組(adapter modules)在凍結的 transformer 層之間插入小小的瓶頸層,只訓練那些層——這是個較早的點子,LoRA 在某種程度上把它精簡了。軟提示微調(soft prompt tuning)更輕:它凍結整個網路,只學少數幾個「連續」的嵌入向量,附加在輸入前面——一種活在向量空間、而非文字裡的可訓練提示。
Transformer 块示意图:层归一化、注意力、残差连接和前馈网络。
這些方法用一點點準確度,換來更少的可訓練參數與更小的成品檔案。實務上今天由 LoRA 與 QLoRA 主導,但認識整個家族能幫你看出那個共通的點子:「凍結那個巨人,訓練一個小東西」。
完整 vs PEFT:各自的勝場
- 預設就用 PEFT(LoRA/QLoRA):便宜、迭代快、容易同時托管多個變體,而且在大多數行為與風格任務上能追平完整微調。
- 當你要教一項龐大的「新能力」、或吸收大量新領域知識,而且你有足夠的硬體與資料來支撐時,再考慮完整微調。
- 無論選哪個,都要也和「原始」模型對照評估——有時基礎模型本來就能勝任,微調只是徒增風險。