探秘Transformer系列之(22)--- LoRA
探秘Transformer系列之(22)--- LoRA目录
[*]探秘Transformer系列之(22)--- LoRA
[*]0x00 概述
[*]0x01 背景知识
[*]1.1 微调
[*]1.2 PEFT
[*]1.3 秩
[*]1.4 SVD分解
[*]0x02 LoRA
[*]2.1 定义
[*]2.1.1 训练
[*]2.1.2 推理
[*]合并权重
[*]可插拔性
[*]组合性
[*]2.2 AB矩阵的作用
[*]2.3 部署位置
[*]2.3.1 原始论文
[*]2.3.2 拓展
[*]2.3.3 动态选择
[*]2.4 初始化
[*]2.5 超参数
[*]2.5.1 秩
[*]intrinsic rank
[*]最佳性能
[*]R的分布
[*]2.5.2 学习率
[*]缩放因子 \(\gamma\)
[*]2.5.3 Dropout
[*]2.6 优势
[*]0x03 复杂度&资源占用
[*]3.1 计算量分析
[*]3.1.1 训练
[*]3.1.2 推理
[*]3.2 内存占用
[*]3.2.1 全参数微调
[*]3.2.2 LoRA
[*]主干模型
[*]分支模型
[*]结论
[*]0x04 支撑机理 & 分析
[*]4.1 本征维度
[*]4.1.1 定义
[*]4.1.2 模型的本征维度
[*]4.1.3 预训练和本征维度
[*]4.1.4 LoRA和本征维度
[*]4.2 子空间微调
[*]4.2.1 子空间微调
[*]4.2.2 分类
[*]4.2.3 子空间重构
[*]4.2.4 子空间扩展
[*]4.2.5 子空间组合
[*]4.3 复杂系统的低秩表示理论
[*]4.4 Neural Tangent Kernel (NTK)
[*]4.5 对模型的改变
[*]0x05 实现
[*]5.1 使用
[*]5.2 创建
[*]5.2.1 LoraModel
[*]5.2.2 BaseTuner
[*]5.2.3 LoraModel的创建
[*]5.3 调整具体模块
[*]5.3.1 Linear
[*]5.3.2 LoraLayer
[*]5.3.3 前向传播
[*]0x06 改进
[*]6.1 参数效率增强
[*]6.1.1 参数分解
[*]方法
[*]更新矩阵分解
[*]预训练的权重分解
[*]6.1.2 参数剪枝
[*]6.1.3 参数冻结与共享
[*]6.1.4 参数量化
[*]6.2 秩适应(Ranking Adaptation)
[*]6.2.1 秩细化(Rank Refinement)
[*]6.2.2 秩增强(Rank Augmentation)
[*]6.3 训练过程改进
[*]6.3.1 Co-updating LLM and LoRA
[*]6.3.2 初始化改进(Initialization Improvement)
[*]PiSSA
[*]MiLoRA
[*]CorDA
[*]6.3.3 持续学习
[*]遗忘
[*]持续学习
[*]O-LoRA
[*]AM-LoRA
[*]0xFF 参考
0x00 概述
大语言模型(LLMs)在各种自然语言处理任务中取得了显著的成功,推动了语言理解、生成和推理能力的突破。类似其他领域中的自监督学习方法,LLMs通常在大量未标注文本数据上进行预训练,然后针对特定下游任务进行微调,以使其知识适应目标领域。然而,LLMs的巨大规模,往往达到数十亿参数量,在微调过程中带来了计算复杂度和资源需求上的重大挑战。
为应对这些挑战,一种名为参数高效微调(PEFT)的有前途的方法有望在不增加大量可训练参数的前提下将大语言模型适应于下游任务,从而减少计算和内存开销。在这类方法中,由于其有效性和简洁性,低秩适应(LoRA)受到了广泛关注。
LoRA 的核心思想是利用低秩矩阵来近似模型参数的变化,从而以极小的参数量来实现大模型的间接训练。LoRA 冻结预训练模型的权重,引入低秩矩阵和来近似模型参数的变化量。通过仅在微调过程中更新这些低秩矩阵,LoRA在保持预训练模型大部分参数不变的情况下,实现对特定任务的适应。LoRA的目标就是以小博大,以极小的参数量来实现大模型的间接训练,逼近全量微调的效果。这种方法在减少存储和计算需求的同时,也保持了模型的性能。
本文主要基于两篇论文进行学习:
[*]A Survey on LoRA of Large Language Models
[*]Low-Rank Adaptation for Foundation Models: A Comprehensive Review
注:全部文章列表在这里,估计最终在35篇左右,后续每发一篇文章,会修改文章列表。
cnblogs 探秘Transformer系列之文章列表
0x01 背景知识
1.1 微调
随着开源预训练大型语言模型变得更加强大和开放,越来越多的开发者将大语言模型纳入到他们的项目中。预训练的 LLMs 通常被称为基础模型(在多样、大规模数据集上训练的大规模神经网络),因为它们在各种任务中具有多功能性。然而,由于LLMs的知识边界,基础模型在某些下游任务上的能力仍然有限。为了扩展知识边界,仍然需要在下游任务上对LLMs进行微调,即针对特定数据集或任来调整预训练的 LLM。而且,训练大型语言模型需要消耗大量的计算资源和时间。这为人工智能的发展带来了瓶颈并引发了环境问题。为了缓解这一问题,人也通常也会选择微调预训练模型。
微调允许模型适应特定领域,而无需进行昂贵的预训练。但是传统上,适应预训练模型到特定下游任务需要全面微调所有参数。而对于较大的模型来说,更新所有层的计算成本仍然很高,而且大模型全量微调时的显存占用也容易过大。随着这些模型的复杂性和规模增加,这种传统的微调方法在计算和资源方面变得不再可行。
1.2 PEFT
为了应对上述挑战,出现了更多参数高效微调技术,统称为PEFT(Parameter-Efficient Tuning/参数高效微调)。PEFT方法已经成为了资源有限的机构和研究者微调大模型的标配,其总体思路是冻结住大模型的主干参数,引入一小部分可训练的参数作为适配模块进行训练,这样通过微调少量(额外)模型参数或者减少迭代次数,可以使LLM适应下游任务,在不影响任务性能的情况下大幅降低计算需求,节省模型微调时的显存和参数存储开销,降低微调成本。虽然这些PEFT方法有着很大的潜力,但往往在效率、性能和适应性之间需要做出权衡,因此仍然有巨大优化空间。
PEFT的分类方法没有统一的规范,这里采用论文"Parameter-Efficient Fine-Tuning for Large Models: A Comprehensive Survey"的说法,将PEFT策略可大致分为四类:
[*]可加性PEFT,通过注入新的可训练模块或参数来修改模型架构;
[*]选择性PEFT,使参数子集在微调过程中可训练;
[*]重参数化PEFT,它构建了原始模型参数的(低维)重参数化训练,然后等效地将其转换回来进行推理;
[*]混合PEFT,它结合了不同PEFT方法的优点,构建了一个统一的PEFT模型。
不同类型的PEFT算法的概述如下图所示。
下图则给出了详细分类。
另外,上述的PEFT方法中,有些是可以混用的。比如下图中,所有可学习的组件是红色的,冻结的组件是灰色的。LoRA被应用到Q,K和V上,adapter 被用用到FFN上。Soft-Prompt则对每个解码器的输入激活进行调节。
1.3 秩
秩(Rank)是指矩阵的秩,也就是在一个矩阵中,有多少行(或列)是“唯一的”,即这些行(或列)无法由其他行(或列)线性组合而得到。例如:
\[\begin{bmatrix}1 & 2 & 3 \\3 & 6 & 9\end{bmatrix}\]
第二行是第一行的三倍,所以上述矩阵的秩是1。对于列来说,第二列是第一列的2倍,第三列是第一列的3倍,所以,秩还是1。
而如下矩阵:
\[\begin{bmatrix}1 & 2 & 3 \\0 & 2 & 3 \\1 & -2 & -3 \\\end{bmatrix}\]
第二行不能由第一行组成,所以秩至少为2。乍一看第三行跟第一行和第二行无关,但仔细一算,第三行可以由第一行减去第二行的两倍得到,所以这个矩阵的秩是2。对于列来说,也是类似的,第二列可以由第一列和第三列相加而得到。
事实上,不管根据行还是根据列来计算秩,对于同一个矩阵来说总是相同的。这也说明了,矩阵的秩一定小于等于行数或列数中小的那个。
1.4 SVD分解
由于网络总是可以用矩阵和张量的语言来描述,线性代数为研究网络属性提供了重要的工具。SVD分解(Singular Value Decomposition / 奇异值分解)是线性代数的一个矩阵分解技术。SVD 的作用在于将矩阵分解为若干个不同重要性的分量之和。奇异值分解常用于降维和压缩,通过保留较大的奇异值,可以近似表示原始矩阵。
在SVD分解中,给定大小为
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]