DeNA LLM研究Part 3: 模型训练方法论 - 从预训练到RLHF/DPO
基于DeNA LLM研究资料Part 3,深入分析预训练、微调和强化学习的差异,以及LoRA、QLoRA、DPO等最新高效学习技术。
系列: DeNA LLM 研究 (3/5)
- Part 1: LLM基础与2025年AI现状
- Part 2: 结构化输出与多LLM管道
- Part 3: 模型训练方法论 ← 当前文章
- Part 4: RAG架构与最新趋势
- Part 5: 智能体设计与多智能体编排
引言
DeNA的LLM研究资料Part 3涵盖了LLM的多种学习方法论。我们将探索预训练(Pre-training)、微调(Fine-tuning)和强化学习(Reinforcement Learning)之间的区别,以及LoRA、QLoRA、DPO等最新高效学习技术的原理和实际应用方法。
本文基于DeNA研究资料,并补充了2025年的最新趋势和实践经验。
预训练 vs 微调 vs 强化学习
通过餐厅比喻理解
DeNA资料通过餐厅运营比喻来解释三种学习方式:
graph TD
A[预训练<br/>Pre-training] --> B[微调<br/>Fine-tuning]
B --> C[强化学习<br/>RLHF/DPO]
A1[厨师基础训练<br/>学习所有菜系] --> A
B1[特定餐厅<br/>菜单专精] --> B
C1[客户反馈<br/>改进口味] --> C
预训练 (Pre-training)
- 目的: 获得通用语言理解能力
- 数据: 数十至数百TB的网络数据
- 成本: 数亿至数千亿元 (GPT-4估计超1000亿元)
- 比喻: 在烹饪学校学习所有烹饪技法的过程
微调 (Fine-tuning)
- 目的: 专门化特定任务/领域
- 数据: 数千至数万个任务特定数据
- 成本: 数十万至数百万元
- 比喻: 成为意大利餐厅意大利面专家的过程
强化学习 (Reinforcement Learning)
- 目的: 生成符合人类偏好的响应
- 数据: 数千至数万个偏好数据
- 成本: 数百万至数千万元
- 比喻: 根据客户反馈调整菜品口味的过程
实务决策指南
graph TD
Start[需要LLM训练?] --> Q1{需要新知识?}
Q1 -->|是| PreTrain[预训练<br/>成本: 非常高]
Q1 -->|否| Q2{需要任务专精?}
Q2 -->|是| FineTune[微调<br/>成本: 中等]
Q2 -->|否| Q3{需要偏好调整?}
Q3 -->|是| RL[强化学习<br/>成本: 中等]
Q3 -->|否| Prompt[提示工程<br/>成本: 低]
决策检查清单:
- 能用提示解决吗? → 首先尝试提示优化
- 现有模型理解任务吗? → 是: 强化学习,否: 微调
- 是全新领域吗? → 考虑预训练 (但注意成本)
PEFT: 高效微调的兴起
传统微调的问题
更新所有参数的Full Fine-tuning的局限性:
- 内存使用: 微调7B模型需要80GB+ VRAM
- 时间成本: 需要数小时至数天
- 部署困难: 每个任务需要存储整个模型 (数十GB)
PEFT的核心理念
参数高效微调(PEFT)通过仅训练部分参数来最大化效率:
graph TD
subgraph 传统微调
A[原始模型<br/>7B参数] --> B[全量更新<br/>7B参数]
B --> C[新模型<br/>28GB存储]
end
subgraph PEFT
D[原始模型<br/>7B参数] --> E[添加少量参数<br/>数百万个]
E --> F[仅存储适配器<br/>10MB以下]
end
PEFT主要方法:
- Adapter: 在层之间插入小型网络
- Prefix Tuning: 向输入添加可训练的前缀
- LoRA: 通过低秩分解更新权重 (最受欢迎)
- Prompt Tuning: 仅训练软提示
LoRA: 低秩适应原理
数学背景
LoRA(Low-Rank Adaptation)基于以下数学洞察:
# 原始权重更新 (Full Fine-tuning)
W_new = W_original + ΔW # ΔW为 d×d 大小
# LoRA的低秩分解
ΔW = B @ A # B为 d×r,A为 r×d (r << d)
# 实际应用
output = (W_original + B @ A) @ input
核心理念:
- 预训练权重已包含丰富信息
- 微调所需的变化量(ΔW)具有低内在维度(intrinsic dimension)
- 因此ΔW可以表示为两个小矩阵(B, A)的乘积
LoRA超参数配置指南
# LoRA配置示例 (HuggingFace PEFT)
lora_config:
r: 8 # 秩 (内在维度)
lora_alpha: 16 # 缩放参数
lora_dropout: 0.1 # Dropout比率
target_modules: # 应用层
- q_proj # Query投影
- v_proj # Value投影
bias: "none" # 是否训练偏置
超参数选择指南:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| r (Rank) | 4〜16 | 越小越节省内存,越大表达能力越强。大多数情况8合适 |
| lora_alpha | r〜2r | 类似学习率的作用。通常为r的1〜2倍 |
| lora_dropout | 0.05〜0.1 | 防止过拟合。小数据集设置高一些 |
| target_modules | q_proj, v_proj | Attention的Query/Value最有效 |
LoRA变体
DoRA (Weight-Decomposed Low-Rank Adaptation, 2024)
# DoRA: 将权重分解为幅度(magnitude)和方向(direction)
W = m * (V + B @ A)
# m: 可训练幅度,V: 归一化权重,B@A: LoRA
- 优点: 性能更接近Full Fine-tuning
- 缺点: 比LoRA稍慢
GaLore (Gradient Low-Rank Projection, 2024)
# 将梯度投影到低秩空间以节省内存
gradient_lowrank = project_to_lowrank(gradient)
optimizer.step(gradient_lowrank)
- 优点: 优化器状态也低秩压缩 → 额外节省50%内存
- 缺点: 实现复杂度高
LoRA+ (2024)
# 对矩阵A、B应用不同学习率
lr_A = lr * eta # A使用较高学习率
lr_B = lr # B使用基本学习率
- 优点: 收敛速度提升1.5〜2倍
- 缺点: 需要超参数调优
QLoRA: 量化与PEFT结合
4bit量化的革新
QLoRA结合4bit量化和LoRA,大幅减少内存使用:
graph TD
subgraph 内存_对比
A[原始16bit<br/>14GB] --> B[8bit量化<br/>7GB]
B --> C[4bit QLoRA<br/>3.5GB]
end
subgraph 性能_保持
D[Full Fine-tuning<br/>100%] --> E[LoRA<br/>98%]
E --> F[QLoRA<br/>97%]
end
QLoRA核心技术:
- 4bit NormalFloat (NF4): 针对正态分布优化的量化
- Double Quantization: 量化常数也量化
- Paged Optimizers: CPU-GPU内存自动管理
QLoRA实务工作流
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model
# 1. 4bit量化配置
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4", # NormalFloat 4bit
bnb_4bit_compute_dtype="float16", # 计算使用float16
bnb_4bit_use_double_quant=True, # Double quantization
)
# 2. 加载模型
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-7b-hf",
quantization_config=bnb_config,
device_map="auto" # 自动设备分配
)
# 3. LoRA配置
lora_config = LoraConfig(
r=8,
lora_alpha=16,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.1,
bias="none",
task_type="CAUSAL_LM"
)
# 4. 创建PEFT模型
model = get_peft_model(model, lora_config)
# 5. 检查可训练参数
trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad)
print(f"可训练参数: {trainable_params:,} ({trainable_params/7e9*100:.2f}%)")
# 输出: 可训练参数: 4,194,304 (0.06%)
QLoRA实务技巧:
- GPU内存: 单张RTX 3090 (24GB)可训练7B模型
- 批量大小: 使用梯度累积 (如: batch_size=1, gradient_accumulation_steps=16)
- 训练时间: 比Full Fine-tuning慢1.5〜2倍 (量化开销)
RLHF与DPO: 学习人类偏好
RLHF的复杂性
人类反馈强化学习(RLHF)强大但复杂:
graph TD
A[1. 训练SFT模型<br/>Supervised Fine-tuning] --> B[2. 训练奖励模型<br/>Reward Model]
B --> C[3. 用PPO优化策略<br/>Proximal Policy Optimization]
D[人类偏好数据<br/>A vs B比较] --> B
B --> E[奖励分数预测]
E --> C
C --> F[最终对齐模型<br/>Aligned Model]
RLHF的问题:
- 3阶段流程: SFT → Reward Model → RL优化
- 不稳定性: PPO对超参数敏感
- 高成本: 奖励模型训练 + RL采样
- 调试困难: RL收敛失败时难以诊断原因
DPO: 直接偏好优化
直接偏好优化(DPO)无需奖励模型直接学习人类偏好:
graph TD
A[人类偏好数据<br/>偏好响应 vs 非偏好响应] --> B[DPO损失函数<br/>Classification Loss]
B --> C[对齐模型<br/>单阶段训练]
D[RLHF: 3阶段] -.-> E[SFT → Reward → PPO]
F[DPO: 1阶段] -.-> C
DPO损失函数:
# DPO Loss (公式简化)
loss = -log(σ(β * (log π(y_w|x) - log π(y_l|x))))
# y_w: 偏好响应 (chosen)
# y_l: 非偏好响应 (rejected)
# β: 超参数 (通常为0.1)
# σ: Sigmoid函数
DPO的优势:
- 简单性: 无需奖励模型,一次训练完成
- 稳定性: Classification loss比PPO更稳定
- 效率: 内存和时间减少50%
- 性能: 与RLHF相当或更好
DPO实务实现
from trl import DPOTrainer
# DPO训练配置
training_args = TrainingArguments(
output_dir="./dpo_model",
per_device_train_batch_size=4,
learning_rate=5e-5,
num_train_epochs=3,
gradient_accumulation_steps=4,
)
# 初始化DPO Trainer
dpo_trainer = DPOTrainer(
model=model,
args=training_args,
train_dataset=preference_dataset, # (prompt, chosen, rejected)格式
tokenizer=tokenizer,
beta=0.1, # DPO超参数
)
# 执行训练
dpo_trainer.train()
偏好数据格式:
preference_dataset = [
{
"prompt": "如何在Python中排序列表?",
"chosen": "使用sorted()函数即可: sorted([3,1,2])",
"rejected": "直接用sort()就行"
},
# ...
]
DPO变体
ORPO (Odds Ratio Preference Optimization, 2024)
- 同时执行SFT和偏好学习
- 无需单独的SFT阶段
- 进一步缩短训练时间
IPO (Identity Preference Optimization, 2024)
- 可以无参考模型训练
- 进一步减少内存使用
KTO (Kahneman-Tversky Optimization, 2024)
- 使用单独反馈(好/坏)代替成对比较
- 大幅降低数据收集成本
任务别训练方法选择指南
成本-性能权衡
graph TD
A[分析任务类型] --> B{通用知识<br/>足够?}
B -->|是| C[提示工程<br/>成本: $0]
B -->|否| D{需要领域<br/>专精?}
D -->|是| E{数据规模}
E -->|小| F[Few-shot ICL<br/>成本: $0]
E -->|中| G[LoRA/QLoRA<br/>成本: $10~100]
E -->|大| H[Full Fine-tuning<br/>成本: $1,000~10,000]
D -->|否| I{提升响应<br/>质量?}
I -->|是| J[DPO/ORPO<br/>成本: $100~1,000]
实务建议
1. 聊天机器人/对话系统
提示 → SFT (LoRA) → DPO
- 领域知识注入: 用LoRA高效微调
- 对话质量改善: 用DPO偏好对齐
2. 文档分类/标注
提示 → LoRA (可选)
- 大多数情况提示足够
- 极限性能需求时添加LoRA
3. 代码生成
提示 → SFT (QLoRA) → RLHF/DPO
- 代码风格学习: 用QLoRA训练大量代码
- 可执行性改善: 用RLHF惩罚编译错误
4. 摘要/翻译
提示 → DPO
- 基础模型往往足够
- 风格调整: 用DPO学习期望的语气/长度
内存需求对比
| 方法 | 7B模型 | 13B模型 | 70B模型 |
|---|---|---|---|
| Full Fine-tuning | 80GB | 160GB | 800GB+ |
| LoRA | 40GB | 80GB | 400GB |
| QLoRA | 24GB | 40GB | 200GB |
消费级GPU可行性:
- RTX 4090 (24GB): 用QLoRA训练7B,用LoRA训练3B
- RTX 3090 (24GB): 用QLoRA训练7B
- RTX 4060 Ti (16GB): 用QLoRA训练3B
启示与感想
LLM微调的民主化
DeNA资料最令人印象深刻的是LLM微调不再是大公司专属。随着QLoRA和DPO的出现:
- 24GB VRAM可以微调7B模型
- 数百美元预算可以构建领域专用模型
- 可以使用简单的DPO代替复杂的RLHF
效率的范式转变
最近,效率(Efficiency)成为热门话题:
- LoRA: 用0.1%参数达到Full Fine-tuning 98%性能
- QLoRA: 用1/4内存达到相同性能
- DPO: 用1/3复杂度达到RLHF相当性能
这不仅是优化,更是新数学洞察的结果。低秩假设、量化理论、隐式奖励模型等学术研究正在快速转化为实践。
对实践者的启示
- 从提示开始: 80%可以用提示解决
- LoRA为基础: 需要微调时首先尝试LoRA
- 用QLoRA节省资源: 性能差异微小,内存节省4倍
- 用DPO对齐: RLHF是遗留技术,DPO是新标准
- 测量并改进: 关注实际任务性能而非基准分数
2025年展望
预期趋势:
- 更小但强大的模型: Phi-3、Gemma 2等小型模型的崛起
- 设备端微调: 智能手机上也能微调的时代
- 自动化超参数调优: AutoML for LLM Fine-tuning
- 多模态PEFT: 图像+文本同时微调
参考资料
论文
- LoRA: Low-Rank Adaptation of Large Language Models (Microsoft, 2021)
- QLoRA: Efficient Finetuning of Quantized LLMs (University of Washington, 2023)
- Direct Preference Optimization (Stanford, 2023)
- DoRA: Weight-Decomposed Low-Rank Adaptation (NVIDIA, 2024)
- GaLore: Memory-Efficient LLM Training (CMU, 2024)
库
- HuggingFace PEFT - LoRA、QLoRA实现
- HuggingFace TRL - RLHF、DPO实现
- Unsloth - 2倍快的LoRA训练
教程
下期预告: “DeNA LLM研究Part 4: 生产部署与监控”将介绍将微调模型部署到实际服务的策略、监控方法和成本优化技术。
阅读其他语言版本
- 🇰🇷 한국어
- 🇯🇵 日本語
- 🇺🇸 English
- 🇨🇳 中文(当前页面)
这篇文章有帮助吗?
您的支持能帮助我创作更好的内容。请我喝杯咖啡吧!☕