一切的开始:O-LoRA

论文:Orthogonal Subspace Learning for Language Model Continual Learning,2023.10
官方代码仓库:https://github.com/cmnfriend/O-LoRA

【符号说明:本文沿用代码中常见的 ΔW=BA\Delta W=BA,AA 是降维/输入侧因子,BB 是升维/输出侧因子。O-LoRA 论文 §3.2 的 ABAB 中,AA 却是 d×rd\times r 的列空间基;其公开代码实际对输入侧的 lora_A 与 loranew_A 加正则。因此这里不只是交换字母,还存在论文表述与实现约束侧的差别。下文的“输入过滤器”按代码及本文记法解释;原论文的论据是用 LoRA 子空间代理历史梯度子空间。】

h=Winitx+BAxh = W_{\text{init}}x + BAx

大家都知道,LoRA 的先作用矩阵,也就是本文中的 AA 矩阵,是决定 LoRA 分支会对哪些输入特征方向产生响应的关键。

先来说为什么:

因为 AA 矩阵是先和 xx 相乘的矩阵。

把 AA 拆成一行一行看:

A=[a1⊤a2⊤⋮ar⊤]A= \begin{bmatrix} a_1^\top\\ a_2^\top\\ \vdots\\ a_r^\top \end{bmatrix}

那么:

z=Axz=Ax

等价于:

z1=a1⊤x,z2=a2⊤x,⋮zr=ar⊤x.\begin{aligned} z_1 &= a_1^\top x,\\ z_2 &= a_2^\top x,\\ &\vdots\\ z_r &= a_r^\top x. \end{aligned}

也就是说,AA 的每一行都在问:

当前 hidden state xx 里,有没有我关心的这个方向?

然后 BB 再把这些低维响应写回输出空间:

Bz=z1b1+z2b2+⋯+zrbrBz = z_1b_1+z_2b_2+\cdots+z_rb_r

所以:

  • AA:决定“看哪些方向 / 由哪些输入特征触发”;
  • BB:决定“触发后往输出空间怎么写”。

因此如果连续学习里想保护旧任务,一个很自然的想法是:让新任务的 AnewA_{\text{new}} 不要看旧任务依赖的特征方向。

所以就有了 O-LoRA 的设计。

【先整体说下 O-LoRA,他们的设计总览就是每来一个新任务,就冻结上一个任务训练的 LoRA 矩阵,并增添一个新的 LoRA 矩阵,通过正则方法确保新 LoRA 矩阵训练过程中尽可能和旧 LoRA 矩阵保持正交。】

按本文的 BABA 记法,一个自然写法是让新旧任务的输入侧矩阵满足:

AtAi⊤≈0,i<tA_tA_i^\top \approx 0,\quad i<t

对应的正交正则可以写成:

Lorth(At)=∑i<t∥AtAi⊤∥F2L_{\text{orth}}(A_t) = \sum_{i<t}\left\|A_tA_i^\top\right\|_F^2

换句话说就是,新的 LoRA 矩阵的 AA 矩阵会和每一个旧任务 LoRA 的 AA 矩阵做内积。

上式是平方 Frobenius 形式的几何说明。

最理想的情景当然是:

AtAi⊤=0A_tA_i^\top = 0

这样新任务和旧任务在输入侧响应方向上尽可能分开。这里我会稍微加一句谨慎的话:这保证的是 AA 子空间正交,不严格等价于完整参数更新 ΔW=BA\Delta W=BA 一定完全不干扰。后面的 BOD 分析正是沿着这个问题继续追问。

CV 领域类似的探索:Orthogonal Adaptation

论文:Orthogonal Adaptation,2023.12

背景就是图片生成领域目前存在一个问题:如果我训练了几个单概念的 LoRA,比如猫 LoRA,狗 LoRA,我现在想生成一张同时有猫和狗的图片,就会出现猫和狗概念混杂的问题。

这个问题被称为串扰,crosstalk。

现有几种方法各有缺陷:

  1. 联合训练:如果每一种概念组合都单独训练,只有两两组合就有 (n2)\binom{n}{2} 种;覆盖任意非空子集则有 2n−12^n-1 种,组合数量会迅速增长。
  2. 直接相加 LoRA,会出现 crosstalk 问题。
  3. Mix-of-Show 的 Gradient Fusion,但是合并三个概念就需要 15 分钟,消耗太大且没有泛化性,和联合训练一个问题。

那就尝试解决 crosstalk,因为这样的话只需要训练各自的 LoRA,然后可以在 1s 内相加 LoRA 并生成联合概念图片。

作者的答案是:冻结 ΔW=BA\Delta W=BA 中的 AA,只训练 BB,而每个任务,或者说概念,分配到的 AA 矩阵都是事先分配的。

先说为什么。

crosstalk 被认为是两个 LoRA 矩阵在相同参数上的互相干扰。

对于概念 ii,单独训练后的某层输出是:

Oi(Xi)=(W+ΔWi)XiO_i(X_i)=(W+\Delta W_i)X_i

其中 XiX_i 是概念 ii 在该层的输入特征。把概念 jj 合并进来后:

O^i(Xi)=(W+ΔWi+ΔWj)Xi=Oi(Xi)+ΔWjXi\begin{aligned} \hat O_i(X_i) &= (W+\Delta W_i+\Delta W_j)X_i\\ &= O_i(X_i)+\Delta W_jX_i \end{aligned}

最后一项:

ΔWjXi\Delta W_jX_i

就是概念 jj 对概念 ii 造成的串扰。理想情况是它等于零,但 XiX_i 通常覆盖很大的输入空间,强行要求它处处为零,会把 ΔWj\Delta W_j 限制得几乎不能学习。

因此作者把要求放松为:只在输入的主要投影子空间中消除串扰。

其实是和 O-LoRA 相近的思路,因为 AA 矩阵是决定 LoRA 分支会对哪些输入特征方向产生响应的关键,所以作者通过新旧任务在 AA 矩阵上的正交来降低串扰。这里仍要区分:因子正交本身并不保证任意真实输入 XiX_i 都满足上面的零串扰条件。

本论文用的方法和 O-LoRA 还是有区别的,他们没有使用正则方法,而是先搞了一个正交基矩阵 OO,满足:

OO⊤=IOO^\top=I

然后从这个共享正交基 OO 里给不同概念抽取不重合的 rr 个方向作为 AiA_i。只要新旧任务抽到的方向不重合,就可以保证:

AiAj⊤=0A_iA_j^\top=0

这就比 O-LoRA 的软正则更硬:O-LoRA 是训练时“尽量正交”,Orthogonal Adaptation 是初始化时就把 AA 分配到互相正交的方向上。

InfLoRA 和 KeepLoRA:从 O-LoRA 上改进

论文:

先说 InfLoRA。他们是冻结 AA 矩阵,训练 BB 矩阵,AA 矩阵是通过算法算出来的。说到这是不是和 Orthogonal Adaptation 这篇论文有点像?只不过 AA 矩阵找法不一样。

设计依据是当前任务在该层的输入特征矩阵:

Ht=[h1t,…,hnt]H_t=[h_1^t,\dots,h_n^t]

因为线性层:

e=Whe=Wh

其梯度满足:

∂L∂W=∂L∂eh⊤\frac{\partial L}{\partial W} = \frac{\partial L}{\partial e}h^\top

所以梯度方向和输入 hh 的 span 有关。

核心就是一个思想:HtH_t 近似当前任务梯度空间。

然后 InfLoRA 会把当前任务输入特征里落在旧任务空间 MtM_t 里的部分减掉:

H^t=Ht−MtMt⊤Ht\hat H_t = H_t-M_tM_t^\top H_t

这里 MtMt⊤HtM_tM_t^\top H_t 就是 HtH_t 投影到旧任务空间里的部分。减掉它之后,H^t\hat H_t 就更像“当前任务还可以安全使用的方向”。之后再对 H^t\hat H_t 做 SVD,拿主方向来构造固定的 AtA_t。

补充一下这一步究竟怎么落实到本文的 BABA 记法。设残差特征的 SVD 为:

H^t=UΣV⊤,At=Ur⊤.\hat H_t=U\Sigma V^\top,\qquad A_t=U_r^\top.

这里 UrU_r 的列位于输入特征空间,把它们转置成 AtA_t 的行,才和 AtxA_tx 的维度一致。固定 AtA_t,只训练 BtB_t,每次权重位移都形如 δBtAt\delta B_tA_t。如果历史特征基为 MtM_t,并且 AtMt=0A_tM_t=0,那么:

(δBtAt)Mt=δBt(AtMt)=0.(\delta B_tA_t)M_t=\delta B_t(A_tM_t)=0.

这说明固定基不是单纯少训练一半参数,而是把允许的更新方向直接写进参数化。保护范围仍是保存下来的特征基:没有被基覆盖的旧特征、深层网络中变化的输入,都不在这个局部恒等式的保证里。InfLoRA 原论文主要面向视觉 class-incremental learning,借用其几何思想时也要区分它和文本指令持续学习的实验协议。

再说 KeepLoRA。KeepLoRA 认为 InfLoRA 只考虑了“不要忘记旧任务”,却没有显式保护预训练模型原本的通用知识。

它先构造两个需要保护的空间。

第一,对预训练权重做 SVD,取大奇异值对应的主空间 WpW_p。作者认为这里主要保存预训练通用知识。

第二,用 Mt−1M_{t-1} 保存旧任务输入特征的主要方向。

然后计算当前任务第一步梯度 GtG_t,删除落在这两个受保护空间中的部分。这里补充一个符号细节:KeepLoRA 原文使用行向量输入和 x(W+AB)x(W+AB),而本文使用列向量输入和 (W+BA)x(W+BA)x。统一到本文记法,输入侧投影应放在梯度右边:

$ \hat G_t

G_t -G_tW_pW_p^\top -G_tM_{t-1}M_{t-1}^\top. $

此时 WpW_p 是本文权重矩阵的输入侧主奇异方向。这种直接相减要求 WpW_p 与 Mt−1M_{t-1} 彼此正交;论文通过在残差空间中积累历史方向来维持这一结构。对任意两组有重叠的基,不能直接相减后就认为得到了正交投影。

对残差梯度做 SVD:

G^t=UΣV⊤,At,0=Vr⊤,Bt,0=UrΣr.\hat G_t=U\Sigma V^\top,\qquad A_{t,0}=V_r^\top,\qquad B_{t,0}=U_r\Sigma_r.

这样 Bt,0At,0B_{t,0}A_{t,0} 是残差梯度的 rank-rr 近似。与 InfLoRA 从激活中选方向相比,KeepLoRA 还利用了当前损失的梯度信息:哪些输入方向确实有助于当前任务,要结合监督信号来决定。

由于两个初始化因子的乘积不是零,作者还会补偿冻结权重。把 LoRA 缩放记为 ss,则:

Wfrozen′=Wbefore−sBt,0At,0.W_{\mathrm{frozen}}'=W_{\mathrm{before}}-sB_{t,0}A_{t,0}.

初始化时总权重仍是 WbeforeW_{\mathrm{before}},不会在开始训练前凭空改变模型输出。随后固定 AtA_t、只训练 BtB_t,任务结束后合并 LoRA,并从当前任务特征中补充历史基。这三个环节是连在一起的:保护基决定不能走哪里,残差梯度决定优先走哪里,初始化补偿保证起点不变。

KeepLoRA 原论文评估的是 CLIP、LLaVA 等视觉语言模型,包含预训练迁移能力的保持;不能直接把它的原始实验结论当作纯文本 LLM benchmark 的结论。

笔者认为这篇文章只不过是在 InfLoRA 的基础上多保护了预训练的语义空间,谈不上什么特别颠覆的创新【唯一创新的一点是参数 WW 的大奇异值近似预训练主子空间?】。他们能中 ICLR 2026 我还是有点惊讶的,感觉有工作量的功劳。

Sculpting Subspaces:从 LoRA 到全参微调

论文:Sculpting Subspaces,2025.4

它的核心假设是:

大奇异值方向保存重要的已有知识;小奇异值方向冗余度较高,可以用来学习新任务。

对每层权重做:

W=UΣV⊤W=U\Sigma V^\top

然后保留大奇异值对应的 Uhigh,VhighU_{\text{high}},V_{\text{high}},并从新任务梯度中删除对应部分:

Gproj=G−UhighUhigh⊤GVhighVhigh⊤G_{\text{proj}} = G -U_{\text{high}}U_{\text{high}}^\top G V_{\text{high}}V_{\text{high}}^\top

它还通过层输入与输出的余弦相似度估计层重要性,为重要层保留更多大奇异方向。

同样是做 SVD 找大奇异值,InfLoRA 做法和本文还是有区别的。前者面向数据,是对从数据来的激活值近似主子空间;后者面向参数,是直接对模型权重的奇异方向做保护。

OA-Adapter:方向要隔离,预算也应该跟着任务变

论文:Budget-Adaptive Adapter Tuning in Orthogonal Subspaces for Continual Learning in LLMs,2025.5。以下对应原文第 2 节。

Motivation:为什么每一层、每个任务都用同一个 rank?

前面几种方法主要在问“新任务往哪个方向更新”。但还有一个问题:新任务究竟需要多少个方向?

如果一个简单任务只需要少数几个维度,仍然给它固定的大 rank,就会浪费参数,也会占用后续任务可用的空间。反过来,复杂任务可能需要更多容量,固定的小 rank 又会限制可塑性。

一种办法是先训练,再判断哪些维度重要,再裁剪或重新分配。但是预算选择与任务优化分成两个阶段,前一阶段认为重要的维度,未必适合最后的预算。OA-Adapter 因此想把“学任务”和“选容量”放到同一次训练里。

Methodology:给每对低秩方向装一个可训练开关

先看普通 adapter:把输入降维,过非线性,再升维,最后加回残差。OA-Adapter 去掉偏置,并把中间的非线性替换成对角门控:

y=x+W2ΓW1x,Γ=diag⁡(γ1,…,γrmax⁡).y=x+W_2\Gamma W_1x,\qquad \Gamma=\operatorname{diag}(\gamma_1,\ldots,\gamma_{r_{\max}}).

其中 W1∈Rrmax⁡×dW_1\in\mathbb R^{r_{\max}\times d},W2∈Rd×rmax⁡W_2\in\mathbb R^{d\times r_{\max}}。这时整个适配分支可以拆成:

W2ΓW1=∑j=1rmax⁡γjW2[:,j]W1[j,:].W_2\Gamma W_1 =\sum_{j=1}^{r_{\max}}\gamma_j W_2[:,j]W_1[j,:].

每一项都是一个 rank-1 更新。于是 γj=0\gamma_j=0 就意味着第 jj 对降维、升维方向不参与输出。这不是给整个 adapter 一个统一缩放,而是在逐个选择瓶颈维度。

作者使用软阈值:

γj=sign⁡(gj)max⁡(∣gj∣−τ,0),reff=∥γ∥0.\gamma_j=\operatorname{sign}(g_j)\max(|g_j|-\tau,0), \qquad r_{\mathrm{eff}}=\|\gamma\|_0.

gjg_j 和阈值 τ\tau 都可训练。如果 ∣gj∣≤τ|g_j|\leq\tau,该维度被关闭。这里关键是 τ\tau 也会更新:即使关闭后的维度没有来自该路径的梯度,只要其他活跃维度推动阈值降低,它也可能重新打开。因此这不是一次裁剪后就永远不能恢复的选择。

正交具体加在哪里?

这篇和前面的输入侧 AA 约束有区别。它保护的是升维矩阵的输出侧列空间。

对历史任务 ss,把门控吸收到升维矩阵里:

W~2(s)=W2(s)Γ(s).\widetilde W_2^{(s)}=W_2^{(s)}\Gamma^{(s)}.

已经关闭的列变成零列,历史任务只保留实际使用的方向。对当前任务 tt,原文的正则项可写为:

Lorth(s,t)=∥(W2(t))⊤W~2(s)∥F2.L_{\mathrm{orth}}^{(s,t)} =\left\|(W_2^{(t)})^\top\widetilde W_2^{(s)}\right\|_F^2.

为什么当前侧用未门控的 W2(t)W_2^{(t)},历史侧却用门控后的 W~2(s)\widetilde W_2^{(s)}?因为当前任务的维度还会打开或关闭,需要让所有候选列避开历史方向;历史任务已经训练完了,只需要保护最终启用的列。

完整流程因此是:为新任务增加候选瓶颈维度;联合训练投影矩阵、门控和阈值;加上对历史已用列空间的正交正则;任务结束后冻结,并把启用维度作为后续任务的保护对象。

我觉得这篇最值得借鉴的是预算和正交约束的耦合。 但它并不提供无限容量:候选上限仍要设定,历史任务仍会累积,而且论文通过损失项推动正交,不能把它当作每一步都严格成立的硬投影。

OLieRA:不只换方向,还换更新的方式

论文:Orthogonal Low-rank Adaptation in Lie Groups for Continual Learning of Large Language Models,2025.9。以下对应原文第 3 节。

Motivation:加一个低秩矩阵,是唯一的适配方式吗?

普通 LoRA 是:

Wnew=W+BA.W_{\mathrm{new}}=W+BA.

即使约束了 AA 或 BB,最后依然是在原权重上做加法。OLieRA 的动机是:任务更新除了避开历史任务,还能否利用原权重自身的结构,让更新变成相对原权重的调整?

作者引入 Lie group 的表述。理解实现时,先不必把它想成复杂的空间旋转:这篇实际使用的是逐元素乘法和逐元素指数,不是矩阵乘法意义上的旋转,也不是矩阵指数。

Methodology:从绝对增量变成逐元素缩放

为避免和加性权重增量混淆,下面把低秩扰动写成 Zt=BtAtZ_t=B_tA_t。作者从这样的更新出发:

Wnew=W⊙exp⁡(Zt).W_{\mathrm{new}}=W\odot\exp(Z_t).

⊙\odot 表示 Hadamard 逐元素乘法,exp⁡\exp 也是逐元素操作。对单个坐标:

(Wnew)ij=Wijexp⁡((Zt)ij).(W_{\mathrm{new}})_{ij}=W_{ij}\exp((Z_t)_{ij}).

例如原权重为 2,扰动为 0.1,精确更新就是 2e0.12e^{0.1};普通加法则是 2+0.12+0.1。前者学习的是相对比例,后者学习的是绝对偏移。

精确指数在非零权重上保持符号,是作者构造乘法群时用到的性质。但实际方法还使用 Taylor 近似:

exp⁡(Zt)≈1+Zt,Wnew≈W+W⊙(BtAt).\exp(Z_t)\approx\mathbf 1+Z_t, \qquad W_{\mathrm{new}}\approx W+W\odot(B_tA_t).

这里 1\mathbf 1 是全一矩阵,不是单位矩阵 II。二阶近似则再加上 12Zt⊙Zt\frac12Z_t\odot Z_t。低秩的是 ZtZ_t,而 W⊙ZtW\odot Z_t 不一定仍然是 rank-rr 矩阵。因此“训练参数少”与“最终有效增量低秩”是两件不同的事。

如何放回持续学习?

每个任务仍然学习新的低秩块,历史块冻结。不同于只对一个因子施加约束,原文式 (12) 对任务变换之间的乘积构造惩罚。用本文符号,把当前任务相关部分写成:

Lorth=∑i<t∥EtEi⊤∥F,Et=exp⁡(Zt)≈1+BtAt.L_{\mathrm{orth}} =\sum_{i<t}\|E_tE_i^\top\|_F, \qquad E_t=\exp(Z_t)\approx\mathbf 1+B_tA_t.

训练目标是任务损失加上这个正则项。阅读时应区分:被惩罚的是变换 EtE_t,实际权重增量却是 W⊙(Et−1)W\odot(E_t-\mathbf 1)。 两者也不能直接等同。

这一点也给我留下两个需要谨慎解释的地方。第一,精确逐元素指数的元素都为正,因此两个这样的矩阵相乘,其行内积不可能严格为零;这里的“正交”应理解成降低相关性的惩罚目标。第二,一阶近似 1+Zt\mathbf 1+Z_t 在扰动较大时可以出现非正元素,精确指数的符号保持性质不能无条件套到近似实现上。

所以这篇带来的新思路是:任务隔离之外,可以改变增量的参数化,让原权重参与调制更新。 但“引入 Lie group”本身还不能推出旧任务输出不变,要继续看实际变换、近似误差和旧任务性能。

ELLA:不再一律正交,而是按历史使用强度付出代价

论文:ELLA: Efficient Lifelong Learning for Adapters in Large Language Models,2026.1。以下对应原文第 3 节及附录 A。

Motivation:完全隔离会不会把迁移也隔掉?

前面的正交思路容易给人一种印象:新任务越远离旧任务越好。但是语言任务可能共享语义、推理或表达能力。如果历史任务使用过的方向全部禁止,新任务就不能充分复用已有能力。

ELLA 想区分两类位置:历史更新很大的位置,继续改动可能容易造成干扰;历史更新较小的位置,仍然允许新任务使用。于是保护不再是“可以走/不可以走”的二元选择,而是程度不同的惩罚。

Methodology:惩罚完整更新与历史累计更新的逐元素重叠

按本文 BABA 记法,第 tt 个任务的 LoRA 更新为:

ΔWt=BtAt,Wpast=∑i<tΔWi.\Delta W_t=B_tA_t,\qquad W_{\mathrm{past}}=\sum_{i<t}\Delta W_i.

ELLA 的核心项是:

LELLA=∥ΔWt⊙Wpast∥F2=∑u,v(ΔWt)uv 2(Wpast)uv 2.L_{\mathrm{ELLA}} =\|\Delta W_t\odot W_{\mathrm{past}}\|_F^2 =\sum_{u,v}(\Delta W_t)_{uv}^{\,2}(W_{\mathrm{past}})_{uv}^{\,2}.

原文公式里的星号要结合附录理解为逐元素乘积;这里统一写成 ⊙\odot。它不是矩阵乘法,也不是把 WpastW_{\mathrm{past}} 做 SVD 后得到的正交投影。

这条式子把方法讲得很清楚:如果某个位置历史累计更新的绝对值大,那么当前任务在这个位置产生同样大小的增量,要付出更高的正则代价;历史更新接近零的位置受到的限制则很弱。

若把任务损失定义为最小化的负对数似然,训练目标写成:

L=Ltask+λLELLA.L=L_{\mathrm{task}}+\lambda L_{\mathrm{ELLA}}.

两个 LoRA 因子通过乘积接收这个正则的梯度。任务完成后,将本任务增量纳入历史累计量,供下一任务使用。它不需要为推理选择某个任务 adapter,但维护历史累计量仍有存储成本,不能把“不保存逐任务列表”写成“不保存任何历史状态”。

为什么说它允许部分复用?

可以用一个局部二次问题理解这种惩罚。把 GG 记作希望实现的无约束更新,EE 记作历史坐标权重,考虑:

min⁡D12∥D−G∥F2+λ2∥D⊙E∥F2.\min_D\frac12\|D-G\|_F^2 +\frac{\lambda}{2}\|D\odot E\|_F^2.

逐坐标求导可得:

Duv∗=Guv1+λEuv2.D_{uv}^{*}=\frac{G_{uv}}{1+\lambda E_{uv}^2}.

如果 EuvE_{uv} 很大,更新被明显缩小;如果它很小,更新接近原来的 GuvG_{uv}。因此这是按坐标强度进行的软收缩。这个闭式解解释的是局部、无低秩因子约束的代理问题,不能说实际非凸 LoRA 训练每一步都精确等于这个解。

它解决了什么,又留下了什么?

和 O-LoRA 相比,ELLA 把关注点从“单个因子之间是否正交”移到了“完整乘积在哪些历史坐标上发生重叠”,并给复用保留了空间。

但历史幅值只是重要性的代理。例如两个旧任务在某坐标分别更新 +1+1 和 −1-1,累计和为零,不代表这个坐标从未被使用。这也是为什么 WpastW_{\mathrm{past}} 不能被直接解释成 Fisher 信息或旧任务真实敏感度。

此外,较小的重叠损失不自动保证较小的遗忘;λ\lambda 太大同样会压制新任务学习。看这篇的实验时,除了最终准确率,我更关注它是否同时改善前向迁移,以及稳定性收益是否来自降低即时学习能力。

把这些改进放回同一条主线

到这里,各篇论文不再只是用了不同名字,它们在解决不同的问题:

方法想解决的具体问题核心操作
O-LoRA新任务不要覆盖历史任务的适配方向新建任务 LoRA,冻结旧块,对输入侧因子加正交正则
Orthogonal Adaptation多概念 LoRA 合并产生串扰预分配正交输入基,固定输入因子,只训练输出因子
InfLoRA正交补中哪些方向有利于当前任务?从当前特征残差选固定输入基
KeepLoRA除旧任务,还要保持预训练迁移能力联合保护基、残差梯度初始化、冻结输入因子并合并
Sculpting Subspaces全参微调怎样避开重要权重方向?权重 SVD、按层选择保护空间、约束全参更新
OA-Adapter不同任务和层到底需要多少适配维度?可训练阈值控制瓶颈,约束输出侧历史已用列空间
OLieRA适配必须是加性增量吗?低秩扰动的逐元素乘性变换及变换级正则
ELLA严格隔离是否损失了正迁移?对完整更新施加历史幅值加权的逐元素重叠惩罚

这里故意不列一张统一的准确率排行榜:扩散模型多概念组合、视觉类增量、视觉语言迁移和文本任务流,不是在做同一个实验。

Bilinear Optimization Divergence:从“过滤器”假设到有效更新

前面这些工作并不是彼此孤立的技巧。O-LoRA、InfLoRA 共同提出了一条很具体的研究路线:如果低秩适配器的输入侧因子决定了分支会响应哪些特征方向,能不能把它当成一个过滤器,进而保护整个 LoRA 分支?

我们的论文 Bilinear Optimization Divergence: Diagnosing Factor-Constrained LoRA Continual Learning 研究的正是这条推理链中容易被省略的一步:因子上的约束,经过有限次优化和双线性组合之后,是否真的变成了有效权重更新上的约束?

这里的出发点不是声称“正交 LoRA 都会失效”。更准确的问题是:给定一种参数化、一个任务开始状态和一个实现中的优化器,因子约束究竟保证了什么,尚未保证什么? 这个问题需要把三个层次分开:

  1. 因子梯度约束:例如把 AA 的梯度投影到历史特征的正交补;
  2. 因子位移约束:优化器更新后,实际的 ΔA\Delta A 是否仍在这个正交补中;
  3. 有效更新约束:组合更新 ΔWeff\Delta W_{\mathrm{eff}} 在历史特征上是否真的没有响应。

前两层属于参数优化过程,第三层才直接对应 LoRA 分支对选定历史特征的响应。BOD(Bilinear Optimization Divergence)就是用来描述这三者之间的错位,而不是给所有正交方法贴上同一个“失败”标签。

1. O-LoRA 给出的起点:用 LoRA 子空间代替历史梯度空间

O-LoRA 在 §3.2 明确写道:

“we leverage the low-rank subspace of LoRA … as a proxy for the gradient subspace of past tasks.”

这个问题是从 OGD 接过来的。OGD 要记住历史输出敏感方向,大模型里存储和处理这些方向可能很贵。O-LoRA 的判断是:既然下游微调主要发生在低秩空间,过去训练出的 LoRA 参数应当包含重要更新方向,因此可以用它们代理历史梯度空间。

按照本文及公开实现的 BABA 记法,输入侧 AA 先作用于 hidden state:

x⟼Ax⟼B(Ax).x\longmapsto Ax\longmapsto B(Ax).

“过滤器”是我对这一步的解释,不是原论文的逐字术语。 AA 决定哪些输入方向能进入 LoRA 分支,BB 决定这些响应如何写到输出。如果新的 AtA_t 和历史 AiA_i 尽量分开,就希望新分支少响应历史任务依赖的方向。

于是形成了一条推理链:

  1. 旧 LoRA 因子承载旧任务的重要更新方向。
  2. 新因子与旧因子正交,意味着新任务主要在不同方向适配。
  3. 不同方向的适配应当减少对旧任务功能的干扰。

前两步给出可操作的代理与约束,第三步才是最终希望实现的功能保护。我的问题就落在代理约束到功能保护之间,哪些条件还没有被保证。

2. InfLoRA 把这个想法推进到了固定输入基

InfLoRA §3.1 的 Proposition 1 说明,固定降维矩阵、只训练升维矩阵,可以将有效权重变化限制在该降维矩阵对应的子空间。§3.2 再选择与历史特征空间分离、又适合当前任务的方向。

它原文把降维矩阵叫 BtB_t、升维矩阵叫 AtA_t;换成本文的 BABA,就是固定输入侧 AtA_t,只训练输出侧 BtB_t。

这个方案比“训练中尽量让两个因子正交”更强:只要固定的输入基满足 AtC=0A_tC=0,任意升维矩阵的变化都满足:

(δBtAt)C=δBt(AtC)=0.(\delta B_tA_t)C=\delta B_t(A_tC)=0.

所以我不是在否认这条代数性质。InfLoRA 的具体贡献是让“过滤器控制允许的更新空间”在明确条件下成立,而我的工作进一步追问:不同正交 LoRA 的真实实现是否都满足这些条件,所选空间又是否足以保护旧任务?

这也是为什么不能把 InfLoRA、软约束 O-LoRA 和共享分支投影方法统一称作“同一种失效”。它们提供了研究动机,但不是同一个实验宿主。

3. 第一个缺口:避开旧因子,不等于避开旧任务输入

对旧任务 ii 的某层输入 XiX_i,增加当前任务块带来的局部输出变化是:

δHi=sBtAtXi.\delta H_i=sB_tA_tX_i.

而 O-LoRA 式因子约束控制的是:

AtAi⊤≈0.A_tA_i^\top\approx0.

这两个式子的右边对象不同:前者是真实旧输入,后者是旧任务低秩因子的方向。只有旧输入被旧因子方向充分覆盖等条件成立,因子隔离才可能转化成相应的输入响应保护。

举一个最小例子,设输入空间是二维、rank 为 1:

Ai=[10],At=[01].A_i=\begin{bmatrix}1&0\end{bmatrix},\qquad A_t=\begin{bmatrix}0&1\end{bmatrix}.

它们严格正交。但旧任务的一个输入可以是:

xi=[11].x_i=\begin{bmatrix}1\\1\end{bmatrix}.

于是 Atxi=1A_tx_i=1,新分支输出 BtAtxi=BtB_tA_tx_i=B_t 可以非零。过滤器之间不重叠,不等于旧输入完全不会通过新过滤器。

这个例子证明的是局部响应可能改变,不是旧任务必然预测错误。它也不否认严格输入侧正交能使对应权重更新在 Frobenius 内积意义下正交:参数几何上的正交,与对旧输入的零响应,是不同的命题。

此外,如果实际得到的是很小但非零的 AtCA_tC,则只能得到:

∥BtAtC∥F≤∥Bt∥2 ∥AtC∥F.\|B_tA_tC\|_F \leq\|B_t\|_2\,\|A_tC\|_F.

没有控制 BtB_t 的尺度,仅凭过滤器残差小,就不能得到统一的小输出扰动界。反过来,若 AtCA_tC 精确为零,再大的 BtB_t 也不会让这个乘积变成非零。这是“软约束可能不足”与“硬可行状态有代数保证”的区别。

4. 第二个缺口:投影了 AA 的变化,整个共享 LoRA 仍可能改变旧响应

修改稿从 Sculpting Subspaces 的投影思想构造了 Projected-LoRA:在一个共享 LoRA 分支里,估计历史输入基 CC,投影 AA 的梯度,但仍训练两个因子。

注意,它是本文构造的分析基线,不是原版 InfLoRA。它没有为每个新任务直接固定一个完整可行的输入基。

设新任务起点为 (A0,B0)(A_0,B_0),后续变化为 δA,δB\delta A,\delta B。相对任务起点的真实权重位移为:

δW=s[(B0+δB)(A0+δA)−B0A0]=s(B0δA+δBA0+δBδA).\begin{aligned} \delta W &=s[(B_0+\delta B)(A_0+\delta A)-B_0A_0]\\ &=s(B_0\delta A+\delta BA_0+\delta B\delta A). \end{aligned}

即使我们已经把“投影梯度”加强为真正的位移约束 δAC=0\delta AC=0,仍然有:

δWC=s δBA0C.\delta WC=s\,\delta BA_0C.

这可以直接回到过滤器直觉:过滤器 AA 在旧方向上的响应没有变化,但负责解释这些响应的 BB 变了,旧输入最终得到的输出仍然可能改变。

例如 A0=[1,0]A_0=[1,0]、C=[1,0]⊤C=[1,0]^\top,令 δA=0\delta A=0 而 δB=1\delta B=1。AA 的位移已经完全满足约束,但取 s=1s=1 时 δWC=1\delta WC=1。这里并不是 BB 让信号穿过了一个本来严格关闭的过滤器,而是它修改了一个原本就有旧响应的共享分支。

这就是论文中区分“位移约束”和“状态约束”的关键:

  • 位移约束 δAC=0\delta AC=0:不允许过滤器新增旧方向响应,但起点 A0CA_0C 可能非零。
  • 状态约束 AC=0AC=0:整个过滤器在旧方向上始终关闭,此时任意 BB 都满足 BAC=0BAC=0。

这个区别也解释了为什么同一个“只约束 AA”的说法,在不同方法中含义不同。共享 Projected-LoRA 从一个已经学习过的 (A0,B0)(A_0,B_0) 出发,A0CA_0C 通常不为零;因此,即使新的 AA 位移严格满足 δAC=0\delta AC=0,变化中的 BB 仍然可以沿着已有响应路径产生 δBA0C\delta B A_0 C。相反,累计 O-LoRA 的新 block 从 Bt,0=0B_{t,0}=0 开始,当前 block 的有效变化可以写成

ΔWt=s ΔBt(At,0+ΔAt).\Delta W_t=s\,\Delta B_t(A_{t,0}+\Delta A_t).

如果先把 At,0A_{t,0} 投影到历史特征正交补,再保持后续 AtA_t 状态在这个可行空间内,那么 BtB_t 可以继续训练,而该 block 在已保存的历史特征基上保持零响应。这是两条不同的残差路径:共享适配器需要处理一个已经存在的 learned-anchor response,累计新 block 则可以利用zero-output initialization 建立可行状态。

5. 第三个缺口:梯度方向不一定等于优化器实际位移

再退一步,很多实现连 δAC=0\delta AC=0 都没有直接约束,而只投影原始梯度。优化器会加入动量、逐坐标缩放或其他变换;对于一般的非坐标轴子空间,这些操作未必保持原投影空间。

因此 WRP(Weight Residual Projection)在 optimizer step 后约束真实残差:

Asafe=Apre+(Araw−Apre)Pnull,Pnull=I−CC⊤.A_{\mathrm{safe}} =A_{\mathrm{pre}}+ (A_{\mathrm{raw}}-A_{\mathrm{pre}})P_{\mathrm{null}}, \qquad P_{\mathrm{null}}=I-CC^\top.

它修复的是“梯度方向看起来可行,但优化器实际位移已经离开可行空间”的偏差。这里的 PnullP_{\mathrm{null}} 是由历史特征基 CC 定义的正交补投影;投影发生在一次 optimizer step 之后,所以控制的是实际写回参数的 residual,而不是理想化的原始梯度。

6. 两种参数化对应两种保护策略

把上面的推导落实到方法上,可以得到一个很清楚的分工。

共享适配器:SFOR。 Projected-LoRA 让共享的 AA、BB 都继续变化;SFOR 在 Task 1 之后冻结共享 BB,对 AA 使用历史特征梯度投影,并在 optimizer step 后应用 WRP。冻结 BB 消除了 ΔBA0C\Delta B A_0 C 这条 learned-anchor 路径,WRP 则保证 AA 的真实位移仍满足约束。两者解决的是不同问题,组合后才把共享分支的历史响应压到接近零。

累计适配器:O-LoRA hard protection。 O-LoRA 每个任务增加一个新 block,并冻结历史 blocks。我们保留 O-LoRA 原生的软正交惩罚,保证比较仍然是在 O-LoRA 的真实方法基础上进行;在此之上,对当前 block 做三步 hard protection:任务开始时把 At,0A_{t,0} 回缩到历史特征的正交补,对当前 AtA_t 的梯度做投影,并在 optimizer step 后用 WRP 修正实际位移。由于新 block 的 Bt,0=0B_{t,0}=0,这种状态约束允许当前 BtB_t 保持可训练,同时让该 block 在已选历史特征基上保持零响应。

BSR(Bilinear State/Response regularization)在论文中作为诊断性控制,而不是主要方法:它直接惩罚更宽历史基上的有效更新响应,用来检查“把残差写进目标函数”是否带来独立收益。实验中,hard protection 已经提供了核心可行性约束,BSR 没有显示出稳定的额外性能收益,因此主方法叙事聚焦于 O-LoRA hard protection。

7. BOD 的形式化:测量的是选定历史基上的有效响应

设任务开始时的 LoRA 因子为 (A0,B0)(A_0,B_0),经过有限个 optimizer steps 后变为 (A,B)(A,B)。有效权重变化不是简单的 B0ΔAB_0\Delta A,而是

ΔWeff=s(BA−B0A0)=s(B0ΔA+ΔBA0+ΔBΔA).\begin{aligned} \Delta W_{\mathrm{eff}} &=s(BA-B_0A_0)\\ &=s(B_0\Delta A+\Delta B A_0+\Delta B\Delta A). \end{aligned}

这三个项分别对应:原有输出因子作用于新的 AA 位移、输出因子自身沿着旧 anchor 响应变化、以及两个因子同时变化产生的二阶交互。后两项正是只看 AA 梯度时容易漏掉的路径。

令 VcoreV_{\mathrm{core}} 表示从历史任务特征中保留的正交方向。论文定义

RBOD=ΔWeffVcore,R_{\mathrm{BOD}}=\Delta W_{\mathrm{eff}}V_{\mathrm{core}},

并用 ∥RBOD∥F\|R_{\mathrm{BOD}}\|_F 汇总各层的历史响应,再除以有效更新大小得到尺度归一化的 ρBOD\rho_{\mathrm{BOD}}。因此,BOD 的含义是:在明确选定的历史特征基上,实际有效更新还剩多少响应。 它不是遗忘指标,也不是对所有输入的全局函数等价性证明;它是一个把“约束是否兑现”从因子空间带回有效更新空间的诊断量。

这个定义带来一个重要的解释边界:RBOD≈0R_{\mathrm{BOD}}\approx0 说明选定基上的局部响应被压低,但不单独保证旧任务准确率一定更高;旧任务还可能依赖未被保留的特征、其他网络层和表示变化。反过来,BOD 较高也不自动等价于遗忘。论文把 BOD、学习稳定性指标和最终任务性能分开报告,正是为了区分“约束执行情况”和“任务结果”。

8. 我的工作与前面论文是什么关系?

工作作为保护依据的对象与本文动机的关系
O-LoRA历史 LoRA 子空间代理;公开实现约束输入因子交叉内积直接提出因子代理的研究起点,累计块也是本文验证 BSR 的宿主
InfLoRA从历史/当前特征构造并固定输入基提供受约束子空间更新的明确条件,帮助区分何时代理确实有效
Sculpting Subspaces → Projected-LoRA从全参投影思想转到共享 LoRA 的单因子梯度投影构造可控制的实验场景,分析 companion factor 与 optimizer 的影响
本文 BOD 分析相对任务起点的完整有效更新,以及它在历史基上的残差检查因子保护是否兑现为更新保护,再与任务级稳定性和最终性能分开比较

因此,本文的 motivation 可以压缩成一句话:

O-LoRA 用低秩适配子空间代理历史更新方向,InfLoRA 进一步通过固定降维基控制可学习空间。这些工作说明,输入侧因子可以作为控制 LoRA 的入口。但在软正则、共享分支和实际优化器更新中,入口上的约束不一定自动转化为完整有效更新上的约束。我们研究这种因子保护与有效更新之间的错位,并通过历史特征响应、BOD 轨迹和任务级 acquisition—retention 指标检验它的实际后果。

这比“BB 可训练,所以正交 LoRA 都会失效”准确,也更明确地说明了我们为什么接着这些具体论文继续研究。我们把这个错位称为 Bilinear Optimization Divergence(BOD):它首先是一个有效更新诊断,再通过任务级实验检验其与稳定性、可塑性之间的关系。论文不把 BOD 残差直接当作遗忘,也不把因子范数当作函数变化的替代量。

完整的 SFOR、WRP、O-LoRA hard protection、BSR 控制和当前实验放在第三篇论文解读。本文这一节对应的主要依据是 O-LoRA §3.2 与公开实现、InfLoRA §3.1–3.2,以及论文方法部分和附录中的有限步推导。

需要回看持续学习整体脉络及这几篇论文使用的实验协议,可以读第一篇综述。