跳到主要内容

只动一小部分 — 旁路、合并、蒸馏、剪枝

这一章讲三件事: 为什么微调根本不需要动全部参数; 只动一小块之后,怎么把「装不下」变成「一张卡就够」; 以及除了这条路,还有三种把模型变小的办法各省的是什么。

它在全书链条里的位置: 第 11 章把「装载一个模型」这件事的成本压下来了, 但那还只解决了推理。训练比推理贵得多(第 06 章那四笔账)。 这一章是把训练也压下来的那一步——也是第 01 章那句伏笔真正兑现的地方: 那个「关键中间层」之所以存在,主要就是因为这一章。

第 04 章那条暗线「别走远」在这一章第三次出现, 这一次它管的是能动的方向数:只准在一个很小的旁路里改。

1. 先看现象:一个反直觉的观察

第 04 章讲过,微调是在参数空间里挪一小步。 那么问题是:这一步往哪些方向挪?

直觉的答案是「所有方向」——七百亿个参数,每一个都可能要动。

书给出的观察不是这样1:

当大模型在具体任务上被微调时,权重的变化量往往具有很低的内蕴维度。 从预训练权重到微调后权重的那个差,名义上牵涉几百万甚至几十亿个参数, 却可以用少得多的自由度很好地近似出来。

用大白话说这件事:

微调之后,每个参数确实都变了一点。
★ 但这些「变化量」不是各自独立的——它们高度地互相关联,
实际上只沿着很少几个方向在动。

→ 既然如此,就没必要为「变化量」准备一整个矩阵那么多的自由度。

这一节要引入的第一个词是「内蕴维度」,它的意思就是上面这一句: 一堆数看着有几百万个,实际的自由度只有几十个。

书由此推出这一章的总纲2:

对任何一个具体用途来说,我们真正在乎的,是整个模型里很小的一部分—— 几十亿个参数里,我们关心的往往不超过百分之一到百分之二。

2. 顶层全景:两种省法相乘

┌─ 省法一:只训一小块 ───────────────────────────────┐
│ 底座权重全部冻住,旁边挂一条很小的旁路,只训旁路 │
│ ★ 可训练的参数少 100 倍以上 │
│ → 省的是:梯度和优化器状态那两笔账(第 06 章) │
└───────────────────────────────────────────────────┘
×
┌─ 省法二:底座本身压成 4 位 ────────────────────────┐
│ 第 11 章那套。旁路本身保持高精度,保住梯度的保真度 │
│ ★ 底座占的地方少 8 倍(相对 32 位) │
│ → 省的是:装载模型那一笔账 │
└───────────────────────────────────────────────────┘

★ 两种省法是**相乘**的,不是相加的。
这个乘法就是第 01 章那个「关键中间层」的全部来历。

图说:§3 讲省法一的机制,§4 讲这条旁路挂在哪儿,§5 讲两种相乘之后的账。
§6 之后是另外三条不同的路(合并、蒸馏、剪枝),它们省的东西各不相同。

主走查(全章共用): 拿模型里一层 4096×4096 的权重, 给它挂上一条秩为 16 的旁路,看可训练的数从多少降到多少; 再把底座压成 4 位,看这次微调从「装都装不下」变成什么。

3. 机制一:把变化量写成两个瘦长矩阵相乘

它解决什么问题

第 06 章算过训练时的显存有四笔账,其中三笔的大小都由「有多少个参数要训」决定: 梯度、优化器状态、以及部分中间结果。

所以只要把「要训的参数」砍下来,那三笔账一起砍。

怎么做

做法只有一句3:

把预训练权重整个冻住,只训练一对很小的矩阵,让它们的乘积去逼近那个权重的变化量。

原来的一层权重是一个 d 行 k 列的矩阵 W₀,它被冻住、一个数都不改。
旁边挂两个小矩阵:
A:d 行 r 列
B:r 行 k 列
它们的乘积 B×A 是一个 d 行 k 列的矩阵 —— 正好和 W₀ 一样大

★ 但它只需要 r × (d + k) 个数,而不是 d × k 个数。
★ r 就是那条旁路的「秩」,它远小于 d 和 k。

输入进来时:
原来:输出 = W₀ × 输入
现在:输出 = W₀ × 输入 + (B×A) × 输入
└─ 冻住 ─┘ └─ 只训这个 ─┘

这个做法的名字叫 LoRA(low-rank adaptation,低秩适配—— 「低秩」就是上面那个 r 很小)。出门看任何一份微调工具的文档都会撞见这四个字母,所以留名。

走查:那一层的账

一层 4096 × 4096 的权重(为演示取这个尺寸,它是常见的隐藏层宽度)

原来要训的数: 4096 × 4096 = 16,777,216 ← 一千六百多万

挂一条秩 16 的旁路:
A:4096 × 16 = 65,536
B:16 × 4096 = 65,536
合计 = 131,072 ← 十三万

★ 省了 128 倍。

放到整个模型上:书给的量级是一个 70 亿参数的模型,
可训练的旁路参数只有 1000 万到 1 亿个 ——
**梯度计算和优化器状态所需的显存,降一个数量级。**

(4096 这个尺寸和秩 16 是为演示取的常见值;
「省 100 倍以上」和「70 亿模型对应 1000 万到 1 亿可训参数」是书里给的。)

为什么这有效,以及它的边界

有效的理由就是第 1 节那个观察:变化量本来就只在少数几个方向上。 旁路的秩,恰好就是「允许它在多少个方向上动」。

★ 这就是「别走远」的第三副面孔,而且这一次它管的东西最直白: 前两次管的是每一步的位移(学习率)和输出的分布(偏离惩罚), 这一次管的是「能动的方向数」——你只被允许在一个 16 维的子空间里改动这一层。

和前两次一样,它们不能互相替代: 秩再低,学习率给得离谱照样会崩;而低秩本身不保证输出分布不漂。 它约束的是形状,不是幅度,也不是结果。

秩定多少,书给了一张可以直接照做的表4:

情况秩定多少
默认16
训练很快就收敛、但表现卡在预期之下 → 旁路可能容量不够试 32 或 64
训练慢或者不稳 → 高秩可能带来优化困难试 8
只是调格式这类简单适配4 常常就够
复杂的领域迁移可能要 64

书给的判据一句话:秩该多高,取决于这个任务要求模型改变多少。 小的行为调整用低秩,实质性的适配用高秩。

一条对部署很要紧的性质

这条旁路在训练完之后可以被合并回原权重里—— 因为 B×A 和 W₀ 一样大,直接加上去就行。

后果:推理时一点额外延迟都没有。 书把这条列为它成为默认选择的决定性理由之一5:

当推理延迟要紧、而适配器可以在训练后合并时,它「没有推理开销」这一点是决定性的。

4. 机制二:这条旁路该挂在哪儿

这一节兑现第 02 章那笔欠账:那里讲完注意力和前馈层之后说过 「那条旁路为什么挂在这两处,第 12 章讲」。

书给的答案

在书给的那份 700 亿模型的配置里,旁路挂在每一个 transformer 块里的 全部线性投影上,而不只是注意力里的两处6:

注意力那一侧的四处投影:
q_proj k_proj v_proj ← 第 02 章讲过:它们分别产出「我要找什么 /
我是什么 / 我带的是什么信息」
o_proj ← 把注意力算完的结果送回主干

前馈层那一侧的三处投影:
gate_proj up_proj down_proj
← 第 02 章讲过:前馈层是每个位置各自过一遍的加工

为什么要挂满,书给的理由很实在6:

挂满全套投影,每个适配器参数带来的额外开销只是适度增加, 却给优化器更多的自由度;而这一点在 700 亿这个规模上更要紧—— 因为在那里,只训一小块和全量微调之间的差距更难抹平。

为什么偏偏是这两类地方

判断(我们的,不是书里的): 挂在这两处不是随便选的, 因为这两处就是模型里绝大多数参数所在的地方。 第 02 章讲过,一个 transformer 块里的可学参数基本就是 「算注意力用的那几个投影」加上「前馈层那两三个大矩阵」; 除此之外的东西(比如归一化)参数量小到可以忽略。 所以「挂在注意力和前馈层上」实际等价于「挂在所有值得挂的地方」。

如果错,会错在: 书并没有明说「因为参数都在这儿」。 也存在另一种可能的理由——这两处正好是信息被混合与加工的地方, 所以对行为的影响最大。这两种理由不排斥,但我们只见到书写了「自由度更多」这一条。

5. 机制三:两种省法相乘 ★ 第 01 章那句伏笔在这里兑现

做法

把上一章和这一章拼起来7:

① 底座用 4 位精度装载 ← 第 11 章那套(用的正是那个为微调设计的 NF4 格式)
② 旁路用更高精度训练 ← 保住梯度的保真度
★ 这个组合是**相乘的**:
4 位量化把底座的内存占用相对 32 位降 8 倍;
只训旁路把可训练参数降 100 倍以上。

这个组合的名字叫 QLoRA(Q 就是量化 quantization),留名。

它还带了两项自己的东西7:

创新干什么
NF4 这个 4 位格式第 11 章讲过它:格点不均匀摆,而是按「神经网络权重在 0 附近扎堆、尾巴可预测地衰减」这个形状摆,把更多精度分配到权重最密集的地方
双重量化把量化参数本身也量化一遍——第 11 章讲过每一小组权重都要带一个缩放系数,这些系数加起来也是一笔开销,这一步把它也压下去

走查:这次微调从「装不下」变成什么

目标:微调一个 700 亿参数的模型

不用这套: 16 位装载就要 140GB,还没算训练那三笔账
→ 需要多张数据中心级显卡

用这套(书给的那份配置,秩 16、挂满七处投影):
4 位装载 + 双重量化 → **从 140GB 降到大约 40GB**

★ 书给的硬件门槛(这里有一处书内矛盾,见下):
300 亿参数的模型 → **一张 24GB 的消费级显卡**
700 亿参数的模型 → **48GB 或更多**

(140GB → 40GB、以及这两条硬件门槛,都是书里给的数。)

★ 这里有一处书内自相矛盾,我们照实写

书在两个地方给了对同一件事不同的说法:

出现在说法
第 01 章那一节 与 本章正文300 亿参数进一张 24GB 卡;700 亿要 48GB 或更多8
本章那篇实战专栏在这之前,微调 700 亿要用每小时几千美元的数据中心卡;在这之后,同一件事装进一张几百美元的 24GB 消费级显卡9

判断(我们的,不是书里的): 这两处对不上,而且差的正好是「700 亿能不能进 24GB」这一条。 我们的读法是:正文那两个门槛(30B → 24GB、70B → 48GB+)是书的正式口径, 因为它在两个不同的章节里一致地出现了两次; 那篇专栏里的「700 亿进 24GB」是行文上的夸张,或者指的是更激进的配置。 做预算时按 48GB 算。

如果错,会错在: 700 亿模型在极低秩、极短上下文、极小批量下, 确实有可能勉强挤进 24GB。那样的话专栏那句就是字面为真、只是不代表可用的配置。 两种解释下,「按 48GB 做预算」这个行动建议都不变。

这件事带来的实际后果

书用一段亲历把它说清了9:

我看着一些组织从「我们没钱拿大模型做实验」变成「我们这周微调了五个变体」, 仅仅因为采用了这套做法。

而质量与效率的取舍是真实的,但常常是划算的: ★ 用这套调出来的 700 亿模型,通常打得过全量微调出来的 70 亿模型—— 而且前者现在是够得着的。

★ 第 01 章那句伏笔到此兑现: 那里说「中间那一层不是天然存在的,是被技法造出来的, 怎么压第 12 章还」。答案就是上面这个乘法。

6. 机制四:同一族里的其他做法,各治一病

这一节把这一族里的亲戚列清。判断口径书给得很干脆,先说结论10:

先用最朴素的那一种。只有在你有证据说明它对你这个具体任务不够用时,才去看别的。

亲戚一:把「多少」和「哪个方向」分开(DoRA)

病: 前面那条旁路把「改多大」和「往哪改」混在一个更新里。

11:

先把原来的权重矩阵拆成两部分:
一个**幅度**向量 m ←「这一列有多大」
一个**方向**矩阵 V ←「这一列指向哪儿」

然后 —— **只对方向那一部分挂旁路**,幅度作为一个单独可学的参数。
★ 于是优化器对「改多少」和「改哪个方向」有了各自独立的控制。

效果与代价11:

效果在各类任务上稳定优于朴素做法,基准上通常 1 到 3 个百分点;训练时几乎不增加显存
什么时候最明显需要细腻的行为改变的任务——因为幅度和方向分开给了优化器更多自由度
迁移成本几乎为零:同一套超参、同一套设施,改一个开关就行

书的定位:当那条朴素旁路比全量微调差一点点时,这个做法常常能把这个差距补上。

亲戚二:根本不动权重,只在输入端加一小段(软提示)

这一族的思路完全不同12:

它改的是模型的输入,而不是模型的权重。 做法是在输入序列前面拼上一小段可学习的向量, 通过「学出来的上下文」来引导模型行为,而不是通过改权重。 底座完全冻住,只训这一小段向量。

注意这和第 03 章那条「提示词」不是一回事: 那里拼上去的是人写的字;这里拼上去的是一串训练出来的数,人读不懂。

书列了三种12:

名字做法特点
提示微调(prompt tuning)只在输入层加可训练的 token最省:参数量只有万分之一到千分之一的量级
前缀微调(prefix tuning)在每一层都加,而不只是输入层训练不到 0.1% 的参数就能达到接近全量微调的表现;在数据少的场景尤其强(全量微调在那里会过拟合)。一个关键实现细节:这些参数是通过一个单独的前馈网络间接优化的,直接训会不稳
P-tuning可训练的向量可以插在序列里的任意位置,不必全部放在最前面便于让这些向量去标记输入各部分之间的边界

它什么时候是对的选择12:

★ 一个冻住的大模型要同时服务几十个任务时:
**只换那一小段向量就换了任务,每个任务只占几 KB 存储。**

★ 需要把底座保持成一个精确的参照物时。

代价两条:
① **它不可解释**——那串数人读不懂;
② **容量有限**。需要实质性行为改变的复杂领域迁移,
**可能超出「在输入端引导」所能达到的范围**。

一张全族对照表

书给了一张表,我们照它整理(挑最常用的几行)13:

方法要训多少参数推理时的额外开销容量最适合
全量微调全部最高资源充足、要最高质量
朴素旁路(LoRA)0.1%–1%无(可合并)默认选择,多数任务
加上量化(QLoRA)0.1%–1%无(可合并)显存有限
拆幅度与方向(DoRA)0.1%–1%无(可合并)想把和全量微调的差距补上
按重要性动态分配秩(AdaLoRA)0.1%–1%无(可合并)参数预算紧、而且各处重要性不均
经典适配器(在层里插一个瓶颈模块)0.5%–2%中等,而且合并不掉需要动态切换的场景
提示微调0.001%–0.01%占用上下文低到中多任务、大模型
前缀微调0.01%–0.1%占用上下文数据少、多任务服务

注意最后三行那个「占用上下文」: 这些方法拼在输入前面的东西要吃掉上下文窗口的额度, 而经典适配器那一行的「合并不掉」意味着它每次推理都有实打实的额外计算。

7. 机制五:两个模型的能力可以在权重空间里做加减法

这一节讲的是一条完全不训练的路。

现象

把多个训好的模型的权重组合起来,继承各自的能力。 最简单的做法是线性插值:按一个混合系数把两个模型的权重平均起来。 如果模型 A 擅长写代码、模型 B 擅长创意写作,合并出来的模型可能两样都还行—— 而且不需要任何额外训练。14

三种更讲究的做法

当要合并的模型多起来时,冲突就会出现,于是有了这几种15:

做法怎么处理冲突
TIES先剪掉那些变化很小的权重,再对剩下的用符号多数表决解决冲突,然后合并
DARE合并前随机丢掉一部分变化量,以此减少模型之间的互相干扰
任务算术把合并看成权重空间里的向量加减法:「写代码这个方向」= 代码微调模型减去它的底座;有了「写代码方向」和「写作方向」,把两个方向都加到底座上,就得到一个两样都会的模型

它的价值和它的硬边界

价值,书用一段亲历说明16:

我见过团队把一个做过安全调优的模型和一个做过领域调优的模型合并, 同时拿到两种性质,从而避开了联合训练时那套小心翼翼的数据配比。

边界只有一条,但它是硬的16:

合并解决不了根本性的冲突。 一个被调得极度谨慎的模型,和一个被调得最大限度乐于助人的模型, 合并不出一个「两者都是」的东西。 但对于添加互不相干的能力,它是一个便宜得惊人的训练替代品。

8. 机制六:让小模型学大模型

它解决什么问题

上面所有做法都是在「同一个模型」上省。这一条是换一个更小的模型。

而最朴素的做法(直接拿大模型的答案去训小模型)会丢掉一样很值钱的东西。

关键观察:整个概率分布比一个标准答案多带了信息

书用一个很小的例子讲透了这件事17:

一个大模型看到一张狗的图片,它输出的不是「狗」这一个词,
而是一整张概率表:
狗 0.90
狼 0.05
郊狼 0.02
…其余各种动物一点点

★ 这张表编码了一件标准答案里没有的事:
**狗和狼相似,而狗和汽车不相似。**

→ 拿标准答案训学生:它只学到「这是狗」。
→ 拿这整张表训学生:**它还学到了类别之间的相似性结构。**

这就是蒸馏(distillation)的立足点。 那张表书里叫软标签, 对应的「只有一个答案」叫硬标签

那个必须讲清的旋钮:温度

直接用那张表还不够,因为它太尖了——0.90 压过一切,后面那些相似性信息几乎没有分量。 所以要先把它「摊平」一点,而控制摊多平的旋钮叫温度18:

温度取值后果
低于 3分布太尖,关于「其他候选」的有用知识传不过去
3 到 10多数语言模型蒸馏的好用区间
起手值 4高到足以显出候选之间的相对排序,低到让自信的预测仍然区别于不确定的预测
高于 20摊得太平,老师的偏好变成噪声

怎么调它,书给了两条症状对照18:

学生学得快、但质量卡在预期之下 → **调高**温度,传更细腻的知识
学生学得慢、或者像是无视了老师最强的那些信号 → **调低**温度,把学习集中到高置信预测上

书还补了一句省心的:损失里那个温度平方的因子会自动处理梯度缩放, 所以调温度时不必操心它和学习率的相互作用。

除了输出,还可以对齐中间

书还提了另一层做法19:

除了输出的分布,还可以让学生的中间状态去匹配老师的中间状态(特征蒸馏), 或者让注意力的分布去匹配(注意力蒸馏)。 当学生比老师小很多、光看输出学不动老师的行为时,这些中间层的对齐尤其有用。

三条硬边界

书专门开了一个警告框20:

边界说明
学生学不会它表示不了的东西一个 10 亿参数的学生不会匹敌一个 700 亿参数的老师,不管你用多少蒸馏数据。学生的结构给它能学到什么设了天花板
差距太大只学到表面差距过大时,学生学到的是表层模式,而更深的能力根本装不进去
适度差距最好70 亿学 700 亿、30 亿学 130 亿,这类是它最见效的区间

但有一种情况学生可以超过老师20:

多老师蒸馏。 一个老师事实准确性强、一个对话流畅、一个写代码好, 从三个一起蒸,可以得到一个能力更均衡、而任何单个老师都不具备这种均衡的学生。 代价是训练时算力更多。

什么时候该蒸馏,什么时候直接训小模型就行

书给了一条清楚的判据21:

情况该走哪条
你要保住老师的广泛能力(通用知识、细腻的推理、稳健的指令跟随)蒸馏。老师在多样数据上的输出,比在任务数据上做示范训练更能有效地转移这些广泛能力
任务很窄,不需要学生继承通用能力(比如只从特定文档里抽特定字段)直接训那个小模型更省

9. 机制七:剪掉那些没在干活的连接

现象

训练出来的网络里,大多数参数是冗余的。 这一条和第 11 章那句 「高精度里存着大量没在干活的位」是同一个直觉的另一个方向: 那里省的是每个数的精度,这里省的是数的个数。

三种剪法

剪法做什么代价
按幅度剪把所有权重按绝对值排序,去掉最小的那一批——假设小权重对输出贡献小这个假设不总成立:一个小权重乘上一个很大的激活值,可能贡献很大22
按整块剪去掉整个神经元、整个注意力头、甚至整层好处是剪完直接就是标准的密集计算,不需要稀疏矩阵支持;坏处是粒度粗——去掉一个大体上没用的注意力头,也会把它有用的那部分一起去掉22
反复剪剪一点 → 重训恢复 → 再剪一点,循环在高稀疏度下质量明显更好;代价是要多轮重训

书给的量级:很多 transformer 模型可以去掉 50% 以上的参数而不明显劣化22

但省参数不等于省时间,这是这一节最要紧的一条

这一条最容易被忽略,而它直接决定剪枝值不值得做23:

★ 「哪些位置是 0」这个图案,决定了稀疏能不能变成真正的计算节省。

┌─ 不规则地剪(哪里最小剪哪里)
│ 同等质量下压缩率最高 —— 因为它剪掉的正是最不要紧的那些
│ ★ 但它需要稀疏矩阵运算,而多数硬件对此支持很差。
│ 显卡是为密集矩阵乘法优化的,不规则的访存吃不满硬件,
│ ** 一个 50% 稀疏的模型,可能比同结构的密集模型跑得还慢。**

├─ N:M 稀疏(每连续 M 个元素里恰好有 N 个是 0)
│ 这个规整图案能被硬件高效实现。
│ ★ Ampere 及之后的显卡原生支持 2:4 —— 一半权重清零,矩阵运算速度接近翻倍。

└─ 按矩形块剪
规整性换来硬件加速,代价是压缩效率不如不规则剪法。

★ 书给的判词:
**剪到 90% 的不规则稀疏听起来很唬人,但在标准显卡上可能一点推理加速都没有;
剪到 50% 的 2:4 稀疏,在支持的硬件上速度翻倍。**

所以口径是:你的部署目标决定你的剪枝策略。 硬件有稀疏加速 → 用它支持的那种图案; 硬件没有 → 按整块剪,比剪出一堆硬件处理不了的稀疏矩阵更实际。

为什么剪枝有效:一个仍未被解决的假说

书给了一个解释,而且明确标出它是一个假说24:

彩票假设(2019 年提出):密集网络里含有一些稀疏的子网络——他们管它叫「中奖票」—— 这些子网络如果从同样的初始状态单独训练,能匹敌整个网络的表现。

这个比方是:训练一个大网络就像买了很多张彩票。多数票会输, 但在这么多被初始化的子网络里,总得有一张中奖。 剪枝是在开奖之后把中奖的那张认出来。

书紧接着给了它的现实困境,这一条很重要24:

实践中,要找到中奖票,仍然得先把整个网络训出来,再判断该保留哪些权重—— 这就把潜在的效率收益消掉了一大半。

而它和这一章第一节那个观察连得上24:

对微调来说,这个假说意味着「可适配的参数」可能集中在特定的子网络里。 它给「为什么微调的变化量会集中在一个低维子空间里」提供了一个概念框架—— 也就给这一章开头那条旁路的成功提供了一种解释。

判断(我们的,不是书里的): 这两件事(彩票假设 · 低秩)在书里是分开讲的, 只在最后一段被并到一起。我们认为它们是同一个直觉的两种说法: 「大网络里真正干活的部分很小」——彩票假设说的是「哪些参数」, 低秩说的是「哪些方向」。 如果错,会错在: 「参数子集」和「变化的方向子空间」在数学上不是一回事—— 一个是坐标轴的子集,一个是任意方向张成的子空间。 两者可以同时成立、也可以只成立一个,书自己用的措辞也只是「提供了一个概念框架」。

10. 作者的判断与证据

说法是哪一类说明
微调的变化量有低内蕴维度有据的经验观察书给了原论文的尾注,并且明写这是「经验观察」而不是定理1
省 100 倍以上可验算这是矩阵尺寸的直接后果,读者可以自己算3
秩的那张对照表经验法则书给的是一套操作口径,没有配实验4
挂满七处投影更好作者的经验理由是「给优化器更多自由度」,并说这在 700 亿规模上更要紧6
30B→24GB、70B→48GB+有据的工程数字书在两个不同章节一致地给了这两个数8
「这之后 70B 装进 24GB 卡」⚠ 与上一条矛盾出现在实战专栏里;我们判定正文那两个门槛是正式口径9
「调出来的 700 亿通常打得过全量调的 70 亿」作者的经验判断没有配基准数据9
拆幅度与方向能带来 1–3 个百分点有据书给了尾注,并说明在哪类任务上最明显11
前缀微调能以不到 0.1% 参数接近全量微调他引论文的结论书给了尾注12
合并解决不了根本冲突作者的判断 + 反例那个「极谨慎 vs 极乐于助人」的例子是他构造的说明16
软标签带有相似性结构机制解释那个狗/狼/郊狼的分布是书给的说明性例子17
温度 3–10、起手 4经验法则书给了两头失效的理由,但没有配实验18
10 亿学不了 700 亿作者的判断没有配实验;理由是「学生的结构设了天花板」20
Transformer 常可去掉 50% 以上参数书给的量级书自己的措辞是「常常高得出人意料」,并说它随模型与任务变22
50% 不规则稀疏可能比密集还慢有据的硬件事实理由是不规则访存吃不满硬件23
彩票假设明标的假说书给了 2019 年那篇论文的尾注,并明说找中奖票仍需先训完整网络,这让效率收益大打折扣24

11. 边界与局限

  1. 每种方法的数学我们只交付结构。 那对小矩阵怎么初始化、 lora_alpha 这类缩放参数怎么起作用,书给了代码但没有展开原理; 要看这一层请查我们的前沿框架书架25
  2. 两个为图像生成设计的变体我们只在表里列了名。 书对它们的描述也只有一行(用另一种矩阵乘法,让秩能升到更高), 而这本书的主线是文本,所以我们没有展开。
  3. 蒸馏的损失函数我们只交付了温度这个旋钮。 书给了完整的式子,我们交付的是「温度控制什么、两头各是什么坏结果」
  4. 剪枝的实操流程书讲得很浅。 它讲了三种剪法和硬件约束, 但没有给「剪多少」的判据,也没有给验收流程—— 这一块请用第 10、11 章那套质量门自己搭。
  5. 具体工具的接口不在这里。 书给了一段带注解的配置代码, 那是某个封装库的接口,会随版本变26

12. 可带走的

  1. 微调带来的变化量,内蕴维度很低——它只沿很少几个方向在动; 所以没必要为它准备一整个矩阵那么多自由度;
  2. 书的总纲一句话:几十亿个参数里,我们真正在乎的往往不超过百分之一到百分之二;
  3. 做法:冻住底座,旁边挂两个瘦长矩阵,让它们的乘积去逼近变化量; 一层 4096×4096 从一千六百多万个可训参数降到十三万,省 128 倍;
  4. 一个 70 亿模型的可训旁路参数只有 1000 万到 1 亿, 梯度和优化器状态那两笔显存降一个数量级;
  5. 这是「别走远」的第三副面孔,它管的是能动的方向数; 和前两次不能互相替代:它约束形状,不约束幅度、也不约束结果;
  6. 秩:默认 16;只调格式用 4;复杂领域迁移用 64;不稳就降到 8。 判据是「这个任务要求模型改变多少」;
  7. 这条旁路训完可以合并回原权重,所以推理时零额外延迟——这是它成为默认的决定性理由;
  8. 旁路挂在注意力的四处投影和前馈层的三处投影上,也就是挂满; 理由是给优化器更多自由度,而这在 700 亿规模上更要紧;
  9. 两种省法相乘:底座压 4 位(降 8 倍)× 只训旁路(降 100 倍以上); 700 亿模型从 140GB 降到大约 40GB——第 01 章那个「关键中间层」就是这么来的;
  10. 做预算时:300 亿进 24GB,700 亿按 48GB 算。 书里有一处专栏说 700 亿进 24GB,和正文两处矛盾,我们按正文走;
  11. 用这套调出来的 700 亿,通常打得过全量调出来的 70 亿(作者的经验判断,无基准数据);
  12. 把幅度和方向拆开、只对方向挂旁路,基准上通常好 1 到 3 个百分点,改一个开关就能试;
  13. 软提示这一族根本不动权重,只在输入端拼一小段训练出来的向量; 一个冻住的大模型换一小段向量就换一个任务,每个任务只占几 KB; 代价是不可解释容量有限;
  14. 权重空间里可以做加减法:线性插值 · 剪小变化加符号多数表决 · 随机丢一部分变化量 · 把「写代码方向」和「写作方向」都加到底座上;
  15. 但合并解决不了根本冲突:极谨慎和极乐于助人合并不出「两者都是」;
  16. 蒸馏的立足点是整张概率表比一个标准答案多带了信息—— 狗 0.90 / 狼 0.05 / 郊狼 0.02 里有类别之间的相似性结构;
  17. 温度控制那张表摊多平:低于 3 太尖、高于 20 变噪声、起手 4;
  18. 学生学不了它表示不了的东西;差距太大只学到表面;适度差距最好(70 亿学 700 亿); 但多个老师一起蒸,学生可以在均衡性上超过任何单个老师;
  19. 窄任务不必蒸馏,直接训小模型更省;
  20. 剪枝按幅度剪最简单,但小权重乘大激活可能仍然重要;
  21. 省参数不等于省时间:50% 的不规则稀疏可能比密集还慢; 50% 的 2:4 稀疏在支持的硬件上速度接近翻倍——部署目标决定剪枝策略;
  22. 彩票假设是假说,不是定论;而且找中奖票仍需先训完整网络,效率收益因此大打折扣; 它和低秩很可能是同一个直觉的两种说法。

13. 原文地图

主题原书章原文位置
我们只在乎百分之一二 · 低内蕴维度The 1 Percent That Matterstext/98-fm-the-1-percent-that-matters.txt:3(搜「rarely with more than 1 to 2 percent」) · :7(搜「low intrinsic dimensionality」)
旁路的做法 · 省多少The 1 Percent That Matterstext/98-fm-the-1-percent-that-matters.txt:9(搜「freezing the pre-trained weights entirely」) · :13(搜「a reduction that can exceed 100 times」) · :15(搜「10 to 100 million trainable LoRA parameters」)
秩怎么选CHOOSING LORA RANKtext/99-fm-choosing-lora-rank.txt:3(搜「Start with rank 16 as a default」)
两种省法相乘 · NF4 与双重量化CHOOSING LORA RANKtext/99-fm-choosing-lora-rank.txt:7(搜「The combination is multiplicative」) · :9(搜「24GB of memory」) · :11(搜「Double quantization」)
旁路挂在哪 · 140GB→40GBCHOOSING LORA RANKtext/99-fm-choosing-lora-rank.txt:37(搜「roughly 40GB」) · :39(搜「gives the optimizer more degrees of freedom」)
这件事的实际后果(⚠ 与正文矛盾处)FROM THE TRENCHES: THE QLORA REVOLUTIONtext/100-fm-from-the-trenches-the-qlora-revolution.txt:3(搜「fits on a 24GB consumer GPU」)
拆幅度与方向FROM THE TRENCHES: THE QLORA REVOLUTIONtext/100-fm-from-the-trenches-the-qlora-revolution.txt:7(搜「magnitude and direction components」) · :9(搜「typically 1 to 3 percent」) · :11(搜「drop-in improvement」)
软提示三种 · 适用场景FROM THE TRENCHES: THE QLORA REVOLUTIONtext/100-fm-from-the-trenches-the-qlora-revolution.txt:15(搜「prepend learnable embedding vectors」) · :31(搜「prevents instability during training」) · :35(搜「flexible token placement」) · :39(搜「just kilobytes of storage」)
全族对照表FROM THE TRENCHES: THE QLORA REVOLUTIONtext/100-fm-from-the-trenches-the-qlora-revolution.txt:45(搜「Comparing Parameter-Efficient Fine-Tuning Methods」)
默认用最朴素那种CHOOSING AN ADAPTER METHODtext/101-fm-choosing-an-adapter-method.txt:3(搜「lack of inference overhead is decisive」) · :5(搜「explore alternatives only when you have evidence」)
权重空间的加减法CHOOSING AN ADAPTER METHODtext/101-fm-choosing-an-adapter-method.txt:9(搜「linear interpolation」) · :11(搜「coding direction」) · :13(搜「merging cannot resolve fundamental conflicts」)
软标签带相似性结构 · 温度Drinking from the Firehose: Distillationtext/102-fm-drinking-from-the-firehose-distillation.txt:9(搜「0.05 to」) · :19(搜「Feature distillation」) · :29(搜「A reasonable starting point is T = 4」) · :31(搜「decrease temperature」)
什么时候该蒸馏Drinking from the Firehose: Distillationtext/102-fm-drinking-from-the-firehose-distillation.txt:35(搜「deployment constraints preclude」) · :37(搜「narrow tasks not requiring the student」)
学生的天花板 · 多老师WARNINGtext/103-fm-warning.txt:3(搜「A 1B student will not match a 70B teacher」) · :5(搜「Multi-teacher distillation」)
三种剪法 · 50% 以上The Art of Forgetting: Model Pruningtext/104-fm-the-art-of-forgetting-model-pruning.txt:9(搜「a small weight multiplied by a large activation」) · :11(搜「complete neurons, entire attention heads」) · :13(搜「50 percent or more」)
稀疏图案决定能不能加速The Art of Forgetting: Model Pruningtext/104-fm-the-art-of-forgetting-model-pruning.txt:19(搜「may run slower than a dense model」) · :21(搜「N of every M consecutive elements」) · :25(搜「sounds impressive but may provide no inference speedup」) · :27(搜「should inform your pruning strategy」)
彩票假设The Art of Forgetting: Model Pruningtext/104-fm-the-art-of-forgetting-model-pruning.txt:31(搜「winning tickets」) · :33(搜「eliminating much of the potential efficiency gain」) · :35(搜「connects to LoRA」)

Footnotes

  1. 出处:「The 1 Percent That Matters」第 7 段(text/98-fm-the-1-percent-that-matters.txt:7,搜「low intrinsic dimensionality」)。书给了原论文的尾注。原文的措辞是「begins from an empirical observation」——它起于一个经验观察,不是从理论推出来的;并说这个变化「名义上牵涉几百万或几十亿个参数,却能被少得多的自由度很好地近似」。 2

  2. 出处:「The 1 Percent That Matters」第 3 段(text/98-fm-the-1-percent-that-matters.txt:3,搜「rarely with more than 1 to 2 percent」)。这是整节的开场句,它把「低秩」和「量化」这两件事并成了同一个主题:我们最终在乎的只是模型里很小的一部分。

  3. 出处:「The 1 Percent That Matters」第 9 段(text/98-fm-the-1-percent-that-matters.txt:9,搜「freezing the pre-trained weights entirely」)、第 13 段(text/98-fm-the-1-percent-that-matters.txt:13,搜「a reduction that can exceed 100 times」)与第 15 段(text/98-fm-the-1-percent-that-matters.txt:15,搜「10 to 100 million trainable LoRA parameters」)。第 13 段给了可训参数从 d×k 降到 r×(d+k) 这个换算,并说对典型的 transformer 尺寸,这个缩减可以超过 100 倍;第 15 段说明这让原本装不下全量微调的消费级硬件也能微调大模型,并点明秩控制的是「适配容量」与「效率」之间的取舍。 2

  4. 出处:「CHOOSING LORA RANK」第 3 段(text/99-fm-choosing-lora-rank.txt:3,搜「Start with rank 16 as a default」)。原文完整给了五种情况的处置,以及那句判据:正确的秩取决于这个任务要求模型改变多少;小的行为调整需要低秩,实质性的适配需要高秩。 2

  5. 出处:「CHOOSING AN ADAPTER METHOD」第 3 段(text/101-fm-choosing-an-adapter-method.txt:3,搜「lack of inference overhead is decisive」)与第 5 段(text/101-fm-choosing-an-adapter-method.txt:5,搜「explore alternatives only when you have evidence」)。第 5 段那句是全节的口径:它在有效性、简单性和零推理开销上的组合,让它成为多数应用的默认;只有当它的具体性质不符合部署约束时,才值得考虑别的。

  6. 出处:「CHOOSING LORA RANK」第 39 段(text/99-fm-choosing-lora-rank.txt:39,搜「gives the optimizer more degrees of freedom」)。原文列出的七处投影是注意力的四处加上前馈层的三处,并说明挂满全套只带来适度的额外开销,却给优化器更多自由度;第 37 段(text/99-fm-choosing-lora-rank.txt:37,搜「roughly 40GB」)则说明那份配置里适配器针对的是每个块里全部的线性投影,而不只是常见的那两处 2 3

  7. 出处:「CHOOSING LORA RANK」第 7 段(text/99-fm-choosing-lora-rank.txt:7,搜「The combination is multiplicative」)与第 11 段(text/99-fm-choosing-lora-rank.txt:11,搜「Double quantization」)。第 7 段明说这个组合是相乘的:4 位量化把底座内存相对 32 位降 8 倍、只训旁路把可训参数降 100 倍以上;第 11 段说明那个 4 位格式把更多精度分配到 0 附近权重最密集的区域,而双重量化压的是每个量化块都要带的那个缩放系数本身的开销 2

  8. 出处:「CHOOSING LORA RANK」第 9 段(text/99-fm-choosing-lora-rank.txt:9,搜「24GB of memory」)与「What Post-Training Really Means」第 363 段(text/09-fm-what-post-training-really-means.txt:363,搜「requiring 48GB or more」)。两处一致:300 亿参数一张 24GB 消费级卡,700 亿要 48GB 或更多。 第 363 段那一段还有一句和第 01 章直接相关的话:「那个关键中间层的存在,部分正是因为这些技法存在;没有它们,有意义的后训练所需的资源将只有基础实验室才负担得起。」 2

  9. 出处:「FROM THE TRENCHES: THE QLORA REVOLUTION」第 3 段(text/100-fm-from-the-trenches-the-qlora-revolution.txt:3,搜「fits on a 24GB consumer GPU」)。原文说的是:在此之前微调 700 亿要用每小时几千美元的数据中心卡,在此之后同一件事装进一张几百美元的 24GB 消费级显卡⚠ 这与上一条脚注引的两处正文对不上,详见正文里的判断块。同段还有那句他的经验判断:用这套调出来的 700 亿通常打得过全量调出来的 70 亿。 2 3 4

  10. 出处:「CHOOSING AN ADAPTER METHOD」第 5 段(text/101-fm-choosing-an-adapter-method.txt:5,搜「explore alternatives only when you have evidence」)。这条口径和第 09 章那条「举证责任在复杂的那一侧」是同一个形状,只是换了场景。

  11. 出处:「FROM THE TRENCHES: THE QLORA REVOLUTION」第 7 段(text/100-fm-from-the-trenches-the-qlora-revolution.txt:7,搜「magnitude and direction components」)、第 9 段(text/100-fm-from-the-trenches-the-qlora-revolution.txt:9,搜「typically 1 to 3 percent」)与第 11 段(text/100-fm-from-the-trenches-the-qlora-revolution.txt:11,搜「drop-in improvement」)。书给了它的尾注,并说它的灵感来自权重归一化那一系技术;第 11 段说明同一套超参、同一套设施都适用,实现上的额外复杂度极小 2 3

  12. 出处:「FROM THE TRENCHES: THE QLORA REVOLUTION」第 15 段(text/100-fm-from-the-trenches-the-qlora-revolution.txt:15,搜「prepend learnable embedding vectors」)、第 31 段(text/100-fm-from-the-trenches-the-qlora-revolution.txt:31,搜「prevents instability during training」)、第 35 段(text/100-fm-from-the-trenches-the-qlora-revolution.txt:35,搜「flexible token placement」)与第 39 段(text/100-fm-from-the-trenches-the-qlora-revolution.txt:39,搜「just kilobytes of storage」)。第 15 段那句「把模型知道什么,和它被怎样引导,解耦开来」是这一族的定性。第 39 段的收口是:先用那条朴素旁路当默认,只在多任务服务或者需要保住底座这两种情况下才考虑软提示。 2 3 4

  13. 出处:「FROM THE TRENCHES: THE QLORA REVOLUTION」第 45 段(text/100-fm-from-the-trenches-the-qlora-revolution.txt:45,搜「Comparing Parameter-Efficient Fine-Tuning Methods」)。这是书里的表 7-3,共十一行,我们挑了其中八行。书里另有两种为图像生成设计的变体和一种只做逐元素缩放、参数量只有万分之一的方法,我们只在这里提名。

  14. 出处:「CHOOSING AN ADAPTER METHOD」第 9 段(text/101-fm-choosing-an-adapter-method.txt:9,搜「linear interpolation」)。原文那个例子是:模型 A 擅长代码、模型 B 擅长创意写作,合并出来的模型可能两样都还行,而不需要任何额外训练

  15. 出处:「CHOOSING AN ADAPTER METHOD」第 11 段(text/101-fm-choosing-an-adapter-method.txt:11,搜「coding direction」)。三种做法的英文名分别是 TIES-Merging、DARE 和 task arithmetic;这三个名字读者在合并工具的文档里会撞见,所以留名。

  16. 出处:「CHOOSING AN ADAPTER METHOD」第 13 段(text/101-fm-choosing-an-adapter-method.txt:13,搜「merging cannot resolve fundamental conflicts」)。那段亲历的完整表述是:团队把一个安全调优模型和一个领域调优模型合并,同时得到两种性质,从而避开了联合训练所需的那套小心的数据混合;而那句边界之后是:但对于添加互不相干的能力,合并是一个便宜得惊人的训练替代品。 2 3

  17. 出处:「Drinking from the Firehose: Distillation」第 9 段(text/102-fm-drinking-from-the-firehose-distillation.txt:9,搜「0.05 to」)。原文那张分布是狗 0.9、狼 0.05、郊狼 0.02,它编码了「狗和狼相似的方式,不同于狗和汽车」这个理解;而硬标签把这个信息丢了。 2

  18. 出处:「Drinking from the Firehose: Distillation」第 29 段(text/102-fm-drinking-from-the-firehose-distillation.txt:29,搜「A reasonable starting point is T = 4」)与第 31 段(text/102-fm-drinking-from-the-firehose-distillation.txt:31,搜「decrease temperature」)。第 29 段给了 3 到 10 这个区间以及两头的失效方式;第 31 段给了两条症状对照,并说那个温度平方的因子会自动处理梯度缩放,所以调温度时不必担心它和学习率的相互作用。完整的损失式子在第 23 段(text/102-fm-drinking-from-the-firehose-distillation.txt:23,搜「with temperature scaling」)。 2 3

  19. 出处:「Drinking from the Firehose: Distillation」第 19 段(text/102-fm-drinking-from-the-firehose-distillation.txt:19,搜「Feature distillation」)。原文说这类中间层的对齐在「学生比老师小很多、光靠观察输出学不动老师行为」时尤其有用

  20. 出处:「WARNING」第 3 段(text/103-fm-warning.txt:3,搜「A 1B student will not match a 70B teacher」)与第 5 段(text/103-fm-warning.txt:5,搜「Multi-teacher distillation」)。第 3 段那句「学生的结构给它能学到什么设了天花板」是这条边界的机制;书没有为它配实验。第 5 段那个多老师的例子是:一个老师事实准确性强、一个对话流畅、一个代码好,三个一起蒸能产出任何单个老师都不具备的均衡能力 2 3

  21. 出处:「Drinking from the Firehose: Distillation」第 35 段(text/102-fm-drinking-from-the-firehose-distillation.txt:35,搜「deployment constraints preclude」)与第 37 段(text/102-fm-drinking-from-the-firehose-distillation.txt:37,搜「narrow tasks not requiring the student」)。第 37 段那个窄任务的例子是「只从特定类型的文档里抽取特定字段」,书说这种情况直接在那个任务上训可能更高效

  22. 出处:「The Art of Forgetting: Model Pruning」第 9 段(text/104-fm-the-art-of-forgetting-model-pruning.txt:9,搜「a small weight multiplied by a large activation」)、第 11 段(text/104-fm-the-art-of-forgetting-model-pruning.txt:11,搜「complete neurons, entire attention heads」)与第 13 段(text/104-fm-the-art-of-forgetting-model-pruning.txt:13,搜「50 percent or more」)。第 9 段那句「小权重乘上大激活值可能贡献很大」和第 11 章那个保护重要权重的量化方法是同一个观察。 第 13 段说这个可去掉的比例随模型与任务而变,但常常高得出人意料 2 3 4

  23. 出处:「The Art of Forgetting: Model Pruning」第 19 段(text/104-fm-the-art-of-forgetting-model-pruning.txt:19,搜「may run slower than a dense model」)、第 21 段(text/104-fm-the-art-of-forgetting-model-pruning.txt:21,搜「N of every M consecutive elements」)、第 25 段(text/104-fm-the-art-of-forgetting-model-pruning.txt:25,搜「sounds impressive but may provide no inference speedup」)与第 27 段(text/104-fm-the-art-of-forgetting-model-pruning.txt:27,搜「should inform your pruning strategy」)。第 21 段点名了 Ampere 及之后的架构原生支持 2:4 这个图案,在一半权重清零时把矩阵运算速度接近翻倍 2

  24. 出处:「The Art of Forgetting: Model Pruning」第 31 段(text/104-fm-the-art-of-forgetting-model-pruning.txt:31,搜「winning tickets」)、第 33 段(text/104-fm-the-art-of-forgetting-model-pruning.txt:33,搜「eliminating much of the potential efficiency gain」)与第 35 段(text/104-fm-the-art-of-forgetting-model-pruning.txt:35,搜「connects to LoRA」)。书给了 2019 年那篇论文的尾注,并且从头到尾用的都是「假说」这个词。第 33 段那句现实困境是我们判它「不是可执行技法」的依据;第 35 段那句连接用的措辞是「the hypothesis provides a conceptual framework」——提供了一个概念框架,不是证明 2 3 4

  25. 补充(不在书里,依据我们的 frontier 书架):那对小矩阵怎么初始化、缩放参数怎么起作用、以及合并回原权重那一步具体做了什么,本书只给结论。 依据: shelf=ai-frontier-reference/peft#01-lora-math.md 事实=那一篇拆的就是低秩旁路的数学形式与缩放系数的作用,可以接着这一章往下读。

  26. 补充(不在书里,依据我们的 frontier 书架):书里那段 700 亿模型的配置代码用的是一个把量化装载与旁路注入包在一起的封装库,它的接口会随版本变。 依据: shelf=ai-frontier-reference/unsloth#05-loading-and-export.md 事实=那一篇拆的就是这个库怎么在装载时接管 4 位量化与适配器注入,以及导出时怎么把旁路合并回权重。