DeNA LLM研究Part 3: 模型训练方法论 - 从预训练到RLHF/DPO

DeNA LLM研究Part 3: 模型训练方法论 - 从预训练到RLHF/DPO

基于DeNA LLM研究资料Part 3,深入分析预训练、微调和强化学习的差异,以及LoRA、QLoRA、DPO等最新高效学习技术。

系列: DeNA LLM 研究 (3/5)

  1. Part 1: LLM基础与2025年AI现状
  2. Part 2: 结构化输出与多LLM管道
  3. Part 3: 模型训练方法论 ← 当前文章
  4. Part 4: RAG架构与最新趋势
  5. 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/>成本: 低]

决策检查清单:

  1. 能用提示解决吗? → 首先尝试提示优化
  2. 现有模型理解任务吗? → 是: 强化学习,否: 微调
  3. 是全新领域吗? → 考虑预训练 (但注意成本)

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主要方法:

  1. Adapter: 在层之间插入小型网络
  2. Prefix Tuning: 向输入添加可训练的前缀
  3. LoRA: 通过低秩分解更新权重 (最受欢迎)
  4. 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_alphar〜2r类似学习率的作用。通常为r的1〜2倍
lora_dropout0.05〜0.1防止过拟合。小数据集设置高一些
target_modulesq_proj, v_projAttention的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核心技术:

  1. 4bit NormalFloat (NF4): 针对正态分布优化的量化
  2. Double Quantization: 量化常数也量化
  3. 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的问题:

  1. 3阶段流程: SFT → Reward Model → RL优化
  2. 不稳定性: PPO对超参数敏感
  3. 高成本: 奖励模型训练 + RL采样
  4. 调试困难: 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-tuning80GB160GB800GB+
LoRA40GB80GB400GB
QLoRA24GB40GB200GB

消费级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相当性能

这不仅是优化,更是新数学洞察的结果。低秩假设、量化理论、隐式奖励模型等学术研究正在快速转化为实践。

对实践者的启示

  1. 从提示开始: 80%可以用提示解决
  2. LoRA为基础: 需要微调时首先尝试LoRA
  3. 用QLoRA节省资源: 性能差异微小,内存节省4倍
  4. 用DPO对齐: RLHF是遗留技术,DPO是新标准
  5. 测量并改进: 关注实际任务性能而非基准分数

2025年展望

预期趋势:

  • 更小但强大的模型: Phi-3、Gemma 2等小型模型的崛起
  • 设备端微调: 智能手机上也能微调的时代
  • 自动化超参数调优: AutoML for LLM Fine-tuning
  • 多模态PEFT: 图像+文本同时微调

参考资料

论文

教程


下期预告: “DeNA LLM研究Part 4: 生产部署与监控”将介绍将微调模型部署到实际服务的策略、监控方法和成本优化技术。

阅读其他语言版本

这篇文章有帮助吗?

您的支持能帮助我创作更好的内容。请我喝杯咖啡吧!☕

关于作者

JK

Kim Jangwook

AI/LLM专业全栈开发者

凭借10年以上的Web开发经验,构建AI代理系统、LLM应用程序和自动化解决方案。分享Claude Code、MCP和RAG系统的实践经验。