这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战
本文为强化学习入门系列的第三篇,主要介绍如何通过动态规划来求解贝尔曼最优方程。
我们知道最优策略 π \pi π 对应的就是最优价值函数,而其求解分为策略迭代、价值迭代两种方法。本节将详细介绍这两种方法。
本节所讨论的MDP都是已知的MDP。已知的意思就是环境的动态特性是已知的,也就是 p ( s ′ , a ∣ s , a ) p(s',a | s,a) p ( s ′ , a ∣ s , a ) 这个概率密度函数是确定的。
策略迭代
策略迭代可以分为策略评估和策略改进两步骤。策略评估就是给定一个策略 π \pi π 求解状态价值函数 v π ( s ) v_{\pi}(s) v π ( s ) ,而策略改进就是寻求一个更优的策略 π ′ \pi' π ′ ,使得 v π ′ ( s ) > v π ( s ) v_{\pi'}(s)>v_{\pi}(s) v π ′ ( s ) > v π ( s ) 。
策略评估 Policy Evaluation
解析解推导
策略评估就是给定一个策略 π \pi π 求解贝尔曼方程 v π ( s ) v_{\pi}(s) v π ( s ) 。我们知道贝尔曼方程有如下形式:
v π ( s ) = ∑ a π ( a ∣ s ) ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ v π ( s ′ ) ] , ∀ s ∈ S v_{\pi}(s)=\sum_a \pi(a|s)\sum_{s',r}p(s',r|s,a)[r+\gamma v_{\pi}(s')]\;\;,\forall s\in S v π ( s ) = a ∑ π ( a ∣ s ) s ′ , r ∑ p ( s ′ , r ∣ s , a ) [ r + γ v π ( s ′ )] , ∀ s ∈ S
我们把 v π ( s ) , v π ′ ( s ) v_{\pi}(s),v_{\pi'}(s) v π ( s ) , v π ′ ( s ) 看成未知的,那其实可看出 v π ( s ) , v π ′ ( s ) v_{\pi}(s),v_{\pi'}(s) v π ( s ) , v π ′ ( s ) 之间是线性关系。因为状态 s s s 是有多个,所以 v π ( s ) v_{\pi}(s) v π ( s ) 可写成向量形式:
v π ( s ) = [ v π ( s 1 ) v π ( s 2 ) . . . v π ( s S ) ] ∣ S ∣ × 1 v_{\pi}(s)=
\begin{bmatrix}
v_{\pi}(s_1)\\v_{\pi}(s_2)\\...\\v_{\pi}(s_S)
\end{bmatrix}_{|S|\times1} v π ( s ) = ⎣ ⎡ v π ( s 1 ) v π ( s 2 ) ... v π ( s S ) ⎦ ⎤ ∣ S ∣ × 1
那问题实际上就是求解一个有 ∣ S ∣ |S| ∣ S ∣ 个未知量的线性方程组。我们用矩阵来表示 v π ( s ) , v π ′ ( s ) v_{\pi}(s),v_{\pi'}(s) v π ( s ) , v π ′ ( s ) 之间的关系,显然矩阵应该是 S × S S\times S S × S 维的。那接下来我们进一步化简方程组,方程组可拆开成如下两部分:
v π ( s ) = ∑ a π ( a ∣ s ) ∑ s ′ , r p ( s ′ , r ∣ s , a ) ⋅ r + ∑ a π ( a ∣ s ) ∑ s ′ , r p ( s ′ , r ∣ s , a ) ⋅ γ v π ( s ′ ) , ∀ s ∈ S v_{\pi}(s)=\sum_a \pi(a|s)\sum_{s',r}p(s',r|s,a)\cdot r+\sum_a \pi(a|s)\sum_{s',r}p(s',r|s,a)\cdot \gamma v_{\pi}(s')\;\;,\forall s\in S v π ( s ) = a ∑ π ( a ∣ s ) s ′ , r ∑ p ( s ′ , r ∣ s , a ) ⋅ r + a ∑ π ( a ∣ s ) s ′ , r ∑ p ( s ′ , r ∣ s , a ) ⋅ γ v π ( s ′ ) , ∀ s ∈ S
观察式子左边项,其实s ′ s' s ′ 可以被积分掉,也就变成 ∑ r p ( r ∣ s , a ) r \sum_{r}p(r|s,a)r ∑ r p ( r ∣ s , a ) r ,这就是一个期望的形式,把它定义成一个奖励函数 r ( s , a ) r(s,a) r ( s , a ) ,表示给定策略 π \pi π 下,状态 s s s 下采取动作 a a a 时的期望奖励。那左边项就变成 ∑ a π ( a ∣ s ) ⋅ r ( s , a ) \sum_a \pi(a|s)\cdot r(s,a) ∑ a π ( a ∣ s ) ⋅ r ( s , a ) 。我们知道 π \pi π 是关于a的一个概率分布,那对a积分,则可以把a消掉,左边项最终可以写成 r π ( s ) r_{\pi}(s) r π ( s ) 。r π ( s ) r_{\pi}(s) r π ( s ) 是一个 ∣ S ∣ × 1 |S|\times 1 ∣ S ∣ × 1 的矩阵。
再来观察式子右边项,γ \gamma γ 是一个常数,把r积分掉,则变成 γ ∑ a ∑ s ′ π ( a ∣ s ) p ( s ′ ∣ s , a ) v π ( s ′ ) \gamma \sum_a \sum_{s'}\pi(a|s)p(s'|s,a)v_{\pi}(s') γ ∑ a ∑ s ′ π ( a ∣ s ) p ( s ′ ∣ s , a ) v π ( s ′ ) ,令 P π ( s , s ′ ) = ∑ a ∑ s ′ π ( a ∣ s ) p ( s ′ ∣ s , a ) P_{\pi}(s,s')=\sum_a \sum_{s'}\pi(a|s)p(s'|s,a) P π ( s , s ′ ) = ∑ a ∑ s ′ π ( a ∣ s ) p ( s ′ ∣ s , a ) ,表示状态 s , s ′ s,s' s , s ′ 之间的转移概率矩阵,维度为 ∣ S ∣ × ∣ S ∣ |S|\times |S| ∣ S ∣ × ∣ S ∣ 。那么右边项最终可写成 γ P π ( s , s ′ ) v π ( s ′ ) \gamma P_{\pi}(s,s')v_{\pi}(s') γ P π ( s , s ′ ) v π ( s ′ ) 。
最后,式子化简为:
v π ( s ) = r π ( s ) + γ P π ( s , s ′ ) v π ( s ′ ) v π ( s i ) = r π ( s i ) + γ ∑ j = 1 ∣ S ∣ P π ( s i , s j ) v π ( s j ) v_{\pi}(s)=r_{\pi}(s)+\gamma P_{\pi}(s,s')v_{\pi}(s') \\
v_{\pi}(s_i)=r_{\pi}(s_i)+\gamma \sum_{j=1}^{|S|} P_{\pi}(s_i,s_j)v_{\pi}(s_j) v π ( s ) = r π ( s ) + γ P π ( s , s ′ ) v π ( s ′ ) v π ( s i ) = r π ( s i ) + γ j = 1 ∑ ∣ S ∣ P π ( s i , s j ) v π ( s j )
再进一步简写为:
v π = ( I − γ P π ) − 1 r π v_{\pi}=(I-\gamma P_{\pi})^{-1}r_{\pi} v π = ( I − γ P π ) − 1 r π
这个就是解析解。显然是一个 ∣ S ∣ × 1 |S|\times 1 ∣ S ∣ × 1 维的矩阵。由于涉及到矩阵运算,时间复杂度为 O ( ∣ S ∣ 3 ) O(|S|^3) O ( ∣ S ∣ 3 ) 。
数值解推导
解析解涉及矩阵运算,计算量较大,我们可以通过迭代求数值解。我们构造一个数列 { v k ( s ) } , k ∈ [ 1 , ∞ ] \{v_k(s)\},k\in[1,\infty] { v k ( s )} , k ∈ [ 1 , ∞ ] 。其中 v k v_k v k 时包含 ∣ S ∣ |S| ∣ S ∣ 个状态价值函数的函数向量。v k 、 v k + 1 v_k、v_{k+1} v k 、 v k + 1 根据贝尔曼方程我们可以写出其迭代关系:
v k + 1 ( s ) = E π [ R t + 1 + γ G t + 1 ∣ S t = s ] = E π [ R t + 1 + γ v k ( s ′ ) ∣ S t = s ] = ∑ a π ( a ∣ s ) ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ v k ( s ′ ) ] \begin{aligned}
v_{k+1}(s)
=& E_{\pi}[R_{t+1}+\gamma G_{t+1}\;|\;S_t=s] \\
=&E_{\pi}[R_{t+1}+\gamma v_{k}(s')\;|\;S_t=s] \\
=&\sum_a \pi(a|s)\sum_{s',r}p(s',r|s,a)[r+\gamma v_{k}(s')] \\
\end{aligned} v k + 1 ( s ) = = = E π [ R t + 1 + γ G t + 1 ∣ S t = s ] E π [ R t + 1 + γ v k ( s ′ ) ∣ S t = s ] a ∑ π ( a ∣ s ) s ′ , r ∑ p ( s ′ , r ∣ s , a ) [ r + γ v k ( s ′ )]
其实 v 1 , v 2 , . . . , v k v_1,v_2,...,v_{k} v 1 , v 2 , ... , v k 是通过迭代求得的价值函数的近似解,我们的目标就是使其收敛到 v π v_{\pi} v π 。这个v 1 v_1 v 1 是先通过随机动作来确定的,也就是一个随机的初始函数向量。
策略改进
当我们能估计 π ′ \pi' π ′ 时,我们想知道与当前策略 π \pi π 哪个好,就需要比较 v π , v π ′ v_{\pi},v_{\pi'} v π , v π ′ 。这就引出了策略改进定理。
策略改进定理 policy improvement theorem
【定义】给定 π , π ′ \pi,\pi' π , π ′ ,如果对于任意状态s,有 q π ( s , π ′ ( s ) ) ≥ v π ( s ) q_{\pi}(s,\pi'(s))\geq v_{\pi}(s) q π ( s , π ′ ( s )) ≥ v π ( s ) ,则 ∀ s ∈ S , v π ′ ( s ) ≥ v π ( s ) \forall s\in S,v_{\pi'}(s)\geq v_{\pi}(s) ∀ s ∈ S , v π ′ ( s ) ≥ v π ( s ) 。
这个定理把原先需要求两个状态价值函数变成只需求一个 v π ( s ) v_{\pi}(s) v π ( s ) 就好。
那如何证明?
我们先回顾动作价值函数:
q π ( s , a ) = E [ R t + 1 + γ ⋅ v π ( S t + 1 ) ∣ S t = s , A t = a ] = ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ v π ( s ′ ) ] q_{\pi}(s,a)=E[R_{t+1}+\gamma \cdot v_{\pi}(S_{t+1})\;|\;S_t=s,A_t=a]
=\sum_{s',r}p(s',r|s,a)[r+\gamma v_{\pi}(s')] q π ( s , a ) = E [ R t + 1 + γ ⋅ v π ( S t + 1 ) ∣ S t = s , A t = a ] = s ′ , r ∑ p ( s ′ , r ∣ s , a ) [ r + γ v π ( s ′ )]
值得注意的是,R t + 1 R_{t+1} R t + 1 和 π \pi π 其实是无关的,因为在(s,a)时,平均奖励 R t + 1 R_{t+1} R t + 1 已经获得了,而 π \pi π 影响的是下一时刻的状态 s t + 1 s_{t+1} s t + 1 对于动作的选择,R t + 2 R_{t+2} R t + 2 和 π \pi π 才有关。
我们把 π ′ ( s ) \pi'(s) π ′ ( s ) 代入动作 a a a ,表示 t t t 时刻的动作是由 π ′ \pi' π ′ 确定的,下一时刻的动作还是由 π \pi π 确定,所以 R t + 1 R_{t+1} R t + 1 和 π ′ \pi' π ′ 有关,之后的奖励和 π \pi π 有关,推导过程如下:
v π ( s ) ≤ q π ( s , π ′ ( s ) ) = E [ R t + 1 + γ ⋅ v π ( S t + 1 ) ∣ S t = s , A t = π ′ ( s ) ] = E π ′ [ R t + 1 + γ ⋅ v π ( S t + 1 ) ∣ S t = s ] ≤ E π ′ [ R t + 1 + γ ⋅ q π ( S t + 1 , π ′ ( S t + 1 ) ) ∣ S t = s ] ≤ E π ′ [ R t + 1 + γ R t + 2 + γ 2 ⋅ q π ( S t + 2 , π ′ ( S t + 2 ) ) ∣ S t = s ] ≤ E π ′ [ R t + 1 + γ R t + 2 + γ 2 R t + 3 + . . . + . . . ∣ S t + 1 = s ] = v π ′ ( s ) \begin{aligned}
v_{\pi}(s)\leq & q_{\pi}(s,\pi'(s))
\\ =& E[R_{t+1}+\gamma \cdot v_{\pi}(S_{t+1})\;|\;S_t=s,A_t=\pi'(s)]
\\ =& E_{\pi'}[R_{t+1}+\gamma \cdot v_{\pi}(S_{t+1})\;|\;S_t=s]
\\ \leq& E_{\pi'}[R_{t+1}+\gamma \cdot q_{\pi}(S_{t+1},\pi'(S_{t+1}))\;|\;S_t=s]
\\ \leq& E_{\pi'}[R_{t+1}+\gamma R_{t+2} +\gamma^2\cdot q_{\pi}(S_{t+2},\pi'(S_{t+2}))\;|\;S_t=s]
\\ \leq& E_{\pi'}[R_{t+1}+\gamma R_{t+2} +\gamma^2 R_{t+3}+...+...\;|\;S_{t+1}=s]
\\ =& v_{\pi'}(s)
\end{aligned} v π ( s ) ≤ = = ≤ ≤ ≤ = q π ( s , π ′ ( s )) E [ R t + 1 + γ ⋅ v π ( S t + 1 ) ∣ S t = s , A t = π ′ ( s )] E π ′ [ R t + 1 + γ ⋅ v π ( S t + 1 ) ∣ S t = s ] E π ′ [ R t + 1 + γ ⋅ q π ( S t + 1 , π ′ ( S t + 1 )) ∣ S t = s ] E π ′ [ R t + 1 + γ R t + 2 + γ 2 ⋅ q π ( S t + 2 , π ′ ( S t + 2 )) ∣ S t = s ] E π ′ [ R t + 1 + γ R t + 2 + γ 2 R t + 3 + ... + ... ∣ S t + 1 = s ] v π ′ ( s )
有了这一定理,我们怎么寻找最优的策略?一种比较直观的方法就是贪心方法。
对每个状态s,都选取其动作价值函数最大的的策略 π ′ \pi' π ′ ,即
∀ s ∈ S , π ′ ( s ) = arg max a q π ( s , a ) = = arg max a ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ v π ( s ′ ) ] \forall s\in S,\pi'(s)=\arg\max_a q_{\pi}(s,a)==\arg\max_a \sum_{s',r}p(s',r|s,a)[r+\gamma v_{\pi}(s')] ∀ s ∈ S , π ′ ( s ) = arg a max q π ( s , a ) == arg a max s ′ , r ∑ p ( s ′ , r ∣ s , a ) [ r + γ v π ( s ′ )]
根据策略改进定理,如果 q π ( s , π ′ ( s ) ) ≥ v π ( s ) q_{\pi}(s,\pi'(s))\geq v_{\pi}(s) q π ( s , π ′ ( s )) ≥ v π ( s ) ,则更新策略。直到某一时刻下 v π ′ ( s ) = v π ( s ) v_{\pi'}(s)= v_{\pi}(s) v π ′ ( s ) = v π ( s ) 时,则算法已收敛,这时也满足贝尔曼最优方程,此时的策略就是我们的最优策略。
简单的流程图如下:
价值迭代
在策略迭代中,我们每轮迭代的步骤是:先根据 π \pi π 评估 v π ( s ) v_{\pi}(s) v π ( s ) ,再采用贪心方法改进策略。但是在策略评估时,为了使价值函数收敛到 v π v_{\pi} v π 我们需要对所有状态都迭代若干次直到价值函数收敛,这就造成迭代中套娃迭代,计算非常麻烦。
那能不能减少迭代呢?有一个方法就是,在评估时只进行一次迭代,也就是对所有状态只扫描一次,接着进行策略改进。
v k + 1 ( s ) = max a E π [ R t + 1 + γ G t + 1 ∣ S t = s ] = max a E π [ R t + 1 + γ v k ( s ′ ) ∣ S t = s ] = max a ∑ a π ( a ∣ s ) ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ v k ( s ′ ) ] \begin{aligned}
v_{k+1}(s)
=& \max_a E_{\pi}[R_{t+1}+\gamma G_{t+1}\;|\;S_t=s] \\
=&\max_a E_{\pi}[R_{t+1}+\gamma v_{k}(s')\;|\;S_t=s] \\
=&\max_a \sum_a \pi(a|s)\sum_{s',r}p(s',r|s,a)[r+\gamma v_{k}(s')] \\
\end{aligned} v k + 1 ( s ) = = = a max E π [ R t + 1 + γ G t + 1 ∣ S t = s ] a max E π [ R t + 1 + γ v k ( s ′ ) ∣ S t = s ] a max a ∑ π ( a ∣ s ) s ′ , r ∑ p ( s ′ , r ∣ s , a ) [ r + γ v k ( s ′ )]
那这个其实就是贝尔曼最优方程。这样子就不需要反复迭代来求解 v π ( s ) v_{\pi}(s) v π ( s ) 了。
从过程来理解价值迭代与策略迭代的不同
价值迭代的过程是: v 1 → v 2 → v 3 → . . . → v ∗ v_1\rightarrow v_2\rightarrow v_3\rightarrow ...\rightarrow v_* v 1 → v 2 → v 3 → ... → v ∗
策略迭代的过程是: π 1 → v π 1 → π 2 → v π 2 → π 3 → v π 3 → . . . → π ∗ → v ∗ \pi_1\rightarrow v_{\pi_1}\rightarrow\pi_2\rightarrow v_{\pi_2}\rightarrow \pi_3\rightarrow v_{\pi_3}\rightarrow ...\rightarrow \pi_*\rightarrow v_{*} π 1 → v π 1 → π 2 → v π 2 → π 3 → v π 3 → ... → π ∗ → v ∗
显然,策略迭代需要先求精确的状态价值函数 ,然后不停更新策略。一次更新是对整个状态空间进行遍历。而价值迭代是在一次遍历后立即停止策略评估,这样对每个状态只进行一次更新,计算的是近似的价值函数。
价值迭代虽然计算简化,但仍需遍历一次状态空间,这种方法其实也称为同步动态规划(Synchronous DP) 。
事实上,还有一种更为简化的方法叫做就地策略迭代。属于异步动态规划Asynchronous DP 方法。即我们并不需要保持所有状态更新的同步,在某次更新中,不对状态集合 S 中的每一个状态都更新,而只随机选取其中的某一个状态的价值函数进行更新,其他状态保持不变 。这样减小计算,可以更快的达到收敛。
小结
本节介绍了如何用动态规划求解最优策略。动态规划是属于在model-based的情况下的算法,因为我们已经假定了环境的动态特性是已知的。动态规划分为策略迭代和价值迭代。策略迭代又分为两个步骤,一个是策略评估,一个是策略改进。策略评估用于计算给定策略的价值函数,属于精确计算。策略改进利用策略改进定理比较两个策略的价值函数,从而对策略进行更新。策略评估需要迭代计算,而策略迭代本身也是个迭代的过程,涉及到迭代中的迭代,造成计算非常复杂,于是就有了价值迭代。价值迭代可看出是特殊的策略迭代,其主要思想是在计算价值函数时只迭代一步,近似计算价值函数。价值迭代也称为同步动态规划。尽管计算简化,但价值迭代中对状态空间的每个状态都要更新一次,仍需遍历一次状态空间。为此,就有人提出异步的迭代思路——就地策略迭代。即我们并不需要保持所有状态更新的同步,在某次更新中,不对状态集合 S 中的每一个状态都更新,而只随机选取其中的某一个状态的价值函数进行更新,其他状态保持不变 。
参考
[1] sutton.Barto.《强化学习(第二版)》
[2] 动态规划——强化学习第四章 - 知乎 (zhihu.com)
[2] 【机器学习】白板推导系列(三十五) ~ 强化学习之动态规划_bilibili