只要游戏日志完备,该函数考查在时间t0时所采取的行动a并返回命中值h(t)的加权和,以及该游戏所有未来步骤。在这里,如果我们在步骤t时命中,h(t)则为1,否则为0。
在到达(2)时, 我们承认并不对所有可能的收益函数集合进行仔细搜索。但我们肯定这一选择会有很好的游戏效果,它们有良好的目的性:具体地说,我们注意到加权项(0.5)t−t0(0.5)t−t0 能强烈地激发当前步骤的命中率 (对于在t0时命中,我们得到的收益为11 ), 但在(t0+1)(t0+1)时命中的行为在 t0t0 时也有收益—— 其值为0.50.5。同样,在 (t0+2)(t0+2) 时命中收益为0.250.25, 依此类推。 (2)的这种超前加权起到了鼓励有效探索棋局的作用:它迫使程序顾及有利于未来命中的步骤。 (2) 中出现的其他要素是减去h(t)¯¯¯¯¯¯¯¯¯h(t)¯。 这是随机网络会获得的预期收益。通过将该项除去,我们的网络只有表现超过随机选择才有收益——该收益是这一学习过程的净加速。
随机递减
为了训练我们的算法在游玩期间收益最大化,我们运用了递减法。为了表现这一点,我们设想让我们的网络参数 θθ 在游戏的某些特定步骤发生改变。对所有可能的步骤进行平均,于是有了预期收益的梯度公式,
这里, p(a)p(a) 的值是我们网络行动的概率输出。
不过,我们通常无法求得上述最后一行的值。但我们可以用抽样值进行迫近:我们只是用我们当前网络玩游戏,因此我们用在第 ii次移动时所获得的实际收益取代上述的预期收益,
这里aiai 是所采取的行动, r(ai)r(ai)是获得的收益,可以通过反向传播求该对数的导数(对于那些熟悉神经网络的人来说:这是叉熵损失函数的导数,当你处理类似督导学习训练事例的事件时,可以用所选择行动 aiai 做为标记以应用该函数)。函数g^ig^i 提供理想梯度的噪声估计,但步骤多了会导致“随机”递减,一般推动我们朝着正确的收益最大化前进。
训练过程总结
总之,RL训练是迭代进行:要起动迭代步骤,首先我们用我们当前的策略网络玩游戏,随机地根据网络输出选择移动步骤。在游戏结束后,我们通过计算每次移动所获得的收益来对结果打分,例如在战舰游戏中,我们用(22)。 一旦完成这一步,我们就用 (44)来估计收益函数的梯度。最后,我们用αα小步长步骤参数更新网络参数 θ→θ+α∑g^iθ→θ+α∑g^i, 接着,我们用经过更新的网络继续玩新的游戏,依此类推。
要明白这一过程实际上是鼓励在练习中产生良好结果的行动,注意 (44) 与在步骤 ii中所获收益成比例的。因此,我们在 (44)的方向上调整参数,我们极力鼓励那些产生很大收益结果的行动。另外,收益为负的步骤受到抑制。网络按这种方式经过一段时间后将学会考察这一系统并提出可能产生最佳结果的步骤。
这说的是深度策略梯度RL的基础。我们现在回到我们战舰python示例上来。
Python 代码流程 — 战舰 RL
加载所需的包。
定义我们的网络——一个全面相联的三层系统。下面代码基本上是 tensorflow 标准本,通过了其第一教程就可得出。有一项非同凡响的事是我们已将(26)集的学习速度定为占位符值 (9) 。这将让我们用下列所观察到的捕获收益改变我们的步长。
其次,我们定义了让我们用我们的网络玩游戏的方法。变量TRAINNING决定了我们是否采取理想步骤或选择随机步骤。请注意该方法返回一组记录游戏过程的日志集。这些是训练所需要的。