ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

参数高效微调 LoRA 完整教程:迁移学习、矩阵秩、过参数化与低秩更新原理

参数高效微调 LoRA 完整教程:迁移学习、矩阵秩、过参数化与低秩更新原理 1.loRA 的引入1.迁移学习关于Lora的的前言有很多不同的博文会采用不同的引入方式这里说的长一些不喜欢看的可以根据目录直接跳过。迁移学习当源任务和目标任务并不完全相同时如何将已经学到的知识高效地迁移 到新的任务或新的数据分布上。标准机器学习通常假设训练数据和测试数据服从相同分布并且模型针对 某一个固定任务进行训练如果这一假设不成立比如目标任务的标注数据很 少、源任务和目标任务的数据分布不同或者目标任务本身与已有任务不完全一 致那么直接在目标任务上从零开始训练模型往往代价较高、效果也不理想此 时如果存在一个相关的源任务已经积累了大量数据或已经训练好了一个性能较好的模型那么就有可能将其中可泛化的知识迁移到目标任务上这就是迁移学习Transfer Learning要解决的问题以上的文字再直白一些 这里提到了新的任务新的分布对于新的任务的情况往往是模型已经结束了部分的训练需要让模型具有新的任务能力对于新的分布的情况往往是在已有数据集上结束了训练可对于有着具体数据场景的实战来说往往需要采用迁移的思想来解决后面会在介绍归纳迁移学习的地方更为详细的介绍另外标准机器学习通常假设训练数据和测试数据服从相同分布这里涉及到数据分布的概念打算专门写一个文章来描述分布,在本文中这个标准机器学习的假设是一个理论层面的假设独立同分布 i.i.d如果使用猫咪的图片来训练一个猫咪分类模型训练、测试的数据来自同一个池子图像亮度、角度、背景、猫咪品种的整体规律差不多 →分布相同。 此时模型学到的规律可以直接用在测试集上。为了更清楚地描述迁移学习通常将机器学习问题分为领域Domain 和任务Task两个部分迁移学习是指利用源领域Source Domain和源任务Source Task中学到的知识来帮助目标领域Target Domain 和目标任务Target Task 上的学习.通常情况下源领域中的数据规模远大于目标领域或者源 领域中已经存在性能较好的预训练模型2.归纳迁移学习迁移学习根据不同的迁移方式又分为两个类型归纳迁移学习Inductive Transfer Learning和转导迁移学习Transductive Transfer Learning这两 个类型分别对应两个机器学习的范式归纳学习Inductive Learning和转导 学习Transductive Learning[Vapnik, 1998]一般的机器学习都是指归纳学 习即希望在训练数据集上学习到使得期望风险最小的模型在归纳迁移学习中源任务和目标任务通常并不完全相同但它们之间具有 一定的相关性一般来说源领域拥有大量训练样本这些样本可以是有标注的 也可以是无标注的而目标任务上通常只有较少的标注数据因此归纳迁移学 习的核心思想是先在源领域上学习一个具有较强泛化能力的表示或模型再将 其迁移到目标任务上从数据来源来看归纳迁移学习大致有两种常见情况1 当源领域只有大量无标注数据时源任务可以设计为无监督或自监督 任务比如自编码、密度估计或语言建模等通过这些预训练任务学习一种可迁 移的表示然后再将这种表示迁移到目标任务上 这种学习方式和自学习Self Taught Learning[Raina et al., 2007]以及半监督学习比较类似比如在自然语 言处理领域由于标注数据相对稀缺而无标注文本极为丰富因此一种自然的 思路是在大规模文本上先进行预训练再迁移到下游任务上从早期的预训练词 向量比如word2vec [Mikolov et al., 2013]和GloVe [Pennington et al., 2014] 等到句子级表示比如ELMO[Peters et al., 2018]、OpenAI GPT [Radford et al., 2018]以及BERT[Devlin et al., 2019]等都体现了这一思路2 当源领域有大量的标注数据时 可以直接将源领域上训练好的 模型迁移到目标任务上比如在计算机视觉领域ImageNet [Deng et al., 2009] 提供了大规模图像分类数据集很多在ImageNet上训练好的模型如 AlexNet[Krizhevsky et al., 2012]、VGG [Simonyan et al., 2015]和ResNet[He et al., 2016]等都可以作为目标任务的预训练模型在归纳迁移学习中由于源领域的训练数据规模通常较大预训练模型往往 能够学习到具有较强迁移性的表示将预训练模型迁移到目标任务上常见方式 包括1 基于特征的方式将预训练模型的输出或者中间隐藏层的输出作为特 征直接输入目标任务的学习模型中目标任务的模型可以是一般的浅层分类器 比如支持向量机等也可以是新的神经网络模型 2 微调的方式在目标任务上复用预训练模型的部分组件并对其参数 进行微调Fine-Tuning这也是很常见的迁移方式之一 3 参数高效适配的方式当预训练模型规模很大时也可以只增加 或更新少量任务相关参数从而以较小代价完成对目标任务的适配对于大 规模模型全量微调需要更新所有参数计算和存储代价较高参数高效微 调Parameter-Efficient Fine-TuningPEFT通过只训练少量新增参数来 适配下游任务代表性方法包括Adapter在每层插入小型瓶颈模块Prefix Tuning在输入前拼接可学习的前缀向量 LoRALow-Rank Adaptation [Hu et al., 2022]将权重更新分解为两个低秩矩阵训练时只更新和因此常用于大规模预 训练模型的低成本适配2.loRA 介绍LoRALow Rank Adaptation)低秩适应1秩的概念在线性代数中关于矩阵的秩的定义方式有很多设为矩阵定义 1向量线性无关版‑列秩矩阵的列秩是矩阵中线性无关的列向量的最大个数。定义 2向量线性无关版‑行秩矩阵的行秩是矩阵中线性无关的行向量的最大个数。定理任意矩阵的行秩与列秩相等。 该公共值称为矩阵的秩 (rank)记作或定义 3子式‑行列式版本在矩阵中任取 k 行 k 列位于交叉位置上的元素构成的 k 阶方阵的行列式称为矩阵 \的一个k 阶子式。 若矩阵中存在一个不为零的 k 阶子式且所有阶子式如果存在全为零则称矩阵的秩等于 k即。不同的方式其实最终指向同一个含义我们可以理解为真正有用的行或者列向量的个数两个线性相关的向量1224,本质的表达是12,而24)其实就是对12向量的一次放缩平移,其中的放缩项为2偏移量为0。这在一定程度上意味着我们可以通过计算矩阵的秩来确定哪些特征更加重要我们可以找到一个更低维度的表示来近似一个高维度的表示也可以理解为我们可以在一个更原始的维度空间里实现较为完整的特征表示表示原有特征表示的绝大部分信息。2过参数化介于LoRA是一种参数高效微调Parameter-Efficient Fine-TuningPEFT 方法通过只更新少量额外参数来实现微调就不得不提到过参数化的概念。先说结论研究表明过参数化over-parametrized模型的学习特征位于一个低维的内在子空间中。参考已有的工作深度学习的参数矩阵往往是过参数化的模型的参数数量远超训练样本数量即模型拥有比拟合训练数据所需更多的自由度。在传统机器学习中这常被视为导致过拟合的风险因素但在现代深度学习中它反而成为提升性能与泛化能力的重要手段。这里举一个形象但是不恰当的例子在传统机器学习的回归任务中两个点可以完美的回归一条直线当数据点变为三个往往可以拟合出多条曲线意思是说多个曲线都满足构造出当前的点分布可以是一个四次函数五次函数此时模型的参数远超训练样本数量自由度更多。但是更多的参数(例如n次函数也代表着更多的采样机会可以映射出更多的特征表示体现了模型更强的性能与泛化能力。同样在很多的深度学习任务使用到的模型中例如Large Language Modeldiffusion_model,上百万上千万的参数量往往远超拟合数据特征需要的参数数量。值得注意的是这里更加注重数据和模型之间的复杂度关系也就是说无论多大或者多小的模型都可以采用LoRA微调更进一步无论模型的训练效果如何有没有最终收敛loRA未必不能带来更好的训练效果。这里进一步说一下刚才提到的拟合的概念往往在机器学习中会使用拟合的概念在深度学习中更多被解决问题这类的字眼替代其实他们表达的含义是一样的菀菀类卿......3.LoRA原理在适应特定任务时Aghajanyan 等人2020表明预训练的语言模型具有较低的“内在维度”即使经过随机投影到更小的子空间也仍然可以高效学习。基于刚才提到的权重矩阵的秩与过参数化的概念论文作者提出假设我们假设在适应过程中权重更新也具有较低的“内在秩”。解释一下就是权重矩阵在特征表示的时候存在一个较低的内在秩合理的推断出在权重更新也具有一个较低的内在秩这里通过低秩分解来表示权重矩阵的更新从而对其进行约束我们在图 1 中展示了我们的重参数化方法。我们对 A 使用随机高斯初始化对 B 使用零初始化所以训练开始时 ∆W BA 是零。然后我们将 ∆Wx 按 α^r 缩放其中 α 是 r 中的一个常数。在使用 Adam 进行优化时如果我们适当缩放初始化调 α 大致相当于调学习率。因此我们只是把 α 设置为第一次尝试的 r并不去调整它。这种缩放有助于在改变 r 时减少重新调整超参数的需求Yang Hu, 2021这里的在具体微调的环节这里的可以看作是原权重矩阵的变化量也可以看作是在原权重矩阵的基础上挂置一个额外的矩阵这个由两个矩阵AB相乘得出对于其中的表述不难发现AB两个矩阵即使可能实现行满秩或者列满秩(如rank(A) r)但根据线性代数的知识BA矩阵乘积并不满秩此时的输出变为此处的BA矩阵在初始化的时候对A矩阵采用高斯初始化对B采用全0初始化解释一下当B为全零矩阵BA为0矩阵也就有此时的输出完全等价于原始预训练大模型这样的设计能够实现1.保证微调起点不破坏预训练权重如果BA开始是一个非0的随机偏移模型刚开始的输出就跑偏把已经学习好的知识给搅乱B 0能够实现在第0轮的时候模型完全继承原模型的能力从原点更新2.训练动力学谁负责学习谁负责放大如果你观察的足够细致会发现论文中的配图对AB矩阵的描述采用了梯形这意味着存在一个数据维度变化的过程在深度学习模型训练中采用高斯初始化的形式进行参数初始化是一个不错的选择其中的A首先负责输入 x 投影进低秩 r 的瓶颈子空间去捕获任务的增量特征。反向传播一开始梯度就会更新A而B一开始权重为 0梯度慢慢把它 “从 0 抬起来”充当缩放或者输出映射矩阵。把A学到的信息映射回原始的高维空间如果B一开始也是随机值就会为主路径加上一个很大的噪声扰动损失会剧烈震荡很难收敛。原文中说loRA 微调存在两个特点1.A Generalization of Full Fine-tuning全量微调的一个泛化形式。微调的一种更通用形式允许训练部分预训练参数。LoRA 更进一步不要求在适配过程中权重矩阵的累积梯度更新是满秩的。这意味着当将 LoRA 应用于所有权重矩阵并训练所有偏置时我们通过将 LoRA 的秩 r 设置为预训练权重矩阵的秩大致可以恢复全量微调的表现。换句话说随着可训练参数数量的增加LoRA 的训练大致会收敛到原始模型的训练效果而基于适配器的方法收敛到一个 MLP基于前缀的方法则会收敛到一个无法处理长输入序列的模型。2.No Additional Inference Latency没有额外的推理延迟。在生产环境中部署时我们可以显式地计算并存储 W W0 BA并像平常一样进行推理。注意W0 和 BA 都在 Rd×k。当我们需要切换到另一个下游任务时可以通过减去 BA 然后加上不同的 BA 来恢复 W0这个操作很快而且占用的内存很少。关键是它们相比权重来说参数量几乎可以忽略不计。在处理困难任务时这几乎是不可避免的。这也保证了相比微调后的模型我们在推理时不会引入任何额外的延迟。一定程度上来说实现了热插拔的功能4.写在最后关于以上的内容更加偏向于理论层面的认知对于实践中出现的各种问题笔者并不了解原文作者在后面还进行了loRA在transformer中的具体应用提供了他的实验过程结果和部分结论这篇工作原文作者在一开始就说明使用语言建模的任务来举例而笔者对语言建模方向的工作并不精通为了不误认子弟目前不会写下去事实上LoRA微调早已延申出多种变体针对不同的任务场景不断的优化处理逻辑LoRA仅仅是微调界的一个初始范本本文能做的依旧很有限仅仅是对于初学者做出一个理念上的引导对于错误欢迎批评指正。
返回列表