首先我们先介绍一下矩阵分解相关的内容,然后在这个基础上再介绍大模型微调节省显存的方案。
矩阵分解
矩阵分解是一种将矩阵分解为多个组成部分的技术,在深度学习上,通常用于简化模型、提高训练效率或增强模型的解释性。在深度学习和机器学习中,矩阵分解有多种形式,以下是几种常见的权重分解方法:
奇异值分解(Singular Value Decomposition, SVD)
奇异值分解是一种将矩阵分解为三个矩阵乘积的方法:
其中:
-
是原始权重矩阵。
-
和是正交矩阵。
-
是对角矩阵,对角线上的元素称为奇异值。
奇异值分解常用于降维和压缩,通过保留较大的奇异值,可以近似表示原始矩阵。
低秩分解(Low-Rank Decomposition)
低秩分解假设权重矩阵具有较低的内在秩,可以通过两个低秩矩阵的乘积来近似表示:
其中:
-
和是低秩矩阵。
-
。
低秩分解常用于参数高效的微调方法(如LoRA),通过减少可训练参数的数量来提高训练效率。
幅度和方向分解(Magnitude and Direction Decomposition)
幅度和方向分解将权重矩阵分解为幅度和方向两个部分:
其中:
-
是幅度向量。
-
是方向矩阵。
-
表示矩阵每列向量的范数。
这种分解确保了的每一列都是单位向量,而中的对应标量定义了每个向量的幅度。幅度和方向分解常用于DoRA等方法中,通过分别微调幅度和方向来提高模型的学习能力。
张量分解(Tensor Decomposition)
张量分解是将高维张量分解为多个低维张量的乘积,常见的张量分解方法包括CP分解(Canonical Polyadic Decomposition)和Tucker分解。
CP分解:
其中:
-
是原始张量。
-
是因子矩阵的列向量。
-
表示张量积。
Tucker分解:
其中:
-
是核心张量。
-
是因子矩阵。
-
表示在第维度上的矩阵乘积。
张量分解常用于处理高维数据和多模态数据,通过降低张量的秩来减少计算复杂度。
其他分解方法
除了上述方法,还有其他一些权重分解技术,如:
-
QR分解:将矩阵分解为一个正交矩阵和一个上三角矩阵的乘积。
-
LU分解:将矩阵分解为一个下三角矩阵和一个上三角矩阵的乘积。
-
Cholesky分解:将对称正定矩阵分解为一个下三角矩阵及其转置的乘积。
矩阵分解是一种强大的工具,可以用于简化模型、提高训练效率、增强模型的解释性以及处理高维数据。不同的分解方法适用于不同的应用场景,选择合适的分解方法可以显著提升模型的性能和效率。
LoRA
LoRA(Low-Rank Adaptation)是一种用于微调大型语言模型的技术,其核心思想是利用低秩矩阵来近似模型参数的变化。
模型参数表示
设 为预训练模型的参数矩阵,是维度矩阵。 我们可以通过以下方式来近似的变化量:
其中,和分别是维度为和的矩阵。和在微调过程中被训练,以最小化和实际参数变化量之间的差异。
参数更新
在微调过程中,不直接更新,而是更新和。然后,通过以下方式更新:
这样,只需要存储和更新和,而不是整个,从而大大减少了存储和计算需求。
优化目标
在微调过程中,优化的目标就是最小化以下损失函数:
其中,是特定任务的损失函数,是正则化系数, 表示Frobenius范数,用于控制 的大小,防止过拟合。
梯度更新
在训练过程中,我们计算损失函数关于和的梯度,并使用梯度下降法更新和:
其中,是学习率。
LoRA通过引入低秩矩阵和来近似模型参数的变化量,从而在保持预训练模型大部分参数不变的情况下,实现对特定任务的适应。这种方法在减少存储和计算需求的同时,也保持了模型的性能。
QLoRA
QLoRA(Quantized Low-Rank Adapter)是一种用于高效微调大型语言模型(LLM)的方法,它通过 结合量化技术和低秩适配器(LoRA) 来显著减少模型微调时所需的内存量,同时保持模型性能。
-
4-bit NormalFloat (NF4) Quantization:QLoRA引入了一种新的4位量化数据类型,称为NormalFloat(NF4),它在信息理论上对于正态分布的权重是最优的。这种量化方法通过将权重量化为4位来减少内存占用,同时保持模型性能。
-
Double Quantization:QLoRA采用双重量化技术,即对普通参数进行一次量化,对量化常数再进行一次量化,这样可以进一步减少平均内存占用。
-
Paged Optimizers:为了管理内存峰值,QLoRA引入了分页优化器,它们使用NVIDIA统一内存来处理长序列长度的小批量数据时出现的内存需求。
-
Memory Reduction:QLoRA能够将65B参数模型的微调平均内存需求从超过780GB的GPU内存减少到小于48GB,同时与16位全参数微调的基线相比,不降低运行时或预测性能。
-
Performance:QLoRA在Vicuna基准测试上的表现优于所有以前公开发布的模型,其最佳模型系列名为Guanaco,达到了ChatGPT性能水平的99.3%,仅需要在单个GPU上进行24小时的微调。
-
Forward and Backward Propagation:在前向计算时,QLoRA首先通过反量化函数将原始模型的参数反量化成fp16,然后加上LoRA适配层。LoRA的参数不量化,因为它们需要反向传播优化。而原始模型的参数是冻结的,因此可以量化。在参数更新时,只需要计算LoRA适配器权重对误差的梯度,而不需要4位权重的梯度。
LoRA+
LoRA+是一种对原始LoRA(Low-Rank Adaptation)技术的改进,它通过为两个矩阵A和B引入不同的学习率来提高训练效率。在传统的LoRA方法中,所有权重矩阵都采用相同的学习率进行训练。然而,LoRA+的研究表明,单一学习率并不是最优的,特别是对于层数非常多的神经网络或宽度较大的神经网络。通过将矩阵B的学习率设置得远高于矩阵A的学习率,LoRA+能够使训练变得更加高效.
在训练过程中,我们计算损失函数关于和的梯度,并使用梯度下降法更新和,设 为的学习率,为的学习率,且。:
LoRA+的关键在于和的不同学习率设置,这允许在训练过程中进行更大幅度的更新,而则进行较小幅度的调整。这种设置有助于在保持模型稳定性的同时,加快训练速度并提高模型性能。
LongLoRA
LongLoRA旨在扩展预训练大型语言模型(LLM)的上下文大小,同时保持有限的计算成本。以下是LongLoRA的一些关键特点和工作原理: LongLoRA通过两种方式加快LLM的上下文扩展:
-
移位短注意力(Shifted Short Attention, S2-Attn):在微调过程中,S2-Attn将输入序列分成多个组,并在不同的注意力头中应用移位模式。这种方法可以有效地实现长上下文扩展,同时显著降低计算成本。值得注意的是,S2-Attn只在微调阶段使用,推理时仍采用完整的注意力机制
-
改进的LoRA:研究发现,在可训练的嵌入层和归一化层的前提下,LoRA对上下文扩展效果显著。LongLoRA结合了这种改进的LoRA和S2-Attn,实现了高效的长上下文扩展 好的,下面是用数学公式表达移位短注意力(S2-Attn)的过程。
标准自注意力机制
标准的自注意力机制可以表示为:
其中,、、 分别是查询(Queries)、键(Keys)和值(Values)矩阵, 是键的维度。
S2-Attn的数学表达
S2-Attn的核心思想是将输入序列分成若干组,并在每组内进行局部注意力计算。为了确保组与组之间的信息流动,S2-Attn在部分注意力头中对组进行移位操作。
分组: 假设输入序列长度为,分组大小为,则可以将输入序列分成组。
移位: 在部分注意力头中,将每组的token移位半个组的大小。具体来说,假设有个注意力头,其中一半的注意力头进行移位操作。
移位操作的数学表达: 假设输入的查询、键和值矩阵为、、,形状为 ,其中是批次大小,是序列长度,是注意力头数,是每个注意力头的维度。
移位操作: 在部分注意力头中进行移位操作:
其中,表示在指定维度上进行循环移位操作。
分组操作: 将移位后的查询、键和值矩阵分成组:
局部注意力计算在每个组内进行局部注意力计算:
组合结果: 将所有组的局部注意力结果组合起来,得到最终的输出:
通过上述数学表达,可以看出,S2-Attn在训练过程中通过局部注意力和移位操作,显著减少了计算成本,同时确保了组与组之间的信息流动。在推理阶段,模型仍然使用标准的自注意力机制,因此可以兼容现有的优化技术和基础设施。
伪代码
# B: batch size; S: sequence length or number of tokens; G: group size; # H: number of attention heads; D: dimension of each attention head # qkv in shape (B, S, H, D), projected queries, keys, and values # key line 1': split qkv on H into 2 chunks, and shift G/2 on S qkv = cat((qkv.chunk(2, 3)[0], qkv.chunk(2, 3)[1].roll(-G/2, 1)), 3).view(B*S/G, G, H, D) # standard self-attention function out = self_attn(qkv) # out in shape (B, S, H, D) # key line 2: split out on H into 2 chunks, and then rollback G/2 on S out = cat((out.chunk(2, 2)[0], out.chunk(2, 2)[1].roll(G/2, 1)), 2)
DoRA
DoRA (Weight-Decomposed Low-Rank Adaptation) 旨在通过分解预训练权重为幅度和方向两个部分来进行微调,从而提高模型的学习能力和训练稳定性。
幅度和方向分解将权重矩阵分解为幅度和方向两个部分:
其中:
-
是幅度向量。
-
是方向矩阵。
-
表示矩阵每列向量的范数。
低秩适应(LoRA):
在DoRA中,方向矩阵通过低秩适应(LoRA)进行更新。对于预训练权重矩阵,LoRA使用两个低秩矩阵 和 来更新权重:
其中。因此,微调后的权重可以表示为:
DoRA的权重更新:
DoRA在权重分解的基础上,对幅度和方向分别进行微调。具体来说,DoRA保持幅度向量 可训练,而方向矩阵通过LoRA进行更新:
其中:
-
是方向矩阵的增量更新。
-
是更新后的方向矩阵的列范数。
梯度计算:
为了优化,需要计算损失函数 对和的梯度:
其中:
-
是单位矩阵。
-
是损失函数对微调后权重的梯度。
4. 梯度分析
从上述梯度公式中,我们可以看到以下几点:
-
幅度梯度:幅度向量的梯度是通过将与的点积,然后除以得到的。这表明幅度更新与方向更新是相互关联的。
-
方向梯度:方向矩阵的梯度是通过将进行缩放和投影得到的。具体来说,梯度被缩放了,并且被投影到与当前权重矩阵正交的方向上。这种投影有助于使梯度的协方差矩阵更接近单位矩阵,从而提高优化的稳定性。
-
低秩更新的稳定性:由于,方向矩阵的梯度实际上等价于。因此,权重分解带来的优化优势完全传递给了,从而提高了LoRA的学习稳定性。
减少训练开销: 为了减少训练过程中的内存开销,DoRA将视为常数,从而在反向传播过程中不计算其梯度:
其中
这种修改显著减少了梯度图的内存消耗,而对精度的影响可以忽略不计。
DoRA通过将预训练权重分解为幅度和方向两个部分,并利用LoRA对方向进行低秩更新,从而在保持参数高效的同时,提高了模型的学习能力和训练稳定性。通过梯度分析,我们可以看到幅度和方向的更新是如何相互关联的,以及如何通过权重分解来提高优化的稳定性。
MaLoRA
MALoRA(Mixture of Asymmetric Low-Rank Adaptation)是一种用于多任务学习的参数高效微调(PEFT)方法。它通过引入共享的低秩子空间和扩展的上投影矩阵来优化参数效率和泛化能力。
基本符号定义
-
:原始的线性权重矩阵。
-
:下投影矩阵,其中是低秩分解的秩。
-
:上投影矩阵。
-
:权重更新矩阵。
-
:缩放因子。
LoRA的基本形式
LoRA假设权重更新矩阵 具有低秩结构,并使用两个可训练的低秩矩阵 和来近似权重更新:
MALoRA对LoRA的改进
MALoRA通过引入共享的低秩子空间和扩展的上投影矩阵来优化参数效率和泛化能力。具体来说,MALoRA将下投影矩阵替换为一个共享的低秩子空间,并为每个专家分配一个紧凑的系数矩阵。
共享低秩子空间:
定义共享的低秩子空间,其中是共享子空间的秩。每个专家的下投影矩阵被替换为:
扩展的上投影矩阵:
每个专家的上投影矩阵被扩展为,其中,是一个小于1的系数。
权重更新矩阵:
MALoRA的权重更新矩阵可以表示为:
初始化
为了确保遵循Kaiming Uniform分布,初始化过程如下:
-
对多个Kaiming Uniform初始化的随机矩阵进行奇异值分解(SVD):
-
初始化和:
其中 是一个超参数,用于控制通用和任务特定学习的平衡。
泛化边界
根据泛化边界公式:
MALoRA通过扩展上投影矩阵的秩 ,增加了模型的泛化能力。具体来说,MALoRA的泛化边界是MoLoRA的倍。
MALoRA通过引入共享的低秩子空间和扩展的上投影矩阵,优化了参数效率和泛化能力。具体公式如下:
其中和的初始化确保了参数的有效性和稳定性。
GaLore
梯度低秩投影(GaLore): 是一种训练策略,允许全参数学习,但比常见的低秩适应方法(如LoRA)更节省内存。在优化器状态中减少了高达65.5%的内存使用,首次证明了在消费者GPU(如NVIDIA RTX 4090,24GB内存)上无需模型并行、检查点或卸载策略即可预训练7B模型的可行性。
GaLore的关键思想 是利用权重矩阵的梯度的缓慢变化的低秩结构,而不是试图将权重矩阵本身近似为低秩。
❝
训练过程梯度是缓慢的变成低秩吗?
《GaLore:通过梯度低秩投影实现内存高效的大型语言模型训练》这篇文章从理论上证明了训练过程梯度是缓慢变成低秩的。感兴趣证明过程的可以参考原文,深度的学习一下,下面就当我们知道训练过程梯度是缓慢变成低秩的是成立的,在这个基础上,引入GaLore。
常规全秩训练
在时间步,是反向传播的(负)梯度矩阵。然后常规预训练权重更新可以写成如下形式(是学习率):
其中是最终处理的梯度,添加到权重矩阵中,是逐分量的有状态梯度正则化器(例如,Adam)。的状态可能非常占用内存。例如,对于Adam,我们需要来将梯度正则化为:
这里和表示逐分量的乘法和除法。是学习率。连同,这需要的内存。
梯度低秩投影(GaLore)
梯度低秩投影(GaLore)就是表示使用以下梯度更新规则(是学习率):
其中和是投影矩阵。
Adam中使用GaLore
Adam优化器是一种广泛使用的自适应学习率优化算法,结合了动量和RMSprop的优点。在梯度低秩投影(GaLore)中,通过利用梯度的低秩结构来减少内存占用,同时保持Adam的优化性能。
Adam优化器:
Adam优化器通过维护每个参数的动量和二阶矩估计来调整学习率。具体来说,Adam的更新规则如下:
-
动量估计:
-
二阶矩估计:
-
偏差修正:
-
参数更新:
其中,是时间步的梯度, 和 分别是动量和二阶矩估计, 和 是衰减率, 是学习率, 是一个小常数,用于数值稳定性。
2. GaLore的引入
在GaLore中,通过计算两个投影矩阵和,将梯度矩阵投影到低秩形式,从而减少优化器状态的内存占用。具体来说,GaLore的更新规则如下:
-
梯度投影:
-
动量估计:
-
二阶矩估计:
-
偏差修正:
-
参数更新:
具体实现步骤
- 初始化:
-
初始化参数 。
-
初始化动量估计 和二阶矩估计。
-
初始化投影矩阵和。
- 迭代更新:
-
计算当前时间步的梯度。
-
计算投影梯度。
-
更新动量估计和二阶矩估计。
-
进行偏差修正,得到和。
-
更新参数。
- 投影矩阵更新:
- 定期(例如每200次迭代)重新计算投影矩阵和,通过奇异值分解(SVD)或其他方法。
GaLore优势
-
内存高效:通过利用梯度的低秩结构,GaLore显著减少了优化器状态的内存占用,相比于传统的Adam优化器,内存使用减少了高达65.5%。
-
全参数学习:GaLore允许全参数学习,避免了低秩适应方法可能带来的性能损失。
-
兼容性:GaLore可以与现有的优化器(如Adam、8位Adam、Adafactor)无缝集成,只需少量代码修改。
Adam with GaLore通过利用梯度的低秩结构,显著减少了内存使用,同时保持了Adam优化器的优化性能。这一方法不仅在理论上有坚实的支持,而且在实际应用中表现出色,为在资源有限的硬件上训练大型语言模型提供了新的可能性。
AI大模型学习福利
作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
大模型&AI产品经理如何学习
求大家的点赞和收藏,我花2万买的大模型学习资料免费共享给你们,来看看有哪些东西。
1.学习路线图
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
2.视频教程
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己整理的大模型视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。
(都打包成一块的了,不能一一展开,总共300多集)
因篇幅有限,仅展示部分资料,需要点击下方图片前往获取
3.技术文档和电子书
这里主要整理了大模型相关PDF书籍、行业报告、文档,有几百本,都是目前行业最新的。
4.LLM面试题和面经合集
这里主要整理了行业目前最新的大模型面试题和各种大厂offer面经合集。
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓