全量微调、LoRA、QLoRA 怎么选?用简单例子讲清六种微调方法

刚了解大模型训练时,我以为"微调"就是拿一些资料,让模型继续学。

这个理解没错。但再往下看,又出现了一串名字:全量微调、冻结层、LoRA、QLoRA、Adapter、Prompt Tuning......

它们究竟有什么区别?如果我只有一个小模型,应该从哪里开始?

先记住一句话:

这些方法最主要的区别,是训练时允许哪些参数发生变化;它们并不代表六种完全独立的模型。

本文先列对比,再用同一个例子解释。重点讲原理和用途,不涉及环境安装与训练命令。

阅读说明:六类是便于入门的分组,不是穷尽所有方法的严格分类。文中的 0.5B、24 层、矩阵尺寸、回答和数据量均为教学示例,不是实际训练结果。Adapter 专指经典瓶颈模块;软提示一组包含两种不同方法。

1. 先看一张对比表

方法 训练时改什么 主要用处 要注意什么
全量微调 全部原模型参数 希望充分调整模型,且有足够数据和计算预算 训练开销大,也可能过拟合、遗忘旧能力
部分参数微调 指定的原有层或模块 控制改动范围,例如只训练任务输出头 哪些部分值得改,需要实验验证
LoRA 新增的低秩矩阵,原权重冻结 较低成本地适配任务、格式和风格;保存多个任务版本 底座仍要加载,不会自动变成更小模型
QLoRA 量化、冻结底座,训练 LoRA 参数 底座权重占用太大时,进一步节省训练内存 不是所有运算都用 4 位,也不保证更快
Adapter 插入模型的小型网络模块 共用一个底座,为不同任务保留可切换模块 通常保留额外计算模块,需要推理框架支持
软提示微调 可学习的提示向量或注意力前缀 用很少的任务参数引导固定底座 不是手写提示词;效果受模型、任务和配置影响

LoRA、Adapter、软提示等通常归入 PEFT,即"参数高效微调"。QLoRA 又是在 LoRA 上结合量化,所以这些名字之间存在包含和组合关系,不是六选一的互斥开关。PEFT 官方概览

表中列的是选型出发点,不是效果排名。不能仅凭名字断言"全量一定最好"或"QLoRA 一定不损失效果"。

2. 先明确:我们想让模型学会什么?

假设已经有一个能聊天的小模型,我们想让它回答折扣计算题时,稳定使用简短格式。

训练样例可以这样写:

text 复制代码
问题:商品原价 80 元,先打八折,再减 10 元,最后多少钱?

目标回答:
计算:80 × 0.8 - 10 = 54。
答案:54 元。

这里需要一批经过核对的不同样例,不是只重复这一道题。

常见的监督微调,也就是 SFT,会让模型学习目标回答中 token 的预测:计算预测与目标的差距(Loss),反向传播得到梯度,再由优化器更新允许训练的参数。训练通常可以并行计算多个位置的预测,不必像聊天一样逐个生成完整答案后才比较。SFT 官方说明

下面六种方法,都可以用来决定这个过程中"哪些参数允许更新"。

不过,如果目标只是改变两行输出格式,先给提示词和几个示例就值得尝试。这个例子用来理解微调,不意味着所有格式需求都需要训练。

3. 全量微调:允许整套原参数调整

假设一个模型总计约 0.5B 参数,也就是约 5 亿个可学习的数字。

全量微调会让这整套原参数都参与优化,包括词嵌入、注意力、FFN、归一化参数和输出层等,具体组成取决于模型结构。

"都参与优化"不是说每个数字每一步都一定变化,而是没有刻意冻结其中一部分。0.5B 也是整个模型的合计,不是每层都有 0.5B。LoRA 论文中的全量微调对照

它的特点是调整范围大。代价是要为大量参数维护梯度、优化器状态等训练数据。

适用场景:确实需要较广泛的模型适配,并且有足够的数据、资源和评测能力。自由度更大不等于效果必然更好,少量重复样例也可能把模型带偏。

这里还容易混淆一个词:"全量"说的是更新范围,不是 32 位精度。 全量微调同样可以使用 BF16、FP16 等混合精度训练方式。

4. 部分参数微调:只允许指定部分调整

仍然假设模型有 24 层,我们可以规定:

text 复制代码
第 1~22 层:冻结,不更新权重。
第 23~24 层:允许更新权重。
其他模块:本例也冻结。

也可以按模块选择,例如只训练一个任务输出头,而不是按层划分。

下面仅展示 Transformer 层的更新范围;词嵌入、输出层等未画出。绿色表示可训练,灰色表示冻结。

注意,冻结不是跳过:输入仍然经过前面的层。是否需要为冻结区域保留反向传播路径,还取决于它之前是否有需要训练的参数,不能统一理解为"不计算梯度链路"。PyTorch 参数冻结与自动求导说明

适用场景:已经知道希望调整哪些模块,或者想做控制变量实验。它实现直观,但"只训练最后两层"不是什么通用最优方案,也不能理解成最后两层天然只负责某种业务。

5. LoRA:原权重不改,学习一份低秩更新

全量微调直接调整原矩阵。LoRA 换了一种思路:冻结原矩阵 W,旁边放两个较小的可训练矩阵 A、B。

输入向量 x 经过两条路径,结果相加:

text 复制代码
原路径:W × x
新增路径:s × B × (A × x)

最终输出:y = W × x + s × B × (A × x)

s 是缩放系数,用来控制更新分支的幅度。这里省略偏置等细节。LoRA 原始论文

到底少训练了多少参数?

用图里的教学尺寸算一次:

项目 参数量
原矩阵 W:896 × 896 802,816
新矩阵 A:8 × 896 7,168
新矩阵 B:896 × 8 7,168
A、B 合计 14,336

因此,新增可训练参数量是原矩阵的:

text 复制代码
14,336 ÷ 802,816 ≈ 1.79%

注意,是相对于这一块矩阵的 1.79%,不是整个模型只训练 1.79%,更不是显存只用原来的 1.79%。

原矩阵仍然存在,新增矩阵训练的是它的更新量,并没有把原来的 802,816 个参数压缩成 14,336 个。

这里的 8 是秩参数 r。它约束新增更新能表达的变化,和 token 数量、Transformer 层数不是一回事。整个模型的 LoRA 参数量,还取决于给哪些层、哪些矩阵加 LoRA;真实矩阵也不一定都是正方形。PEFT LoRA 参数说明

适用场景:希望用较少可训练参数适配任务、回答风格、结构化输出,或者为同一个底座保存多个任务版本。

训练后怎么用?

常见方式有两种:加载原模型再挂上 LoRA,或者在支持的情况下,把更新合并进原权重:

text 复制代码
W新 = W + s × B × A

这是标准线性 LoRA 可以合并的原因。合并后矩阵的形状不变,但数值变了,不必继续单独计算该 LoRA 分支。LoRA 合并说明

单独的 LoRA 文件不是完整模型,需要匹配的底座及分词器等配置。导出合并模型时,又会包含完整底座权重;某些量化方式或特殊配置还会限制合并,不能保证任意组合都能直接操作。PEFT 检查点说明

6. QLoRA:再把冻结底座的存储占用降下来

LoRA 减少了可训练参数,但原模型依然需要加载。如果底座很大,这部分仍然占用大量内存。

QLoRA 的关键组合是:低位量化、冻结的底座,加上可训练的 LoRA。 原始方法采用 4 位底座权重存储,并配合 NF4、双重量化和分页优化器等设计降低内存开销。QLoRA 原始论文

图只画前向计算;训练时还需要通过这些运算,把梯度传回 LoRA 参数。

别把"4 位存储"理解成"所有计算和训练数据都是 4 位"。例如,官方实现指南展示了 4 位权重存储配合 BF16 计算;LoRA 参数、激活、梯度和优化器状态也有各自的精度与开销。PEFT 量化训练指南

再做一个只计算权重数据的理想化例子:假设恰好 5 亿个参数全部按统一位宽保存。

text 复制代码
16 位:500,000,000 × 2 字节 = 1 GB
 4 位:500,000,000 × 0.5 字节 = 0.25 GB

这里使用十进制 GB,忽略量化元数据、未量化模块及其他开销。因此它不是实际模型文件大小,更不是完整训练内存需求。

适用场景:底座权重占用已经成为训练的主要限制。QLoRA 主要解决内存压力;量化与反量化也有代价,具体速度、效果需要在自己的硬件和任务上测试。

7. Adapter:在模型中插入小型可训练模块

经典瓶颈 Adapter 会在原网络中插入小模块,冻结大部分或全部原参数,让新增模块学习任务变化。典型结构包含降维、非线性变换、升维和残差连接。Adapter 原始论文

可以用下面这个教学例子理解:

text 复制代码
输入 h:896 维
  ↓ 降维
中间表示:32 维
  ↓ 非线性变换,再升维
更新向量:896 维
  ↓ 与原输入 h 相加
输出:896 维

看到"降维再升维",是不是很像 LoRA?区别在于:经典 Adapter 是插入计算路径的网络模块,通常包含非线性;标准 LoRA 是对原线性权重增加低秩更新。

所以经典非线性 Adapter 通常不能像标准 LoRA 那样,简单合并成原来的一块权重矩阵。

适用场景:共用一个底座,为不同任务保存、切换小模块。要同时考虑服务框架是否支持这些模块,以及额外的推理开销。

还有一个命名陷阱:框架也会把 LoRA 的附加参数文件统称为"adapter"。看到 adapter_model.safetensors,不能仅凭文件名断定使用的是本节这种瓶颈 Adapter。PEFT 文件格式

8. 软提示微调:训练一组提示向量

手写提示词是这样的:

text 复制代码
请用"计算"和"答案"两行回答。

它是普通文字,会经过分词器变成 token。只改这段文字,通常没有更新模型参数,不属于这里说的微调。

软提示则是通过训练得到的一组连续数值向量,不要求对应词表中的真实词语。它不是程序帮你偷偷写了一句更好的中文提示词。软提示官方说明

这一组方法里,先区分两个名字:

方法 可学习信息放在哪里
Prompt Tuning 模型输入端,与输入 token 的嵌入向量拼接
Prefix Tuning 注入各层注意力的前缀,常以额外 K/V 等状态参与计算

它们都可以冻结底座,但不是同一种实现。Prompt Tuning 论文Prefix Tuning 论文

例如,最简单的 Prompt Tuning 如果直接学习 20 个、每个 896 维的提示向量,就有 20 × 896 = 17,920 个可训练参数。这个算式不适用于带额外编码器的变体,也不能拿来直接计算各层 Prefix 的参数量。

适用场景:希望用很小的任务参数包,引导同一个底座完成分类、抽取或特定生成任务。实际效果和模型规模、任务有关,不能因为参数最少,就认定它最适合小模型。

这些向量需要相应模型运行接口支持,不是往普通聊天 API 的文本框里粘贴几个数字就能使用;提示位置或注意力前缀也会带来额外的序列、缓存和计算开销。

9. 省参数、省文件、省训练内存,不是一回事

把三个问题分开,就不容易选错:

  • 训练多少参数? 决定哪些权重需要更新,以及相关梯度、优化器状态的规模。
  • 保存多少新数据? LoRA 等可以只保存新增任务参数,但它们通常依赖原模型。
  • 运行时要多少资源? 还要算完整底座、激活、中间结果、缓存和框架开销。

所以,"只训练几百万参数"不等于"只运行一个几百万参数的模型"。

训练时的内存压力,常来自权重、梯度、优化器状态和激活等;聊天生成时,KV Cache 是另一项重要开销。不能把两者都简化成"显存主要放 KV Cache"。Transformers 训练内存说明

同样,LoRA 训练后合并回一个约 0.5B 的底座,它仍然大致是原来的参数规模和层数,不会自动变成 0.05B。

10. 微调、SFT、蒸馏,到底怎么对应?

这些概念回答的是不同问题:

角度 例子 回答的问题
参数更新方式 全量、LoRA、QLoRA 训练时改哪里?
训练目标或学习方式 SFT、偏好优化等 用什么信号让模型学习?
知识传递方式 蒸馏 是否让学生模仿教师的输出或行为?

例如,让大模型生成并经过核验的解题示例,再用 LoRA 训练小模型,可以同时称为:使用教师输出做监督微调,以及一种输出蒸馏。

但这不等于直接匹配教师的 token 概率分布。蒸馏有不同形式,不能只用"拿大模型的答案训练"概括全部。经典知识蒸馏论文序列级知识蒸馏论文

11. 第一次实验,我会怎么选?

如果目标是学习训练流程,我会先选一个已经具备基本能力的小模型,用 LoRA 做范围很窄的任务,再保留原模型作为对照。

理由是它把"底座能力"和"新增更新"分得比较直观,便于观察训练参数与产物。若底座权重占用太大,再评估 QLoRA;若要研究更新范围的影响,且资源允许,再对比部分参数或全量微调。

这只是入门路线,不是说 LoRA 在任何任务上都最优。

仍以折扣题为例,一个教学实验可以安排:

  1. 准备几百条正确样例,统一答案格式,并保留不同的数字、条件顺序和措辞。
  2. 按题目来源或生成模板分组,划分训练集、验证集、测试集,避免同题换几个字后同时出现在训练和测试中。
  3. 用训练集学习、验证集选配置,最后在保留的测试集上比较原模型与微调模型;不要根据测试结果反复调参。
  4. 保持提示模板、量化设置和生成参数等条件一致,分别统计答案正确率、格式合规率,并抽查原有能力是否下降。

"几百条"只是起步实验的量级示例,不是有效微调的数据门槛。Loss 降低也不等于真实任务一定更好,更不能拿已经训练过的题证明泛化能力。

回到最初的问题,六种方法可以压缩成六句话:

全量:整套原参数都允许改。

部分参数:只改选中的原参数。

LoRA:原权重冻结,学习低秩更新。

QLoRA:量化冻结底座,再训练 LoRA。

Adapter:插入并训练小型网络模块。

软提示:训练提示向量或注意力前缀。

先明确想改善什么,再用测试确认有没有改善,比先挑一个听起来最先进的名字更重要。

相关推荐
嘿嘿-661 小时前
GPT-6 Astra 新手快速上手指南
人工智能·gpt·ai·chatgpt·ai编程
jimidou1 小时前
子 Agent 能并行,却不能互相说话:Claude Code 里哪些活不该委派
agent·ai编程
橙序员小站2 小时前
从 Demo 到生产:Agent Harness 如何把 AI 真正“接”进项目
后端·aigc·ai编程
拒绝内耗。3 小时前
程序员学 AI(六):Tools 与 Tool Calling——AI 为什么可以调用外部能力
人工智能·ai编程
粥里有勺糖3 小时前
视野修炼-技术周刊第132期 | 一些有趣的组件
前端·github·aigc
xierui1231234 小时前
Agent记忆不是聊天记录:用三层存储构建可追溯的 AI 工作流
数据库·人工智能·aigc·软件工程
杨杨杨大侠4 小时前
推理模型和 MoE 到底有什么区别?从一道打折题讲到专家分工
aigc·openai·ai编程
feasibility.5 小时前
ABot-World-0:当一块 RTX 5090 能编织无限世界——交互式世界模型的高德解法
人工智能·aigc·视频·地图·具身智能·英伟达·世界模型