LoRA 与 QLoRA 微调入门¶
这篇解释微调里最常见的两个词:
- LoRA
- QLoRA
先记住一句话:
LoRA 是少训练一点参数,QLoRA 是把底座模型量化后再做 LoRA。
为什么不直接全量微调¶
全量微调会更新模型大部分参数。
这会带来问题:
- 显存占用高。
- 训练成本高。
- checkpoint 很大。
- 容易把底座模型原有能力改坏。
LoRA 的思路是:
原模型参数冻结
↓
在部分线性层旁边加小 adapter
↓
只训练 adapter
这样训练更轻。
LoRA 参数¶
常见参数:
| 参数 | 直觉 |
|---|---|
r |
adapter 的容量,越大越能学,也越占资源 |
lora_alpha |
LoRA 更新强度 |
lora_dropout |
防止过拟合 |
target_modules |
把 LoRA 加到哪些层上 |
入门可以先这样理解:
r 太小:学不进去
r 太大:更慢、更占显存,也可能过拟合
QLoRA¶
QLoRA 通常会把底座模型用 4bit 方式加载。
直觉:
底座模型压小
↓
冻结底座参数
↓
训练 LoRA adapter
它适合显存有限的场景。
代价是训练和推理链路会更复杂,某些任务也可能对量化更敏感。
SFT 数据格式¶
SFT 是 supervised fine-tuning,监督微调。
常见样本像这样:
{
"instruction": "解释什么是 KV Cache",
"input": "",
"output": "KV Cache 是在生成时缓存历史 token 的 Key 和 Value,避免重复计算。"
}
也可以是聊天格式:
{
"messages": [
{"role": "system", "content": "你是一个机器学习老师。"},
{"role": "user", "content": "解释什么是 KV Cache"},
{"role": "assistant", "content": "KV Cache 是在生成时缓存历史 token 的 Key 和 Value,避免重复计算。"}
]
}
关键不是格式长什么样,而是:
训练框架最终会把它渲染成模型对应的 chat template。
如果 template 错了,模型会学错对话格式。
训练流程¶
一次 LoRA 微调大概是:
选择底座模型
↓
准备 SFT 数据
↓
选择 chat template
↓
加载 tokenizer
↓
加载模型
↓
注入 LoRA adapter
↓
训练
↓
验证
↓
保存 adapter
↓
合并或部署 adapter
Unsloth 适合什么¶
Unsloth 适合先跑通 LoRA / QLoRA。
它更偏:
- 快速上手。
- 单机 GPU。
- 更省显存。
- 少写训练样板代码。
适合第一轮实验:
我有一批数据,想先看看微调有没有效果。
LLaMA-Factory 适合什么¶
LLaMA-Factory 更像统一训练平台。
它适合:
- 配置化训练。
- 多模型实验。
- 多数据集实验。
- SFT、LoRA、DPO 等方法对比。
- Web UI 或 CLI 管理训练。
适合系统化实验:
我要比较多个模型、多个数据集、多个训练配置。
训练后怎么用¶
训练完通常有两种选择。
只保存 adapter¶
底座模型 + LoRA adapter
优点:
- 文件小。
- 可以切换多个 adapter。
缺点:
- 部署时要确保推理框架支持加载 adapter。
合并模型¶
底座模型 + adapter -> 合并后的模型
优点:
- 部署更简单。
缺点:
- 文件更大。
- 多 adapter 切换不方便。
如何判断微调是否有效¶
不要只看训练 loss。
至少看:
- 验证集 loss。
- 固定测试问题的回答。
- 格式是否稳定。
- 有没有学会业务术语。
- 有没有变得更容易幻觉。
- 有没有破坏通用能力。
可以准备一个小 eval 集:
20 个格式测试
20 个业务问答
20 个边界问题
20 个拒答或安全问题
常见误区¶
误区 1:有新知识就微调¶
不一定。
知识经常变化时,RAG 更适合。
微调更适合学格式、风格、流程和稳定任务模式。
误区 2:数据越多越好¶
不一定。
低质量数据会把模型带偏。
小而干净的数据集,常常比大而脏的数据集更好。
误区 3:LoRA 不会影响底座能力¶
也可能影响。
尤其是数据很偏、学习率太大、训练轮数太多时。
下一步¶
继续看: