【小白】一文读懂LoRA大模型微调技术原理及论文详细解读

一、前言

自然语言处理的主导范式包括对一般领域数据的大规模预训练和对特定任务或领域的适应。当我们预训练更大的模型时,重新训练所有模型参数的传统微调变得不太可行。以GPT-3 175 B为例,部署许多独立的微调模型实例,每个实例都有175 B参数,这是非常昂贵的。我们提出了低秩自适应,或LoRA,其冻结预训练的模型权重并将可训练的秩分解矩阵注入到Transformer架构的每一层中,大大减少了下游任务的可训练参数数量。LoRA的性能与完全微调相当或优于完全微调。在GPT-3和GPT-2上调整模型质量,尽管具有更少的可训练参数,更高的训练吞吐量,并且没有额外的推理延迟。

在这里插入图片描述
学习的过参数化模型实际上存在于低内在维度上。我们假设语言模型自适应中的更新矩阵也具有低“内在秩”,从而导致我们提出的低秩自适应(LoRA)方法。

LoRA允许我们通过注入和优化密集层更新的秩分解矩阵来间接训练神经网络中的每个密集层,同时保持原始矩阵冻结,如图所示。(即,图中的r可以是1或2)即使在满秩(即,d)高达12288时也足够,使得LoRA既有空间效率又有计算效率。

二、LoRA优势

  1. 一个预先训练好的模型可以共享,用于为不同的任务构建多个小的LoRA模块。我们可以将共享的原始模型保存在VRAM中,并通过替换图1中的矩阵A和B来高效切换任务,这显著降低了存储需求和任务切换开销。
  2. 它使训练更有效,并将硬件进入障碍降低了3倍,因为在使用自适应优化器时,我们不需要计算梯度或维护大多数模型参数的优化器状态。相反,我们只优化注入的低秩矩阵,它们的参数要少得多。
  3. 其简单的线性设计允许我们在部署过程中将更新矩阵与原始权重合并,不会引入推理延迟。
  4. LoRA与现有技术正交,可以与其中许多技术(如前缀调整)结合使用。我们在附录D中提供了

三、方法原理

  1. 更新矩阵的低秩约束。一个典型的神经网络包含许多执行矩阵乘法的密集层。这些层中的权重矩阵被允许具有满秩。然而,当适应特定任务时,Aghajanyan等人[1]表明,预训练的语言模型具有低“内在维度”,尽管进行了低维重新参数化,仍然可以有效地学习。受此观察的启发,我们想知道在适应下游任务时,权重的更新是否也具有低“内在秩”。对于预先训练的权重矩阵W0,我们通过用低秩分解来约束其更新。在训练期间,W0被冻结并且不接收梯度更新,而A和B包含可训练参数。请注意,W 0和BA都与相同的输入相乘,并且它们各自的输出向量按坐标求和。对于h = W0x,我们修改的前向传递:
    在这里插入图片描述
    对A使用随机高斯初始化,对B使用零,因此在训练开始时,W = BA为零。
  2. 权重衰减到预训练权重。我们注意到LoRA的权重衰减行为与完全微调不同。具体而言,在A和B上执行通常的权重衰减类似于衰减回预训练权重,这已被研究为对抗“灾难性遗忘”的潜在有效形式的正则化。
  • 权重衰减:在优化时,加一个惩罚项,倾向于让权重变小。
  • 衰减到预训练权重:不仅是让权重接近0,而是让变化(LoRA参数)尽量小,相当于让整个模型偏好留在预训练的表示附近。
  • 正则化优势:避免过拟合,保护预训练模型积累的知识,同时允许小范围内针对新任务的调整。
  1. 没有额外的推理延迟。在部署过程中,我们可以显式计算W = W0 +BA,并像往常一样执行推理。当我们需要切换到另一个下游任务时,我们可以通过减去BA然后添加不同的B0A0来恢复W0。这会导致峰值内存使用量略有增加,并增加不超过单个模型前向传递的模型切换延迟。关键是,我们在推理期间不引入任何额外的等待时间。

3.1 应用到transformer

原则上,我们可以将LoRA应用于神经网络中的任何权重矩阵子集,以减少可训练参数的数量。在Transformer架构中,自注意力模块中有四个权重矩阵。(Wq; Wk; Wv; Wo)和MLP模中的两个。我们将Wq(或Wk,Wv)作为维度dmodel × dmodel的单个矩阵,尽管输出维度通常被切割成注意力头,但我们将我们的研究限制在仅改变下游任务的注意力权重,并冻结MLP模块(因此它们在下游任务中没有被训练),因为将LoRA应用于后者导致给定相同秩r的可训练参数的数量是4倍。

  1. 给定有限的参数预算,我们应该使用LoRA来适应哪些类型的权重,以获得下游任务的最佳性能?与调整具有较大秩的单一类型权重相比,更可取的是调整更多的权重矩阵。论文中调整qv层效果最佳。
  2. LoRA的最优秩r是多少?增加r并不能覆盖更有意义的子空间,这表明低秩自适应矩阵是足够的。无论 r=8 还是 r=64,最终权重变化矩阵的**主导方向(最大的几个奇异值对应的奇异向量)**几乎是一样的。而其他方向可能包含训练期间积累的大部分随机噪声,这些方向如果让它们存在,反而可能导致过拟合或者模型性能下降。
  • 实质:微调权重变化的矩阵,其奇异值谱(SVD spectrum)是长尾快速衰减的;只有头部几维(top-k singular directions)很重要,后面都是noise;低秩近似 = 保留重要部分,自动丢弃噪声。
  1. 适应性矩阵△W与W相比如何?与随机矩阵相比,△W与W具有更强的相关性,表明△W放大了W中已经存在的一些特征。其次,△W只放大W中未被强调的方向,而不是重复W的顶部奇异方向。第三,放大因子相当大:21.5 约为6.91/0.32,(r = 4)。这表明,低-秩自适应矩阵潜在地放大了在一般预训练模型中学习但未强调的特定下游任务的重要特征。

论文:《LoRA: Low-Rank Adaptation of Large Language Models》

### LoRA 大模型微调技术 #### 定义与背景 Low-Rank Adaptation (LoRA) 是一种用于大语言模型参数高效微调的技术。通过引入低秩矩阵分解的方法,在保持原有模型性能的同时显著减少训练所需的计算资源和时间[^1]。 #### 方法原理 具体来说,LoRA 技术主要基于两个核心概念: - **低秩更新**:只对部分权重矩阵施加较小规模的增量变化; - **冻结预训练层**:除了新增加的小型可训练模块外,其余大部分网络结构维持不变并固定下来不再参与反向传播过程中的梯度下降操作。 这种方法不仅能够有效降低内存占用量级至原来的千分之一级别,而且还能加快收敛速度约十倍以上[^2]。 #### 实现方式 以下是 Python 中实现 LoRA 微调的一个简单例子: ```python from peft import get_peft_model, LoraConfig, TaskType import transformers model_name_or_path = "bert-base-uncased" tokenizer_name_or_path = "bert-base-uncased" config = { 'base_model': model_name_or_path, } peft_config = LoraConfig( task_type=TaskType.SEQ_CLS, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1 ) model = transformers.AutoModelForSequenceClassification.from_pretrained(model_name_or_path) model = get_peft_model(model, peft_config) ``` 此代码片段展示了如何配置以及获取适用于序列分类任务类型的 BERT 模型实例,并为其添加了特定于 LoRA 的设置选项来完成初始化工作流程。 #### 最佳实践建议 当采用 LoRA 进行实际项目开发时,可以考虑以下几个方面以获得更好的效果: - 合理设定超参数 `r` 和 `lora_alpha` ,这二者决定了适应组件的空间维度大小及其影响程度; - 对不同子集的数据分别测试验证最佳的学习率范围; - 尝试多种组合策略如多轮迭代优化等提高最终泛化能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值