一个确定的策略能将状态映射到行为上。输入一个状态,函数将反馈一个要执行的行为。
确定的策略用在确定的环境,行动执行的环境决定了结果,不存在不确定性。例如,当你下国际象棋把兵从A2移到A3时,你是确定你的兵要移到A3。
另一方面,一个随机的策略输出一个行为集可能的指派。
这意味着不是确定地选择行为a,而是我们有可能能选择不同的(例子中30%的可能,我们选择南)。
随机策略用在环境不确定的情况下。这一个过程也叫部分可测马尔科夫决策过程(POMDP)。
大多数情况下,我们使用第二种策略类型。
优势
深度Q学习已经很厉害,为什么要用策略强化学习方法?
深度学习在使用策略梯度时有三大主要优势:
收敛
策略函数有更好的收敛特性。价值函数在训练时有个问题就是大的震荡。这是因为行为的选择在测算的行为值中可能会戏剧性地任意变小。
另一方面,利用策略梯度,我们仅是循着梯度寻找最佳值。一个平滑的更新出现在每一步中。
由于循着梯度寻找最佳值,我们确保收敛于局部最大值(最坏的情况)或是全局最大值(最好情况)。
策略梯度在高维空间更有效
第二个优势是策略梯度在高维空间或是连续行动时更有效。
深度Q学习的一个问题是它在每一步的预测中对给定当前状态的每一个可能行为分配一个分值(最大化预测将来的奖励)。
但如果是无限可能的行动呢?
例如,在自动驾驶时,在每一个状态中,可能会有近乎无限行为的选择。(调整车轮15°,17.2°,19,4°,鸣笛…)。我们需要为每一个行动输出一个Q值。
另一方面,在策略函数中,要直接调整参数(你将要理解什么是最大值),而不是在每一步估算最大值。
策略梯度能学习随机策略
第三个优势是策略梯度能学习随机策略,而价值函数不能。这也导致两个结果。
其一,我们不需要应用探测和开发的权衡。一个随机策略允许智能体在状态空间探索而不是一直采用相同的行为。这是因为它输出一个行为集上的概率分布。其结果是它将处理探测和开发的权衡而不是硬编码。
我们同样去除感知混淆的问题,它是说我们在两个看起来(或实际上)相同的状态,却需要不同的行为。
例如,我们有一个智能吸尘器,它的目标是吸掉灰尘和避免杀死仓鼠。
我们的吸尘器仅能检测到墙在哪里。
问题:两个红色的方格是相似的状态,因为智能体都能感知到两面上下部的墙。
在确定的策略下,在红色的状态下,智能体选择要么是往右,要么往左,都可能导致智能体被卡住而不能吸尘了。
另一方面,一个优化的随机策略在灰色的格子中时将随机往左或往右移动。其结果是智能体不会被卡住,并能在最大可能的情况下达到目标状态。
劣势
策略梯度有个天然的大劣势。在绝大多数情况下,它将在收敛于局部最大值而不是全局最大值。
尽管如此,我们将看到问题的解决方案。
策略选择
带参数θ的策略π输出行动集的概率分布。
给定状态S,采取带参θ行动a的概率
可怕的是我们怎样才能知道我们的策略是好的呢?
记住策略可被看做是优化问题。我们必须寻找到最佳参数(θ)来最大化得分函数J(θ)。
这里有两步:
这里的主要思想是J(θ)来告诉我们的策略π有多好。策略梯度上升将帮助我们发现最佳策略参数来最大化良好行动的采样。
第一步:策略评分函数J(θ)
为测量我们的策略有多好,我们使用目标函数(或策略评分函数)来计算期望的策略奖励。
有三种等价的方法来优化策略。选择仅仅取决于环境和目标。
首先,在一个情景的环境中,我们取一个开始值,并计算从第一步(G1)开始反馈的均值。这是第整个情景的累积的贴现奖励。
思想很简单,即如果我一直从状态s1开始,从开始状态到结束状态的整体奖励是多少呢?
例如,在突围游戏中,我新玩了一局,但我在破坏了20块砖后丢失了球(游戏结束)。新的情景始终从相同的状态开始。
我利用J1(θ)来计算得分。撞击20个板砖已属不错,但是我想改进得分。为此,我需要通过调参来改进我行为的概率分布。这些在第二步中做。在一个连续的环境中,因为我们不能依赖特定的开始状态,所以我们可以使用平均值。每个状态值通过对应状态发生的概率来加权(因为有些更可能发生)。
第三,使用每步的平均奖励以使我们每步都要获得最高的奖励。
第二步:策略梯度上升
我们有一个策略得分函数告诉我们策略有多好。现在,我们要找寻最大化得分函数的参数θ。最大化得分函数意味着找到最优策略。
为最大化得分函数J(θ),我们需要在策略参数上做梯度上升。
梯度上升是梯度下降的反转。记住梯度永远指向最速变化。
在梯度下降中,我们在函数中选择最速下降方向。同理在梯度上升时,我们在函数中选择最速上升方向。
为何是梯度上升而不是梯度下降?因为我们要在错误函数中使用梯度下降来求最小值。
但是得分函数不是错误函数,它要求最大值的,所以我们使用梯度上升。
思想是找到相应梯度,以使当前策略π在迭代中最大增量方向上更新参数。
我们要找到最好的参数θ*用以最大化得分:
我们的得分函数可以被如下定义:
这是给定策略下期望奖励的总和。
现在,因为我们要做梯度上升,所以要去微分我们的得分函数J(θ)。它也可被如下定义:
我们用这种方式写出函数来展示我们面对的问题。
我们知道策略参数影响行为如何被选择,即我们获得什么样的奖励、我们将看到什么样的状态、有多频繁。
因此,寻找为确保改进的策略的变化可能是个挑战。这是因为性能依赖于行为选择和选择做出后的状态分布。这两者都受策略参数的影响。策略参数在行为上的影响很容易发现,但是在状态分布的情况下怎样发现策略的影响?环境的函数是未知的。
因此,我们面临这样的问题:当梯度依赖于在状态分布下的策略改变的未知影响时,我们利用策略θ的对应来怎么评估梯度。
解决方案是使用策略梯度原理。利用涉及策略θ不包含状态分布的差异方面,为J(θ)(表现)的梯度提供一个分析性表示。
所以,我们如下计算:
记住,我们在随机策略的情况中。这意味着我们的策略输出一个概率分布π(τ;θ)。它将输出给定当前参数θ时的采取步骤(s0,a0,r0…)的概率。
但是,要微分概率函数是比较困难的,除非我们能将其转换为对数。这将使得概率函数能被简单地微分。
这里我们将使用似然比的方法来将结果部分替换成log概率。
现在,让我们将总和转换为一个期望:
正如你所见,我们仅需要计算log策略函数的导数。
我们已经做了很多推导,现在,我们能得出策略梯度的结论:
这个策略梯度告诉我们如果要获得一个更高的得分应怎样通过改变参数θ来转变策略分布。
R(tau)像是个标量值:
如果R(tau)高了,就意味着我们采取行动平均情况下会导致高奖励。我们要推动可见行为的概率(提高采取这些行为的概率)。
另一方面,如果R(tau)低了,我们要降低可见行为的概率。
梯度的策略导致参数在有最高回报的最支持的行动的方向上移动。
蒙特卡洛策略梯度
在笔记中,鉴于我们的任务能分为若干阶段,我们将使用蒙特卡洛方法来设计策略梯度算法。
Initializeθforeachepisodeτ=S0,A0,R1,S1,…,ST:fort<--1toT-1:Δθ=αtheta(logπ(St,At,θ))Gtθ=θ+ΔθForeachepisode:Ateachtimestepwithinthatepisode:Computethelogprobabilitiesproducedbyourpolicyfunction.Multiplyitbythescorefunction.Updatetheweights但是我们在使用该算法时面临一个问题。因为我们仅在每个阶段结束时计算R值,我们将会平均所有行为。哪怕部分行为是非常糟糕的,如果我们的分值是非常高的,这样所有行为都会被平均成好的。
要想有一个正确的策略,我们就需要大量的采样,这将导致很慢的学习。
行为评价器:一个价值算法和策略算法的混合体。
近端策略梯度:确保跟前一个策略的偏差相对小。
我们拍了一段视频,利用Tensorflow在死亡模式下的Doom游戏中应用策略梯度智能体:
综上所述,你已经创建了一个能学习在Doom环境下生存的智能体。厉害吧!
别忘了亲自应用每一个部分代码,这非常重要。尝试增加时代、改变架构、修改学习率、使用更好的硬件环境等等,尽情享受吧!
AI研习社每日更新精彩内容,观看更多精彩内容:雷锋网雷锋网雷锋网