本文是程序员转行学习AI大模型的第16个核心知识点笔记,附清晰业务流程示例。 当前阶段:还在学习知识点,由点及面,从 0 到 1 搭建 AI 大模型知识体系中。 系列更新,关注我,后续会持续记录分享转行经历~
在学习模型微调时,涉及的概念较多,学习过程中,也一直混淆,以此记录自己对模型微调中涉及词汇的理解。
模型微调概念
模型微调是指一个大概念,模型先进过预训练(Pre Train,PT),通过大量无监督数据学习,然后再经过特定数据继续训练的过程,就是模型微调。
可以这样理解:
预训练模型 = 大学毕业生(通识教育)
微调模型 = 专业培训(专业技能训练)
大学毕业生 → 微调 → 专业人才
预训练模型 → 微调 → 领域专家
1、预训练阶段
在大规模语料上训练
学习:通用知识(语言、常识、推理)
2、微调阶段
在特定数据上继续训练
学习:领域知识(医疗、法律、编程)
模型微调根据微调阶段,又可以分为监督微调(Supervised Fine-tuning,SFT)和偏好优化(Preference Optimization,PO)。
微调阶段划分(训练数据划分)
监督微调(SFT)
监督微调,是使用标注数据训练模型,每个输入都有正确的输出。
如下是监督微调的数据格式:
# 监督微调训练数据格式
[
{
"input": "什么是机器学习?",
"output": "机器学习是人工智能的一个分支..."
},
{
"input": "什么是深度学习?",
"output": "深度学习是机器学习的子领域..."
}
]
# 训练目标
给定输入,预测正确的输出
偏好优化(PO)
偏好优化,是基于人类偏好训练模型,让模型输出更符合人类期望。简单理解,就是输出符合人类价值观。
如下是偏好优化的示例:
# 偏好优化训练数据格式
[
{
"prompt": "写一首关于春天的诗",
"chosen": "春风拂面绿柳枝,花香满园醉人心...",
"rejected": "春天来了,花开了,很美..."
}
]
# 训练目标
学习:人类更喜欢哪个输出
# 传统监督学习
输入 → 模型 → 输出
判断:输出是否正确?
# 偏好优化
输入 → 模型 → 多个输出
判断:哪个输出更符合人类偏好?
以上是根据微调阶段划分,也可以说是按照训练数据类型分类,监督微调是有标注数据,偏好优化是有偏好数据。
如果根据微调参数划分,模型微调可以分为全量微调(Full Fine-tuning)、高效参数微调(Parameter-Efficient Fine-tuning,PEFT)。
微调参数效率划分(微调参数量划分)
全量微调
全量微调,训练模型的所有参数。
如下是全量微调的示例:
# 训练参数
model = GPT2Model()
for param in model.parameters():
param.requires_grad = True # 所有参数都可训练
# 参数量
总参数:82M
可训练参数:82M(100%)
全量微调效果最好,充分利用模型容量,表达能力也强,缺点是资源需求高,需要大量显存,训练参数多,更新慢,存储大,每个训练任务都要保存完整模型。
PEFT
PEFT,只训练模型的一小部分参数,大幅减少资源需求。
# 全量微调
W = W_original + ΔW # 更新所有参数
# PEFT
W = W_frozen + ΔW_small # 只更新少量参数
# 参数对比
全量微调:82M参数可训练
PEFT:0.82M参数可训练(1%)
PEFT 包括以下几种方法:
LoRA(Low-Rank Adaptation)
LoRA:低秩自适应微调。
# 核心思想
原始权重 W (d × d)
分解为:W = W_frozen + A × B
其中:A (d × r), B (r × d), r << d
# 参数量
原始:d × d = 768 × 768 = 589,824
LoRA:d × r + r × d = 768 × 4 + 4 × 768 = 6,144
减少:98.96%
LoRA 特点:
- 参数最少:通常 < 1%
- 效果最好:接近全量微调
- 最流行:广泛使用
Prefix Tuning
# 核心思想
在每个Transformer层前面添加可训练的前缀
输入 → [前缀] + 输入 → Transformer层
# 前缀参数
每层添加:prefix_tokens (虚拟token)
参数量:n_layers × n_prefix × d_model
Prefix Tuning 特点:
- 不修改模型:只添加前缀
- 参数适中:比 LoRA 多,但比全量少
- 影响推理速度:前缀增加序列长度
Prompt Tuning
# 核心思想
只在输入层添加可训练的提示词
输入 → [提示词] + 输入 → 模型
# 提示词参数
只添加:prompt_tokens (虚拟token)
参数量:n_prompt × d_model
Prompt Tuning 特点:
- 参数最少:通常 < 0.1%
- 最简单:实现最容易
- 效果有限:表达能力较弱
上述 PEFT 三种方法对比:
偏好优化两种算法(DPO vs PPO)
DPO(Direct Preference Optimization,偏好优化算法)
DPO:直接基于偏好数据优化模型,不需要训练奖励模型。
# 传统RLHF方法
1. 训练奖励模型(基于人类反馈)
2. 使用PPO优化策略模型
# DPO方法
直接基于偏好数据优化策略模型
跳过奖励模型训练步骤
DPO训练数据格式
[
{
"prompt": "写一首关于春天的诗",
"chosen": "春风拂面绿柳枝...",
"rejected": "春天来了,花开了..."
}
]
优点:
- 简单直接:不需要奖励模型
- 训练稳定:避免 RL 的不稳定性
- 效果好:在偏好对齐上表现优秀
缺点:
- 需要偏好数据:需要人类标注偏好
- 可能过拟合:过度依赖偏好数据
PPO(Proximal Policy Optimization,强化学习算法)
PPO:一种强化学习算法,用于基于奖励信号优化策略。
# RLHF 流程
1. 策略模型生成多个输出
2. 奖励模型评估输出质量
3. PPO算法优化策略模型
4. 重复上述过程
# PPO 特点
- 策略梯度裁剪:避免更新过大
- 重要性采样:提高样本效率
# PPO 应用场景
1、RLHF:基于人类反馈强化学习
2、游戏AI:基于游戏奖励优化
3、机器人控制:基于环境反馈优化
优点:
- 理论基础强:有坚实的数学基础
- 训练稳定:策略梯度裁剪
- 样本效率高:重要性采样
缺点:
- 实现复杂:需要奖励模型
- 训练不稳定:RL 固有的不稳定性
- 超参数敏感:需要仔细调参
实际场景微调方案选择
问答系统
推荐:监督微调 + LoRA
原因:
-
有标准答案 → 监督微调
-
资源有限 → LoRA
-
需要快速部署 → PEFT
实现:
-
准备问答对数据
-
使用LoRA配置
-
监督微调训练
对话助手
推荐:偏好优化 + DPO + LoRA
原因:
-
需要符合人类偏好 → 偏好优化
-
避免RL复杂性 → DPO
-
资源有限 → LoRA
实现:
-
收集偏好数据
-
使用DPO算法
-
应用LoRA配置
创意写作
推荐:偏好优化 + PPO + 全量微调
原因:
-
需要高表达力 → 全量微调
-
需要人类反馈 → 偏好优化
-
有充足资源 → 不需要PEFT
实现:
-
收集人类反馈
-
训练奖励模型
-
使用PPO优化
常见组合
- 监督微调 + LoRA(最常见)
- 偏好优化 + DPO(最新趋势)
- 偏好优化 + PPO(RLHF)
- 全量微调(资源充足时)
- PEFT(资源有限时)
学习资料: