【大模型基础_毛玉仁】4.4 低秩适配方法


目录

    • 4.4 低秩适配方法
      • 4.4.1 LoRA
        • 1)方法实现
        • 2)参数效率
      • 4.4.2 LoRA 变体
        • 1)打破低秩瓶颈(例ReLoRA)
        • 2)动态秩分配(例AdaLoRA)
        • 3)训练过程优化(例DoRA)
      • 4.4.3 基于 LoRA 插件的任务泛化


4.4 低秩适配方法

低维固有维度假设表明:过参数化模型的固有维度是很低的;换言之,存在可以与全参数更新媲美的低维的参数更新。低秩适配方法Lowrank Adaptation Methods)基于此假设,通过低秩矩阵近似原始权重更新矩阵,仅微调低秩矩阵以降低参数量。

下面将介绍经典低秩适配方法LoRA的实现细节与参数效率、其变体以及基于LoRA插件化特性和任务泛化能力。

.

4.4.1 LoRA

低秩适配Low-rank Adaptation, LoRA:

  • 提出利用低秩矩阵近似参数更新矩阵来实现低秩适配。

  • 该方法将参数更新矩阵低秩分解为两个小矩阵。在微调时, 通过微调这两个小矩阵来对大语言模型进行更新,大幅节省了微调时的内存开销。

图 4.8: LoRA 示意图
在这里插入图片描述

.

1)方法实现

(1)核心思想

给定一个密集神经网络层,其参数矩阵为 W 0 ∈ R d × k W_0 \in \mathbb{R}^{d \times k} W0Rd×k,为适配下游任务,我们通常要学习参数更新矩阵 ∆ W ∈ R d × k ∆W ∈ R^{d×k} WRd×k,对原始参数矩阵进行更新:

W = W 0 + ∆ W W = W_0 + ∆W W=W0+W

对全量微调,∆W 是需对该层所有 d × k 个参数计算梯度,这常需要大量 GPU 内存,成本高昂。

为解决这一问题,如图 4.8,LoRA 将 ∆W 分解为两个低参数量的矩阵 B ∈ R d × r B ∈ R^{d×r} BRd×r A ∈ R r × k A ∈ R^{r×k} ARr×k,使得更新过程变为:

W = W 0 + α B A W = W_0 + αBA W=W0+αBA

其中,

  • 秩 r ≪ min{d, k},

  • B 和 A 分别用随机高斯分布和零进行初始化,

  • α 是缩放因子,用于控制 LoRA 权重的大小。

在训练过程中,固定预训练模型的参数,仅微 调 B 和 A 的参数。因此,在训练时,LoRA 涉及的更新参数数量为 r × (d + k),远 小于全量微调 d × k。

(2)应用场景
在基于 Transformer 的大语言模型中,密集层主要分为注意力模块的投影层和 FFN 模块的投影层。最初,LoRA 被应用于注意力层的权重矩阵。后续研究表明,将其应用于 FFN 层也能进一步提升模型性能。

(3)LoRA特性

LoRA仅微调低秩参数,参数效率高且不增加推理延迟。其低秩矩阵可扩展为低秩张量或与Kronecker分解结合以进一步提高参数效率。LoRA具有可插拔性,能封装为可共享和重复使用的插件。多个任务的LoRA插件可组合,以实现良好的跨任务泛化性能。

.

2)参数效率

(1)案例:

在 LLaMA2-7B 中微调第一个 FFN 层的权重矩阵为例。

  • 全量微调:调整参数总量为 11,008 × 4,096 = 45,088,768

  • LoRA微调(r=4):参数量仅需 (11,008 × 4) + (4 × 4,096) = 60,416

  • 效率对比:LoRA参数量 不到全量微调的千分之一(≈0.13%)

(2)微调的内存使用:

具体来说,模型微调的内存使用主要涉及四个部分:

  • 权重内存(Weight Memory):用于存储模型权重所需的内存;

  • 激活内存(Activation Memory):前向传播内存时中间激活带来的显存占用, 主要取决于 batch size 大小以及序列长度等;

  • 梯度内存(Gradient Memory):在反向传播期间需要用来保存梯度的内存,这些梯度仅针对可训练参数进行计算;

  • 优化器内存(Optimization Memory):用于保存优化器状态的内部存在。例如,Adam 优化器会保存可训练参数的 “一阶动量” 和 “二阶动量”。

(3)显存与速度对比

基于《Rui Pan et al. “LISA: Layerwise Importance Sampling for Memory-Efficient Large Language Model Fine-Tuning”. In: arXiv preprint arXiv.2403.17919 (2024).》文献中的实验,数据如下:

  • 硬件条件:NVIDIA RTX4090(24GB显存),批量大小=1
微调方式显存占用优化器内存梯度内存速度
全量微调60GB(溢出)--基准速度
LoRA微调23GB↓25GB↓14GB↑1.9倍

由于LoRA 的可训练参数少,使得优化器内存和梯度内存分别减少约 25GB 和 14GB。

虽然其引入的额外“增量参数”导致激活内存和权重内存略微增加(总计约 2GB),但整体内存减少的优势更明显。

此外,LoRA 减少了参数计算,加速了反向传播,速度比全量微调提高了 1.9 倍。

.

4.4.2 LoRA 变体

LoRA在复杂下游任务上(如一些数学推理)与全量微调有性能差距,为弥补差距,LoRA变体方法从以下三方面改进:一是打破低秩瓶颈,二是动态秩分配,三是训练过程优化。

1)打破低秩瓶颈(例ReLoRA)

LoRA的低秩更新特性使其在参数效率上表现出色,但这也限制了大规模语言模型记忆新知识和适应下游任务的能力,即存在低秩瓶颈

Biderman等人的研究表明,全量微调的秩显著高于LoRA的秩(10-100倍),增加LoRA的秩可以缩小与全量微调之间的性能差距。为解决这一问题,一些方法被提出以打破低秩瓶颈。

例如,ReLoRA:

通过周期性地将LoRA模块合并到大语言模型并重新初始化,允许模型在保持总参数量不变的情况下,通过多次低秩更新累积成高秩状态,提升性能接近全秩训练。具体步骤包括:

  • 合并:按照公式 W i ← W i + α B i A i W^i \leftarrow W^i + \alpha B^i A^i WiWi+αBiAi 将LoRA模块合并到原始权重矩阵。

  • 重置:将 B i B^i Bi 用特定方法(如Kaiming初始化)重新初始化, A i A^i Ai 设置为零。

  • 优化器状态处理:通过幅度剪枝对优化器状态进行部分重置,防止模型性能发散。

.

2)动态秩分配(例AdaLoRA)

LoRA的秩并非越高越好,过高的秩可能导致性能和效率下降。由于Transformer模型中不同层的权重重要性存在差异,因此需要为每个层分配不同的秩。

AdaLoRA:

  • 通过将参数更新矩阵参数化为奇异值分解SVD)的形式,

  • 再通过奇异值剪枝动态调整不同层中LoRA模块的秩。

具体来说,AdaLoRA使用SVD重新表示∆W,即:

W = W 0 + ∆ W = W 0 + P Λ Q W=W0+∆W=W0+PΛQ W=W0+W=W0+PΛQ

其中P和Q是正交的,Λ是对角矩阵,其中包含 {λi}1≤i≤r 的奇异值。训练时,W0的参数固定,仅更新P、Λ和Q的参数。根据梯度权重乘积大小的移动平均值构造奇异值的重要性得分,对不重要的奇异值进行迭代剪枝。

此外,为了增强稳定训练性,AdaLoRA 引入一个额外的惩罚项确保 P 和 Q 之间的正交性:

R ( P , Q ) = ∣ ∣ P T P − I ∣ ∣ F 2 + ∣ ∣ Q Q T − I ∣ ∣ F 2 R(P, Q) = ||P^TP − I||^2_F + ||QQ^T − I||^2_F R(P,Q)=∣∣PTPIF2+∣∣QQTIF2

其中,I 是单位矩阵, ∣ ∣ ⋅ ∣ ∣ F || · ||_F ∣∣F 代表 Frobenius 范数。

.

3)训练过程优化(例DoRA)

LoRA在实际微调中存在收敛速度慢、对超参数敏感及易过拟合的问题,影响了其效率和下游适配性能,为此,有工作尝试优化LoRA训练过程。

DoRA 方法:

DoRA 方法通过约束梯度更新,侧重于更新参数的方向变化,将预训练权重 W 0 ∈ R d × k W_0 \in \mathbb{R}^{d \times k} W0Rd×k 分解为方向和大小两个组件,并仅将 LoRA 应用于方向组件以增强训练稳定性。具体表示为:

W 0 = m V ∥ V ∥ c = ∥ W 0 ∥ c W 0 ∥ W 0 ∥ c W_0 = m \frac{V}{\|V\|_c} = \|W_0\|_c \frac{W_0}{\|W_0\|_c} W0=mVcV=W0cW0cW0

其中, m ∈ R 1 × k m \in \mathbb{R}^{1 \times k} mR1×k 是大小向量, V ∈ R d × k V \in \mathbb{R}^{d \times k} VRd×k 是方向矩阵, ∥ ⋅ ∥ c \|\cdot\|_c c 是矩阵在每一列上的向量范数。

DoRA 仅对方向矩阵 V 施加 LoRA 进行参数化,定义为:

W ′ = m V + Δ V ∥ V + Δ V ∥ c = m W 0 + B A ∥ W 0 + B A ∥ c W' = m \frac{V + \Delta V}{\|V + \Delta V\|_c} = m \frac{W_0 + BA}{\|W_0 + BA\|_c} W=mV+ΔVcV+ΔV=mW0+BAcW0+BA

其中, Δ V \Delta V ΔV 是由 LoRA 学习的增量方向更新,m、 Δ V \Delta V ΔV 、BA 是可训练参数。

.

4.4.3 基于 LoRA 插件的任务泛化

LoRA 微调后,可将更新模块 B 和 A 分离并封装成即插即用、不破坏原始模型的参数插件,便于在不同任务上训练、保存、共享和使用。还能组合多任务的 LoRA 插件,迁移到新任务。

图 4.9: LoRAHub 示意图
在这里插入图片描述

LoRAHub 提供组合方法框架,包括组合阶段适应阶段

  • 组合阶段:通过逐元素线性加权把已学习的 LoRA 模块组合成单一模块;

m ^ = ( w 1 A 1 + w 2 A 2 + ⋯ + w N A N ) ( w 1 B 1 + w 2 B 2 + ⋯ + w N B N ) \hat{m} = \left(w_1 A_1 + w_2 A_2 + \cdots + w_N A_N\right)\left(w_1 B_1 + w_2 B_2 + \cdots + w_N B_N\right) m^=(w1A1+w2A2++wNAN)(w1B1+w2B2++wNBN)

  • 适应阶段:用无梯度方法 Shiwa 自适应学习权重组合,经 k 次迭代找到最优组合,适应新任务。

.


其他参考:【大模型基础_毛玉仁】系列文章


声明:资源可能存在第三方来源,若有侵权请联系删除!

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

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

相关文章

融合YOLO11与行为树的人机协作智能框架:动态工效学优化与自适应安全决策

人工智能技术要真正发挥其价值,必须与生产生活深度融合,为产业发展和人类生活带来实际效益。近年来,基于深度学习的机器视觉技术在工业自动化领域取得了显著进展,其中YOLO(You Only Look Once)算法作为一种…

Java为什么要使用线程池?

前言1.对线程的管理更加的规范化2.降低创建线程和销毁线程的开销 前言 之前对于Java线程池的理解,一直停留在:对于Java中的多线程机制来说,如果不使用线程池的话,线程的使用就会变得杂乱无章。这一步。一直没有深入去理解为什么其…

告别分库分表,时序数据库 TDengine 解锁燃气监控新可能

达成效果: 从 MySQL 迁移至 TDengine 后,设备数据自动分片,运维更简单。 列式存储可减少 50% 的存储占用,单服务器即可支撑全量业务。 毫秒级漏气报警响应时间控制在 500ms 以内,提升应急管理效率。 新架构支持未来…

TDengine 3.3.2.0 集群报错 Post “http://buildkitsandbox:6041/rest/sql“

原因: 初始化时处于内网环境下,Post “http://buildkitsandbox:6041/rest/sql“ 无法访问 修复: vi /etc/hosts将buildkitsandbox映射为本机节点 外网环境下初始化时没有该问题

【Linux】POSIX信号量与基于环形队列的生产消费者模型

目录 一、POSIX信号量: 接口: 二、基于环形队列的生产消费者模型 环形队列: 单生产单消费实现代码: RingQueue.hpp: main.cc: 多生产多消费实现代码: RingQueue.hpp: main.…

【13】Ajax爬取案例实战

目录 一、准备工作 二、爬取目标 三、初步探索:如何判断网页是经js渲染过的? 四、爬取列表页 4.1 分析Ajax接口逻辑 4.2 观察响应的数据 4.3 代码实现 (1)导入库 (2)定义一个通用的爬取方法…

嵌入式八股RTOS与Linux---网络系统篇

前言 关于计网的什么TCP三次握手 几层模型啊TCP报文啥的不在这里讲,会单独分成一个计算机网络模块   这里主要介绍介绍lwip和socket FreeRTOS下的网络接口–移植LWIP 实际上FreeRTOS并不自带网络接口,我们一般会通过移植lwip协议栈让FreeRTOS可以通过网络接口收发数据,具体可…

全分辨率免ROOT懒人精灵-自动化编程思维-设计思路-实战训练

全分辨率免ROOT懒人精灵-自动化编程思维-设计思路-实战训练 1.2025新版懒人精灵-实战红果搜索关键词刷视频:https://www.bilibili.com/video/BV1eK9kY7EWV 2.懒人精灵-全分辨率节点识别(红果看广告领金币小实战):https://www.bili…

【更新中】【React】基础版React + Redux实现教程(Vite + React + Redux + TypeScript)

本项目是一个在react中,使用 redux 管理状态的基础版实现教程,用简单的案例练习redux的使用,旨在帮助学习 redux 的状态管理机制,包括 store、action、reducer、dispatch 等核心概念。 项目地址:https://github.com/Yv…

【MySQL】从零开始:掌握MySQL数据库的核心概念(四)

人们之所以不愿改变,是因为害怕未知。但历史唯一不变的事实,就是一切都会改变。 前言 这是我自己学习mysql数据库的第四篇博客总结。后期我会继续把mysql数据库学习笔记开源至博客上。 上一期笔记是关于mysql数据库的表格约束,没看的同学可以…

AP 场景架构设计(一) :OceanBase 读写分离策略解析

说明:本文内容对应的是 OceanBase 社区版,架构部分不涉及企业版的仲裁副本功能。OceanBase社区版和企业版的能力区别详见: 官网链接。 概述​ 当两种类型的业务共同运行在同一个数据库集群上时,这对数据库的配置等条件提出了较高…

CPU架构和微架构

CPU架构(CPU Architecture) CPU架构是指处理器的整体设计框架,定义了处理器的指令集、寄存器、内存管理方式等。它是处理器设计的顶层规范,决定了软件如何与硬件交互。 主要特点: 指令集架构(ISA, Instr…

6.4 模拟专题:LeetCode1419.数青蛙

1.题目链接:数青蛙 - LeetCode 2.题目描述 给定一个字符串 croakOfFrogs,表示青蛙的鸣叫声序列。每个青蛙必须按顺序发出完整的 “croak” 字符,且多只青蛙可以同时鸣叫。要求计算最少需要多少只青蛙才能完成该字符串,若无法完成…

Linux 搭建dns主域解析,和反向解析

#!/bin/bash # DNS主域名服务 # user li 20250325# 检查当前用户是否为root用户 # 因为配置DNS服务通常需要较高的权限,只有root用户才能进行一些关键操作 if [ "$USER" ! "root" ]; then# 如果不是root用户,输出错误信息echo "…

Leetcode 二进制求和

java solution class Solution {public String addBinary(String a, String b) {StringBuilder result new StringBuilder();//首先设置2个指针, 从右往左处理int i a.length() - 1;int j b.length() - 1;int carry 0; //设置进位标志位//从2个字符串的末尾向前遍历while(…

【NLP 49、提示工程 prompt engineering】

目录 一、基本介绍 语言模型生成文本的基本特点 提示工程 prompt engineering 提示工程的优势 使用注意事项 ① 安全问题 ② 可信度问题 ③ 时效性与专业性 二、应用场景 能 ≠ 适合 应用场景 —— 百科知识 应用场景 —— 写文案 应用场景 —— 解释 / 编写…

【NLP 43、文本生成任务】

目录 一、生成式任务 二、seq2seq任务 1.模型结构 2.工作原理 3.局限性 三、自回归语言模型训练 Decoder only 四、自回归模型结构:文本生成任务 —— Embedding LSTM 代码示例 🚀 数据文件 代码流程 Ⅰ、模型初始化 Ⅱ、前向计算 代码运行流程 Ⅲ、加载…

vscode 通过Remote-ssh远程连接服务器报错 could not establish connection to ubuntu

vscode 通过Remote-ssh插件远程连接服务器报错 could not establish connection to ubuntu,并且出现下面的错误打印: [21:00:57.307] Log Level: 2 [21:00:57.350] SSH Resolver called for "ssh-remoteubuntu", attempt 1 [21:00:57.359] r…

Linux之编辑器vim命令

vi/vim命令: 终端下编辑文件的首选工具,号称编辑器之神 基本上分为三种模式,分别是 命令模式(command mode)>输入vi的命令和快捷键,默认打开文件的时候的模式插入模式(insert mode&#x…

第一天学爬虫

阅读提示:我今天才开始尝试爬虫,写的不好请见谅。 一、准备工具 requests库:发送HTTP请求并获取网页内容。BeautifulSoup库:解析HTML页面并提取数据。pandas库:保存抓取到的数据到CSV文件中。 二、爬取步骤 发送请求…