系列博客目录
文章目录
- 系列博客目录
- LoRA: Low-Rank Adaptation of Large Language Models
- 传统模型适配的局限性:尽管研究界致力于通过添加适配器层或优化输入层激活来提高模型适配效率,这些方法在大型模型和延迟敏感的环境中存在局限。适配器层尽管参数较少,但顺序处理导致在线推理时延迟增加,特别是在单GPU环境或需要模型分片的情况下。什么意思?
- 这里面为什么说只需要重新训练少量的
LoRA: Low-Rank Adaptation of Large Language Models
链接
传统模型适配的局限性:尽管研究界致力于通过添加适配器层或优化输入层激活来提高模型适配效率,这些方法在大型模型和延迟敏感的环境中存在局限。适配器层尽管参数较少,但顺序处理导致在线推理时延迟增加,特别是在单GPU环境或需要模型分片的情况下。什么意思?
这段话主要讨论的是在大规模模型和延迟敏感应用场景下,传统的模型适配方法存在的一些问题。
-
适配器层和输入层激活的优化:为了提高模型的适配效率,研究者们通常通过添加适配器层或者优化输入层的激活函数来调整模型,以便更好地适应不同的任务或数据。这些方法在一定程度上可以减少训练时的计算量或提高性能。
-
局限性:尽管适配器层能减少需要调整的参数数量,但它们在推理时可能导致一些问题:
- 顺序处理:适配器层通常需要按顺序进行计算,而这种处理方式可能会增加推理的延迟(即处理时间)。在延迟敏感的应用中(比如实时推理任务),延迟的增加可能会影响模型的实际表现。
- 单GPU环境:如果仅使用单个GPU进行推理,适配器层可能无法充分利用GPU的并行计算能力,进一步增加延迟。
- 模型分片:在处理大型模型时,可能需要将模型分片到多个GPU或机器上。如果适配器层无法有效地进行分布式处理,模型的适配会变得更加复杂,从而增加延迟和计算资源的消耗。
综上所述,这段话表达了传统的适配器层方法在特定环境下(如大模型、单GPU或分布式环境下)可能会面临的一些性能瓶颈和延迟问题。
这里面为什么说只需要重新训练少量的
在这段文字中提到的 LoRA 微调 方法之所以只需要重新训练少量的参数,是因为它的核心思想是将模型的参数增量(更新部分)限制为一个低秩矩阵的形式。这种方法大大减少了需要训练的参数量,原因如下:
-
分离基础模型参数和增量参数:
- LoRA 方法将模型的参数更新表示为一个低秩矩阵的形式(即 Δ Φ ( Θ ) \Delta \Phi(\Theta) ΔΦ(Θ))。
- 原始模型的参数 Φ 0 \Phi_0 Φ0 是冻结的,保持不变。
- 只需要训练新增的低秩增量参数 Δ Φ ( Θ ) \Delta \Phi(\Theta) ΔΦ(Θ),而不是整个模型的参数。
-
低秩矩阵的压缩效果:
- 在 LoRA 方法中,增量参数( Δ Φ \Delta \Phi ΔΦ)被设计为两个小矩阵(通常是维度较低的矩阵),通过矩阵乘法来表示更新。
- 这种低秩结构的参数化方式显著减少了需要训练的参数总量,从而降低了计算资源和存储需求。
-
只需调整任务相关的部分:
- LoRA 微调只关注特定任务所需的参数调整,而不需要重新训练整个模型的所有参数。
- 对于大型模型(如 GPT-3)来说,原始模型的参数量极大,而 LoRA 的低秩参数相对很小,因此只需要训练少量参数。
因此,相较于全面微调(需要对整个模型的参数进行更新和存储),LoRA 微调极大地降低了训练参数的规模,同时保留了较好的性能。这就是为什么在文中说 “只需要重新训练少量的参数”。
低秩矩阵的压缩效果主要是利用了矩阵分解的数学特性来降低参数量。以下是具体的原因:
- 矩阵参数的常规形式 vs 低秩形式
假设我们有一个需要更新的大矩阵 Δ Φ \Delta \Phi ΔΦ,其维度为 d × k d \times k d×k。在常规方法中,我们需要直接优化整个矩阵 Δ Φ \Delta \Phi ΔΦ,这会导致以下参数量:
参数总量 = d × k \text{参数总量} = d \times k 参数总量=d×k
在 LoRA 中,假设 Δ Φ \Delta \Phi ΔΦ 是低秩的,即它可以被分解为两个小矩阵 A A A 和 B B B 的乘积:
Δ Φ = A ⋅ B \Delta \Phi = A \cdot B ΔΦ=A⋅B
其中:
- A A A 的维度为 d × r d \times r d×r
- B B B 的维度为 r × k r \times k r×k
- r r r 是一个小于 d d d 和 k k k 的秩,称为“低秩”(rank)。
在这种情况下,参数总量变成:
参数总量 = ( d × r ) + ( r × k ) \text{参数总量} = (d \times r) + (r \times k) 参数总量=(d×r)+(r×k)
由于 r ≪ min ( d , k ) r \ll \min(d, k) r≪min(d,k),参数量相比 d × k d \times k d×k 会显著减少。
- 为什么低秩矩阵可以压缩参数量?
这归因于矩阵的秩,即一个矩阵的列向量或行向量的线性独立性。对于高维矩阵来说,实际上有许多列向量是高度相关的,因此整个矩阵的秩通常比矩阵的行数或列数小很多。也就是说,原始矩阵的信息可以被有效地压缩到一个低秩子空间中,而不会丢失重要的信息。
在 LoRA 方法中,通过假设参数更新矩阵 Δ Φ \Delta \Phi ΔΦ 是低秩的:
- 只需学习低秩矩阵 A A A 和 B B B,就能表示 Δ Φ \Delta \Phi ΔΦ。
- 这样不仅减少了参数的存储需求,还能保留更新的主要信息。
- 计算资源和存储需求的降低
在实际应用中,优化 Δ Φ \Delta \Phi ΔΦ 的直接方法需要显式存储并计算完整的 d × k d \times k d×k 矩阵。使用 LoRA 的低秩分解后:
- 存储需求减少:需要存储的参数数量从 d × k d \times k d×k 降为 ( d × r ) + ( r × k ) (d \times r) + (r \times k) (d×r)+(r×k)。
- 计算效率提高:在实际推理或训练中,计算 Δ Φ ⋅ x \Delta \Phi \cdot x ΔΦ⋅x (矩阵乘法)时,只需按顺序计算 A ⋅ ( B ⋅ x ) A \cdot (B \cdot x) A⋅(B⋅x),这个计算量也比直接计算大矩阵的乘法更低。
例如,如果 d = 1000 d = 1000 d=1000、 k = 1000 k = 1000 k=1000、而 r = 10 r = 10 r=10:
- 原始参数量: 1000 × 1000 = 1 , 000 , 000 1000 \times 1000 = 1,000,000 1000×1000=1,000,000
- LoRA 参数量: ( 1000 × 10 ) + ( 10 × 1000 ) = 20 , 000 (1000 \times 10) + (10 \times 1000) = 20,000 (1000×10)+(10×1000)=20,000
- 参数量压缩比: 20 , 000 / 1 , 000 , 000 = 2 % 20,000 / 1,000,000 = 2\% 20,000/1,000,000=2%
这表明 LoRA 能够通过低秩分解显著减少参数量,同时保证模型的性能。
- 总结
LoRA 方法之所以能通过低秩矩阵实现压缩效果,是因为:- 原始大矩阵中存在冗余信息,低秩矩阵能够有效捕捉重要的变化特征。
- 参数总量被降低到两个小矩阵的维度之和。
- 存储和计算的需求都大幅减少,这对于大型模型(如 GPT-3)特别关键。
通过这种方式,LoRA 微调既能节省资源,又能保持模型的高效性和准确性。