Post

RL训练知识点补齐

RL训练知识点补齐

Gym 强化学习训练

在我们学习强化学习(Reinforcement Learning,简称 RL)时,如何让智能体和环境高效且可重复地交互一直是一个核心问题。OpenAI 提供的 Gym 库就是为了解决这个问题而生。它以简洁明了的 API 和丰富多样的测试场景,为我们搭建了一个标准化的平台。很多技术博客和相关资料都指出,Gym 的统一接口极大地方便了我们在切换环境、测试算法时,不必反复编写底层逻辑。

认识 Gym 环境接口

在 Gym 中,一切交互都从环境对象的创建开始。我们通常会先导入 gym,然后通过 gym.make(env_name) 来构造一个环境,接着在每个回合中依次调用 reset()step(action) 进行交互。无论我们是在玩 Atari 游戏还是操纵机械臂,Gym 都会返回类似的四元组 (next_state, reward, done, info)

  • next_state:下一时刻的环境观测

  • reward:即时奖励

  • done:回合是否结束

  • info:调试或额外信息

每次回合结束后,我们需要调用 env.reset() 重新初始化环境。

很多小伙伴在刚接触时会疑惑“为什么要频繁调用 reset()?”或“info 里到底有什么?”其实,这些接口设计就是为了让实验具有标准化和可重复性,而 info 字段则给予了我们很大灵活度,可以在其中放置各种需要的调试或分析信息。

神经网络

  • 特征就是状态, 表示网络输入的类型有哪些

  • action就是Y标, 表示网络的最终输出有哪些ß

马尔可夫决策过程(MDP)

虽然 Gym 的接口简洁,但它背后的核心思想是马尔可夫决策过程(Markov Decision Process, MDP)。MDP 将智能体-环境的交互抽象为状态、动作、转移概率和奖励函数,并通过折扣因子(一般记作γ)来平衡短期与长期收益。

具体而言,每个状态 s 代表环境特征的观测值,智能体基于当前策略在状态 s 中选出一个动作 a,环境则会返回下一状态 s′ 和即时奖励 r。在 Gym 实现中,我们只需调用 step() 并查看输出即可。

如果我们翻看 David Silver 的强化学习课程资料或 OpenAI Spinning Up 等博客文章,就会发现 MDP 是所有 RL 算法分析的理论基石。基于对状态转移和奖励累积的研究,我们就能更系统地讨论如何改进策略、如何迭代价值函数,以及如何在智能体与环境的交互中找到合适的平衡。

从策略到价值

由于 Gym 封装了具体的交互逻辑,我们可以将更多精力放在算法本身。市面上常见的 RL 算法大致分为直接学习策略函数和间接学习价值函数这两大思路,也就是我们常听到的策略方法(Policy-based)和值方法(Value-based)。

  • 策略方法(Policy-based)

    代表算法有 REINFORCE、PPO 等,它们直接对策略函数 πθ(a∣s)进行梯度上升或通过信任域进行优化。其优势在于能自然处理连续动作空间,适用于机器人的关节角度或力矩等场景。但它们往往依赖大量采样来估计梯度,需要大量训练数据才能稳定收敛。

  • 值方法(Value-based)

    最常见的是 DQN 系列(比如 Double DQN、Dueling DQN 等),通过估计 Q(s,a)Q(s,a) 来帮助智能体在离散动作空间中决策。DQN 在 Atari 游戏上的成功让它一炮而红,但也暴露了在庞大且连续的动作空间里,单纯依赖值函数估计会有一些局限,需要更多改进。

  • Actor-Critic 方法

    结合了策略和价值的优点,如 A2C、DDPG、SAC 等。它们同时设置“Actor(策略)”和“Critic(价值)”两个网络:Actor 输出动作(连续或离散),Critic 负责评估动作的价值,以在稳定性和泛化能力上取得较好平衡。

强化学习方法

传统PPO算法与新兴GRPO算法有什么区别? 这是最近deepseek新出论文后, 很多人经常会问的问题.

方面PPOGRPO
底层原理基于 actor-critic 架构,利用剪切目标函数限制策略更新幅度省略独立 critic,通过组内相对评分估计基线,从而计算优势
实现方法同时训练策略网络和价值网络;利用 critic 得到状态价值并计算优势仅训练策略网络;通过对一组样本进行比较直接获取相对优势,简化训练流程
基线/优势估计依赖单独训练的 critic 网络提供基线,进而计算优势利用组内样本得分作为基线,直接通过相对比较获得优势
模型复杂度与资源消耗模型结构较复杂,需额外训练和维护 critic 网络,计算与内存开销较大结构更简单,无需 critic,资源消耗更低
稳定性与泛化性稳定性较好,剪切目标函数在多种任务中验证过,但 critic 训练不足时可能影响效果在特定任务(如数学推理)中表现优异,但对分组策略和样本分布较为敏感,泛化性待验证
优势优势估计较为准确、训练稳定、经过广泛验证模型简化、资源节省、降低 critic 带来的误差,在特定领域性能显著提升
不足额外的 critic 网络增加了计算和内存负担,critic 训练不充分可能影响整体效果对分组方式和样本分布敏感,理论泛化性和鲁棒性在不同任务上仍需更多验证

如何防止智能体“一条路走到黑”

在很多 RL 的实践中,“探索-利用困境”(Exploration vs. Exploitation)是一个经常被提及的话题。智能体可能过分“利用”现有知识,导致它一直重复某些安全但未必最优的动作;也可能过度“探索”,一直瞎尝试迟迟无法收敛。

一些常见的解决方案已经在各种开源代码或教程中出现:

  • 离散动作场景ϵ-greedy 策略很典型,会用 ϵ 的概率随机执行动作,剩余情况下选择当前最优动作,并随训练进度逐步降低 ϵ

  • 连续动作场景:我们一般会在 Actor 输出的动作上加噪声(如 OU 噪声或高斯噪声),以保证初期足够“好奇”,后期再收敛到更稳定的行动模式。

如果我们在训练曲线或可视化回合视频中发现智能体总是重复一些无意义的动作,或行为十分混乱很难收敛,大概率就与探索-利用策略设置不当有关。

梯度更新与稳定性

在 RL 中,数据不是独立同分布的,而且价值估计依赖后续状态的反馈,一不留神就可能出现梯度发散或过估计。

  • 值方法:经验回放(Experience Replay)能够打破数据的时间相关性,让网络从历史样本中随机抽取小批量进行更新;DQN 还会引入目标网络(Target Network)并以一定频率同步参数,避免主网络和目标网络互相影响,减少训练震荡或发散。

  • 策略方法:由于梯度方差较大,我们通常会引入基线(Baseline)或使用更“温和”的近端策略优化(PPO)来限制旧策略和新策略之间的更新幅度。此外,合适的梯度裁剪和权重正则化也能减少因波动过大而导致的训练问题。

超参数调优

强化学习对超参数非常敏感,任何小小的数值调整都可能造成训练曲线的巨大变化,其中学习率、折扣因子γ、批量大小以及ϵ或噪声的调度方式等是大家讨论最多的几个点。

我们可以利用网格搜索或贝叶斯优化工具来批量测试不同超参数组合,并结合 TensorBoard 或类似工具观察回合奖励、损失函数和 Q 值变化。需要提醒的是,过度调参或许能让训练曲线看起来更漂亮,但如果参数对环境或随机种子的变化极其敏感,那就说明这套参数并不够稳健。我们最好多跑几次不同随机种子来确认算法的实际表现。

如何更好地排查问题

当实验结果不如预期时,我们可以从日志、可视化或源码多角度排查。记录每回合的奖励均值和标准差是最基本的做法,而一些高级的 RL 工具包还能同时输出策略熵、动作分布、价值估计等,让我们快速判断智能体是否过度探索或陷入僵化。

常见问题包括:

  • 训练初期策略毫无进展,可能是学习率太低或探索不足。

  • 中后期奖励曲线突然崩塌,可能和目标网络或价值估计过高有关,或者是某个超参数调整不当造成的。

  • 策略梯度法中,若熵值长时间贴近 0,说明智能体动作选择过于单一,需要提高熵惩罚或增加噪声。

如果我们能够对这些常见问题快速定位并修复,就说明对 Gym 上的强化学习训练已经有了更深入的理解和掌控。

后话

借助 OpenAI Gym 环境,无论我们是初学者还是已有一定经验,都可以用统一的方式快速搭建并测试各种强化学习算法。当我们熟悉了它的交互接口、弄清楚 MDP 的理论框架,并掌握了策略方法、值方法和探索-利用的思路后,下一步通常就是找一个具体的项目,编写训练脚本并不断调参、观察训练曲线。

This post is licensed under CC BY 4.0 by the author.