这一系列论文一直围绕同一个问题展开:下游任务究竟需要多少 degrees of freedom,以及这些有限的训练能力应该放在哪里。
最开始,random subspace training 用固定随机投影 Δ θ ‾ = P ‾ ‾ z ‾ \underline{\Delta\theta}=\underline{\underline{P}}\underline{z} Δ θ = P z ,把训练限制在一个低维 subspace 中。SAID 在此基础上加入逐层 scaling,让不同层获得不同大小的更新。LoRA 又进一步把研究对象从整个模型的参数 vector 转向单个权重 matrix,用 Δ W ‾ ‾ = B ‾ ‾ A ‾ ‾ \underline{\underline{\Delta W}}=\underline{\underline{B}}\underline{\underline{A}} Δ W = B A 直接限制更新的 rank。
但 LoRA 通常会为所有目标 matrix 设置相同的 rank。这样虽然实现简单,却隐含了一个很强的假设:每个 module、每一层都需要相同的更新能力。
AdaLoRA 接着追问:
在总 rank budget 固定时,能否根据不同 module 的重要性动态分配 rank?
Qingru Zhang, Minshuo Chen, Alexander Bukharin, Nikos Karampatziakis, Pengcheng He, Yu Cheng, Weizhu Chen, Tuo Zhao. "AdaLoRA: Adaptive Budget Allocation for Parameter-Efficient Fine-Tuning." ICLR, 2023. arXiv:2303.10512
从固定 rank 到动态分配#
LoRA 把一个权重更新写成 Δ W ‾ ‾ = B ‾ ‾ A ‾ ‾ \underline{\underline{\Delta W}}=\underline{\underline{B}}\underline{\underline{A}} Δ W = B A 。如果每个目标 matrix 都使用相同的 rank r r r ,那么 rank budget 就会被平均分配到所有位置。
AdaLoRA 的实验观察是,不同 weight matrix 对下游任务的重要性并不相同。某些 module 增加训练能力会带来明显提升,另一些 module 即使获得更多参数,收益也很小。统一使用相同的 r r r ,可能让不重要的 matrix 占用过多预算,同时限制真正重要的 matrix。
因此,AdaLoRA 不再预先固定每个 matrix 最终保留多少 rank,而是在训练过程中估计各个更新方向的重要性,再把有限的总预算留给更重要的方向。
这个区别也可以写成一个简单的 rank budget constraint。
假设共有 m m m 个目标 matrix。在相同的最终总 rank budget 下:
LoRA:平均分配 rank AdaLoRA:动态分配 rank r 1 = r 2 = ⋯ = r m = r r_1=r_2=\cdots=r_m=r r 1 = r 2 = ⋯ = r m = r ,因此 ∑ k = 1 m r k = m r \sum_{k=1}^{m}r_k=mr ∑ k = 1 m r k = m r ∑ k = 1 m r k = m r \sum_{k=1}^{m}r_k=mr ∑ k = 1 m r k = m r ,但不要求 r 1 = r 2 = ⋯ = r m r_1=r_2=\cdots=r_m r 1 = r 2 = ⋯ = r m
两边最终可以使用相同数量的 rank;区别在于 LoRA 预先固定每个 matrix 的 rank,而 AdaLoRA
根据训练中估计的重要性决定每个 r k r_k r k 。
把 rank 拆成可以删除的单位#
LoRA 的 B ‾ ‾ A ‾ ‾ \underline{\underline{B}}\underline{\underline{A}} B A 已经限制了 rank,但其中不同方向并没有被显式分离。AdaLoRA 将更新重新参数化为类似 SVD 的形式:Δ W ‾ ‾ = P ‾ ‾ Λ ‾ ‾ Q ‾ ‾ \underline{\underline{\Delta W}}=\underline{\underline{P}}\underline{\underline{\Lambda}}\underline{\underline{Q}} Δ W = P Λ Q 。
LoRA 的分解并不唯一。对于任意可逆 matrix R ‾ ‾ \underline{\underline{R}} R ,都有
B ‾ ‾ A ‾ ‾ = ( B ‾ ‾ R ‾ ‾ ) ( R ‾ ‾ − 1 A ‾ ‾ ) \underline{\underline{B}}\underline{\underline{A}}=(\underline{\underline{B}}\underline{\underline{R}})(\underline{\underline{R}}^{-1}\underline{\underline{A}}) B A = ( B R ) ( R − 1 A ) 。
也就是说,同一个 Δ W ‾ ‾ \underline{\underline{\Delta W}} Δ W 可以由许多组彼此混合的方向表示。因此,B ‾ ‾ \underline{\underline{B}} B
的第 i i i 列和 A ‾ ‾ \underline{\underline{A}} A 的第 i i i 行没有天然、稳定的对应关系,不能直接把它们当作一个具有独立身份的
rank 单位。若将这一对向量全部置零,它们也很难在后续训练中恢复。
为了得到可以独立衡量、删除和重新激活的 rank 单位,AdaLoRA 在 LoRA 的 low-rank update 上引入了更明确的结构。
其中 P ‾ ‾ ∈ R d 1 × r \underline{\underline{P}}\in\mathbb{R}^{d_1\times r} P ∈ R d 1 × r ,Q ‾ ‾ ∈ R r × d 2 \underline{\underline{Q}}\in\mathbb{R}^{r\times d_2} Q ∈ R r × d 2 ,而 Λ ‾ ‾ = diag ( λ 1 , … , λ r ) \underline{\underline{\Lambda}}=\operatorname{diag}(\lambda_1,\ldots,\lambda_r) Λ = diag ( λ 1 , … , λ r ) 是一个 diagonal matrix。
把这个乘积展开,可以得到 Δ W ‾ ‾ = ∑ i = 1 r λ i p i ‾ q i ‾ T \underline{\underline{\Delta W}}=\sum_{i=1}^{r}\lambda_i\underline{p_i}\underline{q_i}^{T} Δ W = ∑ i = 1 r λ i p i q i T 。这里 p i ‾ \underline{p_i} p i 是 P ‾ ‾ \underline{\underline{P}} P 的第 i i i 列,q i ‾ T \underline{q_i}^{T} q i T 是 Q ‾ ‾ \underline{\underline{Q}} Q 的第 i i i 行,而 λ i p i ‾ q i ‾ T \lambda_i\underline{p_i}\underline{q_i}^{T} λ i p i q i T 是一个 rank-1 component。
这样做的关键,是让一个 rank 对应一个可以单独控制的 singular triplet:( p i ‾ , λ i , q i ‾ ) (\underline{p_i},\lambda_i,\underline{q_i}) ( p i , λ i , q i ) 。
当 λ i \lambda_i λ i 被保留时,对应的 rank-1 component 继续参与更新;
当 λ i \lambda_i λ i 被置零时,这个 component 不再影响 Δ W ‾ ‾ \underline{\underline{\Delta W}} Δ W ;
p i ‾ \underline{p_i} p i 和 q i ‾ \underline{q_i} q i 仍然保留并继续更新,因此被错误移除的方向以后还有机会重新激活。
这里改变的是 effective rank,而不是 Λ ‾ ‾ \underline{\underline{\Lambda}} Λ 的实际尺寸。训练过程中 Λ ‾ ‾ \underline{\underline{\Lambda}} Λ 始终保持同样的形状,AdaLoRA 只是用 mask 将部分 λ i \lambda_i λ i 置零;如果某个方向之后重新变得重要,对应的 λ i \lambda_i λ i 仍可再次参与更新。
在理想的正交条件下,Δ W ‾ ‾ \underline{\underline{\Delta W}} Δ W 的 rank 就等于非零 λ i \lambda_i λ i 的数量。于是,调整 rank 可以转化成一个更容易操作的问题:保留哪些 λ i \lambda_i λ i ,又将哪些 λ i \lambda_i λ i 置零。
AdaLoRA 并不是在每一步都对完整的 Δ W ‾ ‾ \underline{\underline{\Delta W}} Δ W 计算一次精确 SVD。它直接训练 P ‾ ‾ \underline{\underline{P}} P 、Λ ‾ ‾ \underline{\underline{\Lambda}} Λ 和 Q ‾ ‾ \underline{\underline{Q}} Q ,用这种 SVD-like parameterization 避免反复分解大型 matrix 的成本。
为什么需要 orthogonal regularization#
如果不同 rank-1 component 学到了高度重复的方向,那么删除其中一个 component 时,λ i \lambda_i λ i 就不再是一个清楚、独立的 rank 开关。
因此,AdaLoRA 希望 P ‾ ‾ \underline{\underline{P}} P 的列向量和 Q ‾ ‾ \underline{\underline{Q}} Q 的行向量分别保持近似 orthogonal,也就是 P ‾ ‾ T P ‾ ‾ ≈ I ‾ ‾ \underline{\underline{P}}^{T}\underline{\underline{P}}\approx\underline{\underline{I}} P T P ≈ I 和 Q ‾ ‾ Q ‾ ‾ T ≈ I ‾ ‾ \underline{\underline{Q}}\underline{\underline{Q}}^{T}\approx\underline{\underline{I}} Q Q T ≈ I 。
对应的 regularization 是 R ( P ‾ ‾ , Q ‾ ‾ ) = ∥ P ‾ ‾ T P ‾ ‾ − I ‾ ‾ ∥ F 2 + ∥ Q ‾ ‾ Q ‾ ‾ T − I ‾ ‾ ∥ F 2 R(\underline{\underline{P}},\underline{\underline{Q}})=\lVert\underline{\underline{P}}^{T}\underline{\underline{P}}-\underline{\underline{I}}\rVert_F^2+\lVert\underline{\underline{Q}}\underline{\underline{Q}}^{T}-\underline{\underline{I}}\rVert_F^2 R ( P , Q ) = ∥ P T P − I ∥ F 2 + ∥ Q Q T − I ∥ F 2 。
训练目标因此变成 task loss 与 orthogonal regularization 的组合。这个约束减少不同方向之间的信息冗余,也让删除某个 singular triplet 时的变化更稳定。
怎样判断一个方向是否重要#
现在的问题变成:AdaLoRA 应该保留哪个 singular triplet ( p i ‾ , λ i , q i ‾ ) (\underline{p_i},\lambda_i,\underline{q_i}) ( p i , λ i , q i ) ?
论文先从单个可训练 scalar w w w 的 sensitivity 出发,用一阶 Taylor approximation 估计把它置零会怎样改变 loss。
假设当前参数为 w w w 。将它移除,就是把它从 w w w 变成 0 0 0 ,因此参数变化为
Δ w = 0 − w = − w \Delta w=0-w=-w Δ w = 0 − w = − w 。
在当前参数附近对 loss 做一阶 Taylor 展开,可得
L ( w + Δ w ) ≈ L ( w ) + ∂ L ∂ w Δ w \mathcal{L}(w+\Delta w)\approx\mathcal{L}(w)+\frac{\partial\mathcal{L}}{\partial w}\Delta
w L ( w + Δ w ) ≈ L ( w ) + ∂ w ∂ L Δ w 。
因此,置零前后的 loss 变化近似为
Δ L = L ( w + Δ w ) − L ( w ) ≈ − w ∂ L ∂ w \Delta\mathcal{L}=\mathcal{L}(w+\Delta w)-\mathcal{L}(w)\approx-w\frac{\partial\mathcal{L}}{\partial
w} Δ L = L ( w + Δ w ) − L ( w ) ≈ − w ∂ w ∂ L 。
这里需要判断的是变化大小,而不是 loss 增减的方向,所以取绝对值:
∣ Δ L ∣ ≈ ∣ w ∂ L ∂ w ∣ |\Delta\mathcal{L}|\approx\left|w\frac{\partial\mathcal{L}}{\partial w}\right| ∣Δ L ∣ ≈ w ∂ w ∂ L 。这就得到论文使用的
sensitivity。
这个结果只是当前位置附近的一阶估计。它忽略了二阶及更高阶项,因此不等于真正将参数置零后重新计算得到的精确 loss
变化。
因此,在训练步骤 t t t ,可以用 S t ( w ) = ∣ w t ∂ L t ∂ w t ∣ S_t(w)=\left|w_t\frac{\partial\mathcal{L}_t}{\partial w_t}\right| S t ( w ) = w t ∂ w t ∂ L t 表示当前 sensitivity。这个值越大,说明把 w w w 置零预计会给 task loss 带来越大的变化。
但单个 mini-batch 得到的 sensitivity 很容易受到采样噪声影响。AdaLoRA 使用 exponential moving average(EMA)对它进行平滑:S ‾ t ( w ) = β 1 S ‾ t − 1 ( w ) + ( 1 − β 1 ) S t ( w ) \overline{S}_t(w)=\beta_1\overline{S}_{t-1}(w)+(1-\beta_1)S_t(w) S t ( w ) = β 1 S t − 1 ( w ) + ( 1 − β 1 ) S t ( w ) 。
它还记录当前 sensitivity 偏离历史趋势的程度:U t ( w ) = β 2 U t − 1 ( w ) + ( 1 − β 2 ) ∣ S t ( w ) − S ‾ t ( w ) ∣ U_t(w)=\beta_2U_{t-1}(w)+(1-\beta_2)\left|S_t(w)-\overline{S}_t(w)\right| U t ( w ) = β 2 U t − 1 ( w ) + ( 1 − β 2 ) S t ( w ) − S t ( w ) 。U t ( w ) U_t(w) U t ( w ) 越大,表示这个参数的重要性仍在明显变化,估计具有更高的 uncertainty。
论文实验默认使用 β 1 = β 2 = 0.85 \beta_1=\beta_2=0.85 β 1 = β 2 = 0.85 。其中 β 1 \beta_1 β 1 控制 sensitivity 的平滑程度,β 2 \beta_2 β 2 控制 uncertainty 的平滑程度;数值越接近 1 1 1 ,历史估计所占的比重越大。
最终的 parameter-level importance score 是 I t ( w ) = S ‾ t ( w ) U t ( w ) I_t(w)=\overline{S}_t(w)U_t(w) I t ( w ) = S t ( w ) U t ( w ) 。也就是说,一个参数既要持续表现出较高的 sensitivity,又要考虑它在近期训练中的变化,才会得到更高的 importance。
从 parameter importance 到 rank importance#
一个 rank-1 component 不只包含 λ i \lambda_i λ i ,还包含 p i ‾ \underline{p_i} p i 和 q i ‾ \underline{q_i} q i 。因此,AdaLoRA 不应该只看 ∣ λ i ∣ |\lambda_i| ∣ λ i ∣ ,而是同时聚合整个 singular triplet 中所有参数的 importance。
对于第 k k k 个权重更新中的第 i i i 个 triplet,论文把 λ k , i \lambda_{k,i} λ k , i 的 importance、P k ‾ ‾ \underline{\underline{P_k}} P k 第 i i i 列各元素的平均 importance,以及 Q k ‾ ‾ \underline{\underline{Q_k}} Q k 第 i i i 行各元素的平均 importance 相加,得到 triplet-level importance score。
使用平均值而不是直接求和,是为了避免较大的 vector 仅仅因为包含更多参数就自然获得更高分数。得到所有 triplet 的分数后,AdaLoRA 会跨 module、跨 layer 进行全局排序,把较低分数对应的 λ k , i \lambda_{k,i} λ k , i 置零。
这样,重要的 matrix 最后可以保留更多 singular triplet,也就是获得更高的 rank;不重要的 matrix 则逐渐失去 rank。rank allocation 不再由人工为每一层预先指定,而是在训练过程中由 importance estimation 决定。
论文用 s ( ⋅ ) s(\cdot) s ( ⋅ ) 表示单个参数的 importance function。采用前文的 sensitivity 与 uncertainty
时,s ( t ) ( w ) = S ‾ t ( w ) U t ( w ) s^{(t)}(w)=\overline{S}_t(w)U_t(w) s ( t ) ( w ) = S t ( w ) U t ( w ) 。
对第 k k k 个 weight update 的第 i i i 个 singular triplet,原文的聚合公式为
S k , i = s ( λ k , i ) + 1 d 1 ∑ j = 1 d 1 s ( P k , j i ) + 1 d 2 ∑ j = 1 d 2 s ( Q k , i j ) S_{k,i}=s(\lambda_{k,i})+\frac{1}{d_1}\sum_{j=1}^{d_1}s(P_{k,ji})+\frac{1}{d_2}\sum_{j=1}^{d_2}s(Q_{k,ij}) S k , i = s ( λ k , i ) + d 1 1 ∑ j = 1 d 1 s ( P k , ji ) + d 2 1 ∑ j = 1 d 2 s ( Q k , ij ) 。
第一项来自 singular value λ k , i \lambda_{k,i} λ k , i ,第二项是 P k ‾ ‾ \underline{\underline{P_k}} P k 第 i i i
列的平均 importance,第三项是 Q k ‾ ‾ \underline{\underline{Q_k}} Q k 第 i i i 行的平均 importance。两个
vector 都取平均值,因此 S k , i S_{k,i} S k , i 不会仅仅因为 vector 较长而变大。
预算怎样逐渐收缩#
AdaLoRA 不会在训练开始时立即把 rank 降到目标值。它先使用一个略高于最终目标的初始预算,让不同方向都有机会参与训练;经过 warm-up 后,再按照 schedule 逐渐减少可保留的 λ i \lambda_i λ i 数量,直到达到目标预算;最后固定得到的 rank distribution,继续完成训练。
这个过程让模型先探索哪些方向有用,再逐渐集中到重要方向上。与一开始就固定低 rank 相比,它减少了过早删除潜在重要方向的风险。
设总训练步数为 T T T ,initial warm-up 和 final fine-tuning 分别持续 t i t_i t i 和 t f t_f t f 步;初始与目标
budget 分别为 b ( 0 ) b^{(0)} b ( 0 ) 和 b ( T ) b^{(T)} b ( T ) 。作者的官方实现使用下面的 cubic schedule:
b ( t ) = { b ( 0 ) , 0 ≤ t < t i , b ( T ) + ( b ( 0 ) − b ( T ) ) ( 1 − t − t i T − t i − t f ) 3 , t i ≤ t < T − t f , b ( T ) , T − t f ≤ t ≤ T . b^{(t)}=\begin{cases}b^{(0)},&0\leq t<t_i,\\b^{(T)}+\left(b^{(0)}-b^{(T)}\right)\left(1-\frac{t-t_i}{T-t_i-t_f}\right)^3,&t_i\leq t<T-t_f,\\b^{(T)},&T-t_f\leq t\leq T.\end{cases} b ( t ) = ⎩ ⎨ ⎧ b ( 0 ) , b ( T ) + ( b ( 0 ) − b ( T ) ) ( 1 − T − t i − t f t − t i ) 3 , b ( T ) , 0 ≤ t < t i , t i ≤ t < T − t f , T − t f ≤ t ≤ T .
第一阶段不裁减 budget;第二阶段通过三次函数逐渐从 b ( 0 ) b^{(0)} b ( 0 ) 降到 b ( T ) b^{(T)} b ( T ) ;最后 t f t_f t f
步固定目标 budget 和已经得到的 rank distribution。
AdaLoRA 论文附录的印刷公式在第二段分子中写成了 t − t i − t f t-t_i-t_f t − t i − t f ,但这样无法在两个阶段的边界处连续接上。作者官方代码实际使用
t − t i t-t_i t − t i ,这里采用与代码和正文描述一致的形式。
实验如何验证这个故事#
不同位置确实需要不同的 rank#
论文首先用一个控制实验检验“平均分配 rank 是否合理”。作者在 DeBERTaV3-base 上训练 MNLI-m,在总可训练参数固定为约 0.28 0.28 0.28 M 的条件下,只改变 LoRA 被分配到哪些 weight matrix 或哪些 layer。
当预算只分配给一种 matrix 时,结果如下:
获得 LoRA 的 matrix W q ‾ ‾ \underline{\underline{W_q}} W q W k ‾ ‾ \underline{\underline{W_k}} W k W v ‾ ‾ \underline{\underline{W_v}} W v W o ‾ ‾ \underline{\underline{W_o}} W o W f 1 ‾ ‾ \underline{\underline{W_{f1}}} W f 1 W f 2 ‾ ‾ \underline{\underline{W_{f2}}} W f 2 MNLI-m accuracy 88.58 88.98 89.36 89.28 89.91 89.99
在这个实验中,把预算给 FFN 的 W f 1 ‾ ‾ \underline{\underline{W_{f1}}} W f 1 和 W f 2 ‾ ‾ \underline{\underline{W_{f2}}} W f 2 ,效果高于只给 attention projection。把 LoRA 同时用于一组连续 layer 中的所有 matrix 时,位置差异也很明显:
获得 LoRA 的 layer 1–3 4–6 7–9 10–12 MNLI-m accuracy 77.87 85.82 88.15 88.60
后几层明显比前几层更需要训练能力。这两个结果并不是说 FFN 或高层在所有任务中都一定最重要,而是说明统一 rank 隐含的“各处同等重要”假设并不可靠,因此应该让 allocation 随任务和训练过程决定。
主实验比较了什么#
论文分别用 DeBERTaV3-base 测试 GLUE 和 SQuAD,用 BART-large 测试 XSum 与 CNN/DailyMail。比较对象包括 full fine-tuning、BitFit、Adapter 和 LoRA。为了避免只给 attention matrix 的实现选择影响结论,实验中的 LoRA 也被扩展到与 AdaLoRA 相同的一组目标 matrix。
GLUE 实验把最终预算设为约 0.3 0.3 0.3 M、0.6 0.6 0.6 M 和 1.2 1.2 1.2 M 个可训练参数;对应的 AdaLoRA 总 rank budget 分别为 144 144 144 、288 288 288 和 576 576 576 ,初始预算是最终预算的 1.5 1.5 1.5 倍。也就是说,它先用较宽的搜索空间探索,再逐步收缩到与 baseline 接近的最终参数量。
下面选取三个不同任务中的结果。每一行只能在本行内比较,因为 accuracy、F1 和 ROUGE-2 是不同指标:
任务与预算 指标 LoRA AdaLoRA GLUE,约 0.3 0.3 0.3 M 参数 八个任务平均分 88.15 88.86 SQuAD v2.0,0.08 % 0.08\% 0.08% 参数 F1 87.5 88.7 XSum,1.10 % 1.10\% 1.10% 参数 ROUGE-2 20.20 21.13
这些结果支持的是一个相对具体的结论:在相近的最终参数预算下,动态决定各处保留多少 rank,通常比统一 rank 更有效。它们并不能单独证明所有 weight update 都天然具有某个唯一的低秩结构,也不能说明 AdaLoRA 在任意数据集上都会优于 LoRA。
消融实验验证了哪些设计#
论文还分别移除了或替换了 AdaLoRA 的关键部分:
直接对 LoRA 的 rank-1 doublet 做 structured pruning,整体上不如 SVD-like parameterization。例如在 0.08 % 0.08\% 0.08% 参数预算的 CoLA 实验中,前者得分为 66.71 66.71 66.71 ,AdaLoRA 为 70.21 70.21 70.21 ;
只看 sensitivity,或只按 ∣ λ i ∣ |\lambda_i| ∣ λ i ∣ 排序,都不如完整的 sensitivity 与 uncertainty 组合稳定,说明一次 mini-batch 上的梯度并不足以可靠决定一个方向是否应该被删除;
只使用 SVD-like parameterization、但不做 adaptive allocation,虽然能改善 LoRA,却仍然达不到完整 AdaLoRA 的结果;
去掉 orthogonal regularization 会使表现下降,说明“让每个 singular triplet 成为较独立的 rank 单位”确实是后续排序和删除成立的重要条件。
最终得到的 rank distribution 也与最开始的控制实验相呼应:更多预算通常流向 FFN 和较高层。不过,这个分布是训练得到的结果,不应该被反过来写成所有模型都必须遵守的手工规则。
参数更少不等于训练更便宜#
AdaLoRA 需要维护 importance 的 moving average、执行全局排序和 mask,还加入了 orthogonal regularization。因此,它的主要贡献是提高固定最终参数预算的使用效率,而不是让训练过程自动变得更快。
论文报告,在单张 V100 上的比较中,AdaLoRA 的显存占用与 LoRA 接近,但训练时间增加约 11 % 11\% 11% –16 % 16\% 16% 。例如 MNLI 的 0.08 % 0.08\% 0.08% 参数设置中,LoRA 每个 epoch 约需 105 105 105 分钟,AdaLoRA 约需 116 116 116 分钟。这个开销换来的是更灵活的 rank allocation,以及同预算下通常更好的任务表现。
从 LoRA 到 AdaLoRA#
LoRA 的问题是如何用 low-rank update 代替完整的 weight update;AdaLoRA 的问题则是,在 low-rank update 已经成立之后,有限的 rank 应该分配给哪些 matrix。
它的推导路径可以概括为:
把 Δ W ‾ ‾ \underline{\underline{\Delta W}} Δ W 写成 SVD-like parameterization;
将它拆成多个可以独立控制的 rank-1 component;
用 sensitivity 和 uncertainty 估计每个 triplet 的 importance;
在所有 layer 和 module 之间全局排序;
逐渐将低重要性方向对应的 λ i \lambda_i λ i 置零。
这里还留下了一个值得继续追问的问题:AdaLoRA 把一个 singular triplet,也就是一个 rank,当作统一的预算单位;但对于不同形状的 matrix,一个 rank 实际对应的参数量是 d 1 + d 2 + 1 d_1+d_2+1 d 1 + d 2 + 1 ,成本并不相同。
因此,“应该给哪个 matrix 更多 rank”之后,还有一个更精确的问题:“在真实参数成本固定时,不同 layer 的 capacity 应该如何分配?”这也是我继续阅读 Layer-Wise Capacity Allocation for Low-Rank Vision-Language-Action Fine-Tuning Under Demonstration Budget Constraints 的原因。
Aditi Mehra, Kevin Daniel Park, Jonathan Miles Carter, Laura Denise Franklin. "Layer-Wise Capacity Allocation for Low-Rank Vision-Language-Action Fine-Tuning Under Demonstration Budget Constraints." Preprint, 2026. https://doi.org/10.13140/RG.2.2.12261.15846