文件很小,不代表两个专用适配器可以直接组合
企业把同一个模型适配到两个任务,得到两个小型LoRA(Low-Rank Adaptation,低秩适配)适配器。为了保留两者的能力,平均参数似乎很自然。但平均的究竟是模型的实际更新,还是表示更新的两个因子?这不只是形式上的区别。我们将构造两个实际更新完全相同的适配器,却发现简单因子平均得到零更新。
核心问题是:怎样组合因子化更新而不引入无关项?如果还要保持原有秩,又会付出什么代价?分析使用构造的2乘2矩阵、已执行计算和经过检查的压缩,没有训练模型、测量准确率或复现基准。ICML 2026研究提供当前背景,与本文教学结果明确区分;本文不是原创研究论文。
先看乘积,再看紧凑表示
对一个线性层,令W₀为基础模型矩阵,有d行、k列。LoRA用两个矩阵表示修改:B有d行、r列,A有r行、k列。乘积BA与W₀形状相同,但秩不超过r。秩限制更新能表达的独立方向数量,并不直接衡量回答质量。
s为适配器缩放系数。例子中取1;实际系统定义合并之前,必须把它计入有效更新。适配器需要对应同一基础模型和兼容层。矩阵形状相同,并不能证明从不同基础模型训练的适配器可以组合。这是问题定义的一部分,不能仅检查因子文件就代替。
因子分解并不唯一
可以把B理解为建立输出方向,把A理解为给这些方向分配坐标。放大B中的一个方向,再在A中用相反比例补偿,乘积就不变。一般地,对于可逆的r乘r矩阵Q,BQ和Q的逆乘A仍表示BA。模型使用的是乘积,而不是内部坐标的任意选择。
我们没有改变任务,也没有改变线性层的作用,只是用两种方式描述同一个矩阵。声称要平均实际更新的方法,应当尊重这种等价性。如果适配器的乘积不变,仅重新因子化就改变结果,方法实际上还在平均一种表示选择。第一个实验正是要隔离这个问题,没有引入任务间冲突。
两个相同更新为何变成零
选择一个只作用于第一坐标的秩1更新。第一个适配器使用列向量B₁=(1,0)与行向量A₁=(1,0)。第二个把两者符号都反过来。两个负号相消,因此其乘积也只有左上角为1,其他位置为0。所需的乘积平均仍然是该矩阵,而不是零。
但如果分别平均B₁与B₂、A₁与A₂,两个平均因子都变成零,乘积也为零。第二适配器仅用了等价表示,却让整个更新被消除,尽管两者的实际效果完全一致,无需调和。这是对简单因子平均的反例,并不证明所有LoRA合并方法都不可能。
不只符号变化会出问题。代码把B₂乘以非零c,同时把A₂除以c,乘积保持不变。c=4时,因子平均在第一位置给出1.5625,而不是1;c=−2时得到−0.125。因此,即使两个适配器的线性效果都不变,这种方法仍可能放大更新,甚至反转方向。
展开乘积就能看到交叉项
为找出原因,取0到1之间的权重w,比较两种操作。更新平均组合wB₁ A₁与(1−w) B₂ A₂。因子平均则先分别组合B与A,再相乘。展开后出现B₁ A₂与B₂ A₁,把一个适配器的因子与另一个适配器的因子配对,原有项的权重还变成平方。这已经不是所声明的更新平均。
程序用五个w值验证最后一个恒等式。它也解释特殊情况:若两个B相同,或两个A相同,差值为零;w=0或w=1也不再组合。它们是充分条件,并不允许我们假设独立训练的适配器共享因子。矩阵形状相同,不能证明内部坐标已经对齐。
精确求和是可以的,但秩可能增加
要精确计算D,可以把加权后的B横向拼接,把A纵向堆叠。分块乘法只产生对应乘积,没有交叉项。若输入秩为r₁与r₂,结果秩至多为r₁+r₂,同时受d与k限制。各适配器的缩放系数可以吸收到对应的加权B中,无需假设所有缩放相同。
代价体现在形状中:若R为各秩之和,两个因子包含R(d+k)个系数,而不是原秩r下的r(d+k)。这是参数计数,不是总RAM或延迟。在极小的2乘2例子里,秩2分解甚至比稠密矩阵更不省存储;它的作用是展示可核查代数。对于大层,收益取决于R相对d和k的大小。
当两个适配器增加独立方向时
第二个实验真正组合不同效果:第一个更新为diag(2,0),第二个为diag(0,1)。等权平均得到D=diag(1,0.5),秩为2。各输入适配器的秩都是1,但平均包含两个独立方向。这是结构变化,不是数值误差。单个秩1适配器无法精确表示该矩阵。
简单因子平均得到最后一个矩阵:不仅对角元素变了,还出现两个原更新都没有的非对角系数。拼接则精确恢复D。误差采用Frobenius范数,即所有系数差的平方和再开方。这是矩阵距离,不是任务准确率百分比。
回到原秩就意味着选择丢掉什么
奇异值分解SVD把矩阵分解为输入和输出方向,并配以非负强度。D的奇异值为1和0.5。按Frobenius距离,最优秩1近似保留1、丢弃0.5,得到diag(1,0),误差为0.5。它对这个距离最优,并不表示对模型可能承担的所有任务都最优。
| 方法 | 结果秩 | Frobenius误差 |
|---|---|---|
| 因子平均 | 1 | 0.7905694150 |
| 秩1 SVD | 1 | 0.5000000000 |
| 精确拼接 | 2 | 0.0000000000 |
用输入e₂=(0,1)具体说明边界:目标更新输出(0,0.5),截断版本输出零。我们不是说模型损失了100%的准确率,因为这里没有基准。精确且已验证的陈述是:该方向上的线性作用被完全消除了。理解压缩准则时,必须同时考虑真正重要的输入与目标。

不先构建稠密矩阵,也可以压缩
精确求和与表示成本是两个问题。若拼接后的R相对d和k较小,可以在瘦因子上工作。QR分解把各因子写成具有正交归一列的基与紧凑矩阵的乘积。正交归一表示方向相互垂直且长度为1;转到这些坐标,会保持所表示子空间内的欧氏距离。
当R不超过d和k时,核心Rb乘Ra转置的大小为R乘R。可以计算其SVD,保留r个分量,再通过Qb、Qa映回。程序验证该流程在构造例子中与直接截断D的SVD得到相同矩阵。这不是CtM论文方法的实现,而是检查“先精确求和、再压缩”的QR核心路径。
对于稠密瘦因子,在上述维度条件下,两次QR的算术成本量级约为(d+k) R²,核心SVD约为R³。我们没有运行大模型,因此不把复杂度换算为毫秒或实测内存节省。R增大时,核心空间也会逐渐失去优势。因子化可以避免部分成本,但不意味着可以免费合并任意多适配器。
2026研究背景:在合并之前选择子空间
Zhengbao He等人的Compress then Merge已收录于ICML 2026会议论文集PMLR 306,第41212–41243页。我们阅读了2026年6月2日arXiv 2606.03723 v 1中的方法与实验协议,并独立核实会议发表状态。该工作把共享子空间选择与后续合并算子分开,通过构造限制输出秩,而不是合并后才压缩。
这些结果不能自动迁移到企业场景。已读协议使用秩16适配器,在CLIP ViT-B/32上进行八项视觉任务,在LLaMA3-8B上进行六项自然语言推断任务,使用验证集选择超参数,并相对单任务适配器归一化测试结果。我们未复现这些实验。矩阵秩的保证并不是能力的普遍保证;子空间选择仍需针对相关任务评价。
证明了什么,还需要测量什么
结果区分了三个常被混淆的问题:平均的代数正确性、目标秩下对结果的可表示性,以及模型在数据上的质量。符号反例针对第一个,秩2对角矩阵针对第二个。第三个需要数据集、基线、适配配置及独立评价。两个构造例子都不能单独证明真实模型回答有所改善。
例子不含EL-AI产品权重,也不含客户数据。代码使用Python与NumPy,矩阵固定,无随机性,保存结果及10⁻¹²容差。代码片段的三个断言分别检查目标效果、错误结果与正确拼接。只检查因子形状会漏掉问题;测试的依据应是乘积和所声明的性质。
答案很明确:因子平均通常不同于更新平均,因为交叉项出现了,而且结果依赖不唯一的表示。拼接提供精确构造,但可能增加秩。再压缩需要选择可以接受的损失,而Frobenius误差本身不能直接转化为业务效用。在组合能力之前,首先要知道软件实际执行了哪种数学操作。
来源与延伸阅读
import numpy as np
B1=np.array([[1.],[0.]])
A1=np.array([[1.,0.]])
B2=-B1; A2=-A1
expected=(B1@A1+B2@A2)/2
factor_average=((B1+B2)/2)@((A1+A2)/2)
assert np.allclose(expected,[[1,0],[0,0]])
assert np.allclose(factor_average,0)
Bcat=np.concatenate([B1/2,B2/2],axis=1)
Acat=np.concatenate([A1,A2],axis=0)
assert np.allclose(Bcat@Acat,expected)
print(expected, factor_average)
代码、数据与说明 · JSON. 教学计算使用 Python 3.14.0,图使用 Matplotlib 3.11.2。分析由 AI 辅助,不声称经过同行评审或人工审核。原创 ImageGen 封面仅作示意,不记录 EL-AI 人员、场所或实际安装。来源查阅于 2026 年 10 月 21 日。

