ELAI S.r.l.

LoRA 不止于节省内存:秩、适配的几何结构与可测量的极限

低秩更新何时足够?通过梯度推导、奇异值分解、协方差反例和可复现实验,深入分析 LoRA 的表示能力与局限。

LoRA 不止于节省内存:秩、适配的几何结构与可测量的极限

技术深析 · 2026 年 9 月 21 日 · 线性代数、模型适配与可复现实验

摘要

低秩更新何时足以让模型适应专业任务?答案取决于哪些方向需要改变、哪些输入使这些方向变得重要,以及优化器能否到达相应解。本文推导 LoRA 的参数数量与梯度,通过奇异值分解分析其表示能力的极限,并在两个受控问题上进行测量。对于 64 × 64 的矩阵,同样采用秩 8,未被表示的更新能量可以是 13.53%,也可以是 87.50%。第二个例子进一步说明,最小化权重重建误差可能选中不适合数据分布的方向。因此,秩应被视为关于任务几何结构的假设,并与输入分布、优化过程和泛化能力一起检验。

本文的贡献性质。这是包含原创可复现计算的教学分析,并非经过同行评审的新研究。实验使用合成矩阵与解析解,不训练大语言模型,也不测量其准确率。阅读需要了解矩阵、导数与监督学习的基本概念。

1. 参数数量无法回答的问题

让模型适应技术文档,看起来首先是一个成本问题:更新模型需要多少内存?然而,还有一个更基础的问题:哪些变换需要改变?一个含有数百万系数的矩阵,可能只需要在少数方向上修正;另一个同样大小的矩阵,则可能需要在许多方向上进行彼此独立的修正。初始模型的系数数量无法区分这两种情况。

Hu 等人在 2021 年提出的 LoRA 冻结预训练矩阵,并学习一个分解形式的修正项。其科学意义恰恰在于对修正项施加的约束。原始论文报告了特定模型和任务上的结果,并没有证明每一种专业化任务都适合很小的秩。本文将三个经常混淆的问题分开:所需更新能否被表示?训练能否找到它?得到的解在新数据上是否仍然有效?[1,第 4、7 节]

这种区分可以避免常见的实验误读:提高秩后分数没有提升,并不等于已经证明任务在本质上很简单。原因也可能是数据不足、选择了不合适的适配模块,或者更新尺度不恰当。反过来,更高的秩降低了训练损失,也不能证明它改善了样本外表现。

2. 从完整矩阵到分解形式的修正项

为了突出机制,考虑一个不含偏置的线性层。输入 x 有 k 个分量,输出 h 有 d 个分量,初始矩阵 W₀ 的维度为 d × k。全参数微调可以改变全部 dk 个系数。LoRA 的参数化形式为:

Weff = W₀ + ΔW,   ΔW = sBA
A ∈ ℝr×k,   B ∈ ℝd×r,   h = W₀x + sB(Ax).   (1)

r 是更新矩阵的最大秩,s 是控制更新尺度的非零标量。A 将输入压缩到 r 个坐标,B 再将其映射到输出空间。BA 的每一列都属于 B 的列向量张成的空间,因此 rank(BA) ≤ r。这个约束针对 ΔW,而不是 W₀ 或 Weff;后两者仍然可以是满秩矩阵。冻结 W₀ 并不意味着它变小了,也不意味着可以将它从内存中移除。

A 存储 rk 个系数,B 存储 dr 个系数。对于单个 d = k = 4096 的方阵,可以得到下列比较。这里统计的是可训练系数,不包括偏置或其他模块:

配置可训练系数数量相对于 4096² 的比例
完整更新16,777,216100%
LoRA,r = 865,5360.390625%
LoRA,r = 16131,0720.78125%
LoRA,r = 64524,2883.125%

当秩为 8 时,这个矩阵需要训练的系数数量变为原来的 1/256。但这不意味着总内存也降至 1/256:冻结的权重、激活值、缓冲区,以及依实现而定的权重副本和优化器状态仍然存在。梯度也仍需通过模型传播。实际节省量取决于数值精度、序列长度、批次大小和涉及的模块。

分解形式还存在冗余。对于任意可逆的 r × r 矩阵 R,(B, A) 与 (BR, R⁻¹A) 生成相同的更新。在秩恰好为 r 的矩阵集合上,对应流形的自由度为 r(d + k − r),而实际存储的参数仍有 r(d + k) 个。这说明,内存中数字的数量并不等于彼此独立的功能方向数量。

对于单个输入向量,额外分支在 W₀ 的矩阵乘法之外,还需要与 r(k + d) 成正比的计算量。训练完成后,如果数值格式与部署设施允许,可以把 sBA 合并到 W₀ 中,只使用一个矩阵。但这种代数上的可合并性,并不自动保证所有系统中的延迟都保持不变,尤其是在保留独立适配器或使用量化权重时。

3. 梯度如何解释初始化与缩放

用 L 表示损失,用 G = ∂L/∂Weff 表示相对于有效权重矩阵的梯度。G 的维度为 d × k。从 dWeff = s(dB)A + sB(dA) 出发,使用矩阵内积 ⟨P,Q⟩ = tr(PᵀQ),分别收集 dA 与 dB 的项,可得:

∂L/∂B = sGAᵀ ∈ ℝd×r
∂L/∂A = sBᵀG ∈ ℝr×k.   (2)

如果把 B 初始化为零,把 A 初始化为非零随机值,初始更新就是零,模型从预训练函数出发。在第一步,A 的梯度为零,而 B 的梯度可以非零。B 改变之后,A 也能够开始学习。如果两者都初始化为零,则这种参数化下的两个梯度都会被阻断。这不是表面上的实现细节:初始化的不对称性使模型既能从原函数出发,又不妨碍学习。

这些公式也解释了为什么因子分解会改变优化过程。在同时更新两个因子的普通梯度下降中,设步长为 η,并忽略 η² 阶项,更新矩阵的变化为:

δ(ΔW) ≈ −ηs²[G AᵀA + BBᵀG].   (3)

如果直接微调完整矩阵,步进方向则为 −ηG。AᵀA 与 BBᵀ 根据当前因子的几何结构对梯度进行变换。即使表示能力足够,优化轨迹也可能不同。式(3)针对普通梯度下降,并不精确描述 Adam、权重衰减或梯度裁剪。它的作用是分离出一个机制,而不是替代真实训练的测量。

经典约定 s = α/r 将尺度与秩联系起来。因此,保持 α 不变而改变 r,会同时改变表示能力和优化动态。rsLoRA 提出 s = α/√r,其依据是在明确的初始化与缩放假设下,对秩稳定性进行的分析。实践中的启示是:应在一致的实验协议下比较秩、缩放因子与学习率,而不能假设一个固定 α 就能使所有实验具有可比性。[2,第 2—4 节]

4. 可测量的极限:有多少能量无法保留?

暂时假设我们知道目标修正矩阵 ΔW*。这个人为假设有助于研究表示能力;真实的专业化任务并不会直接提供这张矩阵。将其进行奇异值分解,并把奇异值从大到小排列:

ΔW* = U diag(σ₁, …, σm) Vᵀ,   m = min(d,k).
ΔW*r = Σi=1…r σi uiviᵀ.   (4)

向量 ui 与 vi 在各自的空间中构成标准正交基。截断求和意味着只保留 r 个基本变换。SVD 在 Frobenius 范数下的最佳逼近性质表明:对于这一标准,任何秩不超过 r 的矩阵,都不可能优于截断后的和。Frobenius 范数的平方等于所有矩阵元素的平方和。

minrank(M)≤r ‖ΔW* − M‖²F = Σi=r+1…m σ²i
εr = (Σi>r σ²i) / (Σi≥1 σ²i).   (5) [4]

残差恒等式也可以直接看出:uiviᵀ 各项在 Frobenius 内积下彼此正交,因此被舍弃各项的能量可以直接相加。截断的最优性则补上了关键一步:这里给出的不仅是某个可行近似,而是在指定秩与度量下所能达到的最佳极限。

LoRA 能表示这个极限:当 s 为正时,可取 B = Urdiag(√σi/√s),A = diag(√σi/√s)Vrᵀ,于是 sBA = ΔW*r。这是一种证明存在性的构造,不是基于文本的训练算法。它既不证明优化器能找到这些因子,也不证明重建矩阵就是大语言模型应当优化的目标。

5. 已执行的实验:相同的秩,不同的问题

我们构造两个 64 × 64 矩阵,使用相同的正交基 U 和 V;这些正交基由高斯随机矩阵的 QR 分解得到。第一种情况设 σi = exp(−(i−1)/8),使少数方向集中了大部分能量。第二种情况的所有奇异值均为 1,没有任何方向享有优先地位。对每个秩计算截断 SVD,并测量 εr。这里没有噪声、没有训练阶段,也没有在测试集上选择超参数。

随机种子为 20260921。计算使用 Python 3.14.0、NumPy 2.5.3 和 float64 精度;图表由同一组结果通过 Matplotlib 3.11.2 生成。为核验其功能层面的含义,我们还使用 20,000 个独立高斯输入 x ∼ N(0,I),比较平均输出误差能量与目标输出能量。

合成奇异值谱与不同秩对应的残差能量比例;秩为 8 时,两种情况的残差分别为 13.53% 和 87.50%。
图 1。左图为预设的两种奇异值谱;右图为通过 SVD 计算的最优残差。奇异值谱的纵轴使用对数尺度,残差的纵轴使用线性尺度。来源:随文提供的合成实验,并非语言模型基准测试。
秩 r衰减谱的残差平坦谱的残差
177.8801%98.4375%
260.6531%96.8750%
436.7879%93.7500%
813.5335%87.5000%
161.8316%75.0000%
320.0335%50.0000%
640%0%

在平坦谱情况下,公式简化为 εr = (64−r)/64。秩为 8 时损失 87.5% 的能量,对这一目标而言是不可避免的,即使优化器完美也一样。对于衰减谱,秩 16 则能保留约 98.17% 的能量。如果不说明奇异值谱和度量就说“秩 16 已经足够”,恰恰删去了使结论有用的关键信息。

使用 20,000 个输入进行检查时,秩 8 在第一种情况下的经验残差为 13.4516%,第二种情况为 87.5061%,与理论值接近。这是蒙特卡洛核验,并非置信区间,也不是语料库实验结果。当奇异值相同时,SVD 选择的基并不唯一:不同环境中的微小数值差异可能改变样本残差,但不会改变理论残差。

参数数量还揭示了另一个边界:对于 64 × 64 矩阵,分解形式存储 128r 个系数。秩为 32 时存储 4096 个,已经与完整矩阵一样多;秩为 64 时则是完整矩阵的两倍。这里包含这些秩,是为了展示完整的表示能力曲线,而不是把它们推荐为节省参数的选择。不能将 4096 × 4096 示例中的成本比例直接套用到这个更小的合成问题。

6. 反例:数据分布可以颠覆选择

Frobenius 范数对所有坐标赋予相同权重,但真实系统接收的输入不一定是各向同性的。设输入均值为零,协方差为 Σ = E[xxᵀ],矩阵误差为 E = ΔW* − M,则输出的期望平方误差为:

Ex[‖Ex‖²₂] = tr(EΣEᵀ) = ‖EΣ1/2‖²F.   (6)

这里 E 表示误差矩阵,而 Ex[·] 表示统计期望。如果 Σ = I,就得到前面的标准;否则,重要的是误差与输入分布的共同作用。取 ΔW* = diag(4,1),Σ = diag(1,100)。在 Frobenius 范数下,最佳的秩 1 近似为 MF = diag(4,0):它保留最大的奇异值,留下的系数平方误差为 1。

但是,输入第二个坐标的方差为 100。舍弃它会造成 100 的期望输出误差。如果改选 MΣ = diag(0,1),系数误差虽然上升到 16,期望输出误差却下降到 16。完全不作修正时,输出误差为 116。因此,仅考虑权重的标准,反而会为这个输入分布选择较差的解。

修正项系数误差 ‖E‖²F期望输出误差
无修正:diag(0,0)17116
MF = diag(4,0)1100
MΣ = diag(0,1)1616

如果 Σ 为正定矩阵,可以先对 ΔW*Σ1/2 进行截断 SVD,再在右侧乘以 Σ−1/2,得到加权问题的解。可逆变换保持矩阵的秩。如果 Σ 是奇异矩阵,则必须单独处理它的支撑子空间,不能直接使用普通逆矩阵。即使在线性问题中,数据分布也会改变哪些方向值得分配参数预算。

Transformer 中的情况更复杂:每层的输入取决于前面的层,最终损失并非线性输出之间的简单距离,适配多个模块还可能改变内部表示。因此,单个更新矩阵的 SVD 是一种诊断工具,而不是自动为整张网络分配秩的规则。

7. 从表示能力走向垂直模型的实验协议

让模型适应某个领域,首先需要明确什么算作改进:从文档提取字段、正确使用专业术语、执行带约束的指令,是不同的目标。平均分数可能掩盖罕见案例上的退化。训练与测试的划分也必须遵循真实的信息单元:把同一文档中几乎相同的页面随机分到两边,会让评估变得过于容易。

一个可提出但尚未在本文执行的协议,是将基础模型与秩 4、8、16、32 的配置进行比较,并在第一阶段固定适配模块。为每个配置分配可比的学习率与尺度搜索预算,使用多个随机种子,在验证集上选择超参数。在作出选择之前,最终测试集保持独立。随后,在条件允许且参数预算相同的情况下,比较只适配少数模块与将适配分散到更多模块的方案。

应记录领域任务质量、通用对照任务表现、峰值内存、耗时、token 数量,以及不同运行之间的波动。资源允许时,与全参数微调比较,有助于区分参数化约束的限制与基础模型本身的限制。更多训练轮次或更多超参数搜索尝试,不应成为只给予某个配置的隐性优势。

训练与验证曲线提供线索,而不是绝对可靠的诊断。如果两者都表现不佳,表示能力、优化和数据质量仍然都是待检验的原因。如果只有训练表现改善,提高秩可能只是在拟合样本的特殊性。如果平均表现改善但某个关键子集退化,决策应服从实际用途,而不是被汇总分数吸引。

另一条研究方向是改变参数化方式。DoRA 将权重的幅值与方向分离,并对方向分量使用低秩更新。2024 年的论文提出这种设计以改变适配动态,并在特定任务上进行评估。它不只是“更高秩的 LoRA”,也不保证在所有场景中占优。本文没有复现 DoRA 或 rsLoRA;这里对它们的讨论属于有文献依据的方法比较,而非本实验的结果。[3,第 3—5 节]

8. 复现、检查与适用边界

下面的核心代码展示如何计算残差。下载文件还包括矩阵构造、蒙特卡洛检查、协方差反例,以及利用有限差分检验梯度的代码。梯度检查得到的最大绝对误差约为 2.71 × 10⁻⁹。

u, singular, vh = np.linalg.svd(target, full_matrices=False)
approx = (u[:, :r] * singular[:r]) @ vh[:r, :]
residual = target - approx
epsilon = np.sum(singular[r:]**2) / np.sum(singular**2)
direct = np.sum(residual**2) / np.sum(target**2)
assert abs(epsilon - direct) < 1e-12

完整重运行的方法是:安装 NumPy,然后执行 python experiment.py --out results.json。JSON 文件记录版本、随机种子、维度和结果。脚本不需要模型、凭证或外部数据集。数值可复现应理解为在代码规定的容差内一致,而不是在任何 BLAS 库上每一位数字都完全相同。

下载代码、结果、绘图脚本与说明 · 下载 JSON 结果

主要限制是有意设置的:我们使用一个知道 ΔW* 的“预言机”,而不是学习它的过程。我们没有测量收敛、标签噪声、语言泛化、GPU 内存或延迟。各向同性案例与各向异性反例证明的是所构造问题的数学性质,并不估计某个商业模型更新的分布。引用的论文也各有自己的发表时间和实验协议;本文并非对 2026 年前沿研究的穷尽综述。

9. 技术结论

LoRA 使一类受约束的更新变得经济可行。它是否适用,取决于这一更新族能够表达的方向所具有的能量和功能重要性。我们的计算展示了两种推理错误:相同的秩不意味着相同的相对重建能力,更好的权重重建也不意味着数据上的误差更小。梯度公式又补充了第三个层面:某个解即使能够被表示,在所选参数化下也可能难以学到。

对于 EL-AI 希望进一步探索的垂直模型工作,这提出了一个具体的设计问题:任务需要哪些适配方向,又能通过什么测量证明模型已经学会这些方向?随文实验是本次出版的教学材料,不是某个已验证产品或客户项目的证据。科学上有意义的下一步,是使用严格划分的领域数据、明确的资源预算和可重复的比较来检验这些假设。

原始文献

  1. Hu, E. J. 等。LoRA: Low-Rank Adaptation of Large Language Models。arXiv:2106.09685,第 2 版,2021 年。方法与秩分析:第 4、7 节。
  2. Kalajdzievski, D. A Rank Stabilization Scaling Factor for Fine-Tuning with LoRA。arXiv:2312.03732,第 1 版,2023 年。缩放假设与分析:第 2—4 节。
  3. Liu, S.-Y. 等。DoRA: Weight-Decomposed Low-Rank Adaptation。arXiv:2402.09353,第 3 版,2024 年。分解、方法与评估:第 3—5 节。
  4. James, D., Solomon, J. Singular Value Decomposition。Stanford CS 205A,2016 年。第 25—26 张幻灯片:Eckart–Young 定理与矩阵范数。 [4]

封面为 AI 生成的示意图,并非 EL-AI 真实场所或部署的照片。科学图表根据随文计算数据生成。