“在随机行走任务上,Temporal-Difference(0)和Constant-α Monte Carlo方法的比较”
Comparison of Temporal-Difference(0) and Constant-α Monte Carlo methods on a random walk task.
![使用Midjourney付费订阅生成的图像,符合通用商业条款[1]](https://miro.medium.com/v2/resize:fit:640/format:webp/1*5oytNad_PJHFQzWAIBrgoQ.png)
介绍
蒙特卡洛(MC)和时序差分(TD)方法都是强化学习领域中的基本技术;它们通过与环境交互的经验来解决预测问题,而不是基于环境的模型。然而,TD方法是MC方法和动态规划(DP)的结合体,与MC方法在更新规则、引导和偏差/方差等方面有所不同。在大多数情况下,TD方法的性能更好,收敛速度更快。
在本文中,我们将在一个简单的网格环境和一个更全面的随机漫步[2]环境上比较TD和MC,或者更具体地说,比较TD(0)和常数α的MC方法。希望本文能帮助对强化学习感兴趣的读者更好地理解每种方法如何更新状态值函数以及它们在相同测试环境中的性能差异。
我们将使用Python实现算法和比较,本文中使用的库如下:
python==3.9.16numpy==1.24.3matplotlib==3.7.1
TD和MC的区别
TD(0)和常数α的MC的介绍
常数α的MC方法是具有恒定步长参数α的常规MC方法,这个恒定参数有助于使值估计对最近的经验更敏感。在实践中,α值的选择取决于稳定性和适应性之间的权衡。下面是MC方法在时间t更新状态值函数的方程:
TD(0)是TD(λ)的一种特殊情况,它只看一步,并且是TD学习的最简单形式。该方法使用TD误差来更新状态值函数,即状态的估计值与奖励加上下一个状态的估计值之差。恒定步长参数α与上述MC方法中的步长参数相同。下面是TD(0)在时间t更新状态值函数的方程:
一般来说,MC和TD方法的区别表现在以下三个方面:
- 更新规则:MC方法仅在回合结束后更新值;如果回合非常长,这可能会成为问题,会减慢程序的速度,或者在连续任务中根本没有回合。相反,TD方法在每个时间步更新值估计;这是在线学习,在连续任务中特别有用。
- 引导:在强化学习中,“引导”一词指的是基于其他值估计更新值估计。TD(0)方法基于后续状态的值进行更新,因此它是一种引导方法;相反,MC不使用引导,因为它直接从回报(G)中更新值。
- 偏差/方差:MC方法是无偏的,因为它通过权衡观察到的实际回报来估计值,而不是在回合期间进行估计;然而,MC方法的方差很高,特别是当样本数量较少时。相反,TD方法有偏差,因为它使用引导,偏差可以根据实际实现的不同而变化;TD方法的方差较低,因为它使用即时奖励加上下一个状态的估计值,这平滑了由奖励和动作中的随机性引起的波动。
在简单的网格世界设置中评估TD(0)和常数α的MC
为了使它们的区别更加明显,我们可以设置一个简单的Gridworld测试环境,其中包含两条固定的轨迹,运行两种算法直到收敛,并检查它们如何不同地更新值。
首先,我们可以使用以下代码设置测试环境:

上图左侧显示了一个简单的Gridworld环境设置。所有带颜色的格子表示终止状态;当智能体进入红色格子时,奖励为+1,但进入蓝色格子时奖励为-1。网格上的其他步骤返回的奖励为零。上图右侧标记了两条预设路径:一条到达蓝色格子,另一条停在红色格子;路径的交叉点有助于最大化两种方法之间的价值差异。
然后,我们可以使用前面一节中的方程来评估环境。我们不对回报或估计进行折现,并将α设为一个小值1e-3。当值增量的绝对和低于1e-3的阈值时,我们认为值已经收敛。
评估的结果如下:

上图很明显展示了这两种算法在估计值方面的不同方式。MC方法忠实于路径的回报,因此每条路径上的值直接表示它的结束情况。然而,TD方法提供了更好的预测,特别是在蓝色路径上——交叉点之前的蓝色路径上的值还表明了到达红色格子的可能性。
通过这个简单的案例,我们准备转向一个更复杂的例子,并试图找出这两种方法在性能上的差异。
随机行走任务
随机行走任务是Sutton等人为了TD和MC预测目的而提出的一个简单的马尔可夫奖励过程[2],如下图所示。在这个任务中,智能体从中心节点C开始。智能体在每个节点上以相等的概率向右或向左迈步。链的两端都有两个终止状态。进入左端的奖励为0,进入右端的奖励为+1。终止之前的所有步骤产生的奖励为0。

我们可以使用以下代码创建随机行走环境:
=====测试:检查环境设置=====链接: 无 ← 节点A → 节点B奖励: 0 ← 节点A → 0链接: 节点A ← 节点B → 节点C奖励: 0 ← 节点B → 0链接: 节点B ← 节点C → 节点D奖励: 0 ← 节点C → 0链接: 节点C ← 节点D → 节点E奖励: 0 ← 节点D → 0链接: 节点D ← 节点E → 无奖励: 0 ← 节点E → 1
在随机策略下,环境的每个节点的真实值为[1/6, 2/6, 3/6, 4/6, 5/6]。该值是通过使用Bellam方程进行策略评估计算得出的:
我们的任务是找出两种算法估计的值与真实值有多接近;我们可以任意假设算法产生的值函数与真值函数更接近,通过平均均方根误差(RMS)来衡量,表明性能更好。
TD(0)和常数α MC在随机游走中的性能
算法
准备好环境后,我们可以开始在随机游走环境上运行两种方法,并比较它们的性能。首先让我们来看看这两种算法:


如前所述,MC方法应该等到整个回合结束后,才能从轨迹的尾部更新值,而TD方法则是增量更新值。这种差异在初始化状态值函数时会有一个技巧:在MC中,状态值函数不包括终止状态,而在TD(0)中,函数应该包括终止状态,并且值为0,因为TD(0)方法总是在回合结束之前始终向前看一步。
实现
这个实现中的α参数选择参考了书中提出的[2];MC方法的参数为[0.01、0.02、0.03、0.04],而TD方法的参数为[0.05、0.10、0.15]。我想知道为什么作者没有选择相同的参数集合在两种算法上运行,直到我用TD的参数来运行MC方法:TD的参数对于MC方法来说太高了,因此无法展现MC的最佳性能。因此,我们将遵循书中的参数设置来进行参数扫描。现在,让我们运行这两种算法,找出它们在随机游走设置上的性能。
结果

比较100次后的结果如上图所示。TD方法通常比MC方法产生更好的值估计,而α=0.05的TD方法可以非常接近真值。图中还显示,与TD方法相比,MC方法的方差较高,兰花色线条的波动比钢蓝色线条更大。
值得注意的是,对于两种算法来说,当α(相对较高)时,RMS损失先下降后再上升。这种现象是由值初始化和α值的综合效应造成的。我们初始化了一个相对较高的值0.5,比节点A和B的真值要高。由于随机策略有50%的机会选择“错误”的步骤,将代理人带离正确的终止状态,较高的α值也会强调错误的步骤,并使结果偏离真值。
现在让我们尝试将初始值减少到0.1,并再次进行比较,看看问题是否得到缓解:

较低的初始值显然有助于缓解问题;没有明显的“先下降,然后再上升”的效果。然而,较低的初始值的副作用是学习效率较低,RMS损失在150个回合后永远不会低于0.05。因此,初始值、参数和算法的性能之间存在一个权衡。
批量训练
在这篇文章中,我想提及的最后一点是对两种算法进行批量训练的比较。
考虑以下情况:我们在随机行走任务中只积累了有限的经验,或者由于时间和计算的限制,我们只能运行一定数量的回合。批量更新的想法是为了处理这种情况,通过充分利用现有的轨迹。
批量训练的思想是反复更新一批轨迹上的值,直到值收敛为止。只有在处理完所有批量经验后,才会更新这些值。让我们在随机行走环境中实现批量训练,看看TD方法是否仍然比MC方法表现更好。
结果

批量训练的结果显示,有限经验下TD方法仍然比MC方法更好,两种算法的性能差距非常明显。
结论
在本文中,我们讨论了常数α MC方法和TD(0)方法之间的差异,并比较了它们在随机行走任务中的性能。在本文的所有测试中,TD方法都优于MC方法,因此在强化学习任务中,将TD方法作为一种选择是可取的。然而,这并不意味着TD总是优于MC,因为后者有一个最明显的优势:没有偏差。如果我们面临的任务对偏差没有容忍度,那么MC可能是一个更好的选择;否则,TD可以更好地处理一般情况。
参考资料
[1] Midjourney 服务条款:https://docs.midjourney.com/docs/terms-of-service
[2] Sutton, Richard S., and Andrew G. Barto. Reinforcement learning: An introduction. MIT Press, 2018.
本文的GitHub存储库:[链接]。