Fine-tuning
微调会在特定任务的数据上继续训练预训练模型,使模型用少得多的数据和计算资源适应任务。涵盖工作原理、PEFT 和代码。
微调是指继续训练一个已在大型数据集上训练过的模型,在规模较小、针对特定任务的数据集上更新部分或全部权重。预训练模型的权重已经编码了一般知识,例如视觉模型中的边缘、纹理和形状,或大语言模型(LLMs)中的语法和事实,因此与从随机权重开始训练相比,微调只需少得多的标注数据和计算资源,就能达到较高准确率。微调是最常见的迁移学习方法,也是大多数自定义目标检测模型和聊天助手基于预训练基础模型构建的方式。
微调的工作原理#
微调时,运行会加载预训练权重,替换或调整与原任务相关的层(例如分类器或检测头),然后使用常见的损失函数和优化器在新数据上训练。以下三个选择决定原模型能保留多少:
- 学习率:微调使用的学习率低于预训练阶段,通常会先进行短暂的预热,这样更新就能细化预训练特征,而不是将其覆盖。ULMFiT 进一步采用了判别式学习率:顶层以下的每一层,学习率都降低为上一层的 1/2.6。
- 训练哪些层:冻结骨干网络的早期层,可以保持通用特征不变、减少内存使用,并降低小型数据集上过拟合的风险。渐进式解冻会先训练新的头部,然后再逐步解冻更深的层。
- 训练时长:模型仅使用新数据训练的时间越长,就越可能因灾难性遗忘而丢失原有能力。
合适的配置取决于可用内存、标注数据量,以及是否仍需保留原有能力:
全量微调与参数高效微调#
全量微调会更新所有权重。对于一个拥有 70 亿参数的 LLM,这意味着要为 70 亿个值保存梯度和优化器状态,并为每个任务保存一份完整的模型副本。参数高效微调(PEFT)会冻结预训练权重,改为训练少量新增或选定的参数;Hugging Face 的 PEFT 库实现了常见方法。LoRA会在冻结的权重矩阵旁添加可训练的低秩矩阵。与使用 Adam 对 GPT-3 175B 进行全量微调相比,LoRA 将可训练参数减少了 10,000 倍,并将 GPU 内存用量减少了 3 倍。QLoRA在经过 4 位量化的基础模型上训练 LoRA 适配器,使得在单个 48 GB GPU 上微调一个 650 亿参数的模型成为可能。
预训练之后,LLM 会经历多个微调阶段。指令微调使用提示和响应配对数据进行训练;随后,基于人类反馈的强化学习(RLHF)和直接偏好优化(DPO)等基于偏好的方法会进一步使响应符合人类偏好。
微调与相关术语#
- 迁移学习:将针对一个任务训练的模型复用于另一任务这一更广泛的理念。微调会更新预训练权重,而特征提取会冻结这些权重,只训练新的头部。
- 从头开始训练:从随机权重开始,需要多得多的标注数据和计算资源。对于新架构,以及与现有任何预训练数据都相差甚远的领域,这种方法很适用。
- 线性探测:只在冻结的特征上训练线性分类器,通常用于衡量预训练表示已经具备多少信息。
- 提示工程和检索增强生成(RAG):通过改变 LLM 的输入来改变其行为,不触碰模型权重。
微调目标检测器#
在预训练的 YOLO26 检查点上使用新数据集调用 train(),就能对模型进行微调:所有兼容权重都会迁移,默认的 cls_remap=True 会复制类别名称匹配的分类器行。因此,在非洲野生动物数据集上,大象和斑马类别的输出会从 COCO 预训练对应的行开始,而 COCO 中没有的水牛和犀牛类别则会从头开始。
from ultralytics import YOLO
# 加载 COCO 预训练的 YOLO26n 权重;而 YOLO("yolo26n.yaml") 会从头开始训练
model = YOLO("yolo26n.pt")
# 在 1,052 张包含水牛、大象、犀牛和斑马的训练图像上进行微调
results = model.train(data="african-wildlife.yaml", epochs=30, imgsz=640)对于这次 30 轮训练,默认的 optimizer="auto" 会选择 AdamW 和 lr0=0.00125;该学习率根据数据集的 4 个类别计算得出,因为本次训练的迭代次数少于 10,000。










