L09: Efficient Adaptation (PEFT)

Week 5 · Tue Feb 03 2026 08:00:00 GMT+0800 (中国标准时间)

进度: 0/22 (0%)
下载 PDF
/ 0
100%
正在加载 PDF...

L09: Efficient Adaptation (PEFT)

Slides

中英交替版(推荐)

L09 双语 (PDF)

英文原版

L09 EN (PDF)

中文翻译版

L09 ZH (PDF)

核心知识点

0. DPO 续讲 + 人类偏好数据

Slide 1 Slide 2 Slide 3 Slide 4 Slide 5 Slide 6 Slide 7 Slide 8 Slide 9 Slide 10 Slide 11 Slide 12
  • 承接上节 DPO 推导:通过 Bradley-Terry 模型构建最终损失
  • 人类偏好数据的收集与偏见问题

🔢 偏好数据质量 vs 数量

近似 Llama 3 技术报告的实验结果:

数据配置数量某评测基准得分
随机采样偏好对(DPO)1M72.3%
筛选高质量偏好对(DPO)100K74.1%

结论:10 倍更少但更高质量的数据,反而提升了 1.8%。偏好数据的质量远比数量重要。

⚠️ 常见误区

  1. 误区:偏好对越多越好 → 正确:chosen 和 rejected 的质量差距小(如 “好” vs “较好”)时,学到的信号很弱甚至引入噪声,需要严格过滤低信噪比的偏好对。
  2. 误区:SimPO 是 DPO 的严格改进 → 正确:SimPO 去掉了 reference model 的正则化,在某些任务上可能导致更严重的 over-optimization,需要谨慎调整 γ\gamma

1. Prompting(提示工程)

Slide 13 Slide 14 Slide 15 Slide 16 Slide 17 Slide 18 Slide 19 Slide 20 Slide 21 Slide 22 Slide 23 Slide 24 Slide 25 Slide 26 Slide 27 Slide 28 Slide 29 Slide 30 Slide 31 Slide 32 Slide 33 Slide 34
  • Zero-shot prompting:直接用自然语言描述任务
  • Few-shot / In-context learning:在 prompt 中提供示例
  • Chain-of-Thought (CoT):让模型逐步推理(“Let’s think step by step”)
  • Prompt 设计对性能影响巨大

📐 In-Context Learning(ICL)的机制分析

给定 kk 个示例 (x1,y1),,(xk,yk)(x_1, y_1), \ldots, (x_k, y_k) 和查询 xk+1x_{k+1},ICL 计算:

P(yx1,y1,,xk,yk,xk+1)πLM(yprompt)P(y \mid x_1, y_1, \ldots, x_k, y_k, x_{k+1}) \propto \pi_{LM}(y \mid \text{prompt})

关键发现(Min et al., 2022):示例的格式比示例的正确性更重要。实验将标签随机打乱(如把所有”正面”改成随机标签),ICL 性能几乎不下降!这说明模型主要从示例中学习的是:

  • 任务格式(输入/输出的结构)
  • 标签空间(有哪些可能的输出)
  • 输入的分布(什么样的输入是合法的)

而非从正确的 label 中学习因果关系。

📚 已收录至 拓展阅读知识库

🔢 零样本 vs 少样本:任务复杂度决定增益

任务Zero-shotFew-shot (3-shot)增益
情感分析(SST-2)~90%~94%+4%
常识推理(CommonsenseQA)~65%~78%+13%
数学应用题(GSM8K)~15%~46%+31%

规律:任务越复杂,Few-shot 的增益越大。对于需要格式示范的复杂任务,几个例子能带来大幅提升。

⚠️ 常见误区

  1. 误区:花大量时间 prompt engineering 就能稳定提升性能 → 正确:Prompt 结果对措辞极度敏感——“classify the sentiment”、“what is the sentiment”、“is this positive or negative” 可能给出差异显著的结果,且这种差异跨模型不可迁移。不要在 prompt engineering 上过度投入,考虑 PEFT。
  2. 误区:Few-shot 示例越多越好 → 正确:超过一定数量后性能趋于饱和甚至下降(context 变长导致注意力分散),通常 4-8 个示例是最优区间。

2. PEFT 概述

Slide 35 Slide 36 Slide 37 Slide 38 Slide 39 Slide 40 Slide 41
  • 全量微调的问题:每个任务需要一份完整模型副本,存储和计算开销巨大
  • PEFT 核心思想:冻结大部分预训练参数,只训练少量新增/选择的参数
  • 分类:选择性方法(pruning/subnetwork)、重参数化(LoRA)、添加式(adapters, prompt tuning)

💡 为什么需要 PEFT?

从纯工程成本看问题的规模:

规模参数量float16 显存每任务全量副本
GPT-3175B~350GB350GB/任务
假设 GPT-4 级~1T~2TB2TB/任务
BERT-Large340M~680MB680MB/任务(合理)

对于大模型,10 个任务就需要 20TB 存储。PEFT 每任务只存少量额外参数(LoRA 通常 <100MB),多任务共享同一个 base model,切换任务只需加载不同的小 adapter。

此外,PEFT 还能缓解 catastrophic forgetting(全量微调往往会覆盖预训练知识,而冻结权重天然防止遗忘)。

⚠️ 常见误区

  1. 误区:PEFT 训练时显存需求远低于全量微调 → 正确:PEFT 节省的是存储和推理显存,但训练时前向传播仍需完整模型(梯度需要传到 adapter),GPU 训练显存接近全量微调。主要优势在于:多任务共享 base、避免遗忘、checkpoint 极小。
  2. 误区:PEFT 性能必然低于全量微调 → 正确:在数据量有限时,PEFT 的正则化效果(冻结大部分权重)往往比全量微调更好,防止过拟合。

3. Pruning / Subnetwork

Slide 42 Slide 43 Slide 44 Slide 45
  • Lottery-Ticket:稠密网络中存在稀疏子网络,可达到相近性能
  • 选择性微调:只训练模型中的一部分参数

🔢 幅度剪枝数值示例

Layer 权重 W=[0.8, 0.1, 0.3, 0.7, 0.05, 0.6]W = [0.8,\ -0.1,\ 0.3,\ -0.7,\ 0.05,\ 0.6],目标剪枝 50%(保留 3 个):

按绝对值降序排列:0.8, 0.7, 0.6, 0.3, 0.1, 0.05|0.8|,\ |-0.7|,\ |0.6|,\ |0.3|,\ |-0.1|,\ |0.05|

保留前 3:{0.8, 0.7, 0.6}\{0.8,\ -0.7,\ 0.6\},其余归零

Wpruned=[0.8, 0, 0, 0.7, 0, 0.6]W_{\text{pruned}} = [0.8,\ 0,\ 0,\ -0.7,\ 0,\ 0.6]

稀疏度 50%,但如果不重新训练,性能通常会显著下降。

⚠️ 常见误区

  1. 误区:剪枝后直接部署 → 正确:正确流程是”剪枝 → 重新 fine-tune 恢复性能”(有时称 prune-and-retrain)。Lottery Ticket Hypothesis 的关键发现就是:直接剪枝的子网络性能差,但从相同初始化重新训练的子网络性能好——找到彩票很重要,怎么训练也很重要。
  2. 误区:高稀疏度一定导致推理加速 → 正确:非结构化稀疏(随机位置置零)在标准 GPU 上几乎没有加速,需要专用稀疏计算库(如 NVIDIA cuSPARSE)或结构化剪枝才能得到实际加速。

4. LoRA(Low-Rank Adaptation)

Slide 46 Slide 47 Slide 48 Slide 49 Slide 50 Slide 51 Slide 52 Slide 53 Slide 54
  • 核心思想:冻结原始权重 WW,添加低秩分解 ΔW=BA\Delta W = BABRd×r,ARr×kB \in \mathbb{R}^{d \times r}, A \in \mathbb{R}^{r \times k}, rmin(d,k)r \ll \min(d,k)
  • 训练时只更新 A,BA, B,推理时可合并回原权重:无额外延迟
  • 通常应用于 attention 的 Q/V 投影矩阵
  • 极大减少可训练参数量(如 GPT-3 175B 只需训练 ~0.01% 参数)
  • LoRA 论文详解

📐 LoRA 完整推导

原始权重更新W=W0+ΔWW = W_0 + \Delta W,其中 W0Rd×kW_0 \in \mathbb{R}^{d \times k}(冻结)

低秩分解假设ΔW=BA\Delta W = BABRd×rB \in \mathbb{R}^{d \times r}ARr×kA \in \mathbb{R}^{r \times k}rmin(d,k)r \ll \min(d, k)

前向传播

h=W0x+ΔWx=W0x+BAxh = W_0 x + \Delta W x = W_0 x + BAx

初始化策略AN(0,σ2)A \sim \mathcal{N}(0, \sigma^2)(高斯),B=0B = 0

这保证训练开始时 ΔW=BA=0\Delta W = BA = 0,完全不改变原始模型行为,训练更稳定。

缩放因子(原论文添加):实际使用 αrBA\frac{\alpha}{r} BA,其中 α\alpha 是固定超参数(通常 α=r\alpha = r),方便跨不同 rr 值比较学习率。

参数量对比d=k=4096d = k = 4096r=8r = 8):

  • Full fine-tuning:4096×4096=16,777,2164096 \times 4096 = 16,777,216
  • LoRA:(4096×8)+(8×4096)=65,536(4096 \times 8) + (8 \times 4096) = 65,536(节省 256 倍

推理时合并Wmerged=W0+BAW_{\text{merged}} = W_0 + BA,合并后与原始线性层完全等价,零推理延迟

📚 已收录至 拓展阅读知识库

🔢 BERT-Large 的 LoRA 参数量

BERT-Large:dmodel=1024d_{model} = 1024,12 层,每层有 WQ,WK,WV,WOW_Q, W_K, W_V, W_O(各 1024×10241024 \times 1024

配置单矩阵参数量全部注意力层参数量占比
Full fine-tuning1,048,57650,331,648(~50M)100%
LoRA r=8r=816,384786,432(~786K)1.56%
LoRA r=4r=48,192393,216(~393K)0.78%

LoRA r=8r=8 用约 1.56% 的参数,在多数 NLP 任务上达到与全量微调相当的性能。

💡 为什么低秩假设合理?

Aghajanyan et al., 2021 的”内在维度”实验表明:预训练模型的 fine-tuning 存在极低的内在维度(Intrinsic Dimensionality)。即使任务的参数空间维度是数百亿,真正需要的”优化方向”可能只有几十到几百维。

直觉类比:预训练模型已经站在了”能力高原”上,fine-tuning 只是在高原上做小幅调整(低秩的”方向”),而不是从零重塑地形(满秩更新)。

⚠️ 常见误区

  1. 误区:LoRA 只应用于 WQ,WVW_Q, W_V(原论文默认) → 正确:后续研究(LoRA+、QLoRA、LoftQ)发现同时应用于 WQ,WK,WV,WOW_Q, W_K, W_V, W_O 乃至 FFN 层效果更好。不要假设原论文的默认配置最优。
  2. 误区rr 越大越好 → 正确rr 超过一定阈值后性能不再提升甚至下降(过拟合),且参数量线性增加。对多数任务 r{4,8,16}r \in \{4, 8, 16\} 已足够,盲目增大 rr 浪费计算。

5. Prompt Tuning

Slide 55 Slide 56 Slide 57 Slide 58
  • 在输入序列前添加可学习的连续向量(soft prompts)
  • 只训练这些 prompt embedding,模型参数完全冻结
  • 参数量极小但性能受限(容量有限)

📐 Prompt Tuning vs Prefix Tuning:结构对比

Prompt Tuning(Lester et al., 2021):仅在输入 embedding 层添加可训练的 soft prompt tokens:

hinput=[p1,p2,,pm, Emb(x1),,Emb(xn)]h_{\text{input}} = [p_1, p_2, \ldots, p_m,\ \text{Emb}(x_1), \ldots, \text{Emb}(x_n)]

其中 piRdp_i \in \mathbb{R}^d 是可学习的连续向量(非离散 token),只有 {p1,,pm}\{p_1, \ldots, p_m\} 参与梯度更新,参数量 = m×dm \times d

Prefix Tuning(Li & Liang, 2021):在每一层 Transformer 的 Key 和 Value 上拼接可训练前缀:

Kl=[PK(l); Kl],Vl=[PV(l); Vl]K_l' = [P_K^{(l)};\ K_l], \quad V_l' = [P_V^{(l)};\ V_l]

每层都有独立的 PK(l),PV(l)Rm×dkP_K^{(l)}, P_V^{(l)} \in \mathbb{R}^{m \times d_k},参数量 = L×2×m×dkL \times 2 \times m \times d_kLL 为层数)。

Prefix Tuning 更强大(每层都可调整),但参数量也更多;Prompt Tuning 极度精简。

📚 已收录至 拓展阅读知识库

🔢 GPT-3 175B 的 Prompt Tuning 参数量

GPT-3 175B:dmodel=12288d_{model} = 12288,设软提示长度 m=100m = 100 tokens

参数量=100×12288=1,228,8001.2M\text{参数量} = 100 \times 12288 = 1,228,800 \approx 1.2\text{M}

占比=1.2M175B0.00069%\text{占比} = \frac{1.2\text{M}}{175\text{B}} \approx 0.00069\%

这是极度参数高效的方案,每个任务只需存储约 1.2M 参数(约 2.4MB float16)。

⚠️ 常见误区

  1. 误区:Prompt Tuning 在所有规模模型上都有效 → 正确:Prompt Tuning 只在大模型(>1B 参数)上效果接近全量微调;小模型上显著落后(Lester et al. 论文图 3 明确展示了这一规模依赖性)。模型越大,“可编程性”越强。
  2. 误区:soft prompt 可以解释为自然语言 → 正确:soft prompt 是连续向量,无法直接映射回词汇表中的 token,不可解释。试图将其”解码”成可读文本往往产生无意义结果。

6. Adapters

Slide 59 Slide 60 Slide 61 Slide 62 Slide 63 Slide 64
  • 在 Transformer 层间插入小型瓶颈模块:fϕ(x)=WU(σ(WDx))f_\phi(x) = W^U(\sigma(W^D x))
  • 放置位置:multi-head attention 之后 和/或 feed-forward 之后
  • 用 ~2% 参数达到接近全量微调的性能(Houlsby et al., 2019)
  • Language adapters:任务知识 ~= 语言知识,可用 MLM 训练特定语言的 adapter
  • 函数组合视角:fi(x)=fθi(x)fϕi(x)f_i'(x) = f_{\theta_i}(x) \odot f_{\phi_i}(x)

📐 Adapter 模块的结构(Houlsby et al., 2019)

在 Transformer 每个子层(Self-Attention 和 FFN)后插入 Adapter:

Adapter(h)=h+f(hWdown)Wup\text{Adapter}(h) = h + f(h W_{\text{down}}) W_{\text{up}}

其中:

  • WdownRd×rW_{\text{down}} \in \mathbb{R}^{d \times r}:降维投影(rdr \ll d
  • WupRr×dW_{\text{up}} \in \mathbb{R}^{r \times d}:升维投影
  • ff:非线性激活(ReLU 或 GELU)
  • 残差连接:保证 Wup=0W_{\text{up}} = 0 初始化时 Adapter 不改变模型输出

Houlsby(串行)vs Pfeiffer(并行)

  • Houlsby:每层插 2 个 adapter(MHA 后 + FFN 后),性能更好
  • Pfeiffer:每层只插 1 个 adapter(FFN 后),参数更少,效率更高

📚 已收录至 拓展阅读知识库

🔢 BERT-Base 的 Adapter 参数量

BERT-Base:d=768d = 768,12 层,使用 Houlsby 配置(每层 2 个 adapter),r=64r = 64

每个 adapter 参数量:2×(d×r)=2×(768×64)=98,3042 \times (d \times r) = 2 \times (768 \times 64) = 98,304

(含 WdownW_{\text{down}}WupW_{\text{up}},不含 bias)

总计:12×2×98,304=2,359,2962.36M12 \times 2 \times 98,304 = 2,359,296 \approx 2.36\text{M}

占 BERT-Base 总参数(110M)的 2.1%,通常可达全量微调 98%+ 的性能。

⚠️ 常见误区

  1. 误区:Adapter 和 LoRA 性能差不多,随便选 → 正确推理延迟是关键差异。Adapter 在推理时有额外矩阵乘法(无法消除),对延迟敏感的生产环境不友好。LoRA 可以将 BABA 合并回 W0W_0,推理时零额外延迟,这是 LoRA 在工业界更流行的核心原因。
  2. 误区:瓶颈维度 rr 越小越好(参数越省) → 正确rr 太小会成为信息瓶颈,丢失任务相关信号。需要根据任务复杂度调整,复杂任务(如代码生成)需要更大的 rr

7. 其他高效适配方法

Slide 65
Slide 65
Slide 66
Slide 66
Slide 67
Slide 67
  • 知识蒸馏:用大模型(teacher)指导小模型(student)训练
  • Gist tokens(Wu et al., 2024)
  • ReFT(Wu et al., 2024):表示微调
  • 性能对比:Adapter > LoRA > Prompt Tuning(按参数效率-性能权衡)

推荐阅读

关联概念

个人笔记