Skip to content

Commit

Permalink
docs: 4.4 价值迭代
Browse files Browse the repository at this point in the history
  • Loading branch information
qiwihui committed Mar 17, 2019
1 parent d349e52 commit e836ffb
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 37 deletions.
116 changes: 79 additions & 37 deletions source/partI/chapter4/dynamic_programming.rst
Original file line number Diff line number Diff line change
Expand Up @@ -375,49 +375,91 @@ DP和增强学习思想的核心通常说来是用价值函数去组织构建一
定性地描述计算 :math:`v_*` 的策略迭代算法中按照3,2,1的顺序的每一步所需要的改变。


4.4 值迭代
4.4 价值迭代
--------------

策略迭代的一个缺点是每一次迭代过程都包含策略评估,策略评估本身就可能是需要多次对整个状态集迭代计算的过程。如果策略评估需要迭代计算,那么只能在极限处准确收敛到 :math:`v_\pi` 。我们一定要等到准确的收敛吗?是否可以中途停止?图
4.1
中的例子显然表明截短策略评估是可行的。在那个例子中,策略评估超过三次迭代后对相应的贪婪策略没有影响。
实际上,策略迭代过程中的策略评估步骤可以用几种方法截短而不会失去收敛性。一个重要的特例就是策略评估在一次迭代之后就停止(每个状态只有一个回溯)。这个算法就叫做 *值迭代* 。可以被写成一个特殊的结合策略提升和截短之后的策略评估步骤的简单回溯操作:
策略迭代的一个缺点是每一次迭代过程都包含策略评估,策略评估本身就可能是需要多次对整个状态集迭代计算的过程。
如果策略评估需要迭代计算,那么只能在极限处准确收敛到 :math:`v_\pi`。
我们一定要等到准确的收敛吗?是否可以中途停止?图4.1中的例子显然表明截断策略评估是可行的。
在那个例子中,策略评估超过三次迭代后对相应的贪婪策略没有影响。

实际上,策略迭代过程中的策略评估步骤可以用几种方法截断而不会失去收敛性。
一个重要的特例就是策略评估在一次迭代之后就停止(每个状态只有一个回溯)。这个算法就叫做 *价值迭代* 。
可以被写成一个特殊的结合策略提升和截断之后的策略评估步骤的简单回溯操作:

.. math::
:label: 4.10
\begin{aligned}
v_{k+1}(s)&\doteq \max_a\mathbb{E}[R_{t+1}+\gamma v_{k}(S_{t+1}) | S_t=s,A_t=a] \\
&= \max_a\sum_{s',r}p(s',r|s,a)[r+\gamma v_{k}(s')],
\end{aligned}
对所有的 :math:`s\in\mathcal{S}`。
对于任意的 :math:`v_0`,在保证 :math:`v_*` 存在的同样的条件下:math:`\{v_k\}` 序列可以收敛到 :math:`v_*`。

另一种理解价值迭代的方法参考贝尔曼方程(4.1)。注意价值迭代仅仅是将贝尔曼最优方程转变为更新规则。
另外注意到价值迭代的回溯过程是如何与策略评估的回溯(4.5)等价,它需要采取所有动作中能够达到最大值的那一个。
另外一种看待这个相近关系的方法是比较这些算法的回溯图:
价值评估算法展示了策略评估的回溯图,图3.4中左图展示了价值迭代的回溯图。
这两个是计算 :math:`v_\pi` 和 :math:`v_*` 的本质回溯操作。

最后,让我们考虑价值迭代如何终止。类似策略评估,价值迭代一般需要无穷次的迭代才能准确的收敛到 :math:`v_*` 。
实际操作中,只要价值函数在一次更新中只改变一小点我们就停止价值迭代。如下是在这种停止条件下的完整的算法。

.. admonition:: 价值迭代,用于估算 :math:`\pi \approx \pi_*`
:class: important

算法参数:小的阈值 :math:`\theta > 0` 确定估计的准确性

对所有 :math:`s\in\mathcal{S}`,初始化 :math:`V(s)` 为任意值,其中 :math:`V(终点)=0`

重复:

:math:`v\leftarrow{V(s)}`

:math:`V(s){\leftarrow}\max_a\sum_{s',r}p(s',r|s,a)[r+\gamma{V(s')}]​`

:math:`\Delta{\leftarrow}{\max(\Delta,|v-V(s)|)}`

直到 :math:`\Delta<\theta` (一个小的正数)

输出确定的策略 :math:`\pi\approx{\pi_*}` ,满足 :math:`\pi(s)=\arg\max_a\sum_{s',r}p(s',r|s,a)[r+\gamma{V(s')}]`

价值迭代在更新过程中高效地结合了一轮策略评估更新和一轮策略提升更新。
在每一轮的策略提升过程中插入多轮的策略评估更新往往能够取得更加快速的收敛效果。
通常情况下,被截断的策略迭代算法的整个类可以被认为是一系列的更新,这些更新有的用策略评估回溯方法,有的用价值迭代回溯方法。
既然(4.10)那些回溯的唯一不同是最大化操作,这就意味着最大化操作加到了策略评估的操作中。
基于有衰减的有限MDP,所有这些算法都收敛到一个最优策略。

**例 4.3:赌徒问题** 一个赌徒对掷硬币的游戏进行下注。如果硬币正面朝上,他将赢得押在这一掷上的所有赌注,
如果是反面朝上,他将输掉所押的赌注。如果赌徒赢得100美元或者输光了钱那么游戏结束。
每一次掷硬币,赌徒要决定押多少钱,这些钱必须是整数美元。
这个问题可以被建模为一个无衰减,回合式的有限MDP。
状态是赌徒的资本,:math:`s\in \{1,2,\dots,99\}`,
动作是押注多少,:math:`a\in \{0,1,\dots,\min(s,100-s)\}`。
赌徒达到目标时奖励是+1,其他转移过程都为0。状态价值函数给出了从每个状态出发能够赢得的概率。
策略是从资本多少到押注的一个映射。最优策略最大化达到目标的概率。
:math:`p_h` 代表硬币正面朝上的概率。如果 :math:`p_h` 知道了,那么整个问题都清楚了,并且可以被解决,比如用价值迭代方法。
图4.3展示出了价值函数经过成功的价值迭代更新后的变化,并且找到了 :math:`p_h=0.4` 情况下最终的策略。
这个策略是最优的,但不是唯一的。实际上,有很多最优策略,都取决于相对于最优价值函数选取的argmax动作。
你能想象出所有的最优策略是什么样的吗?

.. firgure:: iamges/figure-4.3.png

**图4.3:** :math:`p_h=0.4` 情况下赌徒问题的解。上面的图是经过价值迭代成功地更新找到的价值函数。
下面是最终的策略。

**练习4.8** 为什么赌徒问题的最优策略有这样奇怪的形式?
尤其是,在资本剩余50美元的时候需要押注所有在一次投掷上,但是对于资本剩余51美元的时候却没有这样做。
为什么这会是一个好的策略?

**练习4.9(编程)** 实现赌徒问题的价值迭代算法并且求解 :math:`p_h=0.25` 和 :math:`p_h=0.55` 的情况。
在编程的时候,设置两个对应于终止状态资本剩余为0和100情况的虚拟状态可能会比较方便,分别赋予0和1。
像图4.3那样用图展示出你的结果。随着 :math:`\theta\leftarrow 0` 你的结果是否稳定?

**练习4.10** 类似于(4.10)的值迭代的回溯图,写出动作价值 :math:`q_{k+1}(s,a)`。

\begin{aligned}
v_{k+1}(s)&\overset{\cdot}{=}\max_a\mathbb{E}[R_{t+1}+\gamma v_{k}(S_{t+1}) | S_t=s,A_t=a]\\
&=\max_a\sum_{s',r}p(s',r|s,a)[r+\gamma v_{k}(s')],
\end{aligned}
\tag{4.10}
对所有的 :math:`s\in{S}` 。对于任意的 :math:`v_0` ,在保证 :math:`v_*` 存在的同样的条件下{:math:`v_k`}序列可以收敛到 :math:`v_*` 。
另一种理解值迭代的方法参考贝尔曼方程(4.1)。注意值迭代仅仅是将贝尔曼最优方程转变为更新规则。另外注意到值迭代的回溯过程如何与策略评估的回溯(4.5)等价除了需要采取所有动作中能够达到最大值的那一个。另外一种看待这个相近关系的方法是比较这些算法的回溯图:图3.4(左)展示了策略评估的回溯图,图3.7(左)展示了值迭代的回溯图。这两个是计算 :math:`v_\pi` 和 :math:`v_*` 的本质回溯操作。
最后,让我们考虑值迭代如何终止。类似策略评估,值迭代一般需要无穷次的迭代才能准确的收敛到 :math:`v_*` 。实际操作中,只要值函数在一次更新中只改变一小点我们就停止值迭代。如下是在这种停止条件下的完整的算法。

值迭代
初始化数组 :math:`V` 为任意值(例如, :math:`V(s)=0` 对所有 :math:`s\in{S^+}` )
重复 :math:`\Delta{\leftarrow}0` 对每个 :math:`s\in{S}`:
:math:`v\leftarrow{V(s)}`
:math:`V(s){\leftarrow}\max_a\sum_{s',r}p(s',r|s,a)[r+\gamma{V(s')}]​`
:math:`\Delta{\leftarrow}{\max(\Delta,|v-V(s)|)}`
直到 :math:`\Delta<\theta` (一个小的正数)
输出确定的策略, :math:`\pi\approx{\pi_*}` ,满足
:math:`\pi(s)=\arg\max_a\sum_{s',r}p(s',r|s,a)[r+\gamma{V(s')}]`

值迭代在更新过程中高效的结合了一轮策略评估更新和一轮策略提升更新。在每一轮的策略提升过程中插入多轮的策略评估更新往往能够取得更加快速的收敛效果。通常情况下,被截短的策略迭代算法的整个类可以被认为是一系列的更新,这些更新有的用策略评估回溯方法,有的用值迭代的回溯方法。既然(4.10)那些回溯的唯一不同是最大化操作,这就意味着最大化操作加到了策略评估的操作中。基于有折扣有限MDPs所有这些算法都收敛到一个最优策略。
**例 4.3:赌徒问题**
一个赌徒对掷硬币的游戏进行下注。如果硬币正面朝上,他将赢得押在这一掷上的所有赌注,如果是反面朝上,他将输掉所押的赌注。如果赌徒赢得100美元或者输光了钱那么游戏结束。每一次掷硬币,赌徒要决定押多少钱,这些钱必须是整数美元。这个问题可以被建模为一个无折扣,回合式,有限MDP。状态是赌徒的资本, :math:`s\in` {1,2,…,99},动作是押注多少,:math:`a\in` {0,1,…,:math:`\min(s,100-s)`}。赌徒达到目标时奖励是+1,其他转移过程都为0。状态值函数给出了从每个状态出发能够赢得概率。策略是从资本多少到押注的一个映射。最优策略最大化达到目标的概率。 :math:`p_h` 代表硬币正面朝上的概率。如果 :math:`p_h` 知道了,那么整个问题都清楚了,并且可以被解决,比如用值迭代方法。图4.3展示出了值函数经过成功的值迭代更新后的变化,并且找到了 :math:`p_h=0.4` 情况下最终的策略。这个策略是最优的,但不是唯一的。实际上,有很多最优策略,取决于相对于最优值函数选取的argmax动作。你能想象出所有的最优策略是什么样的吗?
|RL|
图4.3: :math:`p_h=0.4` 情况下赌徒问题的解。上面的图是经过值迭代成功的更新找到的值函数。下面是最终的策略。

**练习4.8**
为什么赌徒问题的最优策略有这样奇怪的形式?尤其是,在资本剩余50美元的时候需要押注所有在一次投掷上,但是对于资本剩余51美元的时候却没有这样做。为什么这会是一个好的策略?
**练习4.9(编程)**
实现赌徒问题的值迭代算法并且求解 :math:`p_h=0.25` 和 :math:`p_h=0.55` 的情况。在编程的时候,设置两个对应于终止状态资本剩余为0和100情况的虚拟状态可能会比较方便,分别赋予0和1。像图4.3那样用图展示出你的结果。随着 :math:`\theta\leftarrow 0` 你的结果是否稳定?
**练习4.10**
写出动作值, :math:`q_{k+1}(s,a)` ,类似于(4.10)的值迭代的回溯图。

4.5 异步动态规划
------------------
Expand Down
File renamed without changes

0 comments on commit e836ffb

Please sign in to comment.