1. 核心思想

LoRA 是一种参数高效的微调方法,旨在减少微调大型语言模型 (LLMs) 所需的计算资源和存储空间。其核心思想是:

  • 冻结预训练模型权重: 在微调过程中,保持预训练 LLM 的原始权重不变。
  • 引入低秩矩阵: 对于 LLM 中的某些层(通常是 Transformer 层的 Query/Key/Value 投影矩阵),引入一对小型的低秩矩阵 A 和 B。
  • 仅训练新增参数: 只训练这些新增的低秩矩阵 A 和 B,而原始预训练权重保持不变。

即只训练新增低秩矩阵的参数,该低秩矩阵带来的参数量远小于整体的参数量,为何采用秩这个概念:
矩阵的秩(rank)本质上是反映了矩阵的“信息量”或“独立性”的概念,在 LoRA 中,秩控制了分解矩阵的“复杂度”或“容量”。如果秩太低,分解后的矩阵可能无法捕捉到足够的特征,从而影响模型的性能;如果秩太高,参数量可能无法大幅度减少。因此选择一个合适的秩同样重要

来源LoRA 论文
来源于 LoRA论文

2. 原理详解

  • 线性层的秩分解: LLM 中的线性层可以表示为矩阵乘法:y = Wx,其中 W 是预训练的权重矩阵。

  • LoRA 的修改:

    LoRA 在此基础上增加了一个并行路径:

    y = Wx + BAx
    
    • A 是一个形状为 (r, in_features) 的矩阵,其中 r 是秩。
    • B 是一个形状为 (out_features, r) 的矩阵。
    • r 通常远小于 in_featuresout_features,因此 BA 是一个低秩矩阵。
  • 训练过程: 在微调过程中,W 被冻结,只有 A 和 B 被训练。

  • 推理过程: 可以选择将 BA 和 W 合并,也可以分开计算。

注意:与全参数微调相比,LoRA 的性能可能略有下降,尤其是在需要模型进行较大改变的任务上

import torch
import torch.nn as nnclass LoRALinear(nn.Module):def __init__(self, linear_layer, r: int):super().__init__()self.linear = linear_layerself.r = rself.lora_A = nn.Parameter(torch.randn(r, linear_layer.in_features))self.lora_B = nn.Parameter(torch.zeros(linear_layer.out_features, r))self.scaling = linear_layer.out_features / rnn.init.kaiming_uniform_(self.lora_A, a=5**0.5)self.weight = None # For merged weightsdef forward(self, x: torch.Tensor):if self.weight is not None:return F.linear(x, self.weight, self.linear.bias)else:return self.linear(x) + (x @ self.lora_A.T @ self.lora_B.T) * self.scalingdef merge(self):if self.weight is None:self.weight = self.linear.weight + self.lora_B @ self.lora_A

在具体实现中存在一个缩放系数scaling,缩放系数用于调节低秩分解后的参数在微调过程中的影响力。在 LoRA 中,模型的权重 W 被低秩分解为两个矩阵 AB,并在模型的训练过程中对这些矩阵进行微调。缩放系数用于控制这些低秩矩阵对最终模型输出的影响力。

在使用的经验中,缩放系数通常设置为秩的 2 倍表现性能最优

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

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

相关文章

软件范式正在经历第三次革命

核心主题:软件范式正在经历第三次根本性革命(软件3.0),其核心是“智能体”(Agent),未来十年将是“智能体的十年”。 逻辑模块解析: 软件的三次重生革命 软件1.0: 传统编…

JavaScript 变量与运算符全面解析:从基础到高级应用

昨天学长说可以放缓一下学习进度,刚好最近期末复习也不是很紧张,所以来重新复习一下js的一些知识点。 一:变量 (1)变量声明 来简单看一下变量的一些知识点。首先是变量声明:变量声明尽量使用数组字母下划线 来举几个例子&#x…

移动语义对性能优化的具体示例

前言 本文章对比了&#xff1a;小中大字符串在普通传值、传值移动、传左值引用、传右值引用、模板完美转发、内联版本等多种测试&#xff0c;对比各个方式的性能优异&#xff1a; 测试代码1 #include <iostream> #include <string> #include <chrono> #incl…

C/C++ 和 OpenCV 来制作一个能与人对弈的实体棋盘机器人

项目核心架构 整个系统可以分为四个主要模块&#xff1a; 视觉感知模块 (Vision Perception Module): 任务: 使用摄像头“看懂”棋盘。工具: C, OpenCV。功能: 校准摄像头、检测棋盘边界、进行透视变换、分割 64 个棋盘格、识别每个格子上的棋子、检测人类玩家的走法。 决策模…

SpringBoot扩展——日志管理!

Spring Boot扩展 在Spring Boot中可以集成第三方的框架如MyBatis、MyBatis-Plus和RabbitMQ等统称为扩展。每一个扩展会封装成一个集成&#xff0c;即Spring Boot的starter&#xff08;依赖组件&#xff09;。starter是一种非常重要的机制&#xff0c;不需要烦琐的配置&#xf…

【JSON-To-Video】AI智能体开发:为视频图片元素添加动效(滑入、旋转、滑出),附代码

各位朋友们&#xff0c;大家好&#xff01; 今天要教大家如何在 JSON - To - Video 中为视频内图片元素添加滑入、旋转、滑出的动效。 如果您还不会封装制作自己的【视频工具插件】&#xff0c;欢迎查看之前的教程&#xff01; AI智能体平台&#xff0c;如何封装自定义短视频…

Spring Boot(九十二):Spring Boot实现连接不上数据库就重启服务

场景: 在线上部署时,若服务器因断电等原因意外重启,项目及其依赖的数据库服务通常需要配置为自动启动。此时,如果数据库服务启动较慢或失败,Spring Boot 项目会因无法建立数据库连接而启动失败。 需求: 为确保项目启动成功,需要让 Spring Boot 项目等待数据库服务完全就…

Debian配置Redis主从、哨兵

前言 Redis的下载安装可参考Centos安装配置Redis6.x&#xff0c;Centos和Debian的步骤基本类似&#xff0c;或自行在网上搜索相关资料 注意&#xff1a;远程连接需放开相应端口 主从 搭建一个一主二从的主从模式 处理conf文件 #进入redis所在目录 cd /tools/redis/redis6 …

虚实交融:数字孪生如何重塑交通与公路勘察设计的未来

当每一条道路、每一座桥梁、每一盏信号灯都在数字世界获得“永生副本”&#xff0c;交通系统从被动响应迈入主动预演的纪元 一、数字孪生的核心定义&#xff1a;超越镜像的动态认知引擎 数字孪生&#xff08;Digital Twin&#xff09;并非简单的三维可视化模型&#xff0c;而是…

vector模拟实现中的迭代器失效问题

首先来看一组代码&#xff1a; iterator insert(iterator pos, const T& x) {// 扩容if (_finish _end_of_storage){size_t len pos - _stare;reserve(capacity() 0 ? 4 : capacity() * 2);pos _stare len;}iterator end _finish - 1;while (end > pos){*(end…

java 设计模式_行为型_22模板模式

22.模板模式 模板方法&#xff08;Template Method&#xff09;作为Java的设计模式之一&#xff0c;一个词概括其优势特点那就是&#xff1a;抽象步骤 首先我们应该抽出共通的东西做一个父类&#xff08;Base类&#xff09;&#xff0c;其次具体的蛋糕制作由子类进一步实现&…

随记:在springboot中websocket的使用

我现在有两种方法 第一种&#xff1a;使用java封装的这个包下的javax.websocket.* 先配置这个配置类 import com.alibaba.nacos.common.utils.CollectionUtils; import org.springframework.stereotype.Component;import javax.websocket.HandshakeResponse; import javax.w…

技术文章大纲:SpringBoot自动化部署实战

技术文章大纲&#xff1a;SpringBoot自动化部署实战 概述 自动化部署的背景与意义SpringBoot在现代化部署中的优势常见自动化部署工具与方案概览&#xff08;Jenkins、Docker、K8s等&#xff09; 环境准备 基础工具要求&#xff1a;JDK、Maven/Gradle、Git服务器环境配置&a…

FastAdmin按钮类功能全解析 class 属性定义不同的交互行为

在 FastAdmin 中&#xff0c;超链接的 class 属性用于定义不同的交互行为和样式。以下是常见 class 配置的用途和区别&#xff1a; btn-dialog 用于触发弹出对话框行为。点击带有此 class 的链接或按钮时&#xff0c;FastAdmin 会自动加载指定的 URL 内容并在模态框中显示。通…

python3字典对象实现解析

文章目录 前言Raymond的方案字典结构字典创建字典插入插入空字典PyDictKeysObject的创建设置索引存储entry 插入非空字典调整大小字典查找联合字典插入 字典查询字典删除 前言 本来以为python字典的实现就是一个哈希表的普通实现&#xff0c;所以在学习基本类型时没去仔细研究…

Word2Vec介绍

前言 当今的大语言模型非常智能&#xff0c;但是你有没有想过这些事情&#xff1a; 机器是怎么理解“国王”和“王后”之间的关系&#xff1f; “猫”和“狗”是怎么在 AI 中“相似以及区分”的&#xff1f; 文本又是怎么变成模型能读懂的数字&#xff1f; 这一切&#xf…

Rsync+sersync实现数据实时同步(小白的“升级打怪”成长之路)

目录 一、rsync部署 push推数据 1、编写rsync配置文件 2、备份测试 3、检验结果 二、rsyncsersync 实现数据实时同步 1、安装sersync服务 2、检验结果 pull拉取数据 1、编写rsync配置文件 2、检验结果 三、脚本编写 1、客户端脚本编写 2、服务器脚本编写 一、rsy…

用 python 开发一个可调用工具的 AI Agent,实现电脑配置专业评价

在人工智能时代&#xff0c;AI Agent凭借其强大的任务处理能力&#xff0c;逐渐成为开发人员手中的得力工具。今天&#xff0c;我们就来一起动手&#xff0c;用Python打造一个能够调用工具的AI Agent&#xff0c;实现根据电脑信息对电脑配置进行专业评价的功能。 一、项目创建…

WSL 安装使用和常用命令

参考官方使用说明&#xff1a; https://learn.microsoft.com/zh-cn/windows/wsl/ 安装wsl: wsl --install --no-distribution --no-distribution&#xff1a;安装 WSL 时不要安装分发版 更新 wsl: wsl --update 设置wsl 默认版本&#xff1a; wsl --set-default-version <…

720全景VR拍摄制作实战教程

720全景VR拍摄制作实战教程 720全景VR拍摄制作是近年来兴起的一种沉浸式影像制作技术。它通过多角度拍摄&#xff0c;并将画面拼接成一个全景视角&#xff0c;使观众获得身临其境的观看体验。本教程将带你从准备阶段到拍摄阶段&#xff0c;再到后期处理阶段&#xff0c;一步步…