如果你只用 1800 万个参数就能微调一个 1750 亿参数的模型,达到和全量微调差不多的效果——你会不会觉得这听起来像个骗局?

故事从这里开始

2021 年前后,做 NLP 的人普遍在为一件事发愁:GPT-3 这类模型好用是好用,但一旦你想让它变成”客服机器人”、”法律助手”、”财报摘要器”——也就是针对某个具体任务做微调(fine-tuning)——就会撞上一个很现实的墙。

全量微调(full fine-tuning)意味着你要更新模型的每一个参数。GPT-3 有 1750 亿参数,每个参数在训练时都需要占用显存来存梯度、存 Adam 优化器的动量和二阶矩——这些”训练状态”加起来往往是参数本身占用显存的好几倍。更麻烦的是,如果你有 10 个不同的下游任务,每个任务都全量微调一遍,你就得存 10 份 1750 亿参数的完整模型副本。这不是”贵一点”的问题,这是”根本没法做”的问题——存储和部署成本直接爆炸。

于是行业里有人想了一堆”轻量级微调”的招——比如在每层之间插入一个小的额外模块(Adapter),冻住原模型,只训练这些小模块。这个思路对,但有个副作用:推理的时候,这些额外模块会实实在在地增加计算路径的长度,带来额外的延迟。就像给汽车加了个拖车,车能开但变慢了。

真正让人意外的转折,来自于一个几乎和微调工程”没什么关系”的理论问题:2020 年,Aghajanyan、Zettlemoyer 等人在研究”为什么微调这么容易”的时候,发现了一件反直觉的事——预训练模型看起来参数很多,但它们解决具体任务所需要的”自由度”其实低得惊人。他们做了个实验:把 RoBERTa 模型的微调,限制在一个只有 200 维的随机子空间里(相当于只给模型 200 个自由变量去调,剩下所有参数变化都被这 200 个数”代理”控制),结果在 MRPC 任务上,模型达到了全参数微调 90% 的效果。

200 个数,就能撬动一个上亿参数的模型。这个发现在当时更像是一个”科学趣闻”,直到微软的一个团队意识到:如果微调所需要的”信息量”这么小,那我们完全可以不用随机投影,而是学习一个专门为当前任务定制的、低维度但更聪明的更新方式。这就是 LoRA (Low-Rank Adaptation) 的起点。

三种微调范式的对比 全量微调 全部参数可训练 175B 参数全改 显存/存储爆炸 效果最好(理论上) Adapter 层 插入小模块+冻结原模型 参数量小 串行计算路径变长 推理有额外延迟 LoRA 低秩矩阵旁路+冻结原模型 参数量极小(<1%) 可与原权重合并 推理零额外延迟

核心概念 1:为什么”更新”可以是低秩的

问题是什么

先把问题讲精确一点。全量微调做的事情是:给模型的每一层权重矩阵 $W$(比如 attention 里的 $W_q$, $W_k$, $W_v$),找一个更新量 $\Delta W$,让新权重 $W + \Delta W$ 在下游任务上表现更好。$\Delta W$ 的形状和 $W$ 一模一样——如果 $W$ 是 4096×4096 的矩阵,那 $\Delta W$ 也是 4096×4096,里面藏着 1600 多万个独立的数。

问题来了:这 1600 万个数,真的都是”必要的自由度”吗?还是说,大部分的更新方向其实是冗余的,真正管用的变化只发生在一个很小的子空间里?

直觉:核心想法

想象你在调一台老式电视机的画面。电视机内部有几百个电路参数,理论上你可以逐个去调每一个电阻的阻值来”优化画质”。但实际上,任何一个有经验的维修工都知道:你真正需要调的,可能就是”亮度”、”对比度”、”色调”这三四个旋钮。电视内部那几百个参数的变化,大部分可以被这几个宏观旋钮的组合”代理”表达出来——只要你把旋钮和内部电路的映射关系设计对了。

LoRA 的赌注就是这个:下游任务需要的权重变化 $\Delta W$,可以被压缩表达成两个”瘦”矩阵的乘积。具体地,他们不直接学习一个和 $W$ 同样大的 $\Delta W$,而是学习:

\[\Delta W = BA\]

其中 $B$ 是 $d \times r$ 的矩阵,$A$ 是 $r \times k$ 的矩阵,而 $r$(称为”秩”,rank)远远小于 $d$ 和 $k$——论文里甚至发现,对 GPT-3 175B 来说,$r=1$ 或 $r=2$ 就够用了,而完整的维度 $d$ 高达 12,288。

翻译回人话:如果 $\Delta W$ 是一张 4096×4096 的巨型表格,LoRA 说”你不需要独立填这 1600 多万个格子,你只需要填两张瘦长的表——一张 4096×8,一张 8×4096——把它们乘起来,就能近似还原出你真正需要的那个更新方向。” 这就好比说,一张高分辨率照片理论上有几百万个像素点,但如果这张照片其实是一片渐变天空,你只需要几个参数(起始颜色、结束颜色、渐变方向)就能几乎完美地重建它——因为这张”照片”本身的信息量远低于它表面的像素数。

那为什么”任务需要的更新”恰好是低秩的?LoRA 论文自己给了两个层面的证据。第一层是理论继承:前面提到的 Intrinsic Dimension 研究已经证明,预训练模型解决下游任务所需要的”自由度”极低——预训练这个过程本身,相当于把模型”折叠”进了一个信息高度压缩的状态,越大越好的预训练模型,折叠得越充分,下游任务需要补充的信息反而更少。第二层是实证:论文对 GPT-3 175B 做了一个漂亮的实验——用不同的秩训练出两个更新矩阵 $A_{r=8}$ 和 $A_{r=64}$,然后对它们做 SVD(奇异值分解),比较 $r=8$ 学到的”方向”有多少已经被包含在 $r=64$ 学到的方向里。结果发现,增大 $r$ 并没有让模型发现更多”有意义”的新方向——$r=8$ 时找到的主要方向,几乎已经是 $r=64$ 版本里最重要的那些方向的子集。换句话说,任务真正需要调整的”方向数量”,天生就是个小数字,给再多的秩,模型也只是在这些同样几个关键方向上反复确认,而不是发现新大陆。

技术细节(选读)

具体的前向传播公式是这样的。原来一层的计算是 $h = Wx$。加上 LoRA 之后变成:

\[h = Wx + \Delta W x = Wx + BAx\]

初始化的技巧很关键:$A$ 用随机高斯初始化,$B$ 初始化为全零矩阵。这样在训练刚开始的那一刻,$BA = 0$,也就是说模型的行为和原始预训练模型完全一样——训练是从”零改动”平滑起步的,不会因为随机初始化的 $\Delta W$ 一开始就把模型的输出搞乱。

训练时,$W$ 全程冻结,只有 $A$ 和 $B$ 参与梯度更新和反向传播。这意味着:你不需要为 $W$ 计算梯度,也不需要为 $W$ 维护 Adam 优化器的动量项——这是显存节省的主要来源,而不仅仅是”参数少”这一点。

部署阶段还有一个几乎”作弊”般好用的性质:因为 $\Delta W = BA$ 和 $W$ 形状完全相同、都是简单的矩阵加法,你可以在推理前把它们直接加起来合并成一个新的权重矩阵 $W’ = W + BA$,然后彻底扔掉 $A$、$B$ 这两个”脚手架”。合并之后的模型在推理时和一个从头训练出来同等大小的模型完全一样——没有额外的层,没有额外的计算路径,零推理延迟。这一点是 LoRA 相比 Adapter 方案最实用的优势:Adapter 因为在网络中间插入了额外的串行计算模块,合并不掉,推理时永远要多算一遍;LoRA 因为设计成”加法式”的旁路,训练完可以合二为一。

核心概念 2:ΔW 到底在改什么

问题是什么

知道了”更新是低秩的”只是回答了”怎么做”,还没回答一个更深的问题:这个低秩的更新,具体在模型内部做了什么事?它是在”教模型新知识”,还是在做别的事?

直觉:核心想法

LoRA 论文做了另一个很聪明的实验来回答这个问题。他们拿训练好的 $\Delta W_q$(针对 query 权重矩阵的更新),和原始的 $W_q$ 做对比,想搞清楚 $\Delta W$ 学到的方向,跟 $W$ 里本来就存在的方向,是不是同一批东西。

结果发现了两件很关键的事。第一,$\Delta W$ 跟 $W$ 的相关性,确实比一个完全随机的矩阵要强得多——说明 $\Delta W$ 不是在”凭空发明”全新的表征,它是在原模型已经具备的”特征词汇表”里工作的。第二,更精细地看,$\Delta W$ 并不是简单地”重复”$W$ 里最强的那些方向(如果是这样,那微调就毫无意义,等于是把已经很强的信号再放大一遍,浪费精力),而是专门去放大那些在预训练阶段存在,但权重不高、没被重视的方向

用一个比喻理解:预训练模型就像一个博览群书但没有明确专长的人,他脑子里其实已经装着各种领域的零散知识——法律条文、编程语法、诗歌韵律,只是这些知识在他的”注意力分配”里权重都差不多,谁也不特别突出。微调这个人去做法律助手,并不是往他脑子里硬塞全新的法律知识,而是把他脑子里本来就存在、但一直被忽略的法律相关联想,调高音量。论文里给出了一个具体的数字:在 GPT-3 的第 48 层,这个”放大倍数”大约是 21.5 倍——原本很微弱的信号,被 LoRA 的更新放大了二十倍左右,变得在决策中举足轻重。

这个发现也顺带解释了为什么低秩就够用:如果任务需要的只是”调高音量”而不是”发明新乐器”,那你确实不需要一个和原模型同样复杂的更新——你只需要找准几个”哪里需要调高音量”的方向,给它们一个增益系数。这本质上是个”选择性放大”问题,而不是”从头构造”问题,选择性放大天然就是低维的操作。

技术细节(选读)

论文用了一个具体的度量方式来验证这个”放大”效应:分别计算 $|U^\top W_q V^\top|_F$,其中 $U, V$ 取自 $\Delta W_q$ 的顶部奇异向量方向、$W_q$ 自身的顶部奇异向量方向,以及一个随机矩阵的方向,三者对比。结果是:用 $\Delta W$ 的方向去”投影”$W$,得到的 Frobenius 范数远高于用随机方向投影——量化验证了”$\Delta W$ 的方向和 $W$ 里已存在但权重不高的成分高度重合”这个直觉。同时,$|\Delta W_q|_F \approx 6.91$ 相比 $|W_q|_F \approx 61.95$,更新的整体幅度大约只是原权重的十分之一左右——微调是一次”精细调音”,不是”重新谱曲”。

这意味着什么

把这两个发现放在一起看,LoRA 讲的其实是一个关于”知识如何被压缩和调用”的故事:预训练模型内部已经装了极其丰富的、被压缩存储的知识和能力,微调的本质工作,不是灌入新知识,而是找到一小组关键方向,把它们的”音量”调整到适合当前任务的水平。正因为这个调整任务本身维度很低,你才可以用两个瘦矩阵的乘积去表达它,而不需要动用和原模型同样多的自由度。

这也是为什么 LoRA 之后能长出这么多变体,每个都在这个”低秩假设”上做文章:

  • LoRA+ 发现原始 LoRA 有个隐藏的效率损失——$A$ 和 $B$ 两个矩阵用同一个学习率训练,在模型宽度很大时,其中一个矩阵会因为反向传播的尺度效应而”学得太慢”。解法很简单:给两个矩阵设不同的学习率(比例经过理论推导),同样的计算成本,能拿到 1-2% 的效果提升和接近 2 倍的训练加速。
  • DoRA 观察到一个更细的差异:全量微调改变权重时,可以自由地同时调整”方向”和”大小”,而 LoRA 的更新方式天生让方向和大小的变化被捆绑在了一起。DoRA 索性把权重拆成”大小”和”方向”两部分,大小直接学、方向用 LoRA 学,更贴近全量微调的灵活度,同时不牺牲效率。
  • QLoRA 走的是另一条路:既然 LoRA 已经让训练参数极少,那能不能把冻结的那部分基础模型也压缩一下?QLoRA 把基础模型量化到 4-bit(用一种专门为正态分布权重设计的 NF4 数据类型),同时保持可训练的 LoRA 部分在较高精度。这个组合直接把”在单张消费级显卡上微调 650 亿参数模型”变成了现实。
  • “错觉般的等价性”这篇分析则给这个乐观故事加了一道刹车:虽然 LoRA 和全量微调常常能达到相似的任务准确率,但它们改变权重的方式在几何上并不相同——LoRA 会在权重的奇异值分解里制造出一些全新的”闯入维度”(intruder dimensions),这些维度不存在于原始预训练权重里。这些闯入维度正是 LoRA “遗忘更少”的部分原因(改动被局限在一个狭小、不干扰主体结构的子空间里),但同一批闯入维度如果在连续多次做 LoRA 微调时不断累积,反而会成为伤害模型的来源。这提醒我们:参数少、效果好,不代表这个方法在数学上和全量微调是”同一件事”——LoRA 是一条不同的路,通向了相似但不完全相同的终点。

这条从”200 个随机数就能微调 RoBERTa”,到”一个学习出来的低秩矩阵能撬动 1750 亿参数”,再到”消费级显卡上微调 650 亿模型”的技术链条,本质上讲的是同一件事——大模型的知识密度远超它表面的参数数量,而学会调用这些知识,所需要动用的自由度,远远小于模型本身的规模。这也是整个参数高效微调(PEFT)领域存在的根本原因。

下一篇预告

这是”LLM 原理深度解析”系列迄今为止的第 48 篇。如果你对模型内部知识如何被压缩、存储和检索感兴趣,可以回顾本系列里关于”叠加态假说与多义性”(第 33 篇)和”知识蒸馏原理”(第 46 篇)的内容——它们和今天讲的 LoRA 低秩假设,共享着同一个更大的主题:大模型的能力,远比它字面上的参数数量更加”结构化”和”可压缩”,理解这种结构,正是今天高效训练、高效部署、高效解释大模型的关键钥匙。