LoRA Limition
这个公式描述了在 LoRA 微调方法中的前向传播过程。我们来看一下公式的具体含义:
h = W x + Δ W x = W x + α r B A x h = Wx + \Delta Wx = Wx + \frac{\alpha}{r} B A x h=Wx+ΔWx=Wx+rαBAx
其中:
- h h h表示通过神经网络层的输出。
- W W W是原始模型中的权重矩阵。
- x x x 是输入向量。
- Δ W \Delta W ΔW 表示权重的更新部分,用低秩矩阵的形式表示。
- α r B A \frac{\alpha}{r} B A rαBA 表示 LoRA 的权重变化,分解为两个低秩矩阵 B ∈ R d × r B \in \mathbb{R}^{d \times r} B∈Rd×r和 A ∈ R r × d A \in \mathbb{R}^{r \times d} A∈Rr×d乘积,再乘以一个缩放因子 α r \frac{\alpha}{r} rα,这里 $ r $是秩。
具体含义:
-
W x Wx Wx:这是原始模型的输出。原始模型的权重矩阵 W W W作用于输入 x x x,产生输出。
-
Δ W \Delta W ΔW:这是 LoRA 引入的低秩修正部分。由于直接训练整个 W W W 的成本过高,LoRA 提出了用两个低秩矩阵 A A A和 B B B 来近似权重更新,即 Δ W ≈ B A \Delta W \approx B A ΔW≈BA,这样可以减少参数量。通过这个分解,训练时只需学习 A A A和 B B B 而不需要更新整个 W W W。
-
α r \frac{\alpha}{r} rα:这里的缩放因子 α r \frac{\alpha}{r} rα是为了控制更新的幅度。 α \alpha α是一个缩放超参数,用户可以设定, r r r 是低秩矩阵的秩(rank),通常 r ≪ d r \ll d r≪d,表示相对于原始矩阵 W W W 的维度,秩是比较小的,因此缩放因子可以控制更新的量。
-
B A x B A x BAx:这个项表示 LoRA 的低秩适配器,它通过先将输入 x x x 经过 A A A投射到低秩空间(即降维),再经过 B B B 投射回原始维度,从而对原始权重 W W W 做出低秩的调整。
其中,r就是我们设定的矩阵的秩,在微调过程中,所有做lora适配器的module,它们的r都是一致的,且在训练过程中不会改变。在LoRA原始论文中,作者最终选择对attention模型的 W q W_q Wq, W v W_v Wv做低秩适配。
SVD分解和AdaLoRA
结合奇异值分解(SVD,Singular Value Decomposition)来解释 AdaLoRA 的机制,可以帮助我们更好地理解它如何动态调整秩,并在参数有效性的基础上优化模型性能。
SVD 分解的基本概念
奇异值分解(SVD)是一种矩阵分解技术,它将一个矩阵分解为三个部分:左奇异矩阵、奇异值对角矩阵和右奇异矩阵。对于一个权重矩阵 W ∈ R d × d W \in \mathbb{R}^{d \times d} W∈Rd×d,SVD 可以表示为:
W = U Σ V T W = U \Sigma V^T W=UΣVT
其中:
- U ∈ R d × d U \in \mathbb{R}^{d \times d} U∈Rd×d 是左奇异矩阵,包含左奇异向量。
- V ∈ R d × d V \in \mathbb{R}^{d \times d} V∈Rd×d是右奇异矩阵,包含右奇异向量。
- Σ ∈ R d × d \Sigma \in \mathbb{R}^{d \times d} Σ∈Rd×d是奇异值矩阵,通常是对角矩阵,对角线元素是非负的奇异值,其他位置是零。
如果我们只保留前 ( r ) 个最大的奇异值(这对应于截断奇异值分解,即 T-SVD),则可以近似地表示矩阵:
W ≈ U r Σ r V r T W \approx U_r \Sigma_r V_r^T W≈UrΣrVrT
这里的 r r r 是秩,决定了矩阵的低秩近似。秩越小,参数量越少,但同时也牺牲了一定的表示能力。
将 SVD 应用到 LoRA
LoRA(Low-Rank Adaptation)通过低秩矩阵 A ∈ R d × r A \in \mathbb{R}^{d \times r} A∈Rd×r和 B ∈ R r × d B \in \mathbb{R}^{r \times d} B∈Rr×d来近似权重更新矩阵 Δ W \Delta W ΔW,可以理解为在 T-SVD 的基础上对矩阵进行了降秩近似。LoRA 的更新公式为:
Δ W = B A \Delta W = B A ΔW=BA
这相当于通过两个秩为 r r r 的矩阵 B B B和 A A A来逼近原始权重的变化,而不必直接更新整个权重矩阵 W W W,从而减少参数量。
AdaLoRA 的改进
AdaLoRA 的核心改进在于它通过动态分配秩 r r r,使得模型在不同的训练阶段或任务中能根据需求调整表示能力。具体地,AdaLoRA 可以理解为:
-
梯度信息的利用:在训练过程中,AdaLoRA 动态评估权重矩阵的各个奇异值对模型性能的影响。通过分析每个方向的梯度贡献,系统地确定需要分配更多表示能力(秩更高)的部分和可以减少表示能力的部分。
-
动态调整秩 r r r:对于那些梯度贡献大的部分,AdaLoRA 分配较大的秩 r r r,这意味着更多的参数用于表示这些重要的特征;对于梯度贡献较小的部分,AdaLoRA 则降低 r r r,减少参数量和计算开销。这种动态调整可以通过对 SVD 分解中的奇异值的贡献进行判断,实现自适应的秩分配。
-
与 SVD 的关系:在 SVD 中,较大的奇异值通常代表数据的主要信息,而较小的奇异值则包含较少的重要信息。AdaLoRA 在训练过程中,自适应地决定在哪些方向上需要更高秩,类似于保留 SVD 中重要奇异值对应的分量,而丢弃那些不重要的奇异值(即通过动态调节秩,适应不同任务的复杂度)。
用 SVD 公式解释 AdaLoRA
假设模型在某个时刻的权重矩阵 W W W通过 SVD 分解为 W = U Σ V T W = U \Sigma V^T W=UΣVT,AdaLoRA 的目标是通过调整低秩矩阵 A A A 和 B B B 来近似权重变化 Δ W \Delta W ΔW。因此,AdaLoRA 实际上是通过以下形式动态调节秩:
Δ W = ∑ i = 1 r λ i u i v i T \Delta W = \sum_{i=1}^{r} \lambda_i u_i v_i^T ΔW=i=1∑rλiuiviT
这里的 λ i \lambda_i λi是奇异值, u i u_i ui和 v i T v_i^T viT 分别是左奇异向量和右奇异向量。AdaLoRA 动态调整 r r r 的大小,选择合适的秩来确保权重变化能够对任务保持足够的表达能力。
动态秩分配的实现
AdaLoRA 通过以下步骤动态调整秩:
-
梯度计算:在训练的每一步,AdaLoRA 计算每个奇异值方向的梯度信息,从而确定哪些方向对任务性能更为重要。
-
秩分配策略:根据梯度的贡献,AdaLoRA 自适应地增加或减少不同层的秩,使得资源更多地集中在关键方向上。例如,某些层需要更多的秩来表示复杂的模式,另一些层则只需要较少的秩即可。
-
权重更新:模型根据动态调整后的秩更新低秩矩阵 A A A 和 B B B,从而调整整个模型的表示能力和参数量。
总结
结合 SVD 分解,AdaLoRA 的工作机制可以视作是一种自适应的低秩近似,它通过评估各个奇异值方向的重要性,动态调整矩阵的秩来提升模型的参数效率。这样既保证了模型在复杂任务中的表现,也避免了不必要的计算开销,最终在权重更新中达到一种高效的平衡。
通过这个自适应的动态调整过程,AdaLoRA 在保持模型紧凑的同时,能够根据任务需求灵活改变模型的表达能力。
1.增量矩阵的本征秩无法自适应调整
在LoRA中,增量矩阵的本征秩r是预先指定的,无法根据实际需求自适应调整。这意味着在一些任务中可能无法充分利用模型的潜力。
AdaLoRA的核心思想是根据不同任务的需求,动态地调整LoRA的秩,使得在相同的模型架构下,复杂的任务可以获得更高的秩,而简单那任务则使用较低的秩。它的基本方法是在训练过程中,自动调整 LoRA 适配矩阵的秩,使之更灵活地适应不同层的变化。这样可以避免因为低秩而导致的性能损失,同时也避免过高秩带来的冗余计算和存储开销。
2.忽略了权重矩阵的多样性和不同层次的微调效果
LoRA通常只考虑某些特定的权重矩阵(如Attention模块)的微调,而忽略了其他权重(如前馈神经网络)的影响。这可能会限制模型的微调效果。
3.只微调Attention模块,忽略FFN模块
LoRA 主要针对 Attention 模块进行微调,而忽略了前馈神经网络(FFN)模块,这可能导致模型的微调效果不够全面。
AdaLoRA解决方案
这张图片展示了奇异值分解(SVD,Singular Value Decomposition)的几何意义,并介绍了如何通过 SVD 分解矩阵来提取其中的重要信息。
图示与解释
图中描述了一个矩阵 M M M作用在二维空间中的向量 v 1 ⃗ \vec{v_1} v1和 v 2 ⃗ \vec{v_2} v2上,经过变换后,这两个正交向量变成了 σ 1 u 1 ⃗ \sigma_1 \vec{u_1} σ1u1和 σ 2 u 2 ⃗ \sigma_2 \vec{u_2} σ2u2 。其中:
- v 1 ⃗ , v 2 ⃗ \vec{v_1}, \vec{v_2} v1,v2是原始空间中一组正交的单位向量。
- σ 1 , σ 2 \sigma_1, \sigma_2 σ1,σ2 是变换后的伸缩因子(奇异值),分别表示矩阵 M M M在 v 1 ⃗ , v 2 ⃗ \vec{v_1}, \vec{v_2} v1,v2方向上的拉伸或压缩。
- u 1 ⃗ , u 2 ⃗ \vec{u_1}, \vec{u_2} u1,u2是经过变换后的新方向,依然保持正交。
图中展示了 M M M如何作用在原空间中的基向量( v 1 ⃗ , v 2 ⃗ \vec{v_1}, \vec{v_2} v1,v2)上,并将它们变换到新的方向 u 1 ⃗ , u 2 ⃗ \vec{u_1}, \vec{u_2} u1,u2上,同时在这些方向上进行不同程度的拉伸或压缩(由奇异值 σ 1 \sigma_1 σ1和 σ 2 \sigma_2 σ2 决定)。
数学表达
这一过程可以通过如下数学公式描述:
M [ v 1 ⃗ , v 2 ⃗ ] = [ σ 1 u 1 ⃗ , σ 2 u 2 ⃗ ] M [\vec{v_1}, \vec{v_2}] = [\sigma_1 \vec{u_1}, \sigma_2 \vec{u_2}] M[v1,v2]=[σ1u1,σ2u2]
进一步可以表示为:
M = [ u 1 ⃗ , u 2 ⃗ ] [ σ 1 0 0 σ 2 ] [ v 1 ⃗ , v 2 ⃗ ] T M = [\vec{u_1}, \vec{u_2}] \begin{bmatrix} \sigma_1 & 0 \\ 0 & \sigma_2 \end{bmatrix} [\vec{v_1}, \vec{v_2}]^T M=[u1,u2][σ100σ2][v1,v2]T
这个公式表示矩阵 ( M ) 通过奇异值分解(SVD)分解为三个矩阵的乘积:
M = U Σ V T M = U \Sigma V^T M=UΣVT
其中:
- U = [ u 1 ⃗ , u 2 ⃗ ] U = [\vec{u_1}, \vec{u_2}] U=[u1,u2]是一个正交矩阵,包含了变换后的正交方向(左奇异向量)。
- Σ \Sigma Σ是一个对角矩阵,对角线上是奇异值 σ 1 , σ 2 \sigma_1, \sigma_2 σ1,σ2,它们代表矩阵在对应方向上的拉伸或压缩因子。
- V T = [ v 1 ⃗ , v 2 ⃗ ] T V^T = [\vec{v_1}, \vec{v_2}]^T VT=[v1,v2]T 是另一个正交矩阵,包含原始空间的正交方向(右奇异向量)。
几何意义
SVD 给出了一个矩阵 M M M的几何解释:矩阵 M M M可以通过以下步骤分解:
- 首先,矩阵 V T V^T VT将原始向量 v 1 ⃗ , v 2 ⃗ \vec{v_1}, \vec{v_2} v1,v2旋转到新的坐标系中。
- 接下来,矩阵 Σ \Sigma Σ对新坐标系中的各个方向进行拉伸或压缩,拉伸因子由奇异值 σ 1 , σ 2 \sigma_1, \sigma_2 σ1,σ2决定。
- 最后,矩阵 U U U 再将这个结果旋转到最终的坐标系中。
信息解释
图片中提到, σ 1 \sigma_1 σ1和 σ 2 \sigma_2 σ2包含了矩阵 M M M的“信息量”。如果 σ 1 ≫ σ 2 \sigma_1 \gg \sigma_2 σ1≫σ2,意味着矩阵 M M M在 u 1 ⃗ \vec{u_1} u1 方向上的信息量远大于 u 2 ⃗ \vec{u_2} u2方向。这种情况下,我们可以认为矩阵 M M M中的主要信息集中在 $\vec{u_1} $ 方向,而 u 2 ⃗ \vec{u_2} u2方向的信息较少。
当我们找到这样一组 U , Σ , V U, \Sigma, V U,Σ,V矩阵时,就能够识别出 M M M中最强的方向信息,并用低秩矩阵来近似 M M M。这种近似方式特别适用于矩阵压缩和特征提取。
低秩近似的解释
通过奇异值分解,如果我们只保留奇异值矩阵 $ \Sigma $中较大的奇异值和对应的奇异向量,就可以得到一个低秩的近似矩阵。这种方法可以用于数据压缩或降维操作,因为我们只保留了包含大部分信息的方向。
- 在实际应用中,保留 Σ \Sigma Σ中前 r r r个最大的奇异值及其对应的向量,我们就可以得到矩阵 M M M 的低秩近似 M r M_r Mr,这种近似矩阵保留了矩阵 M M M中大部分的重要信息,而舍弃了次要信息。
结论
这张图片通过几何和数学的方式解释了 SVD 分解的原理。SVD 分解将矩阵分解为三个部分,表示为一个旋转矩阵、一个拉伸矩阵和另一个旋转矩阵的乘积。通过保留矩阵中最重要的奇异值及其对应的方向,可以得到矩阵的低秩近似,从而实现数据压缩和特征提取的目的。
让模型学习SVD分解的近似
这张图片进一步讨论了 SVD 分解 和 LoRA 以及 AdaLoRA 的关系,解释了 AdaLoRA 是如何通过学习权重矩阵的低秩近似来达到模型优化的目的。
SVD 分解复习
图片上半部分提到:通过 SVD 分解,我们可以将矩阵 M M M分解为:
M = U Σ V T M = U \Sigma V^T M=UΣVT
其中:
- U U U 和 V V V 是正交矩阵,代表矩阵的旋转和方向。
- Σ \Sigma Σ是对角矩阵,对角线上是奇异值 σ 1 , σ 2 \sigma_1, \sigma_2 σ1,σ2,它们表示矩阵在这些正交方向上的拉伸或压缩。
对于一个 2D 矩阵,SVD 分解的形式如下:
M = [ u 1 ⃗ , u 2 ⃗ ] [ σ 1 0 0 σ 2 ] [ v 1 ⃗ , v 2 ⃗ ] T M = [\vec{u_1}, \vec{u_2}] \begin{bmatrix} \sigma_1 & 0 \\ 0 & \sigma_2 \end{bmatrix} [\vec{v_1}, \vec{v_2}]^T M=[u1,u2][σ100σ2][v1,v2]T
这种分解形式揭示了矩阵 M M M可以通过奇异值和正交向量来表示,其几何意义是通过旋转和缩放来对向量进行变换。
LoRA 的设计思想
LoRA 的设计思想是基于矩阵的低秩近似。在 LoRA 中,我们用两个低秩矩阵 ( A ) 和 ( B ) 近似权重矩阵的更新 Δ W \Delta W ΔW:
Δ W = B A \Delta W = B A ΔW=BA
LoRA 的这种方法类似于 SVD 分解的结果,但没有明确地进行 SVD 分解,而是通过让模型去学习两个矩阵 ( A ) 和 ( B ),从而实现权重矩阵的更新。具体来说,LoRA 将 Δ W \Delta W ΔW的秩降至一个更小的值 ( r ),使得模型只需要更新低秩矩阵,而不需要更新整个原始的高维矩阵 ( W ),这大大减少了训练时的参数量。
因此,LoRA 的核心思想是通过低秩矩阵分解(类似 SVD)的方式,利用较少的参数来近似权重更新。
AdaLoRA 的创新
AdaLoRA 是对 LoRA 的进一步改进。在 AdaLoRA 中,提出了一种动态调整秩的机制,适应不同任务和模型的需求。具体来说,AdaLoRA 不再仅仅通过固定的两个低秩矩阵 A A A和 B B B来逼近权重更新,而是引入了三个矩阵 P P P、 Λ \Lambda Λ、 Q Q Q,用来近似 SVD 分解的三个部分 U U U、 Σ \Sigma Σ 和 $ V$。
公式如下:
Δ W ≈ P Λ Q \Delta W \approx P \Lambda Q ΔW≈PΛQ
- P P P 类似于 SVD 分解中的左奇异向量矩阵 U U U,它代表新的正交方向。
- Λ \Lambda Λ 类似于奇异值矩阵 Σ \Sigma Σ,表示在各个方向上的拉伸或压缩因子。
- Q Q Q 类似于右奇异向量矩阵 V T V^T VT,表示旋转方向。
通过学习 P P P、 Λ \Lambda Λ 和 Q Q Q矩阵,AdaLoRA 可以近似权重更新矩阵 Δ W \Delta W ΔW,这等同于学习矩阵的 SVD 分解结果。因为 AdaLoRA 能够动态调整秩,这使得它在复杂任务中可以分配更多的秩来捕获重要信息,而在简单任务中则可以减少秩,节省计算资源。
总结
这张图片的内容解释了 LoRA 和 AdaLoRA 如何通过低秩矩阵的方式来近似权重更新矩阵,从而减少训练中的参数量。具体来说:
- LoRA 使用两个低秩矩阵 ( A ) 和 ( B ) 来近似权重更新,思想类似于 SVD 分解。
- AdaLoRA 则进一步通过引入三个矩阵 ( P )、$\Lambda $、( Q ),近似 SVD 分解的各部分,并通过动态调整秩,优化不同任务的参数分配。
这种方法使得 AdaLoRA 能够更灵活地适应不同任务的复杂性,同时保持较高的参数效率。
AdaLoRA动态更新秩的过程
这张图展示了 AdaLoRA 动态变秩的工作流程,描述了如何通过逐步调整秩(rank)来优化模型的权重更新过程。下面我会详细讲解每一步的流程和其背后的含义。
第一部分:AdaLoRA 的初始设定
公式表示了 AdaLoRA 中权重更新矩阵 Δ W \Delta W ΔW的计算方式:
Δ W = P Λ Q \Delta W = P \Lambda Q ΔW=PΛQ
其中:
- P P P:是一个 R d 1 × r \mathbb{R}^{d_1 \times r} Rd1×r维度的矩阵,它代表左奇异向量的集合。每一列 P i P_i Pi是一个奇异向量。
- Λ \Lambda Λ:是一个对角矩阵 R r × r \mathbb{R}^{r \times r} Rr×r,对角线上的是奇异值 σ 1 , σ 2 , … , σ r \sigma_1, \sigma_2, \dots, \sigma_r σ1,σ2,…,σr,这些奇异值代表了矩阵在每个方向上的重要性。
- Q Q Q:是一个 R r × d 2 \mathbb{R}^{r \times d_2} Rr×d2的矩阵,代表右奇异向量的集合。
AdaLoRA 使用 三元组 G i = { P i , σ i , Q i } G_i = \{P_i, \sigma_i, Q_i\} Gi={Pi,σi,Qi}表示每个方向上参与的元素,每个 G i G_i Gi包含奇异向量 $ P_i$、奇异值 σ i \sigma_i σi和奇异向量 Q i Q_i Qi。这些三元组用于计算权重更新。
第二部分:正向和反向传播以及重要性分数的计算
在正向传播和反向传播过程中,AdaLoRA 通过计算损失函数(Loss),来评估每个三元组 G i G_i Gi 对模型性能的影响。计算完损失函数后,系统会为每个三元组分配一个“重要性分数”(importance score)。这些重要性分数用于衡量各个方向(即奇异值和奇异向量)的贡献。
重要性分数的计算依赖于梯度贡献(即各个方向上梯度的大小)。梯度大的方向说明对优化损失函数更重要,因此这些方向上的分数较高,反之则较低。
第三部分:秩的动态调整(Masking)
接下来,根据每个三元组的 重要性分数,AdaLoRA 对那些重要性较低的三元组进行mask(遮蔽)。遮蔽操作是将不重要的奇异值 $\sigma_i $设置为零,这意味着对应的奇异向量 P i P_i Pi 和$ Q_i $ 不再参与接下来的计算和更新,但并不是删除它们,而是临时忽略它们。这样做可以在降低计算量的同时,保证只保留那些对模型性能有显著影响的方向。
遮蔽后的矩阵 Δ W \Delta W ΔW 看起来如下:
Δ W = P Λ Q \Delta W = P \Lambda Q ΔW=PΛQ
其中,部分 P P P和 Q Q Q 的列,以及 Λ \Lambda Λ对角线中的某些 σ i \sigma_i σi 被“mask”掉。
第四部分:重复迭代与进一步调整
完成遮蔽后,模型会继续进行下一轮的正向和反向传播,重新计算损失函数并根据梯度贡献更新重要性分数。这一轮新的计算将基于上一步的遮蔽操作(部分奇异向量被忽略)。然后再一次对重要性低的三元组进行遮蔽。
这一过程会反复进行,每次都重新评估每个方向的梯度贡献,动态调整秩(mask更多不重要的三元组)。每次更新后,模型只保留最重要的方向,从而逐步减少不必要的计算。
动态变秩的意义
这个过程展示了 AdaLoRA 如何通过动态调整秩 r r r,即通过对重要性低的三元组进行 mask 操作,有效地减少计算开销并提升模型的效率。与传统 LoRA 固定低秩矩阵不同,AdaLoRA 的创新之处在于它能够根据任务复杂度和训练情况自适应调整秩,这使得它更加灵活且高效。
具体来说:
- 高效性:通过逐步 mask 不重要的奇异值和奇异向量,模型可以在保留重要信息的同时,减少冗余计算。
- 灵活性:每次迭代都基于新的梯度信息,因此能够动态适应不同任务和层次的需求,确保模型性能不会因为秩过低而受影响。
总结
- AdaLoRA 的关键在于对权重更新矩阵 Δ W \Delta W ΔW的分解,其中 P P P、 Λ \Lambda Λ和 Q Q Q 对应于奇异值分解中的左右奇异向量和奇异值矩阵。
- 通过计算每个三元组的梯度贡献(重要性分数),系统可以对不重要的部分进行 mask 操作,逐步减少模型的计算需求。
- 整个过程是动态的,每一轮迭代都会重新计算重要性分数,并更新 mask,从而自适应调整秩,优化模型性能。
通过这种动态变秩的机制,AdaLoRA 在降低模型计算成本的同时,保持了强大的性能和表达能力。