快捷方式

调试 RL 时要考虑的事项

常规

您是否在一些小型玩具问题(具有已知的最佳回报,例如网格世界、山地车)上验证了您的算法实现?

  • 原因:这将揭示您实现中的任何极端错误。

您是否可视化了您的智能体?

  • 原因:这将揭示学习曲线不会告诉您的内容(即,视频游戏中的错误或漏洞)。

对于任何数据增强,请非常小心。

  • 原因:数据增强不能像 CV 那样应用于 RL,因为智能体需要根据观察结果采取行动。例如,翻转图像可能会相应地“翻转”适当的动作。

策略

您的策略的熵是否收敛太快、太慢或发生剧烈变化?

  • 原因:这可能取决于算法,但策略的熵大致与动作的期望值成反比。

  • 处方:调整熵奖励的系数(即 PPO 中的 beta)可以帮助熵收敛太快/太慢。或者,如果收敛太快/太慢,减少/增加奖励的幅度也可能有所帮助。熵曲线发生阶跃式剧烈变化通常是问题表述(即,观察或动作空间)、学习率、梯度范数或实现中的错误造成的下游问题。

奖励(超出“上升”)

智能体是否偏爱奖励函数的单个组成部分(即速度与 L2 动作幅度)?

  • 原因:奖励函数的某个组成部分可能“更容易”优化,因此智能体会将该行为视为局部最优解。

  • 处方:除了调整奖励组成部分的系数外,使用组成部分的乘积而不是总和也可能是有意义的。跟踪与每个奖励组成部分相关的统计数据也可能产生见解。或者,如果某些组成部分被认为是“辅助的”,则随着时间的推移衰减权重可能会有所帮助。

任务期限是否非常长?

  • 原因:信用分配(即将来的/价值奖励归因于过去的state/actions)随着动作和相应奖励之间的时间间隔而变得更加困难。在稀疏奖励环境中,这可能是训练效率低下的根源,需要与环境进行多次交互。

  • 处方:为最终目标的工具性行为添加中间奖励可以大大提高训练速度(例如,在足球环境中,踢球的中间奖励将增加智能体发现进球是有益的可能性)。但这可能会产生不良的最优解,因为利用中间奖励可能无意中比真正的奖励更有价值,或者导致不良的特有行为。可以使用基于步骤或奖励的课程来将此中间奖励的价值衰减为零。或者,如果有许多子任务,可以使用分层或基于选项的框架,其中为不同的子任务(例如,踢球、传球、跑步)学习单独的策略,然后更高级别的智能体从这些低级别策略中选择作为其动作空间。请注意,此问题也可能属于“探索”部分,并且需要显式的探索机制,例如内在好奇心模块。

您的奖励是否已归一化/标准化?

  • 原因:数量级较大的奖励将支配较小的奖励。此外,如果每个时间步的奖励变得非常大,则价值函数的目标将变得巨大,因为它们是每个时间步奖励的总和。

  • 处方:一般来说,将奖励保持在 [-1,1] 之间是一个好的做法。或者,您可以使用运行均值/标准差实例归一化(例如,TorchRL 实现或 Gym 实现)。

探索

价值损失是否在训练早期上升?

  • 原因:通常,在初始化时,价值估计约为 0.0。在训练早期,智能体可能会遇到新的、未见过的外在因素,因为它在探索,因此价值估计将是错误的,损失会上升。

  • 处方:通过内在奖励或熵奖励来增加探索。或者,通过添加中间奖励使奖励函数更密集。

动作是否在训练早期(大致)均匀/正态随机?

  • 原因:如果未使用先验知识,则新初始化的网络应接近随机。这对于智能体实现适当的探索非常重要。

  • 处方:检查策略网络是否已正确初始化,以及策略熵是否没有快速下降。

内在奖励是否在单例任务中随着学习的进行而衰减?

  • 原因:内在奖励旨在鼓励探索,通常通过某种新颖性度量。随着智能体的探索,额外探索(或重新访问先前探索过的状态-动作)的价值随着新颖性的降低而降低。理想情况下,随着内在奖励开始下降,外在奖励应开始增加。

  • 处方:内在奖励应归一化。如果内在奖励已降至 0,但智能体尚未学到任何东西,则可以尝试减慢内在模块的动态(即,降低随机网络蒸馏的学习率或添加噪声)。

情景式内在奖励是否在情景式任务中随着学习的进行而保持不变或增加?

  • 原因:内在奖励旨在鼓励探索,通常通过某种新颖性度量。在情景式任务中,由于新颖性可能不会降低,并且探索行为实际上可能会改善,因此内在奖励应保持不变或增加。

  • 处方:外在奖励当然也应增加。如果情况并非如此,则可能意味着这两个目标未对齐,并且两者之间存在权衡。如果这种权衡是不可避免的,则外在奖励需要优先于情景式奖励。实现此目标的一些方法是对情景式奖励使用衰减计划,拥有单独的探索(仅限情景式奖励)和利用(仅限外在奖励)策略,并使用探索策略为利用策略生成更多样化的起始状态,或使用行为克隆来引导训练。此外,内在奖励应归一化。

环境动态

您可以训练低熵前向动态和/或奖励模型吗(也适用于离线 RL)?

  • 原因:下一个状态和奖励用于在 RL 算法中生成价值学习的目标。如果这些目标非常嘈杂,则目标将是嘈杂的,并且学习可能会缓慢或不稳定。环境可能是固有的随机的(即,敌人的随机生成),观察空间的表述可能缺少变量(即,POMDP),或者对先前状态的依赖性可能非常松散甚至不存在。

  • 处方:根据噪声的来源,重新审视观察表述以确保其包含所有必要信息、可以处理先前状态序列的网络架构,而不仅仅是最后一个状态(即 LSTM、Transformer),甚至使用分布强化学习算法来显式地对价值分布(而不仅仅是期望值)进行建模可能很有用。

观察空间

您的观察结果是否已归一化/标准化?

  • 原因:具有相同相对比例的输入和输出目标往往更稳定,因为网络权重不需要变得非常大/小来补偿。出于同样的原因,学习往往更快,因为网络权重被初始化为适当的比例,并且不需要通过梯度下降来达到该比例。此外,如果观察特征之间存在极端的比例差异(例如,[-1,+1] 与 [-1000, 1000]),则较大的特征可能会在权重补偿之前支配较小的特征。

  • 处方:如果您知道这些值的最小值/最大值范围,则可以手动归一化到 [0,1] 范围。或者,您可以使用运行均值/标准差实例归一化(例如,TorchRL 实现或 Gym 实现)。均值和标准差将在训练开始时发生巨大变化,但随后随着更多数据逐渐收敛。如果稳定性存在问题,可以在进行任何更新之前收集一个大型缓冲区以计算起始均值和标准差。

动作空间

动作的效果是否在一个 episode 中发生剧烈变化?

  • 原因:如果动作在训练的早期阶段导致失败,则智能体可能会学习永远不执行该动作,并且这可能会阻止其完全解决任务(即,“提交您的工作”动作)。

  • 处方:问题可能应该以分层方式表述(即,学习“提交工作”的智能体)。此外,充分的探索在这种情况下变得非常重要。

动作空间是否过高维度?

  • 原因:如果动作空间非常大(即,推荐系统),则可能无法充分探索整个动作空间。

  • 处方:为了缓解这种情况,可以手动修剪动作空间,或者开发依赖于状态的启发式方法来掩盖/过滤哪些动作可供智能体使用(例如,在某些 Atari 游戏中掩盖“射击”动作,或在国际象棋中掩盖非法移动),或者组合动作/动作序列(例如,操纵任务中的抓取和释放动作可以是相同的动作,也可以是原语序列)。如果不可能,则存在替代方法,例如 top-p 采样,其中您仅从累积概率 p 的前几个动作中采样。

您的动作是否已归一化/标准化?

  • 原因:具有相同相对比例的输入和输出目标往往更稳定,因为网络权重不需要变得非常大/小来补偿。出于同样的原因,学习往往更快,因为网络权重被初始化为适当的比例,并且不需要通过梯度下降来达到该比例。在某些算法中,动作可以输入到 Q 函数中,而在其他算法中,梯度可以直接通过动作输出流入策略(例如,软演员-评论家中的重参数化),因此对于合理缩放的动作而言,这很重要。

  • 处方:通常的做法是裁剪策略的动作输出到合理的范围。请注意,此裁剪后的动作不应(与原始动作相反)用于训练,因为裁剪操作不是计算图的一部分,并且梯度将不正确。这应被视为环境的一部分,因此策略将学习到有界区域中的动作会导致更高的奖励。也可以使用挤压函数(例如 tanh)。这可以是计算图的一部分,为了有效地执行此操作,应纠正对数概率,例如在此处完成的那样。如果已归一化,请记住在环境侧将动作重新映射到原始动作空间。

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

获取面向初学者和高级开发者的深入教程

查看教程

资源

查找开发资源并获得您的问题解答

查看资源