什么是LoRA微调
LoRA是大模型微调方法的一种,它的特点是只在模型的 部分权重(如 QKV 矩阵) 上 添加可训练参数
通过 低秩矩阵(A×B) 来优化参数更新
优点:
极大降低显存消耗(deepseek 7B 只需 10GB)
适用于多任务 LoRA 适配器切换
训练速度快
例如在 Transformer 里,自注意力(Self-Attention)计算:
Y=XW,
其中 X 是input, W是原始模型的权重矩阵(全连接层).
传统的Fine-tuning就是直接对 W 进行梯度更新,导致需要存储整个 W 的更新版本,显存占用极大。
LoRA 关键思想:
不直接更新 W,而是 用两个小矩阵 A A A 和 B B B 近似建模 W 的变化:
W ′ = W + Δ W W' = W + \Delta W W′=W+ΔW
Δ W = A B \Delta W = AB ΔW=AB
其中:
A ∈ R d × r A \in \mathbb{R}^{d \times r} A∈Rd×r
B ∈ R r × d B \in \mathbb{R}^{r \times d} B∈Rr×d
r ≪ d r \ll d r≪d(低秩),一般 r=4, 8, 16,远小于 d。
所以只需要训练A 和 B,大幅减少训练参数量,用 A B AB AB近似 Δ W \Delta W ΔW, 使得最终 W ′ W' W′仍然能适应新任务。
训练时,只更新A和B, W保持冻结。
推理时,计算 W + A B W+AB W+AB得到微调后的完整模型, 但A,B远小于W,开销极小。
代码简单演示一下如何在transformer的q_proj里加入LoRA
在 Transformer 里,q_proj 是 nn.Linear 层
import torch
import torch.nn as nn
import mathclass LoRAQProj(nn.Module):def __init__(self, hidden_size, r=16, lora_alpha=16):super().__init__()self.hidden_size = hidden_sizeself.r = rself.lora_alpha = lora_alphaself.scaling = lora_alpha / r # LoRA 影响力# 原始 Q 投影层(冻结)self.q_proj = nn.Linear(hidden_size, hidden_size, bias=False)# LoRA 适配器:A 和 Bself.lora_A = nn.Linear(hidden_size, r, bias=False) # 低秩 Aself.lora_B = nn.Linear(r, hidden_size, bias=False) # 低秩 B# 初始化 LoRA 参数nn.init.kaiming_uniform_(self.lora_A.weight, a=math.sqrt(5))nn.init.zeros_(self.lora_B.weight) # B 矩阵初始化为 0def forward(self, x):"""计算 Self-Attention 里的 Query 矩阵:Q = X * (W_q + AB)"""base_output = self.q_proj(x) # 原始投影lora_output = self.lora_B(self.lora_A(x)) * self.scaling # LoRA 适配器return base_output + lora_output # 总输出# 测试模型
hidden_size = 512
batch_size = 4
seq_len = 10x = torch.randn(batch_size, seq_len, hidden_size) # 输入数据
model = LoRAQProj(hidden_size)
output = model(x)print("LoRA Q-Projection Output Shape:", output.shape) # (4, 10, 512)
训练LoRA适配器
训练时,冻结self.q_proj, 只训练lora_A 和 lora_B
# 训练 LoRA
optimizer = torch.optim.AdamW([p for n, p in model.named_parameters() if "lora" in n], lr=1e-4
)for epoch in range(10):for batch in dataloader: # 假设 dataloader 提供训练数据optimizer.zero_grad()output = model(batch["input_ids"])loss = loss_function(output, batch["labels"]) # 计算损失loss.backward()optimizer.step()
推理时合并LoRA
LoRA 训练完成后,我们需要合并 A, B 到 q_proj
计算 W q ′ = W q + A B W_{q}' = W_{q} + AB Wq′=Wq+AB,
这样,可以移除A,B,只保留 W q ′ W_{q}' Wq′, 加速推理
def merge_lora(model):"""合并 LoRA 适配器到原始权重:W_q' = W_q + AB"""with torch.no_grad():model.q_proj.weight += (model.lora_B.weight @ model.lora_A.weight) * model.scaling# 移除 LoRA 适配器del model.lora_Adel model.lora_Breturn model# 进行推理时合并 LoRA
merged_model = merge_lora(model)
不过实际中,不需要我们自己去写这些代码,可以用unsloth, LLaMA-Factory 等框架来实现。
相关文章:
什么是LoRA微调
LoRA是大模型微调方法的一种,它的特点是只在模型的 部分权重(如 QKV 矩阵) 上 添加可训练参数 通过 低秩矩阵(AB) 来优化参数更新 优点: 极大降低显存消耗(deepseek 7B 只需 10GB) 适…...
热管理系统:新能源汽车的 “温度管家”
在新能源汽车的众多系统中,热管理系统堪称是一位默默守护的 “温度管家”,其重要性不容小觑。传统燃油车的热管理主要围绕发动机、变速箱冷却系统和空调系统,而新能源汽车的热管理则涵盖了电池系统、电机电控、空调系统等绝大部分零部件 &…...
如何修改Windows系统Ollama模型存储位置
默认情况下,Ollama 模型会存储在 C 盘用户目录下的 .ollama/models 文件夹中,这会占用大量 C 盘空间,增加C盘“爆红”的几率。所以,我们就需要修改Ollama的模型存储位置 Ollama提供了一个环境变量参数可以修改Ollama的默认存在位…...
《网络安全入门实战手册》
0经验转行网络安全,个人分享一下学习中总结的文档,以下为目录可以点击标题看对应文章,欢迎评论区讨论,后期会发更多安全相关的学习资料等。希望跟大家一起进步。 第1章:网络安全基础知识 1、什么是网络安全ÿ…...
一文详解U盘启动Legacy/UEFI方式以及GPT/MBR关系
对于装系统的老手而说一直想研究一下装系统的原理,以及面对一些问题时的解决思路,故对以前的方法进行原理上的解释,主要想理解其底层原理。 引导模式 MBR分区可以同时支持UEFI和Legacy引导,我们可以看一下微pe制作的启动盘&#…...
如何查看java的字节码文件?javap?能用IDEA吗?
编译指令: javac YourProject.java 查看字节码文件的指令: javap -c -l YourProject.class 不添加-c指令就不会显示字节码文件: 不添加 -l 就不会显示源代码和字节码文件的对应关系: 添加-l之后多出来这些: IDEA不太…...
加油站(力扣134)
既然每一个加油站都有对应的加油量和耗油量,我们不妨计算一下每个加油站的汽油净增量。如果每个加油站净增量之和不为负数,则说明一定可以找到唯一的起始点。那我们该如何找到这个起始点呢?我们设置最开始的起点为第0个加油站,接着…...
1.vue使用vite构建初始化项目
npm create vuelatest❯ npm create vuelatest> npx > create-vueVue.js - The Progressive JavaScript Framework✔ Project name: … vue3_test ✔ Add TypeScript? … No / Yes ✔ Add JSX Support? … No / Yes ✔ Add Vue Router for Single Page Application dev…...
汽车零部件开发应该具备哪些编程思维?
目录 1、功能安全思维 2、实时性与确定性思维 3、可靠性和冗余思维 4、硬件软件协同思维 5、CAN总线通信思维 6、故障诊断和自诊断思维 7、功耗优化思维 8、软件更新和版本管理思维 9、用户体验与安全性思维 汽车零部件开发中,嵌入式软件在车辆系统中的作用…...
25工程管理研究生复试面试问题汇总 工程管理专业知识问题很全! 工程管理复试全流程攻略 工程管理考研复试真题汇总
工程管理复试面试心里没底?别慌!学姐手把手教你怎么应对复试! 很多同学面对复试总担心踩坑,其实只要避开雷区掌握核心技巧,逆袭上岸完全有可能!这份保姆级指南帮你快速锁定重点,时间紧迫优先背…...
#4【CVPR2024】SHIP:图像融合的一种协同高阶交互范式
📜 Probing Synergistic High-Order Interaction in Infrared and Visible Image Fusion 🍕 源码: https://github.com/zheng980629/SHIP 先前融合规则与我们提出的范式之间的比较。之前的工作要么(a)缺乏明确的交互&a…...
虚拟机从零实现机器人控制
1. 系统安装 因Docker不适合需要图形界面的开发,因此使用虚拟机VMware方便可视化界面方式查看效果,相关软件可以从官网下载,这里有一整套免费安装文件百度网盘地址: 2. ROS安装 Ubuntu 22.04:https://docs.ros.org…...
趣味数学300题1981版-八个等式、五个5等于24
八个等式 分析:此问题的求解思路是按照最后一步运算的运算符号进行分类。示例中最后一步的运算是除法,只要被除数与除数相等且不为0,就可以得到结果1.因此我们还可以对于结果等于1的情况列出其他的算式。如果保持最后一步运算为除法运算&…...
Microsoft Office 2024 软件安装教程(免费)
1.通过百度网盘下载Microsoft Office 2024安装包 下载地址为: https://pan.baidu.com/s/1jk1kvQsKFH9dZGF5xfGgiQ?pwdjbkv 提取码: jbkv 。 2.安装环境 Win10~Win11或更高。 3.安装步骤 (1)下载压缩包,解压缩。 (2…...
Linux 常见指令
linux 常见指令 Alt Enter 全屏 退出全屏 pwd: 显示用户所处路径 ls :显示当前路径下的文件或者目录名称 [ltVM-8-13-centos ~]$ ls 106 [ltVM-8-13-centos ~]$ ls -l ll :显示当前路径下的文件或者目录名称更多属性信息 [ltVM-8-13-cen…...
HTML Application(hta)入门教程
简介 HTA是HTML Application的缩写,又称为HTML应用程序。 hta是一个可执行文件,双击可以直接运行 hta与html非常相似,可直接将文件后缀改为.hta来获得HTA格式的文件。 支持VBS和JavaScript html的权限被限制在网页浏览器内,只有操…...
pytest运行用例的常见方式及参数
标题pytest运行用例方式及参数 用例结构目录 “”" 在最外层目录下执行所有的用例 参数说明: -s:显示用例的打印信息 -v:显示用例执行的详细信息 –alluredir:指定allure报告的路径 –clean-alluredir:清除allure报告的路径 -n:指定并发的进程数 -x:出现一条用…...
XML Schema 元素替换
XML Schema 元素替换 引言 XML(可扩展标记语言)是一种用于存储和传输数据的标记语言。XML Schema 是一种用于定义 XML 文档结构的语言,它描述了 XML 文档的结构、数据类型和约束。在处理 XML 文档时,有时需要对特定的元素进行替换,以满足特定的需求。本文将介绍 XML Sch…...
OpenBMC:BmcWeb app.run
1.监听用户移除signal //src\webserver_run.cpp int run() {...bmcweb::registerUserRemovedSignal();... } //include\user_monitor.hpp inline void onUserRemoved(sdbusplus::message_t& msg) {sdbusplus::message::object_path p;msg.read(p);std::string username …...
hot100_74. 搜索二维矩阵
hot100_74. 搜索二维矩阵 思路 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...
Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...
