LoRA:冻结原权重,只训练一小块
要解决的问题
全参数微调一个几十亿参数的模型,除了显存吃紧,还有个更麻烦的点:每个下游任务都要存一份完整权重。十个任务就是十份,没法接受。
做法
不直接改原权重 W,而是把更新量近似成低秩分解:
W' = W + ΔW, ΔW = B · A
其中 A 是 r × d、B 是 d × r,秩 r 远小于原始维度(常见 8、16、64)。
训练时冻结 W,只学 A 和 B。推理时可以把 B·A 加回 W,得到一个和原模型结构完全一致的权重 —— 所以不增加推理延迟。
为什么这样可行
论文的假设是:微调时权重的实际变化具有很低的"内在秩"。换句话说,适应一个新任务并不需要动用整个参数空间的自由度。这个假设在大量实验里成立得还不错,也解释了为什么 r 取很小仍然有效。
实际收益
| 维度 | 变化 |
|---|---|
| 可训练参数 | 降到千分之几量级 |
| 显存(优化器状态) | 大幅下降,因为不存全量梯度/动量 |
| 多任务切换 | 每个任务只存一个很小的 adapter |
| 推理延迟 | 合并后为零 |
局限
- 秩
r太小会容量不足,任务差异大时效果明显不如全参微调 - 合并之后就不能再"拆开"了,需要保留 adapter 副本
- 对某些需要改变模型行为的任务(比如新语言、新模态),低秩假设可能不够
一句话记住
LoRA 不是让训练变快,而是让"每个任务一份权重"这件事变得便宜。
本文为个人学习记录,可能存在错误或已过时,仅供参考。
← 返回笔记列表