第 39 章 继续预训练、微调与 LoRA/QLoRA
39.1 “微调一下”还没有回答两个问题
Section titled “39.1 “微调一下”还没有回答两个问题”假设模型即使拿到了正确证据,仍反复误读某种专业文档。第 38 章要求先建立基线、检查诊断,再考虑改参数。如果后续证据确实支持训练,一句“微调一下”仍然留下两个问题:用什么数据、按什么目标学习?允许哪些数值改变?
这两个选择相互独立。同一批期望助手回答,可以用来更新全部权重,也可以用来训练少量新增参数。反过来,同一种小参数更新机制,也可以搭配不同训练目标。因此“SFT 与 LoRA 哪个好”常常问错了层次:二者回答的不是同一个问题。
我们先分清两条轴,再完整计算一个小例子。第 7 章提供参数更新的基础,第 23 章提供数据来源要求,第 34 章提供指令损失。CPU 练习只需已有的 Python 入门。
39.2 先决定让模型从什么材料里学
Section titled “39.2 先决定让模型从什么材料里学”继续预训练(continued pretraining)是在已经预训练的模型上,使用更多文本继续优化语言建模目标。文本可以来自某个领域,也可以来自经过选择的数据混合。因果解码器可以继续预测下一个 Token,掩码语言模型也可以继续使用掩码目标。“继续”说明起点已有预训练,并没有保证新增文本新鲜、相关或具备使用许可。
微调(fine-tuning)广义上指为了适配目的,进一步训练已有预训练模型。不同作者用法不完全一致,有时也把继续做语言建模算在内。为了避免歧义,应直接记录训练目标,不靠名称猜测。本部分的 SFT 指按示范学习期望回答,并使用明确规定的目标掩码。
表 39.1:数据与目标是一条轴。
| 训练选择 | 提供的数据或反馈 | 训练信号从哪里来 |
|---|---|---|
| 继续预训练 | 新增文本,记录来源与配比 | 从文本构造语言建模目标 |
| SFT | 请求与期望回答,也可以包含已核验解答 | 所选示范回答 Token 的似然 |
| 偏好优化 | 比较记录与评分准则 | 奖励模型/RL 反馈,或 DPO 等直接偏好对目标 |
| RLVR | 题目、采样回答与明确的核验器 | 检查采样尝试得到的奖励 |
以领域适配为例,用制度文档继续预训练,是让模型更好地预测这类文本中会出现什么;用“问题加相关文档 → 范围正确的回答”做 SFT,则是在教回答行为。在证据充分的项目里,两者都可能有用,但都没有建立对明天新版制度的实时访问。
Gururangan 等人研究了 RoBERTa 先做领域或任务适配预训练,再做监督分类的效果,还设置了不相关领域对照。这提示我们检验语料相关性和分布适配,却没有证明每天夜里微调一次,就适合更新住宿限额。论文实验针对的是特定编码器与分类任务。
39.3 再决定优化器可以改哪些数
Section titled “39.3 再决定优化器可以改哪些数”可训练参数是这项训练允许优化器更新的存储数值;冻结参数是在本次训练中保持不变的数值。被冻结的层仍可参与计算,也可传递更新其他层所需的梯度。“冻结”不等于把它从模型里删除。
表 39.2:更新机制是另一条轴。
| 更新机制 | 固定的部分 | 可训练的部分 | 必须记录 |
|---|---|---|---|
| 全量更新 | 按此定义,不冻结一部分基座权重 | 所选模型的全部参数 | 包括嵌入、输出头和偏置在内的准确范围 |
| 插入适配器模块 | 通常固定大部分基座权重 | 新增小模块及明确启用的其他参数 | 插入位置、瓶颈宽度、非线性及额外训练层 |
| LoRA | 所选基座矩阵保持固定 | 附加到这些矩阵上的低秩因子 | 目标矩阵、秩、缩放、dropout 和其他可训练数值 |
| QLoRA 式适配 | 量化后的基座权重固定 | 通常以较高精度存储、训练的 LoRA 因子及明确的额外参数 | 量化器、存储与计算精度、目标矩阵和优化器配置 |
参数高效微调(parameter-efficient fine-tuning,PEFT)泛指用相对较少的可训练参数完成适配的一类方法。原始瓶颈模块意义上的适配器(adapter)会插入一段小变换:先缩窄特征向量,经过非线性,再恢复宽度,并与原路径结合。这与增加线性的低秩权重增量不同。部分软件也把 LoRA 权重称为 adapter,因此仍需说明具体机制。
Houlsby 等人的原始适配器配方还训练层归一化参数和分类器。所以“适配器训练只改新插入的权重”说得太满,应查看实际可训练参数列表。原始设计说明了瓶颈与残差路径。
39.4 把一个低秩更新完整算出来
Section titled “39.4 把一个低秩更新完整算出来”例 39.1:三个输入,四个输出。 输入 是有三个坐标的列向量。基座矩阵 有四行三列,每一行把三个输入坐标组合成一个输出坐标。下面全是作者给定、没有物理单位的教学值,不是 PEFT 实训得到的权重。
最后一个输出为 。现在想表示一种改动,但不为十二个位置各存一个独立可调的增量。
先用只有一行的矩阵 ,把三个输入坐标压成一个数,再用只有一列的矩阵 ,把这个数展开成四个坐标。上标 表示转置,也就是把列出的这一行写成一列。 的维度为 , 为 。
这是对输出的改动,不是替代原输出。把合并后的四坐标输出记为 ,按坐标相加:
还可以换一条计算路径检查。先算 乘 :B 的每一项分别乘整行 A,形成增量矩阵的一行。
第三行为 ,第四行为 。增量与 同为 ,因此可以相加:
两条路径结果相同。增量的所有行都是同一行的倍数,因此它只用了一个独立的行方向。这就是这里秩为一(rank one)的含义,秩不是质量等级。基座矩阵本身不必秩为一。
低秩适配(Low-Rank Adaptation,LoRA)保持基座矩阵不变,训练这样的增量因子。设输入坐标数为 ,输出坐标数为 ,秩的上限为 :
表示矩阵元素为实数。中间向量 有 个坐标,B 把它恢复成 个坐标。原始 LoRA 约定用 缩放增量, 是选定的缩放系数。本例取 、,就回到了前面的计算。增量的秩最多为 ;如果因子里存在重复方向或零方向,还可能更低。
原始配方把一个因子随机初始化,另一个初始化为零,因此起始增量为零。两个因子都设为零则不同:乘积路径中,每个因子的梯度都还要乘另一个零因子,这条普通乘积路径便无法起步。上面给出的非零因子只是演示一种可能的增量,不是初始化,也不是训练结果。Hu 等人说明了这种参数化与初始化。
- 一组数字x = [1, 2, 3]ᵀ
- 模型保存的数值W₀:4 × 3;冻结
- 处理步骤W₀x = [1, 2, 3, 3]ᵀ
冻结只是不更新;基座仍参与前向计算,也仍占存储。
- 模型保存的数值A = [2, 0, −1];1 × 3
- 处理步骤Ax = 2 − 3 = −1
- 模型保存的数值B = [1, 0, −1, 2]ᵀ;4 × 1
- 处理步骤BAx = [−1, 0, 1, −2]ᵀ
两路相加:[0, 2, 4, 1]ᵀ。缩放 α/r = 1;数值由作者指定,未经训练。
图 39.1 区分固定基座数值、可训练因子与计算出的中间值。输入节点保存 的三个数值坐标,同一个向量进入两条路径。基座被冻结,不代表合并输出不变;新增因子可以改变行为,也可能损害此前正确的行为。
39.5 先数清,再谈节省
Section titled “39.5 先数清,再谈节省”完整 矩阵有十二个参数,秩为一的因子有 个。对这一个矩阵而言,少训练五个数,但允许的增量也受到限制。基座原来的十二个数仍然要存储。
一般来说,因子参数量为 ,全量增量则有 个独立位置。要统计实际选中的所有矩阵,以及额外训练的偏置或输出头;单个矩阵不能代表全模型内存。
表 39.3:维度合适,低秩才会少用参数。
| 矩阵维度 | 秩 | 完整矩阵元素数 | 因子元素数 | 因子量 / 完整矩阵量 |
|---|---|---|---|---|
| 4 × 3 | 1 | 12 | 7 | 7/12 |
| 4 × 3 | 2 | 12 | 14 | 14/12 |
| 4096 × 4096 | 8 | 16,777,216 | 65,536 | 0.390625% |
在小矩阵里,秩为二的因子量已经超过完整增量。大矩阵例子中,,除以 ,得到 0.00390625,也就是 0.390625%。这些是精确计数,不是实测训练内存或速度。
可训练数值减少后,相应的优化器状态和参数梯度可能减少,但基座存储、激活、临时张量和计算仍在。适配器文件很小,不能当作训练总内存很小的证据。秩太低或目标矩阵选择不合适,也可能限制任务所需的改动。
普通线性 LoRA 路径可以先合并成 ,运行时只做一次矩阵乘法。精确算术下函数相同,有限精度却可能产生差别。保存的适配器还依赖特定基座版本和目标映射;维度相同,并不代表能与任意基座权重配套。需要回退或切换时,应分别保留基座和适配器;若实际运行合并版,也要评测那个产物。
39.6 量化基座,又是另一种改动
Section titled “39.6 量化基座,又是另一种改动”QLoRA把冻结的量化基座与可训练低秩因子结合起来。原始工作采用 4 位 NormalFloat 存储、量化后的缩放信息和分页优化器,同时使用较高精度计算。它不是说每次乘法、每个激活和梯度都只有四位。前向计算时,按需把存储的基座权重反量化;梯度可以通过这些计算到达可训练因子,而基座本身保持固定。Dettmers 等人明确区分了存储类型与计算类型。
例 39.2:加入增量,不会自动消除量化误差。 另取标量 、输入 2,指定量化器把数值舍入到 [-1,1] 内最近的 0.25 的整数倍。这不是 NF4。存储近似值变为 1.00,基座输出从 变为 ,误差为 0.14。
再给两条路径都加同一个指定增量 0.05。未量化结果为 ,量化基座结果为 ,差仍为 0.14。在合适的数据和容量下,训练也许能学会补偿,但加上 LoRA 不会自动抹掉误差。合并后若再量化,还会发生一次舍入,需要另做比较。
量化降低基座的存储精度,LoRA 限制可训练增量。二者都没有规定要做 SFT 还是继续预训练。一个均匀标量例子不能证明 QLoRA 的准确率、资源用量或某块 GPU 是否适用。本次实际完成的是本地标量与矩阵练习,整模型 PEFT/QLoRA 训练仍属选做,未执行。
39.7 按原来的契约评测适配结果
Section titled “39.7 按原来的契约评测适配结果”比较全量更新与 LoRA 时,应从同一基座出发,使用相同训练数据、模板、目标掩码、数据划分和评分准则。明确目标模块、优化设置、训练 Token 预算和调参预算。仅学习率相同或步数相同,并不能保证公平,因为参数化方式和有效 Token 数可能不同。先用开发数据选配置,再以相同运行预算评测保留的测试集。
比较继续预训练与 SFT,则是在问另一个问题,因为数据与目标已经不同。应把这些差异说清楚,不能把每个变化都归功于参数高效。结果中应同时有未适配基线、期望收益,以及按语言和任务拆分的退化项。数据、基座、分词器、代码和适配器都要记录来源与许可;新适配器的许可证不会消除基座相关的义务。
本次真实的同契约适配,是第 38 章的运行侧比较,不是声称完成了 PEFT 实验。格式处理前后,选中版英文仍为 2/6 稳定语义通过,中文仍为 0/6,另一检查点两种语言仍为 0/6。小矩阵里的 LoRA 计算不能推翻这些测量。如果未来开展 SFT/LoRA,就要改善同样的历史、未知、状态和审批问题,保留原先正确的案例,再面对真正未使用过的验收题族。
配套英文实践 README 列出了选做真实 PEFT 时,在选择外部模型或训练软件之前要记录的证据。核心路径只用原创本地材料,不下载权重。对频繁变化的事实,例如下一版住宿限额,仍应先考虑可追查来源的更新路径,而不是默认改参数。
39.8 本部分检查点:究竟改变了什么
Section titled “39.8 本部分检查点:究竟改变了什么”这里分开五条轴:训练数据、训练目标、可训练参数、运行时输入或外部操作,以及运行时计算预算。
表 39.4:分开五条轴,避免给方法排一条虚假的强弱顺序。
| 改动 | 主要改变什么 | 所需证据 |
|---|---|---|
| SFT 示范 | 训练数据与回答目标 | 目标正确、泛化与旧能力保留 |
| RLHF 或 DPO | 来自偏好的训练信号 | 准则有效、参考处理正确、独立行为测试 |
| RLVR | 任务检查给出的奖励 | 核验器错误审查与新题结果 |
| 增加运行尝试或搜索 | 参数不变时的计算与选择 | 完整成本、候选多样性、选择质量和停止 |
| 提示、RAG、工具 | 输入或外部可得的信息与操作 | 送达、相关性、忠实使用及必要授权 |
| LoRA/QLoRA | 可训练参数机制;QLoRA 还改基座存储精度 | 维度、目标位置、资源统计与配对回归 |
现在可以对任一适配方案提出精确问题:它改变了证据、目标、更新方式,还是回答前做多少工作?多项可以一起改变,但报告应当逐项说明。下一章研究参数不变时,怎样把输入组织好。
39.9 本章小结
Section titled “39.9 本章小结”继续预训练与 SFT 描述数据和目标;全量更新、插入适配器与 LoRA 描述可训练参数;QLoRA 还量化了基座存储。低秩增量可以减少可训练数值,却没有把基座变成低秩,也没有消除全部训练成本。它的算术、量化影响和兼容性可以在本地检查,是否有用仍要回到原行为评测与旧能力保留证据。
39.10 习题
Section titled “39.10 习题”- 沿用例 39.1 的矩阵,把输入改成 。分别计算基座、增量与合并输出,并用两条路径核对。
- 对 6 × 4 矩阵,秩为二时完整矩阵和因子各有多少参数?秩为三时怎样?说明为什么“低秩”还不足以证明节省。
- 保持例 39.1 因子不变,取 、,使用原输入,计算新输出。为什么这不是模型更好的证据?
- 学生把“冻结 4 位基座、训练低秩因子,在领域文档上预测下一个 Token”统称为 QLoRA。补全数据与目标描述;再只把数据、目标换成期望助手回答。
- 适配器文件很小,也可以合并。在称它节省内存、兼容且有用之前,还要检查什么?
- 项目想同时用 RAG、RLVR 和 LoRA 修复错误的现行住宿限额。利用本部分检查点设计诊断与比较,使结果能说明哪项改动起了作用。
39.11 参考解答
Section titled “39.11 参考解答”- 基座输出为 。,所以增量为 ,相加得 。合并矩阵乘这个输入,相当于取第一列,结果相同。
- 完整矩阵有 个元素。秩为二时有 个,少四个;秩为三时有 30 个,超过 24。节省要满足因子数量的不等式,不能只看秩低于两个维度。
- 原增量翻倍:。这些指定坐标没有任务质量标签,也没有实测训练效果。
- 数据与目标是:在领域文本上继续做因果语言模型预训练;更新和存储机制是 QLoRA 式适配。改用示范和回答损失后,就变成使用同一更新、存储机制做 SFT。
- 在明确精度、批大小和序列长度后,统计基座、因子、优化器状态、梯度、激活和临时存储。核对精确基座/分词器版本及目标映射,按实际精度比较合并前后输出,审查许可,再运行不变的行为与保留能力评测。
- 先查现行来源是缺失,还是已提供却被忽略。把来源送达与回答训练分开测;在 RLVR 前明确可核验规则,并审查核验器。LoRA 只决定增量怎么训练。保留基线,分别声明各项改动,固定题目、准则和预算;组合方案的收益本身不能定位是哪一项带来的。
39.12 参考文献
Section titled “39.12 参考文献”- Gururangan 等,Don’t Stop Pretraining,2020,第 3—4 节。支持监督下游适配之前继续进行领域或任务语言建模,以及相关性对照。
- Houlsby 等,Parameter-Efficient Transfer Learning for NLP,2019,第 2—2.1 节。说明瓶颈适配器和原始配方额外训练的参数。
- Hu 等,LoRA,2021,第 4.1—4.2 节。支持冻结矩阵、低秩因子、初始化、缩放、目标位置及合并机制。
- Dettmers 等,QLoRA,2023,第 2—3 节。说明量化存储、较高精度计算与内存机制;不能由本章小例子推出普遍无损的结论。