基础概念 #
预训练模型 #
什么是预训练? #
预训练是指在大规模数据集上训练模型,使其学习通用特征和知识的过程。
text
┌─────────────────────────────────────────────────────────────┐
│ 预训练过程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 大规模数据(TB 级) │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ 预训练模型 │ │
│ │ Pre-trained │ │
│ └─────────────┘ │
│ │ │
│ ▼ │
│ 学到的知识: │
│ ├── 语言结构(语法、词汇) │
│ ├── 世界知识(事实、概念) │
│ └── 通用能力(理解、生成) │
│ │
└─────────────────────────────────────────────────────────────┘
预训练模型类型 #
text
按架构分类:
├── Encoder-only(仅编码器)
│ ├── BERT
│ ├── RoBERTa
│ └── 适用:理解任务(分类、抽取)
│
├── Decoder-only(仅解码器)
│ ├── GPT 系列
│ ├── LLaMA
│ └── 适用:生成任务
│
└── Encoder-Decoder(编码器-解码器)
├── T5
├── BART
└── 适用:序列到序列任务
预训练目标 #
text
自回归语言建模(Autoregressive LM)
├── 预测下一个词
├── GPT、LLaMA 使用
└── 适合生成任务
掩码语言建模(Masked LM)
├── 预测被遮盖的词
├── BERT 使用
└── 适合理解任务
序列到序列建模
├── 编码器-解码器架构
├── T5 使用
└── 适合转换任务
迁移学习 #
核心思想 #
text
┌─────────────────────────────────────────────────────────────┐
│ 迁移学习原理 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 源任务(Source Task) │
│ ├── 大规模通用任务 │
│ ├── 学习通用特征 │
│ └── 积累先验知识 │
│ │
│ ↓ 知识迁移 │
│ │
│ 目标任务(Target Task) │
│ ├── 特定任务 │
│ ├── 复用通用特征 │
│ └── 学习任务特定知识 │
│ │
└─────────────────────────────────────────────────────────────┘
为什么迁移学习有效? #
text
知识可迁移性:
├── 低层特征通用
│ ├── 词向量
│ ├── 语法结构
│ └── 基本语义
│
├── 高层特征可适配
│ ├── 任务特定模式
│ ├── 领域知识
│ └── 输出格式
│
└── 迁移效果
├── 加速收敛
├── 提升性能
└── 减少数据需求
迁移学习策略 #
text
特征提取(Feature Extraction)
├── 冻结预训练参数
├── 只训练任务特定层
└── 适合:数据少、相似任务
微调(Fine-tuning)
├── 更新全部或部分参数
├── 使用较小学习率
└── 适合:数据多、差异大
渐进式微调
├── 逐层解冻
├── 从高层到低层
└── 适合:平衡通用性和特定性
微调类型详解 #
1. 监督微调(SFT) #
text
┌─────────────────────────────────────────────────────────────┐
│ 监督微调(SFT) │
├─────────────────────────────────────────────────────────────┤
│ │
│ 数据格式: │
│ ├── 输入:文本、问题 │
│ └── 输出:标签、答案 │
│ │
│ 训练目标: │
│ └── 最小化预测与标签的差异 │
│ │
│ 示例: │
│ 输入:这篇文章的主题是什么? │
│ 输出:科技 │
│ │
└─────────────────────────────────────────────────────────────┘
python
from transformers import Trainer, TrainingArguments
training_args = TrainingArguments(
output_dir="./results",
num_train_epochs=3,
per_device_train_batch_size=8,
learning_rate=2e-5,
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
)
trainer.train()
2. 指令微调 #
text
┌─────────────────────────────────────────────────────────────┐
│ 指令微调 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 目标:让模型学会遵循指令 │
│ │
│ 数据格式: │
│ ├── Instruction:任务指令 │
│ ├── Input:输入内容(可选) │
│ └── Output:期望输出 │
│ │
│ 示例: │
│ Instruction:将以下句子翻译成英文 │
│ Input:你好,世界 │
│ Output:Hello, World │
│ │
└─────────────────────────────────────────────────────────────┘
python
instruction_data = [
{
"instruction": "将以下句子翻译成英文",
"input": "你好,世界",
"output": "Hello, World"
},
{
"instruction": "总结以下文章",
"input": "这是一篇关于...",
"output": "文章主要讲述了..."
}
]
3. 偏好微调(RLHF/DPO) #
text
┌─────────────────────────────────────────────────────────────┐
│ 偏好微调(Preference Fine-tuning) │
├─────────────────────────────────────────────────────────────┤
│ │
│ 目标:对齐人类偏好 │
│ │
│ 方法: │
│ ├── RLHF(Reinforcement Learning from Human Feedback) │
│ │ ├── 训练奖励模型 │
│ │ └── 使用 PPO 优化 │
│ │ │
│ └── DPO(Direct Preference Optimization) │
│ └── 直接优化偏好 │
│ │
│ 数据格式: │
│ ├── Prompt:输入 │
│ ├── Chosen:优选回答 │
│ └── Rejected:拒绝回答 │
│ │
└─────────────────────────────────────────────────────────────┘
python
preference_data = [
{
"prompt": "什么是机器学习?",
"chosen": "机器学习是人工智能的一个分支...",
"rejected": "机器学习就是让机器学习..."
}
]
4. 领域微调 #
text
┌─────────────────────────────────────────────────────────────┐
│ 领域微调 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 目标:注入领域知识 │
│ │
│ 数据来源: │
│ ├── 领域文档 │
│ ├── 专业书籍 │
│ ├── 学术论文 │
│ └── 行业报告 │
│ │
│ 示例领域: │
│ ├── 医疗:病历、医学文献 │
│ ├── 法律:法条、判例 │
│ ├── 金融:财报、研报 │
│ └── 技术:文档、代码 │
│ │
└─────────────────────────────────────────────────────────────┘
参数高效微调(PEFT) #
为什么需要 PEFT? #
text
全量微调的问题:
├── 显存需求大
│ └── 7B 模型需要 80GB+ 显存
├── 训练成本高
│ └── 需要多卡并行
├── 存储开销大
│ └── 每个任务一个完整模型
└── 灾难性遗忘风险
└── 可能丢失预训练知识
PEFT 的优势:
├── 显存需求小
│ └── 7B 模型只需 24GB 显存
├── 训练成本低
│ └── 单卡可训练
├── 存储开销小
│ └── 只保存少量参数
└── 减少遗忘
└── 原始参数保持不变
PEFT 方法分类 #
text
┌─────────────────────────────────────────────────────────────┐
│ PEFT 方法概览 │
├─────────────────────────────────────────────────────────────┤
│ │
│ LoRA(Low-Rank Adaptation) │
│ ├── 添加低秩矩阵 │
│ ├── 参数量:原模型的 0.1%-1% │
│ └── 效果:接近全量微调 │
│ │
│ QLoRA(Quantized LoRA) │
│ ├── 量化 + LoRA │
│ ├── 参数量:原模型的 0.1%-1% │
│ └── 显存:大幅降低 │
│ │
│ Prefix Tuning │
│ ├── 添加可学习前缀 │
│ ├── 参数量:原模型的 0.1% │
│ └── 效果:适合生成任务 │
│ │
│ Adapter │
│ ├── 插入适配器层 │
│ ├── 参数量:原模型的 1%-5% │
│ └── 效果:稳定可靠 │
│ │
└─────────────────────────────────────────────────────────────┘
LoRA 原理 #
text
原始权重矩阵:W (d × k)
LoRA 分解:
W' = W + ΔW = W + BA
其中:
├── B: d × r 矩阵
├── A: r × k 矩阵
└── r << min(d, k) (低秩)
参数量对比:
├── 原始:d × k
├── LoRA:d × r + r × k
└── 例如:d=4096, k=4096, r=16
├── 原始:16,777,216
└── LoRA:131,072 (减少 128 倍)
python
from peft import LoraConfig, get_peft_model
lora_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, lora_config)
训练配置基础 #
关键超参数 #
text
学习率(Learning Rate)
├── 全量微调:1e-5 到 5e-5
├── LoRA:1e-4 到 1e-3
└── 影响:收敛速度和稳定性
批次大小(Batch Size)
├── 受显存限制
├── 梯度累积可模拟大批次
└── 影响:训练稳定性
训练轮数(Epochs)
├── 通常 1-5 轮
├── 过多易过拟合
└── 影响:模型性能
权重衰减(Weight Decay)
├── 通常 0.01 到 0.1
├── 防止过拟合
└── 影响:泛化能力
预热步数(Warmup Steps)
├── 通常总步数的 5%-10%
├── 稳定训练初期
└── 影响:训练稳定性
训练技巧 #
text
梯度累积(Gradient Accumulation)
├── 模拟大批次训练
├── 解决显存限制
└── 示例:batch_size=4, accumulation=8
└── 等效 batch_size=32
混合精度训练(Mixed Precision)
├── 使用 FP16/BF16
├── 减少显存占用
└── 加速训练
梯度检查点(Gradient Checkpointing)
├── 时间换空间
├── 减少显存占用
└── 适合大模型
学习率调度(Learning Rate Schedule)
├── Linear:线性衰减
├── Cosine:余弦衰减
└── Constant:恒定学习率
数据准备基础 #
数据格式 #
text
文本分类:
{
"text": "这是一篇关于科技的文章",
"label": "科技"
}
问答对:
{
"question": "什么是机器学习?",
"answer": "机器学习是人工智能的一个分支..."
}
对话数据:
{
"conversations": [
{"role": "user", "content": "你好"},
{"role": "assistant", "content": "你好!有什么可以帮助你的?"}
]
}
数据质量要求 #
text
数据质量维度:
├── 准确性
│ └── 标注正确无误
├── 一致性
│ └── 标注标准统一
├── 完整性
│ └── 数据完整无缺失
├── 多样性
│ └── 覆盖各种情况
└── 相关性
└── 与任务相关
数据清洗步骤:
├── 去重
├── 去噪
├── 格式统一
├── 质量过滤
└── 敏感信息处理
评估指标 #
分类任务 #
text
准确率(Accuracy)
├── 正确预测的比例
└── 适用:类别平衡
精确率(Precision)
├── 预测为正中真正为正的比例
└── 关注:误报率
召回率(Recall)
├── 真正为正中被预测为正的比例
└── 关注:漏报率
F1 分数
├── 精确率和召回率的调和平均
└── 适用:类别不平衡
生成任务 #
text
BLEU
├── 机器翻译常用
└── 基于 n-gram 匹配
ROUGE
├── 文本摘要常用
└── 基于 n-gram 重叠
Perplexity
├── 语言模型评估
└── 衡量模型困惑度
人工评估
├── 流畅性
├── 相关性
├── 准确性
└── 有用性
下一步 #
现在你已经掌握了 Fine-tuning 的核心概念,接下来学习 快速开始,动手完成你的第一个微调实验!
最后更新:2026-04-05