L09: Efficient Adaptation (PEFT)
Week 5 · Tue Feb 03 2026 08:00:00 GMT+0800 (中国标准时间)
L09: Efficient Adaptation (PEFT)
Slides
中英交替版(推荐)
英文原版
中文翻译版
核心知识点
0. DPO 续讲 + 人类偏好数据
- 承接上节 DPO 推导:通过 Bradley-Terry 模型构建最终损失
- 人类偏好数据的收集与偏见问题
🔢 偏好数据质量 vs 数量
近似 Llama 3 技术报告的实验结果:
| 数据配置 | 数量 | 某评测基准得分 |
|---|---|---|
| 随机采样偏好对(DPO) | 1M | 72.3% |
| 筛选高质量偏好对(DPO) | 100K | 74.1% |
结论:10 倍更少但更高质量的数据,反而提升了 1.8%。偏好数据的质量远比数量重要。
⚠️ 常见误区
- 误区:偏好对越多越好 → 正确:chosen 和 rejected 的质量差距小(如 “好” vs “较好”)时,学到的信号很弱甚至引入噪声,需要严格过滤低信噪比的偏好对。
- 误区:SimPO 是 DPO 的严格改进 → 正确:SimPO 去掉了 reference model 的正则化,在某些任务上可能导致更严重的 over-optimization,需要谨慎调整 。
1. Prompting(提示工程)
- Zero-shot prompting:直接用自然语言描述任务
- Few-shot / In-context learning:在 prompt 中提供示例
- Chain-of-Thought (CoT):让模型逐步推理(“Let’s think step by step”)
- Prompt 设计对性能影响巨大
📐 In-Context Learning(ICL)的机制分析
给定 个示例 和查询 ,ICL 计算:
关键发现(Min et al., 2022):示例的格式比示例的正确性更重要。实验将标签随机打乱(如把所有”正面”改成随机标签),ICL 性能几乎不下降!这说明模型主要从示例中学习的是:
- 任务格式(输入/输出的结构)
- 标签空间(有哪些可能的输出)
- 输入的分布(什么样的输入是合法的)
而非从正确的 label 中学习因果关系。
📚 已收录至 拓展阅读知识库
🔢 零样本 vs 少样本:任务复杂度决定增益
| 任务 | Zero-shot | Few-shot (3-shot) | 增益 |
|---|---|---|---|
| 情感分析(SST-2) | ~90% | ~94% | +4% |
| 常识推理(CommonsenseQA) | ~65% | ~78% | +13% |
| 数学应用题(GSM8K) | ~15% | ~46% | +31% |
规律:任务越复杂,Few-shot 的增益越大。对于需要格式示范的复杂任务,几个例子能带来大幅提升。
⚠️ 常见误区
- 误区:花大量时间 prompt engineering 就能稳定提升性能 → 正确:Prompt 结果对措辞极度敏感——“classify the sentiment”、“what is the sentiment”、“is this positive or negative” 可能给出差异显著的结果,且这种差异跨模型不可迁移。不要在 prompt engineering 上过度投入,考虑 PEFT。
- 误区:Few-shot 示例越多越好 → 正确:超过一定数量后性能趋于饱和甚至下降(context 变长导致注意力分散),通常 4-8 个示例是最优区间。
2. PEFT 概述
- 全量微调的问题:每个任务需要一份完整模型副本,存储和计算开销巨大
- PEFT 核心思想:冻结大部分预训练参数,只训练少量新增/选择的参数
- 分类:选择性方法(pruning/subnetwork)、重参数化(LoRA)、添加式(adapters, prompt tuning)
💡 为什么需要 PEFT?
从纯工程成本看问题的规模:
| 规模 | 参数量 | float16 显存 | 每任务全量副本 |
|---|---|---|---|
| GPT-3 | 175B | ~350GB | 350GB/任务 |
| 假设 GPT-4 级 | ~1T | ~2TB | 2TB/任务 |
| BERT-Large | 340M | ~680MB | 680MB/任务(合理) |
对于大模型,10 个任务就需要 20TB 存储。PEFT 每任务只存少量额外参数(LoRA 通常 <100MB),多任务共享同一个 base model,切换任务只需加载不同的小 adapter。
此外,PEFT 还能缓解 catastrophic forgetting(全量微调往往会覆盖预训练知识,而冻结权重天然防止遗忘)。
⚠️ 常见误区
- 误区:PEFT 训练时显存需求远低于全量微调 → 正确:PEFT 节省的是存储和推理显存,但训练时前向传播仍需完整模型(梯度需要传到 adapter),GPU 训练显存接近全量微调。主要优势在于:多任务共享 base、避免遗忘、checkpoint 极小。
- 误区:PEFT 性能必然低于全量微调 → 正确:在数据量有限时,PEFT 的正则化效果(冻结大部分权重)往往比全量微调更好,防止过拟合。
3. Pruning / Subnetwork
- Lottery-Ticket:稠密网络中存在稀疏子网络,可达到相近性能
- 选择性微调:只训练模型中的一部分参数
🔢 幅度剪枝数值示例
Layer 权重 ,目标剪枝 50%(保留 3 个):
按绝对值降序排列:
保留前 3:,其余归零
稀疏度 50%,但如果不重新训练,性能通常会显著下降。
⚠️ 常见误区
- 误区:剪枝后直接部署 → 正确:正确流程是”剪枝 → 重新 fine-tune 恢复性能”(有时称 prune-and-retrain)。Lottery Ticket Hypothesis 的关键发现就是:直接剪枝的子网络性能差,但从相同初始化重新训练的子网络性能好——找到彩票很重要,怎么训练也很重要。
- 误区:高稀疏度一定导致推理加速 → 正确:非结构化稀疏(随机位置置零)在标准 GPU 上几乎没有加速,需要专用稀疏计算库(如 NVIDIA cuSPARSE)或结构化剪枝才能得到实际加速。
4. LoRA(Low-Rank Adaptation)
- 核心思想:冻结原始权重 ,添加低秩分解 (, )
- 训练时只更新 ,推理时可合并回原权重:无额外延迟
- 通常应用于 attention 的 Q/V 投影矩阵
- 极大减少可训练参数量(如 GPT-3 175B 只需训练 ~0.01% 参数)
- LoRA 论文详解
📐 LoRA 完整推导
原始权重更新:,其中 (冻结)
低秩分解假设:,,,
前向传播:
初始化策略:(高斯),
这保证训练开始时 ,完全不改变原始模型行为,训练更稳定。
缩放因子(原论文添加):实际使用 ,其中 是固定超参数(通常 ),方便跨不同 值比较学习率。
参数量对比(,):
- Full fine-tuning:
- LoRA:(节省 256 倍)
推理时合并:,合并后与原始线性层完全等价,零推理延迟。
📚 已收录至 拓展阅读知识库
🔢 BERT-Large 的 LoRA 参数量
BERT-Large:,12 层,每层有 (各 )
| 配置 | 单矩阵参数量 | 全部注意力层参数量 | 占比 |
|---|---|---|---|
| Full fine-tuning | 1,048,576 | 50,331,648(~50M) | 100% |
| LoRA | 16,384 | 786,432(~786K) | 1.56% |
| LoRA | 8,192 | 393,216(~393K) | 0.78% |
LoRA 用约 1.56% 的参数,在多数 NLP 任务上达到与全量微调相当的性能。
💡 为什么低秩假设合理?
Aghajanyan et al., 2021 的”内在维度”实验表明:预训练模型的 fine-tuning 存在极低的内在维度(Intrinsic Dimensionality)。即使任务的参数空间维度是数百亿,真正需要的”优化方向”可能只有几十到几百维。
直觉类比:预训练模型已经站在了”能力高原”上,fine-tuning 只是在高原上做小幅调整(低秩的”方向”),而不是从零重塑地形(满秩更新)。
⚠️ 常见误区
- 误区:LoRA 只应用于 (原论文默认) → 正确:后续研究(LoRA+、QLoRA、LoftQ)发现同时应用于 乃至 FFN 层效果更好。不要假设原论文的默认配置最优。
- 误区: 越大越好 → 正确: 超过一定阈值后性能不再提升甚至下降(过拟合),且参数量线性增加。对多数任务 已足够,盲目增大 浪费计算。
5. Prompt Tuning
- 在输入序列前添加可学习的连续向量(soft prompts)
- 只训练这些 prompt embedding,模型参数完全冻结
- 参数量极小但性能受限(容量有限)
📐 Prompt Tuning vs Prefix Tuning:结构对比
Prompt Tuning(Lester et al., 2021):仅在输入 embedding 层添加可训练的 soft prompt tokens:
其中 是可学习的连续向量(非离散 token),只有 参与梯度更新,参数量 = 。
Prefix Tuning(Li & Liang, 2021):在每一层 Transformer 的 Key 和 Value 上拼接可训练前缀:
每层都有独立的 ,参数量 = ( 为层数)。
Prefix Tuning 更强大(每层都可调整),但参数量也更多;Prompt Tuning 极度精简。
📚 已收录至 拓展阅读知识库
🔢 GPT-3 175B 的 Prompt Tuning 参数量
GPT-3 175B:,设软提示长度 tokens
这是极度参数高效的方案,每个任务只需存储约 1.2M 参数(约 2.4MB float16)。
⚠️ 常见误区
- 误区:Prompt Tuning 在所有规模模型上都有效 → 正确:Prompt Tuning 只在大模型(>1B 参数)上效果接近全量微调;小模型上显著落后(Lester et al. 论文图 3 明确展示了这一规模依赖性)。模型越大,“可编程性”越强。
- 误区:soft prompt 可以解释为自然语言 → 正确:soft prompt 是连续向量,无法直接映射回词汇表中的 token,不可解释。试图将其”解码”成可读文本往往产生无意义结果。
6. Adapters
- 在 Transformer 层间插入小型瓶颈模块:
- 放置位置:multi-head attention 之后 和/或 feed-forward 之后
- 用 ~2% 参数达到接近全量微调的性能(Houlsby et al., 2019)
- Language adapters:任务知识 ~= 语言知识,可用 MLM 训练特定语言的 adapter
- 函数组合视角:
📐 Adapter 模块的结构(Houlsby et al., 2019)
在 Transformer 每个子层(Self-Attention 和 FFN)后插入 Adapter:
其中:
- :降维投影()
- :升维投影
- :非线性激活(ReLU 或 GELU)
- 残差连接:保证 初始化时 Adapter 不改变模型输出
Houlsby(串行)vs Pfeiffer(并行):
- Houlsby:每层插 2 个 adapter(MHA 后 + FFN 后),性能更好
- Pfeiffer:每层只插 1 个 adapter(FFN 后),参数更少,效率更高
📚 已收录至 拓展阅读知识库
🔢 BERT-Base 的 Adapter 参数量
BERT-Base:,12 层,使用 Houlsby 配置(每层 2 个 adapter),
每个 adapter 参数量:
(含 和 ,不含 bias)
总计:
占 BERT-Base 总参数(110M)的 2.1%,通常可达全量微调 98%+ 的性能。
⚠️ 常见误区
- 误区:Adapter 和 LoRA 性能差不多,随便选 → 正确:推理延迟是关键差异。Adapter 在推理时有额外矩阵乘法(无法消除),对延迟敏感的生产环境不友好。LoRA 可以将 合并回 ,推理时零额外延迟,这是 LoRA 在工业界更流行的核心原因。
- 误区:瓶颈维度 越小越好(参数越省) → 正确: 太小会成为信息瓶颈,丢失任务相关信号。需要根据任务复杂度调整,复杂任务(如代码生成)需要更大的 。
7. 其他高效适配方法
- 知识蒸馏:用大模型(teacher)指导小模型(student)训练
- Gist tokens(Wu et al., 2024)
- ReFT(Wu et al., 2024):表示微调
- 性能对比:Adapter > LoRA > Prompt Tuning(按参数效率-性能权衡)
推荐阅读
- Few-Shot-Learners — Brown et al., 2020
- Chain-of-Thought — Wei et al., 2022
- Lottery-Ticket — Frankle & Carlin, 2019
- LoRA — Hu et al., 2022
- PEFT-NLP — Survey