LoRA(Low-Rank Adaptation)是一种技术,旨在有效调整大型语言模型,以适应特定任务,而无需重新训练整个模型。在论文《LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGEMODELS》(https://arxiv.org/abs/2106.09685)中给出了具体方法:
通过对模型中的参数进行低秩更新,来实现对大型预训练语言模型的高效适配。
这种方法可以保持或甚至提高模型针对特定任务的能力。
LoRA : 引入额外的、可训练的低秩矩阵
LoRA通过在模型的自注意力和前馈网络层中引入额外的、可训练的低秩矩阵,以此来调整模型的权重。这些低秩矩阵与原始权重相乘,生成对原始权重的更新。这种方法允许在微调过程中只更新这些低秩矩阵,而不是整个权重矩阵,从而减少了需要训练的参数数量。
图中蓝色部分为预训练好的模型参数,LoRA在预训练好的模型结构旁边加入了A
和B
两个结构,这两个结构的参数分别初始化为高斯分布和0,那么在训练刚开始时附加的参数就是0。
训练时的参数更新
在训练过程中,A
和B
的参数通过反向传播和梯度下降(或其他优化算法)进行更新。
具体来说,当模型在特定任务上进行训练时,会计算损失函数关于A
和B
的梯度。这些梯度指示了为了减少损失(即改善模型在任务上的表现),A
和B
的参数应该如何调整。
随着训练的进行,A
和B
的参数会逐渐偏离其初始值(高斯分布初始化的A
和零初始化的B
),从而实现对原始模型权重的有效低秩调整。
使用时的工作机制
在使用LoRA进行模型适配时,模型的自注意力和/或前馈网络层中的权重不直接进行更新。相反,通过调整A
和B
的参数来间接更新这些层的行为。
具体来说,通过计算A
和原始权重的乘积,然后与B
的乘积相加,来生成对原始权重的更新。
这意味着在模型推理或应用于实际任务时,原始模型的权重通过与A
和B
的低秩更新相结合来动态调整,以适应特定任务的需求。
低秩矩阵 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的使用是一种权衡,旨在强化模型在特定任务上的性能,即使这可能牺牲模型在其他未特化任务上的通用性。这种方法体现了在特定应用领域内实现最佳性能的深度学习模型微调策略,而非追求一个模型在所有任务上的平均表现。