Skip to content

Commit 1108520

Browse files
committed
第四章润色版本更新
1 parent e58979f commit 1108520

13 files changed

Lines changed: 632 additions & 109 deletions

.history/README_20251024010504.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<div align="center">
2+
<p><a href="https://wgyhhhh.github.io/Mathematical-Foundations-of-Reinforcement-Learning-Notes/Preface1/">📚 在线阅读地址</a></p>
3+
<h3>🤖 《强化学习中的数学原理》-个人笔记与思考总结</h3>
4+
<p><em>理解强化学习的数学原理,并通过实例深入掌握核心算法</em></p>
5+
</div>
6+
7+
## 🎯 笔记介绍
8+
9+
&emsp;&emsp;本笔记是对赵世钰老师所著《强化学习中的数学原理》的个人思考与总结,**笔者将其做成了网页模式,方便大家随时随地在掌上设备阅读**。在此基础上,我还补充了对书中核心算法的实现,以便读者能获得更直观的理解。书中首先从基础概念入手,讲解Bellman公式和Bellman最优公式,接着扩展到基于模型(model-based)和无模型(model-free)的强化学习算法,最终推广到基于函数逼近的强化学习算法。若读者在强化学习方面没有背景知识,只需具备一定的线性代数和概率论基础即可阅读本书。而对于已有一些强化学习知识的读者,本笔记则可以帮助他们深入理解相关问题。
10+
11+
## 📖 内容导航
12+
13+
| 章节 | 关键内容 | 状态 |
14+
| --- | --- | --- |
15+
| [前言](https://wgyhhhh.github.io/Mathematical-Foundations-of-Reinforcement-Learning-Notes/Preface1/) | 本笔记的缘起、背景及阅读建议 ||
16+
| [第一章 基本概念](https://wgyhhhh.github.io/Mathematical-Foundations-of-Reinforcement-Learning-Notes/Chapter-1/intro/) | 强化学习的基本概念 ||
17+
| [第二章 状态值与贝尔曼方程](https://wgyhhhh.github.io/Mathematical-Foundations-of-Reinforcement-Learning-Notes/Chapter-2/intro/) | 回报、状态值、Bellman方程 ||
18+
| [第三章 最优状态值与贝尔曼最优方程](https://wgyhhhh.github.io/Mathematical-Foundations-of-Reinforcement-Learning-Notes/Chapter-3/intro/) | 最优状态值、最优策略、Bellman最优方程 ||
19+
| [第四章 值迭代与策略迭代](https://wgyhhhh.github.io/Mathematical-Foundations-of-Reinforcement-Learning-Notes/Chapter-4/intro/) | 值迭代算法、策略迭代算法、截断策略迭代算法 ||
20+
| [第五章 蒙特卡罗方法](https://wgyhhhh.github.io/Mathematical-Foundations-of-Reinforcement-Learning-Notes/Chapter-5/intro/) | MC Basic、MC Exploring Starts、MC-Greedy | ✅(润色中) |
21+
| [第六章 随机近似算法](https://wgyhhhh.github.io/Mathematical-Foundations-of-Reinforcement-Learning-Notes/Chapter-6/intro/) | Robbins-Monro算法、Dvoretzky定理、随机梯度下降 | ✅(润色中) |
22+
| [第七章 时序差分算法](https://wgyhhhh.github.io/Mathematical-Foundations-of-Reinforcement-Learning-Notes/Chapter-7/intro/) | Sarsa、n步Sarsa、Q-learning、 Off-policy、On-policy| ✅(润色中) |
23+
| [第八章 值函数方法](https://wgyhhhh.github.io/Mathematical-Foundations-of-Reinforcement-Learning-Notes/Chapter-8/intro/) | 基于值函数的TD算法、Sarsa、Q-learning | ✅(润色中) |
24+
| [第九章 策略梯度方法](https://wgyhhhh.github.io/Mathematical-Foundations-of-Reinforcement-Learning-Notes/Chapter-9/intro/) | 策略梯度、REINFORCE | ✅(润色中) |
25+
| [第十章 演员-评论家算法](https://wgyhhhh.github.io/Mathematical-Foundations-of-Reinforcement-Learning-Notes/Chapter-10/intro/) | 优势演员-评论家、异策略演员-评论家、确定性演员-评论家 | ✅(润色中) |
26+
| 算法实现详解 | 核心算法Python实现 | 🚧 |
27+
28+
### 🚧 算法实现详解
29+
30+
笔者正在使用Python实现本书中的部分核心算法,读者可以通过结合阅读,获得更直观的理解。
31+
32+
## 🤝 如何贡献
33+
34+
如果你对强化学习感兴趣,可以参与到该笔记的完善中!❤️
35+
36+
- 💡**内容完善** - 帮助改进笔记内容
37+
- 📝**报告问题** - 发现问题请提交 Issue
38+
39+
### &#8627; Stargazers
40+
[![Stargazers repo roster for @wgyhhhh/Mathematical-Foundations-of-Reinforcement-Learning-Notes](https://reporoster.com/stars/wgyhhhh/Mathematical-Foundations-of-Reinforcement-Learning-Notes)](https://github.com/wgyhhhh/Mathematical-Foundations-of-Reinforcement-Learning-Notes/stargazers)
41+
42+
### &#8627; Forkers
43+
[![Forkers repo roster for @wgyhhhh/Mathematical-Foundations-of-Reinforcement-Learning-Notes](https://reporoster.com/forks/wgyhhhh/Mathematical-Foundations-of-Reinforcement-Learning-Notes)](https://github.com/wgyhhhh/Mathematical-Foundations-of-Reinforcement-Learning-Notes/network/members)
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
## 4.1 值迭代
2+
3+
本节介绍第一个能够求解最优策略的算法-**值迭代** (value iteration)。该算法实际上正是定理$3.3$中给出的用于求解贝尔曼最优方程的算法,下面介绍其具体的实施细节。
4+
5+
我们首先将该算法写出来:
6+
7+
$$v_{k+1}=\max_{\pi\in\Pi}(r_{\pi}+\gamma P_{\pi}v_{k}),\quad k=0,1,2,\ldots$$
8+
9+
定理$3.3$告诉我们,随着$k$趋于无穷大,$v_k$和$\pi_k$分别收敛到最优状态值和最优策略。
10+
11+
该迭代算法的每次迭代包含两个步骤。
12+
13+
- 第一步是**策略更新** (policy update)。从数学上,其目标是找到一个能够解决以下优化问题的策略:
14+
15+
$$\pi_{k+1}=\arg\max_\pi(r_\pi+\gamma P_\pi v_k),$$
16+
17+
其中$v_k$是在上一次迭代得到的值。
18+
19+
- 第二步称为**值更新** (value update)。在数学上,它通过下式计算一个新的值$v_{k+1}$:
20+
21+
$$v_{k+1}=r_{\pi_{k+1}}+\gamma P_{\pi_{k+1}}v_{k},\tag{4.1}$$
22+
23+
其中$v_{k+1}$将用于下一次迭代。
24+
25+
!!! note
26+
注: 思想就是先固定$v_k$,找到一个新策略,然后利用新策略更新$v_k$
27+
28+
上述算法是以矩阵向量形式呈现的。为了实现该算法,我们需要进一步分析其**按元素展开形式** (elementwise form)。在此之前需要明确,$(4.1)$中的$v_k$是否是状态值?答案是否定的。尽管当$k$趋于无穷时$v_k$会收敛到最优状态值,但是当$k$有限时,$v_k$可能并不满足任何一个贝尔曼方程,因此也不是某一个策略的状态值。
29+
30+
### 4.1.1 逐元素形式与实现
31+
32+
在第$k$次迭代中,状态$s$对应的策略更新和值更新的步骤的细节如下所示。
33+
34+
- 首先,策略更新$\pi_{k+1}=\arg\max_\pi(r_\pi+\gamma P_\pi v_k)$的逐元素展开形式为:
35+
36+
$$\pi_{k+1}(s)=\arg\max_{\pi}\sum_{a}\pi(a|s)\underbrace{\left(\sum_{r}p(r|s,a)r+\gamma\sum_{s^{\prime}}p(s^{\prime}|s,a)v_{k}(s^{\prime})\right)}_{q_{k}(s,a)},\quad s\in\mathcal{S}.$$
37+
38+
上述优化问题的最优解为:
39+
40+
$$\pi_{k+1}(a|s)=\left\{\begin{array}{ll}1,&a=a_k^*(s),\\0,&a\neq a_k^*(s),\end{array}\right.\tag{4.2}$$
41+
42+
其中$a_k^*(s) = \arg\max_a q_k(s,a)$。如果$a_k^*(s) = \arg\max_a q_k(s,a)$有多个相同的解,那么可以任选其中一个,而不会影响算法的收敛性。
43+
44+
- 其次,值更新步骤$v_{k+1}=r_{\pi_{k+1}}+\gamma P_{\pi_{k+1}}v_{k}$的逐元素展开形式为:
45+
46+
$$v_{k+1}(s)=\sum_{a}\pi_{k+1}(a|s)\underbrace{\left(\sum_{r}p(r|s,a)r+\gamma\sum_{s^{\prime}}p(s^{\prime}|s,a)v_{k}(s^{\prime})\right)}_{q_{k}(s,a)},\quad s\in\mathcal{S}.$$
47+
48+
将$(4.2)$代入上式得到
49+
50+
$$v_{k+1}(s)=\max_{a}q_{k}(s,a).$$
51+
52+
即新的值等于状态$s$对应的最大$q$值。
53+
54+
上述步骤可以概括为如下形式:
55+
56+
$$v_k(s)\to q_k(s,a)\to\text{计算新策略}\quad\pi_{k+1}(s)\to\mathrm{计算新值}\quad v_{k+1}(s)=\max_aq_k(s,a)$$
57+
58+
上述算法的伪代码参见算法$4.1$。
59+
60+
![](../img/04/11.png)
61+
> 算法$4.1$: 值迭代算法的伪代码
62+
63+
### 4.1.2 示例
64+
65+
下面通过一个例子,以说明值迭代算法的逐步实现过程。这个例子是一个两行两列的网格,其中包含一个禁区(图4.2)。目标区域为$s_4$。奖励设置为$r_{boundary} = r_{forbidden} = −1,r_{target} = 1$。折现率为$\gamma= 0.9$。
66+
67+
![](../img/04/1.png)
68+
> 图$4.2$: 一个用于演示值迭代算法实现的示例。
69+
70+
每个状态-动作对的q值表达式如表4.1所示。
71+
72+
![](../img/04/2.png)
73+
> 表$4.1$: 如图$4.2$所示示例中$q(s, a)$的表达式。
74+
75+
- $k=0$:
76+
77+
不失一般性,选择初始值为 $v_0(s_1) = v_0(s_2) = v_0(s_3) = v_0(s_4) = 0$。
78+
79+
$q$值计算:将$v_0(s_i)$代入表$4.1$,可得到表$4.2$中所示的$q$值。
80+
81+
策略更新: $\pi_1$是通过为每个状态选择具有最大$q$值的动作得到的:
82+
83+
$$\pi_1(a_5|s_1) = 1, \quad \pi_1(a_3|s_2) = 1, \quad \pi_1(a_2|s_3) = 1, \quad \pi_1(a_5|s_4) = 1.$$
84+
85+
该策略在图$4.2$(中间子图)中进行了可视化。很明显,该策略不是最优的,因为它在$s_1$时选择保持不动。值得注意的是,$(s_1,a_5)$和$(s_1,a_3)$的$q$值实际上是相同的,我们可以随机选择其中任一动作。
86+
87+
值更新:$v_1$是通过将每个状态的最大$q$值更新为$v$值得到的:
88+
89+
$$v_1(s_1) = 0, \quad v_1(s_2) = 1, \quad v_1(s_3) = 1, \quad v_1(s_4) = 1.$$
90+
91+
![](../img/04/3.png)
92+
> 表$4.2$: 在$k = 0$时$q(s,a)$的值。
93+
94+
- $k=1$:
95+
96+
$q$值计算:将$v_1(s_i)$代入表$4.1$,可得到表$4.3$中所示的$q$值。
97+
98+
策略更新: $\pi_2$是通过为每个状态选择具有最大$q$值的动作得到的:
99+
100+
$$\pi_1(a_3|s_1) = 1, \quad \pi_1(a_3|s_2) = 1, \quad \pi_1(a_2|s_3) = 1, \quad \pi_1(a_5|s_4) = 1.$$
101+
102+
该策略在图$4.2$(右子图)中进行了可视化。
103+
104+
值更新:$v_2$是通过将每个状态的$v$值更新为最大的$q$值而得到的:
105+
106+
$$v_2(s_1) = \gamma 1, \quad v_2(s_2) = 1 + \gamma 1, \quad v_2(s_3) = 1 + \gamma 1, \quad v_2(s_4) = 1 + \gamma 1.$$
107+
108+
![](../img/04/4.png)
109+
> 表$4.3$: 在$k = 1$时$q(s,a)$的值。
110+
111+
- $k=2,3,4,...$
112+
113+
值得注意的是,如图$4.2$所示,策略$\pi_2$已经是最优的。因此,我们在这个简单的例子中,只需要运行两次迭代即可获得最优策略。对于更复杂的例子,我们需要运行更多的迭代,直到$v_k$的值收敛(例如,直到$\|v_{k+1}-v_k\|$小于预先设定的阈值)。
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
## 4.1 值迭代
2+
3+
本节介绍第一个能够求解最优策略的算法-**值迭代** (value iteration)。该算法实际上正是定理$3.3$中给出的用于求解贝尔曼最优方程的算法,下面介绍其具体的实施细节。
4+
5+
我们首先将该算法写出来:
6+
7+
$$v_{k+1}=\max_{\pi\in\Pi}(r_{\pi}+\gamma P_{\pi}v_{k}),\quad k=0,1,2,\ldots$$
8+
9+
定理$3.3$告诉我们,随着$k$趋于无穷大,$v_k$和$\pi_k$分别收敛到最优状态值和最优策略。
10+
11+
该迭代算法的每次迭代包含两个步骤。
12+
13+
- 第一步是**策略更新** (policy update)。从数学上,其目标是找到一个能够解决以下优化问题的策略:
14+
15+
$$\pi_{k+1}=\arg\max_\pi(r_\pi+\gamma P_\pi v_k),$$
16+
17+
其中$v_k$是在上一次迭代得到的值。
18+
19+
- 第二步称为**值更新** (value update)。在数学上,它通过下式计算一个新的值$v_{k+1}$:
20+
21+
$$v_{k+1}=r_{\pi_{k+1}}+\gamma P_{\pi_{k+1}}v_{k},\tag{4.1}$$
22+
23+
其中$v_{k+1}$将用于下一次迭代。
24+
25+
!!! note
26+
注: 思想就是先固定$v_k$,找到一个新策略,然后利用新策略更新$v_k$
27+
28+
上述算法是以矩阵向量形式呈现的。为了实现该算法,我们需要进一步分析其**按元素展开形式** (elementwise form)。在此之前需要明确,$(4.1)$中的$v_k$是否是状态值?答案是否定的。尽管当$k$趋于无穷时$v_k$会收敛到最优状态值,但是当$k$有限时,$v_k$可能并不满足任何一个贝尔曼方程,因此也不是某一个策略的状态值。
29+
30+
### 4.1.1 逐元素形式与实现
31+
32+
在第$k$次迭代中,状态$s$对应的策略更新和值更新的步骤的细节如下所示。
33+
34+
- 首先,策略更新$\pi_{k+1}=\arg\max_\pi(r_\pi+\gamma P_\pi v_k)$的逐元素展开形式为:
35+
36+
$$\pi_{k+1}(s)=\arg\max_{\pi}\sum_{a}\pi(a|s)\underbrace{\left(\sum_{r}p(r|s,a)r+\gamma\sum_{s^{\prime}}p(s^{\prime}|s,a)v_{k}(s^{\prime})\right)}_{q_{k}(s,a)},\quad s\in\mathcal{S}.$$
37+
38+
上述优化问题的最优解为:
39+
40+
$$\pi_{k+1}(a|s)=\left\{\begin{array}{ll}1,&a=a_k^*(s),\\0,&a\neq a_k^*(s),\end{array}\right.\tag{4.2}$$
41+
42+
其中$a_k^*(s) = \arg\max_a q_k(s,a)$。如果$a_k^*(s) = \arg\max_a q_k(s,a)$有多个相同的解,那么可以任选其中一个,而不会影响算法的收敛性。
43+
44+
- 其次,值更新步骤$v_{k+1}=r_{\pi_{k+1}}+\gamma P_{\pi_{k+1}}v_{k}$的逐元素展开形式为:
45+
46+
$$v_{k+1}(s)=\sum_{a}\pi_{k+1}(a|s)\underbrace{\left(\sum_{r}p(r|s,a)r+\gamma\sum_{s^{\prime}}p(s^{\prime}|s,a)v_{k}(s^{\prime})\right)}_{q_{k}(s,a)},\quad s\in\mathcal{S}.$$
47+
48+
将$(4.2)$代入上式得到
49+
50+
$$v_{k+1}(s)=\max_{a}q_{k}(s,a).$$
51+
52+
即新的值等于状态$s$对应的最大$q$值。
53+
54+
上述步骤可以概括为如下形式:
55+
56+
$$v_k(s)\to q_k(s,a)\to\text{计算新策略}\pi_{k+1}(s)\to\mathrm{计算新值}v_{k+1}(s)=\max_aq_k(s,a)$$
57+
58+
上述算法的伪代码参见算法$4.1$。
59+
60+
![](../img/04/11.png)
61+
> 算法$4.1$: 值迭代算法的伪代码
62+
63+
### 4.1.2 示例
64+
65+
下面通过一个简单的例子来详细说明值迭代算法的实现过程。如图$4.2$所示,这例子是一个$2\times 2$的网格世界,其中有一个禁止区域和一个目标区域。奖励设置为$r_{boundary} = r_{forbidden} = −1,r_{target} = 1$,$\gamma= 0.9$。
66+
67+
![](../img/04/1.png)
68+
> 图$4.2$: 一个用于演示值迭代算法实现的示例。
69+
70+
首先,我们可以建立每个状态-动作对的q-table,其中每一个元素展示了如何从$v$值计算出$q$值。
71+
72+
![](../img/04/2.png)
73+
> 表$4.1$: 如图$4.2$所示示例中$q(s, a)$的表达式。
74+
75+
![](../img/04/3.png)
76+
> 表$4.2$: 在$k = 0$时$q(s,a)$的值。
77+
78+
- $k=0$:
79+
80+
初始值为$v_0$可以任意选择,这里不失一般性地选择$v_0(s_1) = v_0(s_2) = v_0(s_3) = v_0(s_4) = 0$。
81+
82+
计算$q$值:将$v_0(s_i)$代入表$4.1$,得到的$q$值如表$4.2$中所示。
83+
84+
策略更新: 每个状态的策略应更新为选择最大$q$值的行动。基于此,通过表$4.2$可以看出新的策略为:
85+
86+
$$\pi_1(a_5|s_1) = 1, \quad \pi_1(a_3|s_2) = 1, \quad \pi_1(a_2|s_3) = 1, \quad \pi_1(a_5|s_4) = 1.$$
87+
88+
在状态$s_1$,由于行动$a_3$和$a_5$的$q$值是相等的,因此可以随机选择其中一个值,这里我们选择的是$a_5$。图$4.2$中间图展示了上面得到的新策略。
89+
90+
值更新:每个状态的$v$值应该更新为其最大$q$值,由此可得如下新值:
91+
92+
$$v_1(s_1) = 0, \quad v_1(s_2) = 1, \quad v_1(s_3) = 1, \quad v_1(s_4) = 1.$$
93+
94+
不难看出,这次迭代得到的策略不是最优的,因为它在$s_1$时选择保持不动。下面继续迭代
95+
96+
![](../img/04/4.png)
97+
> 表$4.3$: 在$k = 1$时$q(s,a)$的值。
98+
99+
- $k=1$:
100+
101+
计算$q$值:将$v_1(s_i)$代入表$4.1$,得到表$4.3$中的$q$值。
102+
103+
策略更新: $\pi_2$是通过为每个状态选择具有最大$q$值的行动得到的。因此,通过表$4.3$可以看出新的策略为:
104+
105+
$$\pi_1(a_3|s_1) = 1, \quad \pi_1(a_3|s_2) = 1, \quad \pi_1(a_2|s_3) = 1, \quad \pi_1(a_5|s_4) = 1.$$
106+
107+
图$4.2$中的右图展示了上面得到的新策略。
108+
109+
值更新:每个状态的$v$值更新为最大的$q$值,由此可得如下新值:
110+
111+
$$v_2(s_1) = \gamma 1, \quad v_2(s_2) = 1 + \gamma 1, \quad v_2(s_3) = 1 + \gamma 1, \quad v_2(s_4) = 1 + \gamma 1.$$
112+
113+
如果需要,则可以继续迭代。
114+
115+
- $k=2,3,4,...$
116+
117+
值得注意的是,如图$4.2$的右图所示,策略$\pi_2$已经是最优的。因此,在这个简单的例子中,只需要运行两次迭代即可获得最优策略。对于更复杂的例子,我们需要运行更多轮的迭代,直到$v_k$的值收敛(例如,直到$\|v_{k+1}-v_k\|$小于预先设定的阈值)。

0 commit comments

Comments
 (0)