Ch.08
参数高效微调 1:PEFT 与 LoRA
不用整张大表,只用两块小的
不必把整张权重表从头重写。用竖长的 B 乘横长的 A 得到更新。中间宽度 r 越小,要学的数字就越少。
下图格子是示例尺寸(4×2 · 2×5 → 4×5)。
① B:竖条② r:窄缝③ A:横条④ 合成一张
要学的数大约就是两块小矩阵那么多,比把整张表逐格对齐少得多。LoRA 只更新那两块。
PEFT 与 LoRA:只训练少量参数做微调
主干 $W_0$ 像冻结的主路不动,只铺窄窄的 LoRA 匝道 $A,B$ 来对准任务。
大块预训练(W₀)不动,只让小的 A·B 去学,轻轻把输出推一推。宽主路和窄近道汇合,得到最终答案。
加载骨干冻结 W₀训练 A·Bα/r 缩放输出/合并
训练流程一览
- ① 加载骨干: 直接使用已经训练好的大模型作为起点。
- ② 冻结: 原始权重不动,让训练信号主要走 LoRA 和顶层。
- ③ 训练 LoRA: 只学两块小的(A·B),轻轻推动输出。
- ④ 调节强度: 用缩放(常见为 α÷r 等)控制 LoRA 影响多大,具体因实现而异。
- ⑤ 使用与发布: 验证满意后,把更新并回主权重,或只发布适配器。
不妨把训练 AI 模型想象成装修房子。第05章的 ViT 和超大语言模型,就像已经盖好的一座大宅(预训练模型)。想按自己的口味改造,如果把柱子和墙全部拆掉重建,就是全量微调——性能可能上去,但要付出海量内存与存储,还要花很多时间。
救场的是 PEFT(Parameter-Efficient Fine-Tuning,参数高效微调)。PEFT 说:房子的结构骨架尽量别动,只添置你真正需要的小型定制家具(适配器)——聪明又省钱的打法。
PEFT 家族里最出名的是 LoRA(Low-Rank Adaptation,低秩适配)。你不动模型里那张巨大的知识矩阵,在旁边铺一条很窄的旁路(低秩矩阵)当捷径。用符号来说,不去整表重写大矩阵,而是用两个小矩阵的乘积 来构造可学的 。
模型输出变成 :在原来就有的部分()上,轻轻叠上新教会的部分()。本章用通俗语言拆开 LoRA——它如何几乎像魔法一样,让你在自己的机器上也能轻量驾驭大模型。
公式这样读(LoRA 单层)
1)预训练与冻结
一句话: 大矩阵 不动,只学小的 修正 。
设权重 ,输入 ,输出 ,LoRA 常见写法是“原输出 + 多一点点”:
- :预训练已经会的能力(通常 冻结)
- :为当前任务 额外加上去 的部分(LoRA 主要学 )
全量微调会改 的每个格子;LoRA 则通常 冻结 ,只轻量拟合修正。
2)用低秩写出
一句话: 不把 存成一整张巨表,而用 中间只有 那么窄 的两个矩阵 与 相乘得到。
取 ,, :
- :经过窄通道 得到的“修正形状”
- :控制修正 混入强度 的缩放(不同实现里 与 的写法可能略有差别)
可训练参数量大致等于 与 的元素之和,即 ,比重写整个 少得多。
3)为什么低秩
直观: 任务所需的变化未必铺满“所有方向”,可能集中在 少数主方向——因此 中间宽度 可以取小。
- 增大 → 表达能力上升,但计算与存储成本也上升
- 贴在哪里(注意力的 还是 FFN)效果会不同
4)推理时合并(可选)
一句话: 若不想推理时多走一条 LoRA 旁路,可把学到的修正 合并成一张权重。
训练结束后把 加到 :
之后像普通线性层一样 一次矩阵乘 推理,有利于 降低延迟(数值细节因框架而异)。
PEFT 与 LoRA:只更新少量参数做微调
1. 为何 PEFT?(留框架,换家具)
* 概念: 像 ChatGPT 这样的模型可以有数百亿参数。全量微调要更新全部权重——需要强力 GPU 和巨大的检查点。PEFT泛指只训练极小一部分(常低于 1%),让模型高效变聪明的一类技术。
* 类比: 没人为了“冬天氛围”就换新手机——你会套一个冬季手机壳(PEFT)。不同用途换不同壳;不同任务换轻量适配器。
* 实务: 性价比很高,但若适配器太小或数据太少,模型可能吸不进新知识——学习率和训练设置很关键。
2. LoRA 的秘密:两个小矩阵,替代一张巨表
* 概念: 深度模型由大堆数字表组成;把原始那张叫 。LoRA 冻结 ,只学两个小矩阵 与 。核心关系是 。
* 类比: 为了改一处错字就去重印一千页百科全书()太浪费;不如在那一页贴一张小便利贴()。
* 细节: 把信息压到要点; 再扩回去——所以比整表重写要少训练很多数字。
3. LoRA 的旋钮:秩 与缩放
* 概念: 两个旋钮最重要:秩 与 缩放 。
* 秩 (旁路有几条“车道”): 想象“便利贴有多大”。 是八车道旁路; 更宽——更聪明也更吃显存。
* 缩放 (新知识混得多猛): 放大 与冻结的 混合强度。
* 小贴士: 显存紧就降 ;模型吃不进你的数据就略升 试试。
4. 串起第04、05章——并预告第09章
* 概念: 还记得第04〜05章的注意力吗?LoRA 常在 、、 上“贴便利贴”——只要有线性权重矩阵,就能挂 LoRA。
* 预告: 即便用了 LoRA,大房子()本身仍占很多显存。第 09 章会讲量化 + LoRA 的 QLoRA 组合,把骨干再瘦一圈。
为何重要
角落里的 GPU 也能训大模型
过去定制超大模型几乎要数据中心。用 LoRA,可训练参数可降到 1/100、1/1000——初创团队和学生也能在有限 GPU 上,把大模型适配到自己的领域(医疗、金融、法律……)。
变色龙模型:多任务部署的魔法
把一个模型同时当翻译、写代码、做菜,过去往往要存三份完整权重。用 PEFT 只保留一个共享大脑(基座),每种角色只存轻量的 LoRA 适配器——换适配器而不是换整模,运维简单得多。
更聪明的“遗忘”:缓解灾难性遗忘
全量微调可能让模型忘掉基础——像学了大学数学却忘了乘法表。LoRA 冻结 只训旁路,更容易在保住泛化的同时叠加新知识。
大图景里的效率
第01〜03章给了骨架(线性层);本章回答如何高效长肉。若你已掌握参数高效更新,就为更重优化技巧做好了准备。
如何用
第1步:冻住基座,只训 LoRA(训练策略)
1. 给预训练权重上锁(冻结)。
2. 在关键关节(注意力层等)挂上空的 LoRA 模块。
3. 只训练这些 LoRA。比全量微调快——若数据很少,用验证集盯紧过拟合。
第2步:部署时合并(合并与推理)
训练结束后,可以把便利贴()上的内容“印进”百科全书()——这叫权重合并。
*
合并后推理不必做两次矩阵乘,可避免额外延迟。
第3步:选你的 PEFT 方案
* Adapter: 在每层末尾再接小网络。
* Prompt tuning: 在提示前学虚拟 token。
* LoRA: 柔和地改权重矩阵、约束少——在质量与成本之间,常是业界默认选择。
✅ 实战清单
* 效果: 若回答偏弱,提高秩()、缩放()或扩大 `target_modules`。
* 显存: 先缩 batch;下一章 QLoRA(量化 + LoRA) 是下一档杠杆。
* 复现: 记录哪些层挂了 LoRA、用了哪个 ——方便以后复现实验。
小结
一句话 — 冻结巨大的预训练 ,把更新放进低秩形式 ,让可训练参数大幅下降。
衔接: 在第01〜03章线性层与注意力骨架上,LoRA 与 PEFT 是最经济、最聪明的适配方式。
实务: 平衡秩()、缩放()与目标模块;若显存仍吃紧,交给第 09 章 QLoRA(量化) 做更轻优化。
解题提示
LoRA/PEFT 题把 冻结的 与 低秩 、可训练参数量、、 一起想。ViT 补丁(第05章复习)用 ;常见分解下正方形 层约 个 LoRA 参数。
① 会话中可能出现的数值型示例(与题库同形)
LoRA 可训练参数量(aggregate) — 单层 , 时近似 = 512
每边 patch 格数(config) — 横纵各 8 个 patch → 总格数 64
patch 个数(vote 型) — 输入 ,patch ,无 CLS → 4
patch token 数(ensemble) — ,patch ,不含 CLS → 196
稠密注意力规模(ensemble) — 令牌数 → 400
例(概念) — “PEFT 的主要目标?”
② 用少量额外参数适配 → 2
例(计算) — “, ,近似 ?” → → 512
例(判断) — “LoRA 里通常训练全部 。” → 通常 冻结 → 0
例(应用) — “多任务省钱部署?”
② 只存 PEFT 适配器 → 2
ViT 复习 — , patch , 无 CLS → 196
定义 — “LoRA 总直接学满秩 。” → 错(低秩)。0
判断 — “增大 通常增加可训练参数。” → 对。1
选择 — “用 LoRA 时想进一步省显存,下一章应重点看什么?
① 量化
② 只删数据标签” → 1
计算 — “, , ?” → 128