LoRA 是什麼:用三個參數理解它在做的事
不用讀論文也能正確使用 LoRA。理解 rank、alpha 與目標模組這三件事就夠了。
LoRA 的核心想法是:不要動原本的權重,而是在旁邊加上一組很小的低秩矩陣去學「差異」。訓練時只更新這組小矩陣,記憶體與儲存成本因此大幅下降。
rank(秩)
決定那組小矩陣的容量。rank 越大能學的變化越多,但也越容易過擬合、檔案越大。
- 格式與語氣調整:8 或 16 通常足夠。
- 需要學習新任務邏輯:32 到 64。
- 超過 128 之後,多數情況下收益有限,不如檢查資料品質。
alpha(縮放)
控制 LoRA 分支的影響力,實際縮放係數是 alpha / rank。常見設定是 alpha = 2 × rank,也就是縮放係數維持在 2 左右。換 rank 時記得同步調 alpha,否則等於連學習強度也一起改了。
目標模組
決定要在哪些層加上 LoRA。只加注意力的 q、v 投影最省,加上所有線性層效果最好但成本較高。
from peft import LoraConfig
config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=['q_proj', 'k_proj', 'v_proj', 'o_proj'],
lora_dropout=0.05,
task_type='CAUSAL_LM',
)為什麼實務上幾乎都用 LoRA
- 可訓練參數通常不到全參數的百分之一,單卡就能跑。
- 產出的介面卡(adapter)只有幾十 MB,方便版本管理。
- 同一個底座可以掛不同介面卡,切換任務不必重新載入整個模型。
先用 rank=16 跑一次當基準,再往上下各試一檔。直接從 rank=128 起跑很容易得到「訓練損失很漂亮但實際更糟」的結果。