一文彻底搞懂 Fine-tuning:预训练与微调详解
本文深入解析了大模型开发中的预训练与微调技术。预训练利用海量无标签数据学习通用特征,为模型奠定知识基础;微调则在特定任务的小数据集上进一步优化模型性能。文章详细对比了两种技术的差异,介绍了监督微调(SFT)、基于人类反馈的强化学习(RLHF)以及参数高效微调(PEFT)如 LoRA 等技术细节。同时提供了 HuggingFace 实战代码示例,分析了灾难性遗忘、过拟合等挑战及应对策略,并给出了数据准备与评估指标的最佳实践指南。

本文深入解析了大模型开发中的预训练与微调技术。预训练利用海量无标签数据学习通用特征,为模型奠定知识基础;微调则在特定任务的小数据集上进一步优化模型性能。文章详细对比了两种技术的差异,介绍了监督微调(SFT)、基于人类反馈的强化学习(RLHF)以及参数高效微调(PEFT)如 LoRA 等技术细节。同时提供了 HuggingFace 实战代码示例,分析了灾难性遗忘、过拟合等挑战及应对策略,并给出了数据准备与评估指标的最佳实践指南。

在人工智能领域,尤其是大语言模型(LLM)的发展中,**预训练(Pre-training)和微调(Fine-tuning)**是两个核心概念。理解它们的区别、联系以及应用场景,对于掌握现代 AI 技术至关重要。
预训练是在大规模无标签数据上训练模型以学习通用特征的过程;而微调则是在特定任务的小数据集上对预训练模型进行进一步训练,以优化其在目标任务上的性能。本文将深入探讨这两者的技术原理、分类、实施步骤及最佳实践。
预训练的核心目的是让模型在接触特定任务之前,先通过海量通用数据建立对世界的基本认知。
预训练通常是一个无监督或自监督学习过程。
# 概念示例:预训练的目标函数(简化版)
def masked_lm_loss(predictions, labels):
# 计算预测概率与真实标签之间的交叉熵损失
# 仅对被掩盖的位置计算损失
return cross_entropy(predictions[mask_indices], labels[mask_indices])
尽管预训练模型具备通用能力,但直接应用于垂直领域往往效果不佳。
监督微调(SFT, Supervised Fine-tuning)
基于人类反馈的强化学习(RLHF)
全面微调(Full Fine-tuning)
参数高效微调(PEFT, Parameter-Efficient Fine-tuning)
以下展示如何使用 Hugging Face Transformers 库进行简单的指令微调。
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
import torch
# 1. 加载预训练模型和分词器
model_name = "meta-llama/Llama-2-7b-hf"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto")
# 2. 准备指令数据
data = [
{"instruction": "解释什么是机器学习", "output": "机器学习是..."},
{"instruction": "写一首关于春天的诗", "output": "春眠不觉晓..."}
]
# 3. 配置训练参数
training_args = TrainingArguments(
output_dir="./results",
num_train_epochs=3,
per_device_train_batch_size=2,
gradient_accumulation_steps=8,
learning_rate=2e-5,
fp16=True,
)
# 4. 启动训练
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
)
trainer.train()
微调过程中,模型可能会忘记预训练阶段学到的通用知识。
在小数据集上微调容易导致模型死记硬背。
微调后的模型若参数量巨大,推理速度可能变慢。
| 特性 | 预训练 (Pre-training) | 微调 (Fine-tuning) |
|---|---|---|
| 数据要求 | 海量无标签数据 | 少量有标签数据 |
| 训练目标 | 学习通用语言/视觉特征 | 适应特定下游任务 |
| 计算资源 | 极高(数千 GPU) | 中等至低 |
| 时间周期 | 数周至数月 | 数小时至数天 |
| 参数更新 | 全部参数 | 全部或部分参数 |
| 主要风险 | 收敛困难、幻觉 | 灾难性遗忘、过拟合 |
LoRA 假设模型权重的更新具有低秩特性。原始权重 $W$ 固定,新增旁路矩阵 $ riangle W = BA$,其中 $B \in R^{d \times r}, A \in R^{r \times k}$,且 $r \ll d, k$。
推理时:$h = Wx + \triangle Wx = Wx + BAx$。 这使得参数量从 $O(d \times k)$ 降至 $O(r \times (d+k))$,显著降低显存占用。
结合 4-bit 量化与 LoRA,可在单张消费级显卡上微调 70B 参数模型。它通过双比特压缩权重,同时保持精度损失最小化。
Instruction-Input-Output 格式。预训练赋予了模型'大脑',微调则教会它'专业技能'。在实际工程中,选择 Full Fine-tuning 还是 PEFT 取决于硬件资源和任务需求。随着技术发展,PEFT 已成为主流选择,使得在消费级显卡上运行大模型成为可能。掌握这两者,是构建高质量 AI 应用的基础。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online