在 LoRA 中通过在原特征一侧添加一个低秩的矩阵实现模型在下游任务的微调:
h = W 0 x + Δ W x = W 0 x + B A x ( 1 ) h=W_0x+\Delta Wx=W_0x+BAx \qquad \qquad (1) h=W0x+ΔWx=W0x+BAx(1)
其中 d i m ( A ) = r × k , d i m ( B ) = d × r r < < m i n ( d , k ) dim(A) = r×k, \quad dim(B)=d×r \quad r << min(d,k) dim(A)=r×k,dim(B)=d×rr<<min(d,k)。
它的一个重要局限性在于:LoRA 在一个模型的所有使用 adapter 的模块都是用同一个 r,但是不同深度的参数,或者同一个深度不同模块的参数,在模型中的重要性应当是不同。
由图中可得,自注意力中的全连接层比计算 Q,K,V 的重要性更高,更深的参数比更浅的参数重要。
故而 AdaLoRA 解决的问题为:根据模块的重要性为他们分配不同的秩。关注于以下几个问题:
- 如何融合 SVD 和 LoRA
- 如何衡量参数的重要性
- 如何根据重要性计算 r
融合 SVD 和 LoRA
如果对 BA 直接进行秩的调整,会将 B 的某些列或者 A 的某些行置零,会丢失较多信息且难以恢复。并且 B 和 A 并不是正交矩阵,意味着各元素之间有强相关性,置零会破坏相关性。
AdaLoRA 将 LoRA 的计算方式调整为(SVD 奇异值分解)并且直接将参数 SVD 化可以避免训练中 SVD 计算带来的资源消耗:
W = W 0 + Δ = W 0 + P Δ Q ( 2 ) W = W_0+\Delta = W_0 + P\Delta Q \qquad \qquad (2) W=W0+Δ=W0+PΔQ(2)
其中 P ∈ R d 1 × r P \in R^{d_1×r} P∈Rd1×r 和 Q ∈ R r × d 2 Q \in R^{r×d_2} Q∈Rr×d2 为 Δ \Delta Δ 的左右奇异向量,同时为了确保 P 和 Q 的正交性有:
R ( P , Q ) = ∣ ∣ P T P − I ∣ ∣ F 2 + ∣ ∣ Q T Q − I ∣ ∣ F 2 ( 3 ) R(P,Q)=||P^TP-I||^2_F+||Q^TQ-I||^2_F \qquad \qquad (3) R(P,Q)=∣∣PTP−I∣∣F2+∣∣QTQ−I∣∣F2(3)
- 只调整 Δ \Delta Δ,训练中更容易恢复被误删的奇异值
- P 和 Q 为正交向量,对 Δ \Delta Δ 的调整不会影响其他奇异值对应的奇异向量
特征重要性
在模型剪枝中,单个参数的敏感度被定义为梯度和权重乘积的绝对值:
I ( w i j ) = ∣ w i j ⋅ ∇ w i j L ∣ ( 4 ) I(w_{ij})=|w_{ij}·\nabla_{w_{ij}}\mathcal{L}| \qquad \qquad (4) I(wij)=∣wij⋅∇wijL∣(4)
在 SGD 中, I ( w i j ) I(w_{ij}) I(wij) 只是单个 batch 的样本的重要性,使用滑动平均来减轻评估误差得到敏感性,并且计算滑动平均的敏感性的不确定性(表示敏感性的局部时间变化) U ( t ) = ( w i j ) = ∣ I ( t ) ( w i j ) − I ‾ ( t ) ( w i j ) ∣ U^{(t)}=(w_{ij})=|I^{(t)}(w_{ij})-\overline{I}^{(t)}(w_{ij})| U(t)=(wij)=∣I(t)(wij)−I(t)(wij)∣:
I ‾ ( t ) ( w i j ) = β 1 I ‾ ( t − 1 ) ( w i j ) + ( 1 − β 1 ) I ( t ) ( w i j ) ( 5 ) U ‾ ( t ) ( w i j ) = β 2 U ‾ ( t − 1 ) ( w i j ) + ( 1 − β 2 ) U ( t ) ( w i j ) ( 6 ) \begin{aligned} &\overline{I}^{(t)}(w_{ij})=\beta_1\overline{I}^{(t-1)}(w_{ij})+(1-\beta_1)I^{(t)}(w_{ij}) \qquad \qquad (5) \\&\overline{U}^{(t)}(w_{ij})=\beta_2\overline{U}^{(t-1)}(w_{ij})+(1-\beta_2)U^{(t)}(w_{ij}) \qquad \qquad (6) \end{aligned} I(t)(wij)=β1I(t−1)(wij)+(1−β1)I(t)(wij)(5)U(t)(wij)=β2U(t−1)(wij)+(1−β2)U(t)(wij)(6)
使用敏感性 I ‾ ( t ) ( w i j ) \overline{I}^{(t)}(w_{ij}) I(t)(wij) 和不确定性 U ‾ ( t ) ( w i j ) \overline{U}^{(t)}(w_{ij}) U(t)(wij) 来描述特折重要性:
s ( t ) ( w i j ) = I ‾ ( t ) ( w i j ) ⋅ U ‾ ( t ) ( w i j ) ( 7 ) s^{(t)}(w_{ij})=\overline{I}^{(t)}(w_{ij})·\overline{U}^{(t)}(w_{ij}) \qquad \qquad (7) s(t)(wij)=I(t)(wij)⋅U(t)(wij)(7)
对于三元组 G k , i = { P k ∗ i , Λ k , i , Q k ∗ i } \mathcal{G}_{k,i}=\{P_{k*i},\Lambda_{k,i},Q_{k*i}\} Gk,i={Pk∗i,Λk,i,Qk∗i} 表示奇异值和它对应的奇异向量 ,它的重要性是三个值的加权和,权值取决于 d 1 d_1 d1 和 d 2 d_2 d2:
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 , j i ) ( 8 ) \boldsymbol{S}_{k,i}=s(\lambda_{k,i})+\frac{1}{d_1}\sum^{d_1}_{j=1}s(P_{k,ji})+\frac{1}{d_2}\sum^{d_2}_{j=1}s(Q_{k,ji}) \qquad \qquad (8) Sk,i=s(λk,i)+d11j=1∑d1s(Pk,ji)+d21j=1∑d2s(Qk,ji)(8)
根据重要性自动计算秩 r
为了计算 r ,一个直观方式是将 r 看做模型的一个参数,根据损失值来调整 r。由此定义他的损失为 cost 和正则项之间的加权和:
L ( P , ε , Q ) = C ( P , ε , Q ) + γ Σ k = 1 n R ( P k , Q k ) ( 9 ) L( \mathcal{P}, \varepsilon , \mathcal{Q}) = C( \mathcal{P}, \varepsilon , \mathcal{Q}) + \gamma\Sigma _{k= 1}^nR( P_k, Q_k) \qquad \qquad (9) L(P,ε,Q)=C(P,ε,Q)+γΣk=1nR(Pk,Qk)(9)
其中 P = { P k } k = 1 n , ε = { Λ k } k = 1 n , Q = { Q k } k = 1 n P=\{P_k\}_{k=1}^n,\varepsilon=\{\Lambda_k\}_{k=1}^n,Q=\{Q_k\}_{k=1}^n P={Pk}k=1n,ε={Λk}k=1n,Q={Qk}k=1n 表示可训练的参数集合。
他们的更新采用梯度下降的方式,不同之处采取了剪枝——将不重要的元素置零,重要的元素进行替换:
Λ ~ k ( t ) = Λ k ( t ) − η ∇ Λ k L ( P , ε , Q ) ( 10 ) Λ k ( t + 1 ) = T ( Λ ~ k ( t ) , S k ( t ) ) , w i t h T ( Λ ~ k ( t ) , S k ( t ) ) i i = { Λ ~ k , i i ( t ) S k , i ( t ) is in the top- b ( t ) o f S ( t ) 0 otherwise, ( 11 ) \begin{aligned} &\tilde{\Lambda}_k^{(t)}=\Lambda_k^{(t)}-\eta\nabla_{\Lambda_k}L( \mathcal{P}, \varepsilon , \mathcal{Q}) \qquad \qquad (10) \\& \boldsymbol{\Lambda}_{k}^{(t+1)} =\mathcal{T}\left(\tilde{\boldsymbol{\Lambda}}_k^{(t)},\boldsymbol{S}_k^{(t)}\right),\mathrm{~with~}\mathcal{T}\left(\tilde{\boldsymbol{\Lambda}}_k^{(t)},\boldsymbol{S}_k^{(t)}\right)_{ii} = \begin{cases} \tilde{\boldsymbol{\Lambda}}_{k,ii}^{(t)} & \boldsymbol{S}_{k,i}^{(t)}\text{ is in the top- }b^{(t)}\mathrm{~of~}\boldsymbol{S}^{(t)} \\ 0 & \text{ otherwise,} & & \end{cases} \qquad \qquad (11) \end{aligned} Λ~k(t)=Λk(t)−η∇ΛkL(P,ε,Q)(10)Λk(t+1)=T(Λ~k(t),Sk(t)), with T(Λ~k(t),Sk(t))ii={Λ~k,ii(t)0Sk,i(t) is in the top- b(t) of S(t) otherwise,(11)
其中 S ( t ) = { S k , i ( t ) } 1 ≤ k ≤ n , 1 ≤ i ≤ r S^{(t)}=\{S^{(t)}_{k,i}\}_{1≤k≤n,1≤i≤r} S(t)={Sk,i(t)}1≤k≤n,1≤i≤r 是通过式(8)得到的所有三元组的重要性, b ( t ) b^{(t)} b(t) 是在第 t 步奇异值个数的预测:
b ( t ) = { b ( 0 ) 0 ≤ t < t i b ( T ) + ( b ( 0 ) − b ( T ) ) ( 1 − t − t i − t f T − t i − t f ) 3 t i ≤ t ≤ T − t f b ( T ) o . w . b^{(t)}= \begin{cases} b^{(0)} &\qquad 0 ≤ t <t_i \\ b^{(T)}+(b^{(0)}-b^{(T)})(1-\frac{t-t_i-t_f}{T-t_i-t_f})^3 &\qquad t_i≤t≤T-t_f \\b^{(T)} &\qquad o.w. \end{cases} b(t)=⎩
⎨
⎧b(0)b(T)+(b(0)−b(T))(1−T−ti−tft−ti−tf)3b(T)0≤t<titi≤t≤T−tfo.w.
在最开始的 t i t_i ti 步,给 b ( t ) b^{(t)} b(t) 一个较大的值让模型达到一个比较好的效果,接下来的 T − t i − t f T-t_i-t_f T−ti−tf,通过让 b ( t ) b^{(t)} b(t) 以三次方的速度逐渐减小来达到对秩的剪枝的目的,最后剩下的 t f t_f tf 步中,稳定秩的大小让模型效果达到当前秩上的一个局部最优。
总结
AdaLoRA 将适配器模块的秩视为一组超参数,并采用模型剪枝技术自适应地调整 LoRA 的秩。为了确保剪枝后模型的稳定性,AdaLoRA 使用 SVD 的三元组形式替代了 LoRA 的二元组,充分利用了 SVD奇异矩阵的正交性以及奇异向量绝对值与特征重要性之间的关联,从而设计出高效的剪枝策略,这一方法极具创新性。