什么是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} ARd×r
B ∈ R r × d B \in \mathbb{R}^{r \times d} BRr×d
r ≪ d r \ll d rd(低秩),一般 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 等框架来实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/21790.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeeCode题库第二十八题

28.找出字符串第一个匹配项的下标 项目场景: 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 …

亚马逊AI图像模型Nova深度体验(含源代码)(上)

在本系列的上篇中,我们介绍了如何利用Amazon Nova Canvas进行创意图片内容生成,并使用Amazon Bedrock的InvokeModel API进行文本到图像(文生图)的生成。并且介绍了Nova Canvas提供的广泛的功能,包括图像修复、画布扩展…

【MySQL】第八弹---全面解析数据库表的增删改查操作:从创建到检索、排序与分页

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【MySQL】 目录 1 表的增删改查 1.1 Create 1.1.1 单行数据 全列插入 1.1.2 多行数据 指定列插入 1.1.3 插入否则更新 1.1.4 替…

标量化rknn的输入输出向量转换处理

这是一篇技术探索。yolo11模型生成后,我发现它无法在rknn环境正确识别出目标对象。而在宿主机上,或者直接调用.pt转换过的.onnx模型是可以得到正确结果的。这篇文章对应近乎一天的工作。最终的结论就是。这是一个模型量化的问题,与yolo的版本…

边缘安全加速(Edge Security Acceleration)

边缘安全加速(Edge Security Acceleration,简称ESA)是一种通过将安全功能与网络边缘紧密结合来提升安全性和加速网络流量的技术。ESA的目标是将安全措施部署到接近用户或设备的地方,通常是在网络的边缘,而不是将所有流…

图表控件Aspose.Diagram入门教程:使用 Python 将 VSDX 转换为 PDF

将VSDX转换为PDF可让用户轻松共享图表。PDF 文件保留原始文档的布局和设计。它们广泛用于演示文稿、报告和文档。在这篇博文中,我们将探讨如何在 Python 中将 VSDX 转换为 PDF。 本文涵盖以下主题: Python VSDX 到 PDF 转换器库使用 Python 将 VSDX 转…

两相四线步进电机的步距角为什么是1.8度

机缘 在CSDN查了好多文章,发现都是用公式来解释1.8的步距角(Q=360/MZ),因为转子是50齿,4拍一个循环,所以θ360度/(50x4)1.8度。估计第一次接触步进电机的什么…

Helix——Figure 02发布通用人形机器人控制的VLA:一组神经网络权重下的快与慢双系统,让两个机器人协作干活

前言 过去一周,我花了很大的心思、力气,把deepseek的GRPO、MLA算法的代码解析通透,比如GRPO与PPO的详细对比,再比如MLA中,图片 公式 代码的一一对应 2.20日晚,无意中刷到figure 02发布Helix的一个演示视频…

Unity游戏制作中的C#基础(2)变量与数据类型

1.变量 (1)变量的定义:变量是用于存储数据的容器。 (2)变量的作用:在程序运行过程中,我们可以将各种类型的数据存储在变量中,方便后续使用和操作。 (3)变量…

革新之力:数字科技——重塑未来的超越想象之旅

在21世纪的科技浪潮中,数字科技如同一股不可阻挡的洪流,正以前所未有的速度和广度改变着我们的生活、工作乃至整个社会的结构。它不仅是技术的简单迭代,更是对人类社会认知边界的拓宽,对经济模式、社会治理、文化形态等多方面的深…

python pandas下载

pandas pandas:就是一个可以处理数据的 python 库 核心功能: 数据的清洗:处理丢失值,重复值数据分析:计算和统计信息,或分组汇总数据可视化:结合 图标库(Matplotlib)完成数据可视化…

将Google文档导入WordPress:简单实用的几种方法

Google文档是内容创作者非常实用的写作工具。它支持在线编辑、多人协作,并能够自动保存内容。但当我们想把Google文档中的内容导入WordPress网站时,可能会遇到一些小麻烦,比如格式错乱、图片丢失等问题。本文将为大家介绍几种简单实用的方法&…

java面试场景问题

还在补充,这几天工作忙,闲了会把答案附上去,也欢迎各位大佬评论区讨论 1.不用分布式锁如何防重复提交 方法 1:基于唯一请求 ID(幂等 Token) 思路:前端生成 一个唯一的 requestId(…

【笔记ing】C语言补充、组成原理数据表示与汇编实战、操作系统文件实战(高级阶段)

【第19节 C语言语法进阶】 【19.1 条件运算符与逗号运算符】 1 条件运算符 条件运算符是C语言中唯一的一种三亩运算符。三目运算符代表有三个操作数;双目运算符代表有两个操作数,如逻辑运算符就是双目运算符;弹幕运算符代表有一个操作数&a…

GAMES101-现代计算机图形学入门笔记

主讲老师:闫令琪,此处仅做个人笔记使用。如果我的分享对你有帮助,请记得点赞关注不迷路。 课程链接如下:GAMES101-现代计算机图形学入门-闫令琪_哔哩哔哩_bilibili 课程分为四部分:光栅化、几何、光线追踪、模拟 图形…

激光工控机在自动化生产线中有什么关键作用?

激光工控机作为自动化生产线的核心设备,通过高精度控制、快速响应和智能化集成,在提升效率、保障质量、实现柔性制造等方面发挥着不可替代的作用。以下是其关键作用的具体分析: 一、实现高效连续生产: 1.高速加工能力&#xff1…

高等数学(上)题型笔记(六)定积分的应用

目录 1 三角函数定积分的结论 2 定积分的微元法(元素法) 2.1 使用条件 2.2 使用步骤 3 定积分的几何应用 3.1 平面图形的面积 3.1.1 直角坐标系的情形 3.1.1.1 X型 3.1.1.2 Y型 3.1.1.3 双型 3.1.1.4 复合:分割型 3.1.1.5 引入参…

QT项目——天气预报

文章目录 前言一、项目介绍二、项目基础知识1. 软件开发网络通信架构1.1 CS架构 / BS架构1.1.1 CS架构(客户端-服务器架构)1.1.2 BS架构(浏览器-服务器架构) 1.2 HTTP 基本概念 2. QT 下 HTTP 编程2.1 类的解析2.2 示例程序 3. JS…

最优化方法-牛顿法

牛顿法 泰勒级数 泰勒级数展开 $$ \begin{aligned} f(x)&\lim\limits_{n\rightarrow \infin}\sum\limits_{i1}n\frac{1}{n!}f{(n)}(x_0)(x-x_0)^n\ &f(x_0)f’(x_0)(x-x_0)\frac{f’(x_0)}{2!}(x-x_0)2\cdots\frac{1}{n!}fn(x_0)(x-x_0)^n\ &\quad~ O\left[(x-x_…

论文笔记(七十二)Reward Centering(二)

Reward Centering(二) 文章概括摘要2 简单的奖励中心 文章概括 引用: article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan, Yi and Tomar, Manan and Sutton, Richard S},journal{arXiv preprint arXiv:2405.0…