概念科普 📅 2026-10-13 ✍️ MagicNetWorld 编辑部

LoRA 为什么只训练万分之一量级的参数就够用:把「内在维度」与低秩更新一步步讲清楚

很多人把 LoRA 理解成「省显存的穷办法」,以为它便宜、所以必然更弱。事实更像另一回事:预训练模型的「可改自由度」本来就远小于它的参数个数——Aghajanyan 等在 2020 年 12 月提交的实验里,只优化 200 个可训练参数(随机投影回全参数空间)就能在 MRPC 上拿到 RoBERTa 全参数微调 90% 的性能(这是 RoBERTa 上的另一套实验口径,与下面 GPT-3 175B 不是同一个模型、不是同一个量)。LoRA 把这个观察变成一条可实现的工程路径:冻结基座权重(这里指预训练好的那份原权重,不是「可训练参数」),只训练一对低秩矩阵 A、B,用「ΔW 等于(α 除以 r)乘 B 乘 A」表达改动。LoRA 论文的口径是:拿 GPT-3 175B(175B 是模型基数参数,不是可训练参数)对比 Adam 全量微调,可训练参数少 10,000 倍、显存需求降到约三分之一。本文用三段推导把「为什么够用、在哪儿不够用」讲清楚,并说明缩放因子为什么该是 1 除以根号 r、而不是 1 除以 r。

LoRA参数高效微调PEFT数学推导微调

想象你接手了一栋已经盖好的大楼,现在要把其中几间房改成实验室。你不会拆掉承重墙重盖一遍,也不会把每一面墙都刷一遍漆——你只会按一张图纸,动几处关键的结构。

微调一个预训练大模型,本质上也是这件事:真正需要改的「自由度」,远小于这栋楼里砖块的总数。砖块的数量叫参数量,图纸上那几处要动的位置,才是「微调真正要学的东西」。

这篇文要回答的正是那个最常被跳过的问题:LoRA(Low-Rank Adaptation,低秩适配,一种「只训练极少量新增参数」的微调方法)凭什么只用原来万分之一量级的可训练量(这是 GPT-3 175B 对 Adam 全量微调的口径,单层尺度可以比它大一个数量级,见 3.1 节),就能把一个大模型适配到新任务上?

先说结论:这不是一个「便宜所以更弱」的替代品,而是因为预训练已经把要改的方向压得很集中。往下分三段推导——① 要改的自由度有多大;② 低秩为什么够;③ 梯度怎么流、缩放怎么定——最后给出边界与一个可以自测的判据。

一、先给直觉:要改的「自由度」远小于参数个数

1.1 第一个反直觉的实验

先做个思想实验。假设某模型的权重是一张 1000×10001000\times1000 的表格,总共一百万个数字。

全量微调(full fine-tuning,把模型里每一个数字都当成待学习的变量去调)的做法是:把这一百万个数字全都交给梯度下降。

LoRA 的做法是:承认「我们真正想做的改动」可能有结构,于是只用两个小表格相乘来生成这百万个数字:

  • 一个小表格 BB 尺寸 1000×r1000\times r
  • 一个小表格 AA 尺寸 r×1000r\times1000

如果 rr 取 8,那么待学习的数字只有 8×(1000+1000)=160008\times(1000+1000)=16000 个,是一百万的 1.6%(本文示意例子的比值,不是任何真实模型的口径)。

而如果 rr 只能取到 8 就够用,那说明这张大表其实不需要一百万维的自由度——多出来的那些自由度,是预训练阶段用掉了、微调阶段用不着的。

更准确地说,这不是「少动几处」的问题,而是「改动本身有规律」:整栋楼的新用途可以被压缩成一张只有几千个数的小图纸,你不必逐块砖去决定。

顺带把两个容易被混读的数字就地分开:参数量是模型里数字的总个数,动辄千亿;可训练参数是微调时真正会被更新、被优化器记住梯度的那部分,在 LoRA 里只有两个小矩阵,可以少到基座参数的千分之几(在 GPT-3 175B 的口径下约万分之一)。后文每次提到「少 10,000 倍」这类比例时,比的是可训练参数,不是总参数量。

1.2 这不是本文的猜测,有直接测量

Aghajanyan、Zettlemoyer 与 Gupta 在 2020 年 12 月提交的《Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning》(arXiv:2012.13255)里做了直接测量:把全参数空间随机投影到一个只有 d90d_{90} 维的子空间,只在这个子空间内做微调。

这里的 d90d_{90} 是他们定义的内在维度(intrinsic dimension:达到接近全参数微调性能所需的最小可训练子空间维数,下标 90 表示取到全参数性能 90% 所需的那一维)。

他们的结论是:常见预训练模型的内在维度非常低。例如对 RoBERTa,只优化 200 个可训练参数(再由一个固定的随机投影映射回全参数空间),就能在 MRPC(GLUE 中的释义判定任务:判断两句话是不是同一个意思)上达到全参数微调 90% 的性能。

同一个实验里还有两个更反直觉的观察:

  1. 预训练在隐式地压低内在维度——也就是「预训练学到了一个更容易被改的表示」;
  2. 在固定的预训练更新步数下,模型越大,内在维度越低。

第二条尤其值得注意:它正好解释了为什么「越大的模型,用越少的可训练参数就能适配」。不是大模型更容易被改,而是它学到的表示更「压缩」。

1.3 为什么这件事值得现在看

因为工程上真正的成本大头,已经不是「能不能微调」,而是「用什么代价同时服务很多个微调版本」。

全量微调每个任务产出一份与基座同大小的权重;LoRA 每个任务只产出一对几十 MB 级的小矩阵。这一个差别决定了后面所有部署形态——多任务切换、边缘侧微调、把微调版本的更新当作可审计的小文件来管理,全都建立在这条性质上。

这一节想让你记住的一件事:「参数量」和「需要被改的自由度」是两个量;前者可以很大,后者可以很小,而 LoRA 吃的就是后者。

1.4 一条时间线:这件事是怎么被一步步讲清的

把本文引用的一手材料按提交时间排开,能看清这条线索是一步步收紧的:

时间材料它把哪一步讲清了
2020-12arXiv:2012.13255先证明「要改的自由度其实很小」
2021-06arXiv:2106.09685把低秩改动做成可用的工程方法
2023-03arXiv:2303.10512预算不该均匀撒,要按重要性分配
2023-05arXiv:2305.14314基座再压到 4 位,显存再降一档
2023-11arXiv:2312.03732缩放要与秩解耦,否则高秩学不动
2024-02arXiv:2402.09353把权重拆成幅度与方向两部分
2024-05arXiv:2405.09673明确它学得少、也忘得少

表里的时间按各论文 arXiv 页面上的提交历史填写(其中 rsLoRA 的实际提交日是 2023-11-28,其编号按公告批次归入 2023-12),不是二手转述。它说明的是一个方向在两年多的时间里,从「能不能用」走到了「怎么用对」。

二、符号约定:把「权重改动」写成一个低秩矩阵

科普文最怕符号一上来就糊。这一节把全文要用的记号一次性定清楚,后面不再重定义。

2.1 前向计算与「冻结」

一层线性变换(比如 Transformer 里的一个投影层)的前向计算是:

h=W0xh = W_0 x

这里 xx 是该层的输入向量、hh 是输出向量,W0∈Rd×kW_0\in\mathbb{R}^{d\times k} 是预训练好、之后会被冻结的原权重(本文一律称「基座权重」)。

所谓冻结(freeze),就是这一层的反向传播不更新 W0W_0 里的任何数字:它照常参与前向与反向计算,但优化器不会为它累积梯度、也不会写回新值。

2.2 两种改法

全量微调学的是一个与 W0W_0 同形状的改动量 ΔW\Delta W:

W=W0+ΔW,ΔW∈Rd×kW = W_0 + \Delta W,\qquad \Delta W\in\mathbb{R}^{d\times k}

于是待学习参数就是 d×kd\times k 个,和原权重一样多。

LoRA 的改写只动 ΔW\Delta W 的表达方式:它不去直接学一个 d×kd\times k 的大矩阵,而是学两个瘦长的小矩阵,让它们的乘积充当 ΔW\Delta W:

ΔW=αr BA,B∈Rd×r,A∈Rr×k,r≪min⁡(d,k)\Delta W = \frac{\alpha}{r}\,B A,\qquad B\in\mathbb{R}^{d\times r},\quad A\in\mathbb{R}^{r\times k},\quad r\ll\min(d,k)

其中:

  • rr 叫秩(rank,就是两个小矩阵中间那个共同的维度,它钉死了 ΔW\Delta W 的秩上界);
  • α\alpha 是一个与 rr 无关的缩放超参数,两矩阵乘积后统一乘 α/r\alpha/r。

2.3 初始化里的一个关键规定

初始化有一条不成文但很关键的规定:AA 用随机小值初始化,BB 初始化为全零。

这样训练的第一步 ΔW=(α/r)BA=0\Delta W=(\alpha/r)B A=0,模型的前向行为与「什么都没改」完全一致——起点是安全的,不会一开训就把基座能力打坏。第四节的推导会说明,这条规定还顺手解决了一个更隐蔽的问题:它决定了训练第一步究竟是谁在动。

2.4 三个用词的澄清

中文语境里常把 W0W_0 叫「原始权重」、把 AA、BB 叫「新增权重」,还常把「参数」与「可训练参数」混着说。为了后文不歧义,这里固定三个用词:

  • 基座权重:W0W_0,预训练产出,全程冻结;
  • 可训练参数:优化器真正会更新并保存历史状态的那些数字,LoRA 里只有 AA、BB 的 r(d+k)r(d+k) 个;
  • 秩:rr,一个整数,不是矩阵的实际秩,而是 ΔW\Delta W 允许达到的秩上界。

这一节想让你记住的一件事:LoRA 不是换了个模型,而是换了个「改动量」的参数化方式;基座不变,改动的秩被钉死在 rr 以内。

2.5 一张图说清两种改法的差别

flowchart TD
  X["输入 x"] --> W0["基座权重 W0(d×k,冻结)"]
  W0 --> H["输出 h"]
  W0 --> F1["全量微调:学 d×k 个改动量"]
  W0 --> F2["LoRA:只学 A 与 B"]
  F2 --> A["A:r×k,随机初始化"]
  F2 --> B["B:d×r,零初始化"]
  A --> M["ΔW = (α/r) B A"]
  B --> M
  M --> MG["合并回基座:W = W0 + (α/r) B A"]
  MG --> H

这张图说明了什么:两条路径的目标完全相同(都要让这一层的输出变好),区别只在「改动量由多少个数字决定」——全量微调让每个数字独立可学,LoRA 强制改动量落在一个由 rr 控制的低维曲面上;而由于乘积可以事先算好,合并之后的推理路径与没加 LoRA 时一模一样。

三、为什么低秩够用:先数参数,再看秩的约束

3.1 参数量到底省了多少

对单层做一次确切的计数。全量微调的可训练量是 dkdk;LoRA 是 r(d+k)r(d+k)。两者之比是:

r(d+k)dk=r(1k+1d)=rd+rk\frac{r(d+k)}{dk}=r\left(\frac{1}{k}+\frac{1}{d}\right)=\frac{r}{d}+\frac{r}{k}

当 d=kd=k 时它退化成 2r/d2r/d。

举一个具体但必须标明性质的例子(下面是本文自己代的数,只做量级检查,不是任何官方数值):取 d=k=4096d=k=4096、r=8r=8,则 2r/d=16/4096≈0.39%2r/d=16/4096\approx0.39\%(单层口径)。

注意这 0.39% 是这一层的比例,不是整模型的比例:只有当你给每一层的同一组投影都加 LoRA 时,整模型比例才与单层同量级(见第七节第 5 条);只挑部分层、或目标模块不同,总比例会差一个量级,必须重算。

LoRA 论文给出的整体口径是:相对 GPT-3 175B 用 Adam 做全量微调,LoRA 把可训练参数减少 10,000 倍、把显存需求降到约 三分之一(这是论文摘要口径;再次提醒 175B 是模型的基数参数,不是可训练参数,看到这两个数字并排时不要混读)。

3.2 为什么「秩小」不是随便砍的

要让论证站得住,得回答一个更硬的问题:为什么改动量天然是低秩的,而不是「被迫低秩所以必然损失能力」?

先看低秩这条路能表达什么。所有秩不超过 rr 的 d×kd\times k 矩阵构成一个集合,这个集合的维数是:

dim⁡{ΔW:rank⁡(ΔW)≤r}=r(d+k)−r2\dim\left\{\Delta W:\operatorname{rank}(\Delta W)\le r\right\}=r(d+k)-r^{2}

推导思路是这样的:把 ΔW\Delta W 写成 BAB A 之后,BB、AA 一共 r(d+k)r(d+k) 个自由数;但存在一种「重参数化冗余」——在中间插一个可逆的 r×rr\times r 矩阵 TT,取 B′=BTB'=BT、A′=T−1AA'=T^{-1}A,乘积不变,这种冗余恰好对应 r2r^{2} 个自由度;两者相减即得上式。

这个式子的含义是:秩约束不是把可达集合压成一条线,而是一个维数为 r(d+k)−r2r(d+k)-r^{2} 的光滑曲面。当 rr 从 1 升到 8,这个曲面的维数会迅速上升;一个 4096×40964096\times4096 的矩阵,r=8r=8 时光是这张曲面就有约 8×8192−64=654728\times8192-64=65472 维。

任务需要的那部分改动,如果落在这张曲面上,就没有任何损失;问题只剩「它会不会落在曲面上」,而第一节的内在维度测量给出的答案是:通常会。

3.3 低秩的表征能力:来自论文的实验

低秩的表征能力还有一个更具体的证据。

LoRA 原论文对「秩该取多大」给了两类证据。第一类是子空间相似度:论文用基于 Grassmann 距离的归一化相似度,比较不同秩学到的更新子空间之间的重叠程度(论文附录 G 给了形式化定义),用来回答「小秩学到的方向是不是已经覆盖了大秩学到的那些」。第二类是换目标矩阵类型:论文第 7.1 节对照了在注意力里适配不同类型权重矩阵的效果,而默认配置只改查询与值两个投影。

这两类证据的具体形态是:论文在 GPT-3 175B 上固定 18M 的可训练预算(FP16 约 35MB),对照不同权重类型的组合(例如只适配一种注意力权重时对应 r=8r=8);并观察到秩 8 与秩 64 学到的方向最有用,其余方向「potentially contain mostly random noises accumulated during training」,由此得出「适配矩阵确实可以是极低秩」的结论。

也就是说,真正在起作用的更新方向,比矩阵形状允许的上界小得多。本文下面把「实际起作用的更新方向个数」称作更新方向数——这是一个描述性说法、不是论文里的量名;论文用的量名是子空间相似度。

一个可以直接观察到的推论是:如果你均匀地给每个目标矩阵都配上很大的秩,多出来的那些自由度大部分只是在拟合噪声与随机性,而不是在学任务。

3.4 和其他参数高效微调的路线比一比

LoRA 不是唯一的「少训练一点」的方案。把常见路线放在一起看,会更容易理解它的取舍(每条都给一句话定义):

  • Adapter(适配器层,arXiv:1902.00751):在 Transformer 层之间插入小的瓶颈网络(先降维再升维),只训练这部分;缺点是增加了层数,推理路径变长。
  • Prefix / Prompt Tuning(前缀微调,arXiv:2101.00190):在输入或每层前面拼上一段可训练的虚拟 token 向量(token = 文本被切分后的最小单位),只训练这些向量;缺点是占用了上下文长度。
  • BitFit(偏置微调,arXiv:2106.10199):只训练所有偏置项,其它一律冻结;参数极少,但表达能力也最受限。
  • LoRA(低秩适配):改动量写成两个小矩阵的乘积;可以合并回基座,因此不改变推理路径。

LoRA 论文摘要把「不像适配器那样引入额外推理延迟」明确列为优点之一,这正是「改动量可合并」带来的直接结果。用一句话概括这条取舍:能不能把改动量写成矩阵加法,决定了它能不能在推理时消失。

3.5 LoRA 与「全量微调」的差距从哪来

有实证对照要说清。2024 年 5 月提交的《LoRA Learns Less and Forgets Less》(arXiv:2405.09673)在编程与数学两个目标域上,把 LoRA 与全量微调做了系统对比,覆盖两种数据规模:约 10 万条 prompt-response 对的指令微调,以及 200 亿 token 的继续预训练。

结论有两条,方向相反,都要记住:

  • 在标准低秩设置下,LoRA 明显不如全量微调;
  • 但 LoRA 对目标域之外的任务保持得更好(也就是忘得更少)。

论文还给出一个可解释的机制线索:全量微调学出的扰动,其秩比典型 LoRA 配置高 10 到 100 倍。

论文的另一组对照更尖锐:在继续预训练(CPT,即在无标注语料上接着训练)的设置下,即使把秩抬到 256、并适配全部目标矩阵,最好的 LoRA 仍然明显低于全量微调——论文报告在代码域的 HumanEval 上,该配置 4 个 epoch 时约 0.407,而全量微调 2 个 epoch 已到约 0.464、8 个 epoch 峰值约 0.497(论文正文口径,本文只引用其相对关系)。

这两条合起来,比「LoRA 就是弱一点」这种笼统说法有用得多:差距的尺度与任务的「偏移距离」有关。任务越是对准基座已经会的东西(格式、风格、某个领域的问答),低秩曲面越够用;任务要求模型学会一门新「语言」(比如大量代码或数学符号的分布),改动量需要的更新方向数就会顶到基座需要重排表示的层级,低秩曲面装不下。

3.6 一个可以自测的判据

把上面几节收成一条工程判据,方便你在自己的场景里先做判断:

  • 如果微调目标可以描述成「改变输出风格、格式、领域词汇偏好」——低秩几乎必然够用;
  • 如果目标可以描述成「让模型掌握一套它现在不熟的符号系统或推理步骤」——先假设低秩不够用,用一个小规模对照(同数据、同步数,只改秩)实测差距;
  • 如果差距在验证集上随秩增大持续下降、没有收敛迹象,那说明需要的更新方向数顶到了曲面外——此时正确的动作是抬秩、放宽目标矩阵范围,或退出 LoRA 走全量微调。

这一节想让你记住的一件事:低秩够用,是因为预训练已经把「要改的方向」压得很集中;一旦目标域要求重排表示,低秩就开始漏东西——这不是实现细节问题,是秩上界本身的限制。

3.7 省参数不是只有低秩一条路

最后补一句坐标感:把「让微调变便宜」这件事拆开,至少有三条彼此独立的轴,LoRA 只占了其中一条。

  • 减少可训练量的维度(LoRA、Adapter、BitFit):少学一些数字;
  • 降低数值精度(QLoRA、8 位与 4 位优化器状态):每个数字少占一些字节;
  • 减少参与更新的层(冻结大部分层、只调最后若干层):少走一些路。

这三条可以叠加(QLoRA 就是第一条加第二条),也各有代价:精度轴的代价是数值误差,层数轴的代价是适配上限。有了这个坐标,就不会把「LoRA 效果不如全量微调」当成实现得不好——它只用了「减少可训练量」这一条轴,代价是放弃了另外两条轴能提供的余地。

这一节想让你记住的一件事:省参数有三条彼此独立的轴,LoRA 只是其中一条;选方案时先问自己「我缺的是哪一条」。

四、推导:梯度怎么流、缩放为什么该是根号 r

4.1 第一步:梯度在 A、B 上怎么落

设上游传回到这一层的梯度(对改动量的偏导)记作 G=∂L/∂(ΔW)∈Rd×kG=\partial L/\partial(\Delta W)\in\mathbb{R}^{d\times k}。

把 ΔW=(α/r)BA\Delta W=(\alpha/r)BA 代进去,用链式法则分开求:

∂L∂B=αr GA⊤,∂L∂A=αr B⊤G\frac{\partial L}{\partial B}=\frac{\alpha}{r}\,G A^{\top},\qquad \frac{\partial L}{\partial A}=\frac{\alpha}{r}\,B^{\top} G

第一个要看到的事实:由于 BB 初始化为全零矩阵,训练第一步里

∂L∂A=αr B⊤G=0\frac{\partial L}{\partial A}=\frac{\alpha}{r}\,B^{\top}G=0

也就是说 AA 一动不动;而 ∂L/∂B=(α/r)GA⊤\partial L/\partial B=(\alpha/r)GA^{\top} 一般不为零,BB 会先动。

这不是 bug,而是一个有意的设计:它打破对称性。

如果 AA、BB 都从随机值起训,两者关于乘积是对称的,梯度会先把它们拉平,学到的更新方向带有初始化随机成分;让其中一个从零起步,等于规定「第一个被解锁的方向由下游梯度通过固定的 AA 决定」。

4.2 第二步:B 动起来之后,A 学到什么

一旦 BB 变成非零,∂L/∂A=(α/r)B⊤G\partial L/\partial A=(\alpha/r)B^{\top}G 就活了。这一步的含义值得单独说:AA 的梯度是「下游梯度经 BB 的列空间过滤之后再决定的方向」。

具体地,B⊤GB^{\top}G 把 dd 维的输出侧梯度压到 rr 维的中间空间里——这正是 LoRA 的「瓶颈」在工作:它只允许那些能被 BB 的 rr 个方向解释的梯度,传到 AA 上去。

反过来说也成立:如果某个方向对任务很重要,但 BB 目前完全没有覆盖它,那么这一轮更新里 AA 不会往那个方向走。这是「低秩」在 训练动力学层面(而不只是表达能力层面)的真实代价——秩不但限制了能表示什么,也限制了每一步能往哪儿走。

4.3 第三步:为什么 α/r\alpha/r 会让大秩「学得慢」

这一段是本文的推导,不是转述论文证明。它要回答的问题是:ΔW\Delta W 前面的系数写成 α/r\alpha/r 时,把 rr 调大究竟发生了什么?

本文的简化假设(明确列出):使用 Adam 系优化器(一种按梯度历史自适应缩放每个参数步长的优化器)时,每个可训练参数每步的更新幅度大致同尺度,记作 η\eta——Adam 会把每维梯度按自身历史缩放,所以「每个参数一步走多远」基本与梯度绝对值无关;再假设 AA、BB 各元素近似独立同分布。

看一步更新对 ΔW\Delta W 的贡献:

Δ(ΔW)≈αr(ΔB A+B ΔA)\Delta(\Delta W)\approx\frac{\alpha}{r}\left(\Delta B\,A+B\,\Delta A\right)

先算第一项(训练启动时 B=0B=0,只有它能起作用):

E∥αrΔB A∥F2=(αr)2E∥ΔB A∥F2\mathbb{E}\left\|\frac{\alpha}{r}\Delta B\,A\right\|_F^{2}=\left(\frac{\alpha}{r}\right)^{2}\mathbb{E}\left\|\Delta B\,A\right\|_F^{2}

把 ΔB A\Delta B\,A 的第 (i,j)(i,j) 个元素展开:∑lΔBilAlj\sum_{l}\Delta B_{il}A_{lj},两边取期望并利用各维独立:

E(∑lΔBilAlj)2=∑lE[ΔBil2]Alj2=η2∥A⋅j∥2\mathbb{E}\left(\sum_{l}\Delta B_{il}A_{lj}\right)^{2}=\sum_{l}\mathbb{E}\left[\Delta B_{il}^{2}\right]A_{lj}^{2}=\eta^{2}\left\|A_{\cdot j}\right\|^{2}

再对 i=1…di=1\dots d、j=1…kj=1\dots k 求和,得到:

E∥ΔB A∥F2=d η2∥A∥F2\mathbb{E}\left\|\Delta B\,A\right\|_F^{2}=d\,\eta^{2}\left\|A\right\|_F^{2}

最后代入 AA 的元素方差 σ2\sigma^{2}(有 E∥A∥F2=rkσ2\mathbb{E}\left\|A\right\|_F^{2}=rk\sigma^{2}):

E∥Δ(ΔW)∥F2=(αr)2d η2 rk σ2=α2r dk σ2η2\mathbb{E}\left\|\Delta(\Delta W)\right\|_F^{2}=\left(\frac{\alpha}{r}\right)^{2}d\,\eta^{2}\,rk\,\sigma^{2}=\frac{\alpha^{2}}{r}\,dk\,\sigma^{2}\eta^{2}

于是 ∥Δ(ΔW)∥F∝α/r\left\|\Delta(\Delta W)\right\|_F\propto\alpha/\sqrt{r}。

结论很干净:在 α/r\alpha/r 的写法下,秩越大,每一步对 ΔW\Delta W 的实际移动量越小(按 1/r1/\sqrt{r} 收缩)。这就解释了为什么实践里「把 rr 调大但效果不见涨,甚至更差」——不是容量不够,而是步子被自己的缩放压小了。

4.4 论文的结论与本文推导的关系

上面那步一阶推导,正好对上 2023 年 11 月 28 日提交、编号按公告批次归入 2023-12 的 rsLoRA(arXiv:2312.03732)。它的摘要明确说:把适配器除以秩会导致高秩 LoRA 学习变慢、性能受限,并证明应当除以秩的平方根;改用正确的缩放之后,可以用更大的秩去换更好的微调性能,而推理计算成本不变。

需要明确区分的是两者的地位:论文给出的是证明;本文给出的是在「Adam 每参数步长同尺度」这一假设下、只算启动第一步的一阶估算,它给出同一个 α/r\alpha/\sqrt{r} 的函数形状,可以作为量级一致性检查,但不能当作对论文证明的复述或替代。

4.5 一个容易犯的错:把缩放和真实学习率混为一谈

α\alpha 与优化器的学习率 η\eta 是两个独立的旋钮,这一点在排查「LoRA 训不动」时最关键:

  • 调 α\alpha 改的是改动量的尺度(以及由 4.3 推出的、随秩变化的缩放行为);
  • 调 η\eta 改的是每个参数的步长。

很多人遇到「加大秩反而更差」,第一反应是加大学习率;按 4.3 的结论,更对症的动作是把缩放从 α/r\alpha/r 换成 α/r\alpha/\sqrt{r},让步长尺度与秩解耦——否则你会用学习率去补偿一个本该由缩放承担的、随秩变化的因子。

4.6 训练到部署的完整链路

flowchart LR
  G["上游梯度 G"] --> B["B 先更新:∂L/∂B = (α/r) G Aᵀ"]
  B -->|"B 变为非零之后"| A["A 随后更新:∂L/∂A = (α/r) Bᵀ G"]
  A --> W["ΔW = (α/r) B A 逐步成形"]
  W --> CK{"训练结束"}
  CK -->|"合并"| M["W = W0 + (α/r) B A:推理结构不变"]
  CK -->|"不合并"| K["保留适配器:可多任务切换"]

这张图说明了什么:整个 LoRA 训练过程就是「先解锁 B、再由 B 过滤出 A 该走的方向」;而训练结束之后,改动量是继续以适配器形式挂着、还是乘好加回基座,是一个部署形态选择,两者在数学上是同一件事。

这一节想让你记住的一件事:AA 从随机、BB 从零的初始化规定了第一步谁动;缩放因子决定了随着 rr 变大步子会不会被压小——写 α/r\alpha/r 会,写 α/r\alpha/\sqrt{r} 不会。

五、工程含义:把每个旋钮讲清楚

5.1 加在哪些层

LoRA 论文只改注意力部分的权重,默认配置是把低秩矩阵加在查询(Wq)与值(Wv)两个投影上;论文另外对照了适配更多权重矩阵类型的效果,但那不是默认设置——原文明确写「We limit our study to only adapting the attention weights」。

这个选择本身就是「预算是稀缺的」这一事实的体现:给哪些矩阵加、加多大秩,是一个分配问题,而不是「多多益善」。

5.2 秩取多大

秩的经验区间大致在 8 到 64(这是社区经验的量级,不是论文给出的规律)。

结合 4.3 的推导,秩不是越大越好:在 α/r\alpha/r 的口径下,加大秩会同时带来「表达能力上升」与「每步移动量下降(按 1/r1/\sqrt{r} 收缩)」两个相反的效应。这也是 2023 到 2024 年间一批「怎么调缩放、怎么分配预算」工作的出发点。

实操建议只有一条:先在小规模上做秩的对照(同数据、同步数、只改 rr,并同时把缩放口径固定住),看验证集是否还在随秩上升。若已经收敛,继续加秩只是增加显存。

5.3 预算分配:不要均匀撒

AdaLoRA(arXiv:2303.10512,2023 年 3 月提交)给了更系统的答案:它把增量更新写成奇异值分解(SVD,把一个矩阵拆成「旋转—缩放—旋转」三段的分解)的形式,按重要性打分自适应地把参数预算分配在不同的权重矩阵之间,从而允许「重要的矩阵多给秩、不重要的少给甚至不给」;论文报告在低预算设置下相对均匀分配有更明显的改进。

换句话说:均匀地给每一层配同样的秩,本身就带着浪费。

5.4 量化基座:QLoRA 的三项技术

如果基座权重本身也用低精度存,显存又能再降一档。QLoRA(arXiv:2305.14314,2023 年 5 月提交)的摘要口径是:可以在一张 48GB 的 GPU 上微调 65B 参数的模型,同时保持 16 位全量微调的任务性能。它由三件事组成:

  1. 4-bit NormalFloat(NF4):一种为「近似正态分布的权重」设计的 4 位数据类型,论文声称它在信息论意义上对这种分布是最优的(即在相同比特数下,对正态分布权重的表示误差最小);
  2. 双重量化(double quantization):量化「量化常数」本身,从而再省一层固定开销(下面给一个本文自算的量级);
  3. 分页优化器(paged optimizers):把显存峰值导致的溢出交给统一内存管理(统一内存 = CPU 与 GPU 之间可自动迁移的统一地址空间),避免训练中途因为一次显存尖峰而崩掉。

双重量化省下多少,可以自己算。假设 NF4 把权重按每 64 个元素一块分块,每块需要一个缩放常数;若该常数用 32 位浮点存,开销是 32/64=0.532/64=0.5 比特/参数。再把缩放常数本身按每 256 个「第一级常数」一块、用 8 位量化——注意这一级要摊到 64×25664\times256 个参数上,因此开销是:

864+3264×256=0.125+0.002=0.127\frac{8}{64}+\frac{32}{64\times256}=0.125+0.002=0.127

即从 0.5 比特/参数降到约 0.127 比特/参数,节省约 0.375 比特/参数;换算到 65B 基数参数,量级约为 3GB 的显存节省。QLoRA 论文正文给出的口径是双重量化平均节省 about 0.37 bits per parameter(approximately 3 GB for a 65B model),与上式同一量级(本文算术为自算,假设为「64 元素分块 + 256 元素二次分块、第二级常数 32 位」)。

5.5 训练完之后怎么合并回去

这是 LoRA 相对「适配器层」这类方案最实用的一点:训练结束后,把 AA、BB 乘起来加回基座即可,推理时与「从没加过 LoRA」的模型结构完全一致:

Wmerged=W0+αrBAW_{\text{merged}}=W_0+\frac{\alpha}{r}BA

于是推理没有任何额外延迟。代价是放弃了一点灵活性:合并以后就回不到「一份基座 + 多个可切换适配器」的状态;要并行服务多个任务,得保留未合并的适配器并在推理时切换(这属于部署形态的选择,不是精度问题)。

5.6 实操清单

把前面几节的结论收成一张按顺序执行的清单:

  1. 先确认基座就是你要长用的那一份(LoRA 不改变基座,换基座等于重训);
  2. 选目标模块:默认用查询与值两个投影,需要更强适配时再扩到更多权重矩阵类型;
  3. 选秩:从小到大扫(如 8、16、32),同时把缩放口径固定,避免把两个变量一起动;
  4. 定 α\alpha:把它当作「改动量尺度」的旋钮,与优化器学习率分开调;
  5. 若显存不够:先上 4 位基座(QLoRA),再考虑减小秩或缩短序列;
  6. 训练结束按部署形态二选一:合并(单任务、最省)或保留适配器(多任务切换);
  7. 上线前核对一遍:合并后的权重与「基座 + 适配器」两次前向输出应当一致(这是一条便宜的自检)。

5.7 常见坑

  • 坑一:把「秩」当作质量旋钮一直往上加。 症状是高秩反而不涨点甚至掉点;按 4.3 的推导,先检查缩放口径,而不是先加大学习率。
  • 坑二:把 α\alpha 与学习率当成同一个东西。 症状是两个一起调、永远说不清哪一个起作用;按 5.6 第 4 条,分开调、分开记录。
  • 坑三:合并之后才发现要在多任务间切换。 症状是重复训练;对策是先想清楚部署形态再决定是否合并。
  • 坑四:拿「单层参数占比」当成「整模型参数占比」去对外汇报。 症状是数字差一个量级——单层口径只在「所有层、同一组投影都加 LoRA」时才与整模型同量级(见 3.1 节与第七节第 5 条),对外引用一律以论文的整体口径为准。
  • 坑五:在小数据上过拟合。 低秩本身是一种很强的正则化,容易让人误以为「不会过拟合」;参数少不等于泛化好,验证集仍必须看。

5.8 对照表

方案可训练量相对全量微调的质量推理额外开销关键机制
全量微调全部参数基准无(但每任务一份完整权重)直接学 ΔW\Delta W
LoRAr(d+k)r(d+k)同量级或更好;域偏移大时明显偏弱无(可合并)ΔW=(α/r)BA\Delta W=(\alpha/r)BA
rsLoRA与 LoRA 相同高秩设置下更好无(可合并)缩放改为 α/r\alpha/\sqrt{r}
AdaLoRA同量级预算低预算下更好无(可合并)SVD 参数化 + 重要性分配预算
DoRA略高于 LoRA论文报告一致优于 LoRA无把权重拆成幅度与方向分别更新
QLoRA与 LoRA 相同论文称保持 16 位全量微调水平无(可合并;基座为 4 位)NF4 + 双重量化 + 分页优化器

DoRA 的口径来自 arXiv:2402.09353 摘要:把预训练权重分解成幅度与方向两部分,方向部分用 LoRA 更新,论文报告在 LLaMA、LLaVA、VL-BART 上一致优于 LoRA,且没有额外推理开销。

这一节想让你记住的一件事:LoRA 的旋钮只有四个——加在哪几层、秩多大、缩放怎么定、基座是否量化;其余看起来复杂的东西(SVD 分配、幅度方向分解)都是在回答「预算怎么分才不浪费」。

六、边界与未解

把结论的适用范围逐条编号,避免把「常用」读成「总是对」。

  1. 任务相关性边界:低秩够用的前提是「要改的方向本来就集中」。编程与数学这类要求重排表示的域,标准低秩设置会明显不如全量微调(arXiv:2405.09673 的对照),此时应优先考虑提高秩、放宽可训练范围,或干脆全量微调。
  2. 秩的选择仍是经验:论文给出的是「小秩学到的更新子空间与大秩高度重叠」这类子空间相似度观察,以及「换目标矩阵类型」的对照实验,并没有给出「任何任务取多少 rr」的公式;3.2 节的维数公式只说明可达集合有多大,不说明你的任务需要多少。
  3. 缩放因子有理论解,但假设是理想化的:4.3 节的推导建立在「Adam 每参数步长同尺度、AA、BB 元素独立同分布」之上,只覆盖启动第一步;论文对 α/r\alpha/\sqrt{r} 的证明更严格,本文的推导只能作为量级一致性检查。
  4. 「学得少」与「忘得少」是同一个原因的两面:LoRA 限制改动量的秩,所以它对新域学得浅,同时也不容易破坏基座的其它能力。把「忘得少」当成纯优点要小心——在必须深度适配的场景里,它同时意味着「学不够」。
  5. 量化基座引入数值边界:QLoRA 的收益来自 4 位存储,代价是量化误差;论文报告在它测试的设置下保持了 16 位全量微调的性能,这不等价于「任何任务、任何秩下都无损」。
  6. 多适配器与合并的取舍:合并后推理零开销但不可切换,保留适配器可切换但有调度与显存成本;论文把「可合并」列为优点时,隐含假设是「你一次只服务一个适配」。
  7. 部署侧的成本没有消失:LoRA 省的是训练期的优化器状态与产物体积,但推理引擎仍需为每个适配器占用权重与缓存;「参数少」不自动等于「服务端便宜」。
  8. 本文的限度:所有「本文自行推导」的数值都只做量级检查,不与官方数字混列;本文不包含任何本站独立实测,也没有对上述论文结论做复现实验。
  9. 时间锚点:文中论文时间按 arXiv 页面上的提交历史标注(编号前缀通常是提交年月,但不总是一致:rsLoRA 的实际提交日是 2023-11-28,其编号按公告批次归入 2312);本文核验日期为 2026-10-13。
  10. 未解项:内在维度与模型规模的关系、低秩曲面在什么任务上「刚好装下」,目前仍主要靠经验与实验描述,尚无一个可直接套用的先验公式——这也是这一方向仍在被持续研究的原因。

这一节想让你记住的一件事:上面 10 条里,第 1、4、5 条会直接影响项目结论(任务偏移距离、学得少与忘得少的两面性、量化带来的数值损失),其余各条属于口径提醒。

七、本文自行推导(与官方数字分列)

以下算式由本文给出,均标注了假设,只作量级一致性检查,不得作为官方数值引用:

  1. 单层参数占比:r(d+k)dk=2rd\dfrac{r(d+k)}{dk}=\dfrac{2r}{d}(当 d=kd=k);代 d=k=4096d=k=4096、r=8r=8 得约 0.39%(单层,非整模型)。另:第 1.1 节那个 r=8r=8、1000×10001000\times1000 的示意例子(待学习数字 16000 对一百万,约 1.6%)同属本文自算。
  2. 秩不超过 r 的矩阵集合维数:r(d+k)−r2r(d+k)-r^{2};代 d=k=4096d=k=4096、r=8r=8 得 65472 维。假设:重参数化冗余恰好对应一个 r×rr\times r 可逆矩阵的 r2r^{2} 个自由度。
  3. 启动一步的更新量尺度:E∥Δ(ΔW)∥F2=α2rdk σ2η2\mathbb{E}\left\|\Delta(\Delta W)\right\|_F^{2}=\dfrac{\alpha^{2}}{r}dk\,\sigma^{2}\eta^{2},故 ∥Δ(ΔW)∥F∝α/r\left\|\Delta(\Delta W)\right\|_F\propto\alpha/\sqrt{r}。假设:Adam 每参数步长同尺度 η\eta、AA 的元素方差 σ2\sigma^{2} 且彼此独立、只算第一步(B=0B=0)且忽略二阶项。
  4. 双重量化的节省量级:按「64 元素分块、缩放常数 32 位」为 0.5 比特/参数;再对第一级常数按 256 元素用 8 位量化(摊到 64×256 个参数)后为 8/64+32/(64×256)=0.1278/64+32/(64\times256)=0.127 比特/参数,节省约 0.375 比特/参数(换算到 65B 基数参数约 3GB 量级;QLoRA 正文口径为约 0.37 比特/参数、65B 约 3GB)。假设:分块大小如所述,且未计入优化器状态等其它开销。
  5. 整模型比例的示例(仅供量级直觉):若一个模型有 32 层、每层四个 4096×40964096\times4096 投影全加 LoRA、r=8r=8,则 LoRA 可训练量约 32×4×8×8192≈8.4×10632\times4\times8\times8192\approx8.4\times10^{6},相对这些投影本身的总量 32×4×40962≈2.1×10932\times4\times4096^{2}\approx2.1\times10^{9} 约为 0.39%——与第 1 条同一量级,说明「单层比例」在这组假设下可与整模型同量级(前提是所有层、同一组投影都加 LoRA;只挑部分层时不成立,见 5.7 坑四);换成只加查询与值两个投影,则约减半。假设:层数、形状与目标模块都如所述,且不含嵌入与输出层。本例形状均匀(每层都是同一形状的四个投影),所以单层口径与整模型口径在这里恰好相同;真实模型含嵌入层与异形投影时,两个口径会被拉开。

这一节想让你记住的一件事:这些数字只是量级检查——能对上官方口径的,正文一律以官方口径为准;对不上的地方,正文明确写出假设。

八、术语与符号表

记号 / 术语含义
W0∈Rd×kW_0\in\mathbb{R}^{d\times k}基座权重:预训练好、微调时被冻结的原权重(dd 输出维,kk 输入维)
ΔW\Delta W改动量:微调对权重的整体修改
rr秩:AA、BB 中间共享的维度,钉住 ΔW\Delta W 的秩上界
A, BA,\ BLoRA 的两个可训练矩阵,形状分别为 r×kr\times k、d×rd\times r;BB 初始化为全零
α\alpha与秩无关的缩放超参数;实践中常按 α/r\alpha/r 或 α/r\alpha/\sqrt{r} 施加
η\eta优化器学习率:决定每个可训练参数每步走多远
GG上游传回该层的梯度 ∂L/∂(ΔW)\partial L/\partial(\Delta W)
d90d_{90}达到全参数微调性能 90% 所需的内在维度
冻结该张量参与前向与反向计算,但优化器不更新它
内在维度达到接近全参数微调性能所需的最小可训练子空间维数
更新方向数本文对「实际起作用的更新方向个数」的描述性说法(不是论文里的量名;LoRA 论文用的量名是基于 Grassmann 距离的子空间相似度)
重参数化冗余同一个乘积可由不同的因子分解表示,多出来的自由度
PEFTParameter-Efficient Fine-Tuning,参数高效微调的总称
NF44-bit NormalFloat:为近似正态分布权重设计的 4 位数据类型
双重量化对「量化常数」再做一次量化,以减少其存储开销
分页优化器借助统一内存管理吸收显存峰值,避免训练因尖峰中断

九、三条结论的依赖关系

flowchart TD
  I["内在维度低:预训练压出来的"] --> L["低秩曲面够用"]
  L --> A1["LoRA 只学 A 与 B"]
  A1 --> S["缩放必须与秩解耦:α 除以根号 r"]
  A1 --> B1["域偏移大时更新方向数顶到曲面外"]
  B1 --> X["此时应抬秩 / 放宽范围 / 回全量微调"]
  S --> M["合并回基座,推理零额外延迟"]

这张图说明了什么:全文的三个结论不是并列的技巧,而是有依赖关系的链条——「内在维度低」是前提,「低秩够用」是推论,「缩放与秩解耦」是把这个推论工程化的必要条件;而「域偏移大时装不下」是这个链条的边界条件,它决定了你什么时候应该放弃 LoRA。

十、常见误解速查

常见说法更准确的说法依据
「LoRA 是省显存的小技巧,参数少所以效果打折」参数少是结果不是原因:预训练已把可改的自由度压小了1.2 节
「秩越大效果越好,显存够就往上加」在 α/r\alpha/r 口径下,加大秩会同时压小每步的移动量4.3、4.4 节
「只要用了 LoRA 就不会过拟合」低秩是强正则化,不等于泛化保证5.7 节坑五
「合并是必做的一步」合并是部署形态选择:单任务省,多任务反而不能合5.5 节、4.6 节图
「LoRA 一定不如全量微调」取决于任务偏移距离;域内对齐任务上可同量级甚至更好3.5 节
「论文里的比例可以直接套到我的模型上」单层口径与整模型口径可能差一个量级,必须重算3.1 节、七节第 5 条

十一、小结

把整篇压缩成三句话:

  1. 微调大模型的难点不在「参数太多」,而在「改动量的自由度其实很小」——内在维度实验直接测到了这一点(d90d_{90} 可以很小:200 维子空间、即 200 个可训练参数,就能在 MRPC 上拿到 90% 的效果)。
  2. LoRA 把这件事工程化:ΔW=(α/r)BA\Delta W=(\alpha/r)BA 用两个小矩阵表达改动,BB 从零起训保证起点等价、并打破 AA、BB 的对称性;训练结束可以无损合并回基座,推理零额外延迟。
  3. 「够用」有明确边界:任务越是对准基座已有能力,低秩越够;要求重排表示的任务(编程、数学),标准低秩会明显落后——而它的反面「忘得少」正是同一个秩约束的另一面。

顺着这条线再往前看一步,会自然遇到两个还在演化的方向:一个是缩放与预算分配(α/r\alpha/\sqrt{r}、按重要性分配秩、把幅度与方向拆开),另一个是与量化、与部署形态的结合(4 位基座、多适配器切换)。它们都不是新范式,而是把「改动量的自由度很小」这条观察继续用满。

这一节想让你记住的一件事:如果只记一句——低秩不是「省事的妥协」,而是「预训练已经把要改的方向压得很集中」这个事实的工程化。

📋 来源与核验记录

以下一手来源均在本轮(2026-10-13)实际打开、核对过标题与摘要内容,逐条给出 URL;本文对提交时间的表述以 arXiv 提交页所载提交日期为准(rsLoRA 的提交日为 2023-11-28,与其编号段 2312 相差约一个月)。

一手论文与官方材料:

  1. LoRA: Low-Rank Adaptation of Large Language Models(arXiv:2106.09685,2021 年 6 月提交)—— https://arxiv.org/abs/2106.09685
  2. Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning(arXiv:2012.13255,2020 年 12 月提交)—— https://arxiv.org/abs/2012.13255
  3. QLoRA: Efficient Finetuning of Quantized LLMs(arXiv:2305.14314,2023 年 5 月提交)—— https://arxiv.org/abs/2305.14314
  4. DoRA: Weight-Decomposed Low-Rank Adaptation(arXiv:2402.09353,2024 年 2 月提交)—— https://arxiv.org/abs/2402.09353
  5. LoRA Learns Less and Forgets Less(arXiv:2405.09673,2024 年 5 月提交)—— https://arxiv.org/abs/2405.09673
  6. AdaLoRA: Adaptive Budget Allocation for Parameter-Efficient Fine-Tuning(arXiv:2303.10512,2023 年 3 月提交)—— https://arxiv.org/abs/2303.10512
  7. A Rank Stabilization Scaling Factor for Fine-Tuning with LoRA(arXiv:2312.03732,提交日 2023-11-28、按公告批次归入 2023-12 编号段)—— https://arxiv.org/abs/2312.03732
  8. Parameter-Efficient Transfer Learning for NLP(Adapter,arXiv:1902.00751)—— https://arxiv.org/abs/1902.00751
  9. Prefix-Tuning: Optimizing Continuous Prompts for Generation(arXiv:2101.00190)—— https://arxiv.org/abs/2101.00190
  10. BitFit: Simple Parameter-efficient Fine-tuning for Transformer-based Masked Language-models(arXiv:2106.10199)—— https://arxiv.org/abs/2106.10199

本文自行推导(与上述官方数字分列,只作量级一致性检查,不得作为官方数值引用):

  • 单层参数占比公式与 0.39% 的示例值、1.1 节示意例子的 1.6% 与 16000 个待学习数字、秩不超过 rr 的矩阵集合维数与 65472 维示例值、启动单步更新量 ∝α/r\propto\alpha/\sqrt{r} 的一阶估算、双重量化「约 0.375 比特/参数」的估算、以及 32 层模型整模型比例的示例值——假设条件逐条写在第七节对应条目中。

核验方式与限度:

  • 上述 7 条来源的标题与摘要由本文在 2026-10-13 逐条实请求核对;论文中的具体数值(如 10,000 倍、3 倍、200 个参数、90%、10–100 倍、48GB/65B、双重量化约 0.37 比特/参数与 65B 约 3GB、r=256 时 HumanEval 约 0.407 对 0.464 与 0.497)均取自论文摘要或正文原文(其中「3 倍」在摘要里写作 reduce the GPU memory requirement by 3 times),未使用二手转述。
  • 本文不包含任何本站独立实测,也没有复现上述论文的实验;文中所有「经验区间」(如秩常见取 8–64)属工程惯例,不是论文结论。