首页 > 其他分享 >自学资料 - LoRA - 低秩微调技术

自学资料 - LoRA - 低秩微调技术

时间:2025-01-05 15:31:47浏览次数:3  
标签:dim 微调 矩阵 参数 output input 自学 LoRA

目录

全称:Low-Rank Adaptation
在这里插入图片描述

微调的不同类别

1. 微调分类

  • 微调主要分为三类:
    • 一种是全参数的微调(类别1)。缺点,如果利用一些较好的优化算法,梯度更新和之前所有的梯度(有历史记忆)都有关啥的会导致占用较多的显存。
    • 一种是部分参数微调(可能有部分冻结):但是仍然存在需要大量数据调整的问题。
    • Lora算法,原始参数不变,增加参数矩阵来弥补原始参数和目标参数的差距。

2. LoRA算法

  • LoRA算法
    在这里插入图片描述
LoRA 微调算法 - 初始示意图
  • 算法过程:对于原先的参数不改变,通过右边添加一个参数矩阵来进行微调,也就是利用新的参数矩阵来微调拟合新领域的参数和初始参数的差距。也就是ΔW。

理论:预训练大型语言模型在适应新任务时具有较低的“内在维度” , 所以当对于一个预训练模型来说,原先的参数是有非常多的冗余的,因此我们可以利用低维空间(也就是降维)去表示目标参数和原先参数之间的距离。因此ΔW是相对W来说维度非常小的,减少了非常多的参数量。
在这里插入图片描述

LoRA参数微调具体表现
  • 因为要保证输入和输出的维度和原本的参数W一样,所以一般参数输入的维度还是相同的,但是中间的维度小很多,从而达到减少参数量的结果。比如原本是100x100的参数量,现在变为100x5(r)x2,减少了10倍。
    • 其中r就是低秩的那个秩数。可以自定义。
# 表示 LoRA 的一种简单示意代码 (伪代码)

# 定义输入和输出维度,例如是预训练模型的隐藏层大小和层的输出大小
input_dim = 768  # 输入维度,例如预训练模型的隐藏层大小
output_dim = 768  # 输出维度,例如该层的输出大小

# 定义低秩适配的秩(rank)
rank = 8  # 低秩矩阵的秩 r,用于 LoRA 的低秩适配

# 从预训练网络中加载的权重矩阵,形状为 input_dim x output_dim
W = ...  # 预训练网络中的权重矩阵

# 定义 LoRA 的 A 和 B 权重矩阵
W_A = nn.Parameter(torch.empty(input_dim, rank))  # LoRA 的权重矩阵 A,形状为 input_dim x rank
W_B = nn.Parameter(torch.empty(rank, output_dim))  # LoRA 的权重矩阵 B,形状为 rank x output_dim

# 初始化 LoRA 的权重矩阵
nn.init.kaiming_uniform_(W_A, a=math.sqrt(5))  # 使用 Kaiming 均匀分布初始化矩阵 A
nn.init.zeros_(W_B)  # 将矩阵 B 初始化为零

# 定义常规的矩阵乘法前向传播函数
def regular_forward_matmul(x, W):
    """
    常规的矩阵乘法前向传播
    参数:
    x: 输入张量,形状为 (batch_size, input_dim)
    W: 权重矩阵,形状为 (input_dim, output_dim)
    返回:
    h: 输出张量,形状为 (batch_size, output_dim)
    """
    h = x @ W  # 常规矩阵乘法
    return h

# 定义包含 LoRA 适配的矩阵乘法前向传播函数
def lora_forward_matmul(x, W, W_A, W_B):
    """
    包含 LoRA 的矩阵乘法前向传播
    参数:
    x: 输入张量,形状为 (batch_size, input_dim)
    W: 预训练的权重矩阵,形状为 (input_dim, output_dim)
    W_A: LoRA 的权重矩阵 A,形状为 (input_dim, rank)
    W_B: LoRA 的权重矩阵 B,形状为 (rank, output_dim)
    alpha: 缩放因子,用于调节 LoRA 适配权重的影响
    返回:
    h: 输出张量,形状为 (batch_size, output_dim)
    """
    h = x @ W  # 常规矩阵乘法
    h += x @ (W_A @ W_B) * alpha  # 添加经过 LoRA 权重矩阵的适配
    return h

​ 在上面的伪代码中,alpha是一个缩放因子,用于调整组合结果(原始模型输出加上低秩自适应)的大小。这平衡了预训练模型的知识和新的特定于任务的适应——默认情况下,alpha通常设置为 1。另请注意,虽然W A被初始化为小的随机权重,但WB被初始化为 0,因此训练开始时ΔW = WAxWB = 0 ,这意味着我们以原始权重开始训练。

  • 需要注意的一个点:
    • 对于某个训练完成之后的模型来说,因为内部有各种非线性操作所以是无法把整个模型的输入和输出整合为一个矩阵的
    • 但是对于一个模型的参数来说,每个参数都会参与线性的操作,比如对于非线性操作后得到的参数作为输入,进入非线性操作的参数作为输出。
    • 因此对于一个大的模型来说,我们可以将参数分为一个一个的线性部分,作为参数矩阵,也就是LoRA的左边固定参数部分。
    • 最后训练完成后,可以将左右参数进行相加(因为最终矩阵操作大小是一样的,一个是(L,L),一个是(L ,r)×(r,L)也为(L,L)。

参考学习资料:

  1. 利用LoRA对LLM进行参数高效的微调 - 知乎

  2. Lora模型微调原理_哔哩哔哩_bilibili

标签:dim,微调,矩阵,参数,output,input,自学,LoRA
From: https://blog.csdn.net/m0_62030579/article/details/144931393

相关文章

  • 自学资料 - Dalle2模型 - 文生图技术
    Dalle2模型-论文中为unCliP目录Dalle2模型-论文中为unCliP1.Dalle2的引言2.GAN模型优缺点优点缺点3.AE和DAE(denoisingAE)原理共同点4.VAE(变分自编码器)优点5.VQVAE(向量自编码器)原理优点6.Dalle模型原理7.Diffusion模型模型更新过程优点缺点:8.Dalle2......
  • 大一计算机的自学总结:二分搜索
    前言回顾之前初学循环时写过的猜数小游戏,若范围是0~100,大多数人的猜法都是先猜50,若大了,则猜25;若小了,则猜75......这种搜索方法,就是二分搜索。一、二分搜索原理二分搜索的原理很简单,但非常实用。二分搜索时,每次都把有序数组分成两份,判断中点位置的值和要搜索的值的大小关系,然......
  • 什么是数据运营(自学记录)
    1.总结跟普通运营一样都是产品和用户之间的枢纽,不过更偏向于对数据进行分析。2.干什么的运用数据来指导决策、实现业务增长。侧重支持业务决策、互联网运营等类别。根据维度的不同对用户进行层级划分。具体:1.AARRR(具体内容大家可以看AARRR模型最详解-知乎)用户获取(Ac......
  • 网络安全(黑客)自学
    ......
  • 一书从零到精通入门大模型开发了!《从零开始大模型开发与微调》【附PDF】
    前言在人工智能领域,大型预训练模型(LargePre-trainedModels,LPMs)已经成为推动自然语言处理(NLP)技术发展的重要力量。这些模型在海量数据上进行预训练,能够捕捉到丰富的语言模式和知识,进而在各种下游任务上展现出卓越的性能。今天,给大家分享的这份手册以PyTorch2.0为基础......
  • 大语言模型【基础】(二)微调需要多少算力?
    微调模型需要多少的GPU显存?一、模型【训练】占用显存【QWen2.5-32B为例】模型配置情况如下所示方法一:较为精确估计全量微调占用情况结论根据模型配置和假设的batchsize、序列长度:总显存需求:约388GB所需卡数:至少13张昇腾910B卡才能满足显存需求,推荐使用1......
  • 《DNK210使用指南 -CanMV版 V1.0》第四十八章 自学习分类实验
    第四十八章自学习分类实验1)实验平台:正点原子DNK210开发板2)章节摘自【正点原子】DNK210使用指南-CanMV版V1.03)购买链接:https://detail.tmall.com/item.htm?&id=7828013987504)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/ATK-DNK210.html5)正点......
  • CF848E Days of Floral Colours 题解
    Problem-848E-Codeforces首先,由于整个图是对称的,所以我们将其沿直径分为两半,在算一半答案时把每一段的贡献平方再相加即可。(因为对面也有一段相同长度的也要计入贡献)现在我们的问题转化为了对于一个长为\(n\)的环,你可以给一个点连出一个线头(即在原图中连向对面的边)将其余......
  • 【Rust自学】9.2. Result枚举与可恢复的错误 Pt.1:match、expect和unwrap处理错误
    喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)9.2.1.Result枚举通常情况下,错误都没有严重到需要停止整个程序的地步。某个函数之所以运行失败或者是遇到错误通常是由一些可以简单解释并做出响应的原因引起的。比......
  • 【大模型实战篇】LLaMA Factory微调ChatGLM-4-9B模型
    1.背景介绍          虽然现在大模型微调的文章很多,但纸上得来终觉浅,大模型微调的体感还是需要自己亲自上手实操过,才能有一些自己的感悟和直觉。这次我们选择使用llama_factory来微调chatglm-4-9B大模型。    之前微调我们是用两块3090GPU显卡,但这次我们......