大模型微调:从 SFT 到 RLHF 与参数高效微调
预训练让模型获得了广博的世界知识与基础语言能力,但一个只在海量文本上做过自监督训练的基座模型,往往不能直接胜任具体任务——它可能输出冗长、拒绝指令、答非所问,或在格式上不可控。微调(Fine-Tuning)正是把通用基座模型”对齐”到特定目标、领域或交互范式上的关键一步。本文梳理从监督微调(SFT)到基于人类反馈的强化学习(RLHF),再到参数高效微调(PEFT)的完整技术谱系,并讨论其成本与取舍。
为什么需要微调
预训练的损失函数是”预测下一个 token”,优化目标与”有用地响应用户意图”并不一致。微调要解决三类问题:其一,把模型的行为适配到特定任务格式(如分类、抽取、函数调用);其二,让模型学会遵循自然语言指令而非被动续写;其三,注入领域知识或对齐人类偏好(减少有害、不实输出)。根据目标与预算的不同,微调可以在参数规模、数据与算法三个维度上做不同选择。
SFT:监督式微调
监督微调(Supervised Fine-Tuning, SFT)是微调的第一阶段:用人工编写或高质量采集的”指令-回答”配对数据,以标准语言建模损失继续训练模型。形式上,给定提示 x 与期望回答 y,最小化:
L_SFT = -Σ_t log P(y_t | x, y_<t; θ)
SFT 的数据质量远比数量重要。一份几千条、覆盖多样场景且经过严格清洗的指令集,往往胜过数十条噪声数据。SFT 阶段通常使用较小的学习率,并保留基座模型的通用能力,避免”灾难性遗忘”。这一步骤也是后续 RLHF 的稳定起点。
RLHF:基于人类反馈的强化学习
SFT 之后的模型仍可能”听起来合理但事实错误”。RLHF 通过引入人类偏好信号来进一步对齐行为。以 InstructGPT 的工作流程(Ouyang et al., 2022)为代表,RLHF 分为三步:
- 用 SFT 模型采样多个回答,由标注者对回答质量排序,训练一个奖励模型(Reward Model, RM),拟合 Bradley-Terry 偏好概率;
- 以 RM 为奖励信号,用强化学习(通常是 PPO)优化策略模型,使其最大化期望奖励;
- 在优化目标中加入对参考模型(SFT 模型)的 KL 惩罚项,防止模型为了骗奖励而偏离合理分布。
其目标函数形如:
max_θ E_{x∼D, y∼π_θ}[ r(x, y) ] - β · KL( π_θ(y|x) ‖ π_ref(y|x) )
RLHF 显著提升了回答的有用性与真实性,但也带来流程复杂、训练不稳定、需要额外训练奖励模型等工程负担。因此后续出现了 DPO(Direct Preference Optimization, Rafailov et al., 2023)等”免奖励模型”的简化替代方案,它们把偏好对齐转化为一个直接的分类损失,更易于训练。
指令微调与对齐
指令微调(Instruction Tuning)是一类以”指令-执行”为范式的 SFT:通过大量不同任务的指令样本,让模型具备零样本/少样本泛化到新指令的能力。FLAN、T0、Self-Instruct 等工作表明,指令微调是激发模型已有能力、而非灌输新知识的关键。对齐(Alignment)则是一个更宽泛的目标——让模型行为符合人类价值观与意图,SFT 与 RLHF 都是对齐手段。需要强调的是,对齐不是”让模型变笨”,而是让它在该帮忙时帮忙、在该拒绝时拒绝。
全参数微调 vs 参数高效微调
全参数微调(Full Fine-Tuning)更新模型所有权重,理论上拟合能力最强,但对算力与显存要求极高:以 7B 模型为例,仅保存优化器状态与梯度就可能需要数十 GB 显存,更大模型往往需要多卡分布式训练。参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)只训练注入的少量参数或权重增量,冻结基座主体,从而在单卡上完成定制。
二者权衡可概括为:
- 数据量极大、追求极致任务性能且有充足算力时,全参数微调仍有优势;
- 多任务部署、资源受限、需要为不同客户保存多份轻量”适配器”时,PEFT 更经济。
LoRA:低秩适配
LoRA(Low-Rank Adaptation, Hu et al., 2021)的核心思想是:权重的更新量 ΔW 往往是”低秩”的。因此不更新原始大矩阵 W ∈ R^{d×k},而是用两个小矩阵 B ∈ R^{d×r} 与 A ∈ R^{r×k}(其中 r ≪ min(d, k))来近似 ΔW = BA,前向计算变为:
h = W·x + (B·A)·x
训练时只优化 A 与 B,参数量可降至全量的万分之一量级,显存占用显著降低,且推理时无额外延迟(可将 BA 合并回 W)。用 Hugging Face PEFT 的典型用法如下:
from peft import LoraConfig, get_peft_model
config = LoraConfig(
r=8,
lora_alpha=16,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
)
model = get_peft_model(base_model, config)
model.print_trainable_parameters()
QLoRA:量化微调
QLoRA(Dettmers et al., 2023)在 LoRA 基础上进一步把基座模型量化为 4-bit(NF4 数据类型),使 65B 模型也能在单张 48GB 显卡上完成微调,同时宣称保留接近 16-bit 全量微调的任务表现。它引入了三项关键创新:4-bit NormalFloat(NF4)数据格式、双重量化(量化量化常数本身)、以及分页优化器(应对显存峰值)。QLoRA 让”消费级/单卡”微调大模型成为现实,是社区开源模型(如 Guanaco)繁荣的重要推手。
# 配合 bitsandbytes 的 4-bit 加载 + PEFT/LoRA
from transformers import BitsAndBytesConfig
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype="bfloat16",
)
适用场景与成本权衡
- 想快速定制对话风格、绑定私有知识格式:优先 SFT + LoRA,成本低、可控性强;
- 需要显著降低有害输出、提升指令遵循质量:在 SFT 之上叠加 RLHF/DPO,但要承担数据标注与训练复杂度;
- 显存极端受限或需在一张卡上微调大模型:选择 QLoRA;
- 追求某一任务上的最佳绝对性能且拥有集群:可考虑全参数微调,但务必评估遗忘与过拟合风险。
实践中,LoRA/QLoRA 已能满足绝大多数业务定制需求,RLHF 则更多用于通用的对话助手级对齐。
小结
微调是从”通用基座”到”可用模型”的必经之路。SFT 提供指令遵循的基础,RLHF/DPO 进一步做偏好对齐,而 LoRA 与 QLoRA 把微调的成本压到了单卡可承受的范围。选择方案时,应在数据规模、显存预算、对齐要求与最终性能之间做明确权衡,而非盲目追求最复杂的流程。
参考与延伸阅读
- Ouyang, L. et al. Training language models to follow instructions with human feedback. arXiv:2203.02155 (2022).
- Hu, E. J. et al. LoRA: Low-Rank Adaptation of Large Language Models. arXiv:2106.09685 (2021).
- Dettmers, T. et al. QLoRA: Efficient Finetuning of Quantized LLMs. arXiv:2305.14314 (2023).
- Rafailov, R. et al. Direct Preference Optimization: Your Language Model is Secretly a Reward Model. arXiv:2305.18290 (2023).
- Hugging Face PEFT 文档: https://huggingface.co/docs/peft
- Microsoft LoRA 代码仓库: https://github.com/microsoft/LoRA