跳转至

微调

概述

微调(finetuning)是通过在目标数据上继续训练,将预训练基础模型适配到特定任务或风格的过程。提示词工程和 RAG 是在不触碰权重的前提下、通过输入来影响模型,而微调则直接修改模型本身。这让它更强大,但也更耗资源、更复杂。

微调最常用于:改善指令遵循行为、强制特定的输出风格或格式、提升领域专项能力,或通过让小模型达到大模型的水平来降低延迟和成本。

何时该微调

微调的理由

  • 风格与格式合规:提示词工程无法可靠地强制严格的输出结构(例如始终返回带特定字段的合法 JSON)。微调可以把它固化进模型。
  • 领域专项知识:基座模型可能缺乏医疗、法律或专有知识。在领域语料上微调能改善覆盖。
  • 任务专门化:对于狭窄任务,一个微调后的小模型可以匹敌甚至超越大得多的通用模型,且延迟和成本更低。
  • 安全与对齐:抑制不良行为、强制品牌语气,或调校拒答模式。
  • 缩短提示长度:如果需要在上下文中放入很多样例(少样本)才能得到好结果,把这些样例微调进模型权重可降低每次请求的成本。

不该微调的理由

  • 数据不足:微调通常需要数百到数千个高质量样例。样例更少时,提示词工程或 RAG 往往表现更好。
  • 任务用提示即可解决:许多任务(包括复杂推理)都能用精心设计的提示解决。微调徒增成本与复杂度,却不保证收益。
  • 基座模型在变:如果底层模型频繁更新,微调成果很快就会过时。
  • RAG 能搞定:如果需求是注入最新或私有知识,RAG 通常比微调更便宜、更灵活。

微调 vs. RAG 决策框架

场景 首选方案
需要最新或频繁变化的数据 RAG
需要强制严格的输出格式或风格 微调
标注数据有限 RAG + 提示词工程
需要用更小的模型降低推理成本 微调(蒸馏或直接微调)
需要注入可附引用的事实性知识 RAG
任务需要基座模型未曾训练过的行为 微调
以上情形的组合 RAG + 微调(两者正交,可结合)

内存瓶颈

基础模型微调是内存密集型的。训练期间,GPU 必须容纳: - 模型权重:FP32 ≈ 4 字节/参数;FP16 ≈ 2 字节/参数 - 梯度:与权重同等大小 - 优化器状态:Adam 使用 8 字节/参数(动量 + 方差) - 激活值:与批大小 × 序列长度成正比

以一个 70 亿参数模型、FP32、Adam 为例:约 (4 + 4 + 8) × 7B = ~112GB——远超大多数单块 GPU 的容量。这正是大多数实际微调都采用降精度训练和参数高效方法的原因。

数值表示

格式 位数 范围 用途
FP32 32 ~±3.4×10³⁸ 全精度训练
FP16 / BF16 16 范围更小;BF16 更稳定 混合精度训练;推理
INT8 8 -128 到 127 推理(权重量化)
INT4 4 -8 到 7 激进压缩(QLoRA)

BF16(brain floating point)在训练中优于 FP16:它拥有与 FP32 相同的动态范围,却只占一半内存,从而避免了 FP16 常见的溢出问题。

量化降低所存权重的精度以减小内存占用。详见推理优化

参数高效微调(PEFT)

PEFT 方法只更新一小部分模型参数,从而大幅降低内存和计算需求。核心洞见是:模型对任何特定任务都是过参数化的,只需适配一个很小的子空间,就能保留大部分原有知识。

LoRA(低秩适配)

主流的 PEFT 方法。LoRA 不更新完整的权重矩阵 W(尺寸 d×k),而是加入一个低秩分解:

W' = W + BA  (where B is d×r, A is r×k, r << min(d,k))

只训练 A 和 B,W 保持冻结。关键参数: - 秩 r:r 越小 = 可训练参数越少 = 越省内存,但表达能力越低。典型取值:4–64。 - Alpha(α):LoRA 更新的缩放系数;常设为 r 或 2r。 - 目标模块:对哪些权重矩阵施加 LoRA。注意力矩阵(Q、K、V、O)最为常见;有些实践者也会作用于 MLP 层。

收益: - 可训练参数比全量微调少 10–10,000 倍 - 只需保存和加载小巧的适配器;基座模型可在多个任务间共享 - 推理时适配器权重可合并进基座权重,不引入额外延迟

QLoRA

将量化与 LoRA 结合: 1. 将基座模型权重量化到 4 位(NF4 格式——一种为正态分布权重设计的 4 位浮点格式) 2. 在冻结的量化基座之上,以 16 位精度训练 LoRA 适配器

实际影响:一个 650 亿参数模型,FP16 微调本需约 130GB,用 QLoRA 可在单块 48GB GPU 上完成微调。这让大模型微调在消费级硬件上也变得可行。

其他 PEFT 方法

方法 说明 关键特点
Prompt tuning 学习前置于输入的软性"虚拟 token";只训练 token 嵌入 参数极少;需要较大的基座模型才能奏效
Prefix tuning 在每个注意力层添加可学习的键/值对 比 prompt tuning 更具表达力
适配器层(Adapter layers) 在 transformer 层之间插入小型可训练模块 参数略多于 LoRA;原始架构保持不变
IA³ 缩放激活值;参数比 LoRA 少 100 倍 最适合数据极少的场景

模型合并

一种较新的实验性方法:通过对多个微调模型的权重矩阵做平均或插值来合并它们,无需任何额外训练。

SLERP(球面线性插值):在超球面上对两个模型的权重向量进行插值。相比简单平均,能更平滑地融合两个父模型的能力。

TIES(Trim, Elect Sign, Merge):通过以下方式处理多个模型间冲突的参数更新——(1)裁剪掉幅度很小的变化,(2)通过多数投票解决符号冲突,(3)只合并被选中的参数。

DARE(Drop and Rescale):随机丢弃一部分增量权重(微调后减去基座),再对余下部分重新缩放。可减少不同微调目标之间的相互干扰。

模型合并适合在不重新训练的情况下组合多个任务专长或语言能力,但结果不如直接微调可预测。

微调技巧

质量重于数量:1,000 个高质量、多样化的样例通常胜过 10,000 个嘈杂样例。"垃圾进、垃圾出"对微调的适用程度甚至比对基座训练更甚。

从小做起:先用几百个样例验证方法是否奏效,再扩大规模。每次训练后都在留出集上评估。

先建基线:微调前先评估基座模型。有时仅靠提示词工程就能达到目标质量。

警惕过拟合:数据集小的时候,模型可能记住训练样例。监控验证损失并采用早停。

选对基座:微调一个强的 7B 模型往往优于微调一个弱的 13B 模型。基座模型的质量很关键。

LoRA 秩的选择:从 r=16 或 r=32 起步。若适配器不收敛就增大秩;若需要节省 GPU 内存就减小秩。

参见

参考资料