一句话定义:Adapter(适配器层)是插进预训练模型内部的一种小型可训练模块——微调时把主干权重全部冻住,只更新这些插进去的小模块。
它长什么样、插在哪里
一个典型的 Adapter 是“瓶颈”结构:先把输入向量降维到很小的维度(down-projection),过一层非线性激活,再升维回原来的维度(up-projection),最后和原始输出相加。这个残差连接很关键,保证初始状态下模型行为几乎不变,训练是从“什么都不改”开始慢慢加的。
插的位置通常在 Transformer 块内部:注意力子层之后一个,前馈子层之后再来一个。也就是每个块里多出两条小路,信号走完原路,再绕进这个小盒子里处理一下再回来。
打个比方:预训练好的模型像一栋已经建好的写字楼,每层的管线通向每个工位。现在要接一套新的外部系统,不去改楼里的原有线路,只在每层走廊装一个转接箱——信号进门先绕进箱子转一道,再回到原线路。楼体不动,箱子随时可换可拆。
好处很直接:每个任务只存一堆转接箱,体量远小于整个模型;A 任务做完换 B 任务,把箱子换成 B 那套就行。多语言、多业务线的部署里,“一份底座 + 若干轻量差异文件”就是这么来的。
和 LoRA 差在哪
LoRA 是给已有的权重矩阵叠加一个低秩增量,形如 W + BA,改的是“原有矩阵的数值”;Adapter 是往网络里新增一段串行结构,改的是“网络里多插了一层”。
| 维度 | Adapter(适配器层) | LoRA(低秩适配) |
|---|---|---|
| 插入方式 | 子层输出后串行插入新模块 | 叠加在已有权重矩阵上 |
| 是否引入非线性 | 是(瓶颈 MLP) | 否,纯线性 |
| 推理开销 | 通常保留在计算图里,多一次串行计算 | 可合并回原权重,推理零额外延迟 |
| 能否精确合并 | 有非线性,难以精确合并 | 可以精确合并 |
| 多任务切换 | 换模块 | 换增量 |
取舍由此而来:LoRA 在延迟敏感的线上服务里更常见,因为合并之后等于没加东西;Adapter 表达力更强一点(多了非线性),但要付出推理时多走一段的代价。两者都属于参数高效微调(PEFT),训练显存和存储都远比全量微调友好。
对从业者的意义
Adapter 是“冻结主干、只训小模块”这条路线里最早被大规模验证的做法之一,和 LoRA、Prefix Tuning 是一家人。它的价值不只是省显存,更在于把“模型能力”和“任务适配”拆成了两层:底座归底座,适配归适配。垂直领域适配、多租户部署、边缘端放一个小文件就能换能力,都是这个思路的直接收益。
选型上可以这样想:如果推理延迟卡得很死,优先看能合并的方案;如果需要更强的任务偏移表达能力,或者手上的框架本来就有 Adapter 的实现,那就直接用。具体某个框架支持哪些变体、怎么配置,以官方文档为准。
