2021-arxiv-LoRA Low-Rank Adaptation of Large Language Models

2021-arxiv-LoRA Low-Rank Adaptation of Large Language Models


Paper: https://arxiv.org/abs/2106.09685
Code: https://github.com/microsoft/LoRA

大型语言模型的LoRA低秩自适应

自然语言处理的一个重要范式包括对通用领域数据的大规模预训练和对特定任务或领域的适应。当预训练更大的模型时,完全微调(重新训练所有模型参数)变得不那么可行。以 GPT-3 175B 为例,部署微调模型的独立实例,每个实例都有 175B 参数,成本高得令人望而却步 因此, 作者提出了低秩自适应(Low-Rank Adaptation,简称LoRA),它冻结了预训练模型的权重,并将可训练的秩分解矩阵注入到Transformer架构的每一层中,大大减少了下游任务的可训练参数数量。与使用 Adam 微调的 GPT-3 175B 相比,LoRA 可以将可训练参数的数量减少 10,000 倍,将 GPU 内存需求减少 3 倍。LoRA 在 RoBERTa、DeBERTa、GPT-2 和 GPT-3 上的模型质量与微调相当或更好,尽管可训练参数更少、训练吞吐量更高,并且与适配器不同,没有额外的推理延迟。
LoRA用来降低大语言模型下游任务训练的算力及内存资源需求量,降低预训练大模型产品化落地的成本。

LoRA基本思想

  1. 在原始PLM旁边增加一个旁路,做一个降维再升维的操作,来模拟所谓的intrinsic rank。
  2. 训练的时候固定PLM的参数,只训练降维矩阵A与升维矩阵B。
  3. 而模型的输入输出维度不变,输出时将BA与PLM的参数叠加。用随机高斯分布初始化A,用0矩阵初始化B,保证训练的开始此旁路矩阵依然是0矩阵。


下面是参数的更新表示:
其中,预训练的矩阵为 W 0 ∈ R d × k W_0 \in \mathbb{R}^{d \times k} W0Rd×k,它的更新表示为:

W 0 + Δ W = W 0 + B A , B ∈ R d × r , A ∈ R r × k W_0+\Delta W=W_0+B A, B \in \mathbb{R}^{d \times r}, A \in \mathbb{R}^{r \times k} W0+ΔW=W0+BA,BRd×r,ARr×k
其中秩 r < < m i n ( d , k ) r << min(d,k) r<<min(d,k)
对于 h = W 0 x h=W_0x h=W0x ,它的前向计算变为:
h = W 0 x + Δ W x = W 0 x + B A x = ( W 0 + B A ) x h=W_0 x+\Delta W x=W_0 x+B A x=\left(W_0+B A\right) x h=W0x+ΔWx=W0x+BAx=(W0+BA)x
这种方式类似与残差连接,同时使用这个旁路的更新来模拟full finetuning的过程。

参考

https://zhuanlan.zhihu.com/p/514033873

<think>嗯,用户让我介绍一下机器学习中的LoRA,我需要先回忆一下相关知识,确保自己理解正确。LoRA全称是Low-Rank Adaptation,主要用于微调大型预训练模型,对吧?记得它在处理像GPT-3这样的大模型时,通过低秩分解来减少可训练参数数量,这样既节省计算资源又避免过拟合。 首先,我应该解释LoRA的基本概念。用户可能对微调大模型的问题有了解,比如全参数微调成本高,所以需要LoRA这样的高效方法。要说明LoRA的核心思想是低秩矩阵分解,冻结预训练模型的权重,注入可训练的秩分解矩阵到Transformer层。这样参数数量大大减少,比如原始权重矩阵是d×d,分解成两个小矩阵d×r和r×d,r远小于d,所以参数量从d²降到2dr。 接下来需要讲LoRA的具体实现步骤,可能用户想知道怎么应用到模型中。比如在Transformer的自注意力层,给每个权重矩阵W添加低秩矩阵BA,其中B和A是可训练的,初始时A用随机高斯,B用零矩阵,这样初始时BA为零,不影响原始模型输出。这样在训练时,只有这些低秩矩阵的参数被更新,而原始参数冻结,从而减少计算量。 然后应该谈谈LoRA的优势,比如高效、灵活、兼容性好。高效是因为参数少,内存和计算资源需求低;灵活是r可以调整,平衡效果和效率;兼容性好是训练后可以将BA合并回原始权重,方便部署。 应用场景方面,大模型微调、资源有限的情况,还有需要快速迭代的场景。例如用LoRA微调GPT-3进行特定任务,或者个人研究者用少量GPU微调模型。 最后,可能还要对比其他微调方法,比如Adapter Layers和Prefix Tuning,说明LoRA的不同之处,比如直接修改权重矩阵而非插入层或添加前缀,这样可能更高效或效果更好。 不过需要确认这些信息是否准确,比如低秩矩阵的分解方式是否正确,参数量的计算是否无误。可能用户想知道为什么低秩有效,可能需要提到参数效率假设,即模型在适应任务时参数变化是低秩的。另外,是否要提具体论文或作者?可能用户不需要,但可以提到微软的研究者2021年提出,增强可信度。 还要注意用中文,结构清晰,分点说明,使用合适的数学公式,行内用$...$,独立公式用$$...$$,比如分解后的矩阵表达式。确保LaTeX正确,比如矩阵乘法的表示。 检查有没有错误的地方,比如参数量计算是否正确,比如d×r + r×d确实是2dr,是的。初始化的方法是否正确,A随机,B为零,是的。合并参数的部分是否正确,训练后将BA加到W上,是的。 可能用户是刚开始接触LoRA,所以需要避免过于技术化的术语,用易懂的语言解释。同时需要结构清晰,逐步引导,从概念到实现到优势到应用,这样用户能一步步理解。 总结一下,回答的结构应该是: 1. LoRA的概述和背景 2. 核心思想和技术细节 3. 实现步骤 4. 优势 5. 应用场景 6. 与其他方法的对比 这样用户能全面了解。确保每个部分简明扼要,重点突出,帮助用户解决实际问题,比如为什么要用LoRA,怎么用,有什么好处。</think>### 机器学习中的LoRALow-Rank Adaptation)介绍 #### 1. **概述** LoRA(低秩自适应)是一种**高效微调大型预训练模型**的技术,主要用于解决传统全参数微调(Fine-tuning)存在的**计算成本高**和**存储开销大**的问题。它通过**低秩矩阵分解**,仅训练少量参数即可让模型适应新任务,广泛应用于自然语言处理(NLP)领域(如GPT、BERT等)。 --- #### 2. **核心思想** LoRA基于一个关键假设:**模型在适应新任务时,参数的变化矩阵具有低秩特性**(即大部分信息可由少量主成分表示)。具体实现分为两步: - **冻结预训练模型的原始权重**,避免直接修改大参数矩阵。 - **向模型注入可训练的低秩矩阵**,通常作用于Transformer架构的注意力层或全连接层。 例如,对于权重矩阵 $W \in \mathbb{R}^{d \times d}$,LoRA将其参数变化分解为: $$ \Delta W = B \cdot A \quad \text{其中} \quad B \in \mathbb{R}^{d \times r}, \ A \in \mathbb{R}^{r \times d}, \ r \ll d $$ 这里 $r$ 是低秩的维度(如8或64),训练时仅更新 $B$ 和 $A$,参数量从 $d^2$ 减少到 $2dr$。 --- #### 3. **实现步骤** 以Transformer的自注意力层为例: 1. **选择目标层**:通常为查询(Query)和值(Value)矩阵。 2. **添加低秩矩阵**:对每个目标矩阵 $W$,新增两个小矩阵 $B$ 和 $A$,初始时 $A$ 使用随机高斯分布,$B$ 初始化为零矩阵。 3. **前向传播**:原始输出变为 $Wx + BAx$,其中 $BAx$ 是低秩适配项。 4. **反向传播**:仅更新 $B$ 和 $A$,原始 $W$ 保持冻结。 --- #### 4. **优势** - **高效性**:训练参数量减少90%以上,内存和计算需求显著降低。 - **灵活性**:通过调整秩 $r$,平衡效果与效率($r$ 越大,可表达能力越强)。 - **兼容性**:训练完成后,可将 $B$ 和 $A$ 合并到原始权重中($W_{\text{new}} = W + BA$),无需额外部署成本。 --- #### 5. **应用场景** - **大模型微调**:如使用LoRA微调GPT-3生成特定领域文本。 - **资源受限场景**:在单张消费级GPU(如24GB显存)上微调百亿参数模型。 - **快速迭代**:同时训练多个低秩适配器,适配不同下游任务。 --- #### 6. **与其他方法的对比** | 方法 | 特点 | |------------------|----------------------------------------------------------------------| | **全参数微调** | 训练所有参数,成本高,易过拟合 | | **Adapter Layers** | 插入小型网络模块,增加推理延迟 | | **Prefix Tuning** | 在输入前添加可学习前缀,效果依赖提示设计 | | **LoRA** | 直接修改权重矩阵,无推理延迟,参数高效 | --- #### 7. **代码示例(伪代码)** ```python # 原始权重矩阵(冻结) W = PretrainedModel.get_weights() # 添加低秩矩阵B和A B = nn.Parameter(torch.zeros(d, r)) # 初始化为0 A = nn.Parameter(torch.randn(r, d)) # 随机初始化 # 前向计算 def forward(x): return W @ x + (B @ A) @ x ``` --- #### 8. **参考资料** - 论文:[LoRA: Low-Rank Adaptation of Large Language Models](https://arxiv.org/abs/2106.09685)(微软,2021- 适用框架:Hugging Face Transformers、PyTorch、TensorFlow等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发呆的比目鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值