快捷方式

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

通用

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

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

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

  • 原因:这将揭示学习曲线无法告诉您的内容(例如,电子游戏中的错误或漏洞)。

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

  • 原因:数据增强不能像在计算机视觉中那样应用于强化学习,因为智能体需要根据观测来采取行动。例如,翻转图像可能相应地“翻转”适当的动作。

策略 (Policy)

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

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

  • 处方:调整熵奖励的系数(例如,PPO 中的 beta)有助于解决熵收敛过快/过慢的问题。或者,如果收敛过快/过慢,减小/增大奖励的大小也可能有帮助。熵曲线的急剧阶跃变化通常是问题制定(例如,观测或动作空间)、学习率、梯度范数或实现错误的下游问题。

奖励(“向上”之外)

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

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

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

任务时限是否非常长?

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

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

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

  • 原因:尺度更大的奖励将主导较小的奖励。此外,如果每步的奖励变得非常大,价值函数的标靶将变得巨大,因为它们是每步奖励的总和。

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

探索

在训练早期,价值损失是否在增加?

  • 原因:通常,在初始化时,价值估计约为 0.0。在训练早期,智能体很可能会遇到新的、未见的外部奖励,因为它在探索,所以价值估计将是错误的,损失会增加。

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

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

  • 原因:如果不使用先验信息,新初始化的网络应该接近随机。这对于智能体实现适当的探索很重要。

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

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

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

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

情节性任务中,情节性内在奖励是否在学习过程中保持不变或增加?

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

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

环境动态

您能否训练一个低熵的前向动态和/或奖励模型(对离线 RL 也很有用)?

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

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

观测空间

您的观测是否已归一化/标准化?

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

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

动作空间

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

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

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

动作空间是否维度过高?

  • 原因:如果动作空间非常大(例如,推荐系统),那么充分探索整个动作空间可能是不可行的。

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

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

  • 原因:具有相同相对尺度的输入和输出标靶通常更稳定,因为网络权重不需要变得非常大/小来补偿。出于同样的原因,学习速度通常更快,因为网络权重被初始化为适当的尺度,并且不需要通过梯度下降来实现。在某些算法中,动作可以输入到 Q 函数中,而在另一些算法中,梯度可以直接通过动作输出流入策略(例如,Soft Actor-Critic 中的重参数化),因此动作的合理尺度很重要。

  • 处方:通常会裁剪策略的动作输出到合理的范围。注意,这个裁剪后的动作不应该(与原始动作相反)用于训练,因为裁剪操作不是计算图的一部分,梯度将是不正确的。这应该被视为环境的一部分,因此策略将学会边界区域内的动作会导致更高的奖励。还可以使用一个压缩函数,如 tanh。这可以是计算图的一部分,并且为了高效地做到这一点,应该校正 log probs,就像这里所做的那样。记住,如果动作已归一化,请在环境端将动作重新映射到原始动作空间。

文档

访问全面的 PyTorch 开发者文档

查看文档

教程

为初学者和高级开发者提供深入的教程

查看教程

资源

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

查看资源