扳布的AI摘要
HunYuan-turbos

一、模型微调的本质

在深入探讨具体方法之前,我们首先需要理解模型微调的本质。

当我们发现一个预训练大模型在某一特定领域(如医疗、法律、代码生成)的能力不足时,我们会通过一些训练方法对模型进行更新,期望它在特定方面的能力得到提升。这个过程,本质上是对模型本身的一种改造

那么,我们如何改造一个模型呢?模型背后并非一个黑盒,而是由一系列参数(Parameters) 构成的复杂数学结构。你可以将这些参数想象成海量的、排列成行与列的数字。为了简化理解,我们假设一个微型模型只有3x3共9个参数,如下图所示:

改动的量

微调训练,就是让这些参数从原有状态(如0.1, 0.2, 0.3...)转变为新的状态(如0.2, 0.1, 0.4...)。这种转变,可以看作是在每一个原始参数上加上一个特定的“改动量”或“偏移量”

因此,微调的核心任务,就是学习这个“参数的改动量矩阵(ΔW)”。一旦我们学到了这个改动量,将其加到原始参数上,就能得到我们期望的新模型。

二、全量微调

第一种学习改动量的方法最为直观:对模型中的每一个参数都进行学习和更新。这种方法就是全量微调

如果原始模型有100亿个参数,那么全量微调就需要寻找这100亿个参数中每一个的具体改动量。这带来了两个直接的挑战:

  1. 巨大的计算资源消耗:同时优化百亿、千亿级参数,需要庞大的显存和算力。
  2. 过拟合与“灾难性遗忘”:对模型改动过大,可能导致模型在新任务上表现尚可,却丧失了原有预训练中获得的大量通用知识。

尽管全量微调理论上能达到非常高的性能上限,但其高昂的成本使得它对于大多数研究者和企业来说望而却步。

三、LoRA微调

有没有一种方法,能用更少的资源完成有效的微调呢?这就是高效微调 技术诞生的背景,而 LoRA 正是其中最具代表性的方法之一。

在介绍LoRA之前,我们先思考一个关键前提:微调过程中模型所承载的信息变化真的是海量的吗?

3.1 信息的冗余与低秩特性

想象一个场景:你让一个很啰嗦的人张三写一篇2000字的文章。虽然他写了2000字,但其核心思想可能用200字就能清晰表达。这说明,大量的输出中可能蕴含着高度冗余的信息

同理,尽管大模型有千亿参数,但我们在微调时希望模型增强的“能力”所对应的“信息增量”可能是有限的。我们并不想改变模型的全部,只想针对性地增强某一方面的特性。这意味着,我们想要学习的那个“参数改动量矩阵 ΔW”,其内部可能存在大量的冗余。

看上面这个矩阵,第二行可以由第一行×2得到,看似矩阵有三行,但是提供的有效信息只有两种,也就是说这个矩阵的秩是2

LoRA的核心思想正是基于一个数学假设:这个巨大的改动量矩阵 ΔW 是“低秩”的。

“秩” 可以简单理解为矩阵中真正独立、有价值的信息的维度。秩越低,说明冗余度越高,信息越集中。

3.2 LoRA的解决方案:低秩分解

LoRA提出,我们不需要直接学习那个巨大的原始改动量矩阵 ΔW(它可能有100亿参数)。相反,我们可以用两个更小的矩阵 AB 的乘积来近似表示它:

1
ΔW = A × B

这个过程就是低秩分解。我们来看看它是如何节省资源的:

假设原始矩阵 W 的维度是 1000 x 1000,那么:

  • 参数量 = 1000 * 1000 = 1,000,000 (100万)

现在我们用低秩矩阵 A 和 B 来近似 ΔW:

  • 矩阵 A 的维度: 1000 x r (rank,秩)
  • 矩阵 B 的维度: r x 1000
  • 总参数量 = 1000r + r1000 = 2000*r

关键点在于,这个秩 r 是一个我们可以设置的很小数值(通常为4, 8, 16, 32)。让通过一个表格感受一下参数量的变化:

总参数量 相对于原参数的百分比
r = 1 2000 0.2%
r = 8 16000 1.6%
r = 32 64000 6.4%

从上表可以清晰地看到,通过低秩分解,我们需要训练的参数数量骤降了1-2个数量级

3.3 LoRA的完整流程

  1. 我们冻结原始的预训练模型参数 W₀,不对其进行更新。
  2. 单独训练两个小矩阵 AB,它们相乘的结果 A × B 就是我们期望的“参数改动量” ΔW
  3. 在前向传播时,将LoRA分支的结果与主干相加:h = W₀x + BAx

四、结论

回到我们最初的问题:全量微调和LoRA微调有什么区别?

  • 全量微调像是重新塑造一个瓷器:你需要将整个胚胎融化,重塑每一个细节,过程费力且风险高。
  • LoRA微调则像是为瓷器贴上精美的釉彩或镶上金边:不改变其根本结构,只通过局部的、高效的修饰,就能让它焕然一新,适配新的场景。