基础概念 #

预训练模型 #

什么是预训练? #

预训练是指在大规模数据集上训练模型,使其学习通用特征和知识的过程。

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