强化学习算法与实践
引言
强化学习(Reinforcement Learning, RL)是机器学习的一个重要分支,智能体通过与环境交互、根据奖励信号调整策略来学习最优行为。本文系统介绍主流强化学习算法,并通过 Stable-Baselines3 代码示例展示实践方法。
强化学习基础框架
强化学习的核心要素包括:
- 状态 :环境的描述
- 动作 :智能体的决策
- 奖励 :环境对动作的反馈
- 策略 :状态到动作的映射
- 价值函数 :从状态 出发按策略 行动的期望累积奖励
目标是找到最优策略 使得累积折扣奖励最大化:
其中 为折扣因子。
DQN 系列
深度 Q 网络(DQN)
DQN(Deep Q-Network)使用深度神经网络近似 Q 函数 ,核心创新包括:
- 经验回放(Experience Replay):将转移 存入缓冲区,随机采样训练
- 目标网络(Target Network):使用延迟更新的网络计算目标值,提高稳定性
损失函数:
DQN 改进变体
| 变体 | 改进点 |
|---|---|
| Double DQN | 分离动作选择和值估计,缓解过估计 |
| Dueling DQN | 分离状态价值 和优势函数 |
| Prioritized Replay | 按 TD 误差优先采样重要经验 |
| Rainbow | 整合六种改进技术 |
DQN 系列适用于离散动作空间,在连续动作空间中需要离散化处理。
策略梯度方法
REINFORCE 算法
策略梯度直接优化参数化策略 ,梯度公式为:
其中 为回报。REINFORCE 方差较大,通常引入基线函数 来降低方差。
Actor-Critic 框架
Actor-Critic 方法同时学习策略(Actor)和价值函数(Critic):
- Actor:策略网络,输出动作或动作分布
- Critic:价值网络,评估当前状态的价值
优势函数 用于指导策略更新。
主流连续控制算法
PPO(近端策略优化)
PPO(Proximal Policy Optimization)是目前最常用的策略梯度算法,通过裁剪目标函数限制策略更新幅度:
其中 为概率比。
PPO 的优点:实现简单、稳定性好、适用范围广。
SAC(软演员-评论家)
SAC(Soft Actor-Critic)在最大化奖励的同时最大化策略熵,鼓励探索:
其中 为温度参数, 为策略熵。SAC 采样效率高于 PPO,适合机器人连续控制任务。
TD3(双延迟深度确定性策略梯度)
TD3(Twin Delayed DDPG)是 DDPG 的改进版,三个关键技巧:
- 双 Q 网络:取两个 Critic 中较小的值,避免过估计
- 延迟策略更新:Critic 更新多次后才更新 Actor
- 目标策略平滑:在目标动作中添加噪声
Stable-Baselines3 实践
安装与基本使用
pip install stable-baselines3[extra]
PPO 训练示例
import gymnasium as gym
from stable_baselines3 import PPO
from stable_baselines3.common.vec_env import SubprocVecEnv
from stable_baselines3.common.callbacks import EvalCallback
# 创建并行环境
def make_env(env_id, seed):
def _init():
env = gym.make(env_id)
env.reset(seed=seed)
return env
return _init
if __name__ == "__main__":
n_envs = 8
env = SubprocVecEnv([make_env("Ant-v4", i) for i in range(n_envs)])
eval_env = gym.make("Ant-v4")
# 评估回调
eval_callback = EvalCallback(
eval_env, eval_freq=10000,
best_model_save_path="./best_model/",
deterministic=True
)
# 训练 PPO
model = PPO(
"MlpPolicy", env,
learning_rate=3e-4,
n_steps=2048,
batch_size=64,
n_epochs=10,
gamma=0.99,
gae_lambda=0.95,
clip_range=0.2,
verbose=1,
tensorboard_log="./tb_logs/"
)
model.learn(total_timesteps=1_000_000, callback=eval_callback)
model.save("ppo_ant")
SAC 训练示例
from stable_baselines3 import SAC
model = SAC(
"MlpPolicy", "Humanoid-v4",
learning_rate=3e-4,
buffer_size=1_000_000,
batch_size=256,
tau=0.005,
gamma=0.99,
train_freq=1,
gradient_steps=1,
learning_starts=10000,
verbose=1
)
model.learn(total_timesteps=3_000_000)
超参数调优
关键超参数
| 参数 | 算法 | 典型范围 | 影响 |
|---|---|---|---|
| 学习率 | 全部 | 1e-4 ~ 3e-4 | 过大不稳定,过小收敛慢 |
| 折扣因子 | 全部 | 0.95 ~ 0.999 | 影响长期回报的权重 |
| batch_size | 全部 | 64 ~ 512 | 影响梯度估计的方差 |
| n_steps | PPO | 1024 ~ 4096 | 每次更新使用的步数 |
| buffer_size | SAC/TD3 | 1e5 ~ 1e6 | 经验回放缓冲区大小 |
| tau | SAC/TD3 | 0.005 ~ 0.02 | 目标网络软更新系数 |
调优工具
推荐使用 Optuna 进行自动超参数搜索。定义目标函数,在其中使用 trial.suggest_float / trial.suggest_categorical 采样超参数,训练后返回评估奖励。Optuna 会自动搜索最优组合。SB3 的 rl-zoo3 项目也提供了预配置的超参数搜索脚本。
奖励塑形
奖励塑形(Reward Shaping)通过设计辅助奖励信号加速学习:
常用技巧
- 稠密奖励:提供持续反馈而非仅在目标达成时给奖励(如距离目标的负距离)
- 势能函数:,保证最优策略不变
- 奖励缩放:将奖励归一化到合适范围,避免梯度消失或爆炸
- 多目标分解:将复杂任务分解为多个子奖励的加权和
课程学习
课程学习(Curriculum Learning)从简单任务开始,逐步增加难度:
- 阶段式课程:预定义难度等级,按指标切换
- 自适应课程:根据智能体当前能力自动调整难度
- 自我博弈:智能体与自身的历史版本对抗训练
在机器人任务中,常见的课程设计包括:从短距离导航到长距离、从无障碍到复杂障碍、从低速到高速运动。
算法选择指南
| 场景 | 推荐算法 | 原因 |
|---|---|---|
| 离散动作空间 | DQN / Rainbow | Q 学习天然适合离散动作 |
| 连续控制(通用) | PPO | 稳定、调参容易 |
| 连续控制(高效采样) | SAC | 离策略算法,采样效率高 |
| 确定性策略需求 | TD3 | 输出确定性动作 |
| 仿真环境丰富 | PPO + 并行环境 | 在策略算法受益于大量并行采样 |
| 真实机器人 | SAC | 样本效率高,适合有限交互 |
参考资料
- Sutton R S, Barto A G. Reinforcement Learning: An Introduction. MIT Press, 2018.
- Schulman J, et al. Proximal Policy Optimization Algorithms. arXiv:1707.06347, 2017.
- Haarnoja T, et al. Soft Actor-Critic: Off-Policy Maximum Entropy Deep Reinforcement Learning. ICML, 2018.
- Fujimoto S, et al. Addressing Function Approximation Error in Actor-Critic Methods. ICML, 2018.
- Stable-Baselines3 文档:https://stable-baselines3.readthedocs.io/