社区医院要服务越来越多的老年患者、儿童患者和运动损伤患者,但院长不可能为每一类患者推倒整栋楼重新装修。他的做法是:保留原来的综合门诊,在关键楼层挂出几个轻量的“专科诊室”。患者来了,先挂号分流,由专科诊室完成针对性诊疗;大楼原有的科室照常运转。这套“不动主体、只加模块”的思路,就是大模型高效微调领域的 Adapter Tuning。 Adapter Tuning 的核心洞见是:预训练大模型已经学会了通用的语言知识,我们不需要为了一个具体任务去重训几百亿参数,而只需在模型的若干层插入小型可训练模块(Adapter),训练时冻结原模型、只更新这些模块。相比全量微调,显存占用大幅下降,每个任务的权重只有几 MB,切换任务像换诊室挂牌一样轻快。文章会从 Adapter 的结构与训练流程讲起,接着聊超参配置、规模选择、与 LoRA 的对比、多任务管理,最后落到工程实践。

岗位关联

对 AI 从业者而言,Adapter Tuning 是“低成本把大模型落地到业务”的核心技能之一,掌握它意味着你可以在有限算力下快速产出多个可交付的模型副本,这份效率正是企业在微调环节最看重的竞争力。

目录
  1. 可视化演示
  2. 适配器原理
  3. 训练流程
  4. 超参配置
  5. 规模选择
  6. 对比LoRA
  7. 多任务管理
  8. 工程实践
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示Adapter模块插入Transformer层的瓶颈架构、参数效率对比及与LoRA的差异,直观理解参数高效微调的核心机制。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Adapter瓶颈架构 瓶颈维度b将d维压缩至低维再恢复 冻结原始权重仅训练Adapter参数 d→b→d (b≪d) 瓶颈结构实现参数高效

适配器原理

社区医院院长发现,老年患者和运动损伤患者的就诊需求截然不同,他不想为两类人各盖一栋新楼,于是在现有大楼的走廊里隔出两个“专科诊室”。诊室不大,但配置齐全:导诊台先把患者信息浓缩成一张关键卡片(降维),专科医生快速研判(非线性激活),药房再按处方配齐药品(升维)。整个流程结束后,患者的原始病历仍会被完整归档——这就是残差连接,确保原有的诊疗记录不会因专科处理而丢失。

Adapter Tuning 的设计动机正是如此。直接微调上百亿参数的预训练模型,需要完整保存梯度、优化器状态和备份权重,成本极高。而 Adapter 是一个插在 Transformer 层内部的小型瓶颈网络:先通过下投影将 d 维特征压缩到 r 维瓶颈空间,经过激活函数后再通过上投影恢复 d 维。训练时冻结预训练权重,只更新这些额外的 Adapter 参数,通常总体新增参数不到基座模型的 5%。

其前向传播可以写成:

回到医院比喻:Adapter 之所以高效,是因为它没有要求大楼做出任何结构性改变,只新增了几间可拆卸的诊室。你甚至可以在训练完成后把这间诊室“搬走”,换到另一栋分院(另一个基座模型)复用。

h′=h+σ(hWdown)Wup\displaystyle h' = h + \sigma(h W_{\text{down}}) W_{\text{up}}
这个公式描述的是:原始特征 h 先走一遍“浓缩—判断—还原”的专科流程,再把结果加回原特征,相当于在大楼原有的通道旁新增了一条不影响主路的支线。
  1. 降维投影先把高维特征 h 乘以下投影矩阵,压缩到低维瓶颈空间,就像导诊台把复杂病情浓缩成一张关键卡片。
    hWdown∈Rr,r≪d\displaystyle h W_{\text{down}} \in \mathbb{R}^{r},\quad r \ll d
  2. 非线性激活对浓缩后的信息做非线性变换,让 Adapter 具备拟合复杂映射的能力,如同专科医生结合经验做判断。
    σ(⋅)\displaystyle \sigma(\cdot)
  3. 升维还原乘以上投影矩阵,把处理结果恢复回原始维度,相当于药房按处方配好药并整理成标准病历格式。
    σ(hWdown)Wup∈Rd\displaystyle \sigma(h W_{\text{down}}) W_{\text{up}} \in \mathbb{R}^{d}
  4. 残差汇合将专科处理结果与原始特征相加,保证主路信息不丢失,训练也更稳定。
    h′=h+Δh\displaystyle h' = h + \Delta h

训练流程

增设一间专科门诊,院长会按标准流程走:先装修诊室、挂好科室牌,原大楼科室不停诊;接着用真实病例试运营,让专科医生积累经验;最后把诊疗方案沉淀成一套标准作业流程。Adapter 的训练流程与之几乎一一对应。

第一步,在预训练模型的若干层后插入 Adapter 模块,这相当于完成诊室装修;第二步,冻结基座模型的所有参数,也就是让原有科室全部照常运转、不参与调整;第三步,准备任务数据并构造损失函数,用反向传播只更新 Adapter 的梯度;第四步,训练完成后只保存 Adapter 权重文件,部署时随基座模型一起加载。

训练目标可以表示为:

训练结束时,医院主楼的每一块砖都没动过,但大楼里多了一间能精准处理某一类病症的诊室。而这间诊室的全部家当——Adapter 权重——往往只有几十兆甚至几兆,可以随业务需求快速打包下发。

L(θA)=1N∑i=1Nℓ(fW0,θA(xi),yi)\displaystyle \mathcal{L}(\theta_{\mathcal{A}}) = \frac{1}{N} \sum_{i=1}^{N} \ell\big(f_{W_0, \theta_{\mathcal{A}}}(x_i), y_i\big)
公式想表达的是:基座参数 W0 全程不动,只有 Adapter 参数 θA 在承担“学习新任务”的责任。
  1. 输入样本与标签每个训练样本 (xi, yi) 是一份患者的真实病例,xi 是症状描述,yi 是最终诊断结论。
    (xi,yi),i=1,…,N\displaystyle (x_i, y_i),\quad i = 1, \dots, N
  2. 前向输出f 表示整个大模型前向传播,其中 W0 是冻结的基座参数,θA 是待训练的 Adapter 参数。
    fW0,θA(xi)\displaystyle f_{W_0, \theta_{\mathcal{A}}}(x_i)
  3. 单样本损失ℓ 计算模型预测与真实标签的差距,相当于评估专科医生这次诊断偏了多少。
    ℓ(⋅,yi)\displaystyle \ell(\cdot, y_i)
  4. 平均损失对所有样本的损失取平均,得到当前 Adapter 配置下的整体“误诊率”。
    1N∑i=1Nℓ(⋅)\displaystyle \frac{1}{N} \sum_{i=1}^{N} \ell(\cdot)

超参配置

同样是专科诊室,仪器数量、专家排班、接诊上限都会直接影响诊疗质量。Adapter 训练也有几项关键“资源配置”:学习率决定专科医生每次吸收新知识的速度;训练轮次决定病例反复研讨的遍数;批大小决定每批同时看多少患者;正则策略则防止医生只背下个别病例、失去泛化能力。

经验上,Adapter 参数少、约束强,学习率可以比全量微调更大。全量微调常用 1e-5 到 3e-5,而 Adapter 常设为 1e-4 到 3e-4,有时甚至更高。训练轮次不必太多,尤其当任务数据只有几千条时,3 到 5 轮往往足够;轮次过多,Adapter 会开始“背诵”训练集,反而损害泛化。批大小主要受显存约束,可配合梯度累积调整。正则方面,weight decay、Adapter 内部的 dropout 都能有效抑制过拟合。

学习率放大关系可以用一个简单式子概括:

配置超参就像调节诊室的接诊节奏:节奏太慢,训练迟迟不收敛;节奏太快,医生会形成错误的惯性判断。实际项目中,通常先按上述经验值起步,再用小规模验证集做几次对比实验,找到最稳的配置。

lrA=lrbase×α,α∈[3,10]\displaystyle \text{lr}_{\mathcal{A}} = \text{lr}_{\text{base}} \times \alpha,\quad \alpha \in [3, 10]
这条式子说明:Adapter 允许用更大的步长去收敛,因为它只影响一个低维子空间,扰动范围远小于全量微调。
  1. 基线学习率lr_base 是同一个任务做全量微调时使用的学习率,相当于医院其他科室的常规排班节奏。
    lrbase\displaystyle \text{lr}_{\text{base}}
  2. 放大系数α 表示 Adapter 可以把学习率放大几倍,常见取 3 到 10,因为待训练参数少、过拟合风险相对可控。
    α∈[3,10]\displaystyle \alpha \in [3, 10]
  3. 实际学习率两者相乘得到 Adapter 真正使用的学习率,参数更新步长更大,收敛也更快。
    lrA\displaystyle \text{lr}_{\mathcal{A}}

规模选择

诊室该建多大?太小了,复杂一点的病症根本施展不开;太大了,既浪费空间,又容易让医生分心处理过多无关信息。Adapter 的“诊室面积”对应两个维度:瓶颈宽度 r 和插入层数 L。

瓶颈宽度 r 是 Adapter 中间那层低维空间的维度。r 太小,信息在“浓缩”时损失过多,任务难学;r 太大,参数量上升,训练变慢,且在数据量不足时更容易过拟合。实践中,隐藏维度 d 为 768 左右的模型,r 取 64~256 是常见区间;d 更大的模型可以适当上探,但仍需用验证集权衡。插入层数方面,并非每一层都需要插 Adapter:在 attention 子层和 FFN 子层后各插一次是经典方案,但如果算力有限,只插后半部分层也常能取得不错效果。

新增参数量可以估算为:

回到医院比喻:一间诊室不必占一整层楼,够用就好。Adapter 规模选择的本质是在“表达力”和“性价比”之间找平衡——把诊室面积控制在能稳定治愈绝大多数病例的尺度,既省钱又不误诊。

Padapter=2×d×r×L\displaystyle P_{\text{adapter}} = 2 \times d \times r \times L
这个公式帮助理解:Adapter 的参数量接近“两个投影矩阵”的总大小,它只占基座模型参数的很小比例。
  1. 单个投影矩阵规模每个投影矩阵是 d 行 r 列,规模为 d×r。
    d×r\displaystyle d \times r
  2. 两个投影矩阵Adapter 包含下投影和上投影两个矩阵,因此乘以 2。
    2×d×r\displaystyle 2 \times d \times r
  3. 乘以插入层数每个插入位置对应一组 Adapter,若共有 L 层插了 Adapter,总参数量还需乘 L。
    2×d×r×L\displaystyle 2 \times d \times r \times L

对比LoRA

如果说 Adapter 是大楼里新开的专科诊室,那 LoRA 就是另一套思路:不新增诊室,而是让现有医生内部进修。进修期间,医生原有的执业资格证(矩阵 W0)不动,只是额外记了一本“低秩笔记”,每天用笔记里的浓缩经验去修正诊疗方案。LoRA 对权重矩阵做低秩分解,学习一个增量 ΔW = BA,其中 B、A 是两个小矩阵,相乘后近似原矩阵的更新方向。

两者最大的区别在结构上。Adapter 是插入层间的额外子网络,包含非线性激活和残差;LoRA 则是与原始线性层并联的低秩分支,推理时可以合并回原权重,因此几乎不增加额外延迟。参数量上,LoRA 通常更小,A、B 两个矩阵的规模由秩 r 决定,往往只有 Adapter 的几分之一。性能方面,二者在多数任务上互有胜负:Adapter 的非线性结构在部分强语义任务上表现更好,LoRA 则在参数量更少的同时保持稳定。

LoRA 的前向可以写成:

选型时你可以这样判断:如果业务对推理延迟极其敏感,希望模型文件完全不变、只替换权重,LoRA 会更容易部署;如果任务需要较强的非线性适配,或者希望显式保留多套可插拔模块,Adapter 的诊室模式更直观。两者并非对立,很多实际项目中也会组合使用。

h′=W0x+αrBAx\displaystyle h' = W_0 x + \frac{\alpha}{r} B A x
这条公式意味着:原始输出 W0x 仍然占主导,LoRA 只在其旁边叠加一个可选的微调项,相当于医生按笔记补了一笔诊断意见。
  1. 原始线性变换W0x 是基座模型原本对输入 x 的输出,相当于医生按执业资格给出的标准诊断。
    W0x\displaystyle W_0 x
  2. 低秩增量B、A 是两个低秩矩阵,AX 先压缩再经 B 还原,形成对原变换的修正方向。
    BAx\displaystyle B A x
  3. 缩放合并系数 α/r 控制修正强度,α 是超参,r 是低秩维度,推理时可将 BA 合并进 W0。
    αrBAx\displaystyle \frac{\alpha}{r} B A x

多任务管理

社区医院的聪明之处在于:同一栋楼里,眼科、骨科、口腔科各占一间诊室,互不干扰。患者来了先到挂号台,按症状分到对应科室。大模型的多任务管理也是这样:一个基座模型可以同时挂载多个 Adapter,每个 Adapter 只负责一个任务,通过任务 ID 或路由策略决定当前使用哪一个。

这种“一对多”设计带来两个关键收益。其一是任务隔离:训练任务 A 的 Adapter 时,任务 B 的 Adapter 权重完全不受影响,不会发生灾难性遗忘。其二是部署灵活:推理时可以根据请求动态切换 Adapter,而不需要同时加载多个完整的大模型副本。共享策略方面,多个 Adapter 可以共享底层若干层的公共表示,只在高层各自独立,从而进一步压缩总参数量。

多任务推理可以表示为:

设想一家医院同时服务于门诊、急诊和体检中心,每个业务场景的流程差异很大,但大楼的水电、安保、后勤完全共用。多任务 Adapter 管理让大模型具备了同样的“一栋楼、多科室”能力,这也是它在 SaaS 化服务中备受青睐的原因。

y=fW0,Ak(x),k=route(x)\displaystyle y = f_{W_0, A_k}(x),\quad k = \text{route}(x)
公式说明:不同的任务会走到不同的 Adapter 分支,但始终共享同一个冻结基座。
  1. 任务路由route(x) 根据输入判断当前属于哪个任务,如同挂号台根据症状分诊。
    k=route(x)\displaystyle k = \text{route}(x)
  2. 选择任务 AdapterA_k 表示第 k 个任务的专属 Adapter,每个 Adapter 只掌握本任务的知识。
    Ak\displaystyle A_k
  3. 共享基座前向大模型 f 使用冻结的 W0 和第 k 个 Adapter 完成前向计算,得到针对该任务的输出。
    fW0,Ak(x)\displaystyle f_{W_0, A_k}(x)

工程实践

从一家社区医院到连锁医疗集团,院长最关心三件事:专科门诊部能否标准化复制、切换科室是否够快、整体运营成本是否可控。Adapter 的工程落地同样围绕这三点展开。

选型上,如果任务数据量小、算力有限、需要频繁上线新任务,Adapter Tuning 是性价比很高的方案;项目也可以选择 Hugging Face 的 PEFT 库、AdapterHub 等成熟工具链,它们已经封装好了注入、训练、保存和加载的完整流程。部署方面,LoRA 可以合并回原权重,而 Adapter 通常作为独立子模块保存,推理框架加载基座后按需挂载;如果采用串行 Adapter,每条样本会多出少量计算,对延迟敏感的场景需要压测评估。此外还要注意:Adapter 的初始化会影响训练稳定性,建议使用与原层适配的分布;保存权重时要记录清楚它对应的基座版本,避免“病历串号”。

工程上常需要核算新增参数占比:

从实践视角回望,Adapter Tuning 把“大模型定制”从重基建变成了轻装修。任何业务团队都可以基于同一个开放源码底座,快速生成自己的专科方案;而工程师要做的,就是像院长管理连锁医院一样,把诊室标准化、把切换自动化、把成本透明化。

R%=∑k=1L2dkrk∣θ0∣×100%\displaystyle R_{\%} = \frac{\sum_{k=1}^{L} 2 d_k r_k}{|\theta_0|} \times 100\%
这个比例告诉你新增诊室只占整个医院的百分之几,是向业务方解释“为什么成本这么低”的有力数据。
  1. 分子求和把每一层 Adapter 的参数量 2dkrk 加起来,得到全部新增参数。
    ∑k=1L2dkrk\displaystyle \sum_{k=1}^{L} 2 d_k r_k
  2. 分母基座参数量|θ0| 是冻结的基座模型总参数,相当于整栋大楼的建筑面积。
    ∣θ0∣\displaystyle |\theta_0|
  3. 归一化百分比两者相除再乘 100%,得到新增模块相对基座的占比。
    ∑2dkrk∣θ0∣×100%\displaystyle \frac{\sum 2 d_k r_k}{|\theta_0|} \times 100\%

AI 应用场景

多业务线智能客服

阶段:模型微调与多任务部署

解决的问题:一个电商平台往往有家电、美妆、物流等多个业务线,它们的客服话术、商品口径差异很大。传统做法是为每条业务线全量微调一个模型副本,显存、训练时间和存储成本都很高。采用 Adapter Tuning 后,基座客服模型只保留一份,每条业务线各训练一个轻量 Adapter,路由服务按来话业务 ID 动态加载,新业务线接入只需新增几 MB 权重。

具体案例:某电商客服团队基于 7B 开源模型训练底座,为家电、美妆、物流三条业务线各训练一个 Adapter,单卡即可完成训练;上线后通过业务线字段分流,夜间大促临时为“大促咨询”再训练一个 Adapter,压力结束后下线,不影响其他业务。

端侧个人助理

阶段:模型压缩与端侧推理

解决的问题:手机、车载设备上的个人助理无法承载完整大模型的微调训练和部署。Adapter 体积小、加载快,可以随 App 版本一起下发,让同一个端侧基座为不同用户群体提供差异化回答,同时满足隐私与离线需求。

具体案例:某输入法团队在端侧部署 1.5B 写作助手基座,面向学生、商务人士、程序员分别训练三个 Adapter,App 根据用户画像在启动时加载对应模块;用户切换身份后无需重新下载大模型,只需热切换几 MB 的 Adapter 权重。

多语言新闻摘要

阶段:持续学习与模型更新

解决的问题:新闻客户端需要为中文、英文、日文等多语言用户生成摘要。若为每种语言全量训练模型,成本和维护量巨大;且不断新增语言时,重训旧模型还会带来灾难性遗忘。Adpter 让每种语言只新增一套轻量模块,旧语言能力不受影响。

具体案例:某新闻 App 先部署英文、中文两套摘要 Adapter,后续新增日文时,只在日文数据上训练一个新 Adapter,A/B 测试跑通后一键切换路由;因为共享基座,各语言摘要风格保持一致,存储总量却只增加了几十 MB。

Python 演示

python52 行
import torchimport torch.nn as nnimport torch.optim as optim torch.manual_seed(42) D, R = 32, 8 class Block(nn.Module):    def __init__(self, d=D, hidden=64):        super().__init__()        self.fc1 = nn.Linear(d, hidden)        self.fc2 = nn.Linear(hidden, d)  # 保持输入输出同维度        self.act = nn.ReLU()     def forward(self, x):        return self.fc2(self.act(self.fc1(x))) class Adapter(nn.Module):    def __init__(self, d=D, r=R):        super().__init__()        self.down = nn.Linear(d, r)        self.up = nn.Linear(r, d)     def forward(self, x):        return x + self.up(torch.relu(self.down(x))) base = nn.Sequential(Block(), Block())for p in base.parameters():    p.requires_grad = False  # 冻结基座全部参数 adapter = Adapter()optimizer = optim.Adam(adapter.parameters(), lr=5e-3)loss_fn = nn.MSELoss() X = torch.randn(128, D)with torch.no_grad():    y_base = base(X)y_task = y_base * 2.0 + 1.0  # 新任务目标: 在源输出上做平移缩放 for epoch in range(200):    optimizer.zero_grad()    h1 = base[0](X)    h1 = adapter(h1)      # 在 Block 之间插入 Adapter    out = base[1](h1)    loss = loss_fn(out, y_task)    loss.backward()    optimizer.step()    if (epoch + 1) % 50 == 0:        print("epoch", epoch + 1, "loss", round(loss.item(), 6)) print("final loss:", round(loss.item(), 6))
目的:模拟一个只训练 Adapter、冻结基座的完整微调循环,演示 Adapter 如何用极小参数量完成对新任务的适配。
  1. for p in base.parameters(): p.requires_grad = False逐层冻结基座,相当于让医院原有科室全部照常营业、不参与调整。
  2. self.down = nn.Linear(d, r)下投影,把 d 维特征浓缩到 r 维瓶颈空间。
  3. self.up = nn.Linear(r, d)上投影,把浓缩信息还原回原始维度。
  4. return x + self.up(torch.relu(self.down(x)))残差连接,保证原始信息不因专科处理而丢失。
  5. optimizer = optim.Adam(adapter.parameters(), lr=5e-3)优化器只管理 Adapter 参数,基座模型参数不产生梯度、不进入更新。
  6. h1 = adapter(h1)在两个 Block 之间插入 Adapter,前向时多走一条轻量支线。
  7. if (epoch + 1) % 50 == 0:每训练 50 轮打印一次损失,方便观察收敛趋势。

常见误区

误区“Adapter 只占模型很小一部分,如果不把基座参数也放开一起训练,模型可能学不到任务知识,效果会打折扣。”

正解Adapter Tuning 的定义就是冻结基座、只训练插入的模块。基座参数被冻结并不会有损任务表现,因为预训练模型已经具备足够的通用特征,Adapter 要学的是“如何在这些特征之上重新组合”。类比医院,原有科室的医生不需要重新考执照,专科诊室只要学会如何与现有科室协作就够了。强行放开基座参数,反而会破坏预训练知识并显著抬高训练成本。

为何常见:很多人从全量微调迁移过来,默认“参数参与训练 = 效果更好”,忽略了高效微调的核心假设是基座表征已经足够好。

误区“既然只是适配任务,那在模型最后接一个线性层或者小网络就行,不需要插到每一层里。”

正解真正的 Adapter Tuning 发生在模型内部多个 Transformer 层,插入位置通常在 attention 和 FFN 子层之后,让每一层都能根据新任务调整表征流。如果只在最后一层加“分类头”,那只是普通的线性探测,表达能力过弱,无法与 Adapter 相提并论。这就像在停车场搭个临时棚屋,而不是把诊室建进大楼内部,服务半径完全不同。

为何常见:任务适配最直观的做法是换顶层输出头,初学者很容易把“加小模块”简单理解成“加最后一层”。

误区“Adapter 参数量太小会欠拟合,那我把瓶颈维度设成和隐藏层一样大,肯定能得到最好效果。”

正解瓶颈维度增大确实提升表达力,但收益会快速递减,而且参数量、训练时间、过拟合风险同步上升。实践中 r 通常取 64~256,大规模模型的收益峰值往往出现在中等维度附近;一旦任务数据有限,过大的 Adapter 反而会记住训练集的噪声。正确做法是像调配诊室面积一样,在验证集上做小范围网格搜索,而不是盲目追求“越大越好”。

为何常见:直觉上“模型越大越强”在全量训练中常成立,但高效微调要解决的是“用极少参数逼近大模型能力”,关键在瓶颈结构的定位而非单纯放大。

误区“LoRA 参数更少、推理无额外延迟,所以 LoRA 全面碾压 Adapter,直接用它就行。”

正解两者各有适用边界。LoRA 的低秩加性更新简洁高效、易合并,但 Adapter 的非线性与残差结构在部分任务上表达力更强,实证对比也常互有胜负。选择时应考虑推理延迟、任务非线性程度、多任务切换方式等因素,而不是简单贴一个“谁更好”的标签。就像新开诊室和内部进修都能提升医院能力,具体选哪种要看预算、工期和病症特点。

为何常见:LoRA 近年社区热度更高,许多文章以 LoRA 为默认方案,导致学习者把“流行”误当成“最优”。

面试题

Q1. Adapter Tuning 的核心设计思想是什么?

单选题 · easy

  • A.冻结基座只训额外小网络← 正确答案
  • B.只微调输出层的分类头
  • C.全量微调模型所有参数
  • D.在输入层添加随机扰动

答案:A。Adapter Tuning 的核心是冻结预训练模型,只在层间插入小型可训练网络。A 准确描述了这一点;B 只是线性探测,缺少层间适配;C 是全量微调;D 属于数据扰动而非参数高效微调。

Q2. Adapter 内部通常使用什么结构来控制参数量?

单选题 · mid

  • A.稀疏编码方法
  • B.Bottleneck层← 正确答案
  • C.循环递归网络
  • D.注意力结构

答案:B。Adapter 使用 bottleneck 结构,先降维再升维,中间形成低维瓶颈。稀疏编码、递归网络和注意力结构都不是 Adapter 的标准组件。瓶颈设计让新增参数远小于基座,同时保留非线性表达力。

Q3. 训练 Adapter 时,基座模型参数处于什么状态?

单选题 · mid

  • A.全部冻结不更新← 正确答案
  • B.全部参与训练
  • C.仅顶层参与训练
  • D.随机冻结一半参数

答案:A。Adapter Tuning 的关键约束是冻结基座全部参数,只更新 Adapter。全部参与训练退化为全量微调;仅顶层参与或随机冻结都属于非标准做法,无法体现高效微调的核心优势。

Q4. 关于 Adapter 与 LoRA 的对比,下列说法正确的是?

单选题 · easy

  • A.均冻结原模型并训练额外参数← 正确答案
  • B.LoRA 需要每层都插入模块
  • C.Adapter 不能用在 Transformer
  • D.两者数学推导完全一样

答案:A。Adapter 和 LoRA 都属于参数高效微调,都会冻结原模型训练额外参数。LoRA 不一定要每层插入,Adapter 广泛用于 Transformer,二者结构不同,数学形式也不同,因此 B、C、D 均错误。

Q5. 多任务 Adapter 管理的核心优势是什么?

单选题 · mid

  • A.一个基座可切换多个轻量适配器← 正确答案
  • B.所有任务必须共享同一套参数
  • C.完全可以在离线状态完成推理
  • D.训练时不再需要任何 GPU 显存

答案:A。多任务 Adapter 让一个基座挂载多个专用模块,按路由切换,实现任务隔离与灵活部署。B 恰恰相反,共享同一套参数就不是多任务适配;C 与多任务无关;D 不切实际,训练仍需要一定显存。

Q6. 关于 Adapter 与 LoRA 的推理优化,哪种说法是正确的?

单选题 · hard

  • A.LoRA 矩阵可合回原权重并保持结构← 正确答案
  • B.Adapter 可无条件合并进原模型
  • C.Adapter 只能训练不能用于推理
  • D.LoRA 必须逐层拆开部署无法合并

答案:A。LoRA 的 BA 矩阵可以加到 W0 上完成合并,推理结构与原模型一致;Adapter 由于包含非线性激活且位于层间,通常作为独立子模块保留,不能简单合并。C 和 D 与事实相反。

Q7. Adapter 超参配置中,直接影响最终效果的因素有哪些?

多选题 · hard

  • A.瓶颈维度大小← 正确答案
  • B.插入层数量← 正确答案
  • C.训练时学习率← 正确答案
  • D.预训练语料构造

答案:ABC。瓶颈维度决定表达力,插入层数决定适配覆盖范围,学习率决定收敛质量,三者都会显著影响效果。预训练语料是基座模型训练阶段的因素,与 Adapter 超参配置无关。

Q8. Adapter 中残差连接的主要作用是什么?

单选题 · easy

  • A.防止训练时遗忘原始表示← 正确答案
  • B.帮助增加模型的深层深度
  • C.有效加快训练数据加载速度
  • D.显著减少模型占用的显存

答案:A。残差连接把原始特征与 Adapter 输出相加,保证主路信息不丢失,也让梯度回传更稳定。它不改变模型深度,不影响数据加载,也不直接减少显存,因此 B、C、D 错误。

Q9. 与全量微调相比,Adapter Tuning 的优势体现在哪些方面?

多选题 · hard

  • A.训练显存与存储开销更低← 正确答案
  • B.数据少时更不容易过拟合← 正确答案
  • C.效果一定显著好于 LoRA
  • D.支持灵活的多任务快速切换← 正确答案

答案:ABD。Adapter 只更新少量参数,显存和存储开销低;参数受限时也不容易在少数据场景下过拟合;多任务可通过多个 Adapter 自由切换。C 是绝对化表述,Adapter 与 LoRA 孰优孰劣由具体任务决定。

Q10. 关于 Adapter Tuning 的局限性,下列说法正确的有哪些?

多选题 · extreme

  • A.推理时若不合并会增加额外计算← 正确答案
  • B.基座很小时参数占比可能偏高← 正确答案
  • C.完全无法处理跨任务的知识共享
  • D.需修改模型结构对封闭模型不可用← 正确答案

答案:ABD。串行 Adapter 会在推理时增加额外前向计算;基座本身很小时,新增参数的相对占比会上升;使用不开放结构的封闭模型时,无法在其内部插入 Adapter。C 过于绝对,通过共享部分层或参数,Adapter 也能实现一定程度的跨任务知识共享。