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(Low-Rank Adaptation,低秩适配,一种「只训练极少量新增参数」的微调方法)凭什么只用原来万分之一量级的可训练量(这是 GPT-3 175B 对 Adam 全量微调的口径,单层尺度可以比它大一个数量级,见 3.1 节),就能把一个大模型适配到新任务上?
先说结论:这不是一个「便宜所以更弱」的替代品,而是因为预训练已经把要改的方向压得很集中。往下分三段推导——① 要改的自由度有多大;② 低秩为什么够;③ 梯度怎么流、缩放怎么定——最后给出边界与一个可以自测的判据。
一、先给直觉:要改的「自由度」远小于参数个数
1.1 第一个反直觉的实验
先做个思想实验。假设某模型的权重是一张 的表格,总共一百万个数字。
全量微调(full fine-tuning,把模型里每一个数字都当成待学习的变量去调)的做法是:把这一百万个数字全都交给梯度下降。
LoRA 的做法是:承认「我们真正想做的改动」可能有结构,于是只用两个小表格相乘来生成这百万个数字:
- 一个小表格 尺寸
- 一个小表格 尺寸
如果 取 8,那么待学习的数字只有 个,是一百万的 1.6%(本文示意例子的比值,不是任何真实模型的口径)。
而如果 只能取到 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)里做了直接测量:把全参数空间随机投影到一个只有 维的子空间,只在这个子空间内做微调。
这里的 是他们定义的内在维度(intrinsic dimension:达到接近全参数微调性能所需的最小可训练子空间维数,下标 90 表示取到全参数性能 90% 所需的那一维)。
他们的结论是:常见预训练模型的内在维度非常低。例如对 RoBERTa,只优化 200 个可训练参数(再由一个固定的随机投影映射回全参数空间),就能在 MRPC(GLUE 中的释义判定任务:判断两句话是不是同一个意思)上达到全参数微调 90% 的性能。
同一个实验里还有两个更反直觉的观察:
- 预训练在隐式地压低内在维度——也就是「预训练学到了一个更容易被改的表示」;
- 在固定的预训练更新步数下,模型越大,内在维度越低。
第二条尤其值得注意:它正好解释了为什么「越大的模型,用越少的可训练参数就能适配」。不是大模型更容易被改,而是它学到的表示更「压缩」。
1.3 为什么这件事值得现在看
因为工程上真正的成本大头,已经不是「能不能微调」,而是「用什么代价同时服务很多个微调版本」。
全量微调每个任务产出一份与基座同大小的权重;LoRA 每个任务只产出一对几十 MB 级的小矩阵。这一个差别决定了后面所有部署形态——多任务切换、边缘侧微调、把微调版本的更新当作可审计的小文件来管理,全都建立在这条性质上。
这一节想让你记住的一件事:「参数量」和「需要被改的自由度」是两个量;前者可以很大,后者可以很小,而 LoRA 吃的就是后者。
1.4 一条时间线:这件事是怎么被一步步讲清的
把本文引用的一手材料按提交时间排开,能看清这条线索是一步步收紧的:
| 时间 | 材料 | 它把哪一步讲清了 |
|---|---|---|
| 2020-12 | arXiv:2012.13255 | 先证明「要改的自由度其实很小」 |
| 2021-06 | arXiv:2106.09685 | 把低秩改动做成可用的工程方法 |
| 2023-03 | arXiv:2303.10512 | 预算不该均匀撒,要按重要性分配 |
| 2023-05 | arXiv:2305.14314 | 基座再压到 4 位,显存再降一档 |
| 2023-11 | arXiv:2312.03732 | 缩放要与秩解耦,否则高秩学不动 |
| 2024-02 | arXiv:2402.09353 | 把权重拆成幅度与方向两部分 |
| 2024-05 | arXiv:2405.09673 | 明确它学得少、也忘得少 |
表里的时间按各论文 arXiv 页面上的提交历史填写(其中 rsLoRA 的实际提交日是 2023-11-28,其编号按公告批次归入 2023-12),不是二手转述。它说明的是一个方向在两年多的时间里,从「能不能用」走到了「怎么用对」。
二、符号约定:把「权重改动」写成一个低秩矩阵
科普文最怕符号一上来就糊。这一节把全文要用的记号一次性定清楚,后面不再重定义。
2.1 前向计算与「冻结」
一层线性变换(比如 Transformer 里的一个投影层)的前向计算是:
这里 是该层的输入向量、 是输出向量, 是预训练好、之后会被冻结的原权重(本文一律称「基座权重」)。
所谓冻结(freeze),就是这一层的反向传播不更新 里的任何数字:它照常参与前向与反向计算,但优化器不会为它累积梯度、也不会写回新值。
2.2 两种改法
全量微调学的是一个与 同形状的改动量 :
于是待学习参数就是 个,和原权重一样多。
LoRA 的改写只动 的表达方式:它不去直接学一个 的大矩阵,而是学两个瘦长的小矩阵,让它们的乘积充当 :
其中:
- 叫秩(rank,就是两个小矩阵中间那个共同的维度,它钉死了 的秩上界);
- 是一个与 无关的缩放超参数,两矩阵乘积后统一乘 。
2.3 初始化里的一个关键规定
初始化有一条不成文但很关键的规定: 用随机小值初始化, 初始化为全零。
这样训练的第一步 ,模型的前向行为与「什么都没改」完全一致——起点是安全的,不会一开训就把基座能力打坏。第四节的推导会说明,这条规定还顺手解决了一个更隐蔽的问题:它决定了训练第一步究竟是谁在动。
2.4 三个用词的澄清
中文语境里常把 叫「原始权重」、把 、 叫「新增权重」,还常把「参数」与「可训练参数」混着说。为了后文不歧义,这里固定三个用词:
- 基座权重:,预训练产出,全程冻结;
- 可训练参数:优化器真正会更新并保存历史状态的那些数字,LoRA 里只有 、 的 个;
- 秩:,一个整数,不是矩阵的实际秩,而是 允许达到的秩上界。
这一节想让你记住的一件事:LoRA 不是换了个模型,而是换了个「改动量」的参数化方式;基座不变,改动的秩被钉死在 以内。
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 强制改动量落在一个由 控制的低维曲面上;而由于乘积可以事先算好,合并之后的推理路径与没加 LoRA 时一模一样。
三、为什么低秩够用:先数参数,再看秩的约束
3.1 参数量到底省了多少
对单层做一次确切的计数。全量微调的可训练量是 ;LoRA 是 。两者之比是:
当 时它退化成 。
举一个具体但必须标明性质的例子(下面是本文自己代的数,只做量级检查,不是任何官方数值):取 、,则 (单层口径)。
注意这 0.39% 是这一层的比例,不是整模型的比例:只有当你给每一层的同一组投影都加 LoRA 时,整模型比例才与单层同量级(见第七节第 5 条);只挑部分层、或目标模块不同,总比例会差一个量级,必须重算。
LoRA 论文给出的整体口径是:相对 GPT-3 175B 用 Adam 做全量微调,LoRA 把可训练参数减少 10,000 倍、把显存需求降到约 三分之一(这是论文摘要口径;再次提醒 175B 是模型的基数参数,不是可训练参数,看到这两个数字并排时不要混读)。
3.2 为什么「秩小」不是随便砍的
要让论证站得住,得回答一个更硬的问题:为什么改动量天然是低秩的,而不是「被迫低秩所以必然损失能力」?
先看低秩这条路能表达什么。所有秩不超过 的 矩阵构成一个集合,这个集合的维数是:
推导思路是这样的:把 写成 之后,、 一共 个自由数;但存在一种「重参数化冗余」——在中间插一个可逆的 矩阵 ,取 、,乘积不变,这种冗余恰好对应 个自由度;两者相减即得上式。
这个式子的含义是:秩约束不是把可达集合压成一条线,而是一个维数为 的光滑曲面。当 从 1 升到 8,这个曲面的维数会迅速上升;一个 的矩阵, 时光是这张曲面就有约 维。
任务需要的那部分改动,如果落在这张曲面上,就没有任何损失;问题只剩「它会不会落在曲面上」,而第一节的内在维度测量给出的答案是:通常会。
3.3 低秩的表征能力:来自论文的实验
低秩的表征能力还有一个更具体的证据。
LoRA 原论文对「秩该取多大」给了两类证据。第一类是子空间相似度:论文用基于 Grassmann 距离的归一化相似度,比较不同秩学到的更新子空间之间的重叠程度(论文附录 G 给了形式化定义),用来回答「小秩学到的方向是不是已经覆盖了大秩学到的那些」。第二类是换目标矩阵类型:论文第 7.1 节对照了在注意力里适配不同类型权重矩阵的效果,而默认配置只改查询与值两个投影。
这两类证据的具体形态是:论文在 GPT-3 175B 上固定 18M 的可训练预算(FP16 约 35MB),对照不同权重类型的组合(例如只适配一种注意力权重时对应 );并观察到秩 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 上怎么落
设上游传回到这一层的梯度(对改动量的偏导)记作 。
把 代进去,用链式法则分开求:
第一个要看到的事实:由于 初始化为全零矩阵,训练第一步里
也就是说 一动不动;而 一般不为零, 会先动。
这不是 bug,而是一个有意的设计:它打破对称性。
如果 、 都从随机值起训,两者关于乘积是对称的,梯度会先把它们拉平,学到的更新方向带有初始化随机成分;让其中一个从零起步,等于规定「第一个被解锁的方向由下游梯度通过固定的 决定」。
4.2 第二步:B 动起来之后,A 学到什么
一旦 变成非零, 就活了。这一步的含义值得单独说: 的梯度是「下游梯度经 的列空间过滤之后再决定的方向」。
具体地, 把 维的输出侧梯度压到 维的中间空间里——这正是 LoRA 的「瓶颈」在工作:它只允许那些能被 的 个方向解释的梯度,传到 上去。
反过来说也成立:如果某个方向对任务很重要,但 目前完全没有覆盖它,那么这一轮更新里 不会往那个方向走。这是「低秩」在 训练动力学层面(而不只是表达能力层面)的真实代价——秩不但限制了能表示什么,也限制了每一步能往哪儿走。
4.3 第三步:为什么 会让大秩「学得慢」
这一段是本文的推导,不是转述论文证明。它要回答的问题是: 前面的系数写成 时,把 调大究竟发生了什么?
本文的简化假设(明确列出):使用 Adam 系优化器(一种按梯度历史自适应缩放每个参数步长的优化器)时,每个可训练参数每步的更新幅度大致同尺度,记作 ——Adam 会把每维梯度按自身历史缩放,所以「每个参数一步走多远」基本与梯度绝对值无关;再假设 、 各元素近似独立同分布。
看一步更新对 的贡献:
先算第一项(训练启动时 ,只有它能起作用):
把 的第 个元素展开:,两边取期望并利用各维独立:
再对 、 求和,得到:
最后代入 的元素方差 (有 ):
于是 。
结论很干净:在 的写法下,秩越大,每一步对 的实际移动量越小(按 收缩)。这就解释了为什么实践里「把 调大但效果不见涨,甚至更差」——不是容量不够,而是步子被自己的缩放压小了。
4.4 论文的结论与本文推导的关系
上面那步一阶推导,正好对上 2023 年 11 月 28 日提交、编号按公告批次归入 2023-12 的 rsLoRA(arXiv:2312.03732)。它的摘要明确说:把适配器除以秩会导致高秩 LoRA 学习变慢、性能受限,并证明应当除以秩的平方根;改用正确的缩放之后,可以用更大的秩去换更好的微调性能,而推理计算成本不变。
需要明确区分的是两者的地位:论文给出的是证明;本文给出的是在「Adam 每参数步长同尺度」这一假设下、只算启动第一步的一阶估算,它给出同一个 的函数形状,可以作为量级一致性检查,但不能当作对论文证明的复述或替代。
4.5 一个容易犯的错:把缩放和真实学习率混为一谈
与优化器的学习率 是两个独立的旋钮,这一点在排查「LoRA 训不动」时最关键:
- 调 改的是改动量的尺度(以及由 4.3 推出的、随秩变化的缩放行为);
- 调 改的是每个参数的步长。
很多人遇到「加大秩反而更差」,第一反应是加大学习率;按 4.3 的结论,更对症的动作是把缩放从 换成 ,让步长尺度与秩解耦——否则你会用学习率去补偿一个本该由缩放承担的、随秩变化的因子。
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 该走的方向」;而训练结束之后,改动量是继续以适配器形式挂着、还是乘好加回基座,是一个部署形态选择,两者在数学上是同一件事。
这一节想让你记住的一件事: 从随机、 从零的初始化规定了第一步谁动;缩放因子决定了随着 变大步子会不会被压小——写 会,写 不会。
五、工程含义:把每个旋钮讲清楚
5.1 加在哪些层
LoRA 论文只改注意力部分的权重,默认配置是把低秩矩阵加在查询(Wq)与值(Wv)两个投影上;论文另外对照了适配更多权重矩阵类型的效果,但那不是默认设置——原文明确写「We limit our study to only adapting the attention weights」。
这个选择本身就是「预算是稀缺的」这一事实的体现:给哪些矩阵加、加多大秩,是一个分配问题,而不是「多多益善」。
5.2 秩取多大
秩的经验区间大致在 8 到 64(这是社区经验的量级,不是论文给出的规律)。
结合 4.3 的推导,秩不是越大越好:在 的口径下,加大秩会同时带来「表达能力上升」与「每步移动量下降(按 收缩)」两个相反的效应。这也是 2023 到 2024 年间一批「怎么调缩放、怎么分配预算」工作的出发点。
实操建议只有一条:先在小规模上做秩的对照(同数据、同步数、只改 ,并同时把缩放口径固定住),看验证集是否还在随秩上升。若已经收敛,继续加秩只是增加显存。
5.3 预算分配:不要均匀撒
AdaLoRA(arXiv:2303.10512,2023 年 3 月提交)给了更系统的答案:它把增量更新写成奇异值分解(SVD,把一个矩阵拆成「旋转—缩放—旋转」三段的分解)的形式,按重要性打分自适应地把参数预算分配在不同的权重矩阵之间,从而允许「重要的矩阵多给秩、不重要的少给甚至不给」;论文报告在低预算设置下相对均匀分配有更明显的改进。
换句话说:均匀地给每一层配同样的秩,本身就带着浪费。
5.4 量化基座:QLoRA 的三项技术
如果基座权重本身也用低精度存,显存又能再降一档。QLoRA(arXiv:2305.14314,2023 年 5 月提交)的摘要口径是:可以在一张 48GB 的 GPU 上微调 65B 参数的模型,同时保持 16 位全量微调的任务性能。它由三件事组成:
- 4-bit NormalFloat(NF4):一种为「近似正态分布的权重」设计的 4 位数据类型,论文声称它在信息论意义上对这种分布是最优的(即在相同比特数下,对正态分布权重的表示误差最小);
- 双重量化(double quantization):量化「量化常数」本身,从而再省一层固定开销(下面给一个本文自算的量级);
- 分页优化器(paged optimizers):把显存峰值导致的溢出交给统一内存管理(统一内存 = CPU 与 GPU 之间可自动迁移的统一地址空间),避免训练中途因为一次显存尖峰而崩掉。
双重量化省下多少,可以自己算。假设 NF4 把权重按每 64 个元素一块分块,每块需要一个缩放常数;若该常数用 32 位浮点存,开销是 比特/参数。再把缩放常数本身按每 256 个「第一级常数」一块、用 8 位量化——注意这一级要摊到 个参数上,因此开销是:
即从 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 相对「适配器层」这类方案最实用的一点:训练结束后,把 、 乘起来加回基座即可,推理时与「从没加过 LoRA」的模型结构完全一致:
于是推理没有任何额外延迟。代价是放弃了一点灵活性:合并以后就回不到「一份基座 + 多个可切换适配器」的状态;要并行服务多个任务,得保留未合并的适配器并在推理时切换(这属于部署形态的选择,不是精度问题)。
5.6 实操清单
把前面几节的结论收成一张按顺序执行的清单:
- 先确认基座就是你要长用的那一份(LoRA 不改变基座,换基座等于重训);
- 选目标模块:默认用查询与值两个投影,需要更强适配时再扩到更多权重矩阵类型;
- 选秩:从小到大扫(如 8、16、32),同时把缩放口径固定,避免把两个变量一起动;
- 定 :把它当作「改动量尺度」的旋钮,与优化器学习率分开调;
- 若显存不够:先上 4 位基座(QLoRA),再考虑减小秩或缩短序列;
- 训练结束按部署形态二选一:合并(单任务、最省)或保留适配器(多任务切换);
- 上线前核对一遍:合并后的权重与「基座 + 适配器」两次前向输出应当一致(这是一条便宜的自检)。
5.7 常见坑
- 坑一:把「秩」当作质量旋钮一直往上加。 症状是高秩反而不涨点甚至掉点;按 4.3 的推导,先检查缩放口径,而不是先加大学习率。
- 坑二:把 与学习率当成同一个东西。 症状是两个一起调、永远说不清哪一个起作用;按 5.6 第 4 条,分开调、分开记录。
- 坑三:合并之后才发现要在多任务间切换。 症状是重复训练;对策是先想清楚部署形态再决定是否合并。
- 坑四:拿「单层参数占比」当成「整模型参数占比」去对外汇报。 症状是数字差一个量级——单层口径只在「所有层、同一组投影都加 LoRA」时才与整模型同量级(见 3.1 节与第七节第 5 条),对外引用一律以论文的整体口径为准。
- 坑五:在小数据上过拟合。 低秩本身是一种很强的正则化,容易让人误以为「不会过拟合」;参数少不等于泛化好,验证集仍必须看。
5.8 对照表
| 方案 | 可训练量 | 相对全量微调的质量 | 推理额外开销 | 关键机制 |
|---|---|---|---|---|
| 全量微调 | 全部参数 | 基准 | 无(但每任务一份完整权重) | 直接学 |
| LoRA | 同量级或更好;域偏移大时明显偏弱 | 无(可合并) | ||
| rsLoRA | 与 LoRA 相同 | 高秩设置下更好 | 无(可合并) | 缩放改为 |
| AdaLoRA | 同量级预算 | 低预算下更好 | 无(可合并) | SVD 参数化 + 重要性分配预算 |
| DoRA | 略高于 LoRA | 论文报告一致优于 LoRA | 无 | 把权重拆成幅度与方向分别更新 |
| QLoRA | 与 LoRA 相同 | 论文称保持 16 位全量微调水平 | 无(可合并;基座为 4 位) | NF4 + 双重量化 + 分页优化器 |
DoRA 的口径来自 arXiv:2402.09353 摘要:把预训练权重分解成幅度与方向两部分,方向部分用 LoRA 更新,论文报告在 LLaMA、LLaVA、VL-BART 上一致优于 LoRA,且没有额外推理开销。
这一节想让你记住的一件事:LoRA 的旋钮只有四个——加在哪几层、秩多大、缩放怎么定、基座是否量化;其余看起来复杂的东西(SVD 分配、幅度方向分解)都是在回答「预算怎么分才不浪费」。
六、边界与未解
把结论的适用范围逐条编号,避免把「常用」读成「总是对」。
- 任务相关性边界:低秩够用的前提是「要改的方向本来就集中」。编程与数学这类要求重排表示的域,标准低秩设置会明显不如全量微调(arXiv:2405.09673 的对照),此时应优先考虑提高秩、放宽可训练范围,或干脆全量微调。
- 秩的选择仍是经验:论文给出的是「小秩学到的更新子空间与大秩高度重叠」这类子空间相似度观察,以及「换目标矩阵类型」的对照实验,并没有给出「任何任务取多少 」的公式;3.2 节的维数公式只说明可达集合有多大,不说明你的任务需要多少。
- 缩放因子有理论解,但假设是理想化的:4.3 节的推导建立在「Adam 每参数步长同尺度、、 元素独立同分布」之上,只覆盖启动第一步;论文对 的证明更严格,本文的推导只能作为量级一致性检查。
- 「学得少」与「忘得少」是同一个原因的两面:LoRA 限制改动量的秩,所以它对新域学得浅,同时也不容易破坏基座的其它能力。把「忘得少」当成纯优点要小心——在必须深度适配的场景里,它同时意味着「学不够」。
- 量化基座引入数值边界:QLoRA 的收益来自 4 位存储,代价是量化误差;论文报告在它测试的设置下保持了 16 位全量微调的性能,这不等价于「任何任务、任何秩下都无损」。
- 多适配器与合并的取舍:合并后推理零开销但不可切换,保留适配器可切换但有调度与显存成本;论文把「可合并」列为优点时,隐含假设是「你一次只服务一个适配」。
- 部署侧的成本没有消失:LoRA 省的是训练期的优化器状态与产物体积,但推理引擎仍需为每个适配器占用权重与缓存;「参数少」不自动等于「服务端便宜」。
- 本文的限度:所有「本文自行推导」的数值都只做量级检查,不与官方数字混列;本文不包含任何本站独立实测,也没有对上述论文结论做复现实验。
- 时间锚点:文中论文时间按 arXiv 页面上的提交历史标注(编号前缀通常是提交年月,但不总是一致:rsLoRA 的实际提交日是 2023-11-28,其编号按公告批次归入 2312);本文核验日期为 2026-10-13。
- 未解项:内在维度与模型规模的关系、低秩曲面在什么任务上「刚好装下」,目前仍主要靠经验与实验描述,尚无一个可直接套用的先验公式——这也是这一方向仍在被持续研究的原因。
这一节想让你记住的一件事:上面 10 条里,第 1、4、5 条会直接影响项目结论(任务偏移距离、学得少与忘得少的两面性、量化带来的数值损失),其余各条属于口径提醒。
七、本文自行推导(与官方数字分列)
以下算式由本文给出,均标注了假设,只作量级一致性检查,不得作为官方数值引用:
- 单层参数占比:(当 );代 、 得约 0.39%(单层,非整模型)。另:第 1.1 节那个 、 的示意例子(待学习数字 16000 对一百万,约 1.6%)同属本文自算。
- 秩不超过 r 的矩阵集合维数:;代 、 得 65472 维。假设:重参数化冗余恰好对应一个 可逆矩阵的 个自由度。
- 启动一步的更新量尺度:,故 。假设:Adam 每参数步长同尺度 、 的元素方差 且彼此独立、只算第一步()且忽略二阶项。
- 双重量化的节省量级:按「64 元素分块、缩放常数 32 位」为 0.5 比特/参数;再对第一级常数按 256 元素用 8 位量化(摊到 64×256 个参数)后为 比特/参数,节省约 0.375 比特/参数(换算到 65B 基数参数约 3GB 量级;QLoRA 正文口径为约 0.37 比特/参数、65B 约 3GB)。假设:分块大小如所述,且未计入优化器状态等其它开销。
- 整模型比例的示例(仅供量级直觉):若一个模型有 32 层、每层四个 投影全加 LoRA、,则 LoRA 可训练量约 ,相对这些投影本身的总量 约为 0.39%——与第 1 条同一量级,说明「单层比例」在这组假设下可与整模型同量级(前提是所有层、同一组投影都加 LoRA;只挑部分层时不成立,见 5.7 坑四);换成只加查询与值两个投影,则约减半。假设:层数、形状与目标模块都如所述,且不含嵌入与输出层。本例形状均匀(每层都是同一形状的四个投影),所以单层口径与整模型口径在这里恰好相同;真实模型含嵌入层与异形投影时,两个口径会被拉开。
这一节想让你记住的一件事:这些数字只是量级检查——能对上官方口径的,正文一律以官方口径为准;对不上的地方,正文明确写出假设。
八、术语与符号表
| 记号 / 术语 | 含义 |
|---|---|
| 基座权重:预训练好、微调时被冻结的原权重( 输出维, 输入维) | |
| 改动量:微调对权重的整体修改 | |
| 秩:、 中间共享的维度,钉住 的秩上界 | |
| LoRA 的两个可训练矩阵,形状分别为 、; 初始化为全零 | |
| 与秩无关的缩放超参数;实践中常按 或 施加 | |
| 优化器学习率:决定每个可训练参数每步走多远 | |
| 上游传回该层的梯度 | |
| 达到全参数微调性能 90% 所需的内在维度 | |
| 冻结 | 该张量参与前向与反向计算,但优化器不更新它 |
| 内在维度 | 达到接近全参数微调性能所需的最小可训练子空间维数 |
| 更新方向数 | 本文对「实际起作用的更新方向个数」的描述性说法(不是论文里的量名;LoRA 论文用的量名是基于 Grassmann 距离的子空间相似度) |
| 重参数化冗余 | 同一个乘积可由不同的因子分解表示,多出来的自由度 |
| PEFT | Parameter-Efficient Fine-Tuning,参数高效微调的总称 |
| NF4 | 4-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 节 |
| 「秩越大效果越好,显存够就往上加」 | 在 口径下,加大秩会同时压小每步的移动量 | 4.3、4.4 节 |
| 「只要用了 LoRA 就不会过拟合」 | 低秩是强正则化,不等于泛化保证 | 5.7 节坑五 |
| 「合并是必做的一步」 | 合并是部署形态选择:单任务省,多任务反而不能合 | 5.5 节、4.6 节图 |
| 「LoRA 一定不如全量微调」 | 取决于任务偏移距离;域内对齐任务上可同量级甚至更好 | 3.5 节 |
| 「论文里的比例可以直接套到我的模型上」 | 单层口径与整模型口径可能差一个量级,必须重算 | 3.1 节、七节第 5 条 |
十一、小结
把整篇压缩成三句话:
- 微调大模型的难点不在「参数太多」,而在「改动量的自由度其实很小」——内在维度实验直接测到了这一点( 可以很小:200 维子空间、即 200 个可训练参数,就能在 MRPC 上拿到 90% 的效果)。
- LoRA 把这件事工程化: 用两个小矩阵表达改动, 从零起训保证起点等价、并打破 、 的对称性;训练结束可以无损合并回基座,推理零额外延迟。
- 「够用」有明确边界:任务越是对准基座已有能力,低秩越够;要求重排表示的任务(编程、数学),标准低秩会明显落后——而它的反面「忘得少」正是同一个秩约束的另一面。
顺着这条线再往前看一步,会自然遇到两个还在演化的方向:一个是缩放与预算分配(、按重要性分配秩、把幅度与方向拆开),另一个是与量化、与部署形态的结合(4 位基座、多适配器切换)。它们都不是新范式,而是把「改动量的自由度很小」这条观察继续用满。
这一节想让你记住的一件事:如果只记一句——低秩不是「省事的妥协」,而是「预训练已经把要改的方向压得很集中」这个事实的工程化。
📋 来源与核验记录
以下一手来源均在本轮(2026-10-13)实际打开、核对过标题与摘要内容,逐条给出 URL;本文对提交时间的表述以 arXiv 提交页所载提交日期为准(rsLoRA 的提交日为 2023-11-28,与其编号段 2312 相差约一个月)。
一手论文与官方材料:
- LoRA: Low-Rank Adaptation of Large Language Models(arXiv:2106.09685,2021 年 6 月提交)—— https://arxiv.org/abs/2106.09685
- Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning(arXiv:2012.13255,2020 年 12 月提交)—— https://arxiv.org/abs/2012.13255
- QLoRA: Efficient Finetuning of Quantized LLMs(arXiv:2305.14314,2023 年 5 月提交)—— https://arxiv.org/abs/2305.14314
- DoRA: Weight-Decomposed Low-Rank Adaptation(arXiv:2402.09353,2024 年 2 月提交)—— https://arxiv.org/abs/2402.09353
- LoRA Learns Less and Forgets Less(arXiv:2405.09673,2024 年 5 月提交)—— https://arxiv.org/abs/2405.09673
- AdaLoRA: Adaptive Budget Allocation for Parameter-Efficient Fine-Tuning(arXiv:2303.10512,2023 年 3 月提交)—— https://arxiv.org/abs/2303.10512
- A Rank Stabilization Scaling Factor for Fine-Tuning with LoRA(arXiv:2312.03732,提交日 2023-11-28、按公告批次归入 2023-12 编号段)—— https://arxiv.org/abs/2312.03732
- Parameter-Efficient Transfer Learning for NLP(Adapter,arXiv:1902.00751)—— https://arxiv.org/abs/1902.00751
- Prefix-Tuning: Optimizing Continuous Prompts for Generation(arXiv:2101.00190)—— https://arxiv.org/abs/2101.00190
- 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 个待学习数字、秩不超过 的矩阵集合维数与 65472 维示例值、启动单步更新量 的一阶估算、双重量化「约 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)属工程惯例,不是论文结论。