LoRA(Low-Rank Adaptation),低秩适配,是一种微调技术,适用于预训练大模型(例如BERT、GPT等),旨在通过引入低秩矩阵来调整模型的权重,从而在微调过程中显著减少计算和存储开销。下面将详细解释LoRA的原理和如何运作,以及它与传统微调方法的区别。
1. LoRA的基本思想
在传统的微调方法中,通常是直接对预训练模型的权重进行更新,也就是说,微调过程中会调整模型的每个参数(尤其是Transformer网络中的大规模权重矩阵)。这种方式的问题在于,当模型非常大时,调整所有的权重参数会消耗巨大的计算资源和内存。
LoRA通过一种创新的方式来解决这个问题:它不直接修改模型的权重,而是通过低秩分解在原始权重矩阵中引入额外的低秩矩阵,仅调整这些低秩矩阵的参数,而不是整个权重矩阵。
2. 低秩矩阵和低秩分解
首先,什么是低秩矩阵?低秩矩阵是指矩阵的秩相对较低的矩阵。矩阵的秩是其行或列线性独立的最大数目,秩低的矩阵表示其中的信息量较少,存储和计算复杂度较低。
低秩分解的思想:对于一个大的矩阵(例如Transformer层中的权重矩阵),它可以通过两个较小的矩阵的乘积来表示,且这两个矩阵的秩远小于原始矩阵。这种方法不仅能够减少存储和计算的开销,还能够保留矩阵中的关键信息。
LoRA通过对原始的大型权重矩阵进行低秩分解,插入一个或多个低秩矩阵,只对这些低秩矩阵进行微调,而不直接更新整个权重矩阵。这就大大减少了需要训练的参数量。
3. LoRA的具体实现
在LoRA中,对于每个Transformer层的权重矩阵,不直接对其进行更新,而是引入低秩矩阵 A \mathbf{A} A 和 B \mathbf{B} B 来替代。假设原始的权重矩阵是 W W W,LoRA会将 W W W 近似为: W ≈ W 0 + Δ W = W 0 + A ⋅ B , W \approx W_0 + \Delta W = W_0 + A \cdot B, W≈W0+ΔW=W0+A⋅B, 其中, W 0 W_0 W0 是预训练时获得的原始权重(保持不变), A A A 和 B B B 是可学习的低秩矩阵,通过低秩分解表示原始矩阵的调整部分。
步骤:
- 低秩矩阵的引入:在每一层的权重矩阵中插入低秩矩阵 A A A 和 B B B,这些矩阵的秩通常会设置得非常低,比如几十或几百(而不是原始矩阵可能有成千上万个维度)。
- 只更新低秩矩阵:在微调过程中,只有这些低秩矩阵 A A A 和 B B B 的参数会被训练,原始权重矩阵 W 0 W_0 W0 保持不变。
举例:
-
假设原始的权重矩阵 W 0 W_0 W0 是一个 5000 × 5000 5000 \times 5000 5000×5000 的矩阵。
-
通过引入两个低秩矩阵 A A A 和 B B B 来调整这个矩阵,其中 A A A 是一个 5000 × 200 5000 \times 200 5000×200 的矩阵, B B B 是一个 200 × 5000 200 \times 5000 200×5000 的矩阵。
-
调整项 A ⋅ B A \cdot B A⋅B 会是一个 5000 × 5000 5000 \times 5000 5000×5000 的矩阵(即与 W 0 W_0 W0 相同的维度),它表示原始权重矩阵的调整部分。这个 A ⋅ B A \cdot B A⋅B 的矩阵将作为调整项加到原始权重矩阵 W 0 W_0 W0 上,得到最终的权重矩阵 W = W 0 + A ⋅ B W = W_0 + A \cdot B W=W0+A⋅B。
-
由于 A A A 和 B B B 的秩 r = 200 r=200 r=200 很小(远小于 5000 5000 5000),因此低秩矩阵的维度远小于原始矩阵,这就使得需要训练的参数量大大减少。
4. LoRA的代码实现(示例)
在实现LoRA时,一些深度学习框架(例如 Hugging Face 的 Transformers库)提供了LoRA的支持。LoRA通常通过在每层权重矩阵之间插入 低秩适配(Adapter)层 来实现。
from transformers import AutoModelForSequenceClassification
from peft import LoRA
# 加载预训练模型
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")
# 应用LoRA技术,仅对低秩矩阵进行微调
lora_model = LoRA(model, r=8) # r是低秩矩阵的秩
# 在特定任务上进行微调
lora_model.train(your_training_data)
5. LoRA的优势
LoRA的设计有几个显著的优点,特别是在资源有限的情况下进行大规模模型微调时:
-
减少训练参数,提高计算效率:通过引入低秩矩阵,LoRA显著减少了需要微调的参数量。比如,原始权重矩阵可能非常大,而低秩矩阵的参数远小于原矩阵,因此计算和存储开销大大减少。
-
保持模型性能:尽管微调的参数量大幅减少,但通过低秩适配,LoRA能够有效地调整模型的表现,从而仍然能够达到良好的微调效果。这是因为低秩矩阵能够捕捉到重要的变动信息。
-
灵活性和扩展性:LoRA可以被应用到任何使用Transformer架构的预训练模型中,包括BERT、GPT、T5等。它适应了不同模型的需求,并且在计算资源有限的情况下也能有效进行微调。
6. LoRA与Adapter方法的对比
LoRA 可以被视为 Adapter方法 的一种变体。两者的核心思想都是在预训练模型的基础上添加一些轻量级的可训练模块,从而避免对整个大模型进行微调,减少计算资源和内存的消耗。唯一的区别在于LoRA采用了低秩矩阵分解的方法,而传统的Adapter方法通常使用的是较为简单的小型网络层。
Adapter方法也是一种轻量级的微调技术,在预训练模型的基础上插入额外的、较小的可训练模块,而不是直接对整个模型进行微调。常见的Adapter模块是一个小型的全连接层,其作用是调整网络的某些特征表示,同时不需要改变原始预训练模型的大部分权重。具体步骤通常是:
- 冻结主干模型:只冻结预训练模型的主要部分(如Transformer的每一层),不对原始权重进行更新。
- 插入Adapter模块:在每一层或特定层之间插入小的Adapter模块,这些模块通常是由全连接层组成,训练时只优化Adapter模块的参数。
这种方法大大减少了计算和存储开销,因为Adapter模块相对较小,通常只包含几个参数。