Skip to content

微调与 PEFT(LoRA)

本页速览 微调是在预训练模型上继续训练以适配新目标,PEFT 只更新少量参数。本文讲清微调 vs 提示/RAG 对比、FFT 到 QLoRA 谱系、LoRA 低秩分解原理、指令数据与完整流程。

本页含时效性内容,数据截止于 2025-06;JD、榜单、产品功能等信息可能已变化,引用前请核对原始出处。

微调与 PEFT(LoRA) ​

微调(Fine-Tuning, FT)是在预训练模型的基础上,用特定任务或领域的标注数据继续训练,使模型适配新目标的过程;参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)则是只更新其中少量参数(甚至新增少量参数)就达到相近效果的训练范式。

预训练模型(如 Llama、Qwen、DeepSeek)在万亿级语料上学会了通用语言能力,是个"什么都懂一点的通才"。但它并不知道你要它输出 JSON 还是客服用语,不知道你的行业黑话,也不知道你公司的知识库在哪。微调就是把通才变成专才的那一步——它不动用语言能力本身,而是调整模型的"行为习惯"和"输出偏好"。几乎所有今天能叫上名字的大模型产品(ChatGPT、Claude、DeepSeek)都走过"预训练 → 后训练(含微调)"的完整路径,可参见大语言模型(LLM)与演进简史。

一、为什么需要微调:通才到专才的三条路 ​

一个已经会说话、会推理的大模型,要变成"会用你的格式回答你的领域问题",有且仅有三条主流路线:

方案做什么改模型参数吗典型成本适合场景
提示词工程(Prompt)在输入里写清规则、示例、角色设定不改几乎为零快速验证、规则类任务、模型已经会的事
检索增强生成(RAG)外接知识库,把检索到的内容拼进上下文不改变建库 + 检索链路知识密集、事实要新要准、内容要可溯源
微调(Fine-Tuning)用任务数据继续训练,改变模型行为/格式/风格改GPU 训练成本输出格式固定、风格语感专属、提示词压不住的行为问题

一句话判断:提示词治不了的问题才轮到微调。模型本来就会但答得不对→调提示词;答案需要外部事实支撑→上 RAG;格式死活不对、语感总是不像、光靠提示词塞不下→再考虑微调。三者不是互斥关系,生产系统里最常见的组合是"微调定格式 + RAG 供知识",详细对比见提示词工程与检索增强生成(RAG)。

一个实用的筛选框架

先问三个问题:①模型能力够不够(不够→换更大模型或加知识);②是"知道什么"的问题(→RAG)还是"怎么说话"的问题(→微调);③提示词能不能覆盖(能→先别训)。先跑基线,再谈微调。

二、微调谱系:从全参微调到 QLoRA ​

"微调"是个大筐,内部从"动所有参数"到"只动几个矩阵"拉开了一条完整谱系。关键看两个指标:参数更新量(影响训练显存与存储)和效果接近全参微调的程度。

方案全称更新什么相对显存训练速度效果参考典型适用
全参微调(FFT)Full Fine-Tuning全部模型参数基线(最高)最慢100%(效果上限基准)数据充足、算力充裕的头部团队
部分层微调Layer-wise FT只解冻最后几层/某些模块略降略快接近全参(任务接近顶层语义时)旧式做法,如今少用
适配器(Adapter)Adapter Tuning在 Transformer 层间插入小网络,只训小网络降约 1/2较快单任务接近全参多任务共享主干(每任务一套小参数)
LoRALow-Rank Adaptation冻结主干,只训注入的低秩矩阵(约占参数 0.1%~1%)约降 2/3快多数任务≈全参,个别任务略低目前最主流的默认选择
QLoRAQuantized LoRA主干量化到 4-bit 后冻结,训 LoRA 矩阵再降约 1/3(可单卡微调 70B 级)快与 LoRA 相当消费级显卡/个人研究/预算有限

怎么读这张表

谱系的最右端不代表"效果最好",只代表"成本最低"。全参微调仍是效果上限的参照物,但 7B 模型全参微调需要约 4×14GB 的显存(Adam 状态、梯度都要占内存),而同样规模用 QLoRA 在 16GB 消费级显卡上就能跑起来。这背后的原理与工程取舍详见推理优化与量化(量化思想)与部署与推理优化实战。

值得多说一句适配器:它在每个 Transformer 层里插入一个 Bottleneck 小网络(降维再升维),推理时额外引入一次计算,但好处是多个任务可以共享同一份冻结主干、各挂各的小参数——这在多任务场景曾很流行。不过 LoRA 在效果与实现的简洁性上全面胜出,如今基本是"能用 LoRA 就不用 Adapter"。

三、LoRA 原理:把一次大更新拆成两个小矩阵 ​

LoRA(Low-Rank Adaptation,低秩适配)来自 2021 年论文《LoRA: Low-Rank Adaptation of Large Language Models》。它观察到一个关键事实:全参微调中,权重更新的部分其实可以用一个很低的秩去近似——即预训练权重 W 学到的是海量通用知识,任务适配只需要在一个很小的方向上扰动它。

3.1 低秩分解 ​

假设某个线性层(例如注意力投影矩阵)原始权重为 W,形状 d×d。全参微调学的是完整的增量 ΔW(也是 d×d,几亿个参数);LoRA 则把 ΔW 强制分解成两个小矩阵的乘积:

ΔW ≈ B × A        (A: d×r,B: r×d,r 远小于 d)

预训练权重 W(冻结)         增量分支(只训练)
┌─────────────────┐        ┌─────────┐ ┌─────────┐
│   W : d×d       │   +    │  B: d×r │×│  A: r×d │
│  (原样不动)     │        │         │ │         │
└─────────────────┘        └─────────┘ └─────────┘
        ↓ 前向/推理时可合并
   W' = W + (alpha / r) × B × A

训练时只更新 A 和 B,参数量从 d×d 降到 d×r + r×d。当 d=4096、r=8 时,增量参数只有全参的约 1/256。A 用高斯随机初始化,B 用零初始化——这样训练一开始 B×A=0,模型行为与预训练模型完全一致,训练过程更稳定。

python
import torch
import torch.nn as nn
import torch.nn.functional as F

class LoRALinear(nn.Module):
    """给一个线性层注入低秩分支:冻结主权重,只训 A、B"""
    def __init__(self, in_dim: int, out_dim: int, r: int = 8, alpha: int = 16):
        super().__init__()
        self.weight = nn.Parameter(torch.randn(out_dim, in_dim) * 0.02)  # 模拟预训练权重
        self.weight.requires_grad = False                                 # 冻结
        self.A = nn.Parameter(torch.randn(in_dim, r) * 0.01)              # 高斯初始化
        self.B = nn.Parameter(torch.zeros(r, out_dim))                    # 零初始化
        self.scaling = alpha / r

    def forward(self, x):
        base = F.linear(x, self.weight)              # 冻结主干:原样前向
        delta = (x @ self.A) @ self.B * self.scaling # 低秩增量:只训这里
        return base + delta

上面是最简思想实现,生产环境直接用 Hugging Face PEFT 库:LoraConfig(r=8, lora_alpha=16, target_modules=["q_proj","v_proj"]) 即可给指定模块注入 LoRA,完整工程流程见微调你自己的 LLM。

3.2 秩 r 怎么选 ​

r 取值增量参数占比(7B 模型参考)特性
r=1~4极小更新方向极少,适合数据量很小的轻适配,风险是欠拟合
r=8~0.1%多数任务的安全默认值
r=16~32~0.2%~0.4%任务复杂、数据量较大时更稳,效果上限更高
r=64+较大收益递减明显,几乎逼近全参微调的参数量,失去意义

一句话判断:从小 r 起步(8),跑通再翻倍对比(16/32),别一上来就 64。r 翻倍显存与存储约线性增长,而效果往往在 8→16 之后趋缓。

推理时零开销

LoRA 训练完得到的 A、B 可以在推理前合并回主干:W_merged = W + scaling × (B @ A),合并后模型架构与原来完全一致,推理延迟、显存占用零额外成本(合并的量化版本见推理优化与量化)。也可以不合并、把 A、B 单独保存——每个任务一套 LoRA 权重(通常几十到几百 MB),按需挂载,这正是 LoRA 在多任务、多租户场景被大量使用的原因。

四、训练数据:指令微调的数据学 ​

4.1 指令数据(Instruction Data / SFT 数据)的构成 ​

微调最主流的形式是指令微调(Instruction Tuning),也叫监督微调(Supervised Fine-Tuning, SFT):喂给模型"指令 + 输入 + 期望输出"三元组,让它学会"听指令办事"。这是 ChatGPT 发布后掀起微调热潮的范式起点,源自 InstructGPT 论文。

一条典型指令样本长这样:

json
[
  {
    "instruction": "把下面这句话改写成更正式、专业的表达",
    "input": "这个方案挺不错,咱们可以试试。",
    "output": "该方案具备可行性,建议予以试行。"
  },
  {
    "instruction": "判断以下文本的情感极性,只能输出:积极 / 中性 / 消极",
    "input": "新版客户端又闪退了,客服也一直不回应。",
    "output": "消极"
  }
]

4.2 数量级与质量 ​

数据规模典型效果说明
数百条可观察到行为改变只适合极轻的"格式约束",别指望学新能力
数千~数万条绝大多数任务的质量达标区间每条 200~2000 字,覆盖任务主要形态
数十万条能力增强明显接近"再造一个通用助手"级别,成本高

三个经验结论:

  • 质量远重要于数量。1000 条人工精校的样本,往往胜过自动生成的 10 万条脏数据。业界有"LIMA 现象":只用 1000 条高质量指令微调,也能显著提升对齐度与可用性。
  • 多样性优先于重复度。覆盖任务的不同形态、不同难度、不同边界情形,比把同一条样本复制十倍有用得多。
  • 输出必须是模型"应该答的样子"。SFT 的本质是模仿期望输出分布,输出里夹带错误格式、幻觉,模型会照单全收。

数据泄露与污染

公开指令数据集(如网上的 Chat 数据、共享的 SFT 数据集)里经常混入测试题答案、隐私文本甚至脏话。微调数据必须做清洗、去重、隐私脱敏,否则模型会"背答案"或者学会坏习惯。数据集工具与档案见数据集与工具档案。

五、完整流程:从数据到上线 ​

微调一个模型的端到端流程可以浓缩为四步:

① 数据准备 → ② 基座选择 → ③ 训练 → ④ 评估与迭代
  收集/清洗/格式化为指令 JSON    按任务选模型   LoRA 超参实验    上线/回归/回到①

① 数据准备:收集真实业务样本 → 清洗去重 → 写成指令 JSON → 划分 train/val(建议 val 留 5%~10%)。这一步占整个项目 60% 以上的时间。

② 基座选择:不是越大越好,遵循三条经验——任务语言与基座语言一致(中文任务优先选中文语料强的基座);基座的知识与能力下限要够(微调改行为不改知识的边界,见下文风险章节);能用开源基座就少闭源依赖。模型速查见模型与榜单速查。

③ 训练:LoRA 微调的超参窗口很窄,常见起点:

learning_rate = 2e-4      # LoRA 常用 1e-4 ~ 5e-4,比全参微调高一档
num_epochs    = 3         # 小数据 1~3 轮足够,过多必过拟合
batch_size    = 4 ~ 16    # 受显存约束,可配合梯度累积
lora_r        = 8         # 常见 8 / 16 / 32
lora_alpha    = 16        # 通常取 r 的 1~2 倍
max_seq_len   = 2048      # 按任务最长输入定,别无脑拉满
warmup_steps  = 100       # 小步热身稳定训练

④ 评估与迭代:训练完绝对不要只看训练 loss——要看验证集表现与业务指标(格式合规率、任务准确率、风格相似度)。用固定评测集回归所有历史微调版本,防止"修好 A 弄坏 B"。评估方法论见LLM 评估与基准,落地工具链见搭建一套 LLM 评估。

一句话流程心法

微调项目的 80% 工作量在前两环(数据 + 评估设计),真正跑 GPU 的时间往往只占一小部分。先造好评测集,再谈训练。

六、风险与误区 ​

6.1 灾难性遗忘(Catastrophic Forgetting) ​

模型在新任务数据上猛学,可能把预训练阶段学到的通用能力"冲掉"——之前会做的题不会了、常识变差了。触发条件通常是:数据太少太偏、学习率太大、训练轮数过多。缓解手段:控制 epochs、混入少量通用数据(如通用指令数据按 5%~10% 混合)、LoRA 本身由于参数改动小也有天然的"遗忘缓冲"。

6.2 过拟合小数据集 ​

几千条数据训几十轮,验证 loss 不降反升、训练集上表现完美而实际任务崩盘,是微调最典型的翻车现场。对策:小数据用大学习率 + 少轮数 + 早停(监控验证 loss),训练中随机抽样检查生成质量。

6.3 最大的误区:微调 ≠ 学新知识 ​

这是最需要反复强调的一条。微调主要改"行为"(格式、风格、听话程度),几乎不注入"知识"——训练中模型会记住训练集里的碎片化事实,但无法可靠地学会庞大的新领域知识;真正的知识靠预训练阶段的万亿级语料与检索增强生成(RAG)的外部检索兜底。

  • 想让模型回答 2026 年 5 月之后的新政策 → 用 RAG,微调救不了时效性;
  • 想让模型掌握公司内部 10 万篇文档 → 用 RAG,微调只适合把"提问文档的方式"学顺;
  • 想让模型输出格式稳定、语感贴合 → 这才是微调的舒适区。

一句话判断:知识问题找 RAG,行为问题找微调,两者组合是生产常态。更多坑位盘点见常见陷阱与反模式。

七、与对齐的关系:后训练的一体两面 ​

微调并不是孤立的一步,它是"后训练(post-training)"这个大家族的一员。行业里大模型的完整生命周期是:

预训练(海量语料学语言)→ 后训练(SFT 微调 → 对齐 RLHF/DPO)→ 部署推理

对齐(Alignment)本质上是微调的后半程:SFT 先把模型教成"会听话",RLHF/DPO 再把模型调成"安全、诚实、有用"——它们都是在预训练模型上继续训练,只是目标函数从"模仿正确输出"换成"优化人类偏好"。所以"微调"与"对齐"不是两个独立概念,而是同一个后训练流水线的不同阶段,深入展开见对齐:RLHF 与 DPO。

典型的领域微调案例:

领域代表做法要点
代码GitHub Copilot、DeepSeek-Coder、Code Llama用代码补全数据(源码 + 注释 + 测试)做 SFT;代码智能产品完整拆解见GitHub Copilot 与代码智能
医疗Med-PaLM、开源医疗基座用病历、医学问答、临床指南精校数据微调,同时做安全对齐
客服/金融各类行业大模型用历史工单与标准话术微调出"专属语感",再叠加 RAG 供给产品知识
推理DeepSeek-R1用带思维链的推理数据做 SFT,再用强化学习激发深度思考,见DeepSeek-R1 与推理模型

另外,微调产出的模型往往还要与AI 智能体(Agent)结合——把微调后的格式稳定能力,作为工具调用、任务规划的输出约束。整条学习路线安排可参考学习路径。

延伸阅读 ​

参考资料 ​