
你有没有想过,一个只训练几千万参数的模型,为什么有时候效果就是打不过动辄训练几十亿参数的全量微调?
这个问题在大模型圈子里争论了好几年。LoRA*:Low-Rank Adaptation,一种参数高效微调方法,思路是不去动预训练模型的原始权重,而是额外训练两个小矩阵来模拟权重的变化量。
因为足够省钱省显存,LoRA几乎成了微调大模型的标配。但一个很少被人认真追究的问题是:LoRA训练起来,为什么总感觉"差点意思",收敛慢、效果天花板低、有时候还不稳定?
这篇来自元始智能、微软研究院和香港中文大学团队的论文,给出了一个出人意料的答案:问题可能不在LoRA的"低秩"设计本身,而在于一个大家从来没细想过的细节,矩阵A的初始化方式。
**这件事的反直觉之处在于**,绝大多数人调LoRA的时候,注意力都放在秩(rank)该设多大、alpha该怎么调、要不要加dropout上面,很少有人会怀疑随机初始化的那个矩阵A本身有问题。这篇论文告诉你,恰恰是这个被忽略的角落,藏着影响整个训练过程的关键。
LoRA的秘密:起跑线其实早就写好了
先说清楚LoRA是怎么工作的。
假设你要微调一个预训练好的权重矩阵W,全参数微调会直接更新整个W,这个矩阵可能有几百万甚至几十亿个数字,全部都要重新计算梯度、更新,非常费显存。
LoRA的做法是,不动W,而是在旁边加一条"旁路":用两个小矩阵B和A相乘,去近似权重的变化量。A负责把输入压缩到一个很小的"潜空间"(低秩空间),B再把这个压缩后的表示还原回原来的维度。因为A和B都很小,参数量就大幅下降了。
关键的一点是,LoRA为了保证训练刚开始的时候不破坏预训练模型原本的能力,把B矩阵初始化成全零,而A矩阵是随机初始化的。
问题就出在这里。论文的作者们做了一个简单的数学推导:既然B是零,那么在训练最开始的那一刻,A的梯度其实是零,A根本没法更新。真正在起作用、决定模型往哪个方向学习的,全部由A的初始随机值决定。
**换句话说,LoRA最初的学习方向,完全是随机骰子摇出来的**。
这就好比你要开车去一个陌生的目的地,导航还没启动,你只能凭方向盘最初随手一打的角度往前开。如果这个角度正好偏了,车子一开始就走错了方向,后面再怎么修正都要多花油、多绕路。如果不做任何处理,模型的早期优化效率就完全取决于这次随机的"方向盘角度",运气好就学得快,运气不好就要在错误方向上多耗好几百步才能纠偏。
从MLA里偷来的灵感:把"归一化"用对地方
论文的思路启发来自另一个地方,MLA*:Multi-head Latent Attention,多头潜在注意力,是DeepSeek-V2等模型中使用的一种注意力机制,其中会对压缩后的潜在表示做归一化处理。
研究者观察到,MLA里对这个潜在表示做归一化操作,能明显让训练更稳定、收敛更快。这背后的道理不难理解:如果一个中间表示的数值忽大忽小、缺乏规律,后面的层就很难对它做出稳定的判断,就像你听一个人说话,如果他忽然大喊忽然又低语,你很难专心听懂他在说什么,归一化就是让这个"声音"保持在一个稳定音量。
但这里有个技术难题。如果直接把这种归一化搬到LoRA里,变成先算出Ax(输入乘以A矩阵),再对结果做归一化,问题来了:归一化操作依赖于具体的输入x,这就让整个变换变成了非线性的。而LoRA最大的优势之一,就是训练完之后能把B和A直接合并回原始权重矩阵里,做到推理时零额外开销。一旦引入依赖输入的非线性归一化,这个合并就做不成了,等于丢了LoRA最核心的卖点。
于是研究者换了个思路:**与其归一化输入依赖的中间结果,不如直接归一化A矩阵本身**。
具体来说,矩阵A里的每一列,其实代表着输入的某一个维度是怎么被投影到低秩空间里的。研究者提出,把A的每一列都强制变成单位长度(也就是模长为1),这样就不再依赖具体输入x了,纯粹是对A这个参数矩阵做操作,跟输入无关,这个变换依然是线性的,训练结束后依然能完美合并回原始权重。
这个方法被命名为NoRA,Normalized Low-Rank Adaptation,归一化低秩适应,核心操作是把LoRA里的下投影矩阵A沿着秩的维度做归一化,让每一列都保持单位长度。
这里可以做一个类比来理解这个设计的用心之处。想象一个合唱团,每个人负责唱不同的音符(对应输入的不同维度)。如果每个人的音量完全靠抽签决定,有人声音震天响,有人细若蚊蚋,那指挥(也就是后面的B矩阵)想要调出一首和谐的曲子就非常困难,因为他没法预知每个人的实际音量,只能凭经验瞎猜。而如果规定所有人上台前必须先把音量校准到同一个标准,指挥接下来的工作就轻松多了,他只需要专注于旋律本身的编排,不用再操心声音大小不一的问题。如果不做这个校准,指挥要么要花很多时间反复试错去适应每个人的音量差异,要么干脆就一直乱糟糟地凑合演出。NoRA做的正是给A矩阵的每一列做"音量校准"。
两种用法:一直归一化,还是只在起跑线归一化一次?
论文里给出了两种落地方式。
第一种叫NoRA,就是在整个训练过程中,每一步都对A矩阵做归一化,让它时时刻刻保持单位长度的约束。
第二种叫NoRA-init,思路更"偷懒"一点:只在训练刚开始的时候,把A矩阵归一化一次,之后就让它自由生长,不再额外约束。
论文里做了详细的实验对比这两种方式。结果显示,NoRA-init已经能捕获NoRA绝大部分的收益。比如在监督微调(SFT*:Supervised Fine-Tuning,用标注好的数据对模型做定向训练的方法)实验里,标准LoRA的平均得分是37.93,NoRA-init就能提升到42.38,而持续做归一化约束的完整版NoRA能进一步提到43.37。
这个结果说明了一件很有意思的事:**大部分好处,其实在起跑线上就已经决定了**。
这就好比跑马拉松,起跑姿势和第一公里的配速,往往比中途某一次补给站的水喝得快不快更重要。如果起跑姿势不对,后面就算每个补给站都表现完美,也很难追回最初摔的那一跤。当然,全程保持正确的跑姿(也就是持续归一化)会比只在起点调整一次姿势(初始化归一化)多一点点额外优势,但这个额外优势远不如"起跑对不对"来得关键。
用积木搭出归一化:BIMI初始化
除了随机初始化后再归一化,论文还提出了一种更巧妙的确定性方案,叫BIMI*:Block Identity Matrix Initialization,块单位矩阵初始化,用重复排列的单位矩阵来构造A矩阵的初始值,天然满足每列单位长度的要求。
这个思路其实和另一个已有方法MiSS*:一种通过矩阵分片共享结构提升参数效率的PEFT方法,其固定的下投影矩阵恰好也是重复的单位矩阵拼接而成有关联。研究者发现,MiSS的下投影矩阵天生就满足NoRA提出的归一化条件,这某种程度上算是从另一个角度验证了NoRA思路的合理性,两个团队独立摸索,居然殊途同归地找到了类似的结构。
不过MiSS是把这个投影矩阵整个锁死、训练过程中不再变动,而BIMI只是拿它当一个初始值,之后A矩阵依然可以自由训练调整。实验显示,BIMI的效果和随机初始化再归一化的方式差不多好,进一步印证了真正起作用的不是"用了什么具体数值",而是"每一列的长度是不是统一"这个结构性质。
为什么归一化管用:一个隐藏的"预处理器"
论文里还给出了一个挺硬核但值得一读的解释,从优化理论的角度说明了NoRA为什么有效。
简单说,研究者把LoRA的训练过程重新解释成:**全参数微调的梯度下降,被一个由A矩阵决定的隐藏"预处理器"悄悄扭曲了**。
这里可以引入一个概念,预处理器*:在优化算法里,用来调整梯度方向和步长的一个变换矩阵,目的是让优化过程走得更稳更快,类似给一辆车装了个更聪明的悬挂系统。
推导下来,这个隐藏的预处理器P,其实等于alpha的平方乘以A的转置乘以A。如果A是随机初始化的,那么P矩阵对角线上的值(对应每个输入坐标自己的学习率)会因为随机性变得忽大忽小,波动幅度大概是1除以秩的平方根这个量级。秩越小,这个波动相对越剧烈。
**这意味着不同的输入维度,天生就被分配了不均匀、且和数据本身毫无关系的学习率**。
而一旦对A做归一化,让每一列长度都固定为1,这个预处理器矩阵P的对角线就会变成确定性的1,不再随机波动。用论文的话说,这相当于让LoRA适配器的梯度范数,在数学期望上和全参数微调的梯度范数对齐,而且这个对齐效果和秩的大小无关。
图1的实验数据很直观地证明了这一点:随着秩从8涨到64,标准LoRA的初始梯度范数一直很低,离全参数微调的梯度范数有明显差距;而NoRA的梯度范数曲线几乎是一条水平线,始终紧贴着全参数微调的水平,不随秩的变化而剧烈波动。
三个战场的验证:预训练、微调、强化学习
理论说得再漂亮,最终还是要看效果。研究团队在三个完全不同的训练场景里做了系统的实验。
**预训练场景**下,研究者先用MLA架构验证了归一化潜在表示确实能提升训练效果,然后把同样的思路搬到标准的多头注意力(MHA*:Multi-Head Attention,Transformer里最常见的注意力机制)架构上。结果相当戏剧性:标准的低秩参数化方法在LAMBADA这个数据集上直接崩溃,困惑度指标坏到无法正常计算,其他好几个基准测试的分数也明显下滑。研究者检查了梯度变化,发现问题出在训练过程中梯度范数掉到了异常低的水平,模型基本上没怎么被有效训练。而用了NoRA-init之后,这个崩溃现象消失了,梯度始终保持在合理范围,各项指标都恢复到接近全量微调的水平。
**监督微调场景**下,研究团队在Llama-3.2-3B模型上,对比了NoRA和一大堆同类方法,包括PiSSA、OFT、RSLoRA、MiSS、DoRA等等。数学推理任务GSM8K上,标准LoRA只能拿到50.94分,NoRA直接冲到61.63分;HumanEval代码生成任务上,从37.20分提升到42.10分。综合平均分从LoRA的37.93提升到NoRA的43.37,涨了5.44分。更值得关注的是遗忘问题:在MMLU、AGIEval、ARC-C这几个用来检验模型是否"忘了"预训练知识的测试上,标准LoRA的平均表现是下降0.56分,MiSS更是下降了0.70分,而NoRA反而是正向的0.02分,说明它在学新东西的同时,几乎没有伤到模型原本的能力。
**强化学习场景**(RLVR*:Reinforcement Learning with Verifiable Rewards,用可验证的奖励信号做强化学习训练,常用于数学推理这类有明确对错的任务)下,故事出现了有意思的反转。像PiSSA和MiLoRA这类依赖对预训练权重做奇异值分解(SVD)来初始化的方法,在监督微调阶段表现还不错,但一进入强化学习场景就直接崩了,PiSSA的AIME24得分是0.0,MiLoRA也只有4.2分,几乎失效。而NoRA全程保持稳定,把基础模型41.0的平均分提升到44.4分,AMC测试上更是从64.8分提到72.7分。
这个对比结果说明了一件挺重要的事:**依赖预训练权重的谱结构(也就是SVD分解出来的信息)来初始化,看似聪明,但在强化学习这种训练动态更剧烈、更不稳定的场景里反而是个隐患**。而NoRA完全不依赖这种"精细但脆弱"的信息,只做一件简单的事,把每一列的长度拉齐,反而更加皮实耐用。
这就好比两种应对突发状况的策略。一种是提前把所有细节都精心规划好,路线导航、路况预测样样俱全,平时确实好用,但一旦遇到真正的突发状况(比如临时封路),这套精细规划反而因为太依赖原来的假设而彻底失灵。另一种策略简单粗暴,只保证车速匀速、油量充足这些基本盘,看起来不够聪明,但遇到任何突发状况都能稳得住。NoRA走的正是后面这条路。
归一化到底该沿着哪个方向做
论文还专门做了一个消融实验,来确认归一化到底该冲着哪个维度下手。
矩阵A的形状是秩乘以输入维度,研究者对比了两种归一化方式:沿着输入维度做归一化(每一行归一化,记作Norm_k),还是沿着秩的维度做归一化(每一列归一化,记作Norm_r)。
实验结果非常清晰:不管A原本是用均匀分布、高斯分布还是别的什么方式随机初始化的,Norm_k方向的归一化几乎没有任何提升,数字和不做任何归一化几乎一样;而Norm_r方向的归一化,能把平均分从大约29-31分的水平,一口气拉到36-37分的水平。这也验证了前面提到的理论:真正决定学习率均衡与否的,是A矩阵每一列(对应每个输入坐标)的长度,而不是每一行。
写在后面
读完这篇论文,最让我意外的一点是,一个如此基础、如此容易被忽视的细节,矩阵A的列向量长度是否均衡,居然能在实验里造成从"模型直接崩溃"到"逼近全量微调"这么大的差距。这提醒我一件事:**很多时候工程实践里的"玄学调参",背后其实藏着一个能被数学清楚解释的机制**,只是没人愿意花时间去推那几行公式。
论文里那个隐藏预处理器的推导,其实换了个视角去理解LoRA:LoRA从来不是在做"一个简化版的全参数微调",而是在做"一个被随机噪声扭曲过的全参数微调"。这个扭曲从训练第一步就存在,而且没人能保证它自己会消失。这个视角让我重新思考,是不是还有别的PEFT方法,也存在类似的、被忽略的隐藏预处理器,只是还没人把它挖出来。
还有一点值得琢磨:MiSS这个此前独立发表的方法,被这篇论文重新解释成了NoRA的一个特例。这种"回头发现别人早就走在同一条路上"的经历,在科研里其实很常见,也很有意思,它说明好的想法往往不是凭空出现的,而是当某个问题足够重要的时候,不同的人会从不同的入口走到同一个答案附近。
那么下一个问题是,如果连一个如此简单的归一化操作都能带来这么大的差异,LoRA的B矩阵、还有它的初始化和优化过程里,是不是还藏着别的类似的"免费午餐",等着被人发现?
Q&A
Q1:NoRA是什么?
A:NoRA全称Normalized Low-Rank Adaptation,是一种改进LoRA的方法,核心做法是把LoRA下投影矩阵A沿着秩的维度做归一化,让每一列都保持单位长度,从而让训练更稳定、收敛更快,且不需要额外参数或推理开销。
Q2:NoRA和普通LoRA相比效果提升有多少?
A:在监督微调实验里,NoRA把平均得分从LoRA的37.93提升到43.37;强化学习场景下把基础模型41.0分的平均成绩提升到44.4分,同时比PiSSA、MiLoRA等谱初始化方法更稳定,不会出现训练崩溃。
Q3:NoRA-init和NoRA有什么区别?
A:NoRA在整个训练过程中持续对A矩阵做归一化,而NoRA-init只在初始化阶段做一次归一化,之后正常训练不再约束。实验显示NoRA-init已经能捕获NoRA大部分收益,说明起始阶段的归一化最关键。






