低秩直觉在大模型里
想让 7B 模型学会你公司的客服口吻,把七十亿参数全部重训一遍?算上梯度和优化器状态,显存账单直奔 100 GB——一台消费级显卡当场出局。但 2021 年一篇论文说:别动那七十亿,只训两个瘦长的小矩阵,贴上去,效果几乎不掉,显存砍到原来的零头。这就是 LoRA,如今微调开源大模型的事实标准。它的全部秘密,是本书从第 07 章外积薄片起埋了十六章的那条线——低秩——的最终收线。这一章还顺手结掉另外两桩旧案:量化(数字变糙为什么模型不傻)与 king − man + woman(那个让全世界起鸡皮疙瘩的平行四边形),最后用「把整个模型当一支向量做加减」的模型算术,给应用篇收一个足够震撼的尾。
先把全量微调的账摆出来
微调 = 在预训练权重上继续做第 21 章的训练循环,只是起点不再随机、数据换成你的领域语料。用形状账(第 19 章)算它的显存:7B 参数,fp16 权重 14 GB;梯度同形状再 14 GB;Adam 的动量与方差(fp32)再 56 GB——合计约 84 GB,还没算激活。这就是「全量微调」的门槛:不是算法难,是每个参数都要陪跑一套训练家当。想省,就得让「要训的参数」变少——但模型的能力就摊在那些矩阵里,动哪儿、不动哪儿?
LoRA:冻住大象,训练一根羽毛
历史上的第一反应是「只训最后几层」——粗粒度的冻结,省是省了,但「哪几层管哪种能力」说不清,效果起伏大。LoRA(Low-Rank Adaptation)的答案更漂亮:一个参数都不动,层层都能贴补丁,补丁按秩计价。把每个要适配的权重矩阵 W(比如 4096×4096 的注意力投影)原样冻结,旁边并联一个低秩补丁:
前向时输入同时过 W(冻结)和 BA(可训),输出相加——用第 06 章的话说:在原变换旁边并联了一个「只在 r 维走廊里活动」的小变换,训练只雕刻这条走廊。全部第 12 章的零件:BA 是「瘦 × 矮」的秩 ≤ r 矩阵,参数量 (4096+4096)×8 ≈ 6.6 万——对比原矩阵 1678 万,0.4%;整个 7B 模型的 LoRA 参数通常几百万到几千万,训练家当(梯度 + 优化器)只为这点参数开销,单卡从此够用。三个设计细节全有出处:A 随机初始化、B 初始化为零——训练开始时 BA = 0,补丁从「无为」出发,模型行为与预训练完全一致,不会开局就摔(第 12 章自测④的答案);α/r 缩放——换 r 时保持补丁的整体幅度稳定,免得重调学习率;推理时可合并——W + BA 提前加成一个矩阵,部署后零额外延迟,或者不合并、同一个底模热插拔几十套不同任务的 LoRA(服务商的「多租户」玩法,本质是第 09 章 Sherman–Morrison 的精神续作:大结构不动,薄补丁横飞)。
写成代码,机制小得让人安心:
import numpy as np D, r, alpha = 4096, 8, 16 W = np.random.randn(D, D) # 预训练权重:冻结,不进优化器 A = np.random.randn(r, D) * 0.01 # 可训,随机小值 B = np.zeros((D, r)) # 可训,零初始化 → 开局 BA = 0 def forward(x): return x @ W.T + (x @ A.T) @ B.T * (alpha / r) # 注意括号:先过瘦 A 再过瘦 B —— 第 07/09 章的结合律省钱 # 参数账 trainable = A.size + B.size # 65,536 trainable / W.size # 0.39% W_merged = W + B @ A * (alpha / r) # 部署前合并:推理零开销
forward 里那对括号是老朋友:x 先乘 r×D 的 A(便宜),再乘 D×r 的 B(便宜),永远不显式构造 D×D 的 BA——第 07 章两千倍算力账、第 09 章「先让向量过瘦矩阵」,在生产代码里的第 N 次上岗。三笔总账对比,把三条省钱路线放一张桌上:
| 方案 | 可训参数 | 显存量级(7B) | 代价 |
|---|---|---|---|
| 全量微调 | 7B(100%) | ~84 GB + 激活 | 多卡起步 |
| LoRA(r=8) | ~20M(0.3%) | ~16 GB | 能力上限略受 r 约束 |
| QLoRA(4bit 底模) | ~20M | ~6 GB | 再加量化误差,评测须重做 |
凭什么低秩就够:内在维度的证据链
大胆的假设需要证据,LoRA 的证据链值得完整看一遍,因为每一环都是本书工具的实战。环一:先辈实验发现,把 7B 参数投影到一个几千维的随机子空间里训练(只动这几千个自由度),很多下游任务照样能学会——「微调的内在维度远小于参数量」,第 11 章自由度语言的直接应用。环二:对全量微调得到的 ΔW = W_after − W_before 做 SVD(第 17 章),奇异值谱断崖式衰减——变化真实地集中在少数方向上,「谱读心术」的教科书现场。环三:第 21 章刚讲过,梯度更新本身就是秩 ≤ batch 的薄片叠加,更新的「原材料」天生低秩。三环合扣,结论落地:预训练已经把通用的基学好了(第 20 章的换基接力),微调只是在少数方向上拧几个旋钮——用 r=8 的走廊传递这些旋钮量,绰绰有余。这不是拍脑袋的近似,是被测量支撑的结构性事实。
这条证据链还有一个值得抄进方法论笔记的形状:「大系统的有效行为住在低维子空间里」不是深度学习的专利,是复杂系统的普遍脾气——气候模式的少数主导模态、蛋白质折叠的低维反应坐标、城市交通的几条主干流。第 12 章的秩、第 18 章的 PCA、本章的内在维度,是同一把钥匙在不同门上转动。学会先问「这个系统的有效自由度有多少」,常常比学会任何具体算法更能打。
量化:把 float 换成粗刻度尺
另一条省钱战线不动秩,动数字本身的精度:量化(quantization)。fp16 的权重换成 int8 甚至 int4,存储直接砍半再砍半——7B 模型 int4 后约 3.5 GB,手机都装得下;而且第 20 章说过逐 token 推理是带宽瓶颈,权重字节减半、每秒能搬进算术单元的参数就翻倍,量化同时买到了「装得下」和「跑得快」。机制用第 05 章的语言一句话:对每组权重记录 scale(缩放)和零点,把连续值四舍五入到 2⁸ 或 2⁴ 个刻度上——一把粗刻度尺,配一个恢复系数。为什么模型没被四舍五入毒死?两个几何原因:① 权重矩阵干的是「方向性」的活(第 04 章点积匹配),单个权重的小抖动在几千项求和里互相抵消(噪声平均);② 但有例外——某些通道的激活值动辄比同伴大几十倍(离群通道,大模型的著名怪癖),硬量化会把其他通道的分辨率全部挤没。现代方案(LLM.int8()、AWQ、GPTQ)的核心手艺就是「把离群者挑出来特殊照顾」:或单独走高精度通道,或按重要性重排量化顺序,或给每个小组各配一把尺(分组量化)——第 17 章条件数思维的落地:最大与最小的比值,决定一把尺子好不好用;比值太大,就分组各配各的尺。QLoRA 则是两条战线会师:底模量化到 4bit 冻结,LoRA 补丁保持高精度训练——单张游戏卡微调 33B 模型的著名配方。
King − Man + Woman:兑现那个平行四边形
第 02 章埋的最老的一颗彩蛋,现在起爆。word2vec 时代的著名发现:
先复原当年的震撼:2013 年,研究者在纯文本上训练词向量(没有任何人标注「性别」「王权」这类概念),然后发现上面这道算式的最近邻真的是 queen;Paris − France + Italy ≈ Rome;walking − walk + swim ≈ swimming。语法和常识,从没人教过的字里行间,自己长成了几何。用本书语言拆解:vking − vman 是「从男人指向国王」的差向量(第 02 章),它编码了「王权」这个语义位移;把同一支位移箭头平移到 woman 脚下(向量加法的平行四边形,第 02 章 Demo 亲手拖过的那个),落点附近站着 queen。语义关系被编码成了方向——「性别」是一个方向,「时态」是一个方向,「首都之于国家」是一个方向;类比推理变成了平行四边形补全。这就是第 02 章那句「意义住在相对位置里」的最高兑现,也是第 03 章「语义方向张成概念版图」在词汇世界的原型现场。
顺手给 embedding 空间做一次整体体检,两个已知的「亚健康」值得认识。各向异性:很多模型的词向量并不均匀铺满空间,而是挤在一个狭窄的锥形区域里——任意两个词的余弦相似度都偏高(全员「有点像」),相似度的分辨率被压缩。公共方向污染:头几个主成分(第 18 章)常常编码的是词频这类「非语义」信号,而非含义。两味药方都用旧工具配:减掉均值向量再去掉前几个主成分(all-but-the-top,第 17 章预告过),或训练时直接加各向同性正则。教训依然是第 13 章那句:模型不欠你一个好坐标系,用之前先体检、必要时先换基。
但要带着分寸感使用这个美丽的故事:它有 cherry-picking 成分——评测时通常要把输入词从候选里排除,不然最近邻常是原词自己;很多类比对根本不成立;现代上下文模型(BERT/GPT 一系)的词向量随语境变化,静态平行四边形不再直接适用。真正稳健的遗产是弱化版:语义的某些维度确实近似线性地编码在方向上——第 13 章 SAE 找「可解释方向」、生成模型隐空间的「老化方向」「眼镜方向」(第 03 章),都是这条遗产的当代继承人;可解释性研究甚至靠「在残差流里加减一支概念向量」来定向改变模型行为(activation steering):往里加一支「诚实方向」,模型的回答风格真的变得更直——平行四边形长大成人,从词汇玩具变成了对齐工具。
LoRA 只是「参数高效微调」(PEFT)家族的头牌,认一遍族谱,读文档不慌:Adapter——在层间插小型瓶颈网络(降维-激活-升维,第 12 章的窄走廊做成独立模块),鼻祖辈,缺点是推理多一跳;Prefix/Prompt Tuning——参数一个不动,只学几十个「虚拟 token」拼在输入前(把任务信息全塞进上下文的 KV 里);IA³——只学几支逐通道缩放向量(第 10 章对角兽,参数少到极致);DoRA——把 W 拆成「方向 × 模长」分别适配(第 05 章范数视角的变奏)。家族共同的哲学只有一句:预训练模型是一座已经建好的基空间,适配任务只需要在少数自由度上做文章——本书卷三的语言,是整个 PEFT 领域的官方语法。
模型算术:把整个模型当向量加减
量化还有一层「训练时就适应」的进阶(QAT,量化感知训练):前向用量化值、反向用直通估计,让模型在训练中就学会与粗刻度共存。移动端部署(第 20 章的 TFLite)几乎必经此路——你在 Android 上跑过的每个 int8 模型,都提前在这套课程里毕过业。
压轴一个会让你重新看待「参数」的操作。把微调前后的权重差 τ = W_after − W_before 叫做任务向量(task vector)——注意视角:七十亿个参数,拍平当作一支七十亿维的向量(第 02 章「一切皆向量」的极限运用)。惊人的实验事实:任务向量可以做算术!W + τ_法语 + τ_医学 得到一个既会法语又懂医学的模型(能力叠加);W − τ_毒性 让模型变得更无毒(能力遗忘,负号在第七十亿维依然是「反向」);两个 LoRA 补丁加权平均,风格随权重连续过渡(模型 merge 社区的日常)。为什么线性组合在如此非线性的对象上居然常常有效?严格解释仍是开放问题(与损失面的「线性模式连通性」有关——从同一个预训练起点出发的微调,倾向于停在同一片相连的盆地里,盆地内近似线性),但工程上它已经是开源社区合并模型的基础设施,Hugging Face 上大量「mergekit 出品」的模型就是这么炼的。向量、加法、方向——本书第一卷开篇的三个词,走到第七十亿维的尽头,依然是最有力的语言。这大概是「张成」二字最好的注脚。
LoRA 的气质像极了你熟悉的两样东西:差分更新(应用商店不重发整个 APK,只发 bsdiff 补丁——「大文件 + 小 diff」)和 resource overlay(RRO:不改 framework,叠一层资源覆盖包换主题)。量化则是移动端的老朋友:RGB888 换 RGB565、PCM16 换 8bit——「刻度变粗、观感几乎不变」的取舍你做过无数次,只是这次量的不是像素,是语义空间的坐标。连「多套 LoRA 热插拔」都能对上:同一个 App,不同渠道 overlay,一键换肤。
① r 不是越大越好:r 从 8 加到 128,参数翻 16 倍,效果常常只在误差棒里晃——内在维度就那么大,加宽走廊运不来更多货;先试 r=8/16,不够再说。② 量化后必须重新评测:困惑度掉 0.1 看着无害,特定能力(数学、代码)可能断崖——离群通道的伤是不均匀的;「量化无损」四个字永远要配「在哪些任务上」。③ embedding 算术别当产品逻辑:它是概率性的几何趋势,不是查询接口;拿它做 demo 惊艳,拿它上线要挨打。④ LoRA 挂在哪些矩阵上(只挂注意力?连 FFN 一起?)对效果影响不小——论文默认与最佳实践一直在漂移,以目标任务的实测为准。
① 4096×4096 的矩阵挂 r=16 的 LoRA,可训参数多少?占原矩阵的百分之几?
② 为什么 B 必须初始化为零而 A 不必?两个都零会发生什么(想想第 20 章的对称破缺)?
③ 用「谱读心术」设计一个实验,判断某个微调任务的内在秩大概是多少;
④ int4 量化把 16 个刻度分给一组权重,若组里混进一个比中位数大 50 倍的离群值,其余权重的有效分辨率还剩几个刻度?
⑤ τ_A + τ_B 的模型合并,什么情况下你预期它会失败?(提示:两个任务向量的夹角——第 04 章的老工具:近正交时能力互不干扰地叠加,强负相关时互相抵消,这正是实测中「任务冲突」的几何画像。)
⑥ 公司只有一张 24 GB 的卡,要微调 13B 模型出一个客服机器人——按本章三笔账,写出你的技术选型与理由。
小结:卷五收官
全量微调贵在「每个参数陪跑一套家当」;LoRA 冻结大象、并联 BA 羽毛,B 零初始化保开局无扰,推理可合并可热插拔,证据链(随机子空间、ΔW 的谱、梯度天生低秩)让「低秩够用」从假设变成测量结论;量化是粗刻度尺加恢复系数,离群通道是它的天敌,QLoRA 让两条省钱战线会师;king−man+woman 是差向量的平行四边形,分寸在于「方向性编码」真实而「算术接口」浪漫;任务向量把整个模型当第 70 亿维空间里的一支箭做加减。PEFT 全家族的语法是卷三,大系统的有效自由度天然偏低是跨学科的老规矩,embedding 空间用前该体检、必要时先换基。卷五五章,你从形状语言一路拆到了微调工业的地基——而所用的每一件工具,都在前十八章。最后一章,我们把这二十三章叠成一张随身地图,并回答最后一个问题:从这里出发,下一步去哪。