刚刚的例子很简单,在状态转移图中没有“环”,因此我们可以从末状态开始,计算他的价值,然后回到开始状态。然而,如果环境中有“环”,会给我们带来麻烦:
求
s
1
,
s
2
s_1,s_2
s1,s2的价值?每个episode的奖励顺序是
[
1
,
2
,
1
,
2
,
1
,
2
,
1
,
2
,
…
]
[1,2,1,2,1,2,1,2,…]
[1,2,1,2,1,2,1,2,…]。
V
(
s
1
)
=
∑
i
=
0
∞
γ
2
i
+
2
γ
2
i
+
1
=
1
+
γ
(
2
+
γ
(
1
+
γ
(
2
+
⋯
)
)
)
V\left( s_1 \right) =\sum_{i=0}^{\infty}{\gamma ^{2i}+2\gamma ^{2i+1}}=1+\gamma \left( 2+\gamma \left( 1+\gamma \left( 2+\cdots \right) \right) \right)
V(s1)=i=0∑∞γ2i+2γ2i+1=1+γ(2+γ(1+γ(2+⋯)))
V
(
s
2
)
=
∑
i
=
0
∞
2
γ
2
i
+
γ
2
i
+
1
=
2
+
γ
(
1
+
γ
(
2
+
γ
(
1
+
⋯
)
)
)
V\left( s_2 \right) =\sum_{i=0}^{\infty}{2\gamma ^{2i}+\gamma ^{2i+1}}=2+\gamma \left( 1+\gamma \left( 2+\gamma \left( 1+\cdots \right) \right) \right)
V(s2)=i=0∑∞2γ2i+γ2i+1=2+γ(1+γ(2+γ(1+⋯)))
对于该问题的解,可以使用数值方法求近似解,也可以通过变形求解析解,即解方程组
{
V
(
s
1
)
=
1
+
γ
V
(
s
2
)
V
(
s
2
)
=
2
+
γ
V
(
s
1
)
\left\{ \begin{array}{l} V\left( s_1 \right) =1+\gamma V\left( s_2 \right)\\ V\left( s_2 \right) =2+\gamma V\left( s_1 \right)\\ \end{array} \right.
{V(s1)=1+γV(s2)V(s2)=2+γV(s1)
我们可以从这个例子抽取一个更为一般的算法,称为值迭代算法(value iteration),能够通过数值方法计算具有已知转移概率和reward的马尔可夫决策过程(MDP)的状态价值和动作价值。
状态价值的计算包括以下步骤:
- 初始化状态价值 V i V_i Vi(一般设为0)
- 对于MDP中的每个状态s,使用Bellman方程更新状态价值: V s ← max a ∑ s ′ p a , s → s ′ ( r s , a + γ V s ′ ) V_s\gets \max _a\sum_{s'}{p_{a,s\rightarrow s'}\left( r_{s,a}+\gamma V_{s'} \right)} Vs←maxa∑s′pa,s→s′(rs,a+γVs′)
- 重复第二步,直到状态价值的变化很小为止
动作价值的估计和状态价值几乎一样:
- 初始化动作价值 Q s , a Q_{s,a} Qs,a(一般设为0)
- 对于MDP中的每个状态s和动作a,做以下更新: Q s , a ← ∑ s ′ p a , s → s ′ ( r s , a + γ max a ′ Q s ′ , a ′ ) Q_{s,a}\gets \sum_{s'}{p_{a,s\rightarrow s'}\left( r_{s,a}+\gamma \max _{a'}Q_{s',a'} \right)} Qs,a←∑s′pa,s→s′(rs,a+γmaxa′Qs′,a′)
- 重复第二步,直到动作价值的变化很小为止。
在实践中,这种方法有几个明显的局限性。首先,我们的状态空间应该是离散的,而且维数不能太大,可以在所有状态上执行多次迭代。这对于FrozenLake-4x4甚至FrozenLake-8x8来说都不是问题,但对于CartPole来说,其observation_space是四个浮点数,没法直接用这个离散的算法。将观察值离散化是一个可行的方案。例如,可以将CartPole的观测空间拆分为多段,并将每段视为单个离散状态。然而,这又会带来另一个问题,例如间隔应该取多大;需要从环境中获取多少数据来估计价值。
第二个问题是,我们并不知道奖励矩阵和状态转移矩阵。我们只有agent与环境交互的每个episode。然而,在Bellman方程的更新中,我们需要为每一次状态转移的概率和奖励值。因此,这个问题的明显需要对两个未知量估计。对于奖励,只需记录每次状态转移时获得的奖励即可;为了估计概率,我们需要为每个元组(s0,s1,a)维护一个计数器,用频率估计概率。