跳到主要内容

LoRA — 低秩适配与微调实践

这一章讲三件事: LoRA 靠什么假设立住、怎么把显存账算下来(本章主走查);三个变体各补哪块短板;以及落地工具与两个垂域案例。

链条位置:第 09 章的附加法要动结构、选择法挑不准;LoRA 是低秩路线——今天开源社区微调的事实标准,没有之一。

1. 顶层全景

全量微调:W = W0 + ΔW → ΔW 与 W0 一样大,d×k 个参数全要梯度
LoRA: W = W0 + α·B·A → B(d×r) · A(r×k),r 很小,只学 B 和 A
训完可合并回 W0,推理零延迟,还能拔下来当插件
图说:赌注只有一个——「ΔW 是低秩的」。赌赢,参数省千倍;赌输,性能上限受限(第 4 节)。

2. 主走查:从假设到显存账

2.1 赌注:低维固有维度假设

LoRA 的理论地基是一条实验发现:过参数化模型的固有维度很低——存在一个低维的参数更新,效果能与全量更新媲美1。翻译成人话:适配一个下游任务,不需要改动那几十亿个数里每一个;真正的改动方向可能只有几十个。既然如此,干脆把更新矩阵 ΔW 拆成两个瘦长矩阵的乘积:W = W0 + α·B·A,其中秩 r 远小于维度2

初始化有个精心的细节:B 用随机高斯、A 用全零——相乘正好为零,训练起点就是原始模型,不会一上来就把模型搅乱;α 是缩放因子,控制增量的力度3。训练时只更新 B 和 A,参数量 r×(d+k),远小于全量的 d×k4。原论文把 LoRA 放在注意力层的权重矩阵上,后续工作发现放到 FFN 层效果更好5

2.2 走查:一层的账本

拿 LLaMA2-7B 的第一个 FFN 层算账(书给的实算)6:

全量微调:11,008 × 4,096 = 45,088,768 个参数要存梯度、存优化器状态
LoRA r=4:(11,008×4) + (4×4,096) = 60,416 个
→ 不到原来的千分之一(45,088,768 ÷ 60,416 ≈ 746 倍)
图说:一层如此,整座塔乘上去就是几十 GB 的差距。

显存账要分四块看。

  • 权重内存:存模型本体;批量(一次一起处理的条数)越大,后面几项都跟着涨。

  • 激活内存:前向传播(从输入往输出算一遍)的中间量,随序列长度涨。

  • 梯度内存:只对可训练参数算——LoRA 这里省。

  • 优化器(帮参数往最优走的那套调参算法,如 Adam;算法,即一套明确的计算步骤)内存:它要给每个可训练参数存一阶和二阶动量,LoRA 这里省得最狠7

书引的实测(LLaMA2-7B,批量 1,单张 RTX4090 24GB):全量微调约 60GB 直接放不下;LoRA 约 23GB 能跑——优化器内存省约 25GB、梯度内存省约 14GB,增量参数多占的那约 2GB 可以忽略;反向传播计算量也小了,速度快 1.9 倍8。这与第 09 章「LLaMA2-7B 要近 60GB、4090 装不下」的账正好对上:LoRA 把不可行变成可行。

两个白送的礼物:训练完 B·A 可以合并回原权重,推理零额外延迟;B 和 A 也能不合并,拔下来当插件——一个底座挂多个任务适配器,封装共享复用9

3. 三个变体,补三块短板

LoRA 不是终点,书按三个改进方向梳理变体10:

  • 秩瓶颈:低秩限制了模型记忆新知识的能力——实验表明全量微调的「秩」显著高于 LoRA(10–100 倍),加大 r 能缩小差距11。ReLoRA 的办法是「合并再重置」:周期性地把 LoRA 合并进原模型,然后重新初始化 B 和 A 再练——多次低秩更新累积成高秩效果12

  • 动态秩分配:秩也不是越大越好,冗余的秩浪费还伤性能;而且不同层的重要度不同,该有的层多给、该省的层少给。AdaLoRA 把更新矩阵写成奇异值分解的形式,按重要性得分迭代剪掉不重要的奇异值,还加了正交惩罚项保稳定13

  • 训练过程:LoRA 收敛比全量慢、对超参敏感、容易过拟合。DoRA 把权重分解成「大小 × 方向」两个成分,只对方向施加 LoRA——约束了更新方式,训练更稳14

4. 插件化:LoRAHub 与任务迁移

LoRA 可插拔的特性长出了一个独立玩法。LoRAHub:把不同任务上训好的多个 LoRA 插件做逐元素线性加权组合(每个矩阵各乘一个权重——这里只是个普通的数(标量)——再相加、相乘),再用无梯度优化方法在少量新任务示例上自动学这些权重——组合出解决新任务的能力,「适应+组合」迭代 k 次直到收敛(稳定不再变化)15。这是第 09 章 AdapterFusion 思想的 LoRA 版,但更轻:不用再训融合模块的注意力,只搜几个标量权重。

5. 落地工具与垂域案例

5.1 框架与参数

落地工具首选 Hugging Face 的 HF-PEFT 库:集成 LoRA/Adapter/Prompt-tuning/IA3,与 Transformers、Accelerate 无缝衔接,支持从单机到分布式,还能与模型量化叠加进一步省内存16。使用流程五步:装库→选模型与数据→定微调策略→配置加载→训练。书给了可抄的参数默认17:

参数建议值含义
r4 / 8 / 16(小数据更小)秩,控制更新矩阵复杂度
lora_alpha与 r 反比搭配缩放因子,保持更新力度一致
lora_dropout(dropout:训练时随机掐掉一部分连接的防过拟合手法)0.01 左右正则防过拟合
target_modulesq/k/v 矩阵或全部线性层挂在哪些模块上
num_virtual_tokens(Prompt Tuning 用)10–20软提示长度

先备好两个词:序列化(把表格一行拍平成一句自然语言)。

基线,即拿来对比的标准做法。

5.2 两个垂域案例

FinSQL(金融 Text-to-SQL):提示构造→PEFT 微调(用 LoRAHub 融合多个 LoRA 模块提少样本性能)→输出校准(修语法错误+Self-Consistency 选一致答案)——把第 08 章的 Text-to-SQL 与本章的 PEFT 缝在一条流水线上18TabLLM(表格分类):表格数据「缺乏局部性、类型杂、特征少」,传统深度学习(多层的数学机器)难直接用。

做法是把表格行序列化成句子,再用 LoRA 在少量带标样本上微调,多个基准上超过梯度提升(一种老牌表格神器)树等强传统方法,即超过这些基线19

6. 作者的判断与证据

背景词:机器学习(让机器从数据里自己找规律);深度学习(多层的数学机器)是它的分支。

  • 给了证据的:45,088,768 vs 60,416 的逐参数算例;RTX4090 四块显存的实测拆账(引文献);全量秩 10–100 倍于 LoRA(引实验研究);TabLLM 超梯度提升树。

  • 书的判断:「LoRA 是经典的低秩适配方法,后续变体进一步改进」——注意书同时记录了反面:在数学推理等复杂任务上,LoRA 与全量微调仍有差距;「LoRA 学得少忘得少」是它引的论文标题级别的结论20

  • 诚实的提醒:变体一节的三条短板(秩瓶颈/超参敏感/收敛慢)意味着 LoRA 不是免费的午餐,是「大多数场景划算」的工程选择。

7. 边界与局限

  • 20 倍数据配比(第 04 章)与 LoRA 的低秩约束是两种「省」:前者省算力、后者省显存,别混为一谈。

  • 书未量化「合并 vs 不合并」的工程细节:多 LoRA 并行服务、热切换等运营话题(S-LoRA 一类工作)只出现在参考文献。

  • FinSQL/TabLLM 的成绩是各自论文的基准,跨任务外推(拿去套自己场景)要小心;表格序列化的模板选择对 TabLLM 影响很大,书未展开。

  • 量化+LoRA(QLoRA 一类)只以 Guanaco 的名义在衍生模型清单里出现过一次,机制不在本书。

8. 可带走的

  1. 低维固有维度假设:大模型的任务适配活在低维空间——LoRA 的全部赌注。
  2. B 高斯、A 置零:训练从原模型平滑出发。
  3. 一层的账:4500 万→6 万,千分之一;优化器省 25GB 是大头,梯度再省 14GB。
  4. RTX4090 24GB 能 LoRA 微调 7B(约 23GB),全量要 60GB——可行性差距。
  5. 可合并(推理零延迟)也可插拔(插件共享)——LoRA 赢过 Adapter 的关键。
  6. 全量的秩是 LoRA 的 10–100 倍:复杂任务上 LoRA 仍有差距,ReLoRA/加大 r 是补救。
  7. 实操起步:r=4/8/16、alpha 与 r 反比、dropout 0.01、先挂 q/k/v。
  8. LoRAHub 加权组合多任务插件;FinSQL 与 TabLLM 是「PEFT+Prompt」的组合拳范本。

9. 原文地图

主题原书章原文位置
低维固有维度假设4.4 低秩适配方法text/13-ch04.txt:719(搜「固有维度」)
ΔW 低秩分解4.4.1 LoRAtext/13-ch04.txt:757(搜「分解为两个低」) · text/13-ch04.txt:763(搜「高斯分布和零」)
参数量对比与 FFN 更优4.4.1 LoRAtext/13-ch04.txt:766(搜「远」) · text/13-ch04.txt:772(搜「FFN」)
零延迟与可插拔4.4.1 LoRAtext/13-ch04.txt:776(搜「推理延」) · text/13-ch04.txt:782(搜「可插拔」)
45M 对 60K 算例4.4.1 LoRAtext/13-ch04.txt:794(搜「11, 008」) · text/13-ch04.txt:800(搜「千分之一」)
四块显存与实测4.4.1 LoRAtext/13-ch04.txt:802(搜「权重内存」) · text/13-ch04.txt:820(搜「大约需要 60GB」) · text/13-ch04.txt:826(搜「25GB」) · text/13-ch04.txt:833(搜「1.9 倍」)
秩瓶颈 10-100 倍4.4.2 LoRA 相关变体text/13-ch04.txt:853(搜「10-100」)
ReLoRA 合并重置4.4.2 LoRA 相关变体text/13-ch04.txt:858(搜「merge-and-reinit」)
动态秩与 AdaLoRA4.4.2 LoRA 相关变体text/13-ch04.txt:880(搜「越高越好」) · text/13-ch04.txt:886(搜「AdaLoRA」)
DoRA 方向大小4.4.2 LoRA 相关变体text/13-ch04.txt:909(搜「收敛速度比全量微调要慢」) · text/13-ch04.txt:915(搜「DoRA」)
LoRAHub4.4.3 基于 LoRA 插件的任务泛化text/13-ch04.txt:941(搜「LoRAHub」)
HF-PEFT 框架4.5.1 PEFT 实践text/13-ch04.txt:1005(搜「HF-PEFT」)
参数默认值4.5.1 PEFT 实践text/13-ch04.txt:1092(搜「较小的值如 4」) · text/13-ch04.txt:1070(搜「10-20」)
表格数据与 FinSQL4.5.2 PEFT 应用text/13-ch04.txt:1117(搜「表格数据」) · text/13-ch04.txt:1153(搜「FinSQL」) · text/13-ch04.txt:1161(搜「LoRAHub 融合」)
TabLLM4.5.2 PEFT 应用text/13-ch04.txt:1225(搜「TabLLM」) · text/13-ch04.txt:1233(搜「梯度提升」)

Footnotes

  1. 出处:「4.4 低秩适配方法」第 719 段(text/13-ch04.txt:719,搜「固有维度」)。原文:「低维固有维度假设表明:过参数化模型的固有维度是很低的;换言之,存在可以与全参数更新媲美的低维的参数更新」。

  2. 出处:「4.4.1 LoRA」第 757 段(text/13-ch04.txt:757,搜「分解为两个低」)。式 4.9(W = W0 + αBA)在第 866 段(text/13-ch04.txt:866,搜「缩放因子」)。

  3. 出处:「4.4.1 LoRA」第 763 段(text/13-ch04.txt:763,搜「高斯分布和零」)。

  4. 出处:「4.4.1 LoRA」第 766 段(text/13-ch04.txt:766,搜「远」)。r×(d+k) 远小于 d×k;原论文用于注意力层、后续 FFN 更好在第 770 段(text/13-ch04.txt:770,搜「FFN」)。

  5. 出处:「4.4.1 LoRA」第 772 段(text/13-ch04.txt:772,搜「FFN」)。

  6. 出处:「4.4.1 LoRA」第 794 段(text/13-ch04.txt:794,搜「11, 008」)与第 800 段(text/13-ch04.txt:800,搜「千分之一」)。45,088,768 与 60,416 两个数分别在第 796、798 段(text/13-ch04.txt:796,搜「45, 088, 768」;text/13-ch04.txt:798,搜「60, 416」)。

  7. 出处:「4.4.1 LoRA」第 802 段(text/13-ch04.txt:802,搜「权重内存」)。四块内存(权重/激活/梯度/优化器)依次在第 802–814 段(text/13-ch04.txt:802text/13-ch04.txt:814);Adam 的一阶二阶动量在第 814 段(text/13-ch04.txt:814,搜「二阶动量」)。

  8. 出处:「4.4.1 LoRA」第 820 段(text/13-ch04.txt:820,搜「大约需要 60GB」)、第 826 段(text/13-ch04.txt:826,搜「25GB」)与第 833 段(text/13-ch04.txt:833,搜「1.9 倍」)。实验条件(LLaMA2-7B、批量 1、RTX4090 24GB)在同段(text/13-ch04.txt:132,搜「RTX4090」)。

  9. 出处:「4.4.1 LoRA」第 776 段(text/13-ch04.txt:776,搜「推理延」)与第 782 段(text/13-ch04.txt:782,搜「可插拔」)。

  10. 出处:「4.4.2 LoRA 相关变体」第 843 段(text/13-ch04.txt:843,搜「打破低秩瓶颈」)。三个改进方向:打破低秩瓶颈、动态秩分配、训练过程优化。

  11. 出处:「4.4.2 LoRA 相关变体」第 853 段(text/13-ch04.txt:853,搜「10-100」)。数学推理任务上的性能差距在第 839 段(text/13-ch04.txt:839,搜「性能差距」)。

  12. 出处:「4.4.2 LoRA 相关变体」第 858 段(text/13-ch04.txt:858,搜「merge-and-reinit」)。合并后重置、Kaiming 初始化与幅度剪枝在同段(text/13-ch04.txt:868,搜「Kaiming」)。

  13. 出处:「4.4.2 LoRA 相关变体」第 880 段(text/13-ch04.txt:880,搜「越高越好」)与第 886 段(text/13-ch04.txt:886,搜「AdaLoRA」)。正交惩罚项(式 4.12)在第 905 段(text/13-ch04.txt:905,搜「Frobenius」)。

  14. 出处:「4.4.2 LoRA 相关变体」第 909 段(text/13-ch04.txt:909,搜「收敛速度比全量微调要慢」)与第 915 段(text/13-ch04.txt:915,搜「DoRA」)。

  15. 出处:「4.4.3 基于 LoRA 插件的任务泛化」第 941 段(text/13-ch04.txt:941,搜「LoRAHub」)。线性加权组合(式 4.15)与无梯度方法 Shiwa 在第 957 段(text/13-ch04.txt:957,搜「组合阶段」;text/13-ch04.txt:966,搜「Shiwa」)。

  16. 出处:「4.5.1 PEFT 实践」第 1005 段(text/13-ch04.txt:1005,搜「HF-PEFT」)。量化兼容与多架构支持同段(text/13-ch04.txt:1015,搜「消费级硬件」)。

  17. 出处:「4.5.1 PEFT 实践」第 1070 段(text/13-ch04.txt:1070,搜「10-20」)与第 1092 段(text/13-ch04.txt:1092,搜「较小的值如 4」)。lora_alpha 反比、dropout 0.01、target_modules 分别在第 1096、1100、1104 段(text/13-ch04.txt:1096,搜「成反比」;text/13-ch04.txt:1100,搜「dropout」;text/13-ch04.txt:1104,搜「target_modules」)。

  18. 出处:「4.5.2 PEFT 应用」第 1153 段(text/13-ch04.txt:1153,搜「FinSQL」)。LoRAHub 融合与输出校准在同段(text/13-ch04.txt:1161,搜「LoRAHub 融合」;text/13-ch04.txt:1163,搜「Self-Consistency」)。

  19. 出处:「4.5.2 PEFT 应用」第 1213 段(text/13-ch04.txt:1213,搜「缺乏局部性」)与第 1225 段(text/13-ch04.txt:1225,搜「TabLLM」)。序列化为自然语言与超过梯度提升树在同段(text/13-ch04.txt:1227,搜「序列化」;text/13-ch04.txt:1233,搜「梯度提升」)。

  20. 出处:「4.4.2 LoRA 相关变体」第 839 段(text/13-ch04.txt:839,搜「性能差距」)与第 851 段(text/13-ch04.txt:851,搜「低秩瓶颈」)。