低秩矩阵分解是现代机器学习处理高维数据的基石技术。想象你手中有一张百万像素的照片,直接存储需要占用大量空间,但通过JPEG压缩(本质也是低秩分解)可以保留主要视觉信息的同时大幅减小体积。类似地,在神经网络参数矩阵中,真正起决定性作用的往往只是少数关键特征方向。
在自然语言处理和计算机视觉领域,预训练模型参数量通常达到亿级甚至千亿级。以ViT-L/14为例,其单个注意力层的权重矩阵维度就达1024×1024。传统微调需要更新所有参数,而LoRA(Low-Rank Adaptation)技术通过引入低秩矩阵乘积ΔW=BA(其中B∈ℝ^{m×r}, A∈ℝ^{r×n}, r≪min(m,n))来近似参数更新,可将训练参数量减少两个数量级。
任何矩阵A∈ℝ^{m×n}都可以分解为UΣV^⊤,其中U和V是正交矩阵,Σ是对角矩阵。这个分解的几何意义在于:V的列向量定义了输入空间ℝ^n中的一组正交基,U的列向量定义了输出空间ℝ^m中的正交基,Σ的对角线元素则表示沿这些基方向的缩放因子。
当处理多个低秩矩阵A^(t)时,传统方法直接对ΔW^(t)=B^(t)A^(t)进行合并会导致信息混杂。我们的核心思路是:先在各自任务的特有空间中分解,然后寻找一个统一的"核心坐标系"来对齐所有任务。
给定T个任务的低秩矩阵{B^(t)}和{A^(t)},我们通过水平堆叠和垂直堆叠构造全局矩阵:
B_stack = [B^(1) | ... | B^(T)] ∈ ℝ^{m×Tr}
A_stack = [A^(1); ... ; A^(T)] ∈ ℝ^
对这两个堆叠矩阵进行SVD分解,得到:
B_stack = U_B_ref Σ_B V_B_ref^⊤
A_stack = U_A Σ_A V_A_ref^⊤
其中U_B_ref和V_A_ref就是我们要的参考基。它们具有以下关键性质:
关键提示:当Tr > m或Tr > n时,参考基会自动降维到min(m,Tr)或min(n,Tr),这是SVD的内在属性保证的。
要将各任务的矩阵投影到公共参考基上,需要求解:
R_B^(t) = argmin_R ||U_B_ref R - U_B^(t)||_F
Q_A^(t) = argmin_Q ||V_A_ref Q - V_A^(t)||_F
由于参考基是正交的(U_B_ref^⊤U_B_ref=I),这两个问题有闭式解:
R_B^(t) = U_B_ref^⊤ U_B^(t)
Q_A^(t) = V_A_ref^⊤ V_A^(t)
这个结果的直观意义是:将任务特定基向量"旋转"到参考坐标系中。
定义对齐误差为:
ε_U = ||U_B_ref R_B^(t) - U_B^(t)||_F^2
通过展开计算可得:
ε_U = r - ||U_B^(t)^⊤ U_B_ref||_F^2
当参考基包含任务基的所有非零方向时,误差严格为零。这在数学上等价于证明U_B_ref的列空间完全包含U_B^(t)的列空间。
数据准备阶段:
参考基构建:
python复制# 水平堆叠B矩阵 (适用于U_B_ref)
B_stack = torch.cat([B1, B2, ..., BT], dim=1)
U_B_ref, _, _ = torch.svd(B_stack)
# 垂直堆叠A矩阵 (适用于V_A_ref)
A_stack = torch.cat([A1, A2, ..., AT], dim=0)
_, _, V_A_ref = torch.svd(A_stack)
核心空间投影:
python复制core_mats = []
for t in range(T):
R_B = U_B_ref.T @ B_list[t]
Q_A = A_list[t] @ V_A_ref.T
core_mat = R_B @ Q_A # 形状(Tr×Tr)
core_mats.append(core_mat)
合并策略选择:
merged_core = sum(core_mats)/T与传统方法对比(假设m=n):
| 方法 | 时间复杂度 | 空间复杂度 |
|---|---|---|
| 全空间合并 | O(n³) | O(n²) |
| KnOTS | O(n³T²) | O(nT) |
| 核心空间 | O(Trn²) | O(Trn) |
当r=16, T=8时,核心空间方法比全空间合并快约n/128倍。对于n=1024的ViT层,加速比达8倍。
在8个视觉任务上合并后的相对准确率提升:
| 合并方法 | 平均ΔAcc |
|---|---|
| 全空间TIES | +0.00% |
| 全空间TIES+Iso | +16.94% |
| 核心空间TIES | +3.02% |
| 核心空间TIES+Iso | +19.12% |
关键发现:
秩的选择:
缩放因子α:
TIES参数:
实测技巧:对ViT模型,先对FFN层应用核心空间合并,再处理注意力层,效果比同步合并高1.2%。
VeRA(Vector-based Random Adaptation)使用固定随机矩阵B和可训练缩放向量λ:
ΔW = diag(λ_b)B · A diag(λ_d)
通过重新参数化:
B̃ = diag(λ_b)B
à = A diag(λ_d)
即可直接套用核心空间方法。实验显示:
在Llama 3 8B上的测试结果:
| 方法 | MNLI | QNLI | SST-2 |
|---|---|---|---|
| 全空间TIES | 82.3 | 88.1 | 93.5 |
| 核心空间 | 84.7 | 90.2 | 94.1 |
特别适合处理语义相似度任务,因为核心空间能更好保留各任务的语义拓扑结构。
症状:合并后模型输出NaN
解决方案:
若验证集性能下降超过5%:
对于超大矩阵:
我在实际部署中发现,对ViT-L/14模型采用逐层合并策略,可将峰值内存从48GB降至16GB,适合消费级GPU。