快捷方式

调试强化学习时需要考虑的事项

常规

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

  • 原因:这将揭示你实现中的任何严重错误。

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

  • 原因:这将揭示学习曲线无法告诉你的事情(例如,视频游戏中的错误或利用)。

对任何数据增强都要非常小心。

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

策略

你的策略的熵是否收敛得太快、太慢或发生巨大变化?

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

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

奖励(除了“向上”)

智能体是否偏向奖励函数的一个单独组件(例如,速度与 L2 动作幅度)?

  • 原因:可能是奖励函数的一个组件“更容易”优化,因此智能体将找到该行为作为局部最优解。

  • 处方:除了调整奖励组件的系数外,使用组件的乘积而不是求和也可能是有意义的。跟踪关于每个奖励组件的统计信息也可以提供洞察。或者,如果某些组件被认为是“辅助的”,那么随着时间的推移衰减权重可能会有所帮助。

任务范围是否非常长?

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

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

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

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

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

探索

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

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

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

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

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

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

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

  • 原因:内在奖励旨在通过某种新奇度指标来鼓励探索。当智能体探索时,随着新奇度的降低,额外探索(或重新访问以前探索过的状态-动作)的价值会降低。理想情况下,随着内在奖励开始下降,外在奖励应该开始增加。

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

情景式任务中,情景式内在奖励是否随着学习的进展而保持恒定或增加?

  • 原因:内在奖励旨在通过某种新奇度指标来鼓励探索。在情景式任务中,由于新奇度可能不会降低,探索行为实际上可能会改善,因此内在奖励应该保持恒定或增加。

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

环境动力学

您能训练一个低熵正向动力学模型和/或奖励模型吗?(这对离线强化学习也很有用)

  • 原因:下一个状态和奖励用于在强化学习算法中生成价值学习的目标。如果这些目标非常嘈杂,那么目标就会很嘈杂,学习可能会很慢或不稳定。环境可能固有地是随机的(例如,敌人的随机生成),观察空间的公式可能缺少变量(例如,部分可观察马尔可夫决策过程),或者对先前状态的依赖可能非常松散或不存在。

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

观察空间

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

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

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

动作空间

动作的影响在情节中是否发生剧烈变化?

  • 原因:如果一个动作在训练的最初阶段导致失败,代理可能会学会永远不执行它,这可能会阻止它完全解决任务(例如,“提交你的工作”动作)。

  • 处方:问题可能应该以分层的方式进行表述(例如,一个学会“提交工作”的代理)。此外,在这种情况下,充分的探索变得非常重要。

动作空间的维度是否过高?

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

  • 处方:为了缓解这个问题,可以手动修剪动作空间或开发依赖于状态的启发式方法来屏蔽/过滤代理可用的动作(例如,在某些 Atari 游戏中屏蔽“开火”动作或在国际象棋中屏蔽非法动作),或者组合动作/动作序列(例如,在操作任务中,抓取和释放动作可以是同一个动作,还可以是基本动作序列)。如果这是不可能的,则存在其他方法,例如 top-p 采样,其中您只从累积概率为 p 的前几个动作中进行采样。

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

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

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

文档

访问 PyTorch 的全面开发人员文档

查看文档

教程

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

查看教程

资源

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

查看资源