你有个大模型,想在"你的业务"上再训一训,让它懂你的黑话、你的格式、你的脾气。
最"老实"的办法是全参数微调(Full Fine-tuning):把模型所有参数都当作可训练,在你这点数据上再跑一遍。结果你一算显存——光一个 70B 的模型,全参微调就要约 780G 显存(模型 + 优化器状态 + 梯度,一套 Adam 下来是参数的十几倍)。
别说个人了,一般公司的机器都扛不住。
但另一边,又有人拿着几百块的显卡,说自己"微调"了大模型,效果还不错。他们靠的是一样东西,叫LoRA(Low-Rank Adaptation,低秩适配)。
它最狂的地方在于:只训练原模型 0.1% 甚至更少的参数,就能达到接近全参微调的效果。凭什么呢?
先接受一个反直觉的事实:权重更新,很"瘦"
LoRA 的理论起点,是一个叫**低秩(low-rank)**的假设。
大模型微调前后的权重变化量,记作ΔW。LoRA 的核心假设是:这个ΔW虽然是满形状的大矩阵,但它的"信息量"是低秩的——也就是说,它可以被分解成两个小矩阵的乘积:
ΔW = B × A其中W是d × d的大矩阵,A是r × d,B是d × r,而秩r远小于d。
举个具体数字感受一下:假设d = 4096,ΔW有4096 × 4096 ≈ 1677 万个参数。取r = 16,那么A + B一共只有4096 × 16 × 2 ≈ 13 万个参数。
1677 万 → 13 万,缩了 128 倍。这就是"只动一点点参数"的底气。
为什么"只训 A 和 B"就够?
训练的时候,LoRA 把原模型的权重W冻结(不更新,不计算它的梯度),只在旁边挂一个B × A,微调时只更新A和B。推理时再把它合并回去:
W' = W + B × A为什么这样做能work?直觉是这样的:大模型经过预训练,已经"知道"了海量的通用知识,W里已经躺着近乎所有需要的信息。微调要做的,往往不是"重新学一遍",而是"在某个方向上小小地调整一下"。而这个"小调整",天然就是低秩的——你不需要把 1677 万个权重都动一遍,动 13 万个,就足以改变模型的行为方向。
省的不只是参数,是钱
LoRA 的收益是全方位的:
| 全参微调 | LoRA | |
|---|---|---|
| 可训练参数 | 100% | 通常 0.1% ~ 1% |
| 显存占用 | 巨大(十几倍参数) | 极小 |
| 训练速度 | 慢 | 快得多 |
| 产物 | 一整个新模型 | 一个小小的 LoRA 权重 |
| 切换任务 | 重新存一整套 | 换个 LoRA 权重就行 |
最后两行特别值钱:一个基座模型 + 一堆小小的 LoRA 权重,就相当于"一个底子,无数个分身"。今天做摘要挂一个,明天做客服挂另一个,切换成本几乎为零。
也正因为"省资源",LoRA 常和另一个省资源的技术——量化——配合使用:先用量化把模型压小,再挂 LoRA 微调,普通人也能在单卡上玩起来(为什么大模型从 14G 缩到 4G,还能照样"聪明"?——量化,一次讲透)。
LoRA 教会我们的,不只是技术
LoRA 背后那条"低秩假设",其实挺反直觉的:我们总以为"要改就得全改",但真相往往是——真正需要动的,只是冰山一角。
大到模型微调,小到改一段代码、修一个习惯,都是同一个道理:别一上来就推倒重来,先想想,是不是只要动那 0.1% 的关键处就够了。
当然,LoRA 也不是终点。它之后又冒出了 QLoRA(进一步量化)、DoRA、AdaLoRA 等等,方向都是同一个:用更少的资源,换更接近全参微调的效果。大模型越来越大的时代,"如何便宜地适配"会一直是门显学——下一个比 LoRA 更狠的省法是什么,谁知道呢,但肯定不会太久。
想搞懂 LoRA 里"低秩分解、矩阵秩"这些数学前提,推荐 B站【408实验室】的《机器学习数学基础》补齐底子。