假设你刚刚搬进一栋精装老宅:水电齐全、装修考究、住着非常舒服。你想把它改造成“智能家居主题房”。最原始的办法是把整栋房子推翻重装——墙砸了、管线换了、家具重买,兴师动众,钱包见底,还可能把原本的好底子搞坏。这就是大模型世界的“全量微调”:把千亿参数全部重新训练,显存、算力、时间样样烧钱。而聪明人的做法是:承重墙一律不动,只在门口加一块智能引导屏、在玄关贴几张可擦写便签、在插座旁装一个变压器、在走廊放一台小型净化器,再给杂物间添几个压缩收纳盒。墙还是那面墙,房子却焕然一新。这套“老宅智能改造术”,就是参数高效微调(PEFT)。这篇文章,就是一本通俗的改造手册,带你认识每一种智能设备、看懂它的原理,并手把手完成一次完整改造。

岗位关联

对 AI 从业者来说,PEFT 是“小成本办大事”的必备技能:预算有限、显存有限时,你依然能微调百亿级大模型。学会它,你就掌握了让大模型真正落地的那把钥匙。

目录
  1. 可视化演示
  2. PEFT 核心思想
  3. LoRA 低秩适配
  4. QLoRA 量化微调
  5. Prefix 前缀微调
  6. P-Tuning 软提示
  7. Adapter 适配器
  8. PEFT 库实战与选型
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

交互展示LoRA低秩适配、QLoRA量化微调和Prefix Tuning等PEFT方法的原理与参数效率对比,理解高效微调核心技术。

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

LoRA低秩适配机制 冻结预训练权重W,训练低秩矩阵BA ΔW = B·A 分解大幅减少训练参数 W_new = W + BA 仅0.1%参数达到全量微调效果

PEFT 核心思想

改造老宅的第一课,是学会划红线:哪些墙不能动。全量微调相当于把整栋房子推倒重装,工程队要处理每面墙、每条管线,工期长、成本高,数据不够时还可能把原本舒适的风格都改没了。PEFT 的思路恰恰相反——承重墙画上红线,水电一律不动,只往家里添置几件“智能设备”。

把这套逻辑搬回大模型:预训练模型已经是一位见多识广的“老住户”,掌握了海量通用知识;下游任务只是换了一个新主人的偏好,没必要让它重新学习一遍世界。于是我们冻结住绝大部分原始权重,只让一小撮新加入的参数参与训练。反向传播时,冻结参数的梯度直接掐断,如同工人绕开承重墙施工。

训练目标与全量微调完全一样——都是最小化损失函数,但“被更新的参数集合”截然不同。我们用可训练参数占比 R 来衡量这份“力气”的大小:

记住这条核心原则:墙不能动,只添家具。后面介绍的所有方法——变压器、引导屏、便签、净化器——都是这一条原则下的不同设备。

R=∣θnew∣∣θfrozen∣+∣θnew∣≪1%\displaystyle R=\frac{|\theta_{new}|}{|\theta_{frozen}|+|\theta_{new}|}\ll 1\%
这个公式算的是“新增可学习参数占全部参数的比例”。对 7B 模型做 LoRA 微调,R 往往不到 0.1%,却能达到接近全量微调的任务效果。
  1. 分子是新增量只有新加入的旁路矩阵、前缀向量、适配器模块等才参与梯度更新。
    ∣θnew∣=∣θA∣+∣θB∣|\theta_{new}|=|\theta_{A}|+|\theta_{B}|
  2. 分母是全部参数冻结的预训练权重通常以十亿甚至千亿计。
    ∣θfrozen∣≈7×109|\theta_{frozen}|\approx 7\times 10^{9}
  3. 结果远小于 1%例如 LoRA 微调 7B 模型,新增参数约 400 万,占比仅约 0.06%。
    R=4×1067×109+4×106≈0.06%R=\frac{4\times 10^{6}}{7\times 10^{9}+4\times 10^{6}}\approx 0.06\%

LoRA 低秩适配

LoRA 是老宅改造里最出名的设备——一只插在插座上的小变压器。墙里的电路(原始权重)一字不改,电流出来先经过变压器降压,再升压送回主路;训练结束时,把它拆下来焊回墙里,墙上不留任何痕迹,电路却已经记住了新习惯。

在数学上,LoRA 有一个大胆假设:微调造成的权重增量 ΔW 是低秩的。也就是说,没必要直接更新 d×d 的巨型矩阵,只需用两个小矩阵的乘积去逼近它。A 负责把 d 维输入压成 r 维(r 远小于 d),B 再把 r 维升回 d 维,两个小矩阵合起来就是旁路:

训练结束后把变压器焊回墙里,推理时没有任何额外计算,这就是 LoRA 被称为“零开销适配”的原因。

h=W0x+αr (BA)x\displaystyle h=W_{0}x+\frac{\alpha}{r}\,(BA)x
模型输出等于“冻结主路的输出”加上“旁路输出”。训练时只更新 A 和 B,r 越小新增参数越少;α/r 是旁路的音量旋钮。
  1. 基线输出冻结权重 W₀ 对输入 x 的原始映射,全程不变。
    hbase=W0xh_{base}=W_{0}x
  2. 低秩旁路A 把输入降到 r 维,B 再升回 d 维,形成低秩增量。
    A∈Rr×d,B∈Rd×r,r≪dA\in\mathbb{R}^{r\times d},\quad B\in\mathbb{R}^{d\times r},\quad r\ll d
  3. 缩放因子α 是经验常数,除以 r 后控制旁路的整体强度。
    ΔW=αr BA\Delta W=\frac{\alpha}{r}\,BA
  4. 合并回主路训练结束后令 W′=W₀+ΔW,推理路径与原始模型完全一致。
    W′=W0+αr BAW'=W_{0}+\frac{\alpha}{r}\,BA

QLoRA 量化微调

老宅的杂物越来越多,显存和硬盘告急。QLoRA 给老宅添了一套“压缩收纳盒”:把墙内藏书按编号打包压缩,要用时再解开;同时保留变压器(LoRA)在高精度通道上继续学习。

具体来说,QLoRA 先把基座模型的权重从 16bit 压缩到 4bit,显存立刻省下约四倍;再让 LoRA 旁路保持 16bit 计算。精度损失被留给了“静态压缩”的那部分权重,而动态学习仍走宽路。4bit 量化的核心公式:

压缩盒负责“省地方”,变压器负责“学东西”,两者合体后,65B 级别的大模型也能在一张高端消费级显卡上完成微调。

xq=round(xs),s=max⁡∣x∣2b−1−1,b=4\displaystyle x_{q}=\mathrm{round}\Bigl(\frac{x}{s}\Bigr),\qquad s=\frac{\max|x|}{2^{b-1}-1},\qquad b=4
这组公式把一个连续数值压缩成 4bit 整数,反量化时再乘以缩放因子 s 还原。QLoRA 在此基础上还用了 NF4 数据格式和双重量化,进一步保住精度、压低显存。
  1. 缩放因子s 由绝对最大值和量化等级共同决定,表达“这一档有多大”。
    s=max⁡∣x∣24−1−1=max⁡∣x∣7s=\frac{\max|x|}{2^{4-1}-1}=\frac{\max|x|}{7}
  2. 取整量化每个数除以 s 后四舍五入,落在 0 到 15 的离散档位上。
    xq=round(x/s)x_{q}=\mathrm{round}(x/s)
  3. 反量化还原推理时用 x̂=x_q×s 近似原值,损失很小。
    x^=xq×s\hat{x}=x_{q}\times s
  4. NF4 与双重量化NF4 在数值小的区域安排更密的档位,匹配权重分布;双重量化把缩放因子 s 本身也压成 8bit。
    x^=xq×sq\hat{x}=x_{q}\times s_{q}

Prefix 前缀微调

Prefix Tuning 的思路是在门口挂一块智能引导屏。每次有人进门,屏幕先播一段引导语,提醒屋里的人“现在是下午茶时间,请切换到休闲模式”;真正要训练的,只有屏幕上的内容。整栋房子的墙体、管线依旧纹丝不动。

更精确地说,这面引导屏不只挂在大门口——每个房间的门口都有一块,每块屏幕的内容可以不一样。在 Transformer 的每一层注意力里,都插入一段可学习的键值对前缀,与原始的 K 和 V 拼接后再参与注意力计算:

由于前缀是连续向量而非自然语言,它能表达人类词语难以覆盖的微妙偏好,这正是它比手写 Prompt 更灵活的原因。

z=Attention(Q, [PK;K], [PV;V])\displaystyle z=\mathrm{Attention}\bigl(Q,\ [P_{K};K],\ [P_{V};V]\bigr)
可学习前缀 [P_K;P_V] 就像一段“带节奏”的引导语,注意力打分时会被它显著影响,从而引导模型关注特定模式。
  1. 键值拼接前缀向量与原始键值沿着序列维度拼在一起,N 是原始序列长度。
    [PK;K]∈R(lp+N)×d[P_{K};K]\in\mathbb{R}^{(l_{p}+N)\times d}
  2. 注意力打分Q 不变,前缀参与 softmax 计算,引导注意力方向。
    z=softmax(Q[PK;K]⊤d)[PV;V]z=\mathrm{softmax}\Bigl(\frac{Q[P_{K};K]^{\top}}{\sqrt{d}}\Bigr)[P_{V};V]
  3. 只训前缀全部新增参数来自各层的前缀向量,与词表无关。
    ∣ΘP∣=2×lp×d×L|\Theta_{P}|=2\times l_{p}\times d\times L

P-Tuning 软提示

如果 Prefix 是大门口的电子屏,P-Tuning 就是玄关上一叠可擦写便签。便签上写的不是人类文字,而是用“隐形墨水”画下的标记;旁边还配了一位调墨师(提示编码器),负责把墨水调成模型最容易读懂的浓度。

P-Tuning 的做法是:先在输入序列前面放置 m 个“虚拟 token”——它们没有对应词汇,只是一些可学习的嵌入向量。为了让这些向量更容易被模型消化,先用一个小型 MLP 对它们做一层变换,再拼到真实输入前面:

初版 P-Tuning 只在首层插入软提示;v2 版本借鉴 Prefix 的做法,把软提示铺到每一层,大幅提升了小模型上的稳定性。便签贴得越靠近每个“工位”,提醒效果越可靠。

hi=MLPϕ(ei),Input=[h1,h2,…,hm,x]\displaystyle h_{i}=\mathrm{MLP}_{\phi}(e_{i}),\qquad \mathrm{Input}=[h_{1},h_{2},\dots,h_{m},x]
简单理解:先造出 m 个“隐形标记”,再让调墨师把它们调成模型最舒服的格式,最后贴在真实输入前面一起喂给模型。
  1. 虚拟标记初始化 m 个可学习嵌入,它们没有词典含义。
    e1,e2,…,em∈Rde_{1},e_{2},\dots,e_{m}\in\mathbb{R}^{d}
  2. 提示编码器用 MLP 把嵌入映射成更平稳的表示,降低直接优化难度。
    hi=MLPϕ(ei)h_{i}=\mathrm{MLP}_{\phi}(e_{i})
  3. 拼接输入软提示与真实输入 x 拼接后送入模型。
    Input=[h1,…,hm,x]\mathrm{Input}=[h_{1},\dots,h_{m},x]

Adapter 适配器

走廊里加装一台小净化器:人流(信息)经过时先被收拢过滤,再重新释放,两头宽、中间窄。安装极其简单——在注意力层与前馈层之后各放一台,插上即用;一个任务对应一种型号,换任务就换插头,底座完全不动。

Adapter 的“两头宽中间窄”就是瓶颈结构。先由一个下采样矩阵把 d 维压到 r 维(瓶颈),经过非线性激活,再上采样回 d 维,最后与原始输出相加:

每个 Adapter 只引入约 0.5%–2% 的参数量。多任务部署时,一个底座可以同时插多个净化器,按请求切换——这是 Adapter 最迷人的工程价值。

h←h+Wup σ(Wdownh+bdown)+bup\displaystyle h \leftarrow h + W_{up}\,\sigma\bigl(W_{down}h + b_{down}\bigr) + b_{up}
这是 Adapter 的前向计算:降维 → 非线性变换 → 升维 → 与原输出相加。残差连接保证梯度顺畅,像净化器不堵塞走廊。
  1. 下采样W_down 把 d 维压缩到 r 维,r 远小于 d,形成瓶颈。
    z=Wdownh+bdown,r≪dz=W_{down}h+b_{down},\quad r\ll d
  2. 非线性激活σ 通常是 GELU 或 ReLU,给模块引入非线性表达能力。
    a=σ(z)a=\sigma(z)
  3. 上采样W_up 把 r 维升回 d 维,输出与输入同维度。
    Δh=Wupa+bup\Delta h=W_{up}a+b_{up}
  4. 残差相加与原始表示相加,保留底层信息,训练更稳定。
    h←h+Δhh\leftarrow h+\Delta h

PEFT 库实战与选型

改造手册的最后一章:如何开工。先把户型量清楚(显存预算),再从目录里挑设备(方法选型),最后按图纸施工(训练与合并)。Hugging Face 的 PEFT 库把这套流程浓缩成了几行配置。

施工第一步,用 PeftConfig 描述“装什么设备”:例如 LoraConfig 指定 r、alpha、目标模块;第二步,get_peft_model 把设备装到模型上,此时会打印“可训练参数占比”;第三步,训练流程与 Transformers 完全一致,Trainer 或 Accelerate 皆可;第四步,save_pretrained 只保存几 MB 的适配器文件,部署时用 merge_and_unload 将它焊回原权重。新增参数量可以精确估算:

选型清单:显存紧张选 QLoRA,均衡之选是 LoRA,多任务服务选 Adapter,快速验证方案可用 Prefix 或 P-Tuning。量完户型再选购设备,你的每一次大模型微调都能以最小成本落地——老宅改造,正式完工。

NLoRA=2×r×d×L\displaystyle N_{\text{LoRA}}=2 \times r \times d \times L
单层 LoRA 需要 A(d×r)和 B(r×d)两个小矩阵,共 2rd 个参数;乘以应用层数 L,就是全模型的新增参数量。
  1. 单层两矩阵A 是 d×r,B 是 r×d,参数总量相加。
    Nlayer=∣A∣+∣B∣=d×r+r×d=2rdN_{layer}=|A|+|B|=d\times r+r\times d=2rd
  2. 全模型累加对每一层都挂上 LoRA,总量乘以 L。
    NLoRA=2rdLN_{\text{LoRA}}=2rdL

AI 应用场景

单卡微调病历问答(QLoRA)

阶段:模型微调 / 训练工程

解决的问题:医院只有一块 24GB 的消费级显卡,全量微调 7B 模型需要多张 80GB 的 A100;QLoRA 把基座权重压到 4bit,显存需求骤降四倍,同时保留 LoRA 高精度通道,让“小显卡跑大模型”成为现实。

具体案例:某三甲医院要用 7B 开源模型做病历结构化与意图识别。工程师用 BitsAndBytes 4bit 加载基座,再挂上 LoRA 适配器,在一张 A6000 上训练 2 小时,意图识别准确率达到 92%,而成本只有全量微调的十分之一。

多业务线客服共用一个底座(LoRA / Adapter)

阶段:模型服务 / 部署

解决的问题:每个业务线(售前、售后、物流)都微调一个全量模型,存储和显存开销爆炸。改为共用一个底座后,每个业务线只保存一个几十 MB 的适配器文件,像换插头一样按渠道切换,成本从“整栋房子”降到“几个小设备”。

具体案例:某电商平台把 7B 底座部署在单张 A10G 上,上线了 5 条业务线的 LoRA 适配器,请求按渠道路由加载,单卡同时服务 5 个客服场景,存储占用节省超过 95%。

低延迟在线推理(LoRA 合并)

阶段:推理优化

解决的问题:未合并的 LoRA 前向要先降维再升维,多一步计算;合并后推理路径与原模型完全一致,延迟不变,磁盘上只多一份几 MB 的适配器文件,方便版本管理与灰度发布。

具体案例:某写作助手团队把 LoRA 适配器合并回 13B 权重后,首 token 延迟从 320ms 降到 280ms,同时只需要维护一份模型权重,省掉了昂贵的多副本部署。

Python 演示

python87 行
import numpy as np def make_data(n=300, seed=42):    rng = np.random.default_rng(seed)    X = rng.uniform(-3, 3, size=(n, 8))    w_true = rng.normal(size=8)    y = X @ w_true + 0.1 * rng.normal(size=n)    return X, y def mse(y, yhat):    return float(((y - yhat) ** 2).mean()) class ToyModel:    def __init__(self, d_in, d_out, seed=0):        rng = np.random.default_rng(seed)        self.W = rng.normal(0, 0.5, size=(d_in, d_out))        self.lora = None     def attach_lora(self, r, alpha):        self.lora = LoRA(self.W.shape[0], self.W.shape[1], r, alpha)     def forward(self, x):        out = x @ self.W        if self.lora is not None:            out = out + self.lora.forward(x)        return out class LoRA:    def __init__(self, d_in, d_out, r, alpha):        self.scale = alpha / r        self.A = np.random.normal(0, 0.02, (d_in, r))        self.B = np.zeros((r, d_out))        self.gA = np.zeros_like(self.A)        self.gB = np.zeros_like(self.B)     def forward(self, x):        return self.scale * (x @ self.A) @ self.B     def zero_grad(self):        self.gA.fill(0)        self.gB.fill(0)     def backward(self, x, g):        z = x @ self.A        self.gB += self.scale * z.T @ g        self.gA += self.scale * x.T @ (g @ self.B.T)     def update(self, lr):        self.A -= lr * self.gA        self.B -= lr * self.gB     def merge_into(self, W):        return W + self.scale * self.A @ self.B def train(model, X, y, steps=300, lr=0.05):    for step in range(steps):        pred = model.forward(X)        grad = 2 * (pred - y) / len(y)        if model.lora is not None:            model.lora.zero_grad()            model.lora.backward(X, grad)            model.lora.update(lr)        else:            model.W -= lr * (X.T @ grad)        if step % 60 == 0:            print("step %3d  mse=%.4f" % (step, mse(y, pred))) if __name__ == "__main__":    X, y = make_data()    d_in, d_out = X.shape[1], 1     print("== 全量微调 ==")    full = ToyModel(d_in, d_out, seed=1)    print("训练参数量 =", d_in * d_out)    train(full, X, y)     print("== LoRA微调 ==")    lora_model = ToyModel(d_in, d_out, seed=1)    lora_model.attach_lora(r=2, alpha=4)    n_lora = lora_model.lora.A.size + lora_model.lora.B.size    print("训练参数量 =", n_lora, ", 仅占全量的 %.1f%%" % (100.0 * n_lora / (d_in * d_out)))    train(lora_model, X, y)     W_merged = lora_model.lora.merge_into(lora_model.W.copy())    pred_lora = lora_model.forward(X)    pred_merged = X @ W_merged    print("合并前后预测一致:", np.allclose(pred_lora, pred_merged))
目的:用纯 NumPy 实现一个玩具版 LoRA,在单线性层模型上对比“全量微调”与“低秩适配”的参数量差异,并验证训练后旁路可以无损合并回原权重。
  1. self.W = rng.normal(0, 0.5, size=(d_in, d_out))模拟一个随机初始化的“预训练权重”。
  2. self.B = np.zeros((r, d_out))B 初始化为零,保证旁路一开始没有任何影响。
  3. return self.scale * (x @ self.A) @ self.BLoRA 前向:先降维再升维,就是旁路小变压器。
  4. self.gB += self.scale * z.T @ g对 B 矩阵累加梯度。
  5. self.gA += self.scale * x.T @ (g @ self.B.T)对 A 矩阵累加梯度。
  6. def merge_into(self, W)训练后把 BA 乘回原权重,验证“焊回墙里”。
  7. model.W -= lr * (X.T @ grad)全量微调的更新方式:直接改权重本身。
  8. lora_model.attach_lora(r=2, alpha=4)用秩 r=2 的旁路挂载适配器。
  9. np.allclose(pred_lora, pred_merged)验证合并前后输出完全一致,推理零额外开销。

常见误区

误区初学者常以为 LoRA 是在大模型里挑选一小部分参数来更新,其他参数冻结,听起来像“部分微调”或“剪枝”。

正解LoRA 完全不碰原权重。它是在旁边新增两条“旁路”小矩阵 A 和 B,训练时只更新这两个矩阵,原矩阵全程冻结。回到老宅比喻:你不动墙里的电路,只是加装了一个变压器,训练的对象是变压器本身,训练结束再把变压器焊回电路。这与“挑一部分参数更新”有本质区别。

为何常见:因为“低秩适配”听起来像“对原矩阵做低秩近似”,容易让人联想到“选出重要参数”或“压缩权重”。

误区很多人觉得 LoRA 的秩 r 越大,可训练参数越多,表达能力越强,效果就一定更好,于是盲目把 r 设成 128 甚至 256。

正解r 决定旁路的“线圈匝数”,但增大 r 的收益迅速饱和,反而增加显存和存储开销。实践中 4–16 通常已经足够;r 越大还会放大过拟合风险。选择 r 实际上是在“精度”与“成本”之间做权衡。

为何常见:人们习惯认为“容量越大越好”,但 LoRA 的低秩假设本身意味着任务增量往往集中在少数方向上,过多的自由维度并不必要。

误区常见想法是“全量微调更新所有参数,PEFT 只练几个小模块,效果肯定打折”。

正解在小数据、任务与预训练知识接近时,PEFT 效果常常与全量持平,甚至因为参数少而自带正则化效果,泛化更稳。全量微调像把整栋房子重新刷漆,数据不足时反而容易“翻车失真”,出现灾难性遗忘。

为何常见:直觉上“学得越多越好”,忽略了全量微调在小数据集上的过拟合风险,以及预训练知识被破坏的代价。

误区看到“前缀”“提示”就以为是 Prompt Engineering,觉得 Prefix Tuning 和 P-Tuning 只是自动写 prompt 的工具。

正解Prefix 和 P-Tuning 加的是连续向量,不是自然语言词元。这些向量人类读不懂,但模型很容易“消化”。硬提示(手写文字)受限于词汇的离散性,表达空间小;软提示则在连续空间中自由优化,表达能力更强。

为何常见:两个方法的名字都带“前缀/提示”,容易与写 Prompt 的做法混淆,忽略了“连续向量 vs 离散词汇”这一核心差异。

误区一听“4bit 量化”,很多人立刻担心精度崩坏,认为量化后的模型没法用。

正解QLoRA 用 NF4 数据格式 + 双重量化把基座压到 4bit,同时让 LoRA 旁路保持 16bit 高精度计算,经验上效果损失常在 1% 以内,却能把 65B 模型塞进单卡。省四倍显存换不到 1% 的效果,是非常划算的买卖。

为何常见:直觉认为“量化=信息损失=效果崩”,忽略了 NF4 保留了 16 个精密排列的离散等级,也忽略了关键学习路径上 LoRA 仍以高精度运转。

面试题

Q1. PEFT 的核心思想是什么?

单选题 · easy

  • A.重新训练模型全部参数
  • B.冻结主参数只训少量新增← 正确答案
  • C.把训练数据增大到三倍
  • D.把模型的层数继续加深

答案:B。PEFT 的核心理念是“冻结百万级旧参数,只训练几个新配件”,如同老宅改造不动承重墙。A 是全量微调,C 属于数据策略,D 是网络结构改动,都与“参数高效”无关。

Q2. LoRA 中“低秩”的含义是什么?

单选题 · easy

  • A.对权重做低精度压缩存储
  • B.用两个小矩阵近似权重增量← 正确答案
  • C.只保留前馈网络中的一半
  • D.将注意力头数减到一半以下

答案:B。LoRA 用 B·A 两个低秩小矩阵的乘积近似 ΔW,如同变压器把 d 维降成 r 维再升回来。A 是量化思路,C 是剪枝思路,D 是结构改动,都不涉及“低秩分解”。

Q3. LoRA 推理时如何做到零额外开销?

单选题 · mid

  • A.训练后删除旁路矩阵直接部署
  • B.训练后将旁路增量合并回原权重← 正确答案
  • C.推理时改用 CPU 进行加速
  • D.使用量化权重降低计算延迟

答案:B。训练完毕把 BA 乘回 W₀,推理时只有一次矩阵乘法,路径与原模型完全一致。A 删除旁路会丢失适配能力;C 是硬件层面的换算;D 是量化优化,均非 LoRA 的机制。

Q4. QLoRA 将基座模型权重量化到多少 bit?

单选题 · mid

  • A.将基座模型权重量化到 8 bit
  • B.将基座模型权重量化到 4 bit← 正确答案
  • C.将基座模型权重量化到 2 bit
  • D.将基座模型权重量化到 16 bit

答案:B。QLoRA 的核心是把基座权重压到 4bit(NF4 格式),配合双重量化与高精度的 LoRA 旁路。8bit 是常见折中但不是 QLoRA 的标志,2bit 过激进,16bit 则没有省显存效果。

Q5. 关于 Prefix Tuning,下列说法正确的是?

多选题 · mid

  • A.在注意力键值前插入可学习前缀← 正确答案
  • B.前缀是连续向量而非自然语言← 正确答案
  • C.需要重新训练整个注意力权重
  • D.每层可以拥有不同的独立前缀← 正确答案

答案:ABD。前缀以连续向量形式拼接到每层注意力的键值前,各层可独立配置,像每个房间门口各挂一块引导屏。C 与“只训练前缀、冻结主干”矛盾,是错误项。

Q6. P-Tuning 中的“软提示”是什么?

单选题 · mid

  • A.一段精心编写的自然语言提示
  • B.一组可学习的连续向量标记← 正确答案
  • C.随机初始化的固定噪声信号
  • D.模型预测结果的概率分布

答案:B。软提示是一组可学习的连续向量,由提示编码器变换后拼到输入前。A 是硬提示,C 没有学习过程,D 是输出侧概念,均不符合。

Q7. Adapter 模块的典型瓶颈结构是什么?

单选题 · hard

  • A.先降维再非线性激活再升维← 正确答案
  • B.先升维再非线性激活再降维
  • C.直连两个全连接层的串联叠加
  • D.只保留线性层不做维度变化

答案:A。Adapter 是“两头宽中间窄”:降维到 r → 非线性激活 → 升维回 d,像走廊净化器把信息收拢再释放。B 顺序反了,C 缺少非线性瓶颈,D 没有任何参数量约束。

Q8. 下列哪些属于参数高效微调方法?

多选题 · easy

  • A.LoRA 低秩旁路适配方法← 正确答案
  • B.Prefix Tuning 前缀微调← 正确答案
  • C.全量参数更新微调方式
  • D.Adapter 适配器模块方法← 正确答案

答案:ABD。LoRA、Prefix Tuning、Adapter 都只训练极少量新增参数,属于 PEFT 家族。全量微调更新所有参数,与“参数高效”正好相反,应当排除。

Q9. 关于 LoRA 的秩 r 与参数量,正确的有?

多选题 · hard

  • A.秩 r 越大可训练参数越多← 正确答案
  • B.每层新增参数量约为两倍 rd← 正确答案
  • C.秩 r 越大效果必然越好
  • D.秩 r 等于维度时接近全量← 正确答案

答案:ABD。每层 LoRA 参数量为 2rd,r 越大参数越多;当 r=d 时 BA 可以表示任意 d×d 矩阵,表达能力接近全量微调。但 r 增大收益会饱和且带来过拟合风险,C 过于绝对。

Q10. 关于 QLoRA 的“双重量化”,正确的理解是?

单选题 · extreme

  • A.对模型权重做两次 4bit 量化
  • B.对量化缩放常数再做一次量化← 正确答案
  • C.对优化器状态也做低秩分解
  • D.将两个模型权重合并后量化

答案:B。双重量化指对第一次量化使用的缩放因子 s 本身再做一次 8bit 量化,把“量化用的尺子”也压缩存档。A 是对权重做两次,C 是分页优化器,D 是模型合并,均与双重量化无关。