← 返回笔记列表
AI 技术与原理 第 14 / 28 篇

AI 原理学习笔记(十四):全量微调、LoRA 与 QLoRA

查看“AI 技术与原理”专题目录(14/28)
本文目录 11 个小节

返回系列导读 · 先修:网络训练

1. 什么时候开始考虑微调

如果问题是“模型不知道昨天更新的制度”,先考虑知识更新与检索。如果问题是“在很多不同输入下,都稳定不能完成我们要求的输出行为”,才有理由考虑训练适配。

微调是在已有模型基础上继续训练,修改全部或部分参数。它适合某些格式、风格、领域任务和行为适配,但数据、验证和部署都会增加工作。

先比较三种信息进入方式:

方法改哪里更新资料的方式
Prompt当前请求的说明和示例修改输入
RAG请求中的外部证据更新文档与索引
微调模型或附加模块的参数准备数据并训练、评估、发布

这些方法可以组合。例如微调教模型更稳定地依据证据回答,RAG 提供当前证据。

2. 全量微调为什么占显存

全量微调通常让基础模型的所有参数都参与学习。训练除了权重,还要保存梯度、优化器状态、激活与临时缓冲。

以 Adam 类优化器为例,常维护一阶与二阶状态;某些混合精度实现还保留 FP32 主权重。具体每参数多少字节取决于实现与配置,不应只按 FP16 权重乘一次就当完整训练需求。

还要考虑序列长度、batch、梯度检查点、分片、CPU offload 和并行策略。因此“7B 微调一定需要某个固定显存数字”不成立。

3. LoRA:冻结原权重,学习小的增量

设原始线性层是:

h=Wx,W∈Rdout×dinh=Wx,\quad W\in\mathbb R^{d_{\text{out}}\times d_{\text{in}}}

LoRA 用两个较小矩阵表示更新:

W′=W+ΔW,ΔW=αrBAW'=W+\Delta W,\quad \Delta W=\frac{\alpha}{r}BA

其中:

  • AA 的 shape 为 [r,din][r,d_{\text{in}}]。
  • BB 的 shape 为 [dout,r][d_{\text{out}},r]。
  • rr 是秩的上限,通常比输入、输出维度小。
  • α/r\alpha/r 是常见缩放形式,具体变体可能不同。

原来的 WW 冻结,只更新 A,BA,B。输入仍经过基础模型,不是把基础模型删掉了。该方法见 LoRA 论文。

“低秩”可以先理解为:不自由调整整个大矩阵,而是用有限数量的变化方向组合更新。这是一种容量约束,不保证所有任务的最佳更新都能被很小的秩表达。

4. 手算参数量

假设 din=dout=1024d_{\text{in}}=d_{\text{out}}=1024:

原矩阵参数量为 10242=10485761024^2=1048576。

设 r=8r=8,LoRA 两矩阵参数总量:

8×1024+1024×8=163848\times1024+1024\times8=16384

只看这个层,可训练参数变为原矩阵的 1/641/64。但整个模型的显存不会自动变为 1/641/64,因为冻结权重、激活和运行缓冲仍然存在。

din, dout, rank = 1024, 1024, 8
full = din * dout
lora = rank * din + dout * rank
print(full, lora, full // lora)  # 1048576 16384 64

调大 rr 增加可训练容量,也增加参数和状态占用。它不是越大越好,要看验证效果与预算。

5. 初始化与目标模块

常见初始化让一个矩阵随机、另一个为零,使初始增量为零,模型从原始行为起步。若两个矩阵都初始化为零,乘积对两边的梯度可能同时为零,更新会卡住。

把 LoRA 加在哪些层叫目标模块选择,例如注意力投影或其他线性层。不同模型的模块名和效果不同,不能直接复制别的架构名称就假设匹配。

相关配置说明见 PEFT LoRA 文档。训练前应该检查实际有哪些参数可训练,以及数量是否符合预期。

6. QLoRA 多做了一件什么事

QLoRA 结合量化存储的冻结基础权重与可训练的低秩适配器。基础权重可以以低位表示节省存储,计算过程中按实现使用适当精度的数参与运算。

这不等于“所有训练计算都使用 4 bit”,也不等于“直接对所有 4 bit 权重做完整训练”。原始方案还涉及 NF4、双重量化等设计,见 QLoRA 论文。

NF4,NormalFloat 4-bit,可以先理解为一种按相应权重分布设计的 4 位刻度安排,并非普通等间隔 INT4。双重量化进一步量化保存量化所需的部分常数,降低这些元数据的占用。原方案的 分页优化器借助分页等内存管理机制处理内存峰值;这些细节各省不同部分,不应合称为“全部变成四位计算”。

存储精度、计算精度、梯度精度、优化器状态精度应该分别问清。它们可以不同。

量化节省权重内存,但可能带来误差、反量化开销与硬件要求。效果和速度需要在实际任务、硬件与推理后端上检查。

7. PEFT 不只 LoRA

PEFT 指参数高效微调这一类方法:

  • Adapter 在网络中加入小模块,训练新增参数。
  • Prompt tuning 学习一组连续提示向量,并非人工写几个词。
  • Prefix tuning 在相关位置加入可训练前缀表示。
  • LoRA 学习权重增量的低秩分解。

它们动的位置不同。SFT、DPO 则描述训练目标或流程,属于另一条分类轴。完全可以“用 LoRA 做 SFT”,不能把它们当互斥选项。

8. 一次微调项目的正确顺序

先冻结评测题集和基础模型基线,再收集、授权、清洗、标注和划分训练数据。检查相似问题、用户和文档版本是否跨集合泄漏。

然后做小规模训练实验,观察训练与验证曲线、领域收益、通用能力退化、拒答和安全边界。最后保存适配器、基础模型版本、Tokenizer、模板、数据与训练配置。

上线时,适配器必须配对兼容的基础模型。合并适配器可以减少某些运行分支,但量化权重上的合并及再量化可能引入额外误差,需要重新验证。

9. 常见误区

LoRA 可训练参数少,不表示无需数据质量。低质量标签会教会模型错误行为。

训练损失下降,不表示真实业务改善;可能只是更会复述训练答案。微调也可能损伤原有能力,因此要保留基础能力与边界问题的回归测试。

“模型更懂某领域”太笼统。应该写成“在独立合同字段抽取集上,哪些字段的指标改善了多少,代价是什么”。

复习卡片与自测

  • 全量微调改全部参数;LoRA 冻结基础参数,学习低秩增量。
  • QLoRA 进一步节省基础权重的存储。
  • 训练显存还包括激活、梯度、优化器状态与缓冲。
  • 参数高效与训练目标是两条独立维度。

1. LoRA 参数减少 64 倍,显存也必然减少 64 倍吗?

参考答案不必然。基础模型和激活仍需要资源,减少的主要是被训练参数及其梯度、优化器状态的一部分。

2. LoRA 和 SFT 能同时使用吗?

参考答案可以。LoRA 决定哪些参数怎样更新,SFT 决定依据什么训练样本和监督目标更新。

3. 为什么适配器文件不能随便配另一个同规模模型?

参考答案它学习的是特定基础权重及模块结构上的增量。参数量相同不代表结构、坐标与权重兼容。

原文定位

依据:原资料 7.1—7.2、7.4、7.6—7.8、13.2。

继续学习本专题