当前位置: 首页 > ds >正文

低秩适应(LoRA)与量化LoRA(QLoRA)技术解析

LoRA:从线性代数到模型微调

从矩阵分解理解Lora

假设我们有一个大模型中的权重矩阵,形状为1024×512(包含约52万个参数)。传统微调方法会直接更新这52万个参数,这不仅计算量大,而且存在过拟合风险。

LoRA的做法是:

  1. 保持原始权重矩阵不变
  2. 引入两个小矩阵:比如1024×32和32×512
  3. 这两个小矩阵相乘得到的结果与原始矩阵形状相同
  4. 将乘积结果与原始矩阵相加,作为最终使用的权重

这种方法的优势立刻显现:

  • 32是一个超参数r(rank),通常远小于原始维度
  • 两个小矩阵总共只有约4.9万个参数,仅为原始矩阵的约9.3%
  • 如果r取更小值(如8或4),参数量可进一步减少

总结一下:LoRA的核心思想源自线性代数中的"低秩矩阵分解"技术。这个名字可以拆解为Low-Rank Adaptation,字面意思是"低秩适应"。通过这种技术,我们可以巧妙地绕过直接修改原始模型的庞大参数,而是添加训练一组规模小得多的参数矩阵。
在这里插入图片描述

为什么这么做会有效

LoRA的数学表达

让我们用数学公式来表达这个过程。对于原始权重矩阵 W∈R^(d×k),LoRA微调后的权重表示为:

W_LoRA = W + ΔW = W + BA

其中:

  • B∈R^(d×r) 和 A∈R^(r×k) 是两个低秩矩阵
  • r << min(d,k),确保参数量大幅减少
  • 初始化时,B可以随机初始化,而A通常初始化为全零矩阵

在实际应用中,还会引入一个缩放因子α,修改公式为:

W_LoRA = W + (α/r)BA

这样做可以更好地控制微调的程度,α与r的比值影响着学习率的选择。

实际应用与注意事项

矩阵的秩,通常选择4~32之间的值

在使用Hugging Face Transformers库的PEFT(Parameter-Efficient Fine-Tuning)模块实现LoRA时,主要参数包括:

  • r: 矩阵的秩,通常选择4~32之间的值
  • alpha: 缩放因子,缩放因子的默认值为 1,这意味着在计算模型的前向传播时,预训练权重和低秩权重更新的权重相等。但是,可以更改 α 的值,以平衡预训练模型和新的特定任务自适应的重要性。最近的实证分析表明,对于秩较高的 LoRA,需要更大的 α 值(即,rα 越大,则越小)。
  • target_modules: 指定应用LoRA的层,可以是全部层或特定层
from peft import LoraConfig, get_peft_modelconfig = LoraConfig(r=8,alpha=16,target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],lora_dropout=0.05,
)model = get_peft_model(base_model, config)

值得注意的是,LoRA通常不应用于偏置项(bias)和层归一化(layer normalization)参数,这些参数量相对较小,可以直接训练。

QLoRA:量化与低秩适应的结合

QLoRA(Quantized LoRA)是LoRA的进阶版本,它将量化技术与低秩适应相结合。通过将原模型量化到较低精度(如4位整数),同时使用LoRA进行微调,可以实现更高效的内存使用。

这种组合方法特别适合于单GPU环境,使开发者能够在普通消费级GPU(如RTX 4090或A10)上微调大型模型(如Llama 7B甚至更大)。

http://www.xdnf.cn/news/4945.html

相关文章:

  • ‌CDGP|数据治理:探索企业数据有序与安全的解决之道
  • Web 自动化之 HTML JavaScript 详解
  • OpenCV-Python (官方)中文教程(部分一)_Day22
  • 云服务如何简化物联网设备生命周期(How Cloud Services Simplify IoT Device Lifecycles)?
  • 摄像头模组AF、OIS模组
  • 接口-DAO模式
  • 65.微服务保姆教程 (八) 微服务开发与治理实战
  • 车载网络TOP20核心概念科普
  • Go使用Gin写一个对MySQL的增删改查服务
  • JS 问号(?)运算符避免中间报错
  • VNC windows连接ubuntu桌面
  • 涨薪技术|0到1学会性能测试第52课-Tomcat调优技术
  • 从回调到 Promise:异步编程进化史
  • 数据库(MySQL)基础
  • 【Python】Python项目中的依赖与配置:requirements.txt、setup.py、pyproject.toml 详解
  • git cola如何选择指定的多个commit同时合并到另外一个分支上
  • vscode与keil的乱码不兼容问题
  • 3.2.3 掌握RDD转换算子 - 3. 扁平映射算子 - flatMap()
  • matlab稳定求解高精度二维对流扩散方程
  • ​​​​​​​MySQL数据库故障排查指南
  • springboot+vue实现在线网盘(云盘)系统
  • Open CASCADE学习|Geom2d_Curve类
  • c语言if else语句格式(非常详细)
  • 管道符_+xargs拓展参数传递操作,以及find指令
  • 真相与幻象的博弈:AI“幻觉”的生成密码与治理革命
  • 稀疏数组在组合优化中的典型应用场景
  • 数据透视表控件DHTMLX Pivot v2.1发布,新增HTML 模板、增强样式等多个功能
  • 快速上手知识图谱开源库AmpliGraph教程指南(二)
  • 深入探索 JavaScript 中的模块对象
  • 算法中的数学:约数