LoRA论文学习总结

前言

NLP模型训练的一般范式就是在领域数据集上进行预训练来适应特定的任务,但当模型越来越大时,重新训练所有模型参数的微调就变得不太可行。LoRA(Low-Rank Adaptation)微调的思想是冻结与训练的模型权重,并将可训练的秩分解矩阵注入到Transformer架构的每一层,大大减少了下有任务的可训练参数的数量。

论文地址:https://arxiv.org/pdf/2106.09685.pdf

代码仓库:https://github.com/microsoft/LoRA

1.矩阵的秩

1.1 K阶子式

m ∗ n m*n mn的矩阵 A A A中,任取 k k k行与 k k k列( k < = m , k < = n k<=m, k<=n k<=m,k<=n),位于这些行列交叉处的 k 2 k^2 k2个元素,不改变他们在 A A A中所处的位置次序而得的 k k k阶行列式,称为矩阵 A A A k k k阶子式。如下式中,右边矩阵就是左边矩阵的2阶子式

[ 1 2 3 4 5 6 7 8 9 ] ⟶ [ 2 3 5 6 ] \begin{bmatrix} 1 &{\color{Red} 2} &{\color{Red} 3} \\ 4 &{\color{Red} 5} &{\color{Red} 6} \\ 7 &8 &9 \end{bmatrix} \longrightarrow \begin{bmatrix} {\color{Red} 2} &{\color{Red} 3} \\ {\color{Red} 5} &{\color{Red} 6} \end{bmatrix} 147258369 [2536]

1.2 矩阵的秩

设在矩阵 A A A中有一个不等于0的 r r r阶子式 D D D,且所有 r + 1 r+1 r+1阶子式(如果存在的话)全等于0,那么 D D D称为矩阵 A A A的最高阶非零子式,数称 r r r为矩阵 A A A的秩,记作 R ( A ) R(A) R(A). 并规定零矩阵的秩等于0

这句话的意思就是,非零子式的最高阶数就秩

例如下式中的左边的矩阵经过初等变换后得到右边的矩阵,右边矩阵的最高阶非零子式的阶数为3,那就说明原矩阵的秩为3
[ 2 − 1 − 1 1 2 1 1 − 2 1 4 4 − 6 2 − 2 4 3 6 9 7 9 ] ⟶ [ 1 0 − 1 0 4 0 1 − 1 0 3 0 0 0 1 − 3 0 0 0 0 0 ] \begin{bmatrix} 2 &-1 &-1 &1 &2 \\ 1 &1 &-2 &1 &4 \\ 4 &-6 &2 &-2 &4 \\ 3 &6 &9 &7 &9 \end{bmatrix} \longrightarrow \begin{bmatrix} 1 &0 &-1 &0 &4 \\ 0 &1 &-1 &0 &3 \\ 0 &0 &0 &1 &-3 \\ 0 &0 &0 &0 &0 \end{bmatrix} 21431166122911272449 10000100110000104330

2.低秩参数化更新矩阵

神经网络包含许多执行矩阵乘法的密集层,这些层中的权矩阵通常是全秩的。在适应特定任务时,预训练的语言模型具有较低的“内在维度”,尽管随机投射到较小的子空间,但仍然可以有效地学习。受此启发,论文假设权重的更新在适应过程中也具有较低的“内在秩”。对于预训练的权重矩阵 W 0 ∈ R d ∗ k W_0\in R^{d*k} W0Rdk,用低阶分解成 W 0 + Δ W = W 0 + B A W_0 +\Delta W = W_0 + BA W0+ΔW=W0+BA来表示它的更新,其中 B ∈ R d ∗ r , A ∈ R r ∗ k B\in R^{d*r}, A\in R^{r*k} BRdr,ARrk,并且秩 r ≪ m i n ( d , k ) r\ll min(d,k) rmin(d,k). 在训练过程中, W 0 W_0 W0被冻结,不进行梯度更新,而 A A A B B B包含可训练参数。 W 0 W_0 W0 Δ W = B A \Delta W = BA ΔW=BA都有相同的输入,它们各自的输出向量按坐标求和。 x x x的正向传递过程可以表示为:
y = W o x + Δ W x = W 0 x + B A x y=W_ox+\Delta Wx=W_0x+BAx y=Wox+ΔWx=W0x+BAx
LoRA的训练过程如下图所示,刚开始训练时,B为全0矩阵,A通过随机高斯初始化:
在这里插入图片描述

从图中可以看出, r r r是训练时的超参数,且远远小于 d d d,所以LoRA的模型权重占用的内存非常小

同时也能看出,模型在推理时LoRA的权重和预训练权重是并行计算的,所以加上LoRA后的模型没有推理延迟。

总结

LoRA是一种有效的适应策略,既不会引入推理延迟,也不会减少输入序列长度,同时保持高模型质量。 重要的是,当它部署为服务时,通过共享绝大多数模型参数,可以实现快速任务切换

后来有在LoRA的基础上衍生出新的方法,例如QLoRA,它对模型权重进行先量化再微调,模型是按照NF4(4-bit NormalFloat)保存的,训练时需要把参数反量化到bf16后进行训练

AdaLORA改进了LORA可微调参数的分配方式,提出了一种基于下游任务动态分配秩 r r r的方法。AdaLORA包含两个组成部分:1.基于 SVD 的自适应,以奇异值分解的形式制定增量矩阵;2.重要性感知排名分配,根据重要性度量来修剪冗余奇异值

<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>### 机器学习中的LoRA(Low-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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值