大模型基础-简易理解版-LoRA

LoRA(Low-Rank Adaptation) 是一种通过低秩矩阵分解实现参数高效微调的技术。其核心思想是:冻结预训练模型参数,仅通过训练两个低秩矩阵来模拟参数变化量。以下是通俗解释与代码实现:

一、原理图解(3步理解)
1、旁支结构: 在原始模型层(如线性层)旁添加两个小矩阵 A A A(降维)和 B B B(升维),其中秩 r ≪ d r≪d rd(原矩阵维度)。

更新后的权重矩阵可以表示为:

W ′ = W + Δ W = W + A ⋅ B W' = W + \Delta W = W + A⋅ B W=W+ΔW=W+AB

其中, Δ W = A ⋅ B \Delta W = A ⋅ B ΔW=AB是低秩更新矩阵.

2、训练过程: 只更新 A A A B B B ,原始参数 W W W 保持冻结。
3、推理合并: 训练后将 Δ W \Delta W ΔW W W W 合并,不增加推理耗时。
在微调过程中,只训练低秩矩阵 A和B,而冻结原始模型的权重,从而大幅减少计算开销。
在这里插入图片描述
在这里插入图片描述

LoRA大大节省微调大模型的参数量;效果和全量微调差不多;微调完的LoRA模型权重可以Merge回原来的权重,不会改变模型结构,推理时不增加额外计算量;你可以通过改变r参数,最高情况等同于全量微调。

特点
高效性:由于只训练低秩矩阵,参数量大幅减少(通常为原始模型参数的0.1%-1%),计算和存储开销显著降低。
模块化:LoRA的适配模块(低秩矩阵)可以独立于原始模型保存和加载,便于在不同任务之间切换。
兼容性:可以与多种模型架构(如Transformer)和任务(如文本分类、生成、翻译)结合使用。
避免灾难性遗忘:由于原始模型权重被冻结,LoRA在适配新任务时不会破坏预训练模型的通用知识。
可扩展性:可以与其他高效微调方法(如Adapter、Prefix Tuning)结合使用,进一步提升性能。

应用场景:

  • 资源受限的环境:在计算资源有限的情况下高效微调大模型。
  • 多任务学习:通过为不同任务训练独立的低秩矩阵,快速适配多个任务。
  • 持续学习:在保留预训练知识的同时,逐步适配新任务。

二、Pytorch代码实现(以线性层为例)

import torch
import torch.nn as nn

class LoRALinear(nn.Module):
    def __init__(self, in_dim, out_dim, rank=8, alpha=16):
        super().__init__()
        self.rank = rank
        self.scaling = alpha / rank  # 缩放系数
        
        # 原始权重(冻结)
        self.weight = nn.Parameter(torch.randn(out_dim, in_dim), requires_grad=False)
        
        # LoRA矩阵(可训练)
        self.lora_A = nn.Parameter(torch.randn(rank, in_dim))  # 降维矩阵
        self.lora_B = nn.Parameter(torch.zeros(out_dim, rank)) # 升维矩阵(初始化为0)

    def forward(self, x):
        # 原始输出 + LoRA调整项
        original = x @ self.weight.T
        lora_adjust = (x @ self.lora_A.T) @ self.lora_B.T  # 低秩分解
        return original + self.scaling * lora_adjust

关键点:

  • lora_B 初始化为0,确保训练开始时旁路无影响
  • scaling 系数平衡新旧参数权重(通常设为 α / r α/r α/r

三、实战示例(Hugging Face场景)

from transformers import AutoModel
from peft import LoraConfig, get_peft_model

# 加载预训练模型
model = AutoModel.from_pretrained("bert-base-uncased")

# 配置LoRA参数(仅微调注意力层的q_proj和v_proj)
lora_config = LoraConfig(
    r=8, 
    lora_alpha=16,
    target_modules=["query", "value"],  # 指定微调模块
    lora_dropout=0.1,
    bias="none"
)

# 应用LoRA
model = get_peft_model(model, lora_config)
print(f"可训练参数量: {model.print_trainable_parameters()}")
# 输出示例:0.8M/110M (仅0.7%参数被训练)

四、超参数选择建议
在这里插入图片描述
通过这种方式,LoRA能以1-10%的参数量实现接近全参数微调的效果,实际应用中,可结合Hugging Face的 peft 库快速实现适配。

LoRA的核心优势在于参数高效性而非训练高效性:虽然其可训练参数(低秩矩阵A和B)显著减少(例如从175B降至百万级),但在单卡训练时速度提升有限。这是因为整个预训练模型(PLM)仍需参与前向和反向传播计算,梯度计算过程涉及全部模型参数,而不仅仅是旁路的低秩矩阵。
具体来说:

这里是引用

LoRA的梯度计算包括两个步骤:
1、需要计算整个PLM的梯度
2、使用这些梯度来计算注入矩阵的梯度

### LoRa 上位机软件开发教程、工具及指南 #### 1. 开发环境准备 为了顺利进行LoRa上位机软件的开发,需先准备好相应的开发环境。这通常包括安装合适的IDE(集成开发环境)、驱动程序以及必要的库文件。 对于基于Windows系统的用户来说,推荐使用Visual Studio作为主要的开发平台[^2]。此外,还需要下载并安装用于串口通信的第三方库,比如`pySerial`或`Qt Serial Port Module`,以便能够有效地与下位机建立稳定的数据交换通道。 #### 2. 硬件连接设置 确保STM32F103C8T6微控制器已正确连接至计算机,并且通过USB转UART桥接器实现了物理上的通讯链路。具体而言,TXD/RXD管脚应分别对接PC端COM口对应的RX/TX引脚;GND共地处理不可忽视,这是保障可靠信号传递的基础条件之一。 #### 3. 初始化配置界面设计 采用图形化界面(GUI)来简化用户的操作体验是一个不错的选择。可以利用Python中的Tkinter库快速搭建简易的应用窗口,其中包含但不限于以下几个核心功能按钮: - **打开/关闭串口**:允许用户指定目标设备所使用的虚拟串口号及其波特率等参数; - **调整发射参数**:如频段选择、输出功率设定等功能项均可以通过直观滑动条形式呈现给使用者自行调节。 ```python import tkinter as tk from tkinter import ttk class LoraConfigApp(tk.Tk): def __init__(self): super().__init__() self.title('LoRa Configurator') frame = ttk.Frame(self).pack(padx=10, pady=10) # Add widgets here... if __name__ == '__main__': app = LoraConfigApp() app.mainloop() ``` #### 4. 数据收发逻辑实现 当完成上述准备工作之后,则可着手编写具体的业务代码部分——即如何高效地管理来自底层硬件的消息队列,并将其转换成易于理解的形式展示出来。这里涉及到的知识点有异步IO模型的理解运用、JSON/XML格式解析技巧等方面的内容。 例如,在接收到由远程传感器上传的一组温湿度测量数值后,可通过调用预先定义好的函数对其进行解码分析,再进一步绘制趋势图表辅助决策判断过程。 #### 5. 测试验证阶段 最后但同样重要的是进行全面的功能测试工作。一方面要确认整个系统能否按照预期正常运转;另一方面也要注意排查可能存在的潜在风险隐患,从而不断提高产品的健壮性和安全性水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值