首页 > 其他分享 >LoRA 微调和低秩矩阵

LoRA 微调和低秩矩阵

时间:2024-02-25 20:27:25浏览次数:23  
标签:训练 模型 微调 矩阵 特定 参数 LoRA

LoRA(Low-Rank Adaptation)是一种技术,旨在有效调整大型语言模型,以适应特定任务,而无需重新训练整个模型。在论文《LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGEMODELS》(https://arxiv.org/abs/2106.09685)中给出了具体方法:

通过对模型中的参数进行低秩更新,来实现对大型预训练语言模型的高效适配。

这种方法可以保持或甚至提高模型针对特定任务的能力。

LoRA : 引入额外的、可训练的低秩矩阵

LoRA通过在模型的自注意力和前馈网络层中引入额外的、可训练的低秩矩阵,以此来调整模型的权重。这些低秩矩阵与原始权重相乘,生成对原始权重的更新。这种方法允许在微调过程中只更新这些低秩矩阵,而不是整个权重矩阵,从而减少了需要训练的参数数量。


图中蓝色部分为预训练好的模型参数,LoRA在预训练好的模型结构旁边加入了AB两个结构,这两个结构的参数分别初始化为高斯分布和0,那么在训练刚开始时附加的参数就是0。

训练时的参数更新

在训练过程中,AB的参数通过反向传播和梯度下降(或其他优化算法)进行更新。

具体来说,当模型在特定任务上进行训练时,会计算损失函数关于AB的梯度。这些梯度指示了为了减少损失(即改善模型在任务上的表现),AB的参数应该如何调整。

随着训练的进行,AB的参数会逐渐偏离其初始值(高斯分布初始化的A和零初始化的B),从而实现对原始模型权重的有效低秩调整。

使用时的工作机制

在使用LoRA进行模型适配时,模型的自注意力和/或前馈网络层中的权重不直接进行更新。相反,通过调整AB的参数来间接更新这些层的行为。

具体来说,通过计算A和原始权重的乘积,然后与B的乘积相加,来生成对原始权重的更新。

这意味着在模型推理或应用于实际任务时,原始模型的权重通过与AB的低秩更新相结合来动态调整,以适应特定任务的需求。

低秩矩阵 Low-rank Matrix

低秩矩阵是指其秩(rank)远小于其行数和列数的矩阵。

假设我们有一个矩阵,其实际结构允许它被分解为两个较小的矩阵的乘积。这种情况通常意味着原矩阵是低秩的。

假设我们有一个4×5的矩阵A,这个矩阵可以通过两个更小的矩阵的乘积来表示,比如一个4×2的矩阵B和一个2×5的矩阵C。这意味着原始矩阵A的信息可以通过这两个较小的矩阵来捕捉,表明A是一个低秩矩阵。

让我们看一个更具体的例子

矩阵B(尺寸为4×2

B = \begin{pmatrix} 1 & 2\\ 3 & 4\\ 5 & 6\\ 6 & 8 \end{pmatrix}

矩阵C(尺寸为2×5

C = \begin{pmatrix} 1 & 0 & 1 & 0 & 1\\ 0 & 1 & 0 &1 & 0 \end{pmatrix}

矩阵A

我们将计算 A=B×C, 以此作为低秩矩阵的例子。

# 定义矩阵B和C
B = np.array([
    [1, 2],
    [3, 4],
    [5, 6],
    [7, 8]
])
C = np.array([
    [1, 0, 1, 0, 1],
    [0, 1, 0, 1, 0]
])
# 计算矩阵乘积A = B * C
A = B.dot(C)

A

# 结果
# array([[1, 2, 1, 2, 1],
#       [3, 4, 3, 4, 3],
#       [5, 6, 5, 6, 5],
#       [7, 8, 7, 8, 7]])

通过上面计算,我们得到了矩阵A为:

A = \begin{pmatrix} 1 & 2 & 1 & 2 & 1\\ 3 & 4 & 3 &4 & 3\\ 5 & 6 & 5 &6 & 5\\ 7 & 8 & 7 &8 & 7 \end{pmatrix}

这个矩阵是通过两个较小的矩阵 B(4×2)C(2×5)的乘积构造的。这个例子展示了矩阵
A的信息可以通过较小维度的矩阵来表示,因此它是一个低秩矩阵。在这个例子中,矩阵A的秩最多为2,因为它是由两个秩为2(或更小)的矩阵乘积得到的。

LoRA使用低秩矩阵是一种权衡取舍

低秩矩阵通常出现在以下情况:

  • 数据冗余:当矩阵的行或列之间存在高度冗余时,比如在一些数据集中,多个特征(列)可能高度相关,或者多个观测(行)几乎相同。

  • 信息重复:在某些情况下,矩阵的不同部分可能包含重复的信息,导致整个矩阵可以通过较少的数据来描述。

  • 固有维度低:在许多实际问题中,尽管数据在表面上看似高维(例如图像、文本数据),其真实的“固有维度”却可能相对较低,因为数据点可能聚集在低维的流形上。

  • 缺失或不完整的数据:在处理不完整或缺失数据时,通过低秩矩阵近似可以是恢复或估计缺失条目的一种有效方法。

在模型微调中,特别是使用LoRA(Low-Rank Adaptation)技术时,目的并不在于处理数据的冗余或提取固有特征,而是在于优化预训练模型的参数,以提高其在特定任务上的性能。这样做的确可能会牺牲模型在某些场景下的能力,以强化其在其他特定场景下的表现。

使用LoRA进行微调的过程,可以视为一种权衡:

强化特定能力:通过对预训练模型的少数参数进行精确调整,LoRA使模型在面对特定任务(如特定领域的文本理解、图像识别等)时表现得更好。

牺牲通用性:这种调整可能会降低模型在其他未经特化训练的任务上的性能,因为模型现在更倾向于优化和应对微调时使用的数据和任务类型。

因此,尽管LoRA微调可能导致模型在未专门优化的场景下表现不如预训练状态,但这种专门化的优化是为了实现在特定应用领域内的最优性能。这种方法体现了深度学习模型微调中的一种常见策略,即在特定任务上实现最佳表现,而不是追求一个模型在所有任务上都有平均而中的表现。

总结

LoRA(Low-Rank Adaptation)技术,这是一种针对大型语言模型的微调方法,旨在通过引入可训练的低秩矩阵来适应特定任务,而无需重新训练整个模型。通过对模型中的参数进行低秩更新,LoRA允许在微调过程中仅更新少量参数,从而减少训练所需的资源和时间。这些低秩矩阵与原始权重相结合,通过反向传播和梯度下降进行调整,实现对模型权重的高效低秩调整。

LoRA的使用是一种权衡,旨在强化模型在特定任务上的性能,即使这可能牺牲模型在其他未特化任务上的通用性。这种方法体现了在特定应用领域内实现最佳性能的深度学习模型微调策略,而非追求一个模型在所有任务上的平均表现。

标签:训练,模型,微调,矩阵,特定,参数,LoRA
From: https://www.cnblogs.com/ghj1976/p/18032882/lora-finetuning-he-di-zhi-ju-zhen

相关文章

  • 使用 Hugging Face 微调 Gemma 模型
    我们最近宣布了,来自GoogleDeepmind开放权重的语言模型Gemma现已通过HuggingFace面向更广泛的开源社区开放。该模型提供了两个规模的版本:20亿和70亿参数,包括预训练版本和经过指令调优的版本。它在HuggingFace平台上提供支持,可在VertexModelGarden和GoogleKubern......
  • 什么是转换矩阵以及如何使用它
    项目地址:Pdfium.Net:https://github.com/1000374/Pdfium.NetPdfiumViewer:https://github.com/1000374/PdfiumViewer当您使用PDFium库处理PDF文件中的对象时,您可以使用SetMatrix函数以各种方式转换对象(通常是图像,但也包括任何其他嵌入对象)。使用变换矩阵,您可以旋转、平移(移......
  • 迅速的长矩阵乘法
    这个算法被RyanWilliams挖坟挖出来,然后大家反复使用.但是感觉Ryan本人写的有点难读...在这里试图按照我的理解解释一下.令\(T\)是计算如下"打洞"的矩阵乘法的张量:\[\begin{pmatrix}a_{11}&a_{12}&a_{13}\\&a_{22}&a_{23}\end{pmatrix}\begin{pmatrix}......
  • 关于矩阵乘法优化
    3373.Line、通过简化状态,我们可以得到\(f_{i,j,a,b}\)表示到第i列,有j个空列,有a行为1,b行为10,n-a-b为100技巧:注意特殊条件,如行的顺序与方案无关,还有一些原状态的值域很小的可以特殊处理(所以可以把多维合成n-1维,n为值域,如上题为3)然后矩阵乘法,注意矩阵乘法一般只优化一维,然后其它......
  • 矩阵树定理
    ex矩阵树定理当边带权时,图的拉普拉斯矩阵对角线为与其相连的边权和,\(i,j(i\neqj)\)则为\(i,j\)的边权\(\times(-1)\)然后它的行列式即为树的方案树行列式把矩阵高斯消元后,得到上三角矩阵,主对角线的值的乘积即为行列式初等变换交换两行,行列式乘-1将某行乘k,行列式乘k将第i......
  • lightdb plorasql 编译期间检查功能增强
    背景lightdb为兼容Oracle的存储过程创建了plorsql核心插件。在lightdb23.4及之前版本,plorasql存储过程只支持基本的语法校验(check_function_bodies=on时)。从lightdb24.1版本开始,lightdb新增GUC参数lightdb_analyze_function_bodies,当该参数为on时,将会开启......
  • 【数据结构】数组、稀疏矩阵的操作、广义表
    数组数组:按一定格式排列起来的,具有相同类型的数据元素的集合一维数组:若线性表中的数据元素为非结构的简单元素,则称为一维数组二维数组:若一维数组中的数据元素又是一维数组结构,则称为二维数组数组基本操作:一般来说,只有存取和修改这两种操作数组一般采用顺序存储结构二维数组......
  • 矩阵乘法,矩阵快速幂
    矩阵乘法说白了就是c[i][j]=a[i][k]*b[k][j]矩阵快速幂就是把快速幂中整数乘法换成了矩阵乘法structma{ intm[5][5];}ans,base;macal(maa,mab){ matmp; for(inti=1;i<=2;i++) { for(intj=1;j<=2;j++) { tmp.m[i][j]=0; for(intk=......
  • 4张图片就可以微调扩散模型
    稳定扩散模型因其从文本描述生成高质量、多样化图像的能力而获得了极大的关注。但是这些预训练模型在生成高度定制或个性化主题的图像时可能会有所不足。这时就需要我们进行手动的微调。微调可以根据相对较小的图像集向模型教授新的、独特的主题。我们今天使用DreamBooth在不影响......
  • 矩阵快速幂
    矩阵快速幂定义使用矩阵乘法加速递推注意点可以预处理\(2^k\)次乘方的转移数组,到询问时,只需要乘\(log(n)\)次即可要注意矩阵的赋值不要覆盖赋值,有的时候慎用=要用+=要注意矩阵中的符号,会使取模操作出问题要注意加速递推时f[i]=f[i-1]处于i位的数应当保留,因为下一......