External Parametric Memory包含哪些技术?Adapter、LoRA等方法如何实现外部参数记忆
P1 · llm_training
📊 考点:lora
🏷 标签:external-memory, adapter, parameter-efficient
1️⃣ 考察意图
面试官想考察你对“参数高效微调”(PEFT)的底层理解,而非单纯背概念。刁钻点在于:“外部参数记忆”不是 LoRA 或 Adapter 的别名,而是一种设计哲学——将任务特定知识编码到模型外的轻量参数中,避免修改主干。答好了能展示:① 对 Adapter、LoRA、Prefix Tuning、IA3 等技术的原理和 trade-off 有清晰认知;② 理解“记忆”与“计算”的解耦如何支持多任务、持续学习;③ 能指出推理延迟、秩选择等工程坑。
2️⃣ 标准答
External Parametric Memory 的核心思想:把任务/领域知识存储在一组独立于主模型的参数中,推理时动态挂载。这解决了全量微调的三大问题:灾难性遗忘、多任务部署成本高、显存爆炸。
主流技术分三类:
- Adapter 系列:在 Transformer 每层(或特定层)插入瓶颈结构。典型如 Adapter-BERT(Houlsby 2019):先降维到 d_bottleneck(通常 64-256),非线性激活,再升维回 hidden_size。为什么这么做?瓶颈迫使信息压缩,只保留任务关键特征,避免过拟合。坑:插入位置影响大。Houlsby 在每层 FFN 后加两个 Adapter(串行),Pfeiffer 2020 只加一个(并行)。实测并行 Adapter 推理延迟更低(约 5-10%),但串行在低资源任务上效果更好【通用知识】。
- LoRA 系列(Hu 2021):对权重矩阵 W ∈ R^{d×k} 做低秩分解:W' = W + BA,其中 B ∈ R^{d×r},A ∈ R^{r×k},r << min(d,k)。训练时冻结 W,只更新 B 和 A。为什么 r 通常选 8 或 16?不是玄学——r 控制记忆容量。r=1 相当于只学一个方向,r=64 接近全量微调但参数量爆炸。经验法则:r=8 在 70% 任务上达到全量微调 95%+ 性能【LoRA 论文 Table 9】。工程坑:LoRA 默认加在 Q 和 V 上,但加在 O 和 FFN 上对代码生成任务更有效(如 CodeLlama 的 LoRA 配置)。
- Prefix Tuning / Prompt Tuning(Li & Liang 2021):在输入序列前插入可训练的虚拟 token 嵌入。本质也是外部参数记忆——这些 token 的 embedding 矩阵就是记忆单元。trade-off:Prefix Tuning 参数量极小(0.1% 级),但需要调整 prefix length(通常 10-200),且对长序列任务(如摘要)效果不如 LoRA。
- IA3(Liu 2022):对 key、value、FFN 的中间激活做逐元素缩放(学习向量 l_k, l_v, l_ff)。为什么比 LoRA 更轻?IA3 不分解矩阵,只学缩放因子,参数量是 LoRA 的 1/10。但表达能力受限——只能调整幅度,不能改变方向。
如何实现“外部参数记忆”:训练时,主干模型冻结,只更新外部模块。推理时,根据任务 ID 加载对应模块(如 LoRA 权重),与主干拼接后前向。实际落地坑:多任务场景下,如果任务数 > 100,显存中同时存所有 LoRA 权重会爆炸。解法:用 LoRAHub(Huang 2023)或 MoRA(Zhang 2024)——将多个 LoRA 合并为共享基座 + 任务特定稀疏向量,参数量从 O(N*r) 降到 O(N + r)。
3️⃣ 答题模板(30 秒电梯版)
“这个问题我从三个层面回答:第一,External Parametric Memory 的本质是‘记忆与计算解耦’,典型技术包括 Adapter、LoRA、Prefix Tuning、IA3。第二,以 LoRA 为例,它通过低秩分解 W' = W + BA 实现外部记忆,r 控制记忆容量,训练时只更新 B 和 A。第三,工程上要关注推理延迟(Adapter 串行 vs 并行)和多任务显存优化(LoRAHub 合并)。总结一句:外部参数记忆的核心 trade-off 是‘记忆容量 vs 推理效率’,选型取决于任务数量和资源约束。”
4️⃣ 高频追问 & 应对
追问 1:LoRA 的秩 r 怎么选?为什么 r=8 在很多任务上够用?
核心是“低秩假设”——预训练权重 W 的更新量 ΔW 本质是低秩的。LoRA 论文用 SVD 分解了 GPT-2 的 ΔW,发现前 10 个奇异值就占了 90% 的 Frobenius 范数。r=8 能捕获主要方向。但代码生成、数学推理等需要精确记忆的任务,r 要升到 16-32。工程建议:先用 r=8 跑小规模实验,如果验证集 loss 不降,再翻倍 r 并检查是否过拟合。
追问 2:Adapter 和 LoRA 哪个推理延迟更低?
看实现。Adapter 串行(Houlsby 式)每层多两次线性变换,延迟增加 10-30%。LoRA 的 BA 矩阵可以合并到 W 中(W' = W + BA),推理时零额外延迟——但代价是切换任务要重新计算 W'。实际取舍:如果任务切换频繁(如对话系统每轮换 domain),用 Adapter 并行(Pfeiffer 式)更优,因为只需切换 Adapter 模块,主干不变;如果任务固定(如专用翻译模型),用 LoRA 合并后推理更快。
追问 3:如何用外部参数记忆做持续学习(continual learning)?
核心挑战是灾难性遗忘。解法:① Progressive Adapter:每学一个新任务,新增一个 Adapter 模块,推理时用门控网络选择。② LoRA 叠加:每个任务学独立的 BA,推理时按任务 ID 加载。坑:任务数增长后,参数线性增长。优化:用 EWC(Elastic Weight Consolidation) 对旧任务的 LoRA 权重施加正则,只更新新任务的 BA——但 EWC 需要存储 Fisher 信息矩阵,显存开销大。更轻量的方案是 Replay:在训练新任务时混入 5-10% 旧任务数据,配合 LoRA 微调。
5️⃣ 避坑 · 常见错误答法
- ❌ 说“LoRA 和 Adapter 本质一样,都是加小网络” → ✅ 正确切入:LoRA 是低秩分解(矩阵乘法),Adapter 是瓶颈结构(降维-升维)。LoRA 可合并到主干实现零延迟,Adapter 不能合并。两者参数量级也不同:LoRA 的 r=8 约 0.1% 参数量,Adapter 的 bottleneck=256 约 2-5%。
- ❌ 说“外部参数记忆只适用于 NLP” → ✅ 正确切入:CV 领域也有类似技术,如 ConvLoRA(对卷积核做低秩分解)、Adapter for ViT。本质是“冻结主干,训练轻量旁路”,与模态无关。
- ❌ 说“r 越大越好” → ✅ 正确切入:r 大不一定好。LoRA 论文实验显示,r=64 在部分任务上反而比 r=8 差,因为低秩分解引入的噪声干扰了主干。经验法则:r 与任务复杂度正相关,但不超过 32。
6️⃣ 简历呼应
- 如果你有 RAG 项目:从“多任务 Agent 的 memory 管理”切入——用 LoRA 为每个 domain(如医疗、法律)训练独立模块,推理时根据 query 分类器选择 LoRA,避免 RAG 检索到的文档冲突。强调你实测过 10 个 LoRA 并行加载的显存优化(如用 LoRAHub 合并)。
- 如果你只做过传统 NLP:用“特征工程 vs 端到端”类比——传统 NLP 中手工特征(如 TF-IDF)是外部记忆,LoRA/Adapter 是自动学习的轻量特征。强调你理解“参数高效”对部署的价值(如 BERT 全量微调需要 12GB 显存,LoRA 只需 2GB)。
- 如果你是校招无项目:聚焦 LoRA 论文复现——用 HuggingFace PEFT 库在 GLUE 上跑对比实验,记录 r=8/16/32 的性能和参数量,输出一张 trade-off 表格。强调你理解“低秩假设”的数学基础(SVD 分解)。
7️⃣ 延伸阅读
- LoRA: Low-Rank Adaptation of Large Language Models (Hu et al., 2021)
- Adapter-BERT: Parameter-Efficient Transfer Learning for NLP (Houlsby et al., 2019)
- Prefix-Tuning: Optimizing Continuous Prompts for Generation (Li & Liang, 2021)
- IA3: Infused Adapter by Inhibiting and Amplifying Inner Activations (Liu et al., 2022)
- LoRAHub: Efficient Cross-Task Generalization via Dynamic LoRA Composition (Huang et al., 2023)