大家的AI
机器学习AI论文
加载中…

学习

🏅我的成就

Ch.08

参数高效微调 1:PEFT 与 LoRA

不用整张大表,只用两块小的

不必把整张权重表从头重写。用竖长的 B 乘横长的 A 得到更新。中间宽度 r 越小,要学的数字就越少。
下图格子是示例尺寸(4×2 · 2×5 → 4×5)。
① B:竖条② r:窄缝③ A:横条④ 合成一张
B:4行×2列A:2行×5列×=ΔW:4行×5列中间最窄
要学的数大约就是两块小矩阵那么多,比把整张表逐格对齐少得多。LoRA 只更新那两块。

PEFT 与 LoRA:只训练少量参数做微调

主干 $W_0$ 像冻结的主路不动,只铺窄窄的 LoRA 匝道 $A,B$ 来对准任务。

大块预训练(W₀)不动,只让小的 A·B 去学,轻轻把输出推一推。宽主路和窄近道汇合,得到最终答案。

加载骨干冻结 W₀训练 A·Bα/r 缩放输出/合并

训练流程一览

  1. ① 加载骨干: 直接使用已经训练好的大模型作为起点。
  2. ② 冻结: 原始权重不动,让训练信号主要走 LoRA 和顶层。
  3. ③ 训练 LoRA: 只学两块小的(A·B),轻轻推动输出。
  4. ④ 调节强度: 用缩放(常见为 α÷r 等)控制 LoRA 影响多大,具体因实现而异。
  5. ⑤ 使用与发布: 验证满意后,把更新并回主权重,或只发布适配器。
不妨把训练 AI 模型想象成装修房子。第05章的 ViT 和超大语言模型,就像已经盖好的一座大宅(预训练模型)。想按自己的口味改造,如果把柱子和墙全部拆掉重建,就是全量微调——性能可能上去,但要付出海量内存与存储,还要花很多时间。
救场的是 PEFT(Parameter-Efficient Fine-Tuning,参数高效微调)。PEFT 说:房子的结构骨架尽量别动,只添置你真正需要的小型定制家具(适配器)——聪明又省钱的打法。
PEFT 家族里最出名的是 LoRA(Low-Rank Adaptation,低秩适配)。你不动模型里那张巨大的知识矩阵,在旁边铺一条很窄的旁路(低秩矩阵)当捷径。用符号来说,不去整表重写大矩阵,而是用两个小矩阵的乘积 BABABA 来构造可学的 ΔW\Delta WΔW。
模型输出变成 h=W0x+ΔWxh = W_0x + \Delta Wxh=W0​x+ΔWx:在原来就有的部分(W0xW_0xW0​x)上,轻轻叠上新教会的部分(ΔWx\Delta WxΔWx)。本章用通俗语言拆开 LoRA——它如何几乎像魔法一样,让你在自己的机器上也能轻量驾驭大模型。

公式这样读(LoRA 单层)

1)预训练与冻结
一句话: 大矩阵 W0W_0W0​ 不动,只学小的 修正 ΔW\Delta WΔW。
设权重 W0∈Rdout×dinW_0\in\mathbb{R}^{d_{\mathrm{out}}\times d_{\mathrm{in}}}W0​∈Rdout​×din​,输入 xxx,输出 hhh,LoRA 常见写法是“原输出 + 多一点点”:
h=W0x+ΔWxh = W_0 x + \Delta W xh=W0​x+ΔWx
- W0xW_0 xW0​x:预训练已经会的能力(通常 冻结)
- ΔWx\Delta W xΔWx:为当前任务 额外加上去 的部分(LoRA 主要学 ΔW\Delta WΔW)
全量微调会改 W0W_0W0​ 的每个格子;LoRA 则通常 冻结 W0W_0W0​,只轻量拟合修正。
xW0冻结×W0xAB×α/rΔWx+h
单层: 上支路是 冻结 W0W_0W0​ 得到的 W0xW_0xW0​x;下支路是 可训练 的 A ⁣→ ⁣BA\!\to\!BA→B 与 α/r\alpha/rα/r 给出的 ΔWx\Delta W xΔWx。相加得 h=W0x+ΔWxh=W_0x+\Delta W xh=W0​x+ΔWx。
2)用低秩写出 ΔW\Delta WΔW
一句话: 不把 ΔW\Delta WΔW 存成一整张巨表,而用 中间只有 rrr 那么窄 的两个矩阵 BBB 与 AAA 相乘得到。
取 r≪min⁡(din,dout)r\ll \min(d_{\mathrm{in}},d_{\mathrm{out}})r≪min(din​,dout​),B∈Rdout×rB\in\mathbb{R}^{d_{\mathrm{out}}\times r}B∈Rdout​×r, A∈Rr×dinA\in\mathbb{R}^{r\times d_{\mathrm{in}}}A∈Rr×din​:
ΔW=αrBA\Delta W = \frac{\alpha}{r} B AΔW=rα​BA
- BABABA:经过窄通道 rrr 得到的“修正形状”
- α/r\alpha/rα/r:控制修正 混入强度 的缩放(不同实现里 α\alphaα 与 rrr 的写法可能略有差别)
可训练参数量大致等于 BBB 与 AAA 的元素之和,即 doutr+rdind_{\mathrm{out}} r + r d_{\mathrm{in}}dout​r+rdin​,比重写整个 W0W_0W0​ 少得多。
3)为什么低秩
直观: 任务所需的变化未必铺满“所有方向”,可能集中在 少数主方向——因此 中间宽度 rrr 可以取小。
- rrr 增大 → 表达能力上升,但计算与存储成本也上升
- 贴在哪里(注意力的 WQ,WK,…W_Q,W_K,\dotsWQ​,WK​,… 还是 FFN)效果会不同
4)推理时合并(可选)
一句话: 若不想推理时多走一条 LoRA 旁路,可把学到的修正 合并成一张权重。
训练结束后把 ΔW\Delta WΔW 加到 W0W_0W0​:
W=W0+ΔWW = W_0 + \Delta WW=W0​+ΔW
之后像普通线性层一样 一次矩阵乘 推理,有利于 降低延迟(数值细节因框架而异)。

PEFT 与 LoRA:只更新少量参数做微调

1. 为何 PEFT?(留框架,换家具)
* 概念: 像 ChatGPT 这样的模型可以有数百亿参数。全量微调要更新全部权重——需要强力 GPU 和巨大的检查点。PEFT泛指只训练极小一部分(常低于 1%),让模型高效变聪明的一类技术。
* 类比: 没人为了“冬天氛围”就换新手机——你会套一个冬季手机壳(PEFT)。不同用途换不同壳;不同任务换轻量适配器。
* 实务: 性价比很高,但若适配器太小或数据太少,模型可能吸不进新知识——学习率和训练设置很关键。
2. LoRA 的秘密:两个小矩阵,替代一张巨表
* 概念: 深度模型由大堆数字表组成;把原始那张叫 W0W_0W0​。LoRA 冻结 W0W_0W0​,只学两个小矩阵 BBB 与 AAA。核心关系是 ΔW=BA\Delta W = B AΔW=BA。
* 类比: 为了改一处错字就去重印一千页百科全书(W0W_0W0​)太浪费;不如在那一页贴一张小便利贴(BABABA)。
* 细节: AAA 把信息压到要点;BBB 再扩回去——所以比整表重写要少训练很多数字。
3. LoRA 的旋钮:秩 rrr 与缩放 α\alphaα
* 概念: 两个旋钮最重要:秩 rrr 与 缩放 α\alphaα。
* 秩 rrr(旁路有几条“车道”): 想象“便利贴有多大”。r=8r=8r=8 是八车道旁路;r=16r=16r=16 更宽——更聪明也更吃显存。
* 缩放 α\alphaα(新知识混得多猛): 放大 BABABA 与冻结的 W0W_0W0​ 混合强度。
* 小贴士: 显存紧就降 rrr;模型吃不进你的数据就略升 rrr 试试。
4. 串起第04、05章——并预告第09章
* 概念: 还记得第04〜05章的注意力吗?LoRA 常在 QQQ、KKK、VVV 上“贴便利贴”——只要有线性权重矩阵,就能挂 LoRA。
* 预告: 即便用了 LoRA,大房子(W0W_0W0​)本身仍占很多显存。第 09 章会讲量化 + LoRA 的 QLoRA 组合,把骨干再瘦一圈。

为何重要

角落里的 GPU 也能训大模型
过去定制超大模型几乎要数据中心。用 LoRA,可训练参数可降到 1/100、1/1000——初创团队和学生也能在有限 GPU 上,把大模型适配到自己的领域(医疗、金融、法律……)。
变色龙模型:多任务部署的魔法
把一个模型同时当翻译、写代码、做菜,过去往往要存三份完整权重。用 PEFT 只保留一个共享大脑(基座),每种角色只存轻量的 LoRA 适配器——换适配器而不是换整模,运维简单得多。
更聪明的“遗忘”:缓解灾难性遗忘
全量微调可能让模型忘掉基础——像学了大学数学却忘了乘法表。LoRA 冻结 W0W_0W0​ 只训旁路,更容易在保住泛化的同时叠加新知识。
大图景里的效率
第01〜03章给了骨架(线性层);本章回答如何高效长肉。若你已掌握参数高效更新,就为更重优化技巧做好了准备。

如何用

第1步:冻住基座,只训 LoRA(训练策略)
1. 给预训练权重上锁(冻结)。
2. 在关键关节(注意力层等)挂上空的 LoRA 模块。
3. 只训练这些 LoRA。比全量微调快——若数据很少,用验证集盯紧过拟合。
第2步:部署时合并(合并与推理)
训练结束后,可以把便利贴(BABABA)上的内容“印进”百科全书(W0W_0W0​)——这叫权重合并。
* Wmerged=W0+BAW_{merged} = W_0 + BAWmerged​=W0​+BA
合并后推理不必做两次矩阵乘,可避免额外延迟。
第3步:选你的 PEFT 方案
* Adapter: 在每层末尾再接小网络。
* Prompt tuning: 在提示前学虚拟 token。
* LoRA: 柔和地改权重矩阵、约束少——在质量与成本之间,常是业界默认选择。
✅ 实战清单
* 效果: 若回答偏弱,提高秩(rrr)、缩放(α\alphaα)或扩大 `target_modules`。
* 显存: 先缩 batch;下一章 QLoRA(量化 + LoRA) 是下一档杠杆。
* 复现: 记录哪些层挂了 LoRA、用了哪个 rrr——方便以后复现实验。

小结

一句话 — 冻结巨大的预训练 W0W_0W0​,把更新放进低秩形式 ΔW=BA\Delta W = BAΔW=BA,让可训练参数大幅下降。
衔接: 在第01〜03章线性层与注意力骨架上,LoRA 与 PEFT 是最经济、最聪明的适配方式。
实务: 平衡秩(rrr)、缩放(α\alphaα)与目标模块;若显存仍吃紧,交给第 09 章 QLoRA(量化) 做更轻优化。

解题提示

LoRA/PEFT 题把 冻结的 W0W_0W0​ 与 低秩 BABABA、可训练参数量、rrr、α\alphaα 一起想。ViT 补丁(第05章复习)用 (H/p)×(W/p)(H/p)\times(W/p)(H/p)×(W/p);常见分解下正方形 d×dd\times dd×d 层约 2dr2dr2dr 个 LoRA 参数。
① 会话中可能出现的数值型示例(与题库同形)
LoRA 可训练参数量(aggregate) — 单层 d=64d=64d=64, r=4r=4r=4 时近似 2dr2dr2dr = 512

每边 patch 格数(config) — 横纵各 8 个 patch → 总格数 8×8=8\times8=8×8= 64

patch 个数(vote 型) — 输入 32×3232\times3232×32,patch 16×1616\times1616×16,无 CLS → (32/16)2=(32/16)^2=(32/16)2= 4

patch token 数(ensemble) — 224×224224\times224224×224,patch 161616,不含 CLS → (224/16)2=142=(224/16)^2=14^2=(224/16)2=142= 196

稠密注意力规模(ensemble) — 令牌数 N=20N=20N=20 → N2=N^2=N2= 400
例(概念) — “PEFT 的主要目标?”
② 用少量额外参数适配 → 2

例(计算) — “d=64d=64d=64, r=4r=4r=4,近似 2dr2dr2dr?” → 2⋅64⋅4=5122\cdot64\cdot4=5122⋅64⋅4=512 → 512

例(判断) — “LoRA 里通常训练全部 W0W_0W0​。” → 通常 冻结 → 0

例(应用) — “多任务省钱部署?”
② 只存 PEFT 适配器 → 2

ViT 复习 — 224×224224\times224224×224, patch 161616, 无 CLS → 142=14^2=142= 196
定义 — “LoRA 总直接学满秩 ΔW\Delta WΔW。” → 错(低秩)。0

判断 — “增大 rrr 通常增加可训练参数。” → 对。1

选择 — “用 LoRA 时想进一步省显存,下一章应重点看什么?
① 量化
② 只删数据标签” → 1

计算 — “d=32d=32d=32, r=2r=2r=2, 2dr2dr2dr?” → 128