跳到主要内容

参数高效微调 — 不动基座,插小件

这一章讲三件事: 为什么全量微调(把模型所有参数都拿来调)在今天的模型尺寸下 做不起;三条「省着调」的路线各自怎么省、省在哪;以及 LoRA 为什么能从 28 条变体里 长成事实标准——和它换不来的东西。 原书这一章收 56 篇(六大主题里最多),也是工程味最浓的一章:读完你就能对着开源工具里的 --lora_r 这类参数,知道自己拧的是什么。

1. 这一章讲什么

第 02 章的结论之一是「开放复刻」:普通团队也能有自己的模型。但真动手就会撞上账单: 主流开源模型动辄 70 亿、700 亿参数,全量微调意味着这些数全部参与更新—— 光是把这些数和训练状态装进内存,普通电脑就已经吃不消,更别说训练开销。

真正的硬件账在显卡这边:模型计算靠 GPU(显卡,专为成组算术设计的芯片)。

另一个词是显存(显卡上的高速临时存储)——训练时装模型、装中间状态,装不下就是装不下。

原书这章的结构:一节简介讲需求,中间三节各讲一条省法,最后一节收实践。 前三条「省法」正好对应中间三节——我们的拆解照此走,先给需求,再逐条路线, 每条路线都落在同一个问题上:到底动了哪些数。

2. 顶层全景:三条省法,一个共同姿势

全量微调: W 全部重训 ← 贵;能力上限也最高

├─ 省法① 插小件: 在层与层之间串进一个小模块,只训它( adapter 一族)
├─ 省法② 挑参数: 原参数不动,只放开一小撮( BitFit 一族)
└─ 省法③ 压增量: 原参数不动,给每个大矩阵配一个「低秩补丁」( LoRA 一族)

图说:三条路的共同姿势是「基座冻结(固定不动、不参与更新),只训一小撮新东西」;
差别只在那一小撮住在哪——新模块里、原参数里、还是补丁矩阵里。

本章主走查在省法③: 拿一个 4096×4096 的权重矩阵(模型里可调的数排成的大表; 4096 是常见开源 70 亿参数模型的层宽——补充(不在书里,来自通用知识)), 看低秩补丁怎么把「要训的数」压掉 99.6%。三条路线都要在走查上报出「动了多少个数」。

3. 为什么需要它:需求侧的三篇地基

原书「简介」一节收的八篇里,挑三篇当需求侧证据:

  • 两篇综述(高效大模型1、指令微调综述2):给出全景与术语表;
  • FLAN3 (第 02 章讲过它的指令多任务训练):证明「一份基座 + 各任务微调」 是真实需求——需求越多样,越不可能每个任务都全量训一份;
  • Self-Instruct4 (第 03 章末尾出现过):解决「微调数据从哪来」,自造指令数据。

需求的形状决定了技术路线: 大家要的不是「更好的一个模型」, 而是「同一个基座派生出一百个小版本」——版本之间的差别,最好小到可以像文件一样保存、 切换、分发。这个形状,三条省法都在往上面靠。

4. 核心原理(上):参数附加一族——新模块里

4.1 两条更早的路

  • Adapter(2019)5:在 Transformer(第 02 章讲过的注意力机器)的层与层之间 串进一个很小的瓶颈模块(先压到几十维、再撑回来),只训这些模块。 代价:推理(用模型出结果的过程)时多了一截串行计算,答一句要等得更久;
  • Prefix-Tuning / Prompt Tuning(2021)67:什么都不插,在输入前面 拼一段「虚拟提示」——一段可训练的数,模型拿它当前文用。更省, 但挤占模型能装下的真实输入长度,而且偏小规模的模型上效果不稳(原论文自己承认)。

4.2 走查报数(① 号线)

拿一个 70 亿参数的基座(演示口径):每个 Adapter 模块约层宽×64×2 个数, 全模型几十层加起来,可训练的参数个数在 2000 万级(演示数;原论文在 BERT 时代报告的是 「每任务 3.6% 参数」,量级感受以此为准)。基座 70 亿个数一个不动。

4.3 这一族的收尾

列表还收了

^8
(多个任务的 Adapter 学着融合,不必每任务单独存一份)、 把模块连接砍到只剩少数的稀疏(只留少数连线)变体8、代理微调9 (连小模块都不训,拿小模型上算出的「修正方向」直接叠加到大模型的输出概率上)。 它们都在回答同一个问题:那一小撮新参数还能不能再少、再通用。

5. 核心原理(中):参数选择一族——原参数里挑一小撮

5.1 思想来源:彩票假设

这一节开头收的两篇其实不是微调方法,是思想来源与试验场:

  • 彩票假设(2019)10:一个训好的网络里,本来就藏着一个小得多的子网络 (「中奖彩票」),只训它效果不差。这是「挑参数」这条路线的合法性证明: 如果大部分参数本来就没在干活,那全量微调就是在付全款买半张票;
  • GLUE(2019)11:一份语言理解任务考卷,PEFT 论文用它当统一试验场—— 后面每篇方法论文的成绩单都是这份考卷。

5.2 走查报数(② 号线):BitFit

BitFit(2022)12把「挑参数」推到极端:只训每层的偏置(bias:每个计算 单元自带的一个平移小数,总量约占全模型 0.1% 量级——演示口径)。 70 亿参数的基座,只放开 几百万个数。成绩?多数任务逼近全量微调。

这个结果的震撼在于它反过来回答了「微调到底在调什么」:大部分收益不来自重学知识, 而来自把现有能力的输出整体挪一挪——这正是对齐(朝人的偏好方向校准)最朴素的形态。

(注:这一段的「震撼」是我们替读者下的判语;论文本身只报告了成绩。)

同节其余各篇在这个方向上继续精修

^14
按梯度信号动态挑子网络、 把一部分层冻结(固定不训)的层实验13、以及一篇分析文14回答「为什么这么少 的参数就够」。

6. 核心原理(下):低秩一族——LoRA 与它的 28 条变体

6.1 走查主步:LoRA 的账(③ 号线)

LoRA(2021 年投稿、2022 年发表)15的出发点是一条线性代数观察: 微调造成的参数变化,矩阵形式往往「低秩」——所谓低秩 (一个大表的改动,可以近似成两个细长条矩阵的乘积)。 于是干脆不猜哪些参数重要,而是给每个大权重矩阵配一对小矩阵:

走查:一层权重 W,4096×4096 = 16,777,216 个数
全量微调:动 16,777,216 个
LoRA(秩 r=8):新增 A(8×4096) 与 B(4096×8) 两个细长条
可训参数 = 8×4096 + 4096×8 = 65,536 个 = 原来的 0.39%(256 倍压缩)
推理时:W 的输出加上 (A×B) 的输出,两路并联相加
初始化:B 全零 → 训练起点,补丁恰好等于「什么都没改」,不惊扰基座

图说:4096 是演示口径的层宽(与主流 7B 开源模型一致);乘法结果是精确的。

这 256 倍压缩换来三件实用的事。 其一,显存账立刻可算:70 亿参数基座全量微调, 仅权重就要约 14 GB 显存(每个数占 2 字节——8 个最小存储位——演示口径), 加上训练状态还要翻数倍;而 LoRA 只训一千多万个新数。

其二,补丁可以像文件一样保存切换:基座一份,每任务一个几十 MB 的小文件。

其三,B 初始化为零,保证了训练起点就是原模型本身。

我们书架里有一份 PEFT 工具库的源码拆解,开头一章正是这三行数学的代码落地, 含「B 为什么必须初始化为零」(补充(不在书里,依据我们的 frontier 书架):依据: shelf=ai-frontier-reference/peft#01-lora-math.md 事实=该拆解把 LoRA 数学归为三行: ΔW=B·A、h=Wx+(α/r)·BAx、B 置零,并注明其余全是工程)。

6.2 三个轴看 28 条变体

原书低秩一节收 28 条,是全列表最长的一节。与其逐条报菜名,不如按三个轴定位:

  • 秩给多少(固定秩 8 是拍脑袋吗):AdaLoRA 按重要性动态分配秩预算16;DyLoRA 训一次、多档秩可用17

  • 改哪段奇异值(补丁该修大骨架还是修细节):PiSSA 改主奇异值(大骨架)18;MiLoRA 改次要成分(细节)19;DoRA 把权重拆成「方向 + 幅度」分开改20

  • 往哪扩(不只是省训练):GaLore 省的是训练里帮每个参数算「往哪挪、挪多少」的那份辅助状态——它占的内存常常比参数本身还大21

  • 再往服务端扩:S-LoRA 让一台服务器(对外提供计算的那台机器)同时挂上千个 LoRA 供不同用户22;LoraHub 把现成补丁自动组合出新任务23

(奇异值:把一个大表按「重要性」分解出的主成分,第一个最重要,依次递减—— 通用知识,知道「有大小之分」即可。)

6.3 一条冷水:这条赛道的边界

28 条里混着一条唱反调的:「LoRA 学得少,也忘得少」(2024)24—— 和全量微调相比,LoRA 在新任务上学到的少一些,在原任务上忘掉的也少一些 (「忘掉已会的事」有个名字:灾难性遗忘——学新任务时把旧能力冲掉)。

这篇的价值是把取舍摆上台面:低秩补丁不是一个「免费又无损」的选项——它买的是 隔离与便宜,卖的是对基座的改动深度。

要让模型学到真正新的东西时,全量微调仍有一席之地。

6.4 走查收口:三条省法并排报数

基座:70 亿参数(演示口径)
① Adapter 约 2000 万个新数(串在层间,推理变慢一点)
② BitFit 约 700 万个原参数(占 0.1%,不动基座本体)
③ LoRA r=8 每个被改矩阵 65,536 个新数 × 每层约 7 个线性层 × 32 层
≈ 1470 万个新数(层数与投影数为演示口径;并联,推理几乎不慢)

图说:三行都是演示口径的数量级(③ 的乘法自洽:65,536×7×32≈1470 万);
不变量是「相对 70 亿都是零头」。

7. 实践与应用:这条赛道的生态位

收尾两篇圈出用武之地:金融领域的数据查询问答25 (模型无关地套小补丁); TabLLM26 (拿极少数带答案的例子给表格数据做分类——就是少样本那招)。

共同点:垂直领域、数据量中等、预算有限——正是「基座 + 低秩补丁」的主场。

第 02 章的 QLoRA 在这条线上的角色也在此兑现:把基座先量化(把每个数压成 更短的存放格式,如 4 个存储位存一个数)再挂补丁,消费级显卡就能微调 650 亿参数的模型。

8. 编者的判断与证据

  • 低秩一节 28 条,占本章近半:版面即判断——LoRA 已是这一章的事实主角;
  • 「参数选择」一节收彩票假设与 GLUE 而不收更多纯方法:编者把这一族当作 「思想来源 + 试验场」来陈列,而非与 adapter/LoRA 平起平坐的第三极;
  • 两篇 2024 年的冷水(学得少忘得少、以及 PEFT 有效性分析14)被收进正册: 说明截止 2024 年中,编者认为这条赛道的边界已经值得写进地图。

9. 边界与局限

局限说明
变体条目有重复与年份打架DoRA 出现三条(两条同篇、标年不同,text/01-full.txt:610(搜「Weight-Decomposed」)、:625(搜「Dynamic Rank」)、:676(搜「Dy-namic」));Chain of LoRA 收了两遍(text/01-full.txt:652(搜「Residual Learning」)、:664(搜「Residual Learning」))
与 RLHF 的边界没划让模型合人类口味的那族方法(DPO 一线)不在这章(它们在通用工具库里),读者需自行拼图
收的全是「调参后」基座本身怎么训练不在本章;数据怎么洗、多机多卡、硬件账怎么省——这些工程文献整体缺席
时效2024 年后出现的长上下文场景下的 LoRA 变体、多模态 LoRA 不在列表

10. 可带走的

  1. 全量微调贵在「所有参数都要参与更新」;PEFT 的共同姿势是基座冻结、只训一小撮;
  2. 三条省法记三个数(演示口径):Adapter 千万级、BitFit 百万级、LoRA 每层 6.5 万个;
  3. BitFit 的启示:微调的大头收益不是重学知识,是把现有输出「挪对地方」;
  4. LoRA = 给每个大矩阵配两个细长条(B·A),B 初始化为零,起点即原模型;
  5. 低秩补丁是文件:基座一份,任务补丁几十 MB 一个,可保存、切换、分发;
  6. 28 条变体按「秩给多少 / 改哪段 / 往哪扩」三个轴定位,不必逐条记;
  7. 冷水记住一条:LoRA 学得少也忘得少——买隔离与便宜,卖改动深度;
  8. 要「学真正的新东西」考虑全量;要「多任务小版本」用 LoRA;要「最便宜试水」用 BitFit;
  9. QLoRA = 先量化基座再挂 LoRA,消费级显卡微调 65B 的钥匙。

11. 原文地图

主题原书节原文位置
需求侧综述参数高效微调简介text/01-full.txt:505(搜「Efficient Large Language Models」) · text/01-full.txt:511(搜「Instruction Tuning for Large Language Models」)
附加一族参数附加方法text/01-full.txt:539(搜「Parameter-Efficient Transfer Learning」) · text/01-full.txt:536(搜「Prefix-Tuning」) · text/01-full.txt:533(搜「The Power of Scale」) · text/01-full.txt:551(搜「Tuning Language Models by Proxy」)
选择一族参数选择方法text/01-full.txt:585(搜「Lottery Ticket」) · text/01-full.txt:582(搜「GLUE」) · text/01-full.txt:561(搜「BitFit」) · text/01-full.txt:573(搜「Raise a Child」)
LoRA 与变体低秩适配方法text/01-full.txt:595(搜「Low-Rank Adaptation」) · text/01-full.txt:598(搜「Unified View」) · text/01-full.txt:667(搜「Adaptive Budget」) · text/01-full.txt:634(搜「Pissa」) · text/01-full.txt:610(搜「Weight-Decomposed」) · text/01-full.txt:616(搜「GaLore」) · text/01-full.txt:619(搜「S-LoRA」) · text/01-full.txt:670(搜「LoraHub」)
冷水低秩适配方法text/01-full.txt:613(搜「Learns Less and Forgets」) · text/01-full.txt:567(搜「Effectiveness of Parameter-Efficient」)
实践实践与应用text/01-full.txt:683(搜「FinSQL」) · text/01-full.txt:686(搜「TabLLM」)

Footnotes

  1. 出处:「参数高效微调简介」第 505 段(text/01-full.txt:505,搜「Efficient Large Language Models」)。

  2. 出处:「参数高效微调简介」第 511 段(text/01-full.txt:511,搜「Instruction Tuning for Large Language Models」)。

  3. 出处:「参数高效微调简介」第 514 段(text/01-full.txt:514,搜「zero-shot learners」)。即 FLAN,2021 年投稿。

  4. 出处:「参数高效微调简介」第 523 段(text/01-full.txt:523,搜「Self-Instruct」)。

  5. 出处:「参数附加方法」第 539 段(text/01-full.txt:539,搜「Parameter-Efficient Transfer Learning」)。Houlsby 等人,2019。「每任务 3.6% 参数」出自原论文摘要,列列表未标,故按通用知识补注。

  6. 出处:「参数附加方法」第 536 段(text/01-full.txt:536,搜「Prefix-Tuning」)。

  7. 出处:「参数附加方法」第 533 段(text/01-full.txt:533,搜「The Power of Scale」)。Prompt Tuning;「对较大规模模型才追平全量微调」是原论文结论。

  8. 出处:「参数附加方法」第 545 段(text/01-full.txt:545,搜「SparseAdapter」)。

  9. 出处:「参数附加方法」第 551 段(text/01-full.txt:551,搜「Tuning Language Models by Proxy」)。

  10. 出处:「参数选择方法」第 585 段(text/01-full.txt:585,搜「Lottery Ticket」)。Frankle 与 Carbin,2019。

  11. 出处:「参数选择方法」第 582 段(text/01-full.txt:582,搜「GLUE」)。

  12. 出处:「参数选择方法」第 561 段(text/01-full.txt:561,搜「BitFit」)。

  13. 出处:「参数选择方法」第 564 段(text/01-full.txt:564,搜「Freezing Layers」)。

  14. 出处:「参数选择方法」第 567 段(text/01-full.txt:567,搜「Effectiveness of Parameter-Efficient」)。 2

  15. 出处:「低秩适配方法」第 595 段(text/01-full.txt:595,搜「Low-Rank Adaptation」)。Hu 等人;条目标 2022(ICLR 发表年)。

  16. 出处:「低秩适配方法」第 667 段(text/01-full.txt:667,搜「Adaptive Budget」)。

  17. 出处:「低秩适配方法」第 673 段(text/01-full.txt:673,搜「search-free low-rank」)。

  18. 出处:「低秩适配方法」第 634 段(text/01-full.txt:634,搜「Pissa」)。

  19. 出处:「低秩适配方法」第 637 段(text/01-full.txt:637,搜「Minor Singular Components」)。

  20. 出处:「低秩适配方法」第 610 段(text/01-full.txt:610,搜「Weight-Decomposed」)。

  21. 出处:「低秩适配方法」第 616 段(text/01-full.txt:616,搜「GaLore」)。

  22. 出处:「低秩适配方法」第 619 段(text/01-full.txt:619,搜「S-LoRA」)。我们书架的推理引擎拆解里有多 LoRA 服务的对位内容(补充(不在书里,依据我们的 frontier 书架):依据: shelf=ai-frontier-reference/vllm#02-continuous-batching-scheduler.md 事实=vLLM 的调度器支持一个基座并行服务多个 LoRA 适配器)。

  23. 出处:「低秩适配方法」第 670 段(text/01-full.txt:670,搜「LoraHub」)。

  24. 出处:「低秩适配方法」第 613 段(text/01-full.txt:613,搜「Learns Less and Forgets」)。Biderman 等人,2024。

  25. 出处:「实践与应用」第 683 段(text/01-full.txt:683,搜「FinSQL」)。

  26. 出处:「实践与应用」第 686 段(text/01-full.txt:686,搜「TabLLM」)。