调试强化学习时需要考虑的事项¶
通用¶
您是否已经在一些具有已知最优回报的小型玩具问题(例如 gridworlds、mountaincar)上验证了您的算法实现?¶
原因:这将揭示您实现中的任何极端错误。
您是否已经可视化了您的智能体?¶
原因:这将揭示学习曲线无法告诉您的信息(即,视频游戏中的错误或利用)。
对任何数据增强都要非常小心。¶
原因:数据增强不能像计算机视觉那样应用于强化学习,因为智能体需要根据观察采取行动。例如,翻转图像可能会相应地“翻转”合适的行动。
策略¶
您的策略的熵是否收敛过快、过慢或发生剧烈变化?¶
原因:这可能取决于算法,但策略的熵大致与行动的期望值成反比。
建议:调整熵奖励(例如 PPO 中的 beta)的系数可以帮助解决收敛过快/过慢的熵问题。或者,减少/增加奖励的幅度也可能有助于解决收敛过快/过慢的问题。熵曲线发生剧烈阶跃变化通常是由于问题公式(即观察或行动空间)、学习率、梯度范数或实现中的错误引起的。
奖励(不仅仅是“增加”)¶
智能体是否偏向奖励函数的单个组成部分(例如速度与 L2 行动幅度)?¶
原因:奖励函数的某个组成部分可能“更容易”优化,因此智能体会将该行为视为局部最优解。
建议:除了调整奖励组成部分的系数外,使用组成部分的乘积而不是总和可能也有意义。跟踪每个奖励组成部分的统计数据也可能提供见解。或者,如果某些组成部分被视为“辅助”组成部分,随时间衰减其权重可能会有所帮助。
任务周期是否非常长?¶
原因:信用分配(即,将未来/价值奖励归因于过去的状态/行动)随着行动与相应奖励之间的时间间隔而变得更加困难。在稀疏奖励环境中,这可能是训练效率低下的一个来源,需要与环境进行大量交互。
建议:为有助于实现最终目标的行为添加中间奖励可以大大提高训练速度(例如,在足球环境中,踢球的中间奖励会增加智能体发现进球是有益的可能性)。然而,这可能会产生不期望的最优解,因为利用中间奖励可能会无意中比真实奖励更有价值或导致不期望的特殊行为。可以使用基于步长或奖励的课程,将这种中间奖励的值衰减到零。或者,如果有很多子任务,可以使用分层或基于选项的框架,为不同的子任务(例如,踢球、传球、跑步)学习单独的策略,然后高级别智能体从这些低级别策略中选择作为其行动空间。注意,这个问题也可能属于“探索”部分,需要明确的探索机制,例如 内在好奇心模块。
您的奖励是否已经归一化/标准化?¶
探索¶
在训练早期,价值损失是否在增加?¶
原因:通常,在初始化时,价值估计值约为 0.0。在训练早期,智能体在探索时可能会遇到新的、未见的外部奖励,因此价值估计值会出错,损失会增加。
建议:通过内在奖励或熵奖励增加探索。或者,通过添加中间奖励使奖励函数更密集。
在训练早期,行动是否(大致)均匀/正态随机?¶
原因:如果不使用先验,新初始化的网络应该接近随机。这对于智能体实现适当的探索非常重要。
建议:检查策略网络是否已适当初始化,并且策略熵不会下降得太快。
在单例任务中,随着学习的进展,内在奖励是否在衰减?¶
原因:内在奖励旨在鼓励探索,通常通过某种新颖性衡量标准。随着智能体的探索,进一步探索(或重新访问先前探索的状态-行动)的价值随着新颖性的降低而减弱。理想情况下,随着内在奖励开始下降,外部奖励应该开始增加。
建议:内在奖励应该被归一化。如果内在奖励已降至 0 但智能体没有学到任何东西,可以尝试减缓内在模块的动态(即,降低随机网络蒸馏的学习率或添加噪声)。
在情节任务中,随着学习的进展,情节内在奖励是否保持恒定或增加?¶
原因:内在奖励旨在鼓励探索,通常通过某种新颖性衡量标准。在情节任务中,由于新颖性可能不会降低,并且探索行为实际上可能会改善,因此内在奖励应该保持恒定或增加。
建议:外部奖励当然也应该增加。如果不是这样,则可能意味着这两个目标未对齐,并且两者之间存在权衡。如果这种权衡不可避免,那么外部奖励需要优先于情节奖励。实现这一点的一些方法包括对情节奖励使用衰减调度,拥有单独的探索(仅带情节奖励)和利用(仅带外部奖励)策略,并使用探索策略为利用策略生成更多样化的起始状态,或者使用行为克隆来启动训练。此外,内在奖励应该被归一化。
环境动态¶
您能否训练一个低熵的前向动态和/或奖励模型(对于离线强化学习也很有用)?¶
原因:下一个状态和奖励用于生成强化学习算法中价值学习的目标。如果这些非常嘈杂,那么目标也会嘈杂,并且学习可能缓慢或不稳定。环境可能本身就是随机的(即敌人的随机生成),观察空间的公式可能缺少变量(即 POMDP),或者对先前状态的依赖性可能非常松散甚至不存在。
建议:根据噪声的来源,重新审视观察公式以确保其包含所有必要信息可能会很有用;使用能够处理先前状态序列而不仅仅是最后一个状态的网络架构(即 LSTM、Transformer);甚至使用分布强化学习算法来明确建模价值分布(而不仅仅是期望值)。
观察空间¶
您的观察是否已经归一化/标准化?¶
原因:具有相同相对尺度的输入和输出目标往往更稳定,因为网络权重无需变得非常大/非常小来补偿。出于同样的原因,学习往往更快,因为网络权重被初始化到适当的尺度,无需通过梯度下降来达到该尺度。此外,如果观察特征之间存在极大的尺度差异(例如 [-1,+1] vs [-1000, 1000]),较大的特征可能会在权重能够补偿之前主导较小的特征。
建议:如果您知道这些值的最小/最大范围,可以手动归一化到 [0,1] 的范围。或者,您可以使用运行均值/标准差实例归一化(例如 TorchRL 实现 或 Gym 实现)。均值和标准差在训练开始时会发生显著变化,但随后会随着数据量的增加而缓慢收敛。如果稳定性是一个问题,可以在进行任何更新之前收集一个大的缓冲区来计算起始均值和标准差。
行动空间¶
在一次情节中,一个行动的效果是否会发生剧烈变化?¶
原因:如果在训练的最初阶段某个行动导致失败,智能体可能会学会永不执行该行动,这可能会完全阻止它解决任务(例如,“提交工作”的行动)。
建议:问题可能应该分层制定(即,一个学习“提交工作”的智能体)。此外,在这种情况下,充分的探索变得非常重要。
行动空间维度是否过高?¶
原因:如果行动空间非常大(例如推荐系统),充分探索整个行动空间可能不可行。
建议:为了缓解这个问题,可以手动修剪行动空间,或者开发依赖于状态的启发式方法来屏蔽/过滤哪些行动可供智能体使用(例如在某些 Atari 游戏中屏蔽“开火”行动或在国际象棋中屏蔽非法移动),或者组合行动/行动序列(例如,在操控任务中抓取和释放行动可以是相同的行动,也可以是基本操作序列)。如果这不可能,还存在其他方法,例如 top-p 采样,您只从累积概率为 p 的顶部行动中进行采样。
您的行动是否已经归一化/标准化?¶
原因:具有相同相对尺度的输入和输出目标往往更稳定,因为网络权重无需变得非常大/非常小来补偿。出于同样的原因,学习往往更快,因为网络权重被初始化到适当的尺度,无需通过梯度下降来达到该尺度。在某些算法中,行动可以作为 Q 函数的输入,而在另一些算法中,梯度可以直接通过行动输出流向策略(例如 Soft Actor-Critic 中的重参数化),因此行动尺度合理非常重要。
建议:通常将策略的行动输出 裁剪 到一个合理的范围。注意,这个裁剪后的行动不应该用于训练(与原始行动相对),因为裁剪操作不是计算图的一部分,梯度会不正确。这应该被视为环境的一部分,因此策略会学习到有界区域内的行动会带来更高的奖励。也可以使用诸如 tanh 的压缩函数。这可以成为计算图的一部分,为了高效地做到这一点,应该修正对数概率,例如 此处 的做法。如果行动已归一化,请记住在环境端将行动重新映射回原始行动空间。