L大语言模型从理论到实践
阅读 PDF ↗
CHAPTER 21

参数高效微调

预训练模型已经形成了可复用的表示与生成能力,下游任务未必需要重新调整全部权重。但“只训练少量参数”并不意味着模型只执行少量计算,也不意味着任何任务都能用同样的小型增量解决。参数高效微调(Parameter-Efficient Fine-Tuning,PEFT)研究的是:在冻结大部分基座参数的条件下,如何选择可训练变量及其进入网络的位置,使有限的更新预算产生有效的函数变化。

PEFT 与训练目标是两个不同维度。监督微调、偏好优化和强化学习规定如何评价输出,PEFT 规定损失能够更新哪些变量。相同损失可以用于全参数微调或低秩适配;相同适配结构也可以服务于不同目标。本章从低秩更新的代数结构出发,推导前向与反向传播,再讨论量化、提示类方法与适配器的部署生命周期。

21.1受约束的模型适配

参数预算及函数空间

令冻结基座为 \(\theta_0\),任务参数为 \(\phi\),适配模型为 \(f(x;\theta_0,\phi)\)。优化问题写为

\[ \min_\phi\;\mathbb E_{(x,y)\sim\mathcal D} \left[\ell(f(x;\theta_0,\phi),y)\right]. \tag{21.1}\]

与直接优化 \(\theta\) 相比,可训练变量的数量、进入计算图的位置以及参数化方式均受到限制。限制有时降低小数据条件下的过拟合,也可能导致表达不足;它不是普遍的质量保证。

全参数微调(Full Fine-Tuning,FFT)允许所有指定基座权重变化。选择性微调只开放其中的偏置、归一化参数或词嵌入行。附加模块方法增加可训练的旁路或连续提示;重参数化方法则把权重增量分解为更小的变量。不同方法可能具有相同的可训练参数量,却允许不同的函数变化。

表 21.1 本章主要符号。线性层采用列向量约定。

符号 含义与形状
\(W_0\) 冻结权重,\(d_o\times d_i\)
\(x,y,g\) 输入 \(d_i\)、输出 \(d_o\)、上游梯度 \(d_o\) 维列向量
\(A,B\) 低秩因子,分别为 \(r\times d_i\)\(d_o\times r\)
\(r,\alpha,s\) 秩上限、缩放超参数、实际尺度 \(s=\frac{\alpha}{r}\)
\(X,Y,G\) \(n\) 个样本按列堆叠的输入、输出、上游梯度
\(p,d,L\) 连续提示长度、隐藏维度、网络层数
\(W_q,\widehat W\) 量化存储对象与其恢复的计算权重

冻结参数的梯度传播

考虑一个冻结线性层 \(y=W_0x\)。尽管无需形成用于更新的 \(\nabla_{W_0}\mathcal L\),链式法则仍要求

\[ \nabla_x\mathcal L=W_0^{\mathsf T}\nabla_y\mathcal L. \tag{21.2}\]

如果 \(x\) 依赖较早层的适配器,缺少此梯度便无法训练那些适配器。冻结参数与切断计算图是完全不同的操作。只有当某段计算的输入也不依赖任何需要训练的变量时,才可能把它作为不需反传的固定特征提取阶段。

训练内存可以概念性地分为基座权重、可训练权重及其梯度与优化器状态、激活、临时工作区和运行时开销。PEFT 主要压缩其中与可训练变量有关的部分;长序列激活和冻结矩阵乘法依然存在。因此,可训练参数比例不能直接用来预测峰值显存或每步时延。

21.2LoRA 的低秩更新

前向计算及参数量

低秩适配(Low-Rank Adaptation,LoRA)将权重增量表示为两个窄矩阵的乘积(Hu 等 2022)

\[ y=W_0x+sBAx,\qquad s=\frac\alpha r, \quad A\in\Real^{r\times d_i},\quad B\in\Real^{d_o\times r}. \tag{21.3}\]

原有偏置若保持冻结,可单独加到右侧而不改变以下推导。先计算 \(z=Ax\in\Real^r\),再计算 \(sBz\in\Real^{d_o}\),使增量与基座输出具有相同形状。把 \(B\) 的列记为 \(b_k\)\(A\) 的行记为 \(a_k^{\mathsf T}\),则

\[ \Delta W=sBA=s\sum_{k=1}^{r}b_ka_k^{\mathsf T}, \qquad \Delta y=s\sum_{k=1}^{r}b_k(a_k^{\mathsf T}x). \tag{21.4}\]

每个通道先把输入投影为一个标量,再沿某个输出方向生成贡献。这些通道是分解中的代数方向,不天然对应独立概念或专家。

LoRA 只训练低秩旁路,基座仍参与前向计算和输入梯度传播。
图 21.1 LoRA 只训练低秩旁路,基座仍参与前向计算和输入梯度传播。

由于乘积的列空间包含于 \(B\) 的列空间,\(\operatorname{rank}(BA)\le r\)。这一约束针对增量,不针对 \(W_0\)\(W_0+sBA\)。可训练参数量由 \(d_od_i\) 变为 \(r(d_i+d_o)\),比例为

\[ \gamma=\frac{r(d_i+d_o)}{d_id_o}. \tag{21.5}\]

仅当 \(r<\frac{d_id_o}{d_i+d_o}\) 时,新增因子数少于原矩阵元素数。对于方阵 \(d_i=d_o=d\),比例为 \(\frac{2r}{d}\)。例如 \(d=4096,r=8\),基座矩阵有 \(16777216\) 个元素,适配器有 \(65536\) 个参数,占 \(0.390625\%\)。这是该矩阵的比例,不能直接当成整模型比例。

低秩假设的适用边界

如果已知理想增量 \(\Delta W_\star\),其奇异值按降序为 \(\sigma_1,\sigma_2,\ldots\),在无权 Frobenius 范数下最优秩 \(r\) 近似的平方误差为 \(\sum_{k>r}\sigma_k^2\)。这个线性代数结论有助于理解容量,但真实微调优化的是任务损失,并非已知矩阵的无权逼近。

即使只有一层,输出误差也取决于输入协方差。令 \(E=\Delta W-\Delta W_\star\),输入二阶矩为 \(C=\mathbb E[xx^{\mathsf T}]\),则

\[ \mathbb E\|Ex\|_2^2=\operatorname{tr}(ECE^{\mathsf T}). \tag{21.6}\]

\(C\ne I\) 时,不同输入方向的误差权重不同;深层非线性网络中的任务关系更复杂。由人工低秩目标产生的合成回归可以验证实现能够学习该结构,却不能证明所有任务更新都低秩。

因子本身也不唯一:对任意可逆 \(R\in\Real^{r\times r}\),有 \((BR)(R^{-1}A)=BA\)。因此不同训练得到的通道不能按编号直接比较,其范数还受分解尺度影响。增大 \(r\) 扩大可表示集合,但不保证固定步数、固定学习率下更容易优化。

21.3反向传播、初始化及缩放

LoRA 梯度推导

基座 \(W_0\) 固定,\(s\) 为非零常数,损失对输出可微;此处先不使用随机丢弃。批量样本按列组成 \(X\in\Real^{d_i\times n}\)。若损失包含求均值,其归一化已经体现在上游梯度 \(G=\frac{\partial\mathcal L}{\partial Y}\) 中。

由微分得到三个梯度

批量前向为 \(Y=W_0X+sBAX\)。保持 \(X\) 不变时,输出微分为

\[ \dif Y=s(\dif B)AX+sB(\dif A)X. \tag{21.7}\]

使用 \(\dif\mathcal L=\operatorname{tr}(G^{\mathsf T}\dif Y)\) 及迹的循环性质,把参数微分移到右侧,可得

\begin{align} \nabla_B\mathcal L&=sG(AX)^{\mathsf T}\in\Real^{d_o\times r},\tag{21.8}\\ \nabla_A\mathcal L&=sB^{\mathsf T}GX^{\mathsf T}\in\Real^{r\times d_i}. \tag{21.9}\end{align}

\(X\) 也依赖可训练参数,则还必须计算

\[ \nabla_X\mathcal L=(W_0+sBA)^{\mathsf T}G =W_0^{\mathsf T}G+sA^{\mathsf T}B^{\mathsf T}G. \tag{21.10}\]

第一项来自冻结基座,不能删除。这也解释了为何冻结主路的参数梯度后,训练计算量不会按 \(\gamma\) 同比例下降。

低秩因子初始化

常见初始化采用随机 \(A\) 和零矩阵 \(B\),使 \(\Delta W=0\),初始函数保持为基座函数。由式(21.9),第一步 \(\nabla_A\mathcal L=0\),而 \(\nabla_B\mathcal L=sG(AX)^{\mathsf T}\) 通常非零。\(B\) 更新以后,\(A\) 才开始获得数据梯度。若 \(A=B=0\),两个梯度同时为零,普通一阶梯度更新无法启动该分支。

“通常非零”仍需条件:若输入投影 \(AX=0\) 或上游梯度与投影相消,\(B\) 的批量梯度也可能为零。初始化为零增量不代表每次训练的第一次更新必然有效。反过来,也可以把 \(A\) 置零而令 \(B\) 非零,此时首先更新的是 \(A\);两种参数化的优化路径不必相同。1

对于单样本、\(B_0=0\) 的一次梯度下降,记学习率为 \(\eta\),则

\[ B_1=-\eta s\,g x^{\mathsf T}A_0^{\mathsf T},\qquad \Delta W_1=-\eta s^2g x^{\mathsf T}A_0^{\mathsf T}A_0. \tag{21.11}\]

更新依赖 \(A_0^{\mathsf T}A_0\),而非简单地把完整矩阵梯度乘以常数。若 \(A_0\) 的元素独立、零均值、方差为 \(\sigma_A^2\),则 \(\mathbb E[A_0^{\mathsf T}A_0]=r\sigma_A^2I\);在固定初始基座梯度的条件下,第一步期望增量为 \(-\eta s^2r\sigma_A^2gx^{\mathsf T}\)。该式直接说明秩、初始化尺度、学习率和 \(s\) 共同影响更新幅度。

尺度及旁路正则化

原始 LoRA 使用 \(s=\frac{\alpha}{r}\)(Hu 等 2022)。这是一种参数化约定,不是所有秩下最优更新相同的定理。比较秩时,应明确是固定 \(\alpha\)、固定 \(s\),还是采用其他缩放规则;否则同时改变了容量与初始更新尺度。

若采用随机失活(Dropout),可令其只作用于低秩旁路输入:\(y=W_0x+sBA\widetilde x\)。保留概率为 \(q\),使用倒置失活 \(\widetilde x=\frac{m\odot x}{q}\),则条件于 \(x\)\(\mathbb E[\widetilde x]=x\)。因此线性旁路输出的期望与无失活时相同,但非线性网络的损失期望通常不等于对期望输出求损失。推理时关闭失活,才能使用后文的固定权重合并等价式。

LoRA 单步更新

例19.1

\[ W_0=\begin{bmatrix}1&0\\0&1\end{bmatrix},\quad x=\begin{bmatrix}1\\2\end{bmatrix},\quad A_0=\begin{bmatrix}1&-1\end{bmatrix},\quad B_0=\begin{bmatrix}0\\0\end{bmatrix},\quad s=1. \tag{21.12}\]

目标为 \(t=(0,1)^{\mathsf T}\),损失 \(\mathcal L=\tfrac12\|y-t\|_2^2\)。初始投影 \(A_0x=-1\),输出 \(y_0=(1,2)^{\mathsf T}\),损失为 \(1\),上游梯度 \(g=(1,1)^{\mathsf T}\)。于是

\[ \nabla_B\mathcal L=\begin{bmatrix}-1\\-1\end{bmatrix},\qquad \nabla_A\mathcal L=\begin{bmatrix}0&0\end{bmatrix},\qquad \nabla_x\mathcal L=\begin{bmatrix}1\\1\end{bmatrix}. \tag{21.13}\]

\(\eta=0.1\),同时使用旧参数计算梯度后更新,得到 \(B_1=(0.1,0.1)^{\mathsf T}\)\(A_1=A_0\)。新输出为 \((0.9,1.9)^{\mathsf T}\),损失为 \(0.81\)。更新后的矩阵为

\[ W_0+B_1A_1= \begin{bmatrix}1.1&-0.1\\0.1&0.9\end{bmatrix}, \tag{21.14}\]

乘以 \(x\) 得到同一输出。下一次反传时,\(\nabla_A\mathcal L=(0.18,0.36)\) 已不为零。这个小矩阵例子用于展示梯度启动和等价路径;其四个可训练参数与四个基座元素数量相同,并不体现大模型中的显著压缩。

21.4目标模块及更新预算

Transformer 中的查询、键和值投影改变注意力匹配和被聚合的信息,输出投影改变聚合结果进入残差流的方式,前馈层投影改变位置上的非线性特征变换。只适配其中一类模块与适配全部线性映射,允许的函数变化不同。第21章《注意力机制》给出了这些投影的形状;具有分组查询的结构中,键值投影往往并非 \(d\times d\) 方阵,不能统一套用方阵参数公式。

设目标集合为 \(\mathcal M\),每个模块有秩 \(r_j\)、输入输出维度 \(d_{i,j},d_{o,j}\),则总可训练因子数为

\[ N_{\mathrm{LoRA}}=\sum_{j\in\mathcal M}r_j(d_{i,j}+d_{o,j}). \tag{21.15}\]

若同时训练偏置、词嵌入或输出头,必须另行加上其参数量,并将其写入制品。模块名属于具体架构的实现,匹配规则必须依据实际模块树解析,不能仅凭名称子串推定已正确覆盖。合并查询键值的线性层还需要说明是适配整个融合矩阵还是其中指定切片。

固定总预算时,秩分配也是一个优化选择。自适应低秩适配(Adaptive Low-Rank Adaptation,AdaLoRA)通过重要性相关的预算分配调整不同增量方向的保留(Zhang 等 2023)权重分解低秩适配(Weight-Decomposed Low-Rank Adaptation,DoRA)将权重幅值与方向变化分别参数化,方向部分使用低秩更新(S.-Y. Liu 等 2024)。两者改变的是参数化与预算使用方式,不能只替换方法名称而沿用所有 LoRA 缩放、初始化和保存假设。

一个合理比较应固定基座、数据划分和有效训练词元预算,再分别观察目标模块、秩、缩放和学习率。参数量相同但更新位置不同的两种配置,应同时比较任务能力、原有能力保留和部署代价。窄域训练损失下降不代表全局能力得到保留。

21.5合并、组合及数值语义

单适配器合并

当推理旁路是固定线性映射且失活关闭时,可定义

\[ W_{\mathrm{merged}}=W_0+sBA. \tag{21.16}\]

在实数算术中,双分支和单矩阵形式完全相等。浮点中,先形成 \(BA\) 再与 \(W_0\) 相加,与逐层矩阵乘法的舍入次序不同,因此应按合理容差比较。若旁路含输入相关门控或非线性,便不能直接采用式(21.16)

合并消除了显式低秩旁路的运行开销,却使该模型成为某一任务配置的实体副本。多任务动态切换时,保留共享基座与独立适配器可能更有价值。应保存未合并原件,而不是依赖对合并权重反复相减来恢复;有限精度下的加减不保证无损往返。

适配器组合

若多个适配器均相对于同一基座、同一目标模块训练,固定线性组合可写为

\[ \Delta W=\sum_{j=1}^{k}c_js_jB_jA_j. \tag{21.17}\]

它可以通过拼接精确表示:\(B_{\mathrm{cat}}=[c_1s_1B_1\ \cdots\ c_ks_kB_k]\)\(A_{\mathrm{cat}}=[A_1^{\mathsf T}\ \cdots\ A_k^{\mathsf T}]^{\mathsf T}\),总秩上界为 \(\sum_jr_j\)。这只是代数等价,不证明任务能力可以无冲突地相加。

直接计算 \((B_1+B_2)(A_1+A_2)\) 会产生 \(B_1A_2+B_2A_1\) 交叉项,通常不等于增量相加。由于因子分解不唯一,逐元素平均因子还依赖任意选取的内部坐标。若为了维持小秩而重新压缩合成增量,则引入新的近似误差,需要作为独立制品评估。

如果第二个适配器是在“基座加第一个适配器”上继续训练,其依赖关系也不同于两个独立任务增量。请求相关的动态组合系数更不能一次性固化为唯一矩阵。注册与部署时必须区分并行组合、串行训练依赖和单任务切换。

21.6QLoRA 的量化及梯度边界

量化基座的梯度路径

量化低秩适配(Quantized Low-Rank Adaptation,QLoRA)结合低比特基座存储与可训练低秩参数(Dettmers 等 2023)。令 \(Q(W_0)\) 为量化对象 \(W_q\),包含码值和量化元数据;令 \(D(W_q)=\widehat W\) 表示恢复到计算精度的权重,则训练的线性映射为

\[ Y=\widehat WX+sBAX. \tag{21.18}\]

基座码值与其尺度保持冻结,梯度更新 \(A,B\),但输入梯度仍为

\[ \nabla_X\mathcal L=\widehat W^{\mathsf T}G+sA^{\mathsf T}B^{\mathsf T}G. \tag{21.19}\]

这里无需求量化离散码值的梯度;需要的是在固定恢复权重下对输入求导。因此“量化不可微”并不阻止该输入梯度的计算。是否临时物化全部恢复权重,还是按块在内核内恢复,属于运行时实现,不能从此公式推定必然分配一个完整高精度副本。

QLoRA 的存储、计算和更新是三个不同边界。虚线仅表示适配器参数梯度。
图 21.2 QLoRA 的存储、计算和更新是三个不同边界。虚线仅表示适配器参数梯度。

NF4、双重量化及内存账目

QLoRA 原始方案使用四比特正态浮点(4-bit NormalFloat,NF4)表示权重,量化码本面向近似正态分布的权重设计;它不是普通四比特整数的另一名称。双重量化(Double Quantization)进一步压缩块级量化常数,分页优化器(Paged Optimizer)则管理优化器状态的内存峰值(Dettmers 等 2023)。这些措施分别作用于不同内存项,并不意味着激活、梯度和键值缓存都成为四比特。

考虑自行给定的简化账目:\(P\) 个基座元素每个用四比特码值,每 \(g\) 个元素另存一个 \(32\) 位尺度,忽略对齐与其他元数据,则基座存储为 \(\frac{P}{2}+\frac{4P}{g}\) 字节。\(g=64\) 时为每元素 \(0.5625\) 字节,而不是 \(0.5\) 字节。双重量化改变第二项的表示,但不会消除元数据。此算例用于理解成本来源,不对应某个后端的实测布局。

训练还要加入适配器状态。例如给定 \(N_a\) 个参数使用两字节权重、两字节梯度、两个四字节优化器矩及四字节主副本,则该部分为 \(16N_a\) 字节;并非所有运行时都采用这一布局。激活、工作区与分页迁移成本仍需另计,不能由权重位宽推出训练峰值或加速比例。

量化误差及部署转换

\(\widehat W=W_0+E_q\),则模型实际学习的是 \(W_0+E_q+sBA\)。适配器可能同时响应任务需求与量化扰动,因此将同一 \(A,B\) 换到未量化 \(W_0\) 上不一定保持原行为。由于 \(E_q\) 可能包含许多方向,低秩增量也不保证完全补偿它。

纯推理量化是在训练结束后改变部署表示;QLoRA 则在训练前向与反向路径中使用固定量化基座并训练适配器。两者既可能组合,也不可混称。若部署时重新量化合并权重,得到 \(D(Q'(\widehat W+sBA))\),这与训练时的 \(\widehat W+sBA\) 又有差别。合并到原始高精度基座得到 \(W_0+sBA\) 则改变了另一个对象。发布记录必须说明实际选择哪条路径,而非笼统标注“已合并”。2

21.7其他参数高效方法

(选修)

瓶颈适配器及激活缩放

瓶颈适配器(Bottleneck Adapter)在网络中插入小型非线性模块(Houlsby 等 2019)。一种典型残差形式为

\[ h'=h+U\,\sigma(Dh+b_d)+b_u, \quad D\in\Real^{b\times d},\quad U\in\Real^{d\times b},\quad b\ll d. \tag{21.20}\]

每个模块含 \(2db+b+d\) 个参数。下降投影压缩到瓶颈,非线性转换后再映射回残差空间。插入在注意力之后、前馈层之后或并行旁路,会形成不同结构;不能把某个插入位置视为所有 Adapter 的定义。因为包含非线性,通常不能合并为原层的单一固定矩阵。

内激活抑制与放大适配(Infused Adapter by Inhibiting and Amplifying Inner Activations,IA\(^3\))使用可学习向量缩放键、值和前馈中间激活(H. Liu 等 2022)。若一头注意力的键值按行排列,可写为 \(K'=K\operatorname{diag}(\ell_k)\)\(V'=V\operatorname{diag}(\ell_v)\);前馈部分可写为

\[ h'=W_{\mathrm{down}}\,[\ell_f\odot\sigma(W_{\mathrm{up}}h)]. \tag{21.21}\]

向量通常从全一初始化,初始映射不变。它不能任意混合通道,只能在所选坐标上调整幅度。固定缩放可以吸收到相邻线性映射的行或列中,但必须遵守实际放置位置;把缩放移动到非线性或归一化另一侧一般不等价。

输入软提示

提示微调(Prompt Tuning)学习一组输入连续向量,冻结语言模型权重(Lester, Al-Rfou, 和 Constant 2021)。令词嵌入序列为 \(E(x)\in\Real^{T\times d}\)软提示(Soft Prompt)为 \(P\in\Real^{p\times d}\),输入为 \([P;E(x)]\),新增参数为 \(pd\)。这些向量不必等于词表中某个词的嵌入,也不必能够翻译成自然语言。

损失仍由真实目标位置计算,梯度通过整个冻结网络传回 \(P\)。相较于自然语言提示工程,它需要梯度训练;相较于 LoRA,它不直接修改线性映射。它增加输入位置和相应计算预算,具体对最大文本长度与位置编码的影响由模型协议决定。小型制品不意味着零推理开销。

逐层前缀及 P-Tuning

前缀微调(Prefix Tuning)在注意力层提供可学习的前缀状态(Li 和 Liang 2021)。对单头,令 \(P_K\in\Real^{p\times d_k}\)\(P_V\in\Real^{p\times d_v}\),真实查询为 \(Q\),则

\[ O=\softmax\!\left(\frac{Q[P_K;K]^{\mathsf T}}{\sqrt{d_k}}+M\right)[P_V;V]. \tag{21.22}\]

\(M\) 允许真实词元读取前缀,并对真实词元间关系实施任务所需掩码。前缀不必通过输入词嵌入在每层间接产生,因而与仅学习输入 \(P\) 的约束不同。若每层键与值各自的总维度为 \(d_K,d_V\),层数为 \(L\),直接保存前缀键值需 \(Lp(d_K+d_V)\) 个参数。当键和值各有 \(d\) 维时,才化为 \(2Lpd\);分组键值结构应按实际维度计算。

前缀还增加注意力可见的键值位置。真实长度为 \(T\) 时,单头分数矩阵由 \(T\times T\) 变为 \(T\times(T+p)\)。前缀可以预先计算和缓存,并不意味着其存储和读取免费。训练时使用提示编码器重参数化前缀、部署时保存生成的静态状态,是另一项需要记录的转换。

连续提示调优(P-Tuning)的早期方法使用提示编码器产生连续嵌入,并与离散提示组合(X. Liu 等 2021);其提示可依任务模板放置,而非必然只是一个字符串前缀。原始方法也研究过同时调整语言模型的设置,因此不能从名称推定基座始终冻结。本章在 PEFT 比较中只考虑冻结基座的配置。

深层提示调优(P-Tuning v2)将连续提示扩展到多层,并针对不同任务调整训练方式(X. Liu 等 2022)。它与逐层前缀属于紧密相关的方法路线,但输入布局、参数生成和任务头可能不同。比较时应写出真实计算位置与保存状态,不能把 Prompt、Prefix、P-Tuning 三个名字当作完全同义词。

输入软提示只在入口增加可训练向量;逐层前缀在多个注意力层直接提供状态。图示比较插入位置,不表示必须同时启用两种方法。
图 21.3 输入软提示只在入口增加可训练向量;逐层前缀在多个注意力层直接提供状态。图示比较插入位置,不表示必须同时启用两种方法。

选择性微调及方法比较

偏置微调(BitFit)只训练选定偏置(Ben Zaken, Goldberg, 和 Ravfogel 2022);可训练词元方法只开放指定词嵌入行。它们仍属于改变已有参数的策略。无偏置架构中,可用偏置集合可能很小或为空;新增词元还涉及词表、输入输出嵌入绑定和保存范围,不能只交付几行矩阵而忽略词元编号协议。

表 21.2 不同适配方法的主要资源与表达边界。

方法 可训练对象 主要约束
全参数微调 基座权重 状态多,通常每任务保留完整权重
LoRA 低秩因子 更新秩与目标位置受限;线性旁路可合并
QLoRA 量化基座上的因子 基座存储较小;仍需激活和输入梯度
瓶颈 Adapter 非线性瓶颈模块 增加算子,通常不能线性合并
IA\(^3\) 激活缩放向量 通道缩放表达受限,吸收位置须正确
Prompt 输入连续向量 增加输入位置,梯度穿过冻结网络
Prefix/深层提示 多层前缀状态 增加注意力状态与读取成本
选择性微调 指定原参数 可用集合依架构而异,需保存实际变化

21.2中的资源特征用于提出候选方案,不能替代测量。对于同一任务,应比较质量、有效词元吞吐、峰值内存、制品大小、加载时延、合并能力和目标后端支持。尤其不能在改变训练数据或上下文长度的同时,把全部收益归因于 PEFT 方法。

21.8训练及制品生命周期

可训练集合及数据目标同时受控

算法21.1 冻结基座的适配训练

输入:固定基座与分词协议、目标模块集合、适配方法配置、训练数据和停止预算。输出:任务参数与依赖清单。状态:适配参数、优化器状态、数据位置、有效标签累计量。

  1. 加载基座,解析实际模块和形状;冻结基座参数。按方法注入并初始化适配变量,建立精确可训练名单。

  2. 优化器只接收该名单。对每批样本形成输入、边界与标签掩码;有效标签数为零的批次按预定策略处理。

  3. 在保留必要输入梯度的计算图上前向,计算目标损失,再反向传播到可训练变量;按实际有效标签归一化梯度累积。

  4. 完成规定的梯度处理与参数更新,记录数据和优化器状态;到达词元预算、验证集停止条件或明确失败条件时停止。

  5. 保存适配变量、所有额外训练模块和不可变依赖。记录合并状态及后续重载、任务与性能验收所需条件。

不变量:参数更新范围等于声明范围;冻结基座不被更新,但必要的梯度链保持连通。训练状态保存与部署适配器保存具有不同职责。

例如面向对话的监督训练只对指定助手回答计算损失,系统消息、用户消息和填充不应意外进入目标。掩码的数学含义由有效标签集合定义,某个库使用的忽略索引只是实现约定。训练模板与部署模板可以为记录监督区间采用不同标记机制,但实际模型词元序列必须遵守同一协议。第18章《训练数据工程基础》进一步讨论了这些消费视图与版本关系。

角色一致性的能力边界

身份与角色一致性适配可以作为一个具体任务:模型在身份询问、错误前提和能力边界问题中稳定遵循产品定义,同时在普通任务中避免反复自我介绍。这样的训练改变行为分布,不提供模型具有意识的证据,也不形成租户隔离或工具权限边界。

应按信息变更周期分层:在适配器生命周期内稳定的公开角色与行为约束可进入训练;当前日期、部署版本、租户和可用工具来自运行时配置;账户状态、实时事实和检索结果来自真实观察。把频繁变化的信息固化进权重,会把一次配置更新变成训练与发布问题。

为识别适配器的真实增量,角色测试中不能只使用已经直接给出全部答案的提示。还应保留部署上下文下的组合测试,以及翻译、数学等非触发控制任务。训练与测试按提示家族隔离,分别报告角色稳定性、错误前提处理、动态事实边界和过度触发,而非只统计几个名字是否正确。干净基座、启用适配器和从干净基座重载适配器构成三种必要的比较对象。

绑定、组合及回滚

适配器不是独立模型。其版本至少绑定基座权重身份、架构、词表与模板、目标模块及形状、方法配置、额外可训练对象、量化条件、数据与代码版本。基座名称相同而权重不同,或矩阵形状相同而语义位置变化,都不能保证兼容。

动态加载服务需要把请求绑定到具体适配器与组合配置。适配器注册表(Adapter Registry)记录依赖和发布状态,适配器路由(Adapter Routing)按服务端授权选择版本,而非让模型自行判断当前租户。不同适配器通常会改变隐藏状态和键值缓存,因此缓存身份也必须包含影响其生成的模型与适配配置;切换后不能无条件沿用旧缓存。

算法21.2 适配器发布与恢复

输入:适配器原件、依赖清单、批准的组合与部署模式。输出:可回滚的发布版本。状态:基座版本、适配器版本、路由版本及必要缓存命名空间。

  1. 在干净基座上恢复完整训练变化,检查依赖和张量语义;拒绝不匹配版本,不静默跳过缺失模块。

  2. 在固定输入和明确精度条件下比较恢复前后的数值输出,再评估目标能力与原有能力保留。

  3. 若合并或重新量化,生成新的不可变制品并独立评估;若动态组合,按实际组合与系数评估,不复用单适配器结论代替。

  4. 发布新的路由与缓存身份,保留前一版本。出现回滚条件时恢复路由并隔离不兼容缓存,停止向新请求分配失效版本。

不变量:请求能追溯到实际基座、适配器及组合;未合并原件保留,恢复不依赖对低精度权重反复加减。

参数效率的准确含义

PEFT 压缩的是每个任务需要学习与维护的参数变化。其收益只有结合梯度路径、激活成本、任务质量和部署依赖才完整。冻结不等于不计算,低秩不等于模型低秩,四比特基座不等于四比特训练,成功重载也不等于任务验收通过。

21.9微调框架的职责及组合

框架选型首先要区分模型实现、可训练参数管理、训练目标和运行组织。它们处于不同层次,同一训练过程常同时使用多个项目;比较框架时,应先确定是否在比较同一种职责。

组件 负责的对象 需要核对的边界
Transformers 模型结构、分词器、权重及生成接口 架构支持、聊天模板、特殊词元和模型修订。
PEFT LoRA等适配方法、参数注入与适配器制品 实际目标模块、冻结范围、额外保存层及基座绑定。
TRL SFT、偏好优化和策略训练等目标的训练器 数据语义、监督掩码、参考模型与奖励定义。
LLaMA-Factory、Axolotl 配置驱动的数据处理、训练与导出流程 最终生效配置、模板映射和底层依赖组合。

Transformers与PEFT分别提供模型和适配器层接口(Hugging Face 不详b, 不详a);TRL的SFT训练器可以与PEFT组合(Hugging Face 不详c)。LLaMA-Factory与Axolotl则把多项训练步骤组织成配置化工作流(LLaMA-Factory contributors 不详; Axolotl maintainers and contributors 不详)。集成程度较高可以减少重复编排,但研究者仍须知道配置如何改变底层目标。

以问答微调为例,分词器把角色与文本转成词元,训练器确定哪些位置受到监督,PEFT决定哪些参数获得梯度,分布式运行时再决定这些参数与状态怎样放到设备上。若切换框架时同时改变聊天模板、回答掩码和有效批量,观察到的收益便无法只归因于框架实现。应先对同一条样本核对词元、标签和损失,再比较训练速度。

使用集成框架时,应保存解析后的完整配置及依赖版本,而不只保存手写的几行覆盖项。默认模板、填充、打包、优化器和检查点形式都可能随版本变化。适配器导出后还应在干净基座上重载,验证张量绑定和固定输入输出;只有训练过程成功结束,尚不足以证明制品可以交付。

需要直接研究训练目标和数据处理时,可先采用Transformers、PEFT与TRL的组合,使监督链条便于检查;需要重复管理多种数据格式与训练任务时,可采用集成框架,并保留同样的数据与数值验收。框架不会替代本章推导的参数预算、可训练范围和合并条件。


  1. 这里讨论损失的数据梯度。某些优化器的独立权重衰减可能在数据梯度为零时改变非零参数;应将这种变化与反向传播产生的学习信号区分。↩︎

  2. 量化格式、分组粒度、计算精度和后端均属于制品兼容性。某个后端能够读取四比特文件,不等于它实现了训练时相同的量化与恢复规则。↩︎

WORKBOOK / 习题

配套习题与解析

先独立作答,再展开参考解析。选修题保留原书标记。

习题 21.1

\(d_i=4096,d_o=1024,r=16\) 的投影计算 LoRA 参数量与比例,说明为什么不能使用方阵公式。

展开参考解析

参数量 \(r(d_i+d_o)=16(4096+1024)=81920\);基座参数 \(4096\times1024=4194304\),比例 \(\frac{5}{256}\approx1.9531\%\)\(2rd\)仅适用于输入输出同宽,不能随意取4096代入。

习题 21.2

从迹微分完整推导 \(\nabla_A\mathcal L\)\(\nabla_B\mathcal L\)\(\nabla_X\mathcal L\),逐步核对张量形状。

展开参考解析

\(dY=s(dB)AX+sB(dA)X+(W_0+sBA)dX\),代入 \(dL=\operatorname{tr}(G^\mathsf T dY)\) 并循环移位,得到 \(\nabla_BL=sGX^\mathsf TA^\mathsf T\)\(\nabla_AL=sB^\mathsf TGX^\mathsf T\)\(\nabla_XL=(W_0+sBA)^\mathsf TG\)。其形状分别 \(d_o\times r,r\times d_i,d_i\times n\);冻结 \(W_0\) 不删除最后一式。

习题 21.3

在本章数值例题中继续执行第二次梯度下降,分别计算两个因子的更新。解释为什么应同时用更新前的因子求本步梯度。

展开参考解析

第一次后 \(A_1=(1,-1),B_1=(0.1,0.1)^\mathsf T\)\(y-t=(0.9,0.9)\)\(A_1x=-1\)。故 \(\nabla_B=(-0.9,-0.9)^\mathsf T\)\(\nabla_A=(0.18,0.36)\)。步长0.1得 \(B_2=(0.19,0.19)^\mathsf T\)\(A_2=(0.982,-1.036)\)\(A_2x=-1.09\),输出 \((0.7929,1.7929)\),损失 \(0.7929^2=0.62869041\)。若先改B再计算A梯度,则不再是同一点的一次普通梯度下降。

习题 21.4选修

证明对可逆 \(R\)\((BR)(R^{-1}A)=BA\),并讨论这对通道可解释性和因子平均的影响。

展开参考解析

由结合律 \((BR)(R^{-1}A)=B(RR^{-1})A=BA\)。R可旋转或缩放通道,故单通道不具唯一语义,乘积才不变。不同适配器因子处于不同基时直接平均没有不变意义;应先对完整增量求和或对齐后再近似。

习题 21.5选修

\(A\) 固定而只训练 \(B\),增量行空间受到何种限制?与同时训练两个因子相比有何差别?

展开参考解析

\(\Delta W=BA\)的每一行是A行的线性组合,故行空间包含于固定的 \(\operatorname{row}(A)\);若输入x位于A零空间,则增量对x永远为零。共同训练A/B允许改变该子空间,但仍受秩上界r限制,优化非凸并不保证找到任意期望子空间。

习题 21.6

利用第一步更新公式,比较固定 \(\alpha\) 与固定 \(s\) 时秩变化对初始期望增量的影响,明确初始化方差是否也发生变化。

展开参考解析

B零初始化时 \(\nabla_A=0\),一步增量为 \(-\eta s^2GX^\mathsf TA^\mathsf TA\)。若A各元素独立零均值、方差 \(\sigma^2\),则 \(\mathbb E A^\mathsf TA=r\sigma^2I\)。固定 \(s=\frac{\alpha}{r}\) 且固定alpha/方差,期望幅度正比 \(\frac{\alpha^2\sigma^2}{r}\);固定s则正比 \(s^2r\sigma^2\)。若初始化方差也随r变化,必须把它代入,不能只按r判断。

习题 21.7

构造两个秩一适配器,使其增量之和秩为二,验证直接相加因子产生交叉项。

展开参考解析

\(B_1=e_1,A_1=e_1^\mathsf T\)\(B_2=e_2,A_2=e_2^\mathsf T\),增量和为2维单位阵、秩2。但 \((B_1+B_2)(A_1+A_2)\) 是全一矩阵、秩1,并多出 \(e_1e_2^\mathsf T+e_2e_1^\mathsf T\)。拼接 \([B_1,B_2]\) 和纵向堆叠A可精确表示增量和。

习题 21.8

\(Y=D(W_q)X+sBAX\) 说明为什么不需要对量化码值求导却仍必须计算基座输入梯度;给出错误切断计算图的后果。

展开参考解析

码值固定时只把 \(D(W_q)\) 看作常矩阵,无需对离散码求导;但 \(\nabla_XL=[D(W_q)+sBA]^\mathsf TG\) 仍包含基座项。对整条基座分支使用无梯度执行会丢失该项,影响更早层的适配器或可训练输入,从而改变目标梯度。

习题 21.9选修

\(L=24,d=2048,p=20\),比较输入软提示与直接逐层键值前缀的参数量,并说明参数量之外还应比较哪些成本。

展开参考解析

输入软提示为 \(pd=20\times2048=40960\)。若每层键和值各有d维,直接前缀为 \(2Lpd=1966080\),是前者48倍。另计占用的上下文/KV、提示编码器(若有)、注入位置、推理内核支持、加载切换和任务质量;不能只以参数量选方法。

习题 21.10选修

对瓶颈 Adapter 证明:若非线性替换为恒等且偏置固定,可以合成一个仿射映射;进一步说明何时增量才是纯线性的。保留非线性时为何一般不能如此合并?

展开参考解析

\(y=x+U\phi(Dx+b_d)+b_u\)\(\phi\) 为恒等,则 \(y=(I+UD)x+(Ub_d+b_u)\),是仿射映射;只有附加偏置 \(Ub_d+b_u=0\) 时才是纯线性增量。保留ReLU等非线性时雅可比随x变化,一般无法由单一常矩阵和偏置表示。固定偏置不等于偏置为零,原题已据此澄清。

习题 21.11选修

分析将键向量缩放移动到 softmax 之后是否等价,并用单查询、两个键的例子说明原因。

展开参考解析

取q=1、键 \((0,1)\)、值 \((0,1)\),原输出为 \(\frac{e}{1+e}\)。把键乘2后为 \(\frac{e^2}{1+e^2}\);把原输出乘2则为 \(\frac{2e}{1+e}\),不仅不同,后者还超过值凸包。键缩放改变概率分配,不能移到Softmax后的值缩放。

习题 21.12选修

设计角色适配的稳定信息、运行时配置和实时观察三层结构,分别给出数据划分、非触发控制与回滚条件。

展开参考解析

稳定信息如职责和固定风格进入版本化训练档案;租户、权限与部署版本由服务配置提供;日期和工具结果来自带来源的实时观察。按提示家族划分数据,加入普通数学/翻译等非触发对照;测试身份、能力、动态事实和越权分别计分。出现旧角色泄漏、过度自我介绍、伪造工具成功或通用能力越界退化时回退完整适配器/模板组合,授权始终由执行器裁决。

习题 21.13

\(W\in\mathbb R^{d\times d}\) 满秩,LoRA 增量为 \(BA\),其中 \(B\in\mathbb R^{d\times r}\)\(A\in\mathbb R^{r\times d}\)\(r<d\)。证明增量秩的上界,并给出 \(W+BA\) 仍满秩的具体例子。解释为何增量秩不能直接视为多层模型的能力上限,以及增大 \(r\) 为何未必改善验证效果。

展开参考解析

矩阵乘积满足 \(\operatorname{rank}(BA)\leq\min(\operatorname{rank}(B),\operatorname{rank}(A))\leq r\)。取 \(W=I_d\)\(r=1\)\(B=A^{\mathsf T}=e_1\),则 \(W+BA=\operatorname{diag}(2,1,\ldots,1)\) 仍为满秩。低秩约束作用于特定权重的更新方向,多层非线性和多个适配位置共同决定最终函数,不能由单个增量秩直接推断整体任务能力。增大 \(r\) 扩展可更新方向并增加参数与优化成本,但验证效果还受数据、目标层、正则化和优化充分程度影响,应在相同评估与资源约束下比较。

REFERENCES

参考文献

Axolotl maintainers and contributors. 不详. 《Axolotl: Open Source LLM Post-Training》. 见于 2026年9月11日. https://github.com/axolotl-ai-cloud/axolotl.
Ben Zaken, Elad, Yoav Goldberg, 和 Shauli Ravfogel. 2022. 《BitFit: Simple Parameter-efficient Fine-tuning for Transformer-based Masked Language-models》. 2022年. https://aclanthology.org/2022.acl-short.1/.
Dettmers, Tim, Artidoro Pagnoni, Ari Holtzman, 和 Luke Zettlemoyer. 2023. 《QLoRA: Efficient Finetuning of Quantized LLMs》. 2023年. https://arxiv.org/abs/2305.14314.
Houlsby, Neil, Andrei Giurgiu, Stanislaw Jastrzebski, Bruna Morrone, Quentin De Laroussilhe, Andrea Gesmundo, Mona Attariyan, 和 Sylvain Gelly. 2019. 《Parameter-Efficient Transfer Learning for NLP》. 2019年. https://proceedings.mlr.press/v97/houlsby19a.html.
Hu, Edward J., Yelong Shen, Phillip Wallis, Zeyuan Allen-Zhu, Yuanzhi Li, Shean Wang, Lu Wang, 和 Weizhu Chen. 2022. 《LoRA: Low-Rank Adaptation of Large Language Models》. 收入 International Conference on Learning Representations. https://openreview.net/forum?id=nZeVKeeFYf9.
Hugging Face. 不详a. 《PEFT》. 见于 2026年9月11日. https://github.com/huggingface/peft/tree/v0.20.0.
———. 不详b. Transformers. Hugging Face. 见于 2026年9月8日. https://github.com/huggingface/transformers.
———. 不详c. 《TRL: SFT Trainer》. 见于 2026年9月11日. https://github.com/huggingface/trl/blob/v1.13.0/docs/source/sft_trainer.md.
Lester, Brian, Rami Al-Rfou, 和 Noah Constant. 2021. 《The Power of Scale for Parameter-Efficient Prompt Tuning》. 2021年. https://aclanthology.org/2021.emnlp-main.243/.
Li, Xiang Lisa, 和 Percy Liang. 2021. 《Prefix-Tuning: Optimizing Continuous Prompts for Generation》. 2021年. https://aclanthology.org/2021.acl-long.353/.
Liu, Haokun, Derek Tam, Mohammed Muqeeth, Jay Mohta, Tenghao Huang, Mohit Bansal, 和 Colin Raffel. 2022. 《Few-Shot Parameter-Efficient Fine-Tuning is Better and Cheaper than In-Context Learning》. 2022年. https://arxiv.org/abs/2205.05638.
Liu, Shih-Yang, Chien-Yi Wang, Hongxu Yin, Pavlo Molchanov, Yu-Chiang Frank Wang, Kwang-Ting Cheng, 和 Min-Hung Chen. 2024. 《DoRA: Weight-Decomposed Low-Rank Adaptation》. 2024年. https://proceedings.mlr.press/v235/liu24bn.html.
Liu, Xiao, Kaixuan Ji, Yicheng Fu, Weng Tam, Zhengxiao Du, Zhilin Yang, 和 Jie Tang. 2022. 《P-Tuning: Prompt Tuning Can Be Comparable to Fine-tuning Across Scales and Tasks》. 2022年. https://aclanthology.org/2022.acl-short.8/.
Liu, Xiao, Yanan Zheng, Zhengxiao Du, Ming Ding, Yujie Qian, Zhilin Yang, 和 Jie Tang. 2021. 《GPT Understands, Too》. 2021年. https://arxiv.org/abs/2103.10385.
LLaMA-Factory contributors. 不详. 《LLaMA-Factory》. 见于 2026年9月11日. https://github.com/hiyouga/LlamaFactory.
Zhang, Qingru, Minshuo Chen, Alexander Bukharin, Nikos Karampatziakis, Pengcheng He, Yu Cheng, Weizhu Chen, 和 Tuo Zhao. 2023. 《AdaLoRA: Adaptive Budget Allocation for Parameter-Efficient Fine-Tuning》. 2023年. https://arxiv.org/abs/2303.10512.

搜索全书

搜索全书正文、习题与解析