Home / 大语言模型 / Adapters:每个任务只保存一小组新增参数

020|Adapters:每个任务只保存一小组新增参数

目录 · 上一篇 · 下一篇

论文:Neil Houlsby 等,Parameter-Efficient Transfer Learning for NLP,ICML 2019。原文 · PDF。讨论原版瓶颈 adapter 与相应 BERT 微调实验,不把 LoRA、prefix 或所有现代 PEFT 方法混作相同实现。

先接住前作的问题

BERT通过全量微调迁移任务,却意味着每个任务可能保存一套大骨干。未解的资源问题是:任务变化能否由较小增量承担,让基础参数共享?本篇在BERT中组合瓶颈模块,改变可训练参数空间,而不重写预训练目标。

五个前置概念

五个前置概念是冻结参数、瓶颈变换、恒等初始化、优化器状态和共享骨干。它们分别解释学习范围、表达限制、稳定起点、训练资源和多任务存储方式。

一、问题设定:每增加一个任务是否必须再保存完整预训练模型

十个分类任务各自保存完整BERT,会重复存储大量相似基础知识。共享骨干并独立保存任务增量可降低边际存储,也避免直接覆盖其他任务使用的主参数;但适配变化能否被小模块表达,需要质量与容量实验检验。

原论文还训练 LayerNorm 参数与任务输出层。因此“只训练 adapter”是过度简写,复现时必须说明哪些参数冻结、哪些可更新。遗漏这点可能改变质量,也让参数数量统计不准确。

二、由瓶颈残差推导受限增量和局部秩

给定隐藏向量 h∈Rdh\in\mathbb R^d,瓶颈维度为 m≪dm\ll d:

Adapter⁡(h)=h+Wupf(Wdownh+bdown)+bup.\operatorname{Adapter}(h)=h+W_{up}f(W_{down}h+b_{down})+b_{up}.

WdownW_{down} 把维度降到 mm,非线性产生任务相关变换,WupW_{up} 映射回原维度。残差让模块可以接近恒等映射,避免初始化时大幅破坏预训练表示。参数量约为 2dm+d+m2dm+d+m,远小于多个 d×dd\times d 稠密变换。

原版在 Transformer 每层的注意力相关子层与前馈相关子层后插入模块,具体位于投影后、相应残差与归一化安排之中。位置影响信息和梯度路径,不是把任意小 MLP 放在网络末尾都能视为同一方法。

冻结权重通常仍参与前向;为了更新较早 adapter,也可能需要通过冻结层计算输入梯度。因而节省优化器状态不代表整个反向图消失。训练显存还取决于激活保存、精度和实现方式。

小瓶颈改变的是增量,而非整条表示维度

Adapter可写成 a(h)=h+Wupϕ(Wdownh+bdown)+bupa(h)=h+W_{up}\phi(W_{down}h+b_{down})+b_{up}。这里 Wdown,WupW_{down},W_{up} 为降维、升维矩阵,bdown,bupb_{down},b_{up} 为偏置,ϕ\phi 为逐元素非线性;II 是 dd 维恒等矩阵,DϕD_\phi 是当前点的激活导数对角矩阵。hh 始终保留d维旁路,只把任务增量限制在m维中间表示。忽略非线性切换时,其局部Jacobian为 I+WupDϕWdownI+W_{up}D_\phi W_{down},相对恒等映射的增量秩不超过m。这个局部结论不能推广为“整个微调网络秩只有m”;多个插入位置和非线性会复合。

把适配器的任务存储与执行路径分开

若宽度为100、瓶颈为4,只计两块主矩阵,单模块任务增量为800个权重;但它每次仍要先把100维降到4维,再升回100维并加残差。为十个任务保存增量约8000个权重,并不意味着一次运行十个模块,也不意味着可跳过共享骨干。

教法联系:Sourab Mangrulkar、Sayak Paul的Parameter-Efficient Fine-Tuning。算例为本文自构。

三、列清冻结范围、额外参数和实际执行路径

输入:预训练Transformer、下游任务数据、瓶颈维度m
冻结主要骨干权重
按原版位置插入近似恒等初始化的adapter
解冻adapter、指定LayerNorm参数与任务输出层
重复训练:
    运行共享骨干与任务adapter
    计算任务监督损失
    只更新允许训练的参数
保存共享骨干一次,分别保存各任务增量
推理时加载对应任务模块并运行完整路径

教学算例。 d=768,m=64d=768,m=64 时,一个adapter有 2dm+d+m=991362dm+d+m=99136 个参数;每个Transformer层插入两处,12层合计2,379,264,另加任务头与可训练LayerNorm。只报 dmdm 会漏掉升维矩阵、偏置与第二个插入位置。冻结骨干节省梯度及优化器状态,不自动免掉经过骨干的激活与反传计算。

执行一个任务时仍要加载并运行约 103 单位参数路径,所以推理没有变成只算那 3 单位。若多个任务请求交错,模块切换和批处理也会影响延迟。参数高效与计算高效必须分别定义。

四、按多任务总存储口径读取GLUE与模块消融

它没有直接优化多任务联合知识共享,也不保证不同 adapter 可以随意相加组合。

存储收益要按多个任务累计;单任务仍运行共享骨干,所以表中倍数不是推理加速比。

项目 原文范围
骨干 预训练 BERT,主要权重冻结
任务 GLUE 及额外分类任务,规模与类别数不同
对照 全量微调与不同 adapter 规模、设计
调参 瓶颈维度、学习率、epoch 等;多次随机运行按验证集选最佳
指标 各任务评分与全部任务总参数量,不是统一准确率
额外可训练项 LayerNorm 与分类层需计入
成本边界 新增参数比例不直接等于训练时间或推理速度改善

证据一,图2。架构和绿色可训练部分明确哪些参数改变。这是读懂参数效率的基础,不能只看一个压缩百分比。 原图绿色部分才是适配时更新的模块,其中包含 LayerNorm;瓶颈矩阵之外的绿色层不能从参数账本里删掉。

Adapter在Transformer层中的插入位置与内部降维升维结构
原文图形摘引:Neil Houlsby 等,2019,图2,PDF第3页;核对原文。原版权保留。

证据二,表1。调节规模的 adapters 平均 GLUE 为 80.0,全量微调为 80.4;为全部表列任务保存模型时,总参数约 1.3 倍与 9 倍骨干。这里比较的是多任务总存储口径,不能说单个推理模型变成原来的九分之一。

Adapters与BERT全量微调在GLUE上所需参数及任务分数
实验结果表摘引:Neil Houlsby 等,2019,表1,PDF第5页;核对原文。原版权保留。

证据三,第 3.6 节与设计分析。不同模块方案、瓶颈和移除实验研究容量及插入位置。它们支持简单瓶颈方案在这些任务上有效,但不证明任意新领域都只需要很小维度。

论文为缓解不稳定运行多个随机种子并选验证集最佳。因此表格不是这些运行的平均。若只复现一次,结果可能不同;报告时应把选择规则与调参预算列清楚。

构造一个骨干有 100 单位参数,每个任务增量为 3。十个任务完整微调需约 1000 单位存储;共享骨干加十个增量为 130。这个自构算例解释边际存储收益,而非论文具体模型数据。

五、小模块表达、任务隔离与串行延迟各有限制

再假设新任务要求完全不同的输入表示,小瓶颈可能表达不足。增大 mm 可以提高能力,也增加参数和计算。正确问题不是“adapter 能否匹配所有任务”,而是质量随任务难度和增量预算怎样变化。

共享骨干冻结还改变了任务间干扰的方式。训练新任务的独立 adapter 不直接覆盖旧任务骨干参数,所以旧模块可继续使用原表示;但如果同时修改共享 LayerNorm、词表或公共预处理,隔离就可能被破坏。实际部署应明确哪些增量按任务保存,哪些组件真正共享。模块化提供可管理边界,不是所有组合都自动没有遗忘。

全量微调允许骨干所有参数改变,表达范围大但每任务存储高;adapter 冻结骨干,通过新增非线性模块修改表示。LoRA 则通常将某些权重变化限制为低秩形式,计算接口不同,是否能合并进原权重也不同。

所以不能因为两者都参数少,就假定部署成本一致。含非线性的串行 adapter 通常不能直接通过简单矩阵相加消除;其存在可能增加网络深度和调度开销。质量接近不等于执行特性相同。

限制包括容量不足、串行延迟、任务切换、骨干依赖以及训练参数口径容易被误报。

六、把本篇机制再推进一步

1. 新任务只换adapter,却改动共享LayerNorm,旧任务还能保证完全不受影响吗?

参考答案:不能。旧任务仍使用共享LayerNorm时,其计算已改变,即使旧adapter权重未动。要获得任务隔离,需明确哪些归一化参数、词表与预处理按任务保存、哪些真正共享;模块化是可管理边界,不是自动无遗忘的证明。

七、对照全量微调与可合并的低秩权重增量

串行瓶颈模块会留在执行路径中。LoRA改为可合并的低秩权重增量,Prefix-Tuning改为可读取状态。三者都应同时比较任务存储、训练激活与推理路径。

自测与参考答案

1. 冻结骨干为什么不等于训练时不用经过骨干?

它仍参与前向生成表示,较早可训练模块还可能需要梯度穿过后续冻结层。冻结只阻止更新其权重,不自动移除计算和所有激活保存。

2. 1.3 倍与 9 倍参数比较说明什么?

说明完成一组任务时,共享骨干加任务增量的总存储更小;不是单个任务推理只运行九分之一模型。资源口径必须明确为多任务总参数。

3. 为什么原版不能简写为只更新两个瓶颈矩阵?

还包含偏置、指定 LayerNorm 和任务输出层等可训练项。它们影响参数统计与性能,完整复现应列出训练白名单,而非仅凭方法名冻结其余所有东西。