LoRA的原理简介

在文章开始前先澄清一个概念,需要区分形近的单词"LoRa"(long range),这是一项通信技术。熟悉物联网行业的朋友相对会比较熟悉LoRa这项技术,因为有些设备比如电梯的控制就使用了这个技术进行本地数据和命令的传输。

本文介绍的LoRA(最后两个字母大写),是Low-Rank Adaptation的缩写,Low-Rank来自于对权重矩阵的分解。LoRA技术通过将权重矩阵分解成低秩矩阵的乘积,降低了参数数目,进而达到减少硬件资源、加速微调进程的目的。

众所周知,大模型所涉及的参数都是以10亿起的,往往上百亿千亿级的参数。这些模型进行预训练后的基座模型(Base Model)在具体的应用场景下需要进一步微调。这时面临两种选择:

  • 全参数的微调:毫无疑问,这个需要加载所有的参数进行调整训练,费时费力更费钱。
  • 部分参数的微调:只针对某些层的权重和参数进行调整训练,能够减少存储空间和加速部署,但存在一些性能和模型质量的损耗。

LoRA在保留基座模型全部参数的同时,拆分出权重矩阵的更新并进行矩阵分解,通过调整训练这个由低秩矩阵乘积表示的更新矩阵来减少存储空间的同时保留了模型的质量和微调速度。

LoRA原理

LoRA的详细论文介绍可以阅读参考资料2(LORA: LOW-RANK ADAPTATION OF LARGE LAN- GUAGE MODELS)。其原理如下图所示:对于一个预训练好的基座模型,保留其原有的权重矩阵W不变,仅微调训练更新部分,且这个更新权重矩阵被分解成A和B两个低秩矩阵。下图中A矩阵初始化为高斯分布矩阵,B矩阵初始化为0矩阵。

数学表达:

h=W_{0}x + \Delta Wx=W_{0}x+BAx

其中的B\in \mathbb{R}^{d\times r}A\in \mathbb{R}^{r\times d},同时r << d。

这里的好处显而易见,假设d=10000, r = 8,在使用LoRA前需要对10000 * 10000共计1亿个参数进行计算更新,而LoRA仅需要10000*8 + 8*10000共计16万个参数的更新计算。论文中使用的模型是“GPT-3 175B”,这个差距读者可以自行计算。

具体微调时会引入两个超参数:\alphar,它俩的比\alpha / r\Delta W进行缩放,类似学习率(learning rate)超参数来控制\Delta W的更新步长。

这里有个疑问,为什么将\Delta W能进行分解呢?这里就涉及到矩阵秩和列向量的线性相关性之类的数学概念,以及参考资料3中的发现。有兴趣的读者可以自己再深究。

同时,参考资料2作者还发现仅对W_{q}进行分解更新的效果不够,但对全部4个权重矩阵进行更新并没有大幅提升,对W_{q}W_{v}进行分解更新就能取得足够好的效果,一般r取4或者8:

参考资料:

1. YouTube LoRA explained (and a bit about precision and quantization)

2. LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

3. INTRINSIC DIMENSIONALITY EXPLAINS THE EFFEC- TIVENESS OF LANGUAGE MODEL FINE-TUNING

### LoRA低秩适应原理 LoRA(Low-Rank Adaptation)是一种针对大型语言模型(LLMs)的高效微调方法,旨在通过减少可学习参数的数量来降低计算成本和存储需求。其核心思想是利用矩阵分解的技术,在不改变原始预训练权重的情况下引入一组低秩更新矩阵[^2]。 具体来说,LoRA假设大模型中的某些权重矩阵 \( W \) 可以被近似表示为两个较小维度矩阵乘积的形式: \[ \nabla W = BA \] 其中,\( A \in \mathbb{R}^{d_1 \times r} \),\( B \in \mathbb{R}^{r \times d_2} \),\( r \ll min(d_1, d_2) \)[^3]。这里的 \( r \) 是超参数,称为 **rank** 或者 **low-rank dimensionality**,它控制着新增加参数的数量以及模型表达能力之间的权衡。 这种设计使得只有少量新参数需要优化,即矩阵 \( A \) 和 \( B \),而不是整个权重矩阵 \( W \) 的所有元素。因此,相比传统的全量微调方式,LoRA显著减少了内存占用并加快了训练速度。 ### 实现机制 #### 训练阶段 在实际应用中,当采用LoRA进行模型调整时: - 原始的大规模预训练模型保持冻结状态; - 对于选定的目标层(通常是注意力模块或者前馈网络部分),插入额外的小型可训练组件——上述定义里的 \( A \) 和 \( B \) 矩阵; - 这些小型组件会随着目标任务数据集一起参与梯度下降过程的学习; 值得注意的是,并不是所有的参数都需要经历这样的处理流程。实际上研究表明并非总是必要去修改每一个可能存在的连接关系 。这意味着可以根据具体情况灵活决定哪些地方适合加入LoRA结构来进行针对性增强效果的同时维持较低资源消耗水平。 另外,在切换不同下游应用场景之间也很方便快捷:只需要替换对应版本下的特定lora weight文件夹内容即可快速适配其他相似性质的任务需求而无需重新加载庞大的基础架构本身[ ^3 ]. #### 推理阶段 为了进一步提升效率,在部署期间还可以选择性地将这些增量式的修正项永久融入到原有的骨干框架之中。例如通过简单相加以形成最终版综合后的整体表现形式: \[ W_{merged}=W+\Delta W=W+(BA) \] 一旦完成了此类操作之后,则无论是在后续运行还是保存导出等方面都不会再存在任何附加负担或是复杂程度增加的情况发生[ ^4 ]. 同样重要的一点在于如果希望恢复至未融合之前的状态也是完全可行的 —— 即使反复执行多次交替转换动作也不会影响系统的稳定性与一致性特性[ ^4 ] . 最后需要注意一点关于术语上的澄清说明:“低秩”并不意味着任意随机选取出来的某个张量必然具备该属性特征。正如所提及的例子那样即使像B这样一个看似满足条件的对象也可能因其内部构成要素间缺乏足够的独立自由度而导致不符合严格意义上的分类标准[ ^5 ] . ```python import torch.nn as nn from peft import get_peft_config, PeftModelForSequenceClassification peft_config = get_peft_config(peft_type="LORA", ...) model = PeftModelForSequenceClassification.from_pretrained(...) # Training phase with lora layers active. model.train() # Evaluation or inference time merging weights into base model. model.eval() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值