1. 什么时候开始考虑微调
如果问题是“模型不知道昨天更新的制度”,先考虑知识更新与检索。如果问题是“在很多不同输入下,都稳定不能完成我们要求的输出行为”,才有理由考虑训练适配。
微调是在已有模型基础上继续训练,修改全部或部分参数。它适合某些格式、风格、领域任务和行为适配,但数据、验证和部署都会增加工作。
先比较三种信息进入方式:
| 方法 | 改哪里 | 更新资料的方式 |
|---|---|---|
| Prompt | 当前请求的说明和示例 | 修改输入 |
| RAG | 请求中的外部证据 | 更新文档与索引 |
| 微调 | 模型或附加模块的参数 | 准备数据并训练、评估、发布 |
这些方法可以组合。例如微调教模型更稳定地依据证据回答,RAG 提供当前证据。
2. 全量微调为什么占显存
全量微调通常让基础模型的所有参数都参与学习。训练除了权重,还要保存梯度、优化器状态、激活与临时缓冲。
以 Adam 类优化器为例,常维护一阶与二阶状态;某些混合精度实现还保留 FP32 主权重。具体每参数多少字节取决于实现与配置,不应只按 FP16 权重乘一次就当完整训练需求。
还要考虑序列长度、batch、梯度检查点、分片、CPU offload 和并行策略。因此“7B 微调一定需要某个固定显存数字”不成立。
3. LoRA:冻结原权重,学习小的增量
设原始线性层是:
LoRA 用两个较小矩阵表示更新:
其中:
- 的 shape 为 。
- 的 shape 为 。
- 是秩的上限,通常比输入、输出维度小。
- 是常见缩放形式,具体变体可能不同。
原来的 冻结,只更新 。输入仍经过基础模型,不是把基础模型删掉了。该方法见 LoRA 论文。
“低秩”可以先理解为:不自由调整整个大矩阵,而是用有限数量的变化方向组合更新。这是一种容量约束,不保证所有任务的最佳更新都能被很小的秩表达。
4. 手算参数量
假设 :
原矩阵参数量为 。
设 ,LoRA 两矩阵参数总量:
只看这个层,可训练参数变为原矩阵的 。但整个模型的显存不会自动变为 ,因为冻结权重、激活和运行缓冲仍然存在。
din, dout, rank = 1024, 1024, 8
full = din * dout
lora = rank * din + dout * rank
print(full, lora, full // lora) # 1048576 16384 64
调大 增加可训练容量,也增加参数和状态占用。它不是越大越好,要看验证效果与预算。
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。