LLM 训练系列(三):参数更新策略——Full FT、LoRA 与 QLoRA
SFT、DPO、GRPO 描述训练过程或优化方法;Full FT、LoRA、QLoRA 描述模型参数如何更新。它们不是同一个维度。
本文重点介绍全量微调与参数高效微调,并梳理 LoRA、QLoRA 的核心原理和常见误区。
系列导读
| 系列位置 | 文章主题 | 主要内容 |
|---|---|---|
| 总览 | LLM 训练系列(总览):从数据工程到推理部署 | 数据工程、预训练、后训练、评测和部署 |
| 第一篇 | LLM 训练系列(一):预训练——通用预训练与持续预训练 | CLM、Next Token Prediction、Base Model |
| 第二篇 | LLM 训练系列(二):后训练——SFT 与偏好对齐 | SFT、PPO、DPO、GRPO |
| 第三篇(本文) | LLM 训练系列(三):参数更新策略——Full FT、LoRA 与 QLoRA | Full FT、LoRA、QLoRA 与 PEFT |
一、参数更新策略先看全貌
先区分四个维度
| 维度 | 典型概念 | 回答的问题 |
|---|---|---|
| 生命周期阶段 | 预训练、后训练 | 当前处于模型生命周期的哪个环节 |
| 训练过程或优化方法 | 持续预训练、SFT、DPO、PPO、GRPO | 使用什么数据和训练方式 |
| 优化目标或信号 | Next-Token CE、DPO Loss、Reward | 模型具体优化什么 |
| 参数更新策略 | Full FT、LoRA、QLoRA | 哪些参数参与更新 |
SFT 是训练过程或训练范式,Full FT、LoRA、QLoRA 是参数更新策略。SFT 通常使用自回归 Token-level Cross Entropy Loss;工程上经常 Mask 掉 Prompt,只计算 Assistant 回答部分的损失,但这是一种常见实现方式,并不是 SFT 的必要定义。
持续预训练与 SFT 可以使用形式相近的 Next-Token Prediction 损失,主要区别在于训练目的、数据形式、数据分布和 Loss Mask。因此,更准确的说法是它们属于不同的概念维度,而不是严格数学意义上的“正交”。
DPO 是直接偏好优化方法;GRPO 是基于奖励信号和组内相对优势的强化学习策略优化方法,二者不能简单归为同一种训练目标。
因此,LoRA 并不等于 SFT,SFT 也不等于全量微调。
持续预训练 + Full FT / LoRA / QLoRA SFT + Full FT / LoRA / QLoRA DPO + Full FT / LoRA / QLoRA PPO + Full FT / LoRA / QLoRA GRPO + Full FT / LoRA / QLoRA这些组合在概念上成立,但具体框架是否支持、训练是否稳定,以及量化模型能否参与相应训练,需要结合工程实现、成本和任务需求判断。
预训练、后训练与参数更新方法的关系
Full FT、LoRA、QLoRA 回答“哪些参数参与更新”;预训练、SFT、DPO、PPO、GRPO 回答“模型使用什么数据和目标进行训练”。二者属于不同维度,可以根据任务和工程条件进行组合。
从零预训练主流采用 Full FT;已有基座上的持续预训练和后训练则可以选择 Full FT、LoRA 或 QLoRA。选择哪种方式,需要综合考虑训练目标、数据规模、模型容量、显存资源和训练框架支持情况。
参数更新策略总览
参数更新策略(Fine-Tuning Strategy) ├─ 全量微调(Full Fine-Tuning) │ └─ 更新全部模型参数 │ 【适合数据和算力充足、追求效果上限的场景,但需要大量计算资源和显存】 │ └─ 参数高效微调(PEFT,Parameter-Efficient Fine-Tuning) ├─ 低秩适配类(Low-Rank Adaptation) │ ├─ LoRA(Low-Rank Adaptation) │ │ └─ 【在原模型权重旁加入低秩矩阵,只训练新增的低秩参数】 │ └─ QLoRA(Quantized LoRA) │ └─ 【在量化后的基座模型上进行 LoRA 训练,进一步降低显存需求】 │ ├─ Adapter 插入类 │ └─ Adapter Tuning │ └─ 【在 Transformer 层中插入小型 Adapter 模块,只训练 Adapter 参数】 │ ├─ Soft Prompt 类 │ ├─ Prompt Tuning │ │ └─ 【在输入前添加可学习的 Soft Prompt,只优化 Prompt 参数】 │ ├─ Prefix Tuning │ │ └─ 【在 Transformer 各层加入可学习的 Prefix 向量,影响 Attention 计算】 │ └─ P-Tuning v2 │ └─ 【在多层 Transformer 中加入可学习的连续提示,增强任务适配能力】 │ └─ 参数选择类 ├─ BitFit │ └─ 【只更新模型中的 Bias 参数,实现极低成本微调】 └─ Sparse Fine-Tuning └─ 【只更新模型中的部分稀疏参数,减少需要训练的参数量】二、Full Fine-tuning 与 PEFT
Full Fine-tuning
全量微调会让模型的全部参数参与梯度更新。
预训练模型 ↓ 全部参数计算梯度并更新 ↓ 完整的新模型权重优点:
- 参数自由度高,效果上限通常较高。
- 不受低秩适配器容量限制。
- 训练完成后得到独立的完整模型。
缺点:
- 参数梯度、优化器状态和激活值带来较大显存开销。
- 保存多个任务模型需要大量存储空间。
- 训练和分布式工程成本较高。
什么是 PEFT
PEFT 全称是 Parameter-Efficient Fine-Tuning,即参数高效微调。
它的共同思想是:
不更新整个模型的全部参数,而是只训练少量新增参数或选定参数,以较低成本适配新任务。
PEFT 是一类方法的总称,LoRA 是其中最常见的一种。
三、LoRA:从原理到应用
3.1 LoRA 核心原理
LoRA 全称是 Low-Rank Adaptation。
LoRA 论文与代码
- 论文地址:LoRA: Low-Rank Adaptation of Large Language Models
- 官方代码:microsoft/LoRA
- 作者报告:LoRA 论文报告视频
先说结论:LoRA 会冻结预训练模型的原始权重,只训练少量新增的低秩适配器参数,从而显著降低训练阶段的可训练参数量、显存占用和模型存储成本。推理时可以合并权重,也可以动态加载 Adapter。
LoRA 的关键点可以概括为:
- 基座权重冻结:原始预训练参数不参与更新。
- 只训练少量参数:主要更新新增的低秩矩阵
A、B,可训练参数量通常远小于 Full Fine-Tuning。 - 挂载范围可配置:由
target_modules决定 LoRA 加在哪些模块上。 - 经典初始化影响较小:通常随机初始化
A、将B初始化为零,使训练开始时 LoRA 分支的输出接近零。 - 推理方式可选择:合并权重后通常没有 LoRA 分支带来的额外延迟;动态加载 Adapter 则会增加少量计算开销。
- 支持多任务切换:同一套基座模型可以加载多个不同的 LoRA Adapter,用于不同任务、领域或风格。
它冻结原始权重W₀,使用两个低秩矩阵表示权重增量:
W = W 0 + Δ W , Δ W = B A W = W_0 + \Delta W, \qquad \Delta W = BAW=W0+ΔW,ΔW=BA
h = W 0 x + α r B A x h = W_0x + \frac{\alpha}{r}BAxh=W0x+rαBAx
如果原始权重矩阵很大,而秩r较小,那么训练A、B所需的参数量会远少于更新完整的W₀。
输入 x ├─ 原始分支:W₀x,W₀ 冻结 └─ LoRA 分支:BAx,只训练 A、B ↓ 输出:W₀x + scaling × BAx常见缩放因子:
scaling = α / rLoRA 更新哪些层
LoRA 挂载到哪些模块由target_modules配置决定。它通常填写一组模块名称,例如q_proj、v_proj;PEFT 会在整个模型中查找名称匹配的模块,并为每一个匹配项添加 LoRA Adapter。
因此,当 Transformer 的每一层都包含q_proj和v_proj,并将它们写入target_modules时,通常意味着所有 Transformer 层中匹配的 Query、Value 投影都会挂载 LoRA,而不是只修改某一层。
q_proj、v_proj是许多常见 Decoder-only 模型的入门配置,但并不是所有模型统一的默认值。k_proj、o_proj以及 MLP 中的gate_proj、up_proj、down_proj是否加入,需要根据模型结构和任务需求手动决定。
以 LLaMA、Qwen2、Qwen3、Mistral、Gemma 等常见 Decoder-only 模型为例,最小配置通常只作用于注意力中的 Query 和 Value 投影:
frompeftimportLoraConfig lora_config=LoraConfig(r=16,lora_alpha=32,target_modules=["q_proj","v_proj"],lora_dropout=0.05,bias="none",task_type="CAUSAL_LM",)常见配置范围如下:
| 配置范围 | target_modules示例 | 说明 |
|---|---|---|
| Query、Value 投影 | ["q_proj", "v_proj"] | 参数量较少,是常见的入门配置 |
| 全部注意力投影 | ["q_proj", "k_proj", "v_proj", "o_proj"] | 同时适配 Q、K、V 和输出投影 |
| 注意力与 MLP 投影 | 再加入gate_proj、up_proj、down_proj | 可训练参数更多,适配能力和训练成本通常也更高 |
| 全部线性层 | "all-linear" | 由 PEFT 自动匹配模型中的线性层,常用于 QLoRA 风格配置 |
不同模型架构的模块名称并不统一。例如:
| 模型架构 | PEFT 中常见的目标模块名称 |
|---|---|
| LLaMA、Qwen2/Qwen3、Mistral、Gemma | q_proj、v_proj |
| GPT-2 | c_attn |
| ChatGLM、BLOOM、Falcon | query_key_value |
| BERT、RoBERTa | query、value |
对于 PEFT 已支持的模型,如果没有显式传入target_modules,框架可能根据模型的model_type使用内置映射;对于自定义模型或尚未适配的架构,应当显式指定。
不确定模块名称时,可以先查看模型结构:
forname,moduleinmodel.named_modules():print(name,type(module).__name__)然后从输出中确认注意力层和 MLP 层的真实名称,再填写target_modules。不要直接照搬其他模型的配置,否则可能出现找不到目标模块,或者 LoRA 挂载范围与预期不一致的问题。
选择更多模块通常会增加可训练参数、显存占用和训练时间,也可能提高复杂任务的适配能力。实际配置需要结合模型架构、数据规模、任务难度和硬件资源进行验证。
LoRA 的初始化
经典 LoRA 通常随机初始化矩阵A,并将矩阵B初始化为零。由于训练开始时BA = 0,LoRA 分支的初始输出接近零,因此模型在刚开始训练时基本保持原有基座模型的行为。
不同实现和 LoRA 变体可能采用不同初始化方式,因此不应把某一种初始化写成所有 LoRA 的强制规则。
3.2 LoRA 的训练产物与推理方式
LoRA 的训练产物
冻结的 Base Model + 体积较小的 LoRA Adapter同一个 Base Model 可以加载不同 Adapter,用于不同任务、领域或风格。
LoRA 的两种推理方式
合并权重
W' = W₀ + ΔW合并后不再单独计算 LoRA 分支,推理计算图通常与原始基座模型基本一致,因此一般没有 LoRA 分支带来的额外延迟。具体速度仍会受到推理框架、量化方式和硬件实现影响。
动态加载 Adapter
Base Model + 运行时加载 LoRA Adapter动态加载便于一套基座切换多个任务,但运行时需要计算 LoRA 分支并与基座输出相加,因此通常会引入少量计算和权重管理开销。
因此,LoRA 的主要收益体现在训练、存储和多任务 Adapter 管理阶段,并不会自动让模型推理更快:合并后通常接近原始基座模型的推理速度,动态加载时则可能略慢。
QLoRA 同样主要解决训练显存问题。它在训练时量化并冻结基座模型,再更新 LoRA Adapter;部署时的推理速度取决于最终是否保留量化权重、使用什么量化格式以及推理引擎是否提供高效算子,不能简单归因于 LoRA。
3.3 怎样理解 LoRA Rank
Rankr控制 LoRA Adapter 的可学习容量。对于一个输入维度为d_in、输出维度为d_out的线性层,两个低秩矩阵新增的参数量约为:
r × ( d i n + d o u t ) r \times (d_{in} + d_{out})r×(din+dout)
因此,在其他配置不变时,Rank 增大通常会使可训练参数量、Adapter 体积和显存开销近似线性增加:
r较小:参数少、开销低,但可能欠拟合。r较大:容量更强,但参数量和显存占用增加。
不存在适用于所有模型和任务的固定最佳 Rank。下面的取值只能作为实验起点,不能当作固定标准:
| Rank 候选值 | 适用思路 |
|---|---|
4 / 8 | 快速实验、简单任务、少量数据或资源受限场景 |
16 | 常用基线,可以优先作为起点 |
32 / 64 | 基线明显欠拟合、任务复杂或需要更大适配容量时尝试 |
128+ | 谨慎实验,需要确认效果收益能否覆盖额外训练和存储成本 |
Rank 较大并不等于效果一定更好。模型规模、数据质量、任务差异以及 LoRA 挂载范围都会影响最合适的取值。
Rank 与 LoRA Alpha
经典 LoRA 的缩放因子通常为:
scaling = α / r工程上常见把α = r或α = 2r作为起始候选,使缩放因子分别为1或2,但这只是调参经验,不是强制规则。修改 Rank 时还需要关注 Alpha,不能只调整r而忽略实际缩放强度;不同 LoRA 变体也可能采用其他缩放方式。
原始论文中的 Rank 配置
LoRA 原论文在 GPT-3 175B 实验中,为了保持大约相同的可训练参数预算:
- 只适配一种 Attention 投影时使用
r = 8。 - 同时适配 Query 和 Value 投影时使用
r = 4。 - 对 Query、Key、Value 和 Output 四种投影同时适配时使用
r = 2。
论文还比较了r = 1、2、4、8、64。在其中部分任务上,很小的 Rank 已经具有竞争力,因此不能把“GPT-3 的 Q/V 配置固定为r = 8”当作论文结论。
QLoRA 原论文的主要实验设置是r = 64、α = 16,并把 LoRA 挂载到基座模型的全部线性层。这是该论文的实验配置,不代表所有 QLoRA 任务都应该比普通 LoRA 使用更大的 Rank,也不能简单地认为 4-bit 量化后必须把 Rank 提高一档。
实操调参思路
- 从
r = 8或r = 16建立基线。 - 如果训练集和验证集都表现不足,确认数据、学习率和训练轮数没有问题后,再尝试
16 → 32 → 64。 - 如果出现过拟合、显存不足或 Adapter 体积过大,可以降低 Rank。
- 每次实验同时记录
target_modules、Alpha、学习率、Dropout、数据量和训练轮数,避免把效果变化全部归因于 Rank。 - 最终通过验证集和目标任务指标选择,不要根据“简单任务固定用8、复杂任务固定用64”机械决定。
一句话总结:Rank 决定 LoRA Adapter 的容量和参数规模;
8或16可以作为常见起点,是否继续增大必须通过验证集判断。
四、QLoRA 与其他参数高效方法
4.1 QLoRA 核心原理
QLoRA 在低比特量化并冻结的预训练模型上训练 LoRA Adapter。
预训练模型 ↓ 4-bit 量化并冻结基座权重 ↓ 插入高精度 LoRA Adapter ↓ 只训练 LoRA 参数经典 QLoRA 论文中的关键技术包括:
- 4-bit NormalFloat(NF4)。
- Double Quantization(双重量化)。
- Paged Optimizers(分页优化器)。
- 梯度穿过冻结的量化基座,更新 LoRA Adapter。
QLoRA 的核心收益是降低训练时基座权重的显存占用。实际可训练的模型规模仍然取决于显卡显存、序列长度、Batch Size、激活值、优化器和是否使用 CPU Offload 等因素。
4.2 Full FT、LoRA 和 QLoRA 对比
| 对比项 | Full FT | LoRA | QLoRA |
|---|---|---|---|
| 基座参数 | 更新 | 冻结 | 低比特量化并冻结 |
| 可训练参数 | 全部 | LoRA Adapter | LoRA Adapter |
| 显存需求 | 高 | 较低 | 通常更低 |
| 训练产物 | 完整模型 | Adapter 或合并模型 | Adapter,部署方式取决于实现 |
| 效果上限 | 通常较高 | 受配置和任务影响 | 受量化、配置和任务影响 |
| 适用场景 | 资源充足、追求上限 | 常规低成本适配、多任务 | 显存受限的大模型微调 |
不能笼统地说某种方法“一定效果最好”。模型规模、数据质量、训练目标和超参数都会影响结果。
4.3 其他常见 PEFT 方法
| 方法 | 可训练部分 | 特点 |
|---|---|---|
| Adapter Tuning | 插入的瓶颈网络 | 模块化强,但增加额外推理路径 |
| Prefix Tuning | 各层可学习 Prefix | 通过 Key/Value 前缀影响注意力 |
| Prompt Tuning | 输入端 Soft Prompt | 参数极少,效果受模型规模影响 |
| P-Tuning | 可学习虚拟 Token 或多层 Prompt | 有多种版本和实现 |
| BitFit | Bias 参数 | 参数量极低,能力上限有限 |
五、适用训练阶段与常见误区
5.1 它们可以用于哪些训练阶段
从零预训练
主流大模型从随机初始化开始训练时,通常采用全参数训练,不会把 LoRA 作为唯一的参数更新方式。冻结随机初始化的主干并只训练少量 LoRA 参数,通常无法获得完整的通用基座能力。
持续预训练
在已有 Base Model 上进行领域持续预训练时,可以选择 Full FT、LoRA 或 QLoRA。大规模领域迁移通常更偏向全量训练,资源受限时也可以使用 PEFT。
SFT
SFT 是 LoRA、QLoRA 最常见的应用场景:
指令数据 + SFT Loss + LoRA 参数更新| 参数更新方式 | SFT 中的做法 | 主要特点 |
|---|---|---|
| Full FT | 更新全部模型权重 | 参数自由度高,但训练显存和存储成本较高 |
| LoRA | 冻结基座权重,只训练低秩 Adapter | 成本较低,是常见的参数高效 SFT 方案 |
| QLoRA | 量化并冻结基座权重,只训练 LoRA Adapter | 进一步降低基座权重的显存占用 |
语境说明:在大模型应用和微调实践中,如果没有特别说明,“LoRA 微调”或“QLoRA 微调”通常指使用 LoRA、QLoRA 完成 SFT。这是一种常见的口语化表达,并不表示 LoRA、QLoRA 只能用于 SFT。严格来说,它们是参数更新方式,也可以与持续预训练、DPO、PPO、GRPO 等训练过程组合。
DPO、PPO 和 GRPO
偏好或强化学习训练也可以只更新 Policy 一侧的 LoRA Adapter,而不是更新全部 Policy 参数。不同算法中的模型角色需要分别处理:
- DPO:通常更新 Policy Model,Reference Model 保持冻结;也存在不显式使用 Reference Model 的变体。
- PPO:通常更新 Policy Model;Reference Model 和 Reward Model 一般保持冻结,Value Model 则需要训练或单独处理。
- GRPO:通常更新 Policy Model,一般不需要独立的 Value Model;如果使用 Reference Model 计算 KL 约束,Reference Model 通常保持冻结,部分实现也可能采用无显式参考模型的方案。
因此,不能简单地说“所有组件都使用同一套 LoRA”。Full FT、LoRA、QLoRA 与 DPO、PPO、GRPO 在概念上可以组合,但具体可用性仍取决于训练框架、量化支持和模型组织方式。
5.2 常见误区
误区一:LoRA 就是 SFT
错误。LoRA 是参数更新方式,SFT 是训练过程。
误区二:LoRA 会让推理速度更快
错误。LoRA 主要降低训练和模型存储成本;合并后通常接近原模型推理路径,动态加载还可能增加少量开销。
误区三:QLoRA 就是把 LoRA 参数量化到 4-bit
错误。经典 QLoRA 量化并冻结的是预训练基座权重,LoRA Adapter 通常保持较高精度训练。
误区四:Rank 越大一定越好
错误。Rank 增大会提高容量和成本,但性能收益可能饱和,也可能增加过拟合风险。
误区五:PEFT 可以无条件替代 Full FT
错误。PEFT 是成本和效果之间的工程权衡,不同任务和数据规模需要实际评测。
六、总结
Full FT └─ 更新全部模型参数 LoRA └─ 冻结基座,训练低秩 Adapter QLoRA └─ 低比特量化并冻结基座,训练 LoRA Adapter最重要的结论是:
训练阶段和参数更新策略属于不同维度。LoRA、QLoRA 不只能够用于 SFT,也可以用于持续预训练和偏好对齐,但是否适合需要结合具体工程条件判断。
参考资料
- LoRA: Low-Rank Adaptation of Large Language Models
- LoRA 官方代码
- QLoRA: Efficient Finetuning of Quantized LLMs
- Hugging Face PEFT:LoRA 开发指南
- LoRA 作者报告
- 个人 LoRA 论文阅读笔记
个人声明:本文为个人学习笔记,如有错误,欢迎指正。