微信公众号:李歪理,欢迎大家关注
上一章我们讨论了用马尔科夫假设来简化强化学习模型的复杂度,这一篇我们在马尔科夫假设和贝尔曼方程的基础上讨论使用动态规划(Dynamic Programming, DP)来求解强化学习的问题。
1. 动态规划和强化学习问题的联系
动态规划的关键点有两个:
- 一是问题的最优解可以由若干小问题的最优解构成,即通过寻找子问题的最优解来得到问题的最优解;
- 二是可以找到子问题状态之间的递推关系,通过较小的子问题状态递推出较大的子问题的状态。而强化学习的问题恰好是满足这两个条件的。
我们先看看强化学习的两个基本问题,具体的数学描述是这样:
预测问题:给定一个MDP(马尔科夫决策过程) ⟨ S , A , P , R , γ ⟩ \left\langle S,A,P,R,\gamma\right \rangle ⟨S,A,P,R,γ⟩ 和策略 π \pi π,或者给定一个MRP(马尔科夫奖励过程) ⟨ S , P π , R π , γ ⟩ \left\langle S, P^{\pi}, R^{\pi}, \gamma \right \rangle ⟨S,Pπ,Rπ,γ⟩ ,要求输出基于当前策略 π \pi π 的价值函数 $v_{\pi} $。
控制问题:给定一个MDP ⟨ S , A , P , R , γ ⟩ \left\langle S,A,P,R,\gamma\right \rangle ⟨S,A,P,R,γ⟩,要求确定最优价值函数 v ∗ v_{*} v∗ 和最优策略 π ∗ \pi_{*} π∗
那么如何找到动态规划和强化学习这两个问题的关系呢?
回忆一下上一篇中状态价值函数的贝尔曼方程:
v π ( s ) = ∑ a ∈ A π ( a ∣ s ) ( R s a + γ ∑ s ′ ∈ S P s s ′ a v π ( s ′ ) ) v_\pi(s) = \sum_{a \in \mathcal{A}} \pi(a \mid s) \left( \mathcal{R}^a_s + \gamma \sum_{s' \in \mathcal{S}} \mathcal{P}^a_{ss'} v_\pi(s') \right) vπ(s)=a∈A∑π(a∣s)(Rsa+γs′∈S∑Pss′avπ(s′))
从这个式子我们可以看出,我们可以定义出子问题求解每个状态的状态价值函数,同时这个式子又是一个递推的式子, 意味着利用它,我们可以使用上一个迭代周期内的状态价值来计算更新当前迭代周期某状态 s s s 的状态价值。可见,使用动态规划来求解强化学习问题是比较自然的。
2. 策略评估求解预测问题
首先,我们来看如何使用动态规划来求解强化学习的预测问题,即求解给定策略 π \pi π 的状态价值函数 v π ( s ) v_{\pi}(s) vπ(s) 的问题。这个问题的求解过程我们通常叫做策略评估(Policy Evaluation)。
策略评估主要有两种方法:
同步反向迭代,即在每次迭代过程中,对于第 k+1 次迭代,所有的状态
s
s
s 的价值用
v
k
(
s
’
)
v_k(s’)
vk(s’) 计算并更新该状态第 k+1 次迭代中使用的价值
v
k
(
s
)
v_{k}(s)
vk(s) ,其中
s
’
s’
s’ 是
s
s
s 的后继状态。
此种方法通过反复迭代最终将收敛至
v
π
v_{\pi}
vπ
异步反向迭代,即在第k次迭代使用当次迭代的状态价值来更新状态价值。一次迭代内,状态s的价值等于前一次迭代该状态的即时奖励与所有s的下一个可能状态s’ 的价值与其概率乘积的和。
同步反向迭代的基本思路是从任意一个状态价值函数开始,依据给定的策略,结合贝尔曼期望方程、状态转移概率和奖励同步迭代更新状态价值函数,直至其收敛,得到该策略下最终的状态价值函数。
异步反向迭代在后面介绍,先详细说一下同步反向迭代。
假设我们在第k轮迭代已经计算出了所有的状态的状态价值,那么在第k+1轮我们可以利用第k轮计算出的状态价值计算出第k+1轮的状态价值。这是通过贝尔曼方程来完成的,即:
v k + 1 ( s ) = ∑ a ∈ A π ( a ∣ s ) ( R s a + γ ∑ s ′ ∈ S P s s ′ a v k ( s ′ ) ) v_{k+1}(s) = \sum_{a \in \mathcal{A}} \pi(a|s) \left( \mathcal{R}_s^a + \gamma \sum_{s' \in \mathcal{S}} \mathcal{P}_{ss'}^a v_k(s') \right) vk+1(s)=a∈A∑π(a∣s)(Rsa+γs′∈S∑Pss′avk(s′))
示意图:
和上一节的式子唯一的区别是由于我们的策略 π \pi π 已经给定,我们不再写出,对应加上了迭代轮数的下标。
v π ( s ) = ∑ a ∈ A π ( a ∣ s ) ( R s a + γ ∑ s ′ ∈ S P s s ′ a v π ( s ′ ) ) v_\pi(s) = \sum_{a \in \mathcal{A}} \pi(a \mid s) \left( \mathcal{R}^a_s + \gamma \sum_{s' \in \mathcal{S}} \mathcal{P}^a_{ss'} v_\pi(s') \right) vπ(s)=a∈A∑π(a∣s)(Rsa+γs′∈S∑Pss′avπ(s′))
我们每一轮可以对计算得到的新的状态价值函数再次进行迭代,直至状态价值的值改变很小(收敛),那么我们就得出了预测问题的解,即给定策略的状态价值函数 v ( π ) v(\pi) v(π)
下面我们用一个具体的例子来说明策略评估的过程。
举例-方格的世界
状态空间S:如图。S1 - S14非终止状态,ST终止状态(上图灰色方格所示两个位置);
动作空间A: { n , e , s , w } \{n, e, s, w\} {n,e,s,w} 对于任何非终止状态可以有东南西北移动四个动作;
转移概率P:任何试图离开方格世界的动作其位置将不会发生改变,其余条件下将100%地转移到动作指向的状态;
即时奖励R:任何在非终止状态间的转移得到的即时奖励均为-1,进入终止状态即时奖励为0;
衰减系数 γ \gamma γ:1;
当前策略 π \pi π:Agent采用随机行动策略,在任何一个非终止状态下有均等的几率采取任一移动方向这个行为,即
π ( n ∣ ⋅ ) = π ( e ∣ ⋅ ) = π ( s ∣ ⋅ ) = π ( w ∣ ⋅ ) = 0.25 \pi(n|\cdot)=\pi(e|\cdot)=\pi(s|\cdot)=\pi(w|\cdot)=0.25 π(n∣⋅)=π(e∣⋅)=π(s∣⋅)=π(w∣⋅)=0.25
问题:评估在这个方格世界里给定的策略(即算出当前给定策略下每个状态的价值)。
首先我们初始化所有格子的状态价值为0,如上图 k=0 的时候。现在我们开始策略迭代了。由于终止格子的价值固定为0,我们可以不将其加入迭代过程。在 k=1 的时候,我们利用上面的贝尔曼方程先计算第二行第一个格子的价值:
v 1 21 = 0.25 ∗ [ ( − 1 + 0 ) + ( − 1 + 0 ) + ( − 1 + 0 ) + ( − 1 + 0 ) ] = − 1 v_1^{21}=0.25*[(-1+0)+(-1+0)+(-1+0)+(-1+0)]=-1 v121=0.25∗[(−1+0)+(−1+0)+(−1+0)+(−1+0)]=−1
第二行第二个格子的价值是:
v 1 22 = 0.25 ∗ [ ( − 1 + 0 ) + ( − 1 + 0 ) + ( − 1 + 0 ) + ( − 1 + 0 ) ] = − 1 v_1^{22}=0.25*[(-1+0)+(-1+0)+(-1+0)+(-1+0)]=-1 v122=0.25∗[(−1+0)+(−1+0)+(−1+0)+(−1+0)]=−1
其他的格子都是类似的,第一轮的状态价值迭代的结果如上图 k=1 的时候。现在我们第一轮迭代完了。开始动态规划迭代第二轮了。还是看第二行第一个格子的价值:
v 2 21 = 0.25 ∗ [ ( − 1 + 0 ) + ( − 1 − 1 ) + ( − 1 − 1 ) + ( − 1 − 1 ) ] = − 1.75 v_2^{21}=0.25*[(-1+0)+(-1-1)+(-1-1)+(-1-1)]=-1.75 v221=0.25∗[(−1+0)+(−1−1)+(−1−1)+(−1−1)]=−1.75
第二行第二个格子的价值是:
v 2 22 = 0.25 ∗ [ ( − 1 − 1 ) + ( − 1 − 1 ) + ( − 1 − 1 ) + ( − 1 − 1 ) ] = − 2 v_2^{22}=0.25*[(-1-1)+(-1-1)+(-1-1)+(-1-1)]=-2 v222=0.25∗[(−1−1)+(−1−1)+(−1−1)+(−1−1)]=−2
最终得到的结果是上图 k=2 的时候。第三轮的迭代如下:
v 3 21 = 0.25 ∗ [ ( − 1 − 1.7 ) + ( − 1 − 2 ) + ( − 1 − 2 ) + ( − 1 + 0 ) ] = − 2.425 v_3^{21}=0.25*[(-1-1.7)+(-1-2)+(-1-2)+(-1+0)]=-2.425 v321=0.25∗[(−1−1.7)+(−1−2)+(−1−2)+(−1+0)]=−2.425
v 3 22 = 0.25 ∗ [ ( − 1 − 1.7 ) + ( − 1 − 1.7 ) + ( − 1 − 2 ) + ( − 1 − 2 ) ] = − 2.85 v_3^{22}=0.25*[(-1-1.7)+(-1-1.7)+(-1-2)+(-1-2)]=-2.85 v322=0.25∗[(−1−1.7)+(−1−1.7)+(−1−2)+(−1−2)]=−2.85
最终得到的结果是上图 k=3 的时候。就这样一直迭代下去,直到每个格子的策略价值改变很小为止。这时我们就得到了所有格子的基于随机策略的状态价值。
可以看到,动态规划的策略评估计算过程并不复杂,但是如果我们的问题是一个非常复杂的模型的话,这个计算量还是非常大的。
4. 策略迭代求解控制问题
上面我们讲了使用策略评估求解预测问题,现在我们再来看如何使用动态规划求解强化学习的第二个问题控制问题。一种可行的方法就是根据我们之前基于任意一个给定策略评估得到的状态价值来及时调整我们的动作策略,这个方法我们叫做策略迭代(Policy Iteration)。
如何调整呢?最简单的方法就是贪婪法。考虑一种如下的贪婪策略:个体在某个状态下选择的行为是其能够到达后续所有可能的状态中状态价值最大的那个状态。
还是以第三节的例子为例,如上面的图右边。当我们计算出最终的状态价值后,我们发现,第二行第一个格子周围的价值分别是0,-18,-20,此时我们用贪婪法,则我们调整行动策略为向状态价值为0的方向移动,而不是随机移动。也就是图中箭头向上。而此时第二行第二个格子周围的价值分别是-14,-14,-20, -20。那么我们整行动策略为向状态价值为-14的方向移动,也就是图中的向左向上。
如果用一副图来表示策略迭代的过程的话,如下图:
在策略迭代过程中,我们循环进行两部分工作,第一步是使用当前策略 π ∗ \pi_{*} π∗ 评估计算当前策略的最终状态价值 v ∗ v_{*} v∗,第二步是根据状态价值 v ∗ v_{*} v∗ 根据一定的方法(比如贪婪法)更新策略 π ∗ \pi_{*} π∗,接着回到第一步,一直迭代下去,最终得到收敛的策略 π ∗ \pi_{*} π∗ 和状态价值 v ∗ v_{*} v∗
5. 价值迭代求解控制问题
观察第三节的图发现,我们如果用贪婪法调整动作策略,那么当 k=3 的时候,我们就已经得到了最优的动作策略。而不用一直迭代到状态价值收敛才去调整策略。那么此时我们的策略迭代优化为价值迭代。
还是以第三节的例子为例,如上面的图右边。比如当 k=2 时,第二行第一个格子周围的价值分别是0,-2,-2,此时我们用贪婪法,则我们调整行动策略为向状态价值为0的方向移动,而不是随机移动。也就是图中箭头向上。而此时第二行第二个格子周围的价值分别是-1.7,-1.7,-2, -2。那么我们整行动策略为向状态价值为-1.7的方向移动,也就是图中的向左向上。
和上一节相比,我们没有等到状态价值收敛才调整策略,而是随着状态价值的迭代及时调整策略, 这样可以大大减少迭代次数。此时我们的状态价值的更新方法也和策略迭代不同。现在的贝尔曼方程迭代式子如下:
v k + 1 ( s ) = max a ∈ A ( R s a + γ ∑ s ′ ∈ S P s s ′ a v k ( s ′ ) ) v_{k+1}(s) = \max_{a \in \mathcal{A}} \left( R^a_s + \gamma \sum_{s' \in \mathcal{S}} P^a_{ss'} v_k(s') \right) vk+1(s)=a∈Amax(Rsa+γs′∈S∑Pss′avk(s′))
原本的贝尔曼方程迭代式子:
v π ( s ) = ∑ a ∈ A π ( a ∣ s ) ( R s a + γ ∑ s ′ ∈ S P s s ′ a v π ( s ′ ) ) v_\pi(s) = \sum_{a \in \mathcal{A}} \pi(a \mid s) \left( \mathcal{R}^a_s + \gamma \sum_{s' \in \mathcal{S}} \mathcal{P}^a_{ss'} v_\pi(s') \right) vπ(s)=a∈A∑π(a∣s)(Rsa+γs′∈S∑Pss′avπ(s′))
可见由于策略调整,我们现在价值每次更新倾向于贪婪法选择的最优策略对应的后续状态价值,这样收敛更快。
6. 异步动态规划算法
在前几节我们讲的都是同步动态规划算法,即每轮迭代我会计算出所有的状态价值并保存起来,在下一轮中,我们使用这些保存起来的状态价值来计算新一轮的状态价值。
另一种动态规划求解是异步动态规划算法,在这些算法里,每一次迭代并不对所有状态的价值进行更新,而是对每个状态单独、以任意顺序进行回溯。对于每个被选中的状态,应用相应的回溯操作可以显著减少计算量,只要所有状态都持续被选中,算法就能保证收敛。
常见的异步动态规划算法有三种:
(1)原位动态规划 (in-place dynamic programming)
我们不会另外保存一份上一轮计算出的状态价值。而是即时计算即时更新。这样可以减少保存的状态价值的数量,节约内存。代价是收敛速度可能稍慢。
在同步价值迭代中我们会保存两份价值函数的拷贝,对于所有状态空间 S S S 中的 s s s,有:
V n e w ( s ) ← max a ∈ A ( R s a + γ ∑ s ′ ∈ S P s s ′ a V o l d ( s ′ ) ) V o l d ← V n e w \begin{align*} \textcolor{red}{V_{new}\big(\mathbf{s}\big)} &\gets \max_{a \in \mathcal{A}} \left( \mathcal{R}_{s}^{a} + \gamma \sum_{s' \in \mathcal{S}} \mathcal{P}_{ss'}^{a} \textcolor{red}{V_{old}\big(\mathbf{s}'\big)} \right) \\ \textcolor{red}{V_{old} \gets V_{new}} \end{align*} Vnew(s)Vold←Vnew←a∈Amax(Rsa+γs′∈S∑Pss′aVold(s′))
原位动态规划只保存一份价值函数的拷贝,对于所有状态空间 S S S 中的 s s s,有:
v ( s ) ← max a ∈ A ( R s a + γ ∑ s ′ ∈ S P s s ′ a v ( s ′ ) ) \textcolor{red}{v(\mathbf{s})} \gets \max_{a \in \mathcal{A}} \left( \mathcal{R}_s^a + \gamma \sum_{s' \in \mathcal{S}} \mathcal{P}_{ss'}^a\, \textcolor{red}{v(\mathbf{s}')} \right) v(s)←a∈Amax(Rsa+γs′∈S∑Pss′av(s′))
第二种是优先级动态规划 (prioritised sweeping):该算法对每一个状态进行优先级分级,优先级越高的状态其状态价值优先得到更新。通常使用贝尔曼误差来评估状态的优先级,贝尔曼误差即新状态价值与前次计算得到的状态价值差的绝对值。选择误差最大的状态进行更新。这样可以加快收敛速度,代价是需要维护一个优先级队列。
∣ max a ∈ A ( R s a + γ ∑ s ′ ∈ S P s s ′ a v ( s ′ ) ) − v ( s ) ∣ \left| \max_{a \in \mathcal{A}} \left( \mathcal{R}_s^a + \gamma \sum_{s' \in \mathcal{S}} \mathcal{P}_{ss'}^a v(s') \right) - v(s) \right| a∈Amax(Rsa+γs′∈S∑Pss′av(s′))−v(s)
第三种是实时动态规划 (real-time dynamic programming):实时动态规划直接使用个体与环境交互产生的实际经历来更新状态价值,对于那些个体实际经历过的状态进行价值更新。这样个体经常访问过的状态将得到较高频次的价值更新,而与个体关系不密切、个体较少访问到的状态其价值得到更新的机会就较少。收敛速度可能稍慢。
v ( S t ) ← max a ∈ A ( R S t a + γ ∑ s ′ ∈ S P S t s ′ a v ( s ′ ) ) \textcolor{red}{v(S_t)} \gets \max_{a \in \mathcal{A}} \left( \textcolor{red}{\mathcal{R}^{a}_{S_t}} + \gamma \sum_{s' \in \mathcal{S}} \mathcal{P}^{a}_{\textcolor{red}{S_t} s'}\, \textcolor{red}{v(s')} \right) v(St)←a∈Amax(RSta+γs′∈S∑PSts′av(s′))
7. 动态规划求解强化学习问题小结
动态规划是我们讲到的第一个系统求解强化学习预测和控制问题的方法。它的算法思路比较简单,主要就是利用贝尔曼方程来迭代更新状态价值,用贪婪法之类的方法迭代更新最优策略。
动态规划算法使用全宽度(full-width)的回溯机制来进行状态价值的更新,也就是说,无论是同步还是异步动态规划,在每一次回溯更新某一个状态的价值时,都要回溯到该状态的所有可能的后续状态,并利用贝尔曼方程更新该状态的价值。这种全宽度的价值更新方式对于状态数较少的强化学习问题还是比较有效的,但是当问题规模很大的时候,动态规划算法将会因贝尔曼维度灾难而无法使用。因此我们还需要寻找其他的针对复杂问题的强化学习问题求解方法。
下一篇我们讨论用蒙特卡罗方法来求解强化学习预测和控制问题的方法。