上一节中我们讲了策略迭代。它有两个循环,一个是在策略估计的时候,为了求当前策略的值函数需要迭代很多次。另外一个是外面的大循环,就是策略评估,策略提升这个循环。我们不禁要问:真的需要这么多次迭代吗?我们真的需要求得值函数的精确解吗?为了回答这个问题,我们先看一个例子。
这个例子就是网格世界问题。我们只看其中一次的策略评估过程。利用策略评估中值函数的更新公式,我们得到每次迭代后的值函数和对应的策略如下所示:
当
很大时,值函数收敛了,如最后一行所示。但是你们有没有发现,当
之后,策略就保持不变了(图中箭头分布完全一样)。换句话说,
迭代3轮后执行策略提升和迭代
轮后得到的策略是一样的(
出现这种情况的原因可以简单的理解为:决策的时候只关注状态值的相对大小,而不是绝对值
)。注意这里每迭代一轮表示所有的状态
的“值”都更新一次。书中用sweep一词,可以理解为所有状态扫一遍。这也是我们用迭代多少“轮”而不是多少“次”的原因。因为说迭代多少次容易误解为有多少个状态被更新了。
值迭代算法
上面的例子启发我们可以缩减策略评估过程中迭代的次数。那么一个特殊的情况就是我们只执行一次迭代(所有状态更新一次)。这就是值迭代算法。在值迭代中,我们只更新值函数,而没有中间策略提升的环节。它的值函数更新公式如下:
这个公式直接一看,我们就发现这不就是贝尔曼最优方程的迭代形式吗?根据前面的内容,这个迭代一定收敛到最优的值函数
,对应的我们就得到了最优策略。
另一种理解这个表达式的思路是(自己的理解):它结合策略提升和策略评估两个过程。为什么这么说呢?因为(4.10)与正常策略评估的区别是多了在动作
上的最大化操作。你可以假想有一个确定性策略,它每次选择贪婪的选择动作。所以
中
其实代表了策略提升,
代表了只执行一轮迭代的策略评估。这样不就是综合两个过程了嘛。受到这个启发,我们还可以在一轮值迭代中执行多轮策略评估。表现出来就是执行若干轮
更新,然后执行一轮
更新。往往这种更新方式收敛更快。我们把所有这类方法叫做
截断策略迭代算法(truncated policy iteration)。从名字就可以看出它和策略迭代很像,只是缩减策略评估的迭代轮数。并且把两个过程融合成了一个更新表达式。
伪代码
过程很简单,核心就是根据(4.10)求最优值函数,然后最优策略就是针对最优值函数的贪婪策略。
关于值迭代算法和策略迭代算法的深入比较,什么时候用值迭代,什么时候用策略迭代?本人目前也没有深入研究。但是貌似是有说道的,后续看到了再补充。也欢迎大家赐教。