- 阶段一 · 地基:P01《Attention Is All You Need》 · P02 Bahdanau Attention · P03 seq2seq · P04 word2vec
- 阶段二 · 预训练范式:P05 BERT · P06 GPT-1 · P07 GPT-2 · P08 GPT-3 · P09 T5
- 阶段三 · 规模与效率:P10 Scaling Laws · P11 Chinchilla · P12 LoRA · 本篇 · P13 FlashAttention · P14 MoE
- 阶段四 · 对齐与推理:P15 InstructGPT(RLHF)· P16 思维链 CoT · P17 DPO · P18 Constitutional AI
- 阶段五 · 检索与 Agent:P19 RAG · P20 ReAct · P21 Toolformer
太长不读2021 年,GPT-3 已经证明了「大」的威力,但它留下一张没人接的账单:微调(fine-tuning,把预训练模型在你自己的数据上再训一遍,让它专精你的任务)要求更新全部 1750 亿参数——训练时光是优化器状态就吃掉 1.2TB 显存,训完每个任务还得存一份 350GB 的完整模型;接一百个客户,就是 35TB。OpenAI 的官方回避方案是 few-shot 提示(P08 讲过),但这篇论文附录里放了张诚实的对照表:MNLI 任务上 few-shot 考 40.6 分,微调考 89.5 分——微调不是不好,是掏不起。微软的 LoRA 给出的解法漂亮到近乎狡猾:预训练权重一个都不动,在矩阵旁边并联一块由两个瘦长小矩阵相乘构成的低秩「补丁」,只训练它。补丁多小?GPT-3 上可训练参数直接砍一万倍,检查点从 350GB 缩到 35MB。效果呢?从 1.25 亿参数的 RoBERTa 到 1750 亿的 GPT-3,全线与全量微调打平或反超。最妙的是部署时补丁可以直接加回原矩阵——推理延迟一毫秒都不多。今天 HuggingFace 上铺天盖地的社区微调模型、Stable Diffusion 世界里论 MB 分发的风格插件、手机端侧 AI 的适配器架构,跑的都是这套逻辑。
上篇回顾 · 先答一题上一篇 Chinchilla 讲完,训练的账本改成了「参数与数据等比放大」。先别往下翻,试着答:同一笔算力,Chinchilla 凭什么打败比它大 4 倍的 Gopher?……答案:它不更大,但吃得更饱——700 亿参数×1.4 万亿 token 对 2800 亿×3000 亿,大约每个参数配 20 个 token。但那本账只管到「模型训好」为止。训好之后,普通团队想让它干自己的活——客服、写 SQL、公文摘要——还有一笔从没人细算过的账。今天这篇,就是把这笔账一口气砍掉四个数量级的人。
01微调掏不起:GPT-3 留下的账单
先看问题出在哪。「预训练 + 微调」是 NLP 的统治范式(P05 BERT、P06 GPT-1 两篇讲过):先在海量通用语料上练出一个什么都懂一点的底座,再在你自己的数据上「再训一遍」,让它专精一件事。这套范式有个从没人明说的前提:模型得小到「再训一遍」训得起。BERT 时代 3 亿参数,人人训得动,这个前提近乎空气——没人注意它存在。
GPT-3 把前提炸了。全量微调在数学上意味着:学到的「改动量」和原模型一样大——1750 亿参数的模型,每接一个下游任务,就要再训、再存一份 1750 亿的改动。论文把账摊开:训练时 Adam 优化器要为每个参数维护动量和方差状态,显存吃到 1.2TB——那是几十张顶级显卡只为「存中间状态」;训完的检查点 350GB 一份;如果你是服务商,一百个客户各要一个专属模型,那是 35TB 的存储和一百次天价训练。任务一多,这条路在物理上就走死了。
你可能想起 P08:OpenAI 自己的答案不就是不微调吗——few-shot 提示,把例题写进输入,参数一个不动。但这篇论文的附录里放了一张 OpenAI 没放进正文的对照表:同一个 GPT-3,MNLI 推理任务上 few-shot 拿 40.6 分,微调拿 89.5 分;RTE 上 69.0 对 85.4。差距不是几分,是断崖。微调的效果是真的,账单也是真的——这才是 2021 年真实的两难。
于是论文把问题钉死(第 2 节,问题陈述):能不能不学那份与原模型同样大的改动量,改用一组小得多的参数把它编码出来?作者给自己定的指标狠到发指:这组参数,要小到原模型的 0.01%——万分之一。
02前人两条路,各有一处暗伤
「少训点参数」不是新问题,迁移学习诞生起就有人做,2021 年时主流是两条路。论文第 3 节的标题问得很冲:现有方案还不够好吗?答案是各有一处生产环境容不下的暗伤。
路一,适配器(adapter):2019 年谷歌提出,往 Transformer 的每一层里串行插一个小瓶颈层,只训它。参数确实省(有的版本不到原模型 1%),但暗伤在「串行」二字:大模型压延迟靠硬件并行,而插进去的层必须等前面算完才能开工,这笔时间躲不掉。在线服务最疼——batch 只有 1、序列不长时,GPT-2 medium 实测延迟多 20.7% 到 30.3%(Table 1,就是上图那张表)。模型一旦大到要切片分机,适配器还要额外付一轮轮同步通信的钱。
路二,前缀微调(prefix tuning):反过来,模型完全不动,学一段「虚拟前缀」拼在输入前面——相当于学一句最优的开场白。暗伤有二:一是难训,性能随可训练参数非单调地起伏(论文实测,原作者自己也承认);二是前缀占序列长度——上下文窗口本来就金贵,前缀吃掉一截,留给正经任务的地方就短一截。
把两条路放在一起看,2021 年的格局是一道选择题:要么加延迟,要么吃窗口,要么掉效果——总得中一样。LoRA 的野心,是一样都不中。
03方法:在权重旁边并联一块低秩补丁
灵感来自一个反直觉的前作发现(Li et al. 2018;Aghajanyan et al. 2020):大模型的学习其实「活」在一个低维空间里——把上亿维的优化问题随机投影到一个小得多的子空间,居然照样学得动。极端到什么程度?前作实测:只训 200 个随机投影出来的参数,就能让 RoBERTa 摸到全量微调九成的效果。术语叫内在维度(intrinsic dimension,问题实际需要的自由度,远小于名义参数量)。LoRA 团队把这个观察往前推一步,变成自己的核心假设:微调时权重的「改动量」ΔW,内在秩也很低。秩(rank)可以理解成一个矩阵里真正独立的信息方向数——满秩是几万,低秩意味着真正有用的方向屈指可数。
假设成立的话,解法就顺理成章了,全文核心是一行公式:h = W₀x + BAx。预训练权重 W₀ 整个冻住,不收梯度;旁边并联两个瘦长的小矩阵 B(d×r)和 A(r×k),秩 r 远小于维度 d——它们的乘积 BA 就是那块「补丁」,全部的训练只发生在这里。两个初始化细节透着讲究:A 用随机高斯,B 用全零——于是训练开始的那一刻 BA=0,模型和预训练状态一字不差,任务知识由梯度慢慢注入补丁;再配一个 α/r 的缩放系数,换不同的 r 时不必重调学习率。
r 能小到什么程度?GPT-3 注意力矩阵的维度是 12288,论文说 r 取 1 或 2 就够用(证据压在第 05 节)。感受一下参数差:一个 12288×12288 的矩阵约 1.5 亿参数;换成 r=1 的补丁,A、B 加起来约 2.5 万——单个矩阵省六千倍。
更漂亮的是三个设计红利,逐条回应上一节的暗伤。红利一,可合并,零延迟:因为补丁和原矩阵是并联相加的关系,上线前直接算好 W = W₀ + BA 存成一个矩阵,推理路径和原模型逐字节相同——适配器的串行层永远拆不掉,LoRA 天生可折叠。红利二,换任务等于换补丁:减掉 BA、加上另一个任务的 B′A′,底座常驻显存,任务热插拔——一台机器伺候一百个客户成为可能。红利三,不吃窗口:和前缀微调相反,输入序列原封不动。三处暗伤,一个不中。
最后把账单拍在桌上(GPT-3 175B,r=4,只给注意力的 query、value 两类矩阵贴补丁):可训练参数约 1800 万,只有原模型的约万分之一;不用再给冻结参数存优化器状态,训练显存从 1.2TB 降到 350GB;每个任务的检查点从 350GB 缩到 35MB,整整一万倍;训练还因为少算梯度而提速 25%(吞吐从每卡每秒 32.5 个 token 涨到 43.1)。存一百个客户的模型?354GB——不再是 35TB。
04放榜:从 1.25 亿到 1750 亿,全线打平或反超
省钱的方案见得多了,省钱又不掉分的才稀罕——所以这篇论文实验的野心不是挑一个模型证明能用,而是从 1.25 亿参数横扫到 1750 亿,理解类、生成类任务全覆盖。
理解类(GLUE 基准):RoBERTa base 上,LoRA 只训 0.3M 参数,平均分 87.2,比全量微调 125M 参数的 86.4 还高;换到 15 亿参数的 DeBERTa XXL,LoRA 训 4.7M 拿 91.3,全量微调训 15 亿拿 91.1——打平。生成类:GPT-2 medium 在 E2E 数据集上,LoRA 训 0.35M 参数 BLEU 70.4,全量微调训 354.92M 拿 68.2——千分之一的参数,反超两分。
压轴是 GPT-3 175B(上图 Table 4):WikiSQL(自然语言转 SQL)73.4 对全量微调的 73.8,误差带内持平;MNLI-m 推理 91.7 对 89.5,反超两分多;SAMSum 对话摘要三项指标全胜。也就是说,在最贵、最需要省钱的那个模型上,万分之一参数的补丁不仅没输,还赢了。
同页的 Figure 2 藏着最扎心的细节:给前缀系方法加可训练参数,分数反而掉——超过 256 个特殊 token 后性能明显下滑,作者怀疑是过长的前缀把输入分布拽离了预训练分布;而 LoRA 的曲线随参数单调稳定。「加参数不一定加分」这句话,偏偏在对照组身上应验了。
论文也诚实列了短板:如果为了零延迟把补丁合并进底座,同一个 batch 里就没法混着跑不同任务的样本(补丁切不开);要混就别合并,牺牲一点延迟。工程没有免费午餐,LoRA 只是把午餐钱砍到了零头。
05为什么行:改动量的「内在秩」低得离谱
到这里论文已经可以收工了,但第 7 节偏偏是全文含金量最高的部分:不满足于「能用」,追问为什么能用。四连问,一问比一问深。
问一:预算固定,补丁贴哪?Transformer 每层注意力里有 query、key、value、output 四类矩阵。固定 1800 万参数的预算:全押给 query(r=8),WikiSQL 只有 70.4;分给 query+value(r=4),73.7;摊给全部四类(r=2),73.7、MNLI 91.7,最优。结论很反直觉:宁可每块补丁更薄,也要多贴几类矩阵——覆盖面比单点深度值钱。
问二:r 到底要多大?Table 6 是全文最惊人的一张表:适配 query+value 时,r=1 拿 73.4/91.3,r=64 拿 73.5/91.4——1 维和 64 维,几乎无差。一个 12288 维的矩阵,微调真正需要的改动,1 个方向就装下了。
问三:凭什么说加秩没用?作者用奇异值分解(把矩阵拆成一组按重要性排序的方向)做了个漂亮的对照:r=8 和 r=64 各训一遍,比较学到的方向——头部方向高度重合,其余方向与随机噪声难以区分;换两个随机种子重训,结论一样。加出来的那几十个秩,装的多半是训练噪声,不是知识。
问四(最深):补丁到底学了什么?把 W 投影到 ΔW 的子空间里量一量:ΔW 既不是 W 的复读——它和 W 的头部主方向几乎不重合;也不是凭空的新知识——它与 W 的相关性比随机矩阵强上百倍。真相是第三种:ΔW 放大的,恰恰是 W 里已经存在、但预训练没有强调的方向,r=4 时放大系数约 21.5 倍。
把四个答案收束成一句直觉:预训练已经把几乎所有本领学进了底座,微调不是教新课,是把其中几个方向的音量旋钮拧大。要改的信息本来就不多,所以补丁才可以薄到万分之一。这一段顺便照亮了整个系列——P05 BERT 以来「预训练 + 微调」为什么如此便宜好用?因为预训练学到的表征真的足够通用,下游要做的只是「调音」。
06后日谈:一块补丁,长成了一个生态
按系列惯例,讲讲这篇论文后来的命运——它可能是 21 篇里「落地半径」最大的一篇。论文配套开源了 microsoft/LoRA 代码库;如今 HuggingFace 的 PEFT(参数高效微调)库把 LoRA 做成默认方法,社区里你能下载到的微调模型,十有八九是一块 LoRA 补丁。
第一波放大来自 QLoRA(2023):把冻结的底座压成 4 位精度、再贴 LoRA 补丁,微调 650 亿参数模型的显存需求从 780GB 以上直落到 48GB 以内——一张卡就够,训出的 Guanaco 模型自报摸到了 ChatGPT 99% 的水平。论文里「万分之一」的承诺,两年后兑现成「一张消费级显卡」。第二波在圈外,舞台是图像生成:Stable Diffusion 社区把 LoRA 玩成了「风格插件」——一个画风、一个角色,就是一个几十到几百 MB 的补丁文件,一张 12GB 的家用显卡一个下午就能训一个,创作者在模型分享站上传下载、组合叠加,底座只需一份。「一个底座 + 热插拔补丁」从论文第 4 节的部署技巧,长成了一门创作者经济——一篇写给 GPT-3 的论文,在画图圈过上了作者没料到的第二人生。第三波进了口袋:苹果公开的端侧 AI 架构,正是手机里常驻一个约 30 亿参数的底座、按任务动态加载适配器——和论文畅想的部署形态如出一辙。
当然,账没有只赚不赔的。2024 年一篇标题很妙的论文《LoRA Learns Less and Forgets Less》给出冷静的边界:学全新领域(比如从头学代码),补丁确实不如全量微调学得多;但反过来,它对底座原有能力的破坏(灾难性遗忘)也轻得多——学得少,忘得也少,效果上近似一种温和的正则化。「万分之一」不是免费午餐,是一种取舍——恰好,绝大多数下游任务要的正是「小改动、别伤底子」,取舍站在了 LoRA 这边。
放进系列的时间线里看:Chinchilla 把训练的账算清了——参数与数据等比放大;LoRA 把适配的账砍平了——冻住底座、只训补丁。到 2022 年,大模型「造出来」和「用起来」的两笔大账都有了答案。但引擎盖底下还压着一头吞金兽:注意力机制本身,对序列长度是平方级的开销——序列翻 10 倍,计算翻 100 倍。这笔账,从 P01 就埋下了。
✎读完自测:先别往下翻,试着答
主动回忆一遍才记得住。三问,想好再看答案:
- 1. LoRA 与适配器同是「少训参数」,为什么部署后 LoRA 零延迟,适配器做不到?
- 2. B 矩阵为什么要全零初始化?
- 3. 「r=1 就够用」的背后,论文给出的机制解释是什么?
答案1. 结构不同:LoRA 的补丁与原矩阵是并联相加(W₀ + BA),上线前可以直接合并成一个矩阵,前向计算与原模型逐字节相同;适配器是串行插层,多出来的层永远要排队算,硬件并行也救不了。2. 让补丁 BA 在训练起点恒等于零——模型从「原封不动的预训练状态」出发,一开始不添乱,任务知识由梯度逐步注入,训练稳定且不用热身。3. ΔW 不是在学新本领,只是放大 W 里已有但未被强调的方向(r=4 时约 21.5 倍)——要改的信息本身就是低秩的,1 个方向常常就够。
→一句话带走,和下一步
只记一句:LoRA 冻住全部预训练权重,在矩阵旁并联一块低秩补丁(h = W₀x + BAx),用万分之一的可训练参数从 RoBERTa 一路到 GPT-3 全线追平或反超全量微调,checkpoint 从 350GB 缩到 35MB、推理零延迟——微调从此由实验室特权变成平民手艺;它还顺手证明了一件更深的事:预训练学会了一切,微调只是调音量。
启后:适配的钱省下了,但训练和推理里还剩那头吞金兽——注意力对序列长度的平方级开销,上下文一长就爆。2022 年斯坦福的一篇论文给出的解法气质和 LoRA 截然相反:数学一个字不改,只改数据在显卡里的搬运顺序,注意力就快了 2 到 4 倍,长上下文从此可行。下一篇 P13《FlashAttention》,讲算法如何向硬件低头,又赢回一切。
想再深入一点荐读一个最优源:Sebastian Raschka 的《Practical Tips for Finetuning LLMs Using LoRA》(magazine.sebastianraschka.com,免费公开)——作者亲手跑了几百组 LoRA 实验,把 r 怎么选、贴哪些矩阵、学习率怎么配讲得最实在。原论文:arXiv 2106.09685;关键前作:Aghajanyan et al. 2020(内在维度,arXiv 2012.13255)、Houlsby et al. 2019(适配器,arXiv 1902.00751)、Li & Liang 2021(前缀微调,arXiv 2101.00190);实践延伸:QLoRA(arXiv 2305.14314)。/ 互动钩子:如果你手里有一张 24GB 的消费级显卡和一批私有数据,你会选 LoRA 微调,还是继续堆提示词?评论区聊聊你的账怎么算。