LoRA:低秩分解微调与代码

ops/2024/12/13 14:49:55/

在这里插入图片描述
传统的微调,即微调全量参数,就是上面的公式,但是我们可以通过两个矩阵,来模拟这个全量的矩阵,如果原来的W是(N * N)维度,我们可以通过两个(N * R) 和 (R * N)的矩阵矩阵乘,来模拟微调的结果。

方法很简单,直接上代码

1. LoRA层:

import mathclass LoRALayer(torch.nn.Module):def __init__(self, in_dim, out_dim, rank, alpha):super().__init__()self.A = torch.nn.Parameter(torch.empty(in_dim, rank))torch.nn.init.kaiming_uniform_(self.A, a=math.sqrt(5))  # similar to standard weight initializationself.B = torch.nn.Parameter(torch.zeros(rank, out_dim))self.alpha = alphadef forward(self, x):x = self.alpha * (x @ self.A @ self.B)return x

LoRALayer就是LoRA的旁侧连接,包括了两个矩阵A和B,A初始化,但是B是全0矩阵,这保证一开始LoRA对模型没有影响,即输出和原来完全相同。

我们注意到了两个参数,一个是rank,一个是alpha。rank控制了LoRA旁侧连接的秩,这就是LoRA微调参数量较小的原因所在,因为他是由两个小的矩阵构成的。alpha控制LoRA对原来Linear的影响。

2. LoRA替代层

知道了LoRA的原理,现在只需要在模型中加入LoRA即可。但是LoRA要如何加入呢,在模型中加入的话,需要修改前向传播的逻辑才能人为的修改,不难想到另外一种方法,我们直接替代原来的Linear层,用LinearWithLoRA替换,新的层既有原来的Linear,也有LoRA。

class LinearWithLoRA(torch.nn.Module):def __init__(self, linear, rank, alpha):super().__init__()self.linear = linearself.lora = LoRALayer(linear.in_features, linear.out_features, rank, alpha)def forward(self, x):return self.linear(x) + self.lora(x)

3. 冻结原始参数

total_params = sum(p.numel() for p in model.parameters() if p.requires_grad)
print(f"Total trainable parameters before: {total_params:,}")for param in model.parameters():param.requires_grad = Falsetotal_params = sum(p.numel() for p in model.parameters() if p.requires_grad)
print(f"Total trainable parameters after: {total_params:,}")

4. 修改网络

最后,我们只需要遍历网络,得到所有Linear层,并将他们设置为LinearWithLoRA即可。

def replace_linear_with_lora(model, rank, alpha):for name, module in model.named_children():if isinstance(module, torch.nn.Linear):# Replace the Linear layer with LinearWithLoRAsetattr(model, name, LinearWithLoRA(module, rank, alpha))else:# Recursively apply the same function to child modulesreplace_linear_with_lora(module, rank, alpha)

http://www.ppmy.cn/ops/141564.html

相关文章

【docker集群应用】Docker Compose

文章目录 Docker ComposeDocker Compose 文件结构Docker Compose的使用Docker Compose部署安装指南Docker Compose 环境安装YAML 文件格式及编写注意事项Docker Compose 配置常用字段Docker Compose 常用命令Docker Compose 文件结构与实践准备依赖文件编写脚本准备站点网页编写…

Linux rm -rf 删除文件恢复测试

前几天一个北京的朋友给我发信息,让我帮他们推荐一个DBA,我就把曾经的一个前同事给推荐过去了,前同事事后跟我说那边5个人同时面试他,问了很多问题,其中问了一个rm 删除文件如何恢复,他没回答好。我说我记得…

Linux 升级 openssh 方法步骤

目录 一:OpenSSH 介绍二:升级 OpenSSH1、下载源码包2、查看当前安装位置3、上传源码包4、生成Makefile文件5、编译并安装6、重启ssh服务7、检查版本信息 一:OpenSSH 介绍 OpenSSH最初是作为OpenBSD系统项目的一部分而开发的,后面…

CSS系列(10)-- 过渡与动画详解

前端技术探索系列:CSS 过渡与动画详解 ✨ 致读者:探索动态视觉体验 👋 前端开发者们, 今天我们将深入探讨 CSS 过渡与动画,学习如何创建流畅、优雅的动态效果。 过渡效果详解 🚀 基础过渡 /* 过渡基础…

如何创建一个基本的Spring Boot应用程序

以下是一个简单的Spring Boot应用开发代码示例,它展示了如何创建一个基本的Spring Boot应用程序,并实现一个简单的RESTful API服务。 步骤1:创建项目 使用Spring Initializr或您喜欢的IDE(如IntelliJ IDEA或Eclipse)…

STM32F103单片机使用STM32CubeMX创建IAR串口工程

打开stm32cubeMX,选择新建工程 输入单片机型号,在下面选中具体型号,然后点右上角 开始工程 第一步设置 调试接口,否则生成的工程就会下载不到单片机中,使用stlink或者jlink的话,在debug选项中直接选择ser…

畅捷通T-Plus ajaxpro存在SQL注入漏洞

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…

MMSegmentation 0基础入门

本文是看了子豪兄视频以后做的笔记,子豪兄视频,子豪兄笔记 MMSegmentation是语义分割框架,优点是用这一个框架能跑很多模型,且配置统一,一个数据集跑所有算法。 1-标注数据集 这部分看视频即可,重点就是需要转为掩码…