跳到主要内容

不动全量参数 — 附加与选择

这一章讲三件事: 为什么微调躲不开、又为什么全量微调做不起;「把新参数加在输入/模型/输出」三种附加法各自的走法;以及不添加任何参数、纯靠「挑参数」的选择法。 链条位置:第 06 章说了 ICL 便宜但性能有差距,这一章开始补差距——PEFT 是「预算内调教」的第一条正路,下一章的 LoRA 是它的低秩(只用很少的一组数来近似大改动)特例,也是今天的事实标准。

1. 顶层全景

需求:垂直领域(医学/金融/法学)知识不足 → 要适配
├─ 上下文学习:不训练,但性能有差距、示例多了推理贵
├─ 全量微调:有效,但 LLaMA2-7B 需近 60GB 内存,RTX4090(24GB)装不下
└─ PEFT:冻结原模型,只动一小部分参数
├─ 附加:输入(软提示)/ 模型(Adapter)/ 输出(Proxy) ← 本章第 3 节
├─ 选择:BitFit(挑偏置)/ Child-tuning(挑子网络) ← 本章第 4 节
└─ 低秩:LoRA 家族 ← 第 10 章
图说:三条路的共同点=「大部分参数不动」;差别在动的那一小部分从哪来。

2. 为什么躲不开微调

书把两条现成路线的缺陷摆在一起:上下文学习的性能与微调存在差距,且 Prompt 设计费人力、不同 Prompt 成绩波动大,推理代价还随示例数上涨1;指令微调有效,但算不起——书给出硬数字:LLaMA2-7B 直接全量微调需要近 60GB 内存,消费级旗舰 RTX4090 只有 24GB2。指令数据本身也有两条来路:拿模板把带标签数据集转成指令格式(数据集成,Flan/P3 这么干),或者手写少量种子让 GPT-3.5/4 扩展(Self-Instruct 一路,见第 08 章)3

PEFT 的账要算总账,书的对照表(A100 80GB 环境)最有说服力:12B 的 mt0-xxl 全量微调直接显存溢出,换 LoRA 只要 56GB;7B 的 bloomz-7b1 全量溢出,LoRA 只要 32GB;3B 的 T0 从 47GB 降到 14GB4OOM 变可行,这就是 PEFT 的全部意义。

3. 附加法:三种加法

3.1 加在输入:Prompt-tuning 与软提示(一段可以学习的连续数,不是真文字)

把一段**可微分的连续张量(软提示)**拼在输入嵌入前面,训练时只更新它。书的走查:输入 n 个 token 变成 n×d 的嵌入矩阵,软提示是 m×d(m 是软提示长度),拼接后一起进 Transformer,反向传播只动软提示那一块5

它的出生很有意思:原动机不是省参数,是自动找「咒语」——人工写的离散提示不可微(没法一点点挪着找最优),找不到最优措辞;让梯度自己找,就有了软提示(区别于人工的「硬提示」)6。实效:软提示长度 1 到 200,通常 20 以上就有性能保证;用词表里的真词或分类任务的类名做初始化,比随机初始化好7。参数账惊人:T5-XXL 本体 11B 参数,一个任务的软提示只有 20480 个(按长度 5 算);同一个冻结(固定不动)的底座可以挂无数任务。

还能混着批(一次同时处理多种任务)一起推理8

3.2 加在模型:Prefix-tuning 与 Adapter

Prefix-tuning 把软提示从「只加在输入」扩展为「加进每一层注意力的 K/V 前面」——可学习的 Pk、Pv 前缀向量插进所有注意力模块,可学习参数量大增。但它直接训练不稳定、难收敛(迟迟稳定不到好结果),实操要先用一个 MLP 做重参数化,训完把 MLP 丢弃、只留前缀9

Adapter-tuning 干脆插入新的小网络:每个适配器(插进模型的小插件网络)是瓶颈结构——下投影矩阵把 d 维压到 r 维(r 远小于 d),过一层非线性,再由上投影矩阵撑回 d 维,外面套残差连接;插在每层多头注意力(同时从多个角度打分的注意力)和 FFN 之后。每层新增参数约 2dr+d+r,r 一小参数就省10

AdapterFusion 解决「多任务知识怎么合」:两阶段——先给每个任务独立训练适配器(知识提取),再加一个融合模块(知识组合):全连接层输出当 query,各适配器输出当 key 和 value,算注意力决定「这个任务该听哪个适配器的」;融合时语言模型和适配器全部冻结,只训融合模块11

3.3 加在输出:Proxy-tuning,黑盒也能调

前两种都要碰模型内部;Proxy-tuning 只碰输出(API——程序调用它的入口——这一层)。做法:拿一个小模型微调出「专家」,同时保留它的未微调版「反专家」,在每步解码时把两者的输出分数差加到目标大模型的分数上(s̃ = s_M + s_{M+} − s_{M−}),再归一化采样12。走查一下逻辑:微调让专家学会「往偏好方向偏」,反专家知道「原来的偏法」,两者之差就是「这次微调教了什么」——把这个差量搬运到大模型上,等于把小模型学到的教训转授给大模型。它只要输出分布、不要权重,对黑盒模型同样适用(比如只有 API 的模型)13

3.4 三种加法对照

书对三类的总结:加在输入的对模型结构改动最小、最灵活;加在模型的保留原参数、泛化好;加在输出的能用小代价驱动更大的黑盒模型,应用前景最实际14

4. 选择法:不加参数,挑参数

与附加法相反,选择法不引入任何新参数,推理阶段零额外成本;关键在「挑哪些旧参数」。分两派15:

  • 按规则挑(人的经验):代表是 BitFit——只微调每层的偏置(加在加法里的那个固定常数)项和分类头。

    偏置项只占全部参数的约 0.08%–0.09%,却能在 GLUE 基准上与全量微调相媲美,部分任务更好,而且能承受更大的学习率(每次调参迈的步子大小)、训练更稳。书也如实标注边界:它只在 BERT/RoBERTa 级别的小模型上验证过,大模型上表现未知16。同类思路还有「只微调最后四分之一层,拿到全量 90% 性能」等17

  • 按学习挑(算法自己找):代表是 Child-tuning——用一个 0-1 掩码矩阵罩住参数,每轮只更新掩码内的子网络。两种变体:Child-tuningF 任务无关,从伯努利分布抽掩码,顺带起正则作用防过拟合;Child-tuningD 任务驱动,用费舍尔信息(参数对该任务对数——把好坏分数缩到好比较的尺度——的影响度)给参数排序,取最重要的前 pD 比例组成子网络。代价是掩码生成本身有计算开销,FIM 的计算尤其耗时18

书对选择法的总评:省得干净(推理零开销),但要回答「挑哪些、挑多少」这个优化问题本身,挑得不好就两头空19

5. 作者的判断与证据

  • 给了证据的:60GB vs 24GB 的算不起;表 4.1 三个模型的 OOM/显存对照(数据取自 HuggingFace PEFT 仓库);T5-XXL 11B→20480 参数;BitFit 0.08% 与 GLUE 结果;RoBERTa 最后四分之一层拿 90%。

  • 标注了边界的:BitFit 大模型未验证——书自己写了「尚且未知」,这种坦白值得照抄进读者心智。

  • 书的组织判断:把 Proxy-tuning 归入 PEFT 是本书的分类学选择(它严格说不动参数而是动输出);好处是把「黑盒适配」收进同一张地图。

6. 边界与局限

  • 本章方法多为 BERT-to-GPT 过渡期的工作;Adapter 系在今天的开源社区活跃度远低于 LoRA(下一章讲原因:LoRA 可合并、零推理延迟)。

  • 书未讨论附加法的推理开销问题:Adapter 增加串行小层,软提示占用上下文窗口——这两笔账书里缺席。

  • Child-tuning 的 FIM 计算在大模型上的成本书承认耗时,但没有给量化对比。

  • 「性能与全量微调相当」的结论多来自分类/小规模任务;生成任务与指令跟随上的差距书未展开。

7. 可带走的

  1. 全量微调的门槛是显存:7B 模型 60GB,消费卡装不下——PEFT 的存在理由。
  2. PEFT 三路:附加(加新参数)、选择(挑旧参数)、低秩(近似更新)。
  3. 软提示=可微的「自动咒语」;11B 模型一个任务只挂 2 万参数,可多任务共存。
  4. Prefix-tuning 训不稳就上 MLP 重参数化,训完丢 MLP。
  5. Adapter=瓶颈(压到 r 维再撑回)+残差;AdapterFusion 用注意力融合多任务适配器。
  6. Proxy-tuning:专家减反专家=微调教了什么;把差量加到大模型输出上,黑盒可用。
  7. BitFit 只调 0.08% 的偏置就能媲美全量(小模型上);大模型未知。
  8. Child-tuning 用费舍尔信息挑最重要的参数子网络;选择法推理零开销,挑法本身是成本。

8. 原文地图

主题原书章原文位置
ICL 缺陷4.1.1 下游任务适配text/13-ch04.txt:83(搜「存在差距」)
指令数据两条来路4.1.1 下游任务适配text/13-ch04.txt:101(搜「数据集成」) · text/13-ch04.txt:109(搜「Self-Instruct」)
60GB 与 RTX40904.1.1 下游任务适配text/13-ch04.txt:132(搜「60GB」) · text/13-ch04.txt:132(搜「RTX4090」)
PEFT 三分类4.1.2 参数高效微调text/13-ch04.txt:145(搜「参数附加方法」)
表 4.1 显存对照4.1.3 参数高效微调的优势text/13-ch04.txt:215(搜「47.14GB」)
软提示机制4.2.1 加在输入text/13-ch04.txt:255(搜「软提示」) · text/13-ch04.txt:265(搜「软提示长度」)
咒语与初始化4.2.1 加在输入text/13-ch04.txt:296(搜「咒语」) · text/13-ch04.txt:273(搜「1 到 200」)
20480 参数4.2.1 加在输入text/13-ch04.txt:306(搜「20480」) · text/13-ch04.txt:319(搜「10B 参数量」)
Prefix-tuning 与重参数化4.2.2 加在模型text/13-ch04.txt:355(搜「不稳定」) · text/13-ch04.txt:359(搜「重参数化」)
Adapter 瓶颈4.2.2 加在模型text/13-ch04.txt:393(搜「瓶颈」) · text/13-ch04.txt:422(搜「2dr」)
AdapterFusion 两阶段4.2.2 加在模型text/13-ch04.txt:444(搜「知识提取」) · text/13-ch04.txt:497(搜「当作 Query」)
Proxy-tuning4.2.3 加在输出text/13-ch04.txt:532(搜「反专家模型」) · text/13-ch04.txt:553(搜「LLaMA-7B」) · text/13-ch04.txt:561(搜「黑盒模型同样适用」)
三类加法总评4.2.3 加在输出text/13-ch04.txt:573(搜「更实际的应用前景」)
BitFit4.3.1 基于规则的方法text/13-ch04.txt:588(搜「BitFit」) · text/13-ch04.txt:592(搜「0.08%」) · text/13-ch04.txt:601(搜「尚且未知」)
最后四分之一层4.3.1 基于规则的方法text/13-ch04.txt:607(搜「90% 的性能」)
Child-tuning 与 FIM4.3.2 基于学习的方法text/13-ch04.txt:615(搜「Child-tuning」) · text/13-ch04.txt:662(搜「费舍尔信息矩阵」) · text/13-ch04.txt:679(搜「费舍尔信息」)

Footnotes

  1. 出处:「4.1.1 下游任务适配」第 83 段(text/13-ch04.txt:83,搜「存在差距」)。推理代价随示例增多在同段(text/13-ch04.txt:87,搜「快速增加」)。

  2. 出处:「4.1.1 下游任务适配」第 132 段(text/13-ch04.txt:132,搜「60GB」)与第 132 段(text/13-ch04.txt:132,搜「RTX4090」)。

  3. 出处:「4.1.1 下游任务适配」第 101 段(text/13-ch04.txt:101,搜「数据集成」)与第 109 段(text/13-ch04.txt:109,搜「Self-Instruct」)。

  4. 出处:「4.1.3 参数高效微调的优势」表 4.1(text/13-ch04.txt:215,搜「47.14GB」)。三行对照:T0_3B 47.14→14.4GB,mt0-xxl OOM→56GB,bloomz-7b1 OOM→32GB;数据来源注为 huggingface/peft 仓库。

  5. 出处:「4.2.1 加在输入」第 255 段(text/13-ch04.txt:255,搜「软提示」)与第 265 段(text/13-ch04.txt:265,搜「软提示长度」)。

  6. 出处:「4.2.1 加在输入」第 296 段(text/13-ch04.txt:296,搜「咒语」)。原文:「Prompt-tuning 原本被提出的动机不是为了实现参数高效微调,而是自动学习提示词」(text/13-ch04.txt:279,搜「动机」)。

  7. 出处:「4.2.1 加在输入」第 273 段(text/13-ch04.txt:273,搜「1 到 200」)与第 277 段(text/13-ch04.txt:277,搜「初始化」)。

  8. 出处:「4.2.1 加在输入」第 306 段(text/13-ch04.txt:306,搜「20480」)。多任务共存与混合推理同段(text/13-ch04.txt:314,搜「混合任务推理」);10B 接近全量微调在第 319 段(text/13-ch04.txt:319,搜「10B 参数量」)。

  9. 出处:「4.2.2 加在模型」第 347 段(text/13-ch04.txt:347,搜「Pk」)与第 355 段(text/13-ch04.txt:355,搜「不稳定」)、第 359 段(text/13-ch04.txt:359,搜「重参数化」)。

  10. 出处:「4.2.2 加在模型」第 393 段(text/13-ch04.txt:393,搜「瓶颈」)与第 422 段(text/13-ch04.txt:422,搜「2dr」)。

  11. 出处:「4.2.2 加在模型」第 444 段(text/13-ch04.txt:444,搜「知识提取」)与第 497 段(text/13-ch04.txt:497,搜「当作 Query」)。

  12. 出处:「4.2.3 加在输出」第 532 段(text/13-ch04.txt:532,搜「反专家模型」)。公式 s̃=sM+sM+−sM− 在第 454 段(text/13-ch04.txt:454,搜「softmax」)。

  13. 出处:「4.2.3 加在输出」第 553 段(text/13-ch04.txt:553,搜「LLaMA-7B」)与第 561 段(text/13-ch04.txt:561,搜「黑盒模型同样适用」)。

  14. 出处:「4.2.3 加在输出」末段(text/13-ch04.txt:573,搜「更实际的应用前景」)。

  15. 出处:「4.3 参数选择方法」第 583 段(text/13-ch04.txt:583,搜「基于规则」)。推理零额外成本在第 323 段(text/13-ch04.txt:323,搜「额外的参数」)。

  16. 出处:「4.3.1 基于规则的方法」第 588 段(text/13-ch04.txt:588,搜「BitFit」)、第 592 段(text/13-ch04.txt:592,搜「0.08%」)与第 601 段(text/13-ch04.txt:601,搜「尚且未知」)。GLUE 媲美全量在第 595 段(text/13-ch04.txt:595,搜「GLUE」)。

  17. 出处:「4.3.1 基于规则的方法」第 607 段(text/13-ch04.txt:607,搜「90% 的性能」)。

  18. 出处:「4.3.2 基于学习的方法」第 615 段(text/13-ch04.txt:615,搜「Child-tuning」)、第 656 段(text/13-ch04.txt:656,搜「伯努利分布」)与第 662 段(text/13-ch04.txt:662,搜「费舍尔信息矩阵」)。FIM 耗时在第 686 段(text/13-ch04.txt:686,搜「耗时」)。

  19. 出处:「4.3.2 基于学习的方法」末段(text/13-ch04.txt:713,搜「最佳参数子集」)。