大模型的PEFT~ 参数高效微调 Parameter-Efficient Fine-Tuning

📅 2026/7/16 3:14:38
大模型的PEFT~ 参数高效微调 Parameter-Efficient Fine-Tuning
Parameter-Efficient Fine-Tuningpəˈræmətər ɪˈfɪʃnt faɪn ˈtuːnɪŋ参数高效微调Tuningˈtjuːnɪŋn. 调音起音定音音调电子或收音机调谐协调一致LoRA dominates modern practice, but it is not the only parameter-efficient method. For completeness, the main alternatives:PEFT method families. LoRA is the de facto standard for LLM fine-tuning; the others are included for historical context and niche use cases.LoRA 在现代实践中占据主导地位但它并非唯一一种参数效率高parameter-efficient的方法。为了完整性这里还列出了其他主要的方法PEFT 方法家族LoRA 是 LLM 微调的默认标准其他方法则因历史原因存在且主要用于特定领域的应用场景nicheniːʃ小众n. 合适称心的工作活动one’s niche壁龛产品的商机生态位一个生物所占生境的最小单位v. 把……放在壁龛中adj. 产品针对特定小群体的Adapters定义MLP 多层感知机Multi-Layer Perceptron就是最简单的全连接神经网络普通 MLP 结构输入 → Linear → 激活 → Linear → 输出小型 MLP相比 Transformer 主干巨大维度它宽度很小、参数量远少于主干模型瓶颈 Bottleneck 结构先压缩维度 → 激活 → 再恢复维度假设 Transformer 层输出维度 d_model 512hidden_dim 远小于 d_model输入(512) → Linear(512→64) → Activation(GELU) → Linear(64→512) → 输出先降维压缩到很小的通道比如 64再升维还原中间窄通道就是 “瓶颈” bottleneck整套模块参数量很少属于小型子网络原始 TransformerSelf-Attention → FFN插入 Adapter 后Self-Attention → Adapter(小型瓶颈MLP) → FFN → Adapter(小型瓶颈MLP)只训练这些新增的小 MLP主干大模型冻结属于参数高效微调为什么叫 Bottleneck优点模块化可以自由插入、堆叠理论上表达能力很强缺点也是现在很少用的原因推理时串行执行必须等 Adapter 计算完才能往下走增加推理时延LoRA 直接在权重矩阵旁附加低秩矩阵推理时可以预先合并没有额外延迟和 LoRA 直观对比Adapter新增独立小型网络推理多一套计算延迟上升LoRA新增低秩矩阵推理前可以融合进原始权重无额外时延为什么说LoRA 修改线性层计算路径而Adapter 额外插入独立子网络误区LoRA 也是新增网络LoRA 只是新增两个矩阵嵌入原有算子没有形成独立 “网络模块”Adapter 是完整的「线性→激活→线性」小型网络是独立子模块LoRA不插新模块在线性层内部并行追加一条计算支路能合并消除额外开销Adapter在层与层之间塞进一套独立小型网络数据必须串行走一遍无法消除推理延迟训练流程这套是 Houlsby Adapter2019 原始论文标准方案放两个 AdapterSelfAttention ↓ Adapter两层全连接子网络 ↓ FFN ↓ Adapter两层全连接子网络相当于SelfAttention ← 计算token关联 ↓ 【Adapter1】← 修正注意力输出的特征 ↓ FFN ← 独立加工每个token特征 ↓ 【Adapter2】← 修正FFN输出的特征Transformer 有两处信息变换阶段自注意力模块输出、前馈网络 FFN 输出两处都需要引入可学习微调支路模型需要在特征两个不同阶段注入微调能力Transformer 单层原生结构回顾→ SelfAttention捕捉token之间关系 → FFN对每个token独立做非线性特征变换 → 输出两个模块负责完全不同的语义运算Self-Attention交叉 token 关系建模上下文关联FFN单 token 独立特征映射词本身语义加工为什么两处都插 Adapter原始论文设计思路微调信号既需要修正「token 之间的关联计算」也需要修正「单个 token 内部特征变换」简单理解注意力算完上下文 → 先微调一次FFN 加工单词特征 → 再微调一次。变体对比拓展后来有人提出 Parallel Adapter / 只放一处只在 Attention 之后放一套 Adapter参数量更少但大量实验证明Houlsby 双 Adapter 表达能力更强微调效果普遍优于单 Adapter。代价就是参数量翻倍、推理延迟更高小节小型瓶颈 MLP 就是一套窄通道的两层全连接网络作为独立插件插入 Transformer 层之间训练时只更新插件权重实现高效微调代价是推理变慢为什么 LoRA 是赢家LoRA 之所以成为行业标准是因为它同时具备四大独特优势零推理额外开销zero inference overheadLoRA 适配器权重可以直接合并进基础模型权重反观 Adapter、Prefix Tuning要么增加推理延迟要么占用输入上下文长度可组合性热切换能力composability多套独立 LoRA 适配器在模型服务运行阶段可以动态切换非常适合多租户multi-tenant deployments业务部署场景完善生态支持ecosystem supportHuggingFace PEFT、TRL、vLLM 以及各大主流框架都对 LoRA 提供原生一级支持first-class support大规模生产场景验证成熟Meta、Google 均在生产环境落地同时 HuggingFace 绝大多数开源模型微调项目都使用 LoRA除非你遇到 LoRA 无法满足的特殊约束否则默认优先选择 LoRALoRA 胜出四大核心① 推理无额外时延② 支持在线动态切换权重适配多租户③ 主流开源框架全面原生支持④ 经过大厂大规模生产验证Prefix Tuning针对 Transformer 每一层 Attention在该层的 keys、values 前方拼接一组可学习的虚拟 Tokenprefix 前缀向量Prompt Tuning 只在最顶层输入加虚拟 tokenPrefix Tuning每层 Transformer 内部都单独拥有一套可学习前缀向量优点完全不改动主干模型权重只新增少量前缀参数在生成类任务文本续写效果表现很好短板consumes context length永久占用上下文窗口长度假设设置前缀数量为 10那么输入可用长度 最大上下文长度 - 10用户真实文本能塞进模型的 token 变少推理无法合并消除开销每一层 Attention 都要拼接前缀 KV推理全程额外运算带来延迟长文本任务退化明显为什么现在很少用被 LoRA 挤压前缀永久占用上下文长度挤压用户输入 token 上限推理时每层都要拼接 KV存在持续额外计算开销不能像 LoRA 一样权重合并持续带来推理时延多层独立前缀参数量比 Prompt Tuning 更大长文本场景性能衰减定位Niche小众方案一般只用在部分生成类专项实验线上业务几乎不用示例原始标准AttentionQ [T1_q, T2_q, T3_q] K [T1_k, T2_k, T3_k] V [T1_v, T2_v, T3_v] Attention(Q, K, V)Prefix Tuning 改造后# Queries 完全不变只有真实token不加任何前缀 Q [T1_q, T2_q, T3_q] # Keys前面拼接可学习虚拟前缀 P1,P2 K [P1_k, P2_k, T1_k, T2_k, T3_k] # Values 和 Keys 保持对齐同样前置拼接前缀 V [P1_v, P2_v, T1_v, T2_v, T3_v] Attention(Q, K, V)Query 只有 3 条来自真实 tokenKV 序列长度变成 235所以每个真实 token Query会同时去匹配2 个虚拟前缀 P1、P23 个真实 token T1、T2、T3虚拟前缀没有对应的 Query前缀之间不会互相做注意力匹配前缀只充当「全局上下文线索」给真实 token 提供额外可学习的先验信息假设模型最大上下文窗口 max_seq_len 512固定设置 prefix_len2用户能输入的真实 token 上限 512 - 2 510虚拟前缀永久抢占 2 个位置用户可用长度被压缩什么叫给模型注入任务专属的 “先验指导信息”不改动预训练大模型主干权重只通过在每一层注意力引入可学习的虚拟前缀 KV 向量给模型注入任务专属的 “先验指导信息”让模型适配下游生成任务大模型主干冻结预训练模型知识保留完整避免微调破坏通用能力只训练少量新增前缀参数属于参数高效微调虚拟前缀充当「任务提示」可以把 P_1,P_2…P_n 理解成模型学出来的隐形任务指令不是人工写的文本 prompt是可学习向量人工 prompt请用诗歌风格回答xxxxPrefix Tuning模型自动学习一组向量等价于记住「当前任务该怎么生成」它最适合的场景自回归生成任务文本续写、摘要、对话模型生成下一个 token 时每个 Query 都能看到这组全局虚拟前缀持续约束生成风格、格式、任务目标Prompt Tuning 在你问题最前面塞一句固定提示词Prefix Tuning 在模型每一层思考环节都放一张隐形备忘录持续提醒模型你现在的任务是写摘要。为什么放在每一层 Attention 的 KV 上而不是输入开头早期发现只在输入层加软 promptPrompt Tuning信号很难穿透深层 Transformer把前缀放到每一层注意力内部任务信号可以直接作用于每一层特征变换长文本生成任务效果明显更强Prefix Tuning 目标冻结主干模型在 Transformer 每一层 Attention 的 KV 前端拼接可学习虚拟前缀向量为下游生成任务持续注入任务先验相比仅输入层加软提示任务信号能直达网络深层生成效果更强代价是占用上下文窗口推理存在额外开销训练流程真实文本Token ↓ Transformer Layer l Q 真实token投影 K [前缀K] [真实K] V [前缀V] [真实V] ↓ Attention计算 ↓ FFN...输出预测token ↓ 计算Loss ↓ 反向传播只更新每层的Prefix KV主干锁住不动Prompt Tuning提示微调Prompt Tuning 软提示Soft Prompt微调冻结整个大模型主干权重只在输入 Embedding 层、真实文本最前面拼接一组可学习的虚拟 Token 向量仅训练这一小部分向量实现下游任务适配硬提示和软提示人工手写提示词 “翻译成中文xxx” → Hard Prompt硬提示模型自动学习的连续向量前缀 → Soft Prompt软提示Prompt Tuning示例设定虚拟 token 数量 2P1,P2真实输入 token T1,T2,T3Prompt Tuning 输入序列构造输入Embedding序列 [P1, P2, T1, T2, T3]整条序列送入 Transformer第一层之后后续所有网络层不再新增任何向量简单对比 Prefix TuningPrompt Tuning只在最开头加一次虚拟 Token贯穿所有层Prefix TuningTransformer 每一层 Attention 内部都单独新增一套 KV 前缀训练流程冻结主干预训练模型全部参数 requires_gradFalse初始化参数创建一组可学习向量 P [p1,p2…pn]虚拟软提示前向传播真实文本编码得到 [T1,T2,T3]在序列头部拼接软提示[P1,P2,T1,T2,T3]完整序列送入 Transformer 逐层前向计算反向传播计算预测 Loss梯度只更新 P1、P2 向量主干模型完全不动保存产物训练完成只保存这一小段软提示向量优点参数量极少0.01%所有 PEFT 里最轻量方案之一实现最简单不用改动模型内部注意力逻辑缺点weaker than LoRA for complex tasks任务指令信号只在输入层注入随着层层前向传播引导能力会不断衰减复杂任务、长文本任务效果明显弱于 LoRA、Prefix Tuning