NoRA:一行归一化,让 LoRA 训练从第一步就贴住全参微调

训练还没开始,差距已经注定。同一个 Llama-3.2-3B 模型、同一份数学数据、同一个优化器,在第 0 步、模型还没学到任何东西的时候,全参微调(full fine-tuning,下面简称 full FT)的梯度范数大约是 9.5,而标准 LoRA(rank=8 时)只有 0.41。差了二十多倍。梯度范数衡量的是所有参数梯度拼成一个向量后的长度,可以粗浅地理解成“这一步想走多大力气”。模型一动没动,这个力气就差了 20 倍,不是任务难、不是数据脏、也不是学习率没调好,而是 LoRA 的初始化方式在一开始就埋了雷:一个小矩阵的随机尺度,悄悄接管了整个微调的前进节奏。

这篇 2026 年 8 月挂上 arXiv 的论文《Normalized Low-Rank Adaptation》(简称 NoRA,投稿 ICLR 2026,评审结果尚未公布)给出了一个令人意外的答案:病根出在 down-projection 矩阵 A 的尺度上,而解法只需一行归一化。零额外参数、零推理开销,在预训练、监督微调、强化学习三种范式下拿到一致收益。要理解这件事为什么成立、又为什么值得信,得从 LoRA 当年那笔“划算的交易”讲起。

LoRA 为什么能省下 99% 的参数,又埋下了什么隐患?

LoRA 的核心思路是:预训练权重 W₀ 不动,把要学的增量 ΔW 写成两个小矩阵的乘积,W = W₀ + BA。A 把输入从 k 维压进一个很窄的 r 维潜空间,B 再把潜空间拉回输出维度,这个 r 就是 rank(秩),决定了低秩空间的宽度,也几乎是 LoRA 唯一需要手调的容量旋钮。训练时冻结 W₀,只更新 A、B 两个小矩阵,于是可训练参数从“整个模型”缩到“两个小矩阵”。

LoRA 的整个设计可以浓缩成下面这张图。

LoRA 重参数化结构

图注:图中可见冻结的预训练权重 W₀(左侧浅色方块)与右侧并联的可训练路径:A 降维、B 升维,两者相乘构成增量 ΔW,输出经 α/r 缩放后与 W₀ 的输出相加。原文标注只有 A、B 在训练。LoRA

这套设计的妙处和隐患,都藏在“只有 A、B 在学习”这句话里。B 初始化为零、A 用随机高斯初始化,所以第 0 步的 ΔW = BA = 0,模型起点和预训练时完全一致。前向输出整体乘一个 α/r 缩放因子,把更新幅度和 rank 选择解耦。训练完成后 BA 直接加回 W₀,推理时没有任何额外计算,这是 LoRA 区别于 adapter 等方法的杀手锏。代价也直观:省。在 GPT-3 175B 上,LoRA 把可训练参数从千亿级别压到 1800 万,压缩上万倍,训练显存需求降到原来的三分之一。LoRA

问题恰恰出在这笔交易里最不起眼的一行:B 置零。在 LoRA 原文里,这只是一句带过的默认设置,是保证“起点等于预训练模型”的廉价手段。而 LoRA 改进的版图早已五花八门:改缩放因子的、改学习率的、改分解形式的都有,少有人把 down-projection A 的随机尺度本身当作直接干预对象。LoRA 综述。B 置零这一步,把训练早期的命运悄悄交给了 A 的随机尺度。为什么是 A 说了算?下一节拆开看。

训练一开始,为什么整个微调被 down-projection 牵着走?

写出第 0 步的梯度就明白了。B 是零矩阵时,损失对 A 的梯度恰好为零,A 在第一轮一动不动。而对 B 的梯度等于 α 乘上误差项再乘 A 的转置,B 是唯一在动的量。可 B 能往哪个方向动,完全由 A 的随机列向量决定:误差沿着 A⁽⁰⁾ 定义出的 r 个潜空间方向导出去。换句话说,训练第一步之前,潜空间里的坐标轴已经由一组随机数画好了,早期优化只能沿着这些随机轴走,没得选。

轴画好了还不够,步长也被顺手定了。把 B 的这一步折回权重更新,LoRA 在初始化附近等价于在输入侧乘了一个 preconditioner(预条件矩阵):更新量不是直接用梯度,而是“梯度乘以一个矩阵”,相当于给每个方向配了不同的步长。这个矩阵是 P = α²AᵀA。展开到每一列看,输入坐标 j 对应的权重更新,等于它自己的全参梯度乘以 α²‖a_j‖²,再加上其他坐标的梯度乘以列间内积的串扰。也就是说,A 的第 j 列的长度平方,就是坐标 j 的隐式学习率。

问题来了:A 是随机高斯矩阵,它的列长是随机数。期望上,‖a_j‖² 只有 r/k,即所有坐标的学习率平均被压到 full FT 的 r/k 倍。而列长还带着 1/√r 量级的随机浮动,rank 越小抖动越大。打个比方:输入空间的每个坐标就像混音台上的一条轨道,每条轨道都有一个音量旋钮,而随机初始化把这些旋钮拧到了随机位置,而且平均音量低到大多数轨道几乎听不见。LoRA 的训练,就是在这种音量忽大忽小的状态下开始的。

“零放在谁身上”从来不是中性选择。NeurIPS 2024 的一篇理论工作专门研究了 LoRA 两种零初始化的训练动力学差异,结论是默认方案是对的:A 随机、B 置零(论文称之为 Init[A])比反过来(Init[B])允许大得多的学习率,特征学习也更高效。Init[A]/Init[B]

Init[A] vs Init[B] 概念对比

图注:作者手绘的概览图,左半是 Init[A](A 随机、B 置零),右半是 Init[B](A 置零、B 随机),分别标注两种初始化在最大学习率渐近、特征学习效率与稳定性之间的取舍。这是概念示意图,不是带刻度的实验曲线。Init[A]/Init[B]

但“对”不等于“没问题”。理论只证明 Init[A] 优于 Init[B],前者同样付出了内部不稳定换高效特征学习的代价,而且它把成败押在了 A 的尺度这一个随机变量上。2025 年 ICML 的一篇后续工作把这个判断推得更远:把 A、B 同时非零初始化(Init[AB]),在稳定性、效率、鲁棒性三个维度上同时优于两种零初始化方案,说明零初始化本身就不是铁律,初始化尺度是可以也应该被修的变量。非零初始化

至此事情的轮廓清楚了:LoRA 的早期训练被 A 单侧主导,而 A 的随机列范数直接决定每个坐标的学习率,这是可计算、可修的问题,不是玄学。NoRA 的切入点,正是把这一组随机旋钮换成确定性刻度。

把 A 的每一列归一化,为什么就能对齐 full FT 的梯度?

NoRA 的方法一句话就能说清:把 A 的每一列做 L2 归一化,Norm(A) = [a₁/‖a₁‖₂, …, a_k/‖a_k‖₂],即每列除以自己的长度,让所有列长都等于 1。前向计算从 W₀x + (α/r)·B·A·x 改成 W₀x + (α/r)·B·Norm(A)·x,缩放记号与 LoRA 的 α/r 约定一致。就这一处改动。

Norm_r 的几何含义一眼可见:每个输入坐标投射到 r 维潜空间的方向保持不变,但长度被等比缩放到单位长度。

NoRA 的 Norm_r 归一化与初始梯度范数

图注:左半是 down-projection A 的每列被等比缩放到单位长度(矩阵下方标注 norm=1),即沿 rank 维度做归一化。右半是 LLaMA-3.2-3B 上初始梯度范数随 rank 变化的曲线:full FT 是约 9.49 的横线,标准 LoRA 从 0.41 缓慢爬到 1.21,而 NoRA 与 MiSS 从第一步起就贴在这条横线附近(约 9.8 到 10.4)。NoRA

这为什么能对齐梯度?回到第二章的预条件矩阵 P。那里为简写,把前向缩放 α/r 整体并进了 α 的记号;本节按 LoRA 原文把缩放写全,P = (α/r)²·AᵀA。P 作用在输入的 k 个坐标上,第 j 个坐标的隐式学习率正是它的对角项,diag(P)_j = (α/r)²·‖a_j‖²。接下来一行行看归一化做了什么。随机初始化时,第二章已经算过 E‖a_j‖² = r/k,所以每个坐标的隐式学习率平均是 (α/r)²·(r/k)。把 α 取成与 rank 同阶,即 α = r,等价地说 α/r = 1,于是这个平均值就是 r/k:所有坐标的隐式学习率被压到 full FT 的 r/k 倍。归一化把列长修成 1,diag(P)_j 变成 (α/r)²·1 = 1,从随机的 r/k 倍变成确定的 1。再看对角外:独立高斯列的期望内积为零,串扰项在期望上消失,期望上 P 就是单位阵。结论分两层:每个坐标的隐式学习率与 full FT 同为 1,梯度范数与 full FT 同量级;列长被钉死在 1,不再携带 1/√r 的随机浮动,隐式学习率与 rank 无关。混音台上所有旋钮被拨到了同一个刻度,训练在起点处就恢复了“每走一步该有多大动静”的正确量级。

这套逻辑还顺带解释了另一个方向的失败。论文对比了沿输入维度归一化(Norm_k,归一化每行)的做法,结果几乎无效。原因正在 preconditioner:行归一化不碰每一列的长度,P 的对角项依然是随机量,每个坐标的隐式学习率照旧抽签。看起来都是“归一化”,只有打在列上、打在 rank 维度上,才修得到病根。同样的两种归一化在语义上很容易混淆,但机制上只有一种成立。NoRA

还要澄清一个容易混淆的出身:NoRA 的灵感来自 DeepSeek 的 MLA 中对潜变量的归一化,但两者有一个关键区别。MLA 归一化的是 Ax,依赖输入 x,对 x 是非线性的,训练完没法把增量合并回权重。NoRA 归一化矩阵 A 本身,对 x 始终是线性变换,Norm(A) 只是给 A 做了一次重缩放,训练后可以直接吸进 W₀。保留可合并性,是 NoRA 敢称“零推理开销”的前提,也是它与 MLA 那条路分道扬镳的地方。

这一行的独特之处,放在 LoRA 改进谱系里更清楚。LoRA+ 改的是学习率分配,给 B 远大于 A 的学习率。LoRA+ rsLoRA 改的是缩放因子,把 α/r 换成 α/√r 防止高 rank 梯度塌陷。rsLoRA DoRA 改的是分解形式,把权重拆成幅度和方向分别处理。DoRA 它们动的是优化器、缩放常数、参数化结构,唯独没人直接管理 down-projection 每一列的尺度。NoRA 不动结构、不加参数,把干预点精确放在“隐式学习率的来源”上。图右半那条曲线是第一份证据:归一化之后,LoRA 的初始梯度范数从 0.41 跳到 9.8 附近,直接贴住了 full FT 的横线。注意这是训练第 0 步的梯度总能量,还没学任何东西,差距已经从 20 倍变成了持平。

归一化必须每一步都做吗?只做一次为什么也够?

如果病根是“随机尺度从一开始就带歪了训练”,那自然会问:这个归一化要持续做,还是只在开始时修一次就够了?论文两种都实现了,还给出第三种更省事的构造。

变体归一化时机构造方式SFT 四项平均分
标准 LoRA从不A 随机高斯、B 置零37.93
NoRA-init仅初始化这一次随机生成 A 后,对每列做一次 Norm_r42.38
NoRA训练全程每步前向计算直接用 Norm(A)43.37

数据来自 Llama-3.2-3B 的 SFT,四项平均是 GSM8K、Math500、HumanEval、MBPP 的算术平均。NoRA

第一眼的反差很说明问题:只做一次(NoRA-init)就拿到了 42.38,距离全程归一化(43.37)只差约 1 分。收益的大头来自初始化这次的修正,而不是每步的约束。这反过来印证了第二章的诊断:LoRA 的病根就在初始条件和它决定的早期动态。打个比方,病根是秤没校准,那么把秤校准一次再称重就够了,不需要每次称重都重新校准一遍。

BIMI 走的是另一条路,连“先生成再修”都不用了:直接让 A 的每一列都是单位基向量,A = [I_r, …, I_r, E_q],一出生就构造性地满足单位范数。论文在两项任务口径(GSM8K 与 Math500)下测得 BIMI 拿到 37.07,与同口径持续归一化的 Norm_r(37.16)几乎持平。注意这组数字和上面表格里的四项平均不是同一套任务集,不能直接混比,但趋势一致:构造性满足单位范数,等于从起点就把旋钮拧到位。NoRA

需要厘清的一点:BIMI 与 NoRA-init 这条“修 A 的尺度”的路线,和此前提到的 Init[AB](同时非零初始化)方向部分相合,但机制不同。Init[AB] 改的是“零初始化本身该不该存在”,NoRA 改的是“A 的列范数该怎么定”,数学形式和应用场景都不一样,不能混为一谈。另外,论文还顺带解释了姊妹工作 MiSS:它把 A 固定成重复单位块,本质上就是“把 Norm_r 约束冻结”的 NoRA 特例。至于持续归一化版本,还有一个副产物:损失对列尺度不变,梯度切向且范数单调不减,行为类似 weight normalization(权重归一化),潜空间尺度在全程既不塌缩也不爆炸。当然这意味着每一步都要重新算一次范数,这个计算开销论文没有实测,属于未闭合的问题之一。

预训练、SFT、RLVR 三场实验都更稳更快,还忘了更少——这个零成本的改动可信吗?

单看一条曲线可能只是巧合,NoRA 把验证铺到了三种训练范式上。

先看预训练。340M 模型在 SlimPajama 的 10B tokens 上从零训练,MHA 结构、rank 64 的设定下,标准 LoRA 在 LAMBADA 任务上直接崩掉(困惑度计算不出来,表里是"—"),其余基准平均只有 27.81。NoRA-init 把 MHA 的平均分拉到 39.69。换用 MLA 架构时,输入依赖的 Norm(Ax) 拿到 41.17,NoRA-init 是 40.64,标准 LoRA 是 40.36。NoRA-init 用不到 0.6 分,换回了完全可合并的线性结构。NoRA

再看 SFT,这是对比最完整的一场。Llama-3.2-3B 用 MetaMath 加 CodeFeedback 数据微调,四项平均分:

方法SFT 四项平均分
标准 LoRA37.93
PiSSA40.26
OFT40.43
RSLoRA41.28
MiSS42.70
NoRA43.37

在论文所比较的这组基线上平均分最高,且不是靠某个单项刷上去的。训练曲线更直白:NoRA 的 loss 从第一步起就贴着 full FT,LoRA 和 PiSSA 一路落后。

SFT 训练动态对比

图注:Llama-3.2-3B 上 SFT 训练动态双面板:上图为训练 loss,下图为梯度范数,四条曲线分别是 full FT、LoRA、PiSSA 与 NoRA。NoRA 的 loss 从第一步起贴着 full FT,梯度范数也从接近 full FT 的水平出发。LoRA 与 PiSSA 在 loss 上落后,梯度范数则从明显更小的初始水平缓慢追赶。NoRA

“初始梯度对齐”不是一瞬的现象,而是整个训练过程的底色,这正是“从第一步就贴住”的字面意思。这张图是 SFT 场景的曲线,同样的画面在预训练和强化学习里以数字形式重演。

最戏剧性的一幕在强化学习。RLVR(带可验证奖励的强化学习,Reinforcement Learning with Verifiable Rewards)是当前推理模型在数学、代码这类答案可自动判对的场景上自我进化的主流范式,也是 LoRA 类方法最容易翻车的地方。论文用 DeepSeek-R1-Distill-Qwen-1.5B 加上 DAPO-Math-17K 数据、DAPO 训练目标做对照:NoRA 平均 44.4,标准 LoRA 42.8,未微调的 base 模型 41.0。而两个用谱分解初始化 A 的改进方法直接崩盘:PiSSA 只剩 0.2,MiLoRA 只剩 18.0。同样是 LoRA 的改进,用预训练权重的奇异向量初始化在正常微调里表现不错,一进 RL 就归零,NoRA 则完全不受影响。这与其不依赖预训练权重谱分解相一致,但该对照不能单独证明失效原因。NoRA

还有两个容易被忽略的收益。第一,忘得少了。微调新任务常常以遗忘预训练知识为代价,论文在 MMLU、AGIEval、ARC-C 上统计微调前后的平均变化:NoRA 是 +0.02,基本不升不降。标准 LoRA 是 −0.56,MiSS −0.70,RSLoRA −0.51。提升适应性的同时没牺牲已有能力,这在 LoRA 类方法里不常见。第二,它能叠加。把同一套归一化套到 DoRA 上,DoRA 从 38.30 提到 NoRA-init-DoRA 的 41.40,再到 NoRA-DoRA 的 43.34,说明沿 rank 维度归一化不是 LoRA 专属的小技巧,而是低秩适配的通用优化原则。NoRA

现在可以回答标题里的问题了:这个零成本的改动可信吗?要分清两层。收益侧,它有清晰的机制解释(修 diag(P),恢复梯度量级),有作者在三种训练范式中的一致结果,有 SFT 曲线作为持续性证据,不是刷了个榜的偶然。成本侧,“零额外参数、零推理开销”不是宣传话术而是结构性质:归一化只作用于参数本身、与输入无关,Norm(A) 可以合并回 W₀。对一个工程团队来说,把标准 LoRA 换成 NoRA 几乎就是换一行前向代码的事,收益期望为正,且无额外参数和推理开销;训练端开销及适用性仍须本地验证。

但也别把账算满。论文自己列了一串边界。超低 rank(r < 4)下是否还稳定,没有覆盖。所有实验都是 bfloat16,与 QLoRA 这类量化训练是否兼容,也没验证。与 LoRA+、rsLoRA 能否叠加,没有消融,只有和 DoRA 的组合数字。RL 场景只验证了 DAPO 目标,PPO、GRPO 下的行为未知。持续归一化版本每步重算范数的开销,没有实测。这些不是否定它的理由,而是说“值得先试”和“边界已闭合”是两件事。

微调的第一步,不应该由一组随机数决定。NoRA 的全部主张可以压缩成这句话,而它用一行归一化,把被随机尺度窃走的优化节奏还给了训练本身。想深入可以读原文:Normalized Low-Rank Adaptation,arXiv:2608.31036。

参考文献

NoRA:一行归一化,让 LoRA 训练从第一步就贴住全参微调