跳到主要内容

05 · 省着微调:四条「不动基座」的路

1. 这一章讲什么

第 3 章的微调是全量微调:模型 1.1 亿个参数全部重新训练。模型越大这条路越走不动——卡装不下、训不起、每个任务还得各存一份完整副本。原书第 5 章给出四条「不动基座」的路线:Adapter Tuning(插小模块)、LoRA(拆低秩矩阵)、Prompt Tuning 与 P-Tuning(只训提示)1,业界统称参数高效微调。

读完这一章你会有一张选型表:四条路线各动哪里、省多少、什么时候选哪条。

2. 顶层全景:动的都是「零头」

全量微调: 基座 110M 参数 ──全部解冻──► 全部更新(贵)
四条省钱路线(基座全部冻结,只训新增部分):
Adapter: 每层插一个瓶颈小模块 ──► 训模块(约百万级)
LoRA: 权重旁边挂一对小矩阵 ──► 训小矩阵(约十万~百万级)
Prompt Tuning:输入前面拼一段可训练提示向量 ──► 训提示(几万级)
P-Tuning: 提示向量参数化、更灵活 ──► 训提示(几万级)

图说:基座像一台不拆修的主机,四条路线是外接的不同「外设」。

3. 核心原理

3.1 Adapter:每层插一个「小转接头」

Adapter 的做法是在 Transformer 每层后面插入一个小模块:先把特征压缩到低维(down_project),再扩展回原维度(up_project),两头夹着一个非线性(故意拐弯、不是直来直去)的变换;模块的输出与原特征相加(残差),所以最坏情况等于「什么都没做」,不伤原模型2。训练时只更新 Adapter 模块的参数,基座全部冻结3

主走查:算一笔参数账,看「省」省在哪。(以 BERT-base 规模估算,数字为演示估算,不是书里的实测值。)

基座:BERT-base ≈ 110M(1.1 亿)参数
一个 Adapter(768 → 64 → 768 瓶颈):
down: 768×64 = 49,152 up: 64×768 = 49,152 合计 ≈ 98k
12 层各插一个:98k × 12 ≈ 1.18M
可训练参数占比:1.18M / 110M ≈ 1%
→ 训练要更新的量、每个任务要存的量,都从 1.1 亿缩到约 1%

走查说明:瓶颈维度 64 就是那个「省」的旋钮——压得越狠参数越少,表达能力也越受限;这笔账的算式对任何瓶颈宽度都适用。

3.2 LoRA:把「改动量」拆成两个小矩阵

LoRA 换了个更妙的切入点:不是插模块,而是问——微调其实只需要算出权重的改动量 ΔW,那能不能不直接算这个大矩阵,而是拆成两个小矩阵的乘积?这就是低秩分解:原书说 LoRA「通过低秩矩阵分解技术,仅对模型权重的一个低秩表示进行微调」,实现上是 down_proj(先把数压窄——这就是降维——)和 up_proj(再撑回原宽度)两个线性(直来直去)变换4

书的比喻是拼图:不重新拼整幅图,只调整几个拼图块;具体机制是「把大矩阵拆成两个小矩阵,只微调这两个小矩阵中的参数」5。因为原始参数矩阵一个字都没动,原模型的表现被完整保留,换任务时还能多个任务共用一个基座、各挂各的小矩阵6

补充(不在书里,依据我们的 frontier 书架): LoRA 的标准形态是 ΔW = B·A(两个小矩阵相乘冒充大矩阵的增量),前向为 h = Wx + (α/r)·BAx;B 初始化成零,训练第 0 步行为精确等于原模型。原书的演示把低秩模块的输出「加在特征上」,方向与主流「加在注意力权重上」一致但挂载位置更粗糙——书里 5.5 思考题(2)其实追问了「如何嵌入注意力层」。 依据: shelf=ai-frontier-reference/peft#01-lora-math.md 事实=PEFT 拆解写明「ΔW = B·A、h = Wx + (α/r)·BAx、B 初始化为零(训练起点恰好是原模型)」。

3.3 Prompt Tuning 与 P-Tuning:连模型都不碰,只调「开场白」

更省的路:模型一个参数都不动,只在输入序列前面拼一段可训练的提示向量,训练只更新这段向量。Prompt Tuning 原书的定义是「模型的权重保持不变,微调仅涉及对输入提示进行优化」;实现上就是用 nn.Parameter 建一段提示嵌入,前向时拼在输入嵌入前面,注意力掩码同步加长7

P-Tuning 与它的差别在灵活度:不直接拼固定长度的文本式提示,而是「通过嵌入参数化的提示序列」,让模型自己学出提示该长什么样8。原书还演示了两招组合:先 Prompt Tuning 加提示、再 P-Tuning 提炼提示,「双重微调」后对给定文本做情感判断9;又在约 500 字的长文本上验证了同一套组合10

3.4 选型表:四条路怎么挑

路线动哪里训练量级特点
Adapter每层后插瓶颈模块约 1%(见主走查)改结构但带残差保底;推理时多一点计算
LoRA权重旁挂低秩对秩 r 越大越多不改模型结构,基座可多任务共用11
Prompt Tuning输入前缀提示极小最省,但对模型规模与任务难度敏感
P-Tuning参数化提示序列极小同上,提示更灵活

四条路线的演示输出在原书里几乎一样(损失 0.6932→0.47 上下、准确率到 1.0)——这是同一套玩具数据跑出来的教学演示,不能当成「四法效果相当」的证据;真实差距要在真实任务上测。

4. 作者的判断与证据

  • 有演示数据的: Adapter/LoRA/Prompt Tuning/P-Tuning 各自的训练曲线(0.6932→0.4715 一线);组合微调对两条示例文本判 Positive;500 字长文本预测输出。
  • 是作者判断/比喻的: 「插件式微调」「大楼装修房间不拆整栋」「给模型装快捷键」全是比喻;「组合微调展现高度适应性」是定性结论,无对照实验。
  • 书里没给但该有的: 各方法可训练参数的具体占比——书里反复说「少量」「高效」,没有一个数;本拆解的主走查把这笔账算了出来(估算口径已当场标明)。

5. 边界与局限

  • 原书没讲 QLoRA(把基座量化到 4 位再挂 LoRA,单卡微调更大模型),也没讲 LoRA 秩 r 与 α 的调法——只说要挑合适的秩、在参数量(有多少个可调数)和效果之间取平衡11,没给怎么选。
  • 四种方法都只在文本分类上演示;生成任务(给模型续写时这些技术怎么用)没有覆盖。
  • 没有方法间的横向对比实验(同一任务谁更好),「汇总表」(表 5-1)只是特点罗列。
  • 演示把基座冻结写死;实践中还有「解冻顶部几层」的中间路线——那正是原书 12.2 的层级冻结,放到 12 章。

6. 可带走的

  1. 微调的成本大头不是训练时间,是「每个任务一份完整副本」;PEFT 四法都把副本缩成兆级零头。
  2. Adapter=瓶颈插层+残差保底;参数账 = 768×瓶颈×2×层数,瓶颈是唯一旋钮。
  3. LoRA 的洞察:微调只需要 ΔW,而 ΔW 可以拆成两个小矩阵相乘;基座分毫不动。
  4. Prompt Tuning/P-Tuning 连结构都不改,只训一段前缀提示;最省,上限也最低。
  5. 书里四组演示输出雷同,是教学数据的巧合;选型要靠自己的任务实测。
  6. 出门撞见 lora_alphar 这些参数名,对应的就是本章的 α/r 缩放与秩。
  7. 冻结谁、训谁,是这一章所有方法的共同第一行代码——先想清楚再动手。

7. 原文地图

主题原书章原文位置
章导语:三条路线概览第5章text/30-ch05.txt:24(搜「Adapter Tuning」)
Adapter 瓶颈结构与残差5.1text/31-ch05-01-5-1.txt:24(搜「少量可训练参数的Adapter模块」) · text/31-ch05-01-5-1.txt:39(搜「down_project和up_project」) · text/31-ch05-01-5-1.txt:88(搜「保留原貌」)
只更新 Adapter 参数5.1text/31-ch05-01-5-1.txt:48(搜「仅更新Adapter模块的参数」)
LoRA 低秩分解5.2text/32-ch05-02-5-2.txt:24(搜「低秩矩阵分解」) · text/32-ch05-02-5-2.txt:42(搜「down_proj和up_proj」) · text/32-ch05-02-5-2.txt:82(搜「两个小矩阵」) · text/32-ch05-02-5-2.txt:85(搜「原始的参数矩阵没有直接被改动」)
Prompt Tuning 定义与实现5.3text/33-ch05-03-5-3.txt:38(搜「模型的权重保持不变」) · text/33-ch05-03-5-3.txt:56(搜「nn.Parameter初始化」)
P-Tuning 参数化提示5.3text/33-ch05-03-5-3.txt:98(搜「嵌入参数化」)
组合微调与长文本5.3text/33-ch05-03-5-3.txt:153(搜「组合微调」) · text/33-ch05-03-5-3.txt:205(搜「500字」)
秩的取舍5.5 思考题text/35-ch05-05-5-5.txt:54(搜「平衡参数量和性能」)

Footnotes

  1. 出处:「第5章 高阶微调策略:Adapter Tuning与P-Tuning」第 24 段(text/30-ch05.txt:24,搜「Adapter Tuning」)。

  2. 出处:「5.1 Adapter Tuning的实现」第 39 与 88 段(text/31-ch05-01-5-1.txt:39,搜「down_project和up_project」;text/31-ch05-01-5-1.txt:88,搜「保留原貌」)。

  3. 出处:「5.1 Adapter Tuning的实现」第 48 段(text/31-ch05-01-5-1.txt:48,搜「仅更新Adapter模块的参数」)。

  4. 出处:「5.2 LoRA Tuning实现」第 24 与 42 段(text/32-ch05-02-5-2.txt:24,搜「低秩矩阵分解」;text/32-ch05-02-5-2.txt:42,搜「down_proj和up_proj」)。

  5. 出处:「5.2 LoRA Tuning实现」第 79 与 82 段(text/32-ch05-02-5-2.txt:79,搜「拼图」;text/32-ch05-02-5-2.txt:82,搜「两个小矩阵」)。

  6. 出处:「5.2 LoRA Tuning实现」第 85 段(text/32-ch05-02-5-2.txt:85,搜「原始的参数矩阵没有直接被改动」)。

  7. 出处:「5.3 Prompt Tuning与P-Tuning的应用」第 38 与 57 段(text/33-ch05-03-5-3.txt:38,搜「模型的权重保持不变」;text/33-ch05-03-5-3.txt:56,搜「nn.Parameter初始化」)。

  8. 出处:「5.3 Prompt Tuning与P-Tuning的应用」第 98 段(text/33-ch05-03-5-3.txt:98,搜「嵌入参数化」)。

  9. 出处:「5.3 Prompt Tuning与P-Tuning的应用」第 153 段(text/33-ch05-03-5-3.txt:153,搜「组合微调」)。

  10. 出处:「5.3 Prompt Tuning与P-Tuning的应用」第 205 段(text/33-ch05-03-5-3.txt:205,搜「500字」)。

  11. 出处:「5.5 思考题」第 54 段(text/35-ch05-05-5-5.txt:54,搜「平衡参数量和性能」)。 补充(不在书里,依据我们的 frontier 书架,查阅于 2026-08-27):α/r 缩放的具体机制见 peft 拆解。 依据: shelf=ai-frontier-reference/peft#01-lora-math.md 事实=PEFT 拆解写明「缩放因子 α/r —— α 是常数超参 lora_alpha,把缩放绑在 r 上」。 2