diff --git a/docs/ch2/main.md b/docs/ch2/main.md
index 69cdb12..802ab33 100644
--- a/docs/ch2/main.md
+++ b/docs/ch2/main.md
@@ -1,10 +1,12 @@
# 马尔可夫决策过程
-$\qquad$ 在绪论中我们了解到强化学习是解决序列决策问题的有效方法,而序列决策问题的本质是在与环境交互的过程中学习到一个目标的过程。在本章中,我们将介绍强化学习中最基本的问题模型,即马尔可夫决策过程(Markov decision process,MDP),它能够以数学的形式来表达序列决策过程。注意,本章开始包括后面的章节会涉及理论公式推导,建议读者在阅读之前先回顾一下概率论相关知识,尤其是条件概率、全概率期望公式等等。
+$\qquad$ 在绪论中我们了解到强化学习是解决序列决策问题的有效方法,而序列决策问题的本质是在与环境交互的过程中学习到一个目标的过程。在本章中,我们将介绍强化学习中最基本的问题模型,即马尔可夫决策过程($\text{Markov decision process,MDP}$),它能够以数学的形式来表达序列决策过程。注意,本章开始包括后面的章节会涉及理论公式推导,建议读者在阅读之前先回顾一下概率论相关知识,尤其是条件概率、全概率期望公式等等。
## 马尔可夫决策过程
-$\qquad$ **马尔可夫决策过程**( $\text{Markov decision process,MDP}$)是强化学习的基本问题模型之一,它能够以数学的形式来描述智能体在与环境交互的过程中学到一个目标的过程。这里智能体充当的是作出决策或动作,并且在交互过程中学习的角色,环境指的是智能体与之交互的一切外在事物,不包括智能体本身。举个例子,比如我们要学习弹钢琴,在这个过程中充当决策者和学习者的我们人本身就是智能体,而我们的交互主体即钢琴就是环境。当我们执行动作也就是弹的时候会观测到一些信息,例如琴键的位置等,这就是状态。此外当我们弹下去的时候会收到钢琴发出的声音,也就是反馈,我们通过钢琴发出的声音来判断自己弹得好不好然后反思并纠正下一次弹的动作。当然如果这时候有一个钢琴教师在旁边指导我们,那样其实钢琴和教师就同时组成了环境,我们也可以交互过程中接收教师的反馈来提高自己的钢琴水平。
+$\qquad$ **马尔可夫决策过程**是强化学习的基本问题模型之一,它能够以数学的形式来描述智能体在与环境交互的过程中学到一个目标的过程。这里智能体充当的是作出决策或动作,并且在交互过程中学习的角色,环境指的是智能体与之交互的一切外在事物,不包括智能体本身。
+
+$\qquad$ 例如,我们要学习弹钢琴,在这个过程中充当决策者和学习者的我们人本身就是智能体,而我们的交互主体即钢琴就是环境。当我们执行动作也就是弹的时候会观测到一些信息,例如琴键的位置等,这就是状态。此外当我们弹下去的时候会收到钢琴发出的声音,也就是反馈,我们通过钢琴发出的声音来判断自己弹得好不好然后反思并纠正下一次弹的动作。当然如果这时候有一个钢琴教师在旁边指导我们,那样其实钢琴和教师就同时组成了环境,我们也可以交互过程中接收教师的反馈来提高自己的钢琴水平。
$\qquad$ 如图 $\text{2-1}$ 所示,它描述了马尔可夫决策过程中智能体与环境的交互过程。智能体每一时刻都会接收环境的状态,并执行动作,进而接收到环境反馈的奖励信号和下一时刻的状态。
@@ -13,13 +15,14 @@ $\qquad$ 如图 $\text{2-1}$ 所示,它描述了马尔可夫决策过程中智
图 $\text{2-1}$ 马尔可夫决策过程中智能体与环境的交互过程
-$\qquad$ 确切地说,智能体与环境之间是在一系列**离散的时步** ①( $\text{time step}$ )交互的,一般用 $t$ 来表示,$t=0,1,2,\cdots$②。在每个时步 $t$, 智能体会观测或者接收到当前环境的状态 $s_t$,根据这个状态 $s_t$ 执行动作 $a_t$。执行完动作之后会收到一个奖励 $r_{t+1}$③,同时环境也会收到动作 $a_t$ 的影响会变成新的状态 $s_{t+1}$,并且在 $t+1$时步被智能体观测到。如此循环下去,我们就可以在这个交互过程中得到一串轨迹,可表示为:
+$\qquad$ 确切地说,智能体与环境之间是在一系列**离散的时步** ①( $\text{time step}$ )交互的,一般用 $t$ 来表示,$t=0,1,2,\cdots$②。在每个时步 $t$, 智能体会观测或者接收到当前环境的状态 $s_t$,根据这个状态 $s_t$ 执行动作 $a_t$。执行完动作之后会收到一个奖励 $r_{t+1}$ ③,同时环境也会收到动作 $a_t$ 的影响会变成新的状态 $s_{t+1}$,并且在 $t+1$ 时步被智能体观测到。如此循环下去,我们就可以在这个交互过程中得到一串轨迹,可表示为:
$$
+\tag{2.1}
s_0,a_0,r_1,s_1,a_1,r_2,\cdots,s_t,a_t,r_{t+1},\cdots
$$
-其中奖励 $r_{t+1}$就相当于我们学习弹钢琴时收到的反馈,我们弹对了会收到老师的表扬,相当于一个正奖励,弹错了可能会接受老师的批评,相当于一个负奖励。前面讲到马尔可夫决策过程描述的是智能体在交互过程中学到一个目标的过程,而**这个目标通常是以最大化累积的奖励来呈现的**。换句话说,我们的目标是使得在交互过程中得到的奖励之和$r_1+r_2+\cdots+r_T$尽可能最大,其中$T$表示当前交互过程中的最后一个时步,也就是最大步数,从$t=0$和$t+T$这一段时步我们称为一个回合(episode),比如游戏中的一局。
+$\qquad$ 其中奖励 $r_{t+1}$就相当于我们学习弹钢琴时收到的反馈,我们弹对了会收到老师的表扬,相当于一个正奖励,弹错了可能会接受老师的批评,相当于一个负奖励。前面讲到马尔可夫决策过程描述的是智能体在交互过程中学到一个目标的过程,而 **这个目标通常是以最大化累积的奖励来呈现的** 。换句话说,我们的目标是使得在交互过程中得到的奖励之和$r_1+r_2+\cdots+r_T$尽可能最大,其中$T$表示当前交互过程中的最后一个时步,也就是最大步数,从 $t=0$ 和 $t+T$ 这一段时步我们称为一个回合( $\text{episode}$ ),比如游戏中的一局。
> ① 有些方法可以拓展到连续时间的情况,但为了方便,我们尽量只考虑离散时步的情况。
@@ -30,18 +33,20 @@ $$
## 马尔可夫性质
-现在我们介绍马尔可夫决策过程的一个前提,即马尔可夫性质,用公式表示如下:
+$\qquad$ 现在我们介绍马尔可夫决策过程的一个前提,即马尔可夫性质,如式 $\text{(2.2)}$ 所示
$$
-\tag{2.1}
+\tag{2.2}
P(s_{t+1}|s_t) = P(s_{t+1}|s_0, s_1,\cdots,s_t)
$$
-这个公式的意思就是在给定历史状态$s_0, s_1,\cdots,s_t$的情况下,某个状态的未来只与当前状态$s_t$有关,与历史的状态无关。这个性质其实对于很多问题有着非常重要的指导意义的,因为这允许我们在没有考虑系统完整历史的情况下预测和控制其行为,随着我们对强化学习的深入会越来越明白这个性质的重要性。实际问题中,有很多例子其实是不符合马尔可夫性质的,比如我们所熟知的棋类游戏,因为在我们决策的过程中不仅需要考虑到当前棋子的位置和对手的情况,还需要考虑历史走子的位置例如吃子等。换句话说,它们不仅取决于当前状态,还依赖于历史状态。当然这也并不意味着完全不能用强化学习来解决,实际上此时我们可以用深度学习神经网络来表示当前的棋局,并用蒙特卡洛搜索树等技术来模拟玩家的策略和未来可能的状态,来构建一个新的决策模型,这就是著名的 AlphaGO 算法[1](#alphago)。具体的技术细节后面会展开,总之记住在具体的情境下,当我们要解决问题不能严格满足马尔可夫性质的条件时,是可以结合其他的方法来辅助强化学习进行决策的。
+$\qquad$ 这个公式的意思就是在给定历史状态$s_0, s_1,\cdots,s_t$的情况下,某个状态的未来只与当前状态$s_t$有关,与历史的状态无关。这个性质其实对于很多问题有着非常重要的指导意义的,因为这允许我们在没有考虑系统完整历史的情况下预测和控制其行为,随着我们对强化学习的深入会越来越明白这个性质的重要性。实际问题中,有很多例子其实是不符合马尔可夫性质的,比如我们所熟知的棋类游戏,因为在我们决策的过程中不仅需要考虑到当前棋子的位置和对手的情况,还需要考虑历史走子的位置例如吃子等。
+
+$\qquad$ 换句话说,它们不仅取决于当前状态,还依赖于历史状态。当然这也并不意味着完全不能用强化学习来解决,实际上此时我们可以用深度学习神经网络来表示当前的棋局,并用蒙特卡洛搜索树等技术来模拟玩家的策略和未来可能的状态,来构建一个新的决策模型,这就是著名的 AlphaGO 算法[1](#alphago)。具体的技术细节后面会展开,总之记住在具体的情境下,当我们要解决问题不能严格满足马尔可夫性质的条件时,是可以结合其他的方法来辅助强化学习进行决策的。
## 回报
-前面讲到在马尔可夫决策过程中智能体的目标时最大化累积的奖励,通常我们把这个累积的奖励称为回报(Return),用 $G_t$ 表示,最简单的回报公式可以写成:
+$\qquad$ 前面讲到在马尔可夫决策过程中智能体的目标时最大化累积的奖励,通常我们把这个累积的奖励称为回报(Return),用 $G_t$ 表示,最简单的回报公式可以写成式
$$
G_t = r_1 + r_2 + \cdots + r_T
diff --git a/docs/ch3/main.md b/docs/ch3/main.md
index 0ebdf9f..1dabc20 100644
--- a/docs/ch3/main.md
+++ b/docs/ch3/main.md
@@ -1,10 +1,10 @@
# 动态规划
-前面我们讲到马尔可夫决策过程是强化学习中的基本问题模型之一,而解决马尔可夫决策过程的方法我们统称为强化学习算法。本章开始讲强化学习中最基础的算法之一,动态规划(Dynamic Programming, DP)。动态规划其实并不是强化学习领域中独有的算法,它在数学、管理科学、经济学和生物信息学等其他领域都有广泛的应用。动态规划具体指的是在某些复杂问题中,将问题转化为若干个子问题,并在求解每个子问题的过程中保存已经求解的结果,以便后续使用。实际上动态规划更像是一种通用的思路,而不是具体某个算法。在强化学习中,动态规划被用于求解值函数和最优策略。常见的动态规划算法包括值迭代(Value Iteration)、策略迭代(Policy Iteration)和 Q-learning 算法等。
+$\qquad$ 前面我们讲到马尔可夫决策过程是强化学习中的基本问题模型之一,而解决马尔可夫决策过程的方法我们统称为强化学习算法。本章开始讲强化学习中最基础的算法之一,动态规划(Dynamic Programming, DP)。动态规划其实并不是强化学习领域中独有的算法,它在数学、管理科学、经济学和生物信息学等其他领域都有广泛的应用。动态规划具体指的是在某些复杂问题中,将问题转化为若干个子问题,并在求解每个子问题的过程中保存已经求解的结果,以便后续使用。实际上动态规划更像是一种通用的思路,而不是具体某个算法。在强化学习中,动态规划被用于求解值函数和最优策略。常见的动态规划算法包括值迭代(Value Iteration)、策略迭代(Policy Iteration)和 Q-learning 算法等。
## 动态规划的编程思想
-动态规划其实是一个看起来好懂但实践起来很复杂的概念,为了帮助读者理解,这里会举一道经典的面试编程题①作为示例。
+$\qquad$ 动态规划其实是一个看起来好懂但实践起来很复杂的概念,为了帮助读者理解,这里会举一道经典的面试编程题①作为示例。
diff --git a/docs/ch4/main.md b/docs/ch4/main.md
index 3e5c2f7..f145192 100644
--- a/docs/ch4/main.md
+++ b/docs/ch4/main.md
@@ -1,21 +1,31 @@
# 免模型预测
-本章开始介绍常见的两种免模型预测方法,**蒙特卡洛方法(Monte Carlo,MC)**和**时序差分方法(Temporal-Difference,TD)**。在讲解这两个方法之前,我们需要铺垫一些重要的概念,有模型(Model base)与免模型(Model free),预测(Predicton)与控制(Control)。
+$\qquad$ 本章开始介绍常见的两种免模型预测方法,**蒙特卡洛方法**( $\text{Monte Carlo,MC}$ )和**时序差分方法**($\text{temporal-difference,TD}$)。在讲解这两个方法之前,我们需要铺垫一些重要的概念,有模型($\text{model based}$)与无模型($\text{model free}$),预测($\text{predicton}$)与控制($\text{control}$)。
## 有模型与免模型
-在前面的章节中,我们其实默认了一个事实,即状态转移概率是已知的,这种情况下使用的算法称之为**有模型算法(Model based RL)**,例如动态规划算法。但大部分情况下对于智能体来说,环境是未知的,这种情况下的算法就称之为**免模型算法(Model free RL)**,目前很多经典的强化学习算法都是免模型的。当然近年来出现了一些新的强化学习算法,例如 $\text{PlaNet}$、$\text{Dreamer}$ 和 $\text{World Models}$ 等。这些算法利用了神经网络和其他机器学习方法建立一个近似的环境模型,并使用规划和强化学习的方法进行决策,这些算法也都称为有模型算法。
+$\qquad$ 在前面的章节中,我们其实默认了一个事实,即状态转移概率是已知的,这种情况下使用的算法称之为**有模型算法**,例如动态规划算法。但大部分情况下对于智能体来说,环境是未知的,这种情况下的算法就称之为**无模型算法**,目前很多经典的强化学习算法都是免模型的。当然近年来出现了一些新的强化学习算法,例如 $\text{PlaNet}$、$\text{Dreamer}$ 和 $\text{World Models}$ 等。这些算法利用了神经网络和其他机器学习方法建立一个近似的环境模型,并使用规划和强化学习的方法进行决策,这些算法也都称为有模型算法。
+
+$\qquad$ 具体说来,有模型强化学习尝试先学习一个环境模型,它可以是环境的动态(例如,给定一个状态和一个动作,预测下一个状态)或奖励(给定一个状态和一个动作,预测奖励),即前面小节所讲的状态转移概率和奖励函数。一旦有了这个环境模型,智能体可以使用它来计划最佳的行动策略,例如通过模拟可能的未来状态来预测哪个动作会导致最大的累积奖励。它的优点很明显,即可以在不与真实环境交互的情况下进行学习,因此可以节省实验的成本。但缺点是,这种模型往往是不完美的,或者是复杂到难以学习和计算。
+
+$\qquad$ 而无模型则直接学习在特定状态下执行特定动作的价值或优化策略。它直接从与环境的交互中学习,不需要建立任何预测环境动态的模型。其优点是不需要学习可能是较为复杂的环境模型,更加简单直接,但是缺点是在学习过程中需要与真实环境进行大量的交互。注意,除了动态规划之外,基础的强化学习算法都是无模型的。
## 预测与控制
-前面提到很多经典的强化学习算法都是免模型的,换句话说在这种情况下环境的状态转移概率是未知的,这种情况下会去近似环境的状态价值函数,这其实跟状态转移概率是等价的,我们把这个过程称为**预测(Prediction)**。换句话说,预测是在马尔可夫决策过程 $
$ 中,输入策略 $\pi$ ,然后输出状态价值函数 $V_{\pi}$ 。相对的,**控制(Control)** 则需要我们找到一个最优策略 $\pi^*$ ,并且同时输出对应的最优状态价值函数 $V^*$ 。之所以提到这两个概念,是因为很多时候我们不能一蹴而就解决好控制问题,而需要先解决预测问题,进而解决控制问题。
+$\qquad$ 前面提到很多经典的强化学习算法都是免模型的,换句话说在这种情况下环境的状态转移概率是未知的,这种情况下会去近似环境的状态价值函数,这其实跟状态转移概率是等价的,我们把这个过程称为**预测**。换句话说,预测的主要目的是估计或计算环境中的某种期望值,比如状态价值函数 $V(s)$ 或动作价值函数 $Q(s,a)$。例如,我们正在玩一个游戏,并想知道如果按照某种策略玩游戏,我们的预期得分会是多少。
+
+$\qquad$ 而控制的目标则是找到一个最优策略,该策略可以最大化期望的回报。换句话说,你不仅想知道按照某种策略你的预期得分是多少,还想知道如何选择动作以最大化这个得分。控制问题通常涉及两个相互交替的步骤:策略评估(使用当前策略估计值函数)和策略改进(基于当前的值函数更新策略)。
+
+$\qquad$ 在实际应用中,预测和控制问题经常交织在一起。例如,在使用 $\text{Q-learning}$(一种无模型的控制算法)时,我们同时进行预测(更新 $Q$ 值)和控制(基于$Q$ 值选择动作)。之所以提到这两个概念,是因为很多时候我们不能一蹴而就解决好控制问题,而需要先解决预测问题,进而解决控制问题。
## 蒙特卡洛估计
-蒙特卡洛估计方法在强化学习中是免模型预测价值函数的方式之一,本质是一种统计模拟方法,它的发展得益于电子计算机的发明。假设我们需要计算一个不规则图形的面积,这种情况下是很难通过规则或者积分的方式得到结果的。而蒙特卡洛基于这样的想法:比如我们有一袋豆子,把豆子均匀地在一定范围内朝这个图形上撒,撒到足够多的数量时数一下这个图形中有多少颗豆子,这个豆子的数目就是图形的面积。当豆子越小撒的越多的时候,结果就越精确。此时我们借助计算机程序可以生成大量均匀分布坐标点,然后统计出图形内的点数,通过它们占总点数的比例和坐标点生成范围的面积就可以求出图形面积。
+$\qquad$ 蒙特卡洛估计方法在强化学习中是免模型预测价值函数的方式之一,本质是一种统计模拟方法,它的发展得益于电子计算机的发明。假设我们需要计算一个不规则图形的面积,这种情况下是很难通过规则或者积分的方式得到结果的。
-那么在强化学习中蒙特卡洛方法是怎么预测状态价值函数 $V(s)$ 的呢?我们回顾 $V(s)$ 的定义公式,如式 $\text(4.1)$ :
+$\qquad$ 而蒙特卡洛基于这样的想法:比如我们有一袋豆子,把豆子均匀地在一定范围内朝这个图形上撒,撒到足够多的数量时数一下这个图形中有多少颗豆子,这个豆子的数目就是图形的面积。当豆子越小撒的越多的时候,结果就越精确。此时我们借助计算机程序可以生成大量均匀分布坐标点,然后统计出图形内的点数,通过它们占总点数的比例和坐标点生成范围的面积就可以求出图形面积。
+
+$\qquad$ 那么在强化学习中蒙特卡洛方法是怎么预测状态价值函数 $V(s)$ 的呢?我们回顾 $V(s)$ 的定义公式,如式 $\text(4.1)$ 所示。
$$
\tag{4.1}
@@ -25,67 +35,70 @@ V_\pi(s) &=\mathbb{E}_{\pi}[R_{t+1}+\gamma R_{t+2}+\gamma^2 R_{t+3} + \cdots |S_
\end{aligned}
$$
-由于这里的奖励函数 $R$ 是环境给到智能体的,$\gamma$ 则是设置的参数,因此其实 $V(s)$ 是可以手动计算出来的。假设机器人需要在一个 $m \times n$ 的网格中解决最短路径的问题,即从起点到终点走哪条路最短。在这种情况下,我们如果想要知道某个网格即某个状态代表的价值,那么我们可以从这个网格或状态出发,搜集到其他所有网格之间可能的轨迹。出于简化计算的考虑,我们考虑一个 $2 \times 2$的网格,如图 4.1 所示,我们用机器人的位置表示不同的状态,即$s_1,s_2,s_3,s_4$,规定机器人智能体向右或者向下走,分别用 $a_1$ 和 $a_2$ 。起点为坐标$(0,0)$,即初始状态为$S_0=s_1$,终点为右下角的网格 $s_4$,我们设置机器人每走一步接收到的奖励为 $-1$, 折扣因子 $\gamma=0.9$ 。
+$\qquad$ 由于这里的奖励函数 $R$ 是环境给到智能体的,$\gamma$ 则是设置的参数,因此其实 $V(s)$ 是可以手动计算出来的。假设机器人需要在一个 $m \times n$ 的网格中解决最短路径的问题,即从起点到终点走哪条路最短。在这种情况下,我们如果想要知道某个网格即某个状态代表的价值,那么我们可以从这个网格或状态出发,搜集到其他所有网格之间可能的轨迹。出于简化计算的考虑,我们考虑一个 $2 \times 2$的网格,如图 $\text{4-1}$ 所示,我们用机器人的位置表示不同的状态,即$s_1,s_2,s_3,s_4$,规定机器人智能体向右或者向下走,分别用 $a_1$ 和 $a_2$ 。起点为坐标$(0,0)$,即初始状态为$S_0=s_1$,终点为右下角的网格 $s_4$,我们设置机器人每走一步接收到的奖励为 $-1$, 折扣因子 $\gamma=0.9$ 。
-图 $4.1$ 迷你网格示例
+图 $\text{4-1}$ 迷你网格示例
+
+$\qquad$ 那么如果要计算 $s_1$ 的价值 $V(s_1)$ ,我们先搜集到其他状态的所有轨迹,比如到 $s_2$ 的轨迹是 $\{s_1,a_1,r(s_1,a_1),s_2\}$ ,即从 $s_1$ 开始,执行动作$a_1$即向右之后到达 $s_2$ 。这条轨迹记为 $\tau_1$ ,对应的回报为 $G_{\tau_1} = r(s_1,a_1) = -1$,**注意这里的下标不代表时步**。
-那么如果要计算 $s_1$ 的价值 $V(s_1)$ ,我们先搜集到其他状态的所有轨迹,比如到 $s_2$ 的轨迹是 $\{s_1,a_1,r(s_1,a_1),s_2\}$ ,即从 $s_1$ 开始,执行动作$a_1$即向右之后到达 $s_2$ 。这条轨迹记为 $\tau_1$ ,对应的回报为 $G_{\tau_1} = r(s_1,a_1) = -1$,**注意这里的下标不代表时步**。同理,到 $s_3$ 的轨迹 $\tau_2$ 为 $\{s_1,a_2,r(s_1,a_2),s_3\}$,对应的回报为 $G_{\tau_2} = r(s_1,a_2)=-1$。到状态 $s_4$ 的轨迹有两条,分别是 $\tau_3 = \{s_1,a_1,r(s_1,a_1),s_2,a_2,r(s_2,a_2),s_4\}$ 和 $\tau_4 = \{s_1,a_2,r(s_1,a_2),s_3,a_1,r(s_3,a_1),s_4\}$,对应的回报分别为 $G_{\tau_3} = r(s_1,a_1) + \gamma r(s_2,a_2)= (-1) + 0.9 * (-1) = -1.9$, $G_{\tau_4} = r(s_1,a_2) + \gamma r(s_3,a_1)= (-1) + 0.9 * (-1) = -1.9$ 。这样我们就能得到式 $\text(4.2)$ :
+$\qquad$ 同理,到 $s_3$ 的轨迹 $\tau_2$ 为 $\{s_1,a_2,r(s_1,a_2),s_3\}$,对应的回报为 $G_{\tau_2} = r(s_1,a_2)=-1$。到状态 $s_4$ 的轨迹有两条,分别是 $\tau_3 = \{s_1,a_1,r(s_1,a_1),s_2,a_2,r(s_2,a_2),s_4\}$ 和 $\tau_4 = \{s_1,a_2,r(s_1,a_2),s_3,a_1,r(s_3,a_1),s_4\}$,对应的回报分别为 $G_{\tau_3} = r(s_1,a_1) + \gamma r(s_2,a_2)= (-1) + 0.9 * (-1) = -1.9$, $G_{\tau_4} = r(s_1,a_2) + \gamma r(s_3,a_1)= (-1) + 0.9 * (-1) = -1.9$ 。这样我们就能得到式 $\text(4.2)$ 。
$$
\tag{4.2}
V(s_1) = (G_{\tau_1}+ G_{\tau_2} + G_{\tau_3} + G_{\tau_4} )/4 = 5.8 / 4 = -1.45
$$
-同样的可以计算出其他状态对应的价值函数,$V(s_2)=V(s_3)= -1$,$s_4$ 由于是终止状态,因此 $V(s_4)=0$ ,这样就得到了所有状态的价值函数分布,如图 $4.2$ 所示。
+$\qquad$ 同样的可以计算出其他状态对应的价值函数,$V(s_2)=V(s_3)= -1$,$s_4$ 由于是终止状态,因此 $V(s_4)=0$ ,这样就得到了所有状态的价值函数分布,如图 $\text{4-2}$ 所示。
-图 $4.2$ 价值函数网格分布
+图 $\text{4-2}$ 价值函数网格分布
-对于状态数量更多的情况,直接按照上述的方式去计算价值函数是不现实的。蒙特卡洛方法的思路是我们可以采样大量的轨迹,对于每个轨迹计算对应状态的回报然后取平均近似,称之为经验平均回报(empirical mean return)。根据大数定律,只要采样的轨迹数量足够多,计算出的经验平均回报就能趋近于实际的状态价值函数。当然,蒙特卡洛方法有一定的局限性,即只适用于有终止状态的马尔可夫决策过程。
+$\qquad$ 对于状态数量更多的情况,直接按照上述的方式去计算价值函数是不现实的。蒙特卡洛方法的思路是我们可以采样大量的轨迹,对于每个轨迹计算对应状态的回报然后取平均近似,称之为经验平均回报( $\text{empirical mean return}$ )。根据大数定律,只要采样的轨迹数量足够多,计算出的经验平均回报就能趋近于实际的状态价值函数。当然,蒙特卡洛方法有一定的局限性,即只适用于有终止状态的马尔可夫决策过程。
-蒙特卡洛方法主要分成两种算法,一种是首次访问蒙特卡洛($\text{First-visit Monte Carlo,FVMC}$)方法,另外一种是每次访问蒙特卡洛($\text{Every-visit Monte Carlo,EVMC}$)方法。$\text{FVMC}$ 方法主要包含两个步骤,首先是产生一个回合的完整轨迹,然后遍历轨迹计算每个状态的回报。注意,只在第一次遍历到某个状态时会记录并计算对应的回报,对应伪代码如图所示。而在 $\text{EVMC}$ 方法中不会忽略统一状态的多个回报,在前面的示例中,我们计算价值函数的方式就是 $\text{Every-visit} ,比如对于状态 $s_4$ ,我们考虑了所有轨迹即 $G_{\tau_3}$ 和 $G_{\tau_4}$ 的回报,而在 $\text{FVMC}$ 我们只会记录首次遍历的回报,即 $G_{\tau_3}$ 和 $G_{\tau_4}$ 其中的一个,具体取决于遍历到 $s_4$ 时对应的轨迹是哪一条。
+$\qquad$ 蒙特卡洛方法主要分成两种算法,一种是首次访问蒙特卡洛($\text{first-visit Monte Carlo,FVMC}$)方法,另外一种是每次访问蒙特卡洛($\text{every-visit Monte Carlo,EVMC}$)方法。$\text{FVMC}$ 方法主要包含两个步骤,首先是产生一个回合的完整轨迹,然后遍历轨迹计算每个状态的回报。注意,只在第一次遍历到某个状态时会记录并计算对应的回报,对应伪代码如图 $\text{4-3}$ 所示。
+
+$\qquad$ 而在 $\text{EVMC}$ 方法中不会忽略统一状态的多个回报,在前面的示例中,我们计算价值函数的方式就是 $\text{every-visit}$ ,比如对于状态 $s_4$ ,我们考虑了所有轨迹即 $G_{\tau_3}$ 和 $G_{\tau_4}$ 的回报,而在 $\text{FVMC}$ 我们只会记录首次遍历的回报,即 $G_{\tau_3}$ 和 $G_{\tau_4}$ 其中的一个,具体取决于遍历到 $s_4$ 时对应的轨迹是哪一条。
-图 $4.3$ 首次访问蒙特卡洛算法伪代码
+图 $\text{4-3}$ 首次访问蒙特卡洛算法伪代码
-实际上无论是 $\text{FVMC}$ 还是 $\text{EVMC}$ 在实际更新价值函数的时候是不会像伪代码中体现的那样 $V\left(S_t\right) \leftarrow \operatorname{average}\left(\operatorname{Returns}\left(S_t\right)\right)$,每次计算到新的回报 $ G_t = \operatorname{average}\left(\operatorname{Returns}\left(S_t\right)\right)$ 直接就赋值到已有的价值函数中,而是以一种递进更新的方式进行的,如式 $\text(4.3)$ 所示。
+$\qquad$ 实际上无论是 $\text{FVMC}$ 还是 $\text{EVMC}$ 在实际更新价值函数的时候是不会像伪代码中体现的那样 $V\left(S_t\right) \leftarrow \operatorname{average}\left(\operatorname{Returns}\left(S_t\right)\right)$,每次计算到新的回报 $ G_t = \operatorname{average}\left(\operatorname{Returns}\left(S_t\right)\right)$ 直接就赋值到已有的价值函数中,而是以一种递进更新的方式进行的,如式 $\text{(4.3)}$ 所示。
$$
\tag{4.3}
新的估计值 \leftarrow 旧的估计值 + 步长 *(目标值-旧的估计值)
$$
-这样的好处就是不会因为个别不好的样本而导致更新的急剧变化,从而导致学习得不稳定,这种模式在今天的深度学习中普遍可见,这里的步长就是深度学习中的学习率。
+$\qquad$ 这样的好处就是不会因为个别不好的样本而导致更新的急剧变化,从而导致学习得不稳定,这种模式在今天的深度学习中普遍可见,这里的步长就是深度学习中的学习率。
-对应到蒙特卡洛方法中,更新公式可表示为式 $\text(4.4)$ :
+$\qquad$ 对应到蒙特卡洛方法中,更新公式可表示为式 $\text{(4.4)}$ 。
$$
\tag{4.4}
V(s_t) \leftarrow V(s_t) + \alpha[G_t- V(s_{t})]
$$
-其中 $\alpha$ 表示学习率,$G_t- V(S_{t+1})$为目标值与估计值之间的误差(error)。
-此外,$\text{FVMC}$ 是一种基于回合的增量式方法,具有无偏性和收敛快的优点,但是在状态空间较大的情况下,依然需要训练很多个回合才能达到稳定的结果。而 $\text{EVMC}$ 则是更为精确的预测方法,但是计算的成本相对也更高。
+$\qquad$ 其中 $\alpha$ 表示学习率,$G_t- V(S_{t+1})$为目标值与估计值之间的误差( $\text{error}$ )。此外,$\text{FVMC}$ 是一种基于回合的增量式方法,具有无偏性和收敛快的优点,但是在状态空间较大的情况下,依然需要训练很多个回合才能达到稳定的结果。而 $\text{EVMC}$ 则是更为精确的预测方法,但是计算的成本相对也更高。
## 时序差分估计
-时序差分估计方法是一种基于经验的动态规划方法,它结合了蒙特卡洛和动态规划的思想。最简单的时序差分可以表示为式 $\text(4.5)$ :
+$\qquad$ 时序差分估计方法是一种基于经验的动态规划方法,它结合了蒙特卡洛和动态规划的思想。最简单的时序差分可以表示为式 $\text{(4.5)}$ 。
$$
\tag{4.5}
V(s_t) \leftarrow V(s_t) + \alpha[r_{t+1}+\gamma V(s_{t+1})- V(s_{t})]
$$
-这种算法一般称为**单步时序差分(one-step TD)**,即 $TD(0)$。可以看到,在这个更新过程中使用了当前奖励和后继状态的估计,这是类似于蒙特卡罗方法的;但同时也利用了贝尔曼方程的思想,将下一状态的值函数作为现有状态值函数的一部分估计来更新现有状态的值函数。此外,时序差分还结合了自举( $\text{Bootstrap}$ )的思想,即未来状态的价值是通过现有的估计 $r_{t+1}+\gamma V(s_{t+1})$ (也叫做**时序差分目标**)进行计算的,即使用一个状态的估计值来更新该状态的估计值,没有再利用后续状态信息的计算方法。这种方法的好处在于可以将问题分解成只涉及一步的预测,从而简化计算。此外,$\delta=r_{t+1}+\gamma V(s_{t+1})- V(s_{t})$被定义为**时序差分误差( $\text{TD error}$ )**。
+$\qquad$ 这种算法一般称为**单步时序差分**( $\text{one-step TD}$ ),即 $TD(0)$。可以看到,在这个更新过程中使用了当前奖励和后继状态的估计,这是类似于蒙特卡罗方法的;但同时也利用了贝尔曼方程的思想,将下一状态的值函数作为现有状态值函数的一部分估计来更新现有状态的值函数。此外,时序差分还结合了自举( $\text{bootstrap}$ )的思想,即未来状态的价值是通过现有的估计 $r_{t+1}+\gamma V(s_{t+1})$ (也叫做**时序差分目标**)进行计算的,即使用一个状态的估计值来更新该状态的估计值,没有再利用后续状态信息的计算方法。这种方法的好处在于可以将问题分解成只涉及一步的预测,从而简化计算。此外,$\delta=r_{t+1}+\gamma V(s_{t+1})- V(s_{t})$被定义为 **时序差分误差**( $\text{TD error}$ )。
-但有一点需要注意的是,由于基于时步的学习方式,并且终止状态没有下一步,比如当 $V(s_{t})$ 是终止状态时,$\gamma V(s_{t+1})$ 是没有意义的。因此时序差分方法在实践过程中会把终止状态单独做一个判断,即将对应未来状态的估计值设置为 $0$,然后更新当前状态的估计值,这个过程也被称作**回溯**,如式 $\text(4.6)$ 所示,后面所有基于时序差分的方法都会有这样的一个判断。
+$\qquad$ 但有一点需要注意的是,由于基于时步的学习方式,并且终止状态没有下一步,比如当 $V(s_{t})$ 是终止状态时,$\gamma V(s_{t+1})$ 是没有意义的。因此时序差分方法在实践过程中会把终止状态单独做一个判断,即将对应未来状态的估计值设置为 $0$,然后更新当前状态的估计值,这个过程也被称作**回溯**,如式 $\text{(4.6)}$ 所示,后面所有基于时序差分的方法都会有这样的一个判断。
$$
\tag{4.6}
@@ -97,7 +110,7 @@ $$
## 时序差分和蒙特卡洛的比较
-结合图 $4.4$ 总结一下时序差分方法和蒙特卡洛方法之间的差异。
+$\qquad$ 结合图 $4.4$ 总结一下时序差分方法和蒙特卡洛方法之间的差异。
* 时序差分方法可以在线学习( $\text{online learning}$ ),每走一步就可以更新,效率高。蒙特卡洛方法必须等游戏结束时才可以学习。
* 时序差分方法可以从不完整序列上进行学习。蒙特卡洛方法只能从完整的序列上进行学习。
@@ -112,7 +125,7 @@ $$
## n 步时序差分
-把时序差分方法进一步拓展,之前只是向前自举了一步,即 $\text{TD(0)}$ ,我们可以调整为两步,利用两步得到的回报来更新状态的价值,调整 $n$ 步就是 $n$ 步时序差分($\text{n-step TD}$,如式 $\text{4.7}$ 所示:
+$\qquad$ 把时序差分方法进一步拓展,之前只是向前自举了一步,即 $\text{TD(0)}$ ,我们可以调整为两步,利用两步得到的回报来更新状态的价值,调整 $n$ 步就是 $n$ 步时序差分($\text{n-step TD}$),如式 $\text{4.7}$ 所示。
$$
\tag{4.7}
@@ -124,28 +137,27 @@ $$
\end{aligned}
$$
-我们会发现当 $n$ 趋近于无穷大时,就变成了蒙特卡洛方法,因此可以通过调整自举的步数,来实现蒙特卡洛方法和时序差分方法之间的权衡。
-
-以下是一些常见的方法来选择合适的 $\lambda$ :
+$\qquad$ 我们会发现当 $n$ 趋近于无穷大时,就变成了蒙特卡洛方法,因此可以通过调整自举的步数,来实现蒙特卡洛方法和时序差分方法之间的权衡。这个 $n$ 我们通常会用
+$\lambda$ 来表示,即 $\text{TD}(\lambda)$ 方法。
-网格搜索( $\text{Grid Search}$ ):对于给定的一组 $\lambda$ 值,可以通过网格搜索方法在这些值中进行遍历,并评估每个值对应的算法性能。选择在验证集上表现最好的 $\lambda$ 值作为最终的选择。
+$\qquad$ 以下是一些常见的方法来选择合适的 $\lambda$ 。
-随机搜索( $\text{Random Search}$ ):随机选择一组 $\lambda$ 值,在验证集上评估每个值对应的算法性能。通过多次随机搜索,可以得到更好的 $\lambda$ 值。
+* 网格搜索( $\text{Grid Search}$ ):对于给定的一组 $\lambda$ 值,可以通过网格搜索方法在这些值中进行遍历,并评估每个值对应的算法性能。选择在验证集上表现最好的 $\lambda$ 值作为最终的选择。
-自适应选择:在训练过程中逐渐适应地调整 $\lambda$ 的取值。例如,可以在训练的早期使用较小的 $\lambda$ 值,以更多地依赖单步TD误差来减小偏差;在训练的后期逐渐增大 $\lambda$ 值,以更多地依赖多步回报来减小方差。
+* 随机搜索( $\text{Random Search}$ ):随机选择一组 $\lambda$ 值,在验证集上评估每个值对应的算法性能。通过多次随机搜索,可以得到更好的 $\lambda$ 值。
-交叉验证( $\text{Cross-validation}$ ):将数据集划分为多个子集,交叉验证不同的 $\lambda$ 值,并平均它们的性能评估结果。这样可以更好地估计不同 $\lambda$ 值的泛化性能。
+* 自适应选择:在训练过程中逐渐适应地调整 $\lambda$ 的取值。例如,可以在训练的早期使用较小的 $\lambda$ 值,以更多地依赖单步TD误差来减小偏差;在训练的后期逐渐增大 $\lambda$ 值,以更多地依赖多步回报来减小方差。
-经验取值:在某些情况下,根据先前的经验或已知的任务特性,可以选择一些常用的 $\lambda$ 取值作为初始值,并进一步微调。
+* 交叉验证( $\text{Cross-validation}$ ):将数据集划分为多个子集,交叉验证不同的 $\lambda$ 值,并平均它们的性能评估结果。这样可以更好地估计不同 $\lambda$ 值的泛化性能。
-无论使用哪种方法,重要的是要在合适的验证集上评估不同 $\lambda$ 值对应的算法性能。找到使得算法在验证集上表现最佳的 $\lambda$ 值,以确保在测试集或真实环境中获得良好的性能。
+* 经验取值:在某些情况下,根据先前的经验或已知的任务特性,可以选择一些常用的 $\lambda$ 取值作为初始值,并进一步微调。
-需要注意的是,$\lambda$ 的最佳取值可能因任务、环境和算法的不同而异。因此,选择合适的 $\lambda$ 值是一个实验过程,需要根据具体问题进行调整。在实际应用中,可以结合多种方法来找到最佳的 $\lambda$ 值,以获得更好的性能。
+$\qquad$ 需要注意的是,无论使用哪种方法,$\lambda$ 的最佳取值可能因任务、环境和算法的不同而异。因此,选择合适的 $\lambda$ 值是一个实验过程,需要根据具体问题进行调整。在实际应用中,可以结合多种方法来找到最佳的 $\lambda$ 值,以获得更好的性能。
## 本章小结
-本章重点讲解了两种常见的免模型预测方法,蒙特卡洛和时序差分方法。另外涉及到了一些关键的概念,有模型与免模型,预测与控制,建议读者熟练掌握。
+$\qquad$ 本章重点讲解了两种常见的免模型预测方法,蒙特卡洛和时序差分方法。另外涉及到了一些关键的概念,有模型与免模型,预测与控制,建议读者熟练掌握。
## 面试题
1. 有模型与免模型算法的区别?举一些相关的算法?
diff --git a/docs/ch5/main.md b/docs/ch5/main.md
index 232824d..c361213 100644
--- a/docs/ch5/main.md
+++ b/docs/ch5/main.md
@@ -1,33 +1,33 @@
# 免模型控制
-回顾前面讲的控制,即给定一个马尔可夫决策过程,输出最优策略以及对应的最优价值函数。而免模型则是指不需要知道环境的状态转移概率的一类算法,实际上很多经典的强化学习算法都是免模型控制的。本章会重点介绍两种基础的免模型算法,$\text{Q-learning}$ 和 $\text{Sarsa}$ ,也都是基于时序差分的方法。
+$\qquad$ 回顾前面讲的控制,即给定一个马尔可夫决策过程,输出最优策略以及对应的最优价值函数。而免模型则是指不需要知道环境的状态转移概率的一类算法,实际上很多经典的强化学习算法都是免模型控制的。本章会重点介绍两种基础的免模型算法,$\text{Q-learning}$ 和 $\text{Sarsa}$ ,也都是基于时序差分的方法。
## Q-learning 算法
-在时序差分方法的章节中我们讲的是状态价值函数的时序差分,其目的是为了预测每个状态的价值。而在预测与控制的内容中我们提到了控制的方法是需要输出最优策略的同时,也会输出对应的状态价值函数,预测的方法也是为了帮助解决控制问题做一个铺垫。不知道读者还记不记得,策略与状态价值函数之间是存在一个联系的,这个联系就是动作价值函数,如式 $\text(5.1)$ 所示:
+$\qquad$ 在时序差分方法的章节中我们讲的是状态价值函数的时序差分,其目的是为了预测每个状态的价值。而在预测与控制的内容中我们提到了控制的方法是需要输出最优策略的同时,也会输出对应的状态价值函数,预测的方法也是为了帮助解决控制问题做一个铺垫。不知道读者还记不记得,策略与状态价值函数之间是存在一个联系的,这个联系就是动作价值函数,如式 $\text(5.1)$ 所示:
$$
\tag{5.1}
V_\pi(s)=\sum_{a \in A} \pi(a \mid s) Q_\pi(s, a)
$$
-因此,为了解决控制问题,我们只需要直接预测动作价值函数,然后在决策时选择动作价值即 Q 值最大对应的动作即可。这样一来,策略和动作价值函数同时达到最优,相应的状态价值函数也是最优的,这就是 $\text{Q-learning}$ 算法的思路。
+$\qquad$ 因此,为了解决控制问题,我们只需要直接预测动作价值函数,然后在决策时选择动作价值即 Q 值最大对应的动作即可。这样一来,策略和动作价值函数同时达到最优,相应的状态价值函数也是最优的,这就是 $\text{Q-learning}$ 算法的思路。
-$\text{Q-learning}$ 算法更新公式如式 $\text(5.2)$ 所示:
+$\text{Q-learning}$ 算法更新公式如式 $\text{(5.2)}$ 所示。
$$
\tag{5.2}
Q(s_t,a_t) \leftarrow Q(s_t,a_t)+\alpha[r_t+\gamma\max _{a}Q(s_{t+1},a)-Q(s_t,a_t)]
$$
-我们再回忆一下时序差分方法中状态价值函数的更新公式,如式 $\text(4.5)$ :
+$\qquad$ 我们再回忆一下时序差分方法中状态价值函数的更新公式,如式 $\text(4.5)$ :
$$
\tag{5.3}
V(s_t) \leftarrow V(s_t) + \alpha[r_{t+1}+\gamma V(s_{t+1})- V(s_{t})]
$$
-我们会发现两者的更新方式是一样的,都是基于时序差分的更新方法。不同的是,动作价值函数更新时是直接拿最大的未来动作价值的 $\gamma\max _{a}Q(s_{t+1},a)$ 来估计的,而在状态价值函数更新中相当于是拿对应的平均值来估计的。这就会导致这个估计相当于状态价值函数中的估计更不准确,一般称为 **Q 值的过估计**,当然这个过估计仅仅限于以 $\text{Q-learning}$ 为基础的算法,不同的算法为了优化这个问题使用了不同的估计方式,其中就包括本章后面会讲的 Sarsa 算法,暂时先不详细展开。
+$\qquad$ 我们会发现两者的更新方式是一样的,都是基于时序差分的更新方法。不同的是,动作价值函数更新时是直接拿最大的未来动作价值的 $\gamma\max _{a}Q(s_{t+1},a)$ 来估计的,而在状态价值函数更新中相当于是拿对应的平均值来估计的。这就会导致这个估计相当于状态价值函数中的估计更不准确,一般称为 **Q 值的过估计**,当然这个过估计仅仅限于以 $\text{Q-learning}$ 为基础的算法,不同的算法为了优化这个问题使用了不同的估计方式,其中就包括本章后面会讲的 Sarsa 算法,暂时先不详细展开。
### Q 表格
diff --git "a/words/\347\254\2541\347\253\240 \347\273\252\350\256\272.docx" "b/words/\347\254\2541\347\253\240 \347\273\252\350\256\272.docx"
index 7dfdcd6..6a5105a 100644
Binary files "a/words/\347\254\2541\347\253\240 \347\273\252\350\256\272.docx" and "b/words/\347\254\2541\347\253\240 \347\273\252\350\256\272.docx" differ
diff --git "a/words/\347\254\2542\347\253\240 \351\251\254\345\260\224\345\217\257\345\244\253\345\206\263\347\255\226\350\277\207\347\250\213.docx" "b/words/\347\254\2542\347\253\240 \351\251\254\345\260\224\345\217\257\345\244\253\345\206\263\347\255\226\350\277\207\347\250\213.docx"
index 27f9348..771b570 100644
Binary files "a/words/\347\254\2542\347\253\240 \351\251\254\345\260\224\345\217\257\345\244\253\345\206\263\347\255\226\350\277\207\347\250\213.docx" and "b/words/\347\254\2542\347\253\240 \351\251\254\345\260\224\345\217\257\345\244\253\345\206\263\347\255\226\350\277\207\347\250\213.docx" differ
diff --git "a/words/\347\254\2543\347\253\240 \345\212\250\346\200\201\350\247\204\345\210\222.docx" "b/words/\347\254\2543\347\253\240 \345\212\250\346\200\201\350\247\204\345\210\222.docx"
index 098789f..c6ccbbd 100644
Binary files "a/words/\347\254\2543\347\253\240 \345\212\250\346\200\201\350\247\204\345\210\222.docx" and "b/words/\347\254\2543\347\253\240 \345\212\250\346\200\201\350\247\204\345\210\222.docx" differ
diff --git "a/words/\347\254\2544\347\253\240 \345\205\215\346\250\241\345\236\213\351\242\204\346\265\213.docx" "b/words/\347\254\2544\347\253\240 \345\205\215\346\250\241\345\236\213\351\242\204\346\265\213.docx"
index 6ca344d..efb2694 100644
Binary files "a/words/\347\254\2544\347\253\240 \345\205\215\346\250\241\345\236\213\351\242\204\346\265\213.docx" and "b/words/\347\254\2544\347\253\240 \345\205\215\346\250\241\345\236\213\351\242\204\346\265\213.docx" differ