目录
上一课讲 SFT:用示范对话,让基础模型学会按我们的期望接话。问题随之而来:如果给大模型的每个参数都算梯度、保存优化器状态,普通显卡很快就装不下。LoRA 和 QLoRA 解决的是训练时的资源问题,而不是把训练目标换掉。
LoRA:冻结原模型,只训练附加的小矩阵。QLoRA:在此基础上,把冻结的原模型权重以 4-bit 形式存放,进一步节省显存。
显存到底花在哪里?
假设我们用 SFT 教模型按固定格式回答:“法国的首都是哪里?请只返回 JSON。”示范答案是 “{“answer”:”巴黎”}”。不管采用哪种微调方法,模型都要读取问题、完成前向计算,再根据答案的 Loss 反向传播。
全参数微调时,模型权重之外,还要容纳梯度、优化器状态和激活值。冻结权重可以省去这部分权重的梯度与优化器状态,却不能让基础模型在训练时消失。LoRA 的想法是:给选中的线性层加一条可训练的“小支路”,原权重保持冻结。[1]
一块大矩阵,怎样用两块小矩阵来调整?
设原来的线性层权重是 $W$,输入是 $x$。普通输出是 $Wx$。LoRA 不直接更新 $W$,而是学习增量 $\Delta W$:
\[y=Wx+\frac{\alpha}{r}B(Ax),\qquad \Delta W=BA\]$A$ 先把输入压到较窄的 $r$ 维,$B$ 再映射回输出维度。$r$ 叫 Rank,$\alpha/r$ 是常见的缩放方式;不同变体也可能用别的缩放规则。训练开始时,通常让这条支路的输出为零,从原模型行为出发学习。[1][3]
看一个具体数字:若 $W$ 是 4096×4096,它有 16,777,216 个参数。选 $r=8$,$A$ 和 $B$ 合起来只有 $8×4096+4096×8=65,536$ 个可训练参数,约为原矩阵的 0.39%。这是单个线性层的演示;整个模型在多个目标层放 Adapter,比例需要重新计算。
| 同一个 4096×4096 线性层 | 原权重参数 | 需训练的新增参数 | 说明 |
|---|---|---|---|
| 全参数微调 | 16,777,216 | 16,777,216 | 直接更新 $W$ |
| LoRA,$r=8$ | 16,777,216(冻结) | 65,536 | 更新 $A$ 和 $B$ |
| QLoRA,$r=8$ | 16,777,216(冻结、低比特存放) | 65,536 | 可训练部分仍是 Adapter |
自己调一调 Rank
拖动 Rank,看看同一层的可训练参数怎样变化。这里比较的是参数量,不是整卡显存预测。
公式:r×4096+4096×r。条形图为示意,低比例设有最小可见宽度。Rank 越大,容量与状态开销都增加;效果不保证单调变好。
Rank 不是越大越好:它给增量更大的表达空间,也增加参数、显存和过拟合风险。$\alpha$ 控制小支路的缩放;“Rank=8”本身不能说明适配效果。Hugging Face 的 PEFT 文档把 Rank、$\alpha$ 和目标模块列为独立配置项。[3]
小支路加在哪里?
LoRA 通常加在线性投影层,例如 Attention 的 Q、K、V、输出投影,或 FFN 中的投影。只选少数层更省资源,但可能限制模型能学到的变化;覆盖更多层通常需要更多训练资源。目标层名称随架构而变,不能把某个模型的配置原样套给所有模型。PEFT 允许自行选择目标模块;QLoRA 风格配置常覆盖更多线性层。[3]
对刚才的 JSON 回答任务,训练数据决定要学什么,LoRA 决定用哪些参数来学。它不能把错误的示范变成正确答案。
QLoRA 又多省了哪一笔?
LoRA 已经不更新基础权重,但训练时仍要把基础模型装进显存。QLoRA 再把冻结的基础权重以 4-bit 量化形式存放,计算时按实现方式把数值还原到计算精度,梯度沿计算图传给 LoRA Adapter。它不是把所有训练计算都变成 INT4,也不是对量化基础权重做全参数更新。原论文还引入 NF4、Double Quantization 和 Paged Optimizers,分别处理量化表示、量化常数占用和显存峰值。[2]
仍拿这一块 4096×4096 矩阵比较:只算原权重,BF16 存放约 32 MiB;理想的 4-bit 位数换算约 8 MiB。但实际量化还要保存 Scale 等元数据,有些层保持更高精度;8 MiB 不是该层训练显存,更不是整模型显存需求。
| 方法 | 基础权重 | 可训练部分 | 主要省在哪里 |
|---|---|---|---|
| 全参数微调 | 高精度,参与更新 | 整个模型 | 不以省显存为目标 |
| LoRA | 高精度,冻结 | 低秩 Adapter | 梯度与优化器状态 |
| QLoRA | 低比特,冻结 | 低秩 Adapter | 在 LoRA 基础上再压基础权重 |
为什么参数少了,显卡仍可能装不下?
训练显存不只有权重。序列越长,激活往往越占空间;Batch、优化器、Attention 实现、梯度检查点和目标层选择也会改变峰值。QLoRA 的 4-bit 权重能节省一笔,但反量化和内核实现也有成本,不保证比 BF16 LoRA 训练得更快。能否在某张显卡运行,必须按具体模型、上下文长度和训练配置实测。QLoRA 论文的单卡案例是特定硬件与设置下的结果,不是“任意普通显卡都能微调任意大模型”的承诺。[2]
实操时至少分别记录:模型质量、显存峰值、每步耗时。LoRA/QLoRA 是资源策略,不是免评估的质量保证。
训练完怎么用?
LoRA Adapter 可以单独保存,推理时加载到对应版本的基础模型上;也可以在合适精度下把增量合并进权重。单独保存便于切换任务,但 Adapter 不包含完整基础模型,不能脱离它独立使用。量化基础权重上的合并方式还受格式和实现约束,部署前要检查实际输出。PEFT 文档提供了加载、切换与合并 Adapter 的接口。[3]
把本课收成一句话:LoRA 省的是“要训练多少参数”;QLoRA 还省“冻结基础权重怎么存”。两者都没有让数据质量、激活显存和真实评估变得不重要。
约 100 秒讲解视频
参考文献(References)
- Hu, E. J., Shen, Y., Wallis, P., et al. “LoRA: Low-Rank Adaptation of Large Language Models.” ICLR, 2022. arXiv:2106.09685.↩
- Dettmers, T., Pagnoni, A., Holtzman, A., and Zettlemoyer, L. “QLoRA: Efficient Finetuning of Quantized LLMs.” NeurIPS, 2023. arXiv:2305.14314.↩
- Hugging Face. “LoRA.” PEFT Documentation, accessed 2026-10-09.↩
第二十二课复习总图
下一课进入偏好对齐:RLHF 与 DPO 怎样让模型更符合人类选择?