大模型微调技术体系详解:从 SFT 到 GRPO,从全参到 LoRA
大模型微调技术体系详解:从 SFT 到 GRPO,从全参到 LoRA
YYT第一次接触大模型微调时,很容易被一串缩写绕晕:CPT、SFT、LoRA、QLoRA、DPO、PPO、GRPO……它们看起来像一排互相竞争的“微调方法”,其实很多并不在同一个维度上。
先记住这篇文章的核心地图:CPT、SFT、DPO、PPO、GRPO 描述“用什么训练信号、想让模型学会什么”;全参数微调、LoRA、QLoRA 描述“哪些参数参与更新、以什么方式更新”。 两条轴可以组合,不是非此即彼。
下文会按“要不要微调 → 训练目标 → 参数更新方式 → 项目选型与评估”的顺序展开。先说结论:微调不是给模型补一份随时更新的知识库,也不是越复杂越好。很多需求用提示词或 RAG 更直接;只有当问题确实需要改变模型稳定的行为模式,而且手头有合适的数据和评估方法时,微调才值得投入。
一、什么是微调?它能解决什么问题?
大模型预训练完成后,已经具备通用的语言和任务能力。微调(fine-tuning)是在已有模型基础上继续训练,让它在特定数据、任务或行为要求上更贴合目标。
可以把预训练想成打下通用基础,把微调想成针对岗位继续训练。但这个类比有一个重要边界:微调并不保证原有能力完全保留。 训练数据太窄、训练太久或学习率不合适,都可能让模型过度偏向新任务,甚至损伤已有能力,这类现象通常称为灾难性遗忘。
微调比较适合解决这类相对稳定的问题:
- 模型需要稳定地遵循某种输出格式、语气或业务流程;
- 需要掌握特定任务的输入输出模式,例如分类、抽取、改写或工具调用;
- 已经有质量较高、覆盖目标场景的数据,提示词方案仍不稳定;
- 可以用明确的测试集衡量微调前后的变化。
如果目标只是让模型知道一份会频繁变化的资料,微调往往不是首选。模型参数不适合作为可随时查证、增删的数据库;此时通常应先考虑检索增强生成(RAG)。
| 方法 | 主要改变什么 | 更适合的情况 |
|---|---|---|
| Prompt 工程 | 输入中的指令和上下文 | 规则简单、想快速试错,不需要训练 |
| RAG | 输入时检索到的外部资料 | 事实会更新、需要引用来源、知识量大 |
| 微调 | 训练过程中更新的模型参数 | 希望模型稳定习得行为、格式或任务模式 |
它们也可以组合使用:微调负责稳定的表达方式或任务习惯,RAG 负责提供最新、可追溯的事实。
二、先把“训练什么”和“怎么更新”分开
一个常见但并非唯一的训练路线可以画成这样:
1 | 预训练(PT / CPT) → 指令监督微调(SFT) → 偏好优化或强化学习(可选) |
预训练语言模型通常通过预测后续 Token 来学习文本规律;它预测的单位是 Token,不一定等于一个汉字。CPT(continued pretraining,继续预训练)则是在已有模型上,继续用领域文本做类似的语言建模训练。
之后是否做 SFT、DPO 或在线强化学习,要看模型目标、数据和预算。真实项目不一定完整经历所有阶段,也不存在一条所有模型都必须照走的固定流水线。
更实用的理解方式是把微调拆成两条互相独立的轴:
1 | 训练目标 / 训练信号(练什么) 参数更新方式(怎么练) |
例如,“SFT + LoRA”表示用指令问答进行监督训练,同时只更新 LoRA 适配器;“DPO + LoRA”则表示用偏好数据优化回答偏好,同时采用 LoRA 降低可训练参数量。
三、几类常见训练目标:CPT、SFT、DPO、PPO、GRPO
1. CPT:继续预训练领域文本
CPT 使用的是大量连续文本,不一定是“问题—答案”格式,训练目标通常仍是预测后续 Token。它适合让模型更熟悉某个领域的术语、文风或文本分布,例如专业语料、代码库或特定语言材料。
但 CPT 不等于可靠地把知识“写进数据库”。模型未必能准确记住每条事实,也未必会在提问时稳定取出。若内容需要及时更新或答案必须可追溯,RAG 通常更合适。CPT 是否值得做,还取决于语料质量、数据规模、基础模型和评估结果。
2. SFT:用示范教模型完成任务
SFT(Supervised Fine-Tuning,监督微调)使用输入与示范输出,让模型学习在给定上下文后如何回应。例如:
1 | 用户:把这段工单整理成“问题、影响、处理方案”三项。 |
很多对话训练会使用消息结构和模型对应的 chat template。训练时通常只对助手回答中的目标 Token 计算损失,用户问题、系统指令等输入部分可能会被屏蔽;具体做法取决于数据处理和训练配置,不是把整段对话简单地逐字“背下来”。
SFT 是让模型模仿示范,不会自动保证事实正确或具备可靠推理。它的表现受示范质量、覆盖范围、训练配置和基础模型能力共同影响。少量高质量样本有时能改善格式等窄任务,但不存在“几千条数据就一定有效”的通用门槛;数据量、质量和多样性要结合任务实测。
3. DPO:直接利用偏好样本优化回答
DPO(Direct Preference Optimization,直接偏好优化)使用同一问题下“更偏好的回答”和“较不偏好的回答”作为训练信号。例如:
1 | 问题:用户反馈订单一直没有更新,客服该怎样回复? |
标准 DPO 目标直接利用偏好对来调整策略模型,不需要先单独训练一个奖励模型,再用 PPO 优化。不过,常见 DPO 配方仍会用参考策略作为比较基准;数据准备也不再是“不要评分”,而是要有可信的偏好判断。
DPO 通常可以离线训练,工程上相对简洁;但它并非天然“比 PPO 效果差”或“上限更低”。最终效果取决于偏好数据、模型、目标函数和评估方式。偏好数据存在偏差时,模型也可能学到错误的取舍。
4. PPO:通过奖励信号在线优化策略
PPO(Proximal Policy Optimization,近端策略优化)是一种策略优化算法,常见于 RLHF(基于人类反馈的强化学习)流程。典型流程是:当前模型生成回答,奖励模型对回答打分,再据此更新策略;参考策略和 KL 惩罚等机制可用于约束新策略不要偏离过远。
典型实现还会有 Critic(价值模型)估计状态价值,帮助计算优势(Advantage),降低策略梯度估计的方差。可以把常见组件理解为:
- Policy / Actor:当前要训练的生成模型;
- Reward Model:根据偏好数据学习的奖励打分器;
- Reference Policy:通常冻结的参考模型,用于约束策略漂移;
- Value / Critic:估计未来回报,辅助优势计算。
这是逻辑组件,不代表每种实现都要把四个完整大模型同时放进一张显卡。显存和计算取决于模型、并行策略、量化、是否重计算,以及训练框架。不过,在线采样、奖励建模和策略更新会让 PPO 类流程比单纯 SFT 更复杂,也更难调试。
“近端”强调限制每次策略更新幅度,减少策略骤变造成的不稳定;它不代表训练天然稳定或调参容易。
5. GRPO:同一问题下比较一组回答
GRPO(Group Relative Policy Optimization,组相对策略优化)在同一提示下采样一组候选回答,再用组内相对表现构造优势信号。它的一个重要特点是通常不需要单独训练 Critic / Value Model。
核心直觉可以写成:
1 | 第 i 个回答的组内相对优势 |
如果某个回答的奖励高于同组平均,它通常会获得更有利的更新信号;低于平均的回答则相反。奖励可以来自可验证规则(如代码测试、数学答案检查),也可以来自奖励模型或其他评分机制。GRPO 省掉单独的 Critic,不等于不需要奖励信号。 是否使用参考模型、KL 约束等,也要看具体训练配方。
GRPO 特别适合能为多个候选结果计算相对奖励的场景,例如数学题、代码执行等。它的代价是通常要为同一问题生成多个候选答案,因此采样和推理开销可能较高;如果奖励不可靠,组内相对比较也不会自动变得可靠。
DeepSeekMath 论文提出并研究了 GRPO。DeepSeek-R1-Zero 展示了基于规则奖励的纯强化学习探索;正式版 DeepSeek-R1 则包含冷启动数据和多阶段训练,不能简单概括成“整个 R1 只靠 GRPO、完全不使用示范数据”。
| 方法 | 主要训练信号 | 是否在线采样 | 典型特点 |
|---|---|---|---|
| SFT | 标准示范回答 | 不需要 | 建立指令遵循和任务行为的常用起点 |
| DPO | 同一问题下的偏好回答对 | 通常不需要 | 离线偏好优化,不必单独训练奖励模型 |
| PPO / RLHF | 奖励信号、策略采样与优势估计 | 通常需要 | 组件和训练流程较多,计算与调试成本较高 |
| GRPO | 同一提示下的一组回答及其相对奖励 | 通常需要 | 可省去单独 Critic,但多答案采样可能昂贵 |
这些方法不是从“低级”到“高级”的固定升级路线。任务没有可靠偏好标注或奖励函数时,换上更复杂的 RL 算法也不会凭空创造高质量监督信号。
四、参数更新方式:全参数、LoRA、QLoRA
训练目标说的是模型学什么,参数更新方式说的是训练时哪些权重参与优化。常见方案有全参数微调、部分参数微调和 PEFT(参数高效微调)。
1. 全参数微调
全参数微调会更新底座模型中的大部分或全部可训练权重,适合有充足算力、数据和评估能力,并且确实需要进行较大范围适配的项目。
代价不只是存放模型权重。训练还要考虑梯度、优化器状态、激活值和中间缓冲区;显存需求会受到精度、优化器、序列长度、批量大小、梯度检查点和分布式策略影响。因此不能只根据“模型是 7B”就推出一个固定显存数字,也不能把某个倍数套用到所有训练配置。
2. LoRA:冻结底座,只训练低秩更新
LoRA(Low-Rank Adaptation)冻结原始权重,并用两个较小的低秩矩阵表示权重更新。假设线性层写作 y = W x,其中:
1 | W ∈ R^(d_out × d_in),x ∈ R^(d_in) |
原权重 W 冻结,只训练 A 和 B。以单个 4096 × 4096 矩阵、秩 r=8 为例,原矩阵有约 1678 万个参数,低秩矩阵合计约 6.55 万个参数,约为该矩阵的 0.39%。这只是单个矩阵的示例,整个模型可训练参数占比会随适配层数量和模型结构变化。
LoRA 可以应用于 SFT,也可以用于 DPO 或某些 RL 训练流程。通常需要配置把适配器挂到哪些层:常见目标包括注意力投影层,也可能包含 MLP/前馈网络层。没有适用于所有模型和任务的固定规则;目标模块应根据架构、显存预算和验证集效果选择,而不要因为某类知识就断言它“主要储存在某一层”。
训练完成后,部分部署流程可以把 LoRA 权重合并到原始权重中,从而避免单独执行适配器分支带来的推理开销。但量化模型、多适配器切换和具体推理框架可能影响合并方式,仍需在目标部署环境测试。
3. QLoRA:量化底座上的 LoRA 训练
QLoRA 的常见思路是把冻结的底座模型以低比特格式(常见为 4-bit)存储,在此基础上训练 LoRA 适配器。它主要节省底座权重的显存,不是把整个训练过程都变成 4-bit:激活、临时张量、优化器状态和计算精度仍取决于配置。
因此,“QLoRA 能在某张固定显卡上训练某个固定规模模型”不能脱离批量大小、上下文长度、模型结构和软件栈来保证。正式训练前应先用真实配置跑小批次,测显存峰值和吞吐。
4. 其他 PEFT 方法
| 方法 | 可训练内容 | 简要说明 |
|---|---|---|
| Adapter | 插入 Transformer 层的小型网络 | 适配模块可分离保存;结构和推理开销随实现变化 |
| Prompt Tuning | 输入端的可学习软提示向量 | 不直接改原模型权重,表达能力与训练方式相关 |
| Prefix Tuning | 注入注意力层的可学习前缀 | 与仅在输入端添加软提示不同,会作用于层内注意力 |
| BitFit / 部分微调 | 偏置项或选定层的权重 | 更新参数少,但效果依任务和模型而异 |
LoRA 流行,是因为它在很多实际任务中提供了不错的参数效率和工具支持,但并不意味着它在每个任务上都优于其他方法。
五、怎么选:从最简单有效的方案开始
建议按下面的顺序判断,而不是一上来就在 PPO、GRPO 和显卡型号之间做选择:
- 先定义目标。 把“回答更专业”改写成可测试的目标,例如格式正确率、工具调用参数通过率、人工偏好分数或代码测试通过率。
- 建立基线。 用现有模型加提示词先做一版测试,保存典型失败样例,确认问题确实不是提示词或上下文缺失。
- 判断信息是否会变化。 最新政策、产品目录、价格、文档等优先考虑 RAG;固定的表达规范和任务行为更适合用示范数据做 SFT。
- 检查数据是否足以支撑训练。 数据要正确、覆盖真实输入变化,并且与上线场景一致。少而干净有时比大量重复样本更有价值,但没有适用于所有任务的固定数量门槛。
- 按预算选择参数更新方式。 资源紧张时先试 LoRA/QLoRA;全参数微调则要有相应的训练、评估和回滚能力。
- 只有在训练信号匹配时才增加偏好优化或 RL。 有高质量偏好对可评估 DPO;有可验证奖励、需要在线探索且能承担采样成本时,再考虑 PPO/GRPO 等方法。
| 你的主要需求 | 可以优先尝试 |
|---|---|
| 最新知识、需要查证和引用 | RAG |
| 简单规则或少样本格式调整 | Prompt 工程;若不稳定再评估 SFT |
| 稳定的输出风格、任务格式、工具调用习惯 | SFT,先从 LoRA 开始验证 |
| 有较好/较差回答偏好对,想优化回答取舍 | SFT 基线后评估 DPO |
| 数学或代码任务,能自动验证奖励且可承担多轮采样 | 评估 GRPO 等在线优化方法 |
| 领域语料很多,模型确实缺少领域语言分布 | 小规模验证 CPT 是否有收益,再决定是否扩大 |
| 需要大范围更新且算力、数据、评估充分 | 评估全参数微调 |
这些是起点,不是保证最优的配方。比如医疗或法律场景不应看到“领域知识”就直接套用 CPT + SFT:事实准确、引用来源、隐私保护和专业审核往往更关键,知识检索和人工复核可能是必要组成部分。
六、一次微调项目的实践清单
数据准备
- 去重并剔除错误、矛盾、过时和低质量样本;检查输入与输出是否符合真实使用场景。
- 按来源或时间划分训练集、验证集和测试集,避免同一答案的近重复版本同时出现在训练和测试中。
- 保护隐私和商业数据,核对语料授权、模型许可与数据保留要求。
- 训练数据要覆盖失败模式和输入变化,不要只收集“理想问题”的一种问法。
训练与评估
- 先做小规模试验,记录基础模型、数据版本、训练目标、参数、随机种子和代码版本。
- 不要只看训练损失。还要用未参与训练的数据测任务效果、格式遵循、拒答边界和安全表现。
- 同时比较“基础模型 + 提示词”“基础模型 + RAG”和微调版本,确认新增复杂度真的带来收益。
- 检查通用能力是否退化:在与业务无关但重要的常见任务上也做回归测试。
- 上线时保留模型和适配器版本、灰度指标与回滚方案;数据和基础模型更新后重新评估。
一个实用的测试集最好同时包含:正常输入、边界输入、对抗或歧义输入、格式错误输入,以及业务上真实发生过的失败案例。评估指标可以是自动指标、程序化验证、人工盲评或它们的组合,具体取决于目标。
七、最后用四句话记住
- CPT、SFT、DPO、PPO、GRPO 是训练目标或训练信号的不同选择,不是一条必须依次走完的升级链。
- 全参数、部分参数、LoRA、QLoRA 是参数更新方案;同一种训练目标可以与不同更新方案组合。
- 频繁变化、需要追溯的知识优先放进 RAG;稳定的行为和任务模式再考虑微调。
- 不要相信固定的数据量、显存或效果承诺;用与你的任务一致的留出集做对照评估。
如果刚开始做项目,一个稳妥起点通常是:先把提示词和评估集做好,确认 RAG 是否能解决动态知识问题;当剩下的问题是稳定行为或输出模式,再准备高质量示范做小规模 SFT,并用 LoRA/QLoRA 验证收益。偏好优化和在线强化学习应当在训练信号与评估方案都准备好后再加入。
延伸阅读
- LoRA: Low-Rank Adaptation of Large Language Models
- QLoRA: Efficient Finetuning of Quantized LLMs
- Direct Preference Optimization: Your Language Model is Secretly a Reward Model
- DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models
- DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning