本系列为学习赵世钰老师的《强化学习的数学原理》所作的学习笔记.
本节我们将介绍强化学习中的策略迭代求解方法.
2.2.1 算法步骤
跟值迭代类似, 策略迭代也是一个迭代的方法, 主要分为策略计算(PE)和策略提升(PI)两步.
2.2.1.1 策略计算(PE)
首先在当前策略 π k \pi_k πk的基础上, 计算状态值 v π k v_{\pi_k} vπk, 实际就是求解贝尔曼公式:
v π k = r π k + γ P π k v π k , v_{\pi_k}=r_{\pi_k}+\gamma P_{\pi_k} v_{\pi_k}, vπk=rπk+γPπkvπk,
在1.4.4 贝尔曼公式求解中, 我们介绍了有两种求解方式:解析解和迭代求解. 但是解析解需要求逆矩阵, 所以常采用迭代求解的方式:
v π k ( j + 1 ) = r π k + γ P π k v π k ( j ) , j = 0 , 1 , 2 , … v_{\pi_k}^{(j+1)}=r_{\pi_k}+\gamma P_{\pi_k} v_{\pi_k}^{(j)}, \quad j=0,1,2, \ldots vπk(j+1)=rπk+γPπkvπk(j),j=0,1,2,…
它的展开形式为:
v π k ( j + 1 ) ( s ) = ∑ a π k ( a ∣ s ) ( ∑ r p ( r ∣ s , a ) r + γ ∑ s ′ p ( s ′ ∣ s , a ) v π k ( j ) ( s ′ ) ) , s ∈ S v_{\pi_k}^{(j+1)}(s)=\sum_a \pi_k(a \mid s)\left(\sum_r p(r \mid s, a) r+\gamma \sum_{s^{\prime}} p\left(s^{\prime} \mid s, a\right) v_{\pi_k}^{(j)}\left(s^{\prime}\right)\right), \\ \quad s \in \mathcal{S} vπk(j+1)(s)=a∑πk(a∣s)(r∑p(r∣s,a)r+γs′∑p(s′∣s,a)vπk(j)(s′)),s∈S
其中 v π k ( j ) v_{\pi_k}^{(j)} vπk(j)是上一轮迭代的状态值, 初值可以设置为任意值. 直到 ∥ v π k ( j + 1 ) − v π k ( j ) ∥ < e p s i l o n \left\|v_{\pi k}^{(j+1)}-v_{\pi k}^{(j)}\right\|<epsilon vπk(j+1)−vπk(j) <epsilon, 则认为已经收敛.
2.2.1.2 策略提升(PI)
有了状态值 v π k v_{\pi_k} vπk之后, 我们求解最优化问题, 得到新的最优策略 π k + 1 \pi_{k+1} πk+1:
π k + 1 = arg max π ( r π + γ P π v π k ) . \pi_{k+1}=\arg \max _\pi\left(r_\pi+\gamma P_\pi v_{\pi_k}\right) . πk+1=argπmax(rπ+γPπvπk).
π k + 1 \pi_{k+1} πk+1一定优于 π k \pi_{k} πk, 详细证明可以前往书中查看. 展开形式写作:
π k + 1 ( s ) = arg max π ∑ a π ( a ∣ s ) ( ∑ r p ( r ∣ s , a ) r + γ ∑ s ′ p ( s ′ ∣ s , a ) v π k ( s ′ ) ) ⏟ q π k ( s , a ) , s ∈ S , \pi_{k+1}(s)=\arg \max _\pi \sum_a \pi(a \mid s) \underbrace{\left(\sum_r p(r \mid s, a) r+\gamma \sum_{s^{\prime}} p\left(s^{\prime} \mid s, a\right) v_{\pi_k}\left(s^{\prime}\right)\right)}_{q_{\pi_k}(s, a)}, \\ s \in \mathcal{S}, πk+1(s)=argπmaxa∑π(a∣s)qπk(s,a) (r∑p(r∣s,a)r+γs′∑p(s′∣s,a)vπk(s′)),s∈S,
之前我们介绍过, 最优策略一定是贪婪确定策略:
π k + 1 ( a ∣ s ) = { 1 , a = a k ∗ ( s ) , 0 , a ≠ a k ∗ ( s ) . \pi_{k+1}(a \mid s)= \begin{cases}1, & a=a_k^*(s), \\ 0, & a \neq a_k^*(s) .\end{cases} πk+1(a∣s)={1,0,a=ak∗(s),a=ak∗(s).
并且就是使得动作值 q π k q_{\pi_k} qπk最大的动作 a = a k ∗ ( s ) a=a_k^*(s) a=ak∗(s):
a k ∗ ( s ) = arg max a q π k ( s , a ) a_k^*(s)=\arg \max _a q_{\pi_k}(s, a) ak∗(s)=argamaxqπk(s,a)
2.2.1.3 伪代码
完整的伪代码如图, 算法的策略迭代最终一定会收敛到最优解, 书中也给出了详细证明
v π 0 ≤ v π 1 ≤ v π 2 ≤ ⋯ ≤ v π k ≤ ⋯ ≤ v ∗ v_{\pi_0} \leq v_{\pi_1} \leq v_{\pi_2} \leq \cdots \leq v_{\pi_k} \leq \cdots \leq v^* vπ0≤vπ1≤vπ2≤⋯≤vπk≤⋯≤v∗
2.2.2 例子1
仿真世界如图所示, 奖励设计如下:
- 抵达边界的奖励是-1: r boundary = − 1 r_{\text {boundary }}=-1 rboundary =−1
- 抵达终点的奖励是1: r target = 1 r_{\text {target }}=1 rtarget =1
- γ = 0.9 \gamma=0.9 γ=0.9
- 其他行为奖励是0
我们将初始策略随机设置为图示: 动作都是往左.
2.2.2.1 k=0
(1) 策略计算(PE)
首先求解贝尔曼公式, 因为这个式子非常简单, 我们可以直接求出解析解:
v π 0 ( s 1 ) = − 1 + γ v π 0 ( s 1 ) ⇒ v π 0 ( s 1 ) = − 10 , v π 0 ( s 2 ) = 0 + γ v π 0 ( s 1 ) ⇒ v π 0 ( s 2 ) = − 9. \begin{aligned}& v_{\pi_0}\left(s_1\right)=-1+\gamma v_{\pi_0}\left(s_1\right)\Rightarrow v_{\pi_0}\left(s_1\right)=-10, \\& v_{\pi_0}\left(s_2\right)=0+\gamma v_{\pi_0}\left(s_1\right)\Rightarrow v_{\pi_0}\left(s_2\right)=-9 .\end{aligned} vπ0(s1)=−1+γvπ0(s1)⇒vπ0(s1)=−10,vπ0(s2)=0+γvπ0(s1)⇒vπ0(s2)=−9.
不过一般我们会用迭代方法计算, 过程如下:
{ v π 0 ( 1 ) ( s 1 ) = − 1 + γ v π 0 ( 0 ) ( s 1 ) = − 1 , v π 0 ( 1 ) ( s 2 ) = 0 + γ v π 0 ( 0 ) ( s 1 ) = 0 , { v π 0 ( 2 ) ( s 1 ) = − 1 + γ v π 0 ( 1 ) ( s 1 ) = − 1.9 , v π 0 ( 2 ) ( s 2 ) = 0 + γ v π 0 ( 1 ) ( s 1 ) = − 0.9 , { v π 0 ( 3 ) ( s 1 ) = − 1 + γ v v π 0 ( 2 ) ( s 1 ) = − 2.71 , v π 0 ( 3 ) ( s 2 ) = 0 + γ v π 0 ( 2 ) ( s 1 ) = − 1.71 , . . . \begin{aligned}& \left\{\begin{array}{l}v_{\pi_0}^{(1)}\left(s_1\right)=-1+\gamma v_{\pi_0}^{(0)}\left(s_1\right)=-1, \\v_{\pi_0}^{(1)}\left(s_2\right)=0+\gamma v_{\pi_0}^{(0)}\left(s_1\right)=0,\end{array}\right. \\& \left\{\begin{array}{l}v_{\pi_0}^{(2)}\left(s_1\right)=-1+\gamma v_{\pi_0}^{(1)}\left(s_1\right)=-1.9, \\v_{\pi_0}^{(2)}\left(s_2\right)=0+\gamma v_{\pi_0}^{(1)}\left(s_1\right)=-0.9,\end{array}\right. \\& \left\{\begin{array}{l}v_{\pi_0}^{(3)}\left(s_1\right)=-1+\gamma v v_{\pi_0}^{(2)}\left(s_1\right)=-2.71, \\v_{\pi_0}^{(3)}\left(s_2\right)=0+\gamma v_{\pi_0}^{(2)}\left(s_1\right)=-1.71,\end{array}\right.\end{aligned}\\ ... {vπ0(1)(s1)=−1+γvπ0(0)(s1)=−1,vπ0(1)(s2)=0+γvπ0(0)(s1)=0,{vπ0(2)(s1)=−1+γvπ0(1)(s1)=−1.9,vπ0(2)(s2)=0+γvπ0(1)(s1)=−0.9,{vπ0(3)(s1)=−1+γvvπ0(2)(s1)=−2.71,vπ0(3)(s2)=0+γvπ0(2)(s1)=−1.71,...
最终的结果也是收敛到: v π 0 ( s 1 ) = − 10 , v π 0 ( s 2 ) = − 9 v_{\pi_0}\left(s_1\right)=-10, v_{\pi_0}\left(s_2\right)=-9 vπ0(s1)=−10,vπ0(s2)=−9
(2) 策略提升(PI)
这里我们需要计算最优动作值, 因此需要计算出所有的动作值. 这个仿真场景, 完整的计算公式如下:
我们将 v π 0 ( s 1 ) = − 10 , v π 0 ( s 2 ) = − 9 v_{\pi_0}\left(s_1\right)=-10, v_{\pi_0}\left(s_2\right)=-9 vπ0(s1)=−10,vπ0(s2)=−9 代入到式子中
可以看得出来, 最优动作是:
π 1 ( a r ∣ s 1 ) = 1 , π 1 ( a 0 ∣ s 2 ) = 1 \pi_1\left(a_r \mid s_1\right)=1, \quad \pi_1\left(a_0 \mid s_2\right)=1 π1(ar∣s1)=1,π1(a0∣s2)=1
因为这个例子非常简单, 显然可以看出来这已经是最优解了.
2.2.3 例子2
这里我们给出了一个更复杂的例子:
仿真世界如图所示, 奖励设计如下:
- 抵达禁止格或边界的奖励是-1: r boundary = r forbidden = − 1 r_{\text {boundary }}=r_{\text {forbidden }}=-1 rboundary =rforbidden =−1
- 抵达终点的奖励是1: r target = 1 r_{\text {target }}=1 rtarget =1
- γ = 0.9 \gamma=0.9 γ=0.9
- 其他行为奖励是0
这里我们将初始策略全部初始化为原地不动, 然后开始迭代. 迭代的过程不再详细描述, 用图片展示每一轮迭代的结果
2.2.4 截断策略迭代
2.2.4.1 值迭代和策略迭代对比
之前我们介绍了这两种迭代方式, 这里我们归纳一下它们的迭代过程:
(1) 策略迭代
π 0 → P E v π 0 → P I π 1 → P E v π 1 → P I π 2 → P E v π 2 → P I … \pi_0 \xrightarrow{P E} v_{\pi_0} \xrightarrow{P I} \pi_1 \xrightarrow{P E} v_{\pi_1} \xrightarrow{P I} \pi_2 \xrightarrow{P E} v_{\pi_2} \xrightarrow{P I} \ldots π0PEvπ0PIπ1PEvπ1PIπ2PEvπ2PI…
- PE(已知 π k \pi_k πk, 求解 v π k v_{\pi_k} vπk): v π k = r π k + γ P π k v π k . v_{\pi_k}=r_{\pi_k}+\gamma P_{\pi_k} v_{\pi_k} . vπk=rπk+γPπkvπk.
- PI(已知 v π k v_{\pi_k} vπk, 求解 π k + 1 \pi_{k+1} πk+1): π k + 1 = arg max π ( r π + γ P π v π k ) . \pi_{k+1}=\arg \max _\pi\left(r_\pi+\gamma P_\pi v_{\pi_k}\right) . πk+1=argmaxπ(rπ+γPπvπk).
(2) 值迭代
v 0 → P U π 1 ′ → V U v 1 → P U π 2 ′ → V U v 2 → P U … v_0 \xrightarrow{P U} \pi_1^{\prime} \xrightarrow{V U} v_1 \xrightarrow{P U} \pi_2^{\prime} \xrightarrow{V U} v_2 \xrightarrow{P U} \ldots v0PUπ1′VUv1PUπ2′VUv2PU…
- PU(已知 v k v_{k} vk, 求解 π k + 1 \pi_{k+1} πk+1): π k + 1 = arg max π ( r π + γ P π v k ) . \pi_{k+1}=\arg \max _\pi\left(r_\pi+\gamma P_\pi v_k\right) . πk+1=argmaxπ(rπ+γPπvk).
- VU(已知 π k + 1 \pi_{k+1} πk+1, 求解 v k + 1 v_{k+1} vk+1): v k + 1 = r π k + 1 + γ P π k + 1 v k . v_{k+1}=r_{\pi_{k+1}}+\gamma P_{\pi_{k+1}} v_k . vk+1=rπk+1+γPπk+1vk.
2.2.4.2 截断策略迭代
这里通过一个表格展现他们的迭代的过程区别, 可以看到一个比较明显的区别是
值迭代的 v k + 1 v_{k+1} vk+1是直接计算出来的; 但是策略迭代的 v π k v_{\pi_k} vπk是通过一个小迭代算法计算的:
v π 1 ( 0 ) = v 0 v π 1 ( 1 ) = r π 1 + γ P π 1 v π 1 ( 0 ) v π 1 ( 2 ) = r π 1 + γ P π 1 v π 1 ( 1 ) ⋮ 截断策略迭代 ← v ˉ 1 ⟵ v π 1 ( j ) = r π 1 + γ P π 1 v π 1 ( j − 1 ) ⋮ 策略迭代 ← v ˉ 1 ⟵ v π 1 ( ∞ ) = r π 1 + γ P π 1 v π 1 ( ∞ ) \begin{aligned}v_{\pi_1}^{(0)} & =v_0 \\v_{\pi_1}^{(1)} & =r_{\pi_1}+\gamma P_{\pi_1} v_{\pi_1}^{(0)} \\v_{\pi_1}^{(2)} & =r_{\pi_1}+\gamma P_{\pi_1} v_{\pi_1}^{(1)} \\\vdots & \\ \text { 截断策略迭代 } \leftarrow \bar{v}_1 \longleftarrow v_{\pi_1}^{(j)} & =r_{\pi_1}+\gamma P_{\pi_1} v_{\pi_1}^{(j-1)} \\\vdots & \\ \text { 策略迭代 } \leftarrow \bar{v}_1 \longleftarrow v_{\pi_1}^{(\infty)} & =r_{\pi_1}+\gamma P_{\pi_1} v_{\pi_1}^{(\infty)}\end{aligned} vπ1(0)vπ1(1)vπ1(2)⋮ 截断策略迭代 ←vˉ1⟵vπ1(j)⋮ 策略迭代 ←vˉ1⟵vπ1(∞)=v0=rπ1+γPπ1vπ1(0)=rπ1+γPπ1vπ1(1)=rπ1+γPπ1vπ1(j−1)=rπ1+γPπ1vπ1(∞)
截断策略迭代就是在策略迭代的基础上, 限制计算 v π k v_{\pi_k} vπk的最大迭代次数; 比如上式中, 迭代 j j j次之后直接结束迭代.
因为限制了小迭代的次数, 求得的 v π k v_{\pi_k} vπk可能并未完全收敛到 v π k ∗ v_{\pi_k}^* vπk∗附近; 因此阶段策略迭代整体收敛速度, 是慢于策略迭代的, 优于值迭代, 如上图所示.
但是每一次迭代的计算时间, 显然是值迭代<截断策略迭代<策略迭代. 所以算法的整体效率是由两方面决定的.