📖 定义
Fine-tuning(微调)是指在预训练大模型的基础上,使用特定领域的数据进行进一步训练,使模型能够:
- 📚 学习特定知识 - 掌握特定领域的专业术语和概念
- 🎯 优化输出格式 - 按指定格式生成回答
- 💬 改善对话风格 - 适配特定的人设或语气
- ✅ 提升任务表现 - 在特定任务上获得更好的效果
vs RAG:微调是"让模型本身学会知识",RAG是"让模型能查到知识"。两者可以结合使用。
📊 微调 vs 预训练 vs RAG
| 对比项 | 预训练 | Fine-tuning | RAG |
|---|---|---|---|
| 数据需求 | TB级海量数据 | 千条~万条高质量数据 | 文档/知识库 |
| 计算成本 | 极高(百万美元) | 中等(数百~数千美元) | 低 |
| 知识更新 | 需重新训练 | 需重新训练 | 直接更新文档 |
| 适用场景 | 从零构建基础模型 | 特定任务/风格优化 | 知识密集型问答 |
🛠️ 主流微调技术
1. LoRA (Low-Rank Adaptation)
通过在模型的注意力权重矩阵旁边添加低秩矩阵来实现微调,训练参数减少90%+
核心思想:冻结原模型,训练少量参数
2. QLoRA (Quantized LoRA)
结合4-bit量化+LoRA,可在单张消费级GPU上微调65B参数模型
优势:显存需求大幅降低
3. RLHF (Reinforcement Learning from Human Feedback)
使用人类反馈的强化学习,让模型学习人类偏好的回答
代表:InstructGPT, ChatGPT
4. P-tuning / Prompt-tuning
仅微调"虚拟token"嵌入,不改变模型参数
优势:参数量极小
5. Full Fine-tuning
微调模型全部参数,效果最好但资源消耗最大
适用:有充足GPU资源
💻 代码示例
使用 PEFT (LoRA) 微调 LLaMA
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model, TaskType
import torch
# 1. 加载基础模型
model_name = "meta-llama/Llama-2-7b-hf"
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16,
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 2. 配置LoRA
lora_config = LoraConfig(
r=8, # LoRA rank
lora_alpha=16, # LoRA scaling
target_modules=["q_proj", "v_proj"], # 目标模块
lora_dropout=0.05,
bias="none",
task_type=TaskType.CAUSAL_LM
)
# 3. 应用LoRA
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# 输出: trainable params: 4,194,304 || all params: 6,742,609,920 || trainable%: 0.06%
# 4. 训练
from transformers import Trainer, TrainingArguments
training_args = TrainingArguments(
output_dir="./lora-llama",
num_train_epochs=3,
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=2e-4,
fp16=True,
save_strategy="epoch",
save_total_limit=3,
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
tokenizer=tokenizer,
)
trainer.train()
# 5. 保存
model.save_pretrained("./lora-llama-adapter")
使用 QLoRA 微调
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model
from bitsandbytes import BitsAndBytesConfig
import torch
# 1. 4-bit量化配置
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True,
)
# 2. 加载量化模型
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-7b-hf",
quantization_config=bnb_config,
device_map="auto",
)
# 3. 后续步骤与LoRA相同...
lora_config = LoraConfig(r=16, lora_alpha=32, target_modules=["q_proj", "v_proj"])
model = get_peft_model(model, lora_config)
📋 微调步骤全流程
1
数据准备
收集/构建高质量训练数据,格式化为Instruction数据集
2
数据格式化
转换为模型适用的格式 (如Alpaca格式)
3
模型选择
选择合适的基础模型 (LLaMA, Qwen, ChatGLM等)
4
配置微调
设置超参数、LoRA配置等
5
训练执行
开始训练,监控loss曲线
6
模型评估
使用测试集评估模型效果
7
模型部署
合并Adapter并导出,部署推理服务
🛠️ 常用工具
PEFT
HuggingFace高效微调库
DeepSpeed
微软分布式训练框架
Unsloth
加速微调工具 (2x更快)
Axolotl
一键微调工具
MLX
Apple芯片微调框架
Fireworks.ai
托管微调服务
⚠️ 常见问题
Q: 微调需要多少数据?
A: 通常100-1000条高质量数据即可见效果,数据质量比数量更重要
Q: 会丢失原有能力吗?
A: 可能发生"灾难性遗忘",可用混合训练或RAG缓解
Q: 如何选择LoRA的rank?
A: 常用8-64,越大越接近全参数微调效果,但也需要更多显存