| 1 | # 01_cover |
| 2 | |
| 3 | 今天我们一起读一篇对大模型微调影响深远的论文,LoRA,低秩适配。它来自微软,二零二一年发表。一句话概括它的贡献:冻结预训练权重,只往每一层注入一对很小的低秩矩阵,就能用万分之一的可训练参数,达到甚至超过全量微调的效果,而且推理时不增加任何延迟。接下来我会从问题、方法、实验到背后的原理,带大家完整走一遍。 |
| 4 | |
| 5 | --- |
| 6 | |
| 7 | # 02_agenda |
| 8 | |
| 9 | 我们按六个部分展开。先看问题:为什么模型越大,微调越来越贵;再看已有方法为什么不够好;然后是这篇论文的核心洞察,低秩假设;接着重点讲 LoRA 的方法与实现细节;之后用实验结果验证它;最后讨论该适配哪些权重、秩要取多大,以及它对整个行业的意义。重点会落在第四和第五部分。 |
| 10 | |
| 11 | --- |
| 12 | |
| 13 | # 03_problem |
| 14 | |
| 15 | 先说清楚痛点:模型越大,全量微调就越不可行。全量 fine-tuning 会更新模型的全部参数,得到的新模型和原模型一样大。以 GPT-3 一千七百五十亿参数为例,每适配一个下游任务,就要存一份完整的满参数副本。如果你有很多任务,存储和切换的成本就是任务数乘以一千七百五十亿,这已经从早年的"不太方便"升级成了真正的部署难题。 |
| 16 | |
| 17 | --- |
| 18 | |
| 19 | # 04_limitations |
| 20 | |
| 21 | 那已有的高效适配方法为什么不够好?主要有三类局限。第一,Adapter 在网络里插入额外的层,加深了模型,会带来推理延迟,在线上、短序列、小批量的场景下尤其明显。第二,prefix 或 prompt tuning 用可训练的前缀 token 来适配,会挤占本就宝贵的输入序列长度。第三,也是最关键的,这些方法往往达不到全量微调的质量基线,逼着大家在效率和质量之间二选一。LoRA 想打破的,正是这个权衡。 |
| 22 | |
| 23 | --- |
| 24 | |
| 25 | # 05_insight |
| 26 | |
| 27 | LoRA 的出发点是一个很漂亮的洞察:权重的更新其实是低秩的。已有研究发现,过参数化的大模型实际上存在于一个很低的内在维度上。作者顺着这个思路假设,模型在适配下游任务时,权重的变化量 Delta W 也具有很低的内在秩。这个推论很激进:即使权重的满秩高达一万两千多,实际需要的秩可能只有一或二就够了。 |
| 28 | |
| 29 | --- |
| 30 | |
| 31 | # 06_method |
| 32 | |
| 33 | 基于这个假设,方法就非常简洁:冻结原始权重 W 零,在它旁边并联一条低秩旁路。具体说,把权重的更新约束成两个小矩阵的乘积 B 乘 A,前向传播时输入 x 同时经过冻结的 W 和这条旁路,两路输出相加得到 h。训练时 W 零完全不动,只更新 A 和 B 这两个小矩阵。初始化上,A 用高斯随机,B 置零,所以训练一开始旁路的贡献是零,不会扰动原模型。 |
| 34 | |
| 35 | --- |
| 36 | |
| 37 | # 07_implementation |
| 38 | |
| 39 | 实现上有两个细节值得一提。第一是缩放:旁路的输出会乘上一个 alpha 除以 r 的系数,而 alpha 直接设成你尝试的第一个 r,之后就不再单独调它,这样变更秩的时候不用反复重调超参。第二是部署:上线时可以显式把 B 乘 A 合并进权重,得到一个和原模型完全同构的 W,所以不引入任何额外的推理延迟。要换任务也很简单,减掉当前的 BA,再加上另一个任务的 B 撇 A 撇就行,开销极小,非常适合多任务在线热插拔。 |
| 40 | |
| 41 | --- |
| 42 | |
| 43 | # 08_transformer |
| 44 | |
| 45 | 在 Transformer 上,作者做了一个克制的选择。自注意力里有四个投影矩阵,查询、键、值、输出,论文在大多数实验里只给查询和值这两个矩阵加 LoRA,MLP 模块整个冻结,这是出于简洁和参数效率的考虑。可训练参数量只随秩 r 线性增长。效果非常惊人:在 GPT-3 上,训练显存从一点二个 TB 降到三百五十个 GB,大约只剩三分之一;而检查点的大小从三百五十个 GB 直接降到三十五个 MB,缩小了约一万倍。 |
| 46 | |
| 47 | --- |
| 48 | |
| 49 | # 09_advantages |
| 50 | |
| 51 | 把这些好处归纳一下,LoRA 有四个关键优势。第一,可共享:一个预训练底座可以挂很多个小 LoRA 模块,换任务只换 A 和 B,存储成本极低。第二,训练高效:不用为冻结的参数保存梯度和优化器状态,硬件门槛最高能降到三分之一。第三,零推理延迟:合并权重后和全量微调模型完全同构。第四,正交可叠加:它和很多已有方法互不冲突,比如可以和 prefix-tuning 组合使用。 |
| 52 | |
| 53 | --- |
| 54 | |
| 55 | # 10_latency |
| 56 | |
| 57 | 我们用数据来验证"零延迟"这个说法。这张图是 GPT-2 medium 上单次前向的延迟增幅,在 RTX8000 上测了一百次取平均。可以看到,Adapter 的两个变体都会带来延迟:在长序列配置下还比较小,只有百分之二到三;但到了短序列、小批量这种典型的在线场景,Adapter L 增加了百分之二十点七,Adapter H 更是高达百分之三十点三。而 LoRA 因为可以合并权重,和全量微调一样,额外延迟是实打实的零。 |
| 58 | |
| 59 | --- |
| 60 | |
| 61 | # 11_setup |
| 62 | |
| 63 | 实验覆盖了从理解到生成的四类模型。自然语言理解这边,用 RoBERTa 的 base 和 large,还有十五亿参数的 DeBERTa XXL,都在 GLUE 上评测;生成这边,用 GPT-2 medium 跑 E2E 数据集;最后放大到 GPT-3 一千七百五十亿参数,在 WikiSQL、MNLI 和 SAMSum 上做压力测试。对比的基线也很全,包括全量微调、BitFit、前缀类方法,以及 Adapter 的四个变体,而且尽量复用了前人论文里报告的数值,保证公平。 |
| 64 | |
| 65 | --- |
| 66 | |
| 67 | # 12_glue |
| 68 | |
| 69 | 先看 GLUE 的结果,结论是:用更少的参数,持平甚至更优。RoBERTa base 全量微调要训一亿两千五百万参数,平均分八十六点四;LoRA 只训三十万参数,平均分反而是八十七点二。RoBERTa large 上,三亿五千五百万对零点八百万,得分八十八点九对八十九点零。最大的 DeBERTa XXL 上,十五亿对四百七十万,九十一点一对九十一点三。也就是说,LoRA 用大约三四百分之一的可训练参数,在三类模型上都做到了持平或略优。 |
| 70 | |
| 71 | --- |
| 72 | |
| 73 | # 13_gpt3 |
| 74 | |
| 75 | 真正的压力测试是 GPT-3 一千七百五十亿参数,结论依然成立。这里有四个关键数字:可训练参数缩减了约一万倍,检查点从三百五十个 GB 降到三十五个 MB;训练显存从一点二个 TB 降到三百五十个 GB,大约三分之一;训练吞吐还提升了约百分之二十五,因为绝大多数参数不需要算梯度;而在 WikiSQL、MNLI、SAMSum 三个任务上,准确率都达到或超过了全量微调。效率和质量,这次真的可以兼得。 |
| 76 | |
| 77 | --- |
| 78 | |
| 79 | # 14_understanding |
| 80 | |
| 81 | 论文还往前追问了两个问题。第一,该给哪些权重加 LoRA?在同样的参数预算下,同时适配查询和值这两类权重效果最好,比只堆在单一类型上更划算。第二,秩到底要取多大?这是最反直觉的发现:对查询加值的组合,秩等于一时准确率就有七十三点四,一路加到六十四几乎没有提升。右边的子空间相似度热力图也印证了这一点,不同秩学到的主奇异方向高度重叠,说明权重更新的内在秩确实极低。 |
| 82 | |
| 83 | --- |
| 84 | |
| 85 | # 15_conclusion |
| 86 | |
| 87 | 最后做个总结。从方法本身看,低秩适配等于参数高效、零额外推理延迟,再加上质量持平甚至更优。从工程意义看,它让一个预训练底座就能托管很多任务,按需热插拔 LoRA 模块,部署成本大幅下降。从行业影响看,LoRA 已经开源,成为今天大模型高效微调,也就是 PEFT 生态的基石之一。它最大的价值,是让我们不必再在效率和质量之间二选一。谢谢大家。 |
| 88 |