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

LoRA 低秩矩阵实现参数高效的权重更新

LoRA 技术通过巧妙的设计,在保持原始线性层输入输出维度不变的前提下,用低秩矩阵实现参数高效的权重更新。让我用具体例子和图示解释它是如何 “改变维度” 的。

1. 标准线性层的维度变化

先回顾标准线性层 nn.Linear(d_in, d_out) 的工作方式:

  • 输入:形状为 [batch_size, seq_len, d_in] 的张量(例如 [8, 10, 768])。
  • 权重矩阵:形状为 [d_out, d_in](例如 [3072, 768])。
  • 输出:形状为 [batch_size, seq_len, d_out](例如 [8, 10, 3072])。

数学公式

2. LoRA 线性层的维度变化

LoRA 线性层 lora.Linear(d_in, d_out, r=rank) 的核心是:

  • 保留原始权重矩阵 W(冻结不更新)。
  • 添加低秩分解的增量矩阵 

3. 维度变化示例

假设:

  • 输入维度 d_in = 768,输出维度 d_out = 3072(Transformer 中常见的 MLP 扩展)。
  • LoRA 秩参数 r = 8

步骤分解

  1. 原始权重路径: 输入 [batch, seq_len, 768] → 乘以 \(W^T\)(形状 [768, 3072])→ 输出 [batch, seq_len, 3072]

  2. LoRA 增量路径: 输入 [batch, seq_len, 768] →

    • 乘以 A^T(形状 [8, 768])→ 中间结果 [batch, seq_len, 8]
    • 再乘以 B^T形状 [3072, 8])→ 最终增量 [batch, seq_len, 3072]
  3. 合并结果: 原始输出 + LoRA 增量 → 形状仍为 [batch, seq_len, 3072]

4. 为什么这样设计?

LoRA 的核心是用低秩矩阵近似全秩更新,从而大幅减少参数:

关键优势

  • 维度不变:输入输出维度与原始线性层完全一致,不改变模型架构。
  • 计算高效:推理时可将 LoRA 权重合并到 W 中,无需额外计算。

5. 可视化对比

标准线性层:
输入 [768] → [768×3072] → 输出 [3072]LoRA线性层:
输入 [768] ────→ [768×3072](冻结)─────┐↘                    ↓[768×8] → [8×3072] ──→ + → 输出 [3072]

6. 代码验证

以下代码验证 LoRA 线性层的维度变化:

import torch
import torch.nn as nn# 标准线性层
linear = nn.Linear(768, 3072)# 简化的LoRA实现(实际库更复杂)
class LoRALinear(nn.Module):def __init__(self, in_features, out_features, r=8):super().__init__()self.r = r# 原始权重(冻结)self.weight = nn.Parameter(torch.zeros(out_features, in_features), requires_grad=False)# LoRA权重self.A = nn.Parameter(torch.randn(r, in_features) * 0.02)  # [r, d_in]self.B = nn.Parameter(torch.zeros(out_features, r))        # [d_out, r]def forward(self, x):# 原始线性变换out = nn.functional.linear(x, self.weight)# LoRA增量lora_out = nn.functional.linear(x, self.B @ self.A)return out + lora_outlora_linear = LoRALinear(768, 3072, r=8)# 验证维度
x = torch.randn(16, 10, 768)  # [batch, seq_len, d_in]
out_linear = linear(x)
out_lora = lora_linear(x)print(f"标准线性层输出形状: {out_linear.shape}")  # [16, 10, 3072]
print(f"LoRA线性层输出形状: {out_lora.shape}")   # [16, 10, 3072]

总结

LoRA 技术通过引入低秩矩阵(A 和 B)实现权重更新,但不改变输入输出的维度。它通过两次连续的线性变换(先降维到 r,再升维到 d_out,在保持计算效率的同时,用极少的参数实现模型适配。这正是 LoRA 的精妙之处:用低秩近似替代全秩更新,既节省资源,又不牺牲性能。


文章转载自:
http://calumniatory .apjjykv.cn
http://pulka .apjjykv.cn
http://nauseous .apjjykv.cn
http://countertype .apjjykv.cn
http://riverly .apjjykv.cn
http://trisubstituted .apjjykv.cn
http://laminated .apjjykv.cn
http://maven .apjjykv.cn
http://authentically .apjjykv.cn
http://philistine .apjjykv.cn
http://headlamp .apjjykv.cn
http://walpurgisnacht .apjjykv.cn
http://sulfapyridine .apjjykv.cn
http://transfiguration .apjjykv.cn
http://malthusian .apjjykv.cn
http://jornada .apjjykv.cn
http://agapanthus .apjjykv.cn
http://tangun .apjjykv.cn
http://rif .apjjykv.cn
http://antideuteron .apjjykv.cn
http://incontinuous .apjjykv.cn
http://oofy .apjjykv.cn
http://neurula .apjjykv.cn
http://exaltation .apjjykv.cn
http://mercer .apjjykv.cn
http://cryophorus .apjjykv.cn
http://perimeter .apjjykv.cn
http://poeticize .apjjykv.cn
http://clothesprop .apjjykv.cn
http://recklessly .apjjykv.cn
http://www.dtcms.com/a/293960.html

相关文章:

  • 2025 ACT 汽车功能安全相关PPT分享
  • 《计算机网络》实验报告七 HTTP协议分析与测量
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题汇总版,持续更新学习,加油!!!
  • 场效应管和模电的关于、学习
  • 【盘古100Pro+开发板实验例程】FPGA | Modelsim 的使用和 do 文件编写
  • SpringBoot 使用Rabbitmq
  • rust嵌入式开发零基础入门教程(一)
  • FSHNet:高效目标检测新突破
  • rust嵌入式开发零基础入门教程(五)
  • Python应用指南:构建和获取全球地铁线路数据及可视化
  • HarmonyOS学习记录5
  • 【形态学变换】——图像预处理(OpenCV)
  • (nice!!!)(LeetCode 每日一题) 1717. 删除子字符串的最大得分 (贪心)
  • 昨天去看了电科金仓的发布会,有点东西!
  • AI营销核心技术解析:运作机制与行业应用实例
  • 【软件系统架构】系列七:嵌入式系统性能深入解析
  • 华为云中,列表中的镜像无法删除可能由多种原因导致
  • 华为云开发者空间 × DeepSeek-R1 智能融合测评:云端开发与AI客服的协同进化
  • WPF的一些基础知识学习记录
  • 设计模式 八:原型模式 (Prototype Pattern)
  • Spring Boot全局异常处理:一网打尽Controller层异常,@RestControllerAdvice解析
  • 设计模式(单例)
  • 界面组件DevExpress WPF中文教程:Grid - 如何过滤节点?
  • Linux下SVN常用指令
  • 设计模式代码总结
  • Android MediaCodec 的使用和源码实现分析
  • 路由器与交换机的区别
  • 从入门到精通:Windows右键菜单管理全解析
  • 为什么 Linux 启动后还能升级内核?
  • Jmeter的函数助手使用