AI 基建
0%
第三部分 · 后训练 · 第 17 章

监督微调与参数高效微调

作者Changkun Ou
阅读时长约 15 分钟

基座语言模型与助手可以采用同一套架构,也可以共享绝大多数权重。两者行为不同,是因为训练时拟合的条件分布不同。预训练奖励的是符合上下文的文本续写;监督微调(SFT)奖励的是在指定对话之后生成指定回复。这种变化可以改善指令遵循、教会模型新的输出结构,或让模型专门适配某个领域,但它不能保证回答真实、安全,也不能赋予模型示范数据从未支持过的知识。

「微调」一词常把两项决定混在一起:

  1. 训练信号是什么? SFT 指定目标词元,并最小化这些词元的下一词元损失。
  2. 允许哪些参数变化? 全量微调会更新模型参数,而参数高效微调(PEFT)则只更新较小的一组参数,或者添加一个小型可训练模块。

因此,SFT 与 PEFT 回答的是两个不同的问题。SFT 是目标函数与数据流水线,LoRA 则是参数化更新的一种方式。做 SFT 时,可以让所有权重都参与训练,也可以使用 LoRA 或其他 PEFT 方法。

把对话转成有监督训练所需的词元

一条 SFT 记录可以包含系统消息、多轮用户与助手消息、工具调用以及工具返回结果。模型并不会直接接收这些字段。对话模板先把它们序列化为一条词元序列,其中包括分词器所要求的精确角色词元与边界词元。训练与服务必须使用同一套模板。即使用户看到的对话完全相同,模板不一致也会改变模型面对的前缀分布。

设序列化后的序列为 u1:T=(u1,,uT)u_{1:T}=(u_1,\ldots,u_T),二值掩码 mtm_t 用来选择参与训练的词元。常见的仅对助手回复计分的目标为

LSFT(θ)=1Mt=1Tmtlogpθ(utu<t),M=t=1Tmt.\mathcal{L}_{\mathrm{SFT}}(\theta) = -\frac{1}{M} \sum_{t=1}^{T} m_t\log p_\theta(u_t\mid u_{<t}), \qquad M=\sum_{t=1}^{T}m_t.

这里,TT 是序列长度;utu_t 是位置 tt 上的词元;u<tu_{<t} 是它之前的前缀;pθp_\theta 是参数为 θ\theta 的模型分布;若某个目标词元需要计分,则 mt=1m_t=1,否则 mt=0m_t=0MM 是参与计分的词元总数。除以 MM 后,损失按目标词元数取平均,不会随着序列变长而仅因求和项增多。

只训练助手回复时,掩码通常会选中所有助手消息,也可能包括助手的轮次结束词元。系统消息、用户消息、填充词元与工具结果只提供上下文,不作为目标。是否只给助手回复计分是一项策略选择,而不是 SFT 的定义。有些方案给整条序列计分,有些只给最后一轮助手回复计分,还有些使用单独的掩码来训练工具调用词元。必须写明具体选择,因为它决定模型在模仿什么。

record 结构化对话 角色与消息内容 template 精确的对话模板 角色与轮次边界 record->template tokens 词元序列 u_1 ... u_T template->tokens context 上下文位置 m_t = 0 tokens->context targets 助手目标位置 m_t = 1 tokens->targets loss 带掩码的下一词元损失 context->loss 作为预测条件 targets->loss update 优化器更新 允许变化的参数 loss->update
图 17.1. SFT 记录在应用损失掩码之前,先被转换为一条词元序列。模板与分词器确定角色边界,目标掩码则决定哪些下一词元预测会更新模型。

这条看似简单的流水线里,还藏着几项实现选择:

  • 轮次结束词元决定模型是否学会停下。 如果训练数据里没有明确的停止边界,模型可能继续模拟下一轮用户消息,也可能连续生成多个答案。
  • 截断会改变监督信号。 左侧截断可能删掉指令,右侧截断可能删掉回答或停止词元。应记录有多少条样本、多少个目标词元因此丢失。
  • 打包仍需要边界。 拼接短记录可以提高加速器利用率,但每条记录仍需终止词元和预期的注意力策略,否则前一条样本会变成后一条样本的上下文。
  • 长度会改变权重。 按词元平均的损失会让长回答获得更大权重。让样本数量保持均衡,与让目标词元贡献保持均衡,解决的是两个不同的问题。

多轮监督还要再做一项选择。可以在一条序列化对话中给每段助手回复计分,也可以把每轮助手回复拆成单独样本,只给当前回复计分。无论哪一种,教师强制都会让后面的回复以记录中的早期回复为条件,而不是以模型在线对话时可能生成的错误回复为条件。因此,完整对话回放必须单独评测。

InstructGPT 先使用标注者示范完成 SFT,之后才进入偏好建模与强化学习 (Ouyang et al. 2022)。因此,不能把 InstructGPT 的最终行为只归因于 SFT。更早的指令调优研究还表明,在许多任务上做指令调优,可以提高对留出任务类型的泛化能力 (Wei et al. 2022)。这些结果说明 SFT 不只是选择输出格式,但效果仍取决于基座模型与训练集。

数据决定模型模仿什么

SFT 提供的是正向示范,相当于告诉模型:「在这段上下文中,生成这段续写。」它并不直接说明哪个备选答案差一点就能接受、另一个答案究竟错在哪里,也不表达两项要求之间应该如何权衡。第 18 章 中的偏好数据会补上这类比较信号。

LIMA 实验提供了一个重要的边界案例。一个 65B 的 LLaMA 模型只在 1,000 条精选样本上微调,就在论文报告的人类评测中学会了有力的回复格式与广泛的对话行为 (Zhou et al. 2023)。这个结果支持一种判断:强大的基座模型可能只需少量数据就能掌握一种风格。但 LIMA 的结果不是通用的样本复杂度定律。若要教会模型专门事实、新工具协议、预训练中覆盖不足的语言,或困难的推理流程,往往需要更广泛的数据覆盖。

一份实用的数据集审计,应当分开检查五个方面:

关注点 训练前需要回答的问题
正确性 回答对相应提示是否在事实与流程上都正确?
覆盖范围 包含哪些任务、语言、长度、格式与失败情形?
混合比例 每个来源或能力各占多少目标词元?
独立性 验证集与测试集是否按来源、任务和近重复内容隔离?
序列化 角色词元、工具结构、停止词元与截断方式是否和部署一致?

重复提示会让随机划分看起来比真实泛化更好。即使样本条数看似平衡,某个主要来源仍可能压过数据量较小的能力,因为长回答会贡献更多目标词元。错误示范的代价尤其高:最大似然训练会奖励模型复现错误示范,却不会表达标签本身存在不确定性。

安全示范同样要关注分布。过多、过宽的拒绝样本会造成过度拒绝(over-refusal),也就是调优后的模型拒绝无害请求,因为它学到的边界比策略原本要求的更宽。

评测应在同一组留出任务上,比较基座模型、仅使用提示的基线与调优后模型。需要报告任务指标、指令与格式遵循情况、适用时的校准结果,以及本应保持不变的能力回归测试。Tulu 3 展示了把开发评测与未见评测分开并做去污染的价值,而不是在公开测试集上选择检查点 (Lambert et al. 2025)。训练损失只能说明模型拟合了受监督词元。

争议所在

浅层对齐假说认为,大部分知识在预训练阶段已经学会,少量 SFT 主要是在选择一种对话风格。LIMA 在一个通用助手场景中为这一观点提供了证据。另一方面,FLAN 一类指令调优、领域适配与工具使用训练也表明,SFT 也能改变任务能力。真正有用的问题,不是抽象地争论 SFT 究竟是在「引出」还是「教会」,而是哪些留出行为发生了变化,以及能否仅靠提示从基座模型中引出这些行为。

决定哪些参数可以更新

更新策略与 SFT 数据集彼此独立。它主要影响可训练状态、优化器内存、适配容量、检查点存储方式与服务行为。

方法 可训练状态 主要优点 主要限制
全量微调 所有选定的模型参数 更新容量最大 梯度、优化器与检查点状态都很大
软提示或前缀 学习得到的输入或前缀表示 每个任务的产物很小 (Lester et al. 2021) 占用条件输入容量,效果可能不及权重更新
瓶颈适配器 插入冻结层之间的新模块 检查点小且模块化 (Houlsby et al. 2019) 未融合或重参数化时会增加一条执行路径
LoRA 选定权重矩阵上的低秩更新 可训练并存储的增量很小 (Hu et al. 2022) 容量与覆盖范围取决于秩和目标模块
QLoRA LoRA,加上训练时冻结的 4 位基座 减少冻结训练权重的存储空间 (Dettmers et al. 2023) 不会消除激活内存,也不保证达到全量微调质量

冻结参数,意味着优化器不更新它,也不需要为它保存梯度或优化器状态。但冻结参数仍会参与前向与反向计算。因此,PEFT 能减少几项重要的内存开销,却不会让基座模型、激活、临时缓冲区或通信消失。

可以用下面这份内存账本近似表示峰值内存:

MpeakMbase+Madapter+Mgrad+Moptim+Mact+Mwork.M_{\mathrm{peak}} \approx M_{\mathrm{base}} +M_{\mathrm{adapter}} +M_{\mathrm{grad}} +M_{\mathrm{optim}} +M_{\mathrm{act}} +M_{\mathrm{work}}.

这里,MpeakM_{\mathrm{peak}} 是加速器峰值内存;MbaseM_{\mathrm{base}} 保存冻结的基座权重;MadapterM_{\mathrm{adapter}} 保存可训练的 PEFT 参数;MgradM_{\mathrm{grad}} 保存这些参数的梯度;MoptimM_{\mathrm{optim}} 保存优化器状态;MactM_{\mathrm{act}} 保存反向传播所需的激活;MworkM_{\mathrm{work}} 则包括算子、通信与反量化使用的临时缓冲区。这个近似没有涵盖分配器细节,因此实际峰值仍应测量。

LoRA 将更新限制为低秩分解

对于冻结的线性映射 W0Rdout×dinW_0\in\mathbb{R}^{d_{\mathrm{out}}\times d_{\mathrm{in}}}低秩适配(LoRA)把有效权重替换为

W=W0+sBA,ARr×din,BRdout×r.W = W_0+sBA, \qquad A\in\mathbb{R}^{r\times d_{\mathrm{in}}}, \qquad B\in\mathbb{R}^{d_{\mathrm{out}}\times r}.

这里,dind_{\mathrm{in}}doutd_{\mathrm{out}} 分别是输入维度和输出维度;rmin(din,dout)r\le\min(d_{\mathrm{in}},d_{\mathrm{out}}) 是适配器的秩;AABB 参与训练;ss 是固定缩放系数,原始参数化通常在选定乘数 α\alpha 后使用 α/r\alpha/r。这项更新满足 rank(sBA)r\operatorname{rank}(sBA)\le r。对于输入 xRdinx\in\mathbb{R}^{d_{\mathrm{in}}},输出为 Wx=W0x+sB(Ax)Wx=W_0x+sB(Ax)。实现通常会把其中一个因子初始化为零,使 BA=0BA=0,因此第一次更新前,适配后的模型与基座模型完全相同。

基座矩阵包含 doutdind_{\mathrm{out}}d_{\mathrm{in}} 个参数,而 LoRA 分支包含

NLoRA=r(din+dout),ρ=NLoRAdoutdin.N_{\mathrm{LoRA}} =r(d_{\mathrm{in}}+d_{\mathrm{out}}), \qquad \rho =\frac{N_{\mathrm{LoRA}}} {d_{\mathrm{out}}d_{\mathrm{in}}}.

这里,NLoRAN_{\mathrm{LoRA}} 是该矩阵的可训练适配器参数量,ρ\rho 是它相对于基座矩阵参数量的比例。整个模型的总量,需要对所有目标矩阵求和,再加上刻意保留为可训练状态的偏置、嵌入或输出头。

2026-08-03T23:47:33.101859 image/svg+xml Matplotlib v3.11.0, https://matplotlib.org/ 8 16 24 32 40 48 56 64 LoRA 秩 r 0.0 0.5 1.0 1.5 2.0 2.5 3.0 LoRA 参数(矩阵占比 %) 4096 阶方阵
图 17.2. 对于一个 4,096 乘 4,096 的矩阵,LoRA 参数占比精确等于 2r/4,096。图中只计算两个低秩因子,并不预测任务质量、内存占用或整个模型的参数占比。

下面的可运行示例执行同一项精确计算。它描述的是一个矩阵,不是完整的 Transformer。

d_in = 4096
d_out = 4096
ranks = [4, 8, 16, 32, 64]

full = d_in * d_out
print(f"基座矩阵参数量:{full:,}")
for rank in ranks:
    adapter = rank * (d_in + d_out)
    fraction = 100 * adapter / full
    print(f"秩 {rank:>2}:{adapter:>7,} 个参数({fraction:>6.3f}%)")
x 输入 x base W_0 x 冻结的基座路径 x->base A A x r × d_in x->A sum + base->sum B s B(Ax) d_out × r A->B B->sum y 输出 Wx sum->y
图 17.3. LoRA 冻结基座矩阵,只训练一条并行的低秩路径。为了切换适配器,两条路径可以保持分离;部署时也可以把低秩更新加到一份实际权重中。

低秩形式是一项容量约束,并不能证明所有有效的微调更新都是低秩的。原始 LoRA 论文在其评测场景中取得了有竞争力的结果 (Hu et al. 2022)。后来针对数学与代码的实验发现,标准低秩 LoRA 学到的新领域内容少于全量微调,但保留了更多基座模型行为 (Biderman et al. 2024)。秩、目标模块、数据集规模、批量大小、初始化、缩放系数与学习率都会影响比较结果。

图 17.4. 低秩重建的线性代数示意图。在一个合成更新中,提高秩可以表示更多彼此独立的方向,而参数量仍为 r(d_in + d_out)。这不是任务质量曲线。

目标模块的选择与秩同样重要。早期工作常只对注意力层使用 LoRA,后来的实验发现,把 MLP 以及适用时的 MoE 投影也纳入目标,可以继续提升结果。2025 年的一份报告称,在其 Llama 与 Qwen 扫描实验中,只要覆盖所有线性层且适配器容量不构成瓶颈,高秩 LoRA 可以达到全量微调的表现;报告还发现,两者的最佳学习率不同,较大批量会让 LoRA 表现变差 (Schulman and others 2025)。这些是具体实验结果,不是通用默认值。应在实际数据集上扫描更新策略。

QLoRA 改变冻结基座的存储方式

量化低秩适配(QLoRA)把冻结的基座权重保存为 4 位 NormalFloat 表示,并以更高的计算精度训练 LoRA 因子。计算时,系统按需反量化权重块;梯度会穿过计算过程传给适配器参数,量化后的基座则保持不变。双重量化会压缩量化常数,分页优化器则用来管理临时内存峰值 (Dettmers et al. 2023)。

QLoRA 论文在其报告的配置中,展示了 65B 模型在单块 48 GB GPU 上完成微调。这是存在性结果,不是硬件定律。序列长度、批量大小、激活检查点、注意力算子、适配器覆盖范围、优化器与临时缓冲区都会显著改变峰值内存。每个基座参数占 4 位,也只是量化值本身的理想负载;缩放因子和其他元数据还会增加存储。

训练精度与部署格式是两回事。用 QLoRA 训练的适配器,可以与量化基座一起服务,也可以与更高精度的基座一起服务,还可以走受支持的合并与重新量化路径。每一种方式都需要单独测试质量与延迟。「使用 QLoRA 训练」并不表示最终服务器的每一步运算都使用 4 位精度。

合并适配器与可切换适配器的成本不同

训练完成后,可以把 LoRA 更新实际写入权重:

Wmerged=W0+sBA.W_{\mathrm{merged}}=W_0+sBA.

这里,WmergedW_{\mathrm{merged}} 是写入 LoRA 更新后的实际权重。合并后的矩阵仍执行原来的线性运算,因此推断时不需要为 LoRA 分支额外执行矩阵乘法。代价体现在运维上:结果会成为另一整套完整权重,而且这个模型实例不再保留可以单独关闭的小型适配器。保留独立分支可以切换适配器,但会增加适配器计算、内存读取和路由。真实延迟取决于批次形状、算子融合、秩、目标模块,以及同一批请求是否使用相同适配器。

热切换适配器也有兼容性约束。服务器必须把适配器与训练时使用的精确基座架构和参数名配对,还要使用兼容的分词器与对话模板。当前 PEFT 工具可以原地替换 LoRA 权重,但目标模块与编译后的形状会限制哪些适配器能够共用一个槽位 (Hugging Face 2026)。一个基座配多个适配器是一种部署设计,不是适配器文件自动具备的属性。

权重合并是另一种近似

不要把一条 LoRA 分支合入自身基座,与组合多个独立微调模型混为一谈。后者才是模型合并。它在兼容的参数坐标上运算,希望无需再次训练,就能保留多种行为。

θi\theta_i 是来自同一个基座 θ0\theta_0 的微调参数向量,任务增量与加权合并可以写为

τi=θiθ0,θmerge=θ0+i=1nλiτi.\tau_i=\theta_i-\theta_0, \qquad \theta_{\mathrm{merge}} =\theta_0+\sum_{i=1}^{n}\lambda_i\tau_i.

这里,i{1,,n}i\in\{1,\ldots,n\} 标识各个源微调;τi\tau_i 是源 ii 相对于基座的参数位移;λi\lambda_i 是选定的合并系数;θmerge\theta_{\mathrm{merge}} 是候选合并模型。这项运算假设各源模型具有相同的架构、张量形状、分词器相关参数与参数对齐方式。共享初始化提供了这种对齐。这个公式不能证明在无关检查点之间做算术合理。

模型汤研究发现,对同一轮微调扫描得到的检查点取平均,往往能改善论文所评测的模型 (Wortsman et al. 2022)。任务算术则表明,在测试过的场景中,添加或取反任务增量可以引导模型行为 (Ilharco et al. 2023)。这两项结果都没有说明任意技能可以干净相加。TIES 会修剪较小的增量、解决符号冲突,再合并与选定符号一致的数值 (Yadav et al. 2023)。DARE 会随机丢弃部分增量参数并重新缩放保留值,然后再进行合并 (Yu et al. 2024)。这些方法只是在处理干扰,并不能保证每个父模型的能力都被保留。

图 17.5. 任务向量算术的二维示意切片。方向一致时,增量相互加强;方向相反时,增量相互抵消。真实检查点的维度高得多,因此必须实际评测,不能仅凭向量相加推断结果。

如果训练数据能够合并,联合微调能为联合目标提供直接证据。无法获得数据或算力时,可以采用无需训练的合并;也可以在有度量的合并扫描中,把它作为成本较低的候选方案。合并后,仍需测试每项组成任务、通用能力、校准与安全性。

把适配当作受控实验

可靠的工作流程会把数据、优化器、参数化方式与部署产物分开记录:

  1. 在查看最终结果前,先定义留出任务与回归测试集。
  2. 把基座检查点、分词器、对话模板、最大长度与目标掩码策略冻结为同一份版本化契约。
  3. 审计来源混合、重复、污染、截断与目标词元数。
  4. 测量基座模型与仅使用提示的基线。
  5. 扫描学习率以及至少一项容量设置,例如 LoRA 的秩或目标模块。不要未经测试就沿用全量微调的超参数。
  6. 硬件允许时,用一个小型全量微调基线与 PEFT 比较。
  7. 评测将要实际服务的确切产物:未合并的适配器、合并后的权重与量化部署可能表现不同。
症状 优先检查
训练损失下降,但对话行为不稳定 模板不一致、目标掩码错误、缺少停止词元
目标任务改善,但通用能力下降 数据混合失衡、训练步数过多、全量更新造成遗忘
LoRA 在小型数据划分上的损失很低,却仍然欠拟合 秩或目标模块形成瓶颈、数据划分重复、评测范围过窄
QLoRA 内存不足 激活、序列长度、批量大小、临时缓冲区、激活检查点
适配器结果正确,但服务很慢 未合并分支的成本、逐请求路由、批次碎片化、编译
合并模型丢失父模型的一项能力 增量冲突、系数选择、源模型不兼容、没有联合训练
下层约束

训练样本不只是文字。它还包括字节、规范化文本、模板词元、截断方式、注意力掩码、目标掩码与打包后的序列。同样,可训练参数量也不等于峰值内存:基座权重、激活、梯度、优化器状态、通信缓冲区与临时算子占据不同的内存项。比较训练方案之前,先记录这些下层契约。

证据边界

SFT 让模型更可能在特定序列化方式下复现示范行为。PEFT 改变的是允许承载这项更新的参数集合或参数形式。两者互不决定,也都不能取代留出评测。

少量精选数据可能足以教会模型风格与熟悉任务,LoRA 与 QLoRA 也能显著降低这些实验的成本。证据只支持到这里。新知识、距离较远的领域、长时间训练、对精度敏感的任务与技能组合,可能暴露容量、遗忘、量化或干扰方面的限制。选择能够通过目标测试与回归测试的最小更新,再验证实际部署的确切产物。

延伸阅读

  • Zhou et al., “LIMA: Less Is More for Alignment,” 2023. arXiv:2305.11206
    LIMA 表明,仅用 1,000 条精心筛选的提示-回复对对 65B LLaMa 模型进行监督微调(无需 RLHF)即可实现强对齐效果,支持了"表层对齐假说"。
  • Hu et al., “LoRA: Low-Rank Adaptation of Large Language Models,” 2022. arXiv:2106.09685
    LoRA 冻结预训练权重,向每个 Transformer 层注入可训练的低秩矩阵对,与全量微调相比可将可训练参数减少 10,000 倍、将 GPU 显存需求降低 3 倍,且不引入额外推理延迟。
  • Dettmers et al., “QLoRA: Efficient Finetuning of Quantized LLMs,” 2023. arXiv:2305.14314
    QLoRA 通过将冻结的 4 位量化模型的梯度反向传播至 LoRA 低秩适配器,并引入 NF4、双重量化和分页优化器,实现在单张 48GB GPU 上对 65B 参数大语言模型进行参数高效微调。
  • Houlsby et al., “Parameter-Efficient Transfer Learning for NLP” (适配器), 2019. arXiv:1902.00751
    向 BERT 各层插入适配器模块,仅训练全量参数高效微调(PEFT)的 3.6%,即可在 GLUE 上达到接近完全微调的性能。
  • Wortsman et al., “Model Soups: Averaging Weights of Multiple Fine-Tuned Models Improves Accuracy Without Increasing Inference Time,” 2022. arXiv:2203.05482
    对多个微调模型的权重取平均(称为"模型汤")可在不增加推理成本的前提下,优于最佳单一模型并提升分布外鲁棒性。
  • Ilharco et al., “Editing Models with Task Arithmetic,” 2023. arXiv:2212.04089
    任务算术提出任务向量(微调权重减去预训练权重所得方向),通过对其取负或相加即可在无需重新训练的情况下编辑模型行为。
  • Yadav et al., “TIES-Merging: Resolving Interference When Merging Models,” 2023. arXiv:2306.01708
    TIES-MERGING 是一种无需训练的模型合并方法,通过裁剪冗余参数、解决符号冲突、仅对符号对齐的参数求平均,将多个微调模型合并为单一多任务模型。
  • Yu et al., “Language Models are Super Mario: Absorbing Abilities from Homologous Models as a Free Lunch” (DARE), 2024. arXiv:2311.03099
    DARE 通过随机丢弃并重缩放监督微调(SFT)的增量参数,使多个任务专用语言模型无需重新训练即可合并为单一模型。
  • Ouyang et al., “Training Language Models to Follow Instructions with Human Feedback” (循环所假定的人类打分者), 2022. arXiv:2203.02155
    InstructGPT 先使用标注者示范训练,再使用偏好排序和强化学习;最终助手行为反映的是整条流程,而不是单独的监督微调。
  • Schulman & others, “LoRA Without Regret” (关于目标模块、秩、批次大小和学习率的企业实验), 2025. thinkingmachines.ai
    大规模实验表明,把 LoRA 施加到所有线性层(含 MLP 与 MoE)并以完整微调约十倍的学习率训练时,效果与完整微调相当;只作用于注意力层会明显欠佳,而在 RL 后训练中即便秩为 1,LoRA 也能追平完整微调。

评论

登录后评论