机器学习工程师 - Udacity 强化学习 Part Ten

九、策略梯度
1.为何要使用基于策略的方法
原因有三个方面:简单性,随机性策略和连续动作空间。
在 Q 学习等基于值的方法中我们发明了值函数这一概念作为查找最优策略的中间步骤,它有助于我们将问题重新描述为更易于理解和学习的形式。但是如果我们的最终目标是查找最优策略,真的需要该值函数吗?可以直接估算最优策略吗?这样的策略看起来如何?如果我们采用确定性方法,则该策略只需是从状态到动作的映射或函数。对于随机性方法,则为在特定状态下每个动作的条件概率,然后根据该概率分布选择一个动作。这样更简单,因为我们直接处理手头上的问题,并且可以避免处理大量额外的数据。这些数据并非始终有用。例如,状态空间的很大部分可能具有相同的值,以这种方式构建策略使我们能够在可能时进行此类泛化,并更侧重于状态空间的更复杂区域
与基于值的方法相比,基于策略的方法具有的主要优势之一是它们可以学习真正的随机性策略。这就像从一种特殊的机器中选择一个随机数字。首先,每个数字被选择的概率取决于可以更改的某些状态变量。相反,当我们对值函数应用 Epsilon 贪婪动作选择法时的确会增加一些随机性,但并不足够。抛掷硬币,如果正面朝上,遵守确定性策略,因此随机选择一个动作,底层的值函数依然会促使我们选择特定的动作。我们来看看其中存在的问题。假设你要学习如何玩剪刀石头布,对手同时伸出自己的手,因此你无法使用该信息来决定选择什么动作。实际上这里的最优策略是随机均匀地选择一个动作,任何其他策略,例如确定性策略,甚至有一定的不均匀性的随机性策略都会被对手利用。
随机性策略有帮助的另一个情形是别名状态,即我们认为相同的两个或多个状态实际上并不相同,从这一角度考虑,它们的环境部分可观察。但是此类情形出现的次数比你想象的要频繁。例如这个网格世界:

其中包含平滑的白色单元格和网状灰色单元格。在底部中间单元格有一根香蕉,在左下角和右下角有一个辣椒。很明显,无论从哪个单元格开始,智能体 George 都需要找到一个可靠的策略以便抵达香蕉单元格并避免进入辣椒单元格。实际情况是,它所知道的信息是当前单元格是否平滑,两边是否有墙壁。假设这些是可以从环境中获取的唯一观察结果或特征,它不能了解关于临近单元格的任何信息。当 George 位于顶部中间单元格时它知道该单元格很平滑并且只有头顶有一面墙,因此它可以向下移动并拿到香蕉,当它在左上角或右上角的单元格中时它知道两侧有墙壁,能够知道它处在哪两个极端单元格中,并且能够学会可靠地避免遇到辣椒并进入中间单元格。问题是,当它位于某个网状灰色单元格中时,无法判断位于哪个单元格中。所有特征都一样。如果使用值函数表示法,那么这些单元格的值相等,因为它们都映射到相同的状态,相应的最佳动作肯定也一样,因此,根据经验 George 可能学会从这两个单元格中向右或向左移动,这也没关系,但是这个区域存在问题,George 将不断在这最左或最右的两个单元格之间来回移动,永远出不来。借助很小的 Epsilon 贪婪策略 George 也许能够碰巧出来。但是很不高效,可能会花费很长时间。如果 ϵ 很大,可能会导致其他状态的操作很糟糕。可以清晰地看出其他基于值的策略也不太理想。它能采取的最佳做法是以相同的概率从这些别名状态中向左或向右移动,它更有可能很快离开该陷阱。基于值的方法倾向于学习确定性或近似确定性策略,而在这种情况下基于策略的方法可以学习期望的随机性策略。
探索基于策略的方法的最后一个原因是它们非常适合连续性动作空间。当我们使用基于值的方法时,即使采用函数逼近器,输出也将由每个动作对应的值组成。如果动作空间是离散的,有一组有限的动作,我们可以轻松地选择值最大的动作。但是如果动作空间是连续的,那么这个最大化运算变成了优化问题本身,就像查找连续性函数的全局最大值,过程不轻松。尤其是如果该函数非凸。更高维度的动作空间存在类似的问题,要评估的潜在动作非常多。如果能将给定状态直接映射到动作,那么会比较理想,即使生成的策略有点复杂,这样可以显著缩短所需的计算时间。这正是基于策略的方法可以达到的效果。

2.策略函数逼近
我们可以将基于策略的方法扩展到涵盖大型连续性状态空间,方法是使用一个函数来估算策略,就像值函数逼近一样。为此,我们用 θ 参数化策略,θ 可以是神经网络或其他模型的权重。

我们的目标变成优化这些参数以便找到最佳策略。

一个简单的近似函数是这些特征的线性组合。但是因为我们希望最终输出是一个可以从中抽样的概率分布,因此需要进行一些转换。例如我们可以应用 Softmax 函数。该函数通过除以所有动作的指数之和,指数化线性组合的结果并使其标准化,这样可以形成一组和为 1 的动作概率值。注意,这种转换仅适用于一组离散的动作。
当环境具有连续动作空间时我们可以使用高斯策略,即从高斯或正态分布中抽取动作。

该分布的参数由我们的特征决定,例如,均值 μ 可以是特征的简单线性组合,σ2 可以是固定的值或以类似的方式参数化。我们可以对任何近似函数应用相同的技巧。这些函数会生成一些值并将这些值变成表示随机性策略的概率
如何判断哪个策略是最佳策略?我们需要一些目标衡量方法来判断某个策略的效果如何,该衡量方法必须是策略参数的函数。凭直觉判断,该函数需要捕获根据该策略获得的奖励的预期值。我们来介绍下轨线 τ 这一概念。

可以将其看做一个完整或部分阶段,因此,可以通过对多个轨线抽样计算预期值。

如果你有一个阶段性任务,那么一种方式是使用第一个时间步 G1 的回报均值,即整个阶段的累积折扣回报,等同于起始状态的值。在连续环境中我们不能依赖于特定的起始状态,因此最好将目标与不依赖于这种状态的衡量方法相关联。一种此类衡量方法是平均或预期状态值。凭直觉来看,你希望选择一个使平均值更高的策略,但是某些状态的发生频率可能高于其他状态,因此现在每个状态值需要用相应状态的发生概率进行加权,即平稳概率,计算方法是将状态的发生次数除以所有状态的总发生次数。相关衡量方法是以类似方式计算的平均动作值或 Q 值。

但是注意直接对策略进行编码的目标是不需要记录状态值或动作值,因此我们可以直接计算的衡量指标是每个时间步的平均奖励。

有趣的是所有这些公式在优化策略方面似乎都可以取得相同的良好效果,选择哪个目标取决于问题或环境的特性,你可以选择最方便计算并且最能体现你要实现的目标的公式。

3.随机性策略搜索
拥有目标函数后,现在可以思考如何查找最大化它的策略了。目标函数可能会非常复杂,可以看做有很多峰值和谷值的表面,我们对此表面一点也不了解,如何找到目标值最大的位置?
第一个方法是不断到处逼近搜索最佳策略。我们从某个随机策略 π 开始,通过将该策略应用到环境中评估该策略,这样可以获得一个目标值。可以想象策略位于目标函数表面的某个位置。现在我们可以稍微更改策略参数,使目标值也更改,可以通过向参数添加一些小的高斯噪点来实现,如果新的策略值比到目前为止的最佳值还要大,则将此策略设为新的最佳策略并迭代。这个一般方法称之为爬山法。相当于沿着目标函数表面走动,直到抵达山丘的顶部。最精彩的是你可以使用任何策略函数,并不一定要可微甚至连续。但是因为采取的是随机步骤,可能并不是爬山的最有效路径。
一个小小的改进是在每次迭代时选择一小部分周围的策略并从中选择最佳策略,通过查看等值线图更容易理解。同样,从随机策略开始,评估它并找到它的位置,通过随机打乱参数生成几个候选策略,并与环境互动以评估每个策略,这样可以了解当前策略的周围情况,现在选择看起来效果最理想的候选策略并迭代。这种变体形式称之为最陡上升爬山法,可以避免选择一个可能会导致次最优解决方案的下个策略。
你可能依然会陷入局部最佳状态,但是有一些修改方法可以帮助缓和这种情况。例如使用随机重新开始法或模拟退火法。模拟退火法使用预定义的计划表控制如何探索策略空间。从一个很大的噪点参数开始,这时候要探索的临近区域很广泛,我们逐渐减小噪点或半径,并越来越接近最优解决方案,有点像退火和烙铁,通过加热铁块然后逐渐冷却,使铁分子能够进入最优结构,并形成坚硬的金属块,故而得名。我们还可以使方法更加适应于观察的策略值中的变化。原理是每当我们发现比之前更好的策略时我们就有可能更接近最优策略,因此有必要缩小生成下个策略的搜索半径,这就相当于减小或衰减添加的高斯噪点的变化。到目前为止,这就相当于模拟退火法。但是如果我们没有找到更好的策略,则最好增大搜索半径,并继续从当前最佳策略进行探索,对随机性策略搜索进行这一小小的调整使我们不太可能会陷入僵局,尤其是位于目标函数复杂的环境中更是如此。

4.策略梯度
随机性策略搜索并非始终能达到预期效果,它容易受到所选单个样本的影响,可能会陷入局部最佳状态或需要很长的时间才能收敛。使用此类随机化方法的主要原因之一是你不需要了解关于目标函数、底层策略或梯度的任何信息,可以当做一个黑匣子,输入一组参数,在环境中运行策略并获得目标值。但是如果你对策略和目标函数更了解,并且如果能计算目标函数相对于策略参数的梯度,这样可以采取更有效的步骤。

梯度始终指向最大变化的方向,因此,不用评估当前策略临近区域的一堆随机候选策略,你可以直接计算下一组看起来最有希望最佳的策略参数,这就是策略梯度的基础。此类方法的一般流程是,找到当前策略参数的梯度,并以增加梯度的形式更新它们,然后迭代。注意,我们依然需要保持谨慎,并采取由步长 α 定义的小步,因为策略和环境最有可能是随机性,每个策略评估可能无法生成一致的结果,这是通过多个阶段评估策略的原因之一。如果目标函数不可微,底层策略很复杂时会发生这种情况,你将无法直接找到梯度。在这种情况下,你可以使用有限差估算梯度。

对于任何一个策略 π,它由 n 维参数向量 θ 定义,找到目标函数相对于每个维度 k 的偏导数,使该维度与一个很小的值相加,计算形成的策略与当前策略之间的差异,将所有偏导数添加到一个向量中获得组合导数。注意,每个策略评估都需要至少与环境完成一次完整的互动阶段,并且在每次迭代时对每个参数维度进行一次评估。因此,这一流程可能会花费很长的时间。如果你可以访问底层策略函数,假设因为你设计了该函数,那么可以更高效地以分析方式尝试和计算梯度。

但是这就意味着我们需要计算某个函数的预期值的梯度.听起来有点难。实际上这是一个得到广泛研究的问题。这里的奖励函数通常称之为得分函数,我们可以操纵该表达式以便更轻松地估算得分函数的梯度。我们来看看如何计算。

为了进行简化,我们将考虑某个依赖于 x 的随机得分函数 f,值 x 来自由参数 θ 定义的概率分布,这意味着我们可以将预期函数展开为一个积分或 x|θ 的概率乘以得分函数的和。注意,这里的梯度可以移到求和运算中,这样可以进一步简化公式。现在我们可以使用似然比技巧。首先,我们将分子和分母乘以 P[X|θ],然后将生成的分数替换为对数概率的导数。这是一个很有名的技巧。最后,我们将求和变回预期函数。注意,我们只需计算对数概率的导数,而不是得分函数,因为它并不直接依赖于 θ

回到强化部分。这是梯度表达式。用策略函数 π 替换概率分布,以及我们自己的得分函数 R,它可以是所有奖励或折扣奖励的和,或者其他基于值的函数。你可能会疑问,我们从这整个练习中获得了任何结果吗?看起来和之前的一样糟糕。我们来仔细看看它。我们可以通过与环境互动并对获得的奖励求和计算得分函数,如果我们有一个使用神经网络等估算器实现的策略函数,那么我们可以计算输出概率的对数以及导数。TensorFlow 或 PyTorch 等库可以帮助我们完成这一步。最后,我们可以通过抽取一批不同的样本以随机方式计算这个预期函数,我们可以使用这个梯度更新策略参数从而以迭代方式改善目标函数,因此我们可以根据它构建一个具体的算法。

5.蒙特卡洛策略梯度
我们设计策略梯度算法时将用到的第一个方法是蒙特卡洛抽样。

我们可以将该方法应用到可以拆分为独特阶段的任务。对于每个阶段或通过与策略 π 互动的轨线 τ,在该阶段中的每个时间步 t,我们首先计算策略函数生成的对数概率的梯度,乘以该阶段剩余时间步的回报,这是我们的得分函数,最后用某个很小的学习速率 α 更新权重。这称之为强化算法。

6.受限策略梯度
到目前为止,我们讨论了仅使用策略的优势部分作为目标函数的基于策略的方法,即我们预期从中获得多少奖励,意思是我们不关心该策略采取了什么操作,经历了什么状态,频率有多大,等等。我们只关心整体预期奖励。这样可以形成在目标函数空间内非常接近但是行为截然不同的两个策略。
我们来举一个有四条腿的行走机器人例子。一个策略可能使机器人这样行走。另一个策略可能使机器人的步法完全不一样。两个策略都是合理的解决方案。假设策略 A 是当前策略,策略 B 是梯度目标指向的策略,一个更好的策略。我们的优化算法将尝试更新参数以从 A 移到 B。但是并非一直这样。因为我们使用了学习步骤 α,因此我们进入一组中间策略参数,但是可能会导致很糟糕的性能。这在行走等复杂的控制任务中很常见。不同动作之间的坐标和时间非常重要,算法依然在学习改善策略并获得合理的结果,但是学习流程本身可能会非常不稳定并且效率很低。此外,在某些应用中,例如机器人,我们会处理电子机械组件,显著改变策略参数可能会破坏装置。因为这些原因,除了目标函数之外,我们还应该注意策略参数。实际上,我们可能需要对策略参数进行一些限制,只能以某种方式更改参数,或只能按照一定的数量更改参数。我们可以通过添加限制条件,在基于梯度的算法中实现这一点,要求两个策略之间的差异不能超过某个阈值 δ。

另一个添加这种限制条件的方式是向目标函数添加惩罚项,即该差异的某个乘数。如果我们尝试优化这个组合的目标函数,那么我们将能够获得更好的策略,但是在每一步差别并不是很大,这样可以使学习算法很稳定,有点像对机器学习算法进行正则化。

但是对于这两种方法,无论是添加限制条件还是惩罚项,我们都需要某种方式来量化两个策略之间的差异,计算两个策略之间的差异的一种简单方式是算出两组参数向量之间的差异并对该差异取范数,例如欧几里得范数。

如果你的策略是某个复杂的参数函数,当你使用深度神经网络或其他机器学习模型时就是这种情况,那么参数差异可能无法准确地反映策略行为之间的差异以及它们最终生成的动作之间的差异,为了得出一个更好的差异衡量方式,我们需要想出一个用到不同动作的概率分布的策略。当动作空间是连续空间时,这个思考角度尤其有用。思考下拖车问题的连续版本,不再有向左和向右的二元动作,你可以应用在 -1 到 +1 之间的任何大小的力,例如 -0.5 或 +0.8。我们的策略是这个动作范围的概率分布。注意,不同状态之间的分布可能不相同,如果是连续状态,我们可以将这些分布统一成一个状态和动作组合范围的连续分布。

假设有两个这样的策略:

每个都是状态和动作分布,如何比较这两个分布?

一种统计学衡量方法是 KL 散度。p 相对于 q 的 KL 散度定义为 p(x) 的积分乘以 p(x)/q(x) 的对数,我们可以将 log p(x)/q(x) 变换成 log p(x) - log q(x),这样可能更容易理解。这是原始分布p(x) 和 q(x),我们取这两个概率的对数,然后在每个点 x,我们将这两个对数概率相减,最后,我们用某个概率值缩放该差值,并在整个 x 的范围内求和。从图中可以看出,该区域是这两个对数概率分布的非重叠区域,但是使用其中一个概率作为参考,在每个位置 x 求和意味着 p 相对于 q 的 KL 散度,不等于 q 相对于 p 的散度。这是一个非对称距离衡量法。

我们将其应用到策略梯度的方式是计算当前策略 θ 与任何新候选策略 θ′ 之间的 KL 散度,然后使用这个差异项作为目标函数的限制条件。该项会惩罚使行为变化很大的新策略,因此,新策略必须带来更多价值才能被视为更好的策略。对于总体策略梯度算法,这有助于创建一个更稳定的学习流程,策略不会大幅度跳动。目前已经开发出了多个受限策略梯度变体版本,包括热门的置信域策略优化,简称 TRPO 算法,以及最近的近端策略优化 (PPO)。修改目标函数使我们能够内置多种限制条件,包括额外的损失函数,从而进一步指导智能体学习规律。

posted on 2019-03-12 19:45  paulonetwo  阅读(296)  评论(0编辑  收藏  举报

导航