大模型的全量权重动辄上亿个数字,微调时全改一遍,显存和算力都吃不消。低秩分解的思路是:与其更新一整面大墙,不如只改动墙上的一小条。本文用「拆大矩阵为两个瘦矩阵」的直觉,讲透 LoRA 为什么能把可训练参数砍掉九成九。
先算一笔参数账
假设某一层有个 1024 乘 1024 的权重矩阵,参数是一百多万个,全量微调每个都要存梯度、要更新。低秩分解说:真正需要调整的方向,往往只占其中很小的一个子空间。把更新量拆成两个瘦矩阵相乘——一个 1024 乘 8,一个 8 乘 1024——参数量从一百多万掉到一万六千多,缩到六十几分之一。进来的是全量矩阵,发生的是拆解与重组,出去的是「原矩阵加一个瘦乘积」,模型行为几乎不变,可训练部分却瘦身成功。
直觉:为什么瘦矩阵够用
一堵墙上的花纹看起来千变万化,画它的草稿可能只需要几条主线。权重矩阵类似:大量维度之间存在相关性,有效变化方向挤在一个低维子空间里。秩就是描述这个子空间有多大的数字,秩为 8 意味着变化只住在 8 个方向撑开的平面里。微调要学的往往是领域口吻、格式偏好这类窄变化,恰好装得进小平面;真要改底层知识,小秩才撑不住——这也是 LoRA 适合风格适配、不适合从头教知识的原因。
LoRA 的三步工作流
训练开始,先把原矩阵冻住,一个数都不动;旁边挂上两个可训练的瘦矩阵,初始化成一个小扰动,让训练起点和原模型行为一致。训练中只有瘦矩阵在更新,梯度回传也只在瘦矩阵里流动,显存占用主要花在原矩阵的读取上。训练结束,把瘦乘积加回原矩阵,或者两套权重分别存放、推理时再合并。进来的是冻结的大矩阵加随机初始化的小矩阵,发生的是只更新小矩阵的梯度下降,出去的是「原矩阵加适配增量」的等效模型。
智谱清言、DeepSeek 的技术文档都提供过 LoRA 配置示例,秩通常取 8 到 64,不同层可以用不同秩。秩的选择没有万能值,以官方技术报告为准。实际挂载时也不是全网络都挂适配器,多数实现只挑注意力层的几组投影矩阵动手,其余层保持冻结,既省资源又少扰动原模型行为。
LoRA 速查表
- 原矩阵冻结,只训练两个瘦矩阵
- 参数从 d 平方降到 2 乘 d 乘 r,r 通常远小于 d
- 适配文件只有几 MB 到几百 MB,一个基座可挂多个
- 推理时合并回原矩阵,不增加延迟
小文件的大用途
瘦身带来的连锁反应很实际:适配文件从几十 GB 缩到几百 MB,社区里才能出现「一个基座挂几十个风格插件」的玩法;一张消费级显卡跑得动微调,个人开发者才玩得起定制。知识是怎么存进参数里的那篇讲过参数是知识的容器,LoRA 的思路是不动容器、只改贴纸——所以它改风格很拿手,改认知很勉强。想改认知,要么加大秩,要么动全量;剪枝是怎么决定剪谁的讲的是反向操作:一个做减法,一个做瘦身,目标都是让参数更高效。
还有一层常被忽略的优势是可回滚。全量微调改完,原模型行为就被覆盖了,想回到微调前只能重存一份权重;LoRA 文件卸载即恢复原状,试错成本接近零。这也解释了为什么实验阶段大家偏爱挂适配器:一次训练换一个补丁,成王败寇都由文件说了算,基座始终干净。
全量微调和 LoRA 的差别,摊在参数、文件、回滚上更直观。
| 对比项 | 全量微调 | LoRA |
|---|---|---|
| 可训练参数(1024×1024 那层) | 一百多万个,每个都要存梯度、要更新 | 一万六千多,缩到六十几分之一 |
| 适配文件体积 | 几十 GB | 几百 MB |
| 回滚成本 | 原模型行为被覆盖,只能重存一份权重 | 卸载即恢复原状,试错成本接近零 |
| 推理延迟 | 一次普通矩阵运算 | 瘦乘积合并回原矩阵,不增加延迟 |
| 能改什么 | 底层知识也能动 | 风格适配拿手,改认知得先加秩 |
关于低秩分解再多问三句
- 秩设多大合适?:8 到 64 覆盖多数风格适配场景;秩小省参数但表达力受限,秩大接近全量微调的成本,先用小秩试,不够再加。
- LoRA 文件能和别的模型通用吗?:不能跨基座乱挂,它是贴着某一层的矩阵形状训练的,换基座等于换锁,具体搭配见LoRA 文件和全量模型怎么配合用。
- 为什么推理时感觉不到它的存在?:因为瘦乘积可以加回原矩阵,合并后是一次普通矩阵运算,不引入额外结构,速度与全量模型一致。
带走一个判断:改动越窄,秩就可以越小;要动认知,先加秩,加不动再考虑全量。


