fine-tuning、prompt engineering、RAG 怎么选?
LoRA 怎么做、参数有多少?
先弄清楚:每个概念是什么
- PEFT
- 冻住原模型,只训练一小撮新加的参数,每个 task 一份,随时换。
- LoRA
- 假设 fine-tuning 带来的改动 \(\Delta W\) 是 low-rank 的,用两个瘦矩阵的乘积 \(BA\) 表示。
- QLoRA
- 把冻住的 base model 压成 4-bit 存,计算时 dequantize 成 BF16,gradient 只更新 LoRA 参数。例:65B 模型 fine-tuning 的 GPU memory 从 >780GB 降到 <48GB。
30 秒回答
Start with prompt engineering, the cheapest. If the model lacks private or fresh knowledge, add RAG; if it needs a new behavior, format or domain skill, fine-tune. They're often combined. Full fine-tuning is expensive, so we use PEFT. LoRA freezes the pretrained weight and learns a low-rank update BA, with B of size d×r and A of size r×k, scaled by α/r. A is random Gaussian and B is zero, so training starts from the pretrained model. A d×d matrix needs 2dr trainable parameters instead of d². At inference BA merges into W, so there's no extra latency. QLoRA keeps the frozen base in 4-bit NF4.
怎么选
| Prompt engineering | RAG | Fine-tuning(LoRA) | |
|---|---|---|---|
| 改什么 | 输入(指令、few-shot) | 输入 + 外部知识 | weight |
| 适合 | 模型本来就会,只是没说清 | 私有、最新知识,要 citation | 固定格式、风格、domain 能力 |
| 代价 | 最低;占 context | 建 index、多一步检索 | 要数据和 GPU;可能 catastrophic forgetting |
关键公式
LoRA forward
\[ h = W_0 x + \frac{\alpha}{r}\, B A x \] \[ B \in \mathbb{R}^{d\times r},\quad A \in \mathbb{R}^{r\times k},\quad r \ll \min(d, k) \]\(W_0\) 冻住,只训练 \(A\)、\(B\)。
推理时 merge
\[ W = W_0 + \frac{\alpha}{r}\, BA \]和原模型一样大、一样快,换 task 时换一组 \(BA\)。
参数怎么算
每个被加 LoRA 的 \(d\times k\) 矩阵多 \(r(d+k)\) 个参数;方阵就是 \(2dr\)。原论文写成 \(|\Theta| = 2\hat L\, d_{\text{model}}\, r\),\(\hat L\) 是加了 LoRA 的矩阵个数。
- 一个 \(W_q\),\(d = 4096\)、\(r = 8\):原矩阵 \(4096^2 = 16{,}777{,}216\) 个,LoRA 只要 \(2\times4096\times8 = 65{,}536\) 个(少 256 倍)
- LLaMA-7B(32 层,\(d = 4096\))只加在 \(W_q\)、\(W_v\):\(\hat L = 64\),\(2\times64\times4096\times8 = 4{,}194{,}304 \approx 4.2\)M,约占 6.7B 的 0.06%
- QLoRA:trainable 参数和 LoRA 一样;base 每个参数 4 bit + 量化常数 0.127 bit,6.7B × 4.127 bit ≈ 3.5GB(FP16 要 13.4GB)
必答点
- 先 prompt,缺知识用 RAG,缺行为 / 能力才 fine-tune
- LoRA:\(W_0\) 冻住,\(\Delta W = BA\),scale \(\alpha/r\)
- init:\(A\) Gaussian、\(B = 0\) → 起点就是原模型
- 参数:方阵 \(d^2 \to 2dr\);\(d = 4096\)、\(r = 8\) 时 65,536
- 推理 merge 进 \(W\),无额外 latency;QLoRA = 4-bit NF4 base + LoRA
追问
为什么 B 初始化为 0?A 和 B 都设 0 行不行?
\(B = 0\) 让训练从原模型出发。记 \(g = \partial L/\partial h\),\(A\) 随机保证 \(\partial L/\partial B = g\,(Ax)^\top \ne 0\),\(B\) 先动起来,\(A\) 接着动。两个都是 0 时,\(\partial L/\partial B\) 和 \(\partial L/\partial A = B^\top g\, x^\top\) 都是 0,永远学不动。
r 和 α 怎么设?加在哪些矩阵上?
原论文 GPT-3 上 \(r = 1\) 就够适配 \(W_q, W_v\)。同样约 18M 参数,加在 \(W_q, W_v\)(\(r = 4\))比只加 \(W_q\)(\(r = 8\))好。\(\alpha\) 设成第一次试的 \(r\) 后不再调。QLoRA 要加在所有 linear layer 上才追得上 full fine-tuning。
LoRA 训练省的是什么?
frozen 参数不用存 gradient 和 Adam 状态。GPT-3 175B 训练的 GPU memory 从 1.2TB 降到 350GB,checkpoint 从 350GB 降到 35MB,训练快约 25%。activation 照样要存。
QLoRA 具体多了什么?
4-bit NormalFloat(NF4)存 base。Double Quantization 把量化常数也量化,从 0.5 降到 0.127 bit/参数。Paged Optimizers 用 unified memory 扛住 GPU memory 峰值。
怎么防 catastrophic forgetting?
混入通用数据 replay。learning rate 更小、step 更少。用 PEFT 冻住原 weight。对原模型输出加 KL penalty,或做 model merging。
来源Hu et al. 2021, LoRA §4.1(p.4,eq. 3、init、\(\alpha/r\)、merge)、§4.2(p.5,显存、checkpoint、25%)、§5.1(p.6,\(|\Theta|\))、§7.1–7.2 Table 5–6(p.10)· Dettmers et al. 2023, QLoRA abstract(p.1)、§1(p.2,780GB → 48GB)、§3(pp.4–5,NF4、DQ 0.127 bit、BF16)、§4(p.6,all linear layers)· Touvron et al. 2023, LLaMA Table 2(p.3)· Lewis et al. 2020 §4.5(p.7,index hot-swapping)