Skip to content

Repository files navigation

RLHF 强化学习算法实现

本项目实现了三种主流的强化学习/对齐算法:PPODPOGRPO。每种算法都包含详细的代码注释和 Jupyter Notebook 演示。

📁 项目结构

RLHF/
├── PPO/                      # Proximal Policy Optimization
│   ├── ppo.py               # PPO核心实现
│   └── ppo_demo.ipynb       # PPO演示和验证
├── DPO/                      # Direct Preference Optimization
│   ├── dpo.py               # DPO核心实现
│   └── dpo_demo.ipynb       # DPO演示和验证
├── GRPO/                     # Generative Reward-guided Policy Optimization
│   ├── grpo.py              # GRPO核心实现
│   └── grpo_demo.ipynb      # GRPO演示和验证
├── common/
│   └── utils.py             # 通用工具和基础模块
├── test_all_algorithms.py   # 综合测试脚本
└── README.md               # 本文件

🎯 算法介绍

1. PPO (Proximal Policy Optimization)

特点:

  • 使用剪裁替代目标限制策略更新步长
  • 多个 epoch 的小批量梯度更新
  • 使用价值函数作为基线减少方差
  • 加入熵正则化鼓励探索

核心公式:

L^CLIP = E_t[min(r_t * A_t, clip(r_t, 1-ε, 1+ε) * A_t)]
其中 r_t = π_θ(a_t|s_t) / π_θ_old(a_t|s_t)

适用场景:

  • 通用的策略梯度优化
  • 需要稳定训练的场景
  • 离散和连续控制任务

2. DPO (Direct Preference Optimization)

特点:

  • 直接从人类偏好数据学习,无需显式奖励函数
  • 使用 Bradley-Terry 模型建模偏好关系
  • 简化了 RLHF 流程
  • 计算高效

核心公式:

L_DPO = -log σ(β * (log π(y_w|x) - log π(y_l|x) 
        - log π_ref(y_w|x) + log π_ref(y_l|x)))

适用场景:

  • 语言模型对齐
  • 从成对偏好数据学习
  • 避免显式奖励函数的场景

3. GRPO (Generative Reward-guided Policy Optimization)

特点:

  • 显式学习奖励函数指导策略优化
  • 同时训练策略、奖励模型和价值函数
  • KL 散度约束防止过度优化
  • 多目标平衡

核心公式:

L = L_policy + β*KL(π||π_ref) - α*H(π)
L_policy = -E[log π(a|s) * (A_t + λ*r_pred(s,a))]

适用场景:

  • 需要可解释的奖励函数
  • 长期奖励不好定义的场景
  • 多目标优化问题

🚀 快速开始

环境要求

pip install numpy torch gym matplotlib

运行单个算法

运行 PPO Notebook

jupyter notebook PPO/ppo_demo.ipynb

运行 PPO 脚本

cd PPO
python ppo.py

运行 DPO

cd DPO
python dpo.py

运行 GRPO

cd GRPO
python grpo.py

运行综合测试

python test_all_algorithms.py

此命令会依次测试 PPO、DPO 和 GRPO,验证所有算法是否正常工作。

📊 关键模块说明

common/utils.py

包含所有算法共用的工具:

类/函数 说明
SimplePolicy 离散动作空间的策略网络
SimpleValueNetwork 状态价值函数网络
SimpleRewardModel 奖励模型网络
SimpleEnv 简单的测试环境
compute_gae() 计算广义优势估计 (GAE)
TrajectorySampler 轨迹采样器
convert_to_tensor() 数据类型转换

PPO/ppo.py

说明
PPOAgent PPO 智能体实现
PPOAgent.compute_policy_loss() 计算剪裁替代目标损失
PPOAgent.update() 单步更新
PPOAgent.train() 完整训练流程

DPO/dpo.py

类/函数 说明
DPOTrainer DPO 训练器
DPOTrainer.compute_dpo_loss() 计算 DPO 损失
generate_preference_data() 生成偏好数据

GRPO/grpo.py

说明
GRPOAgent GRPO 智能体实现
GRPOAgent.compute_policy_loss() 计算策略损失
GRPOAgent.compute_reward_loss() 计算奖励模型损失
GRPOAgent.update() 多目标更新

🔍 验证结果

运行 Jupyter Notebook 后,每个算法都会生成训练图表:

PPO 训练图表

  • 平均奖励
  • 策略损失
  • 价值损失
  • 策略熵

DPO 训练图表

  • DPO 损失
  • 偏好预测准确率

GRPO 训练图表

  • 平均奖励
  • 策略损失
  • 奖励模型损失
  • 价值损失
  • 策略熵
  • KL 散度

💡 核心概念

GAE (Generalized Advantage Estimation)

advantage = δ + γλ * δ_next + (γλ* δ_next2 + ...
其中 δ = r + γV(s') - V(s)

KL 散度约束

防止新策略与旧策略差异过大,确保训练的稳定性:

KL(π_new || π_old) < δ

策略梯度方法

∇L = E[∇log π(a|s) * A(s,a)]

📝 代码注释说明

所有代码文件都包含详细的中文注释:

  • 函数注释:说明参数、返回值和算法逻辑
  • 类注释:解释核心思想和算法特性
  • 行内注释:澄清复杂计算步骤

🧪 测试和调试

查看训练统计

所有训练过程都会输出:

迭代 10/50 | 平均奖励: 0.2500
迭代 20/50 | 平均奖励: 0.4200
迭代 30/50 | 平均奖励: 0.5100
...

常见问题排查

  1. 导入错误:确保所有依赖库已安装
  2. 形状错误:检查输入张量的维度
  3. 梯度为零:检查是否冻结了不该冻结的参数
  4. 损失不下降:调整学习率和批量大小

📚 参考资源

PPO

  • 论文:Proximal Policy Optimization Algorithms (Schulman et al., 2017)
  • 关键特性:剪裁替代目标、多 epoch 更新

DPO

  • 论文:Direct Preference Optimization (Rafailov et al., 2023)
  • 关键特性:无奖励函数、偏好学习

GRPO

  • 特点:奖励模型 + 策略梯度 + KL 约束
  • 应用:多目标平衡优化

🎓 学习路径

  1. 从 PPO 开始:理解基本的策略梯度方法
  2. 学习 DPO:了解如何从偏好数据学习
  3. 深入 GRPO:掌握多目标优化技术

🔧 扩展方向

  • 添加连续动作空间支持
  • 实现更复杂的环境
  • 并行数据收集
  • 分布式训练
  • 其他 RLHF 算法(如 IPO、KTO)

📄 许可证

MIT License

👨‍💻 作者

Implementation of RLHF Algorithms (PPO, DPO, GRPO)


最后更新:2025年12月6日

如有问题或改进建议,欢迎提出!

About

强化学习入门

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages