diff --git a/docs/ch1/main.md b/docs/ch1/main.md index 0fee305..953316a 100644 --- a/docs/ch1/main.md +++ b/docs/ch1/main.md @@ -1,6 +1,8 @@ # 第 1 章 绪论 -$\qquad$ 在正式介绍具体的强化学习算法之前,本章将宏观地讨论一下强化学习( $\text{reinforcement learning,RL}$ )的相关概念以及应用等,帮助读者更好地 “观其大略” 。尤其是对于想用强化学习做一些交叉研究的读者来说,更应该首先通过本章了解强化学习是什么,大概能做什么,能做到什么样的效果等等,而不是直接从一个个的算法开始。强化学习发展至今,尽管算法已经有成百上千种样式,但实际上从大类来看要掌握的核心并不多,大多数算法都只是做了一些较小的改进。举个例子,如图 $\text{1-1}$ 所示,我们知道用水加上咖啡豆通过一定的方法就能调制成咖啡,加上糖块就能变成糖水,虽然看起来形式不同,但本质上都是水,只是为了符合不同的口味而已。 +$\qquad$ 在正式介绍具体的强化学习算法之前,本章将宏观地讨论一下强化学习( $\text{reinforcement learning,RL}$ )的相关概念以及应用等,帮助读者更好地 “观其大略” 。尤其是对于想用强化学习做一些交叉研究的读者来说,更应该首先通过本章了解强化学习是什么,大概能做什么,能做到什么样的效果等等,而不是直接从一个个的算法开始。 + +$\qquad$ 强化学习发展至今,尽管算法已经有成百上千种样式,但实际上从大类来看要掌握的核心并不多,大多数算法都只是做了一些较小的改进。举个例子,如图 $\text{1-1}$ 所示,我们知道用水加上咖啡豆通过一定的方法就能调制成咖啡,加上糖块就能变成糖水,虽然看起来形式不同,但本质上都是水,只是为了符合不同的口味而已。
@@ -9,7 +11,9 @@ $\qquad$ 在正式介绍具体的强化学习算法之前,本章将宏观地 ## 1.1 为什么选择强化学习? -$\qquad$ 首先,我们先讨论一下为什么要学习强化学习,强化学习对于我们的意义是什么。可能大部分读者都是通过先了解到人工智能和机器学习才了解到强化学习的,但实际上早在我们认知人工智能之前就已经不知不觉地接触到了强化学习。笔者想起了初中生物课本中关于蚯蚓的一个实验,其内容大致是这样的:如图 $\text{1-2}$ 所示,将蚯蚓放在一个盒子中,盒子中间有一条分叉路口,路口尽头分别放有食物和电极,让蚯蚓自己爬行到其中一个路口的尽头,在食物的一端蚯蚓会品尝到美味,而在电极的一头则会受到轻微的电击。 +$\qquad$ 首先,我们先讨论一下为什么要学习强化学习,强化学习对于我们的意义是什么。可能大部分读者都是通过先了解到人工智能和机器学习才了解到强化学习的,但实际上早在我们认知人工智能之前就已经不知不觉地接触到了强化学习。 + +$\qquad$ 笔者想起了初中生物课本中关于蚯蚓的一个实验,其内容大致是这样的:如图 $\text{1-2}$ 所示,将蚯蚓放在一个盒子中,盒子中间有一条分叉路口,路口尽头分别放有食物和电极,让蚯蚓自己爬行到其中一个路口的尽头,在食物的一端蚯蚓会品尝到美味,而在电极的一头则会受到轻微的电击。
@@ -69,10 +73,12 @@ $\qquad$ 强化学习不光应用十分广泛,从技术角度来讲子方向 * 多任务强化学习( $\text{multi-task reinforcement learning}$ )。这个问题在深度学习中也较为常见,在实际应用中,智能体往往需要同时解决多个任务,例如机器人需要同时完成抓取、搬运、放置等任务,而不是单一的抓取任务。在这种情况下,如何在多个任务之间做出权衡是一个难题。目前比较常用的方法有联合训练( $\text{joint training}$ )和分层强化学习( $\text{hierarchical reinforcement learning}$ )等等。联合训练的思路是将多个任务的奖励进行加权求和,然后通过强化学习来学习一个策略。分层强化学习的思路是将多个任务分为两个层次,一个是高层策略,另一个是低层策略。高层策略的作用是决策当前的任务,而低层策略的作用是决策当前任务的动作。这样就可以通过强化学习来学习高层策略和低层策略,从而解决多任务强化学习的问题。但分层强化学习也存在着一定的问题,例如高层策略的决策可能会导致低层策略的决策出错,因此如何提高高层策略的决策精度也是一个难题。 -## 学习本书之前的一些准备 +## 1.4 学习本书之前的一些准备 $\qquad$ 我们先介绍一下关于本书的初衷。其实日前强化学习相关的书籍在市面上已经琳琅满目了,但是这些普遍偏向理论,缺少一些实际的经验性总结,比如大佬们可能会通过数学推导来告诉你某某算法是可行的,可是一些实验细节和不同算法的对比很难在这些书籍中体现出来,理论与实践之间、公式与代码之间其实存在着一定的鸿沟。另一方面,由于信息时代知识的高速迭代,面对如海洋一般的信息,我们需要从中梳理出重点并快速学习,以便于尽快看到实际应用的效果,而这中间就不得不需要一个经验丰富的老师傅来带路了,这也是本书的初衷之一。笔者会基于大量的强化学习实践经验,对于理论部分删繁就简,并与实践紧密结合,以更通俗易懂的方式帮助读者们快速实践。 $\qquad$ 其次,在具体的学习之前,先给读者做一些基础的知识铺垫。第一,强化学习是机器学习的一个分支,因此读者需要具备一定的机器学习基础,例如基本的线性代数、概率论、数理统计等等。当然只需要读者们修过相关的大学课程即可,不必先去刻意回顾一些知识,原理部分跟随本书的推导即可。第二,在学习强化学习初期是不涉及深度神经网络相关的东西的,这一部分通常称为传统强化学习部分。尽管这部分的算法在今天已经不常用,但是其中蕴含的一些思想和技巧是非常重要的,因此读者们需要对这部分内容有所了解。在过渡到结合神经网络的深度强化学习部分之前,本书会花一章的时间帮助读者整理需要的深度学习知识。 $\qquad$ 深度学习在强化学习中扮演的角色主要是提供了一个强大的函数拟合能力,使得智能体能够处理复杂、高维度和非线性的环境。深度学习与强化学习之间的关系相当于眼睛和大脑的关键,眼睛是帮助大脑决策更好地观测世界的工具,对于一些没有眼睛的动物例如蚯蚓也可以通过其他的感官来观测并解析状态。再比如,同样大脑水平下,即相同的强化学习算法条件下,正常人要比双目失明的人日常的决策要更方便。但是,即使深度学习部分是相同的,例如正常大人和小孩都能通过眼睛观测世界,然由于大脑决策水平的差异也会让两者表现有所差异。总而言之,深度与强化在更复杂的环境下缺一不可。最后,尽管强化学习算法很多,但基本上就分为两类,即基于价值的和基于策略梯度的算法,这两种算法各有优势,请读者们再学习之后根据实际需要谨慎选择即可。 + + diff --git a/docs/ch10/main.md b/docs/ch10/main.md index 7f6b0ca..49c5934 100644 --- a/docs/ch10/main.md +++ b/docs/ch10/main.md @@ -31,7 +31,7 @@ tag{10.1} \end{aligned} $$ -$\qquad$ 在 $\text{Actor-Critic}$ 算法中,我们使用蒙特卡洛估计来表示当前状态-动作对 $(s_t,a_t)$ 的价值。而这里其实可以类比于 $Q$ 函数,用 $Q^\pi(s_t, a_t)$ 来估计当前的价值,注意这里的输入是状态和动作,而不单单是状态,输出的是单个值,也可以用 $Q_{\phi}(s_t, a_t)$ 表示,其中 $\phi$ 表示 $\text{Critic}$ 网络的参数。这样我们就可以将目标函数写成如式 $\text(10.2)$ 所示的形式。 +$\qquad$ 在 $\text{REINFORCE}$ 算法中,我们使用蒙特卡洛估计来表示当前状态-动作对 $(s_t,a_t)$ 的价值。而这里其实可以类比于 $Q$ 函数,用 $Q^\pi(s_t, a_t)$ 来估计当前的价值,注意这里的输入是状态和动作,而不单单是状态,输出的是单个值,也可以用 $Q_{\phi}(s_t, a_t)$ 表示,其中 $\phi$ 表示 $\text{Critic}$ 网络的参数。这样我们就可以将目标函数写成如式 $\text(10.2)$ 所示的形式。 $$ tag{10.2} @@ -211,7 +211,7 @@ $\qquad$ 注意这里直接利用了 `PyTorch` 中的 `Categorical` 分布函数 ### 10.5.3 策略更新 -我们首先需要计算出优势函数,一般先计算出回报,然后减去网络输出的值即可,如代码清单 $\text{10-4}$ 所示。 +$\qquad$ 我们首先需要计算出优势函数,一般先计算出回报,然后减去网络输出的值即可,如代码清单 $\text{10-4}$ 所示。
代码清单 $\text{10-4}$ 计算优势函数
@@ -266,10 +266,19 @@ class Agent: return actor_loss, critic_loss ``` -到这里,我们就实现了 $\text{A2C}$ 算法的所有核心代码,完整代码请读者参考本书的代码仓库。最后展示一下训练的效果,如图 $\text{10-3}$ 所示。 +$\qquad$ 到这里,我们就实现了 $\text{A2C}$ 算法的所有核心代码,完整代码请读者参考本书的代码仓库。最后展示一下训练的效果,如图 $\text{10-3}$ 所示。
-
图 $\text{10-3}$ $\text{CartPole}$ 环境 $\text{A2C}$ 算法训练曲线
\ No newline at end of file +
图 $\text{10-3}$ $\text{CartPole}$ 环境 $\text{A2C}$ 算法训练曲线
+ +## 10.5 本章小结 + +$\qquad$ 本章主要介绍了 $\text{A2C}$ 与 $\text{A3C}$ 算法,相比于前一章讲的 $\text{REINFORCE}$ 算法,主要优化了 $\text{Critic}$ 部分的估计,提高了算法的收敛速度。并且通过引入异步训练的方式来进一步提高这类算法的收敛速度,实践中我们会用 $\text{multiprocessing}$ 等多进程模块来实现。 + +## 10.6 练习题 + +1. 相比于 $\text{REINFORCE}$ 算法, $\text{A2C}$ 主要的改进点在哪里,为什么能提高速度? +2. $\text{A2C}$ 算法是 $\text{on-policy}$ 的吗?为什么? \ No newline at end of file diff --git a/docs/ch11/main.md b/docs/ch11/main.md index 01f5467..3c12114 100644 --- a/docs/ch11/main.md +++ b/docs/ch11/main.md @@ -9,11 +9,11 @@ $\qquad$ 本章先讲 $\text{DDPG}$ 算法和 $\text{TD3}$ 算法,其中后者 $\qquad$ 深度确定性策略梯度算法( $\text{deep deterministic policy gradient,DDPG}$),是一种确定性的策略梯度算法。为了让读者更好地理解 $\text{DDPG}$ 算法,我们先把 “深度” 二字去掉,即先介绍一下 $\text{DPG}$ 算法,也是 $\text{DDPG}$ 算法的核心所在。 -$\qquad$ 有了前面 $\text{Actor-Critic}$ 算法的铺垫之后,从策略梯度的角度来理解 $\text{DPG}$ 算法是比较容易的。首先我们知道 $\text{DQN}$ 算法的一个主要缺点就是不能用于连续动作空间,这是因为在 $\text{DQN}$ 算法中动作是通过贪心策略或者说 $\text{argmax}$ 的方式来从 $Q$ 函数间接得到,这里 $Q$ 函数就相当于 $\text{DDPG}$ 算法 中的 $\text{Critic}$。 +$\qquad$ 有了前面 $\text{Actor-Critic}$ 算法的铺垫之后,从策略梯度的角度来理解 $\text{DPG}$ 算法是比较容易的。首先我们知道 $\text{DQN}$ 算法的一个主要缺点就是不能用于连续动作空间,这是因为在 $\text{DQN}$ 算法中动作是通过贪心策略或者说 $\text{argmax}$ 的方式来从 $Q$ 函数间接得到,这里 $Q$ 函数就相当于 $\text{DDPG}$ 算法中的 $\text{Critic}$。 $\qquad$ 而要想适配连续动作空间,我们干脆就将选择动作的过程变成一个直接从状态映射到具体动作的函数 $\mu_\theta (s)$,其中 $\theta$ 表示模型的参数,这样一来就把求解 $Q$ 函数、贪心选择动作这两个过程合并成了一个函数,也就是我们常说的 $\text{Actor}$ 。注意,这里的 $\mu_\theta (s)$ 输出的是一个动作值,而不是像 $\text{Actor-Critic}$ 章节中提到的概率分布 $\pi_{\theta}(a|s)$。 -$\qquad$ 我们知道 $Q(s,a)$ 函数实际上是有两个变量的,相当于一个曲线平面,如图 $\text{11-1}$ 所示。当我们输入某个状态到 $\text{Actor}$ 时,即固定 $s=s_t$ 时,则相当于把曲线平面截断成一条曲线。而 $\text{Actor}$ 的任务就是寻找这条曲线的最高点,并返回对应的横坐标,即 最大 $Q$ 值对应的动作。 +$\qquad$ 我们知道 $Q(s,a)$ 函数实际上是有两个变量的,相当于一个曲线平面,如图 $\text{11-1}$ 所示。当我们输入某个状态到 $\text{Actor}$ 时,即固定 $s=s_t$ 时,则相当于把曲线平面截断成一条曲线。而 $\text{Actor}$ 的任务就是寻找这条曲线的最高点,并返回对应的横坐标,即最大 $Q$ 值对应的动作。
@@ -142,11 +142,11 @@ $$ $\qquad$ 其中 $N(0, \sigma)$ 表示均值为 $\text{0}$,方差为 $\sigma$ 的高斯噪声,$\epsilon$ 表示噪声,$\operatorname{clip}$ 表示裁剪函数,即将噪声裁剪到 $[-c, c]$ 的范围内,$c$ 是一个超参数,用于控制噪声的大小。可以看到,这里噪声更像是一种正则化的方式,使得值函数更新更加平滑,因此笔者称之为噪声正则。 -## 10.5 实战:DDPG 算法 +## 11.5 实战:DDPG 算法 $\qquad$ 同之前章节一样,本书在实战中将演示一些核心的代码,完整的代码请参考 $\text{JoyRL}$ 代码仓库。 -### 10.5.1 DDPG 伪代码 +### 11.5.1 DDPG 伪代码 $\qquad$ 如图 $\text{11-3}$ 所示,$\text{DDPG}$ 算法的训练方式其实更像 $\text{DQN}$ 算法。注意在第 $15$ 步中 $\text{DDPG}$ 算法将当前网络参数复制到目标网络的方式是软更新,即每次一点点地将参数复制到目标网络中,与之对应的是 $\text{DQN}$ 算法中的硬更新。软更新的好处是更加平滑缓慢,可以避免因权重更新过于迅速而导致的震荡,同时降低训练发散的风险。 @@ -155,7 +155,7 @@ $\qquad$ 如图 $\text{11-3}$ 所示,$\text{DDPG}$ 算法的训练方式其实
图 $\text{11-3}$ $\text{DDPG}$ 算法伪代码
-### 10.5.2 定义模型 +### 11.5.2 定义模型 $\qquad$ 如代码清单 $\text{11-1}$ 所示,$\text{DDPG}$ 算法的模型结构跟 $\text{Actor-Critic}$ 算法几乎是一样的,只是由于$\text{DDPG}$ 算法的 $\text{Critic}$ 是 $Q$ 函数,因此也需要将动作作为输入。除了模型之外,目标网络和经验回放的定义方式跟 $\text{DQN}$ 算法一样,这里不做展开。 diff --git a/docs/ch2/main.md b/docs/ch2/main.md index 802ab33..38a5871 100644 --- a/docs/ch2/main.md +++ b/docs/ch2/main.md @@ -1,8 +1,8 @@ -# 马尔可夫决策过程 +# 第2章 马尔可夫决策过程 $\qquad$ 在绪论中我们了解到强化学习是解决序列决策问题的有效方法,而序列决策问题的本质是在与环境交互的过程中学习到一个目标的过程。在本章中,我们将介绍强化学习中最基本的问题模型,即马尔可夫决策过程($\text{Markov decision process,MDP}$),它能够以数学的形式来表达序列决策过程。注意,本章开始包括后面的章节会涉及理论公式推导,建议读者在阅读之前先回顾一下概率论相关知识,尤其是条件概率、全概率期望公式等等。 -## 马尔可夫决策过程 +## 2.1 马尔可夫决策过程 $\qquad$ **马尔可夫决策过程**是强化学习的基本问题模型之一,它能够以数学的形式来描述智能体在与环境交互的过程中学到一个目标的过程。这里智能体充当的是作出决策或动作,并且在交互过程中学习的角色,环境指的是智能体与之交互的一切外在事物,不包括智能体本身。 @@ -31,7 +31,7 @@ $\qquad$ 其中奖励 $r_{t+1}$就相当于我们学习弹钢琴时收到的反 > ③ 这里奖励表示成$r_{t+1}$而不是$r_{t}$,是因为此时的奖励是由于动作$a_t$和状态$s_t$来决定的,也就是执行完动作之后才能收到奖励,因此更强调是下一个时步的奖励。 -## 马尔可夫性质 +## 2.2 马尔可夫性质 $\qquad$ 现在我们介绍马尔可夫决策过程的一个前提,即马尔可夫性质,如式 $\text{(2.2)}$ 所示 @@ -42,9 +42,11 @@ $$ $\qquad$ 这个公式的意思就是在给定历史状态$s_0, s_1,\cdots,s_t$的情况下,某个状态的未来只与当前状态$s_t$有关,与历史的状态无关。这个性质其实对于很多问题有着非常重要的指导意义的,因为这允许我们在没有考虑系统完整历史的情况下预测和控制其行为,随着我们对强化学习的深入会越来越明白这个性质的重要性。实际问题中,有很多例子其实是不符合马尔可夫性质的,比如我们所熟知的棋类游戏,因为在我们决策的过程中不仅需要考虑到当前棋子的位置和对手的情况,还需要考虑历史走子的位置例如吃子等。 -$\qquad$ 换句话说,它们不仅取决于当前状态,还依赖于历史状态。当然这也并不意味着完全不能用强化学习来解决,实际上此时我们可以用深度学习神经网络来表示当前的棋局,并用蒙特卡洛搜索树等技术来模拟玩家的策略和未来可能的状态,来构建一个新的决策模型,这就是著名的 AlphaGO 算法[1](#alphago)。具体的技术细节后面会展开,总之记住在具体的情境下,当我们要解决问题不能严格满足马尔可夫性质的条件时,是可以结合其他的方法来辅助强化学习进行决策的。 +$\qquad$ 换句话说,它们不仅取决于当前状态,还依赖于历史状态。当然这也并不意味着完全不能用强化学习来解决,实际上此时我们可以用深度学习神经网络来表示当前的棋局,并用蒙特卡洛搜索树等技术来模拟玩家的策略和未来可能的状态,来构建一个新的决策模型,这就是著名的 AlphaGO 算法。具体的技术细节后面会展开,总之记住在具体的情境下,当我们要解决问题不能严格满足马尔可夫性质的条件时,是可以结合其他的方法来辅助强化学习进行决策的。 -## 回报 +> ④ Silver, D., Huang, A., Maddison, C. J., Guez, A., Sifre, L., van den Driessche, G., Schrittwieser, J., Antonoglou, I., Panneershelvam, V., Lanctot, M., Dieleman, S., Grewe, D., Nham, J., Kalchbrenner, N., Sutskever, I., Lillicrap, T., Leach, M., Kavukcuoglu, K., Graepel, T. & Hassabis, D. (2016). Mastering the game of Go with deep neural networks and tree search. Nature, 529, 484--. + +## 2.3 回报 $\qquad$ 前面讲到在马尔可夫决策过程中智能体的目标时最大化累积的奖励,通常我们把这个累积的奖励称为回报(Return),用 $G_t$ 表示,最简单的回报公式可以写成式 @@ -52,17 +54,17 @@ $$ G_t = r_1 + r_2 + \cdots + r_T $$ -其中 $T$ 前面提到过了,表示最后一个时步,也就是每回合的最大步数。这个公式其实只适用于有限步数的情境,例如玩一局游戏,无论输赢每回合总是会在有限的步数内会以一个特殊的状态结束,这样的状态称之为终止状态。但也有一些情况是没有终止状态的,换句话说智能体会持续与环境交互,比如人造卫星在发射出去后会一直在外太空作业直到报废或者被回收,这样的任务称之为持续性任务。在持续性任务中上面的回报公式是有问题的,因为此时 $T=\infty$。 +$\qquad$ 其中 $T$ 前面提到过了,表示最后一个时步,也就是每回合的最大步数。这个公式其实只适用于有限步数的情境,例如玩一局游戏,无论输赢每回合总是会在有限的步数内会以一个特殊的状态结束,这样的状态称之为终止状态。但也有一些情况是没有终止状态的,换句话说智能体会持续与环境交互,比如人造卫星在发射出去后会一直在外太空作业直到报废或者被回收,这样的任务称之为持续性任务。在持续性任务中上面的回报公式是有问题的,因为此时 $T=\infty$。 -为了解决这个问题,我们引入一个折扣因子(discount factor)$\gamma$,并可以将回报表示为: +$\qquad$ 为了解决这个问题,我们引入一个折扣因子(discount factor)$\gamma$,并可以将回报表示为: $$ G_t = R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + \cdots = \sum_{k=0}^\infty \gamma^k R_{t+k+1} $$ -其中$\gamma$ 取值范围在0到1之间,它表示了我们在考虑未来奖励时的重要程度,控制着当前奖励和未来奖励之间的权衡。换句话说,它体现了我们对长远目标的关注度。当 $\gamma=0$ 时,我们只会关心当前的奖励,而不会关心将来的任何奖励。而当 $\gamma$ 接近 $1$ 时,我们会对所有未来奖励都给予较高的关注度。 +$\qquad$ 其中$\gamma$ 取值范围在 $0$ 到 $1$ 之间,它表示了我们在考虑未来奖励时的重要程度,控制着当前奖励和未来奖励之间的权衡。换句话说,它体现了我们对长远目标的关注度。当 $\gamma=0$ 时,我们只会关心当前的奖励,而不会关心将来的任何奖励。而当 $\gamma$ 接近 $1$ 时,我们会对所有未来奖励都给予较高的关注度。 -这样做的好处是会让当前时步的回报$G_t$跟下一个时步$G_{t+1}$的回报是有所关联的,即: +$\qquad$ 这样做的好处是会让当前时步的回报$G_t$跟下一个时步$G_{t+1}$的回报是有所关联的,即: $$ \begin{aligned} @@ -74,28 +76,28 @@ $$ 这个公式对于所有$t
图 $2.2$ 马尔可夫链
-如图 2.2 所示,图中每个曲线箭头表示指向自己,比如当学生在认真听讲即处于状态 $s_1$ 时,会有 $0.2$ 的概率继续认真听讲。当然也会分别有 $0.4$ 和 $0.4$ 的概率玩手机($s_2$)或者睡觉($s_3$)。此外,当学生处于状态 $s_2$ 时,也会有 $0.2$ 的概率会到认真听讲的状态($s_1$),像这种两个状态之间能互相切换的情况我们用一条没有箭头的线连接起来,参考无向图的表示。 +$\qquad$ 如图 2.2 所示,图中每个曲线箭头表示指向自己,比如当学生在认真听讲即处于状态 $s_1$ 时,会有 $0.2$ 的概率继续认真听讲。当然也会分别有 $0.4$ 和 $0.4$ 的概率玩手机($s_2$)或者睡觉($s_3$)。此外,当学生处于状态 $s_2$ 时,也会有 $0.2$ 的概率会到认真听讲的状态($s_1$),像这种两个状态之间能互相切换的情况我们用一条没有箭头的线连接起来,参考无向图的表示。 -整张图表示了马尔可夫决策过程中的状态流向,这其实跟数字电路中**有限状态机**的概念是一样的。严格意义上来讲,这张图中并没有完整地描述出马尔可夫决策过程,因为没有包涵动作、奖励等元素,所以一般我们称之为**马尔可夫链(Markov Chain)**,又叫做离散时间的马尔可夫过程(Markov Process),跟马尔可夫决策过程一样,都需要满足马尔可夫性质。因此我们可以用一个概率来表示状态之间的切换,比如 $ P_{12}=P(S_{t+1}=s_2 | S_{t+1}=s_1) = 0.4$ 表示当前时步的状态是 $s_1$ ,即认真听讲时在下一个时步切换到 $s_2$ 即玩手机的概率,我们把这个概率称为**状态转移概率(State Transition Probability)**。拓展到所有状态我们可以表示为: +$\qquad$ 整张图表示了马尔可夫决策过程中的状态流向,这其实跟数字电路中**有限状态机**的概念是一样的。严格意义上来讲,这张图中并没有完整地描述出马尔可夫决策过程,因为没有包涵动作、奖励等元素,所以一般我们称之为**马尔可夫链(Markov Chain)**,又叫做离散时间的马尔可夫过程(Markov Process),跟马尔可夫决策过程一样,都需要满足马尔可夫性质。因此我们可以用一个概率来表示状态之间的切换,比如 $ P_{12}=P(S_{t+1}=s_2 | S_{t+1}=s_1) = 0.4$ 表示当前时步的状态是 $s_1$ ,即认真听讲时在下一个时步切换到 $s_2$ 即玩手机的概率,我们把这个概率称为**状态转移概率(State Transition Probability)**。拓展到所有状态我们可以表示为: $$ P_{ss'} = P(S_{t+1}=s'|S_{t}=s) $$ -即当前状态是 $s$ 时,下一个状态是 $s'$的概率,其中大写的 $S$ 表示所有状态的集合,即 $S=\{s_1,s_2,s_3\}$ 。 +$\qquad$ 即当前状态是 $s$ 时,下一个状态是 $s'$的概率,其中大写的 $S$ 表示所有状态的集合,即 $S=\{s_1,s_2,s_3\}$ 。 -由于状态数是有限的,我们可以把这些概率绘制成表格的形式,如表 $2.1$ 所示。 +$\qquad$ 由于状态数是有限的,我们可以把这些概率绘制成表格的形式,如表 $2.1$ 所示。
@@ -130,7 +132,8 @@ $$
-在数学上也可以用矩阵来表示,如下: +$\qquad$ 在数学上也可以用矩阵来表示,如下: + $$ \begin{gather*} P_{ss'}= @@ -142,7 +145,7 @@ $$ \end{gather*} $$ -这个矩阵就叫做**状态转移矩阵(State Transition Matrix)**,拓展到所有状态可表示为: +$\qquad$ 这个矩阵就叫做**状态转移矩阵(State Transition Matrix)**,拓展到所有状态可表示为: $$ P_{ss'}=\begin{pmatrix} @@ -153,20 +156,24 @@ p_{n1} & p_{n2} & \cdots & p_{nn} \end{pmatrix} $$ -其中 $n$ 表示状态数,注意对于同一个状态所有状态转移概率加起来是等于 $1$ 的,比如对于状态 $s_1$ 来说,$p_{11}+ p_{12}+ \cdots+p_{1n}=1$。还有一个**非常重要的点就是,状态转移矩阵是环境的一部分**,跟智能体是没什么关系的,而智能体会根据状态转移矩阵来做出决策。在这个例子中老师是智能体,学生的状态不管是认真听讲、玩手机还是睡觉这些老师是无法决定的,老师只能根据学生的状态做出决策,比如看见学生玩手机就提醒一下上课认真听讲等等。 +$\qquad$ 其中 $n$ 表示状态数,注意对于同一个状态所有状态转移概率加起来是等于 $1$ 的,比如对于状态 $s_1$ 来说,$p_{11}+ p_{12}+ \cdots+p_{1n}=1$。还有一个**非常重要的点就是,状态转移矩阵是环境的一部分**,跟智能体是没什么关系的,而智能体会根据状态转移矩阵来做出决策。在这个例子中老师是智能体,学生的状态不管是认真听讲、玩手机还是睡觉这些老师是无法决定的,老师只能根据学生的状态做出决策,比如看见学生玩手机就提醒一下上课认真听讲等等。 + +$\qquad$ 此外,在马尔可夫链(马尔可夫过程)的基础上增加奖励元素就会形成**马尔可夫奖励过程(Markov reward process, MRP)**,在马尔可夫奖励过程基础上增加动作的元素就会形成马尔可夫决策过程,也就是强化学习的基本问题模型之一。其中马尔可夫链和马尔可夫奖励过程在其他领域例如金融分析会用的比较多,强化学习则重在决策,这里讲马尔可夫链的例子也是为了帮助读者理解状态转移矩阵的概念。 + +$\qquad$ 到这里我们就可以把马尔可夫决策过程描述成一个今天常用的写法,即用一个五元组 $$ 来表示。其中 $S$ 表示状态空间,即所有状态的集合,$A$ 表示动作空间,$R$ 表示奖励函数,$P$ 表示状态转移矩阵,$\gamma$ 表示折扣因子。想必读者此时已经明白这简简单单的五个字母符号,背后蕴涵了丰富的内容。 + -此外,在马尔可夫链(马尔可夫过程)的基础上增加奖励元素就会形成**马尔可夫奖励过程(Markov reward process, MRP)**,在马尔可夫奖励过程基础上增加动作的元素就会形成马尔可夫决策过程,也就是强化学习的基本问题模型之一。其中马尔可夫链和马尔可夫奖励过程在其他领域例如金融分析会用的比较多,强化学习则重在决策,这里讲马尔可夫链的例子也是为了帮助读者理解状态转移矩阵的概念。 +## 2.5 本章小结 -到这里我们就可以把马尔可夫决策过程描述成一个今天常用的写法,即用一个五元组 $$ 来表示。其中 $S$ 表示状态空间,即所有状态的集合,$A$ 表示动作空间,$R$ 表示奖励函数,$P$ 表示状态转移矩阵,$\gamma$ 表示折扣因子。想必读者此时已经明白这简简单单的五个字母符号,背后蕴涵了丰富的内容。 +$\qquad$ 本章主要介绍了马尔可夫决策过程的概念,它是强化学习的基本问题模型之一,因此读者需要牢牢掌握。此外拓展了一些重要的概念,包括马尔可夫性质、回报、状态转移矩阵、轨迹、回合等,这些概念在我们后面讲解强化学习算法的时候会频繁用到,务必牢记。 -## 本章小结 +## 2.6 练习题 -本章主要介绍了马尔可夫决策过程的概念,它是强化学习的基本问题模型之一,因此读者需要牢牢掌握。此外拓展了一些重要的概念,包括马尔可夫性质、回报、状态转移矩阵、轨迹、回合等,这些概念在我们后面讲解强化学习算法的时候会频繁用到,务必牢记。 +1. 强化学习所解决的问题一定要严格满足马尔可夫性质吗?请举例说明。 -## 参考文献 +2. 马尔可夫决策过程主要包含哪些要素? -
+3. 马尔可夫决策过程与金融科学中的马尔科夫链有什么区别与联系? -- [1] Silver, D., Huang, A., Maddison, C. J., Guez, A., Sifre, L., van den Driessche, G., Schrittwieser, J., Antonoglou, I., Panneershelvam, V., Lanctot, M., Dieleman, S., Grewe, D., Nham, J., Kalchbrenner, N., Sutskever, I., Lillicrap, T., Leach, M., Kavukcuoglu, K., Graepel, T. & Hassabis, D. (2016). Mastering the game of Go with deep neural networks and tree search. Nature, 529, 484--. diff --git a/docs/ch3/main.md b/docs/ch3/main.md index 1dabc20..6e84660 100644 --- a/docs/ch3/main.md +++ b/docs/ch3/main.md @@ -1,8 +1,8 @@ -# 动态规划 +# 第3章 动态规划 $\qquad$ 前面我们讲到马尔可夫决策过程是强化学习中的基本问题模型之一,而解决马尔可夫决策过程的方法我们统称为强化学习算法。本章开始讲强化学习中最基础的算法之一,动态规划(Dynamic Programming, DP)。动态规划其实并不是强化学习领域中独有的算法,它在数学、管理科学、经济学和生物信息学等其他领域都有广泛的应用。动态规划具体指的是在某些复杂问题中,将问题转化为若干个子问题,并在求解每个子问题的过程中保存已经求解的结果,以便后续使用。实际上动态规划更像是一种通用的思路,而不是具体某个算法。在强化学习中,动态规划被用于求解值函数和最优策略。常见的动态规划算法包括值迭代(Value Iteration)、策略迭代(Policy Iteration)和 Q-learning 算法等。 -## 动态规划的编程思想 +## 3.1 动态规划的编程思想 $\qquad$ 动态规划其实是一个看起来好懂但实践起来很复杂的概念,为了帮助读者理解,这里会举一道经典的面试编程题作为示例。 @@ -14,27 +14,27 @@ $\qquad$ 动态规划其实是一个看起来好懂但实践起来很复杂的 > ① 数据来源,[62. 不同路径](https://leetcode.cn/problems/unique-paths/) -如图 3.1 所示,一个机器人位于一个 $m \times n$ 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角即终点(在下图中标记为 “Finish” )。我们需要解决的问题是在这个过程中机器人可以有多少条不同的路径到达终点。 +$\qquad$ 如图 3.1 所示,一个机器人位于一个 $m \times n$ 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角即终点(在下图中标记为 “Finish” )。我们需要解决的问题是在这个过程中机器人可以有多少条不同的路径到达终点。 -这种问题有很多的解法,比如可以直接数出来有多少不同的路径,但当 $m$ 和 $n$ 很大时这种直接计数法就不太适用了。我们讲一讲动态规划的做法,动态规划的解法主要有几个步骤:确定状态,写出状态转移方程和寻找边界条件。 +$\qquad$ 这种问题有很多的解法,比如可以直接数出来有多少不同的路径,但当 $m$ 和 $n$ 很大时这种直接计数法就不太适用了。我们讲一讲动态规划的做法,动态规划的解法主要有几个步骤:确定状态,写出状态转移方程和寻找边界条件。 -在这个例题中我们首先可以定一个 $f(i,j)$ ,表示从左上角即坐标为 $(0,0)$ 到坐标 $(i,j)$ 的路径数量,其中 $i \in [0,m)$ 以及$j \in [0,n)$。由于机器人只能向右或者向下走,所以当机器人处于 $(i,j)$ 的位置时,它的前一个坐标只能是上边一格 $(i,j-1)$ 或者左边一格 $(i-1,j)$ ,这样一来就能建立出一个状态之间的关系,如式 $\text(3.1)$ 所示。 +$\qquad$ 在这个例题中我们首先可以定一个 $f(i,j)$ ,表示从左上角即坐标为 $(0,0)$ 到坐标 $(i,j)$ 的路径数量,其中 $i \in [0,m)$ 以及$j \in [0,n)$。由于机器人只能向右或者向下走,所以当机器人处于 $(i,j)$ 的位置时,它的前一个坐标只能是上边一格 $(i,j-1)$ 或者左边一格 $(i-1,j)$ ,这样一来就能建立出一个状态之间的关系,如式 $\text(3.1)$ 所示。 $$ \tag{3.1} f(i,j) = f(i-1,j) + f(i,j-1) $$ -即走到当前位置 $(i,j)$ 的路径数量等于走到前一个位置 $(i,j-1)$ 和 $(i-1,j)$ 的所有路径之和,这个就是状态转移方程。 +$\qquad$ 即走到当前位置 $(i,j)$ 的路径数量等于走到前一个位置 $(i,j-1)$ 和 $(i-1,j)$ 的所有路径之和,这个就是状态转移方程。 -此外我们需要考虑一些边界条件,因为在状态转移方程中 $i$ 和 $j$ 是不能等于 $0$ 的,比如都等于$0$的时候会出现 $f(0,0)+f(-1,0)+f(0,-1)$ ,$f(-1,0)$ 或者 $f(0,-1)$ 在本题中是没有意义的,因此我们需要额外判断 $i$ 和 $j$ 等于 $0$ 的情况。如图 $3.2$ 所示,首先我们考虑 $i=0,j=0$ 的情况,即 $f(0,0)$ ,显然此时机器人在起始点,从起始点到起始点 $(0,0)$ 对应的路径数量必然是 $1$ ,对于 $i\neq0,j=0$ ,此时机器人会一直沿着网格左边沿往下走,这条路径上的所有 $f(i,j)$ 也都会是 $1$ ,$i=0,j\neq0$ 的情况同理。 +$\qquad$ 此外我们需要考虑一些边界条件,因为在状态转移方程中 $i$ 和 $j$ 是不能等于 $0$ 的,比如都等于$0$的时候会出现 $f(0,0)+f(-1,0)+f(0,-1)$ ,$f(-1,0)$ 或者 $f(0,-1)$ 在本题中是没有意义的,因此我们需要额外判断 $i$ 和 $j$ 等于 $0$ 的情况。如图 $3.2$ 所示,首先我们考虑 $i=0,j=0$ 的情况,即 $f(0,0)$ ,显然此时机器人在起始点,从起始点到起始点 $(0,0)$ 对应的路径数量必然是 $1$ ,对于 $i\neq0,j=0$ ,此时机器人会一直沿着网格左边沿往下走,这条路径上的所有 $f(i,j)$ 也都会是 $1$ ,$i=0,j\neq0$ 的情况同理。
图 $3.2$ 路径之和解析
-因此我们的状态转移方程可以完善为: +$\qquad$ 因此我们的状态转移方程可以完善为: $$ f(i,j)=\left\{\begin{array}{c} @@ -44,7 +44,8 @@ f(i,j)=\left\{\begin{array}{c} f(i-1,j) + f(i,j-1) \end{array}\right. $$ -这样一来我们可以写出代码如下: + +$\qquad$ 这样一来我们可以写出代码如下: ```python def solve(m,n): @@ -57,21 +58,21 @@ def solve(m,n): return f[m - 1][n - 1] ``` -最后能解出来当 $m=7,n=3$ 时一共有 $28$ 种不同的路径。 +$\qquad$ 最后能解出来当 $m=7,n=3$ 时一共有 $28$ 种不同的路径。 -讲到这里读者可能对动态规划的思想还是不够深入,但没有关系,只需要有一个大概的认知即可。接下来要说的是为什么动态规划能够用于解决强化学习问题。其实一般**动态规划问题有三个性质,最优化原理、无后效性和有重叠子问题**。其中有重叠子问题不是动态规划问题的必要条件,这里就不展开叙述。无后效性指的是即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关,这其实就是前面所说的马尔可夫性质。而最优化原理是指,如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。马尔可夫决策过程的目标是最大化累积回报,回顾上一章讲到的回报公式: +$\qquad$ 讲到这里读者可能对动态规划的思想还是不够深入,但没有关系,只需要有一个大概的认知即可。接下来要说的是为什么动态规划能够用于解决强化学习问题。其实一般**动态规划问题有三个性质,最优化原理、无后效性和有重叠子问题**。其中有重叠子问题不是动态规划问题的必要条件,这里就不展开叙述。无后效性指的是即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关,这其实就是前面所说的马尔可夫性质。而最优化原理是指,如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。马尔可夫决策过程的目标是最大化累积回报,回顾上一章讲到的回报公式: $$ G_{t} = R_{t+1}+\gamma G_{t+1} $$ -这个公式表明当前时步的回报跟下一个时步的回报是有关系的,这跟机器人路径之和例题中的状态转移方程很像。换句话说,我们可以在不同时步上通过某种方法最大化对应时步的回报来解决马尔可夫决策问题,我们要解决$G_{t+1}$的问题,可以一次拆分成解决$G_{t}, G_{t-1},\cdots,G_{1}$的问题,这其实就满足动态规划性质中的最优化原理。综合以上两点,我们是可以利用动态规划的思想来解决强化学习问题的,至于具体怎么解决,且看后面讲解的价值迭代(Value Iteration)和策略迭代(Policy Iteration算法。 +$\qquad$ 这个公式表明当前时步的回报跟下一个时步的回报是有关系的,这跟机器人路径之和例题中的状态转移方程很像。换句话说,我们可以在不同时步上通过某种方法最大化对应时步的回报来解决马尔可夫决策问题,我们要解决$G_{t+1}$的问题,可以一次拆分成解决$G_{t}, G_{t-1},\cdots,G_{1}$的问题,这其实就满足动态规划性质中的最优化原理。综合以上两点,我们是可以利用动态规划的思想来解决强化学习问题的,至于具体怎么解决,且看后面讲解的价值迭代(Value Iteration)和策略迭代(Policy Iteration算法。 -## 状态价值函数和动作价值函数 +## 3.2 状态价值函数和动作价值函数 -在讲策略迭代和价值迭代算法之前,我们需要先铺垫一些概念。 +$\qquad$ 在讲策略迭代和价值迭代算法之前,我们需要先铺垫一些概念。 -在马尔可夫决策过程中,每个状态是有一定的价值的,可以定义为: +$\qquad$ 在马尔可夫决策过程中,每个状态是有一定的价值的,可以定义为: $$ \begin{aligned} @@ -80,25 +81,25 @@ V_\pi(s) &=\mathbb{E}_{\pi}[R_t+\gamma R_{t+1}+\gamma^2 R_{t+2} + \cdots |S_t=s \end{aligned} $$ -这就是**状态价值函数(state-value function)**,从特定状态出发,按照某种策略$\pi$进行决策所能得到的回报期望值,注意这里的回报是带有折扣因子$\gamma$的。 +$\qquad$ 这就是**状态价值函数(state-value function)**,从特定状态出发,按照某种策略$\pi$进行决策所能得到的回报期望值,注意这里的回报是带有折扣因子$\gamma$的。 -另外引入动作的元素后会有一个 $Q$ 函数,也叫做 **动作价值函数(action-value function)**,即 +$\qquad$ 另外引入动作的元素后会有一个 $Q$ 函数,也叫做 **动作价值函数(action-value function)**,即 $$ Q_\pi(s, a)=\mathbb{E}_\pi\left[G_t \mid s_t=s, a_t=a\right] $$ -不难理解动作价值函数和状态价值函数会有一个关系: +$\qquad$ 不难理解动作价值函数和状态价值函数会有一个关系: $$ V_\pi(s)=\sum_{a \in A} \pi(a \mid s) Q_\pi(s, a) $$ -其中$\pi(a|s)$表示策略函数,一般指在状态$s$下执行动作$a$的概率分布。这个公式的意思就是在给定状态$s$的情况下,智能体所有动作的价值期望(所有动作价值函数乘以对应动作的概率之和)就等于该状态的价值,这其实就是利用了数学中的**全期望公式**。 +$\qquad$ 其中$\pi(a|s)$表示策略函数,一般指在状态$s$下执行动作$a$的概率分布。这个公式的意思就是在给定状态$s$的情况下,智能体所有动作的价值期望(所有动作价值函数乘以对应动作的概率之和)就等于该状态的价值,这其实就是利用了数学中的**全期望公式**。 -## 贝尔曼方程 +## 3.3 贝尔曼方程 -类比于回报公式$G_{t} = R_{t+1}+\gamma G_{t+1}$,也可以对状态价值函数和动作价值函数做一个类似的推导,如下: +$\qquad$ 类比于回报公式$G_{t} = R_{t+1}+\gamma G_{t+1}$,也可以对状态价值函数和动作价值函数做一个类似的推导,如下: $$ \begin{aligned} @@ -111,15 +112,16 @@ V_{\pi}(s) & =\mathbb{E}_{\pi}\left[G_t \mid S_t=s\right] \\ & =R(s)+\gamma \sum_{s^{\prime} \in S} p\left(s^{\prime} \mid s\right) V_{\pi}\left(s^{\prime}\right) \end{aligned} $$ -其中 $R(s)$ 表示奖励函数,$P(S_{t+1}=s^{\prime} \mid S_{t}=s)$就是前面讲的状态转移概率,习惯简写成$p\left(s^{\prime} \mid s\right)$,这就是**贝尔曼方程(Bellman Equation)**。贝尔曼方程的重要意义就在于前面所说的满足动态规划的最优化原理,即将前后两个状态之间联系起来,以便于递归地解决问题。 -类似地,动作价值函数贝尔曼方程推导为: +$\qquad$ 其中 $R(s)$ 表示奖励函数,$P(S_{t+1}=s^{\prime} \mid S_{t}=s)$就是前面讲的状态转移概率,习惯简写成$p\left(s^{\prime} \mid s\right)$,这就是**贝尔曼方程(Bellman Equation)**。贝尔曼方程的重要意义就在于前面所说的满足动态规划的最优化原理,即将前后两个状态之间联系起来,以便于递归地解决问题。 + +$\qquad$ 类似地,动作价值函数贝尔曼方程推导为: $$ Q_{\pi}(s,a) = R(s,a) + \gamma \sum_{s^{\prime} \in S} p\left(s^{\prime} \mid s,a\right) \sum_{a^{\prime} \in A} \pi\left(a^{\prime} \mid s ^{\prime} \right)Q_{\pi}\left(s^{\prime},a'\right) $$ -前面我们提到状态价值函数的定义就是按照某种策略$\pi$进行决策得到的累积回报期望,换句话说,在最优策略下,状态价值函数也是最优的,相应的动作价值函数也最优。我们的目标是使得累积的回报最大化,那么最优策略下的状态价值函数可以表示为: +$\qquad$ 前面我们提到状态价值函数的定义就是按照某种策略$\pi$进行决策得到的累积回报期望,换句话说,在最优策略下,状态价值函数也是最优的,相应的动作价值函数也最优。我们的目标是使得累积的回报最大化,那么最优策略下的状态价值函数可以表示为: $$ \begin{aligned} @@ -128,7 +130,7 @@ V^{*}(s)&=\max _a \mathbb{E}\left[R_{t+1}+\gamma V^{*}\left(S_{t+1}\right) \mid \end{aligned} $$ -这个公式叫做**贝尔曼最优方程(Bellman optimality equation)**,它对于后面要讲的策略迭代算法具有一定的指导意义。对于动作价值函数也是同理,如下: +$\qquad$ 这个公式叫做**贝尔曼最优方程(Bellman optimality equation)**,它对于后面要讲的策略迭代算法具有一定的指导意义。对于动作价值函数也是同理,如下: $$ \begin{aligned} Q^{*}(s, a) & =\mathbb{E}\left[R_{t+1}+\gamma \max _{a^{\prime}} Q^{*}\left(S_{t+1}, a^{\prime}\right) \mid S_t=s, A_t=a\right] \\ @@ -137,59 +139,62 @@ Q^{*}(s, a) & =\mathbb{E}\left[R_{t+1}+\gamma \max _{a^{\prime}} Q^{*}\left(S_{t $$ -## 策略迭代 +## 3.4 策略迭代 -前面提到在最优策略$\pi^{*}$下,对应的状态和动作价值函数也都是最优的,即$V^{*}(s)$和$Q^{*}(s)$。但是实际求解中在优化策略的过程中,同时我们还需要优化状态和动作价值函数,这其实是一个多目标优化的问题。策略迭代算法的思路是分成两个步骤,首先固定策略$\pi$不变,然后估计对应的状态价值函数$V$,这一叫做**策略估计(policy evaluation)**。然后根据估计好的状态价值函数$V$结合策略推算出动作价值函数$Q$,并对 $Q$ 函数优化然后进一步改进策略,**这一步叫策略改进(policy improvement)**。在策略改进的过程中一般是通过贪心策略来优化的,即定义策略函数为: +$\qquad$ 前面提到在最优策略$\pi^{*}$下,对应的状态和动作价值函数也都是最优的,即$V^{*}(s)$和$Q^{*}(s)$。但是实际求解中在优化策略的过程中,同时我们还需要优化状态和动作价值函数,这其实是一个多目标优化的问题。策略迭代算法的思路是分成两个步骤,首先固定策略$\pi$不变,然后估计对应的状态价值函数$V$,这一叫做**策略估计(policy evaluation)**。然后根据估计好的状态价值函数$V$结合策略推算出动作价值函数$Q$,并对 $Q$ 函数优化然后进一步改进策略,**这一步叫策略改进(policy improvement)**。在策略改进的过程中一般是通过贪心策略来优化的,即定义策略函数为: $$ \pi(a|s) = \max _a Q(s,a) $$ -然后在策略改进时选择最大的$Q(s,a)$值来更新。在一轮策略估计和改进之后,又会进入新的一轮策略估计和改进,直到收敛为止。 +$\qquad$ 然后在策略改进时选择最大的$Q(s,a)$值来更新。在一轮策略估计和改进之后,又会进入新的一轮策略估计和改进,直到收敛为止。 -如图 3.3 所示,图(a)描述了上面所说的策略估计和改进持续迭代的过程,图(b)则描述了在迭代过程中策略$\pi$和状态价值函数$V$最后会同时收敛到最优。 +$\qquad$ 如图 3.3 所示,图(a)描述了上面所说的策略估计和改进持续迭代的过程,图(b)则描述了在迭代过程中策略$\pi$和状态价值函数$V$最后会同时收敛到最优。
图 3.3 策略迭代的收敛过程
-策略迭代算法伪代码如下: +$\qquad$ 策略迭代算法伪代码如下:
图 3.4 策略迭代算法伪代码
-## 价值迭代 +## 3.5 价值迭代 -价值迭代算法相对于策略迭代更加直接,它直接根据以下公式来迭代更新。 +$\qquad$ 价值迭代算法相对于策略迭代更加直接,它直接根据以下公式来迭代更新。 $$ V(s) \leftarrow \max _{a \in A}\left(R(s, a)+\gamma \sum_{s^{\prime} \in S} p\left(s^{\prime} \mid s, a\right) V\left(s^{\prime}\right)\right) $$ -价值迭代的伪代码如下: +$\qquad$ 价值迭代的伪代码如下:
图 3.4 价值迭代算法伪代码
-它首先将所有的状态价值初始化,然后不停地对每个状态迭代,直到收敛到最优价值$V^{*}$,并且根据最优价值推算出最优策略$\pi^{*}$。这样其实更像是一个动态规划本身的思路,而不是强化学习的问题。这种情况下,其实比策略迭代算法要慢得多,尽管两种方法都需要多次遍历。但是在策略迭代算法中考虑了中间每个时步可能遇到的最优策略并及时加以改进,这意味着就算策略在早期并不完美(也许需要改进),策略迭代仍能够更快地接近最优解。 +$\qquad$ 它首先将所有的状态价值初始化,然后不停地对每个状态迭代,直到收敛到最优价值$V^{*}$,并且根据最优价值推算出最优策略$\pi^{*}$。这样其实更像是一个动态规划本身的思路,而不是强化学习的问题。这种情况下,其实比策略迭代算法要慢得多,尽管两种方法都需要多次遍历。但是在策略迭代算法中考虑了中间每个时步可能遇到的最优策略并及时加以改进,这意味着就算策略在早期并不完美(也许需要改进),策略迭代仍能够更快地接近最优解。
图 3.4 策略迭代与价值迭代收敛过程的区别
-举一个例子,回顾一下策略迭代的收敛过程,如图 3.5 所示,我们知道策略迭代是不停地在$V$和$\pi$这两条线之间“跳变”直到收敛到$V^*$。这种“跳变”是几乎不需要花费时间的,它只是一个$\pi$与$V$互相推算的过程,通过一个公式就能得到,也就是策略估计和策略改进之间的切换过程。而在各自的线上,比如价值函数这条线从$V_1$到$V_2$这个点是需要更多时间的,这其实就是一个策略估计的过程,需要遍历到所有状态,在策略这条线上同理。而实际上$V_1$到$V_2$中间也可能存在更多个点,比如$V_{12}^{\prime},V_{12}^{\prime \prime},V_{12}^{\prime \prime \prime}$,每次在这些点之间移动是需要遍历所有的状态的,只是在策略迭代算法中借助了策略这条线跳过了中间的$V_{12}^{\prime},V_{12}^{\prime \prime},V_{12}^{\prime \prime \prime}$这些点,而在价值迭代算法的时候会经过价值这条线上的所有点,直到最优,从这个角度来看策略迭代算法是要比价值迭代更快的。 +$\qquad$ 举一个例子,回顾一下策略迭代的收敛过程,如图 3.5 所示,我们知道策略迭代是不停地在$V$和$\pi$这两条线之间“跳变”直到收敛到$V^*$。这种“跳变”是几乎不需要花费时间的,它只是一个$\pi$与$V$互相推算的过程,通过一个公式就能得到,也就是策略估计和策略改进之间的切换过程。而在各自的线上,比如价值函数这条线从$V_1$到$V_2$这个点是需要更多时间的,这其实就是一个策略估计的过程,需要遍历到所有状态,在策略这条线上同理。而实际上$V_1$到$V_2$中间也可能存在更多个点,比如$V_{12}^{\prime},V_{12}^{\prime \prime},V_{12}^{\prime \prime \prime}$,每次在这些点之间移动是需要遍历所有的状态的,只是在策略迭代算法中借助了策略这条线跳过了中间的$V_{12}^{\prime},V_{12}^{\prime \prime},V_{12}^{\prime \prime \prime}$这些点,而在价值迭代算法的时候会经过价值这条线上的所有点,直到最优,从这个角度来看策略迭代算法是要比价值迭代更快的。 + +## 3.6 本章小结 -## 本章小结 +$\qquad$ 本章主要讲解了动态规划的思想及其在强化学习上应用的两个算法(策略迭代和价值迭代),这两种算法虽然目前很少会用到,但是对于推导更复杂的强化学习算法起到了奠定基础的作用,建议掌握。此外涉及到了一些关键的概念,例如状态价值函数和动作价值函数,初学者很容易将两者混淆,且容易忘记它们与策略函数之间的联系,务必理清。本章最重要的概念还是贝尔曼方程,它对于强化学习算法设计有着非常关键的作用。另外注意,在本章的算法中,其实默认了一个事实,即状态转移概率$\sum_{s^{\prime} \in S} p\left(s^{\prime} \mid s, a\right)$是已知的,但在讲解马尔可夫链时我们提到状态转移概率是环境本身的性质,我们在帮助智能体优化决策的时候大部分情况下是不知道或者说不应该知道的,这也是为什么最基本的策略迭代和价值迭代在今天很少用到的原因,这时候我们通常会对状态转移概率或者状态(动作)价值函数进行预测估计,具体我们下章再展开。 -本章主要讲解了动态规划的思想及其在强化学习上应用的两个算法(策略迭代和价值迭代),这两种算法虽然目前很少会用到,但是对于推导更复杂的强化学习算法起到了奠定基础的作用,建议掌握。此外涉及到了一些关键的概念,例如状态价值函数和动作价值函数,初学者很容易将两者混淆,且容易忘记它们与策略函数之间的联系,务必理清。本章最重要的概念还是贝尔曼方程,它对于强化学习算法设计有着非常关键的作用。另外注意,在本章的算法中,其实默认了一个事实,即状态转移概率$\sum_{s^{\prime} \in S} p\left(s^{\prime} \mid s, a\right)$是已知的,但在讲解马尔可夫链时我们提到状态转移概率是环境本身的性质,我们在帮助智能体优化决策的时候大部分情况下是不知道或者说不应该知道的,这也是为什么最基本的策略迭代和价值迭代在今天很少用到的原因,这时候我们通常会对状态转移概率或者状态(动作)价值函数进行预测估计,具体我们下章再展开。 +## 3.7 练习题 -## 面试题 +1. 动态规划问题的主要性质有哪些? +2. 状态价值函数和动作价值函数之间的关系是什么? +3. 策略迭代和价值迭代哪个算法速度会更快? -1. 策略迭代和价值迭代哪个算法速度会更快? diff --git a/docs/ch4/main.md b/docs/ch4/main.md index 10fbcd8..4fb2e68 100644 --- a/docs/ch4/main.md +++ b/docs/ch4/main.md @@ -1,9 +1,9 @@ -# 免模型预测 +# 第 4 章 免模型预测 $\qquad$ 本章开始介绍常见的两种免模型预测方法,**蒙特卡洛方法**( $\text{Monte Carlo,MC}$ )和**时序差分方法**($\text{temporal-difference,TD}$)。在讲解这两个方法之前,我们需要铺垫一些重要的概念,有模型($\text{model based}$)与免模型($\text{model free}$),预测($\text{predicton}$)与控制($\text{control}$)。 -## 有模型与免模型 +## 4.1 有模型与免模型 $\qquad$ 在前面的章节中,我们其实默认了一个事实,即状态转移概率是已知的,这种情况下使用的算法称之为**有模型算法**,例如动态规划算法。但大部分情况下对于智能体来说,环境是未知的,这种情况下的算法就称之为**免模型算法**,目前很多经典的强化学习算法都是免模型的。当然近年来出现了一些新的强化学习算法,例如 $\text{PlaNet}$、$\text{Dreamer}$ 和 $\text{World Models}$ 等。这些算法利用了神经网络和其他机器学习方法建立一个近似的环境模型,并使用规划和强化学习的方法进行决策,这些算法也都称为有模型算法。 @@ -11,7 +11,7 @@ $\qquad$ 具体说来,有模型强化学习尝试先学习一个环境模型 $\qquad$ 而免模型则直接学习在特定状态下执行特定动作的价值或优化策略。它直接从与环境的交互中学习,不需要建立任何预测环境动态的模型。其优点是不需要学习可能是较为复杂的环境模型,更加简单直接,但是缺点是在学习过程中需要与真实环境进行大量的交互。注意,除了动态规划之外,基础的强化学习算法都是免模型的。 -## 预测与控制 +## 4.2 预测与控制 $\qquad$ 前面提到很多经典的强化学习算法都是免模型的,换句话说在这种情况下环境的状态转移概率是未知的,这种情况下会去近似环境的状态价值函数,这其实跟状态转移概率是等价的,我们把这个过程称为**预测**。换句话说,预测的主要目的是估计或计算环境中的某种期望值,比如状态价值函数 $V(s)$ 或动作价值函数 $Q(s,a)$。例如,我们正在玩一个游戏,并想知道如果按照某种策略玩游戏,我们的预期得分会是多少。 @@ -19,7 +19,7 @@ $\qquad$ 而控制的目标则是找到一个最优策略,该策略可以最 $\qquad$ 在实际应用中,预测和控制问题经常交织在一起。例如,在使用 $\text{Q-learning}$(一种免模型的控制算法)时,我们同时进行预测(更新 $Q$ 值)和控制(基于$Q$ 值选择动作)。之所以提到这两个概念,是因为很多时候我们不能一蹴而就解决好控制问题,而需要先解决预测问题,进而解决控制问题。 -## 蒙特卡洛估计 +## 4.3 蒙特卡洛估计 $\qquad$ 蒙特卡洛估计方法在强化学习中是免模型预测价值函数的方式之一,本质是一种统计模拟方法,它的发展得益于电子计算机的发明。假设我们需要计算一个不规则图形的面积,这种情况下是很难通过规则或者积分的方式得到结果的。 @@ -87,7 +87,7 @@ $$ $\qquad$ 其中 $\alpha$ 表示学习率,$G_t- V(S_{t+1})$为目标值与估计值之间的误差( $\text{error}$ )。此外,$\text{FVMC}$ 是一种基于回合的增量式方法,具有无偏性和收敛快的优点,但是在状态空间较大的情况下,依然需要训练很多个回合才能达到稳定的结果。而 $\text{EVMC}$ 则是更为精确的预测方法,但是计算的成本相对也更高。 -## 时序差分估计 +## 4.4 时序差分估计 $\qquad$ 时序差分估计方法是一种基于经验的动态规划方法,它结合了蒙特卡洛和动态规划的思想。最简单的时序差分可以表示为式 $\text{(4.5)}$ 。 @@ -108,7 +108,7 @@ $$ \end{split} $$ -## 时序差分和蒙特卡洛的比较 +## 4.5 时序差分和蒙特卡洛的比较 $\qquad$ 结合图 $4.4$ 总结一下时序差分方法和蒙特卡洛方法之间的差异。 @@ -123,7 +123,7 @@ $\qquad$ 结合图 $4.4$ 总结一下时序差分方法和蒙特卡洛方法之
图 $4.4$ 时序差分方法和蒙特卡洛方法的差异
-## n 步时序差分 +## 4.6 n 步时序差分 $\qquad$ 把时序差分方法进一步拓展,之前只是向前自举了一步,即 $\text{TD(0)}$ ,我们可以调整为两步,利用两步得到的回报来更新状态的价值,调整 $n$ 步就是 $n$ 步时序差分($\text{n-step TD}$),如式 $\text{4.7}$ 所示。 @@ -155,10 +155,11 @@ $\qquad$ 以下是一些常见的方法来选择合适的 $\lambda$ 。 $\qquad$ 需要注意的是,无论使用哪种方法,$\lambda$ 的最佳取值可能因任务、环境和算法的不同而异。因此,选择合适的 $\lambda$ 值是一个实验过程,需要根据具体问题进行调整。在实际应用中,可以结合多种方法来找到最佳的 $\lambda$ 值,以获得更好的性能。 -## 本章小结 +## 4.7 本章小结 $\qquad$ 本章重点讲解了两种常见的免模型预测方法,蒙特卡洛和时序差分方法。另外涉及到了一些关键的概念,有模型与免模型,预测与控制,建议读者熟练掌握。 -## 面试题 +## 4.8 联系题 1. 有模型与免模型算法的区别?举一些相关的算法? -2. 蒙特卡洛方法和时序差分方法的优劣势 \ No newline at end of file +2. 举例说明预测与控制的区别与联系。 +3. 蒙特卡洛方法和时序差分方法的优劣势。 \ No newline at end of file diff --git a/docs/ch5/main.md b/docs/ch5/main.md index 7f7696d..c2d8bc3 100644 --- a/docs/ch5/main.md +++ b/docs/ch5/main.md @@ -31,23 +31,23 @@ $\qquad$ 我们会发现两者的更新方式是一样的,都是基于时序 ### Q 表格 -回到 $\text{Q-learning}$ 算法本身,其实到这里我们已经把 $\text{Q-learning}$ 算法的核心内容讲完了,即上面的更新公式 $\text(4.5)$。但是有必要提到几个概念,$\text{Q}$ 表格和探索策略,以便帮助读者加深理解。 +$\qquad$ 回到 $\text{Q-learning}$ 算法本身,其实到这里我们已经把 $\text{Q-learning}$ 算法的核心内容讲完了,即上面的更新公式 $\text(4.5)$。但是有必要提到几个概念,$\text{Q}$ 表格和探索策略,以便帮助读者加深理解。 -关于 $\text{Q}$ 表格,其实我们在前面讲蒙特卡洛方法的过程中已经形成了雏形,就是我们所举的价值函数网格分布的例子。我们接着这个例子继续讲,不记得的同学建议再往前回顾一下。如图 $\text{5.1}$ 所示,这个例子是以左上角为起点,右下角为终点,机器人只能向右或者向下走,每次移动后机器人会收到一个 $-1$ 的奖励,即奖励函数 $R(s,a)=1$,然后求出机器人从起点走到终点的最短路径。 +$\qquad$ 关于 $\text{Q}$ 表格,其实我们在前面讲蒙特卡洛方法的过程中已经形成了雏形,就是我们所举的价值函数网格分布的例子。我们接着这个例子继续讲,不记得的同学建议再往前回顾一下。如图 $\text{5.1}$ 所示,这个例子是以左上角为起点,右下角为终点,机器人只能向右或者向下走,每次移动后机器人会收到一个 $-1$ 的奖励,即奖励函数 $R(s,a)=1$,然后求出机器人从起点走到终点的最短路径。
图 $\text{5.1}$ 迷你网格示例
-其实这个答案比较简单,机器人要达到终点只能先向右然后向下,或者先向下然后向右走,有且只有两条路径,并且同时也是最短路径。当时出于简化计算的考虑(状态价值的计算实在是太繁琐了!),只考虑了 $2 \times 2$ 的网格。这次我们可以将问题变得更有挑战性一些,如图 $\text{5.2}$ 所示, 我们将网格变成大一点的 $3 \times 3$ 的网格,并且不再限制机器人只能向右或者向下走,它可以向上、向下、向左和向右随意走动,当然每次还是只能走动一格,并且不能出边界,另外奖励函数也不变。 +$\qquad$ 其实这个答案比较简单,机器人要达到终点只能先向右然后向下,或者先向下然后向右走,有且只有两条路径,并且同时也是最短路径。当时出于简化计算的考虑(状态价值的计算实在是太繁琐了!),只考虑了 $2 \times 2$ 的网格。这次我们可以将问题变得更有挑战性一些,如图 $\text{5.2}$ 所示, 我们将网格变成大一点的 $3 \times 3$ 的网格,并且不再限制机器人只能向右或者向下走,它可以向上、向下、向左和向右随意走动,当然每次还是只能走动一格,并且不能出边界,另外奖励函数也不变。
图 $\text{5.2}$ 迷你网格进阶
-我们还是把机器人的位置看作状态,这样一来总共有 $\text{9}$ 个状态,$\text{4}$ 个动作 $a_1,a_2,a_3,a_4$(分别对应上、下、左、右)。我们知道 Q 函数,也就是状态价值函数的输入就是状态和动作,输出就是一个值,由于这里的状态和动作都是离散的,这样一来我们就可以用一个表格来表示,如表 $\text{5.1}$ 所示。 +$\qquad$ 我们还是把机器人的位置看作状态,这样一来总共有 $\text{9}$ 个状态,$\text{4}$ 个动作 $a_1,a_2,a_3,a_4$(分别对应上、下、左、右)。我们知道 Q 函数,也就是状态价值函数的输入就是状态和动作,输出就是一个值,由于这里的状态和动作都是离散的,这样一来我们就可以用一个表格来表示,如表 $\text{5.1}$ 所示。
@@ -117,24 +117,23 @@ $\qquad$ 我们会发现两者的更新方式是一样的,都是基于时序
表 $\text{5.1}$ :$\text{Q}$ 表格
+$\qquad$ 表格的横和列对应状态和动作,数值表示对应的 $Q$ 值,比如最左上角的值表示 $Q(s_1,a_1)=0$,这就是 $Q$ 表格。在实践中,我们可以给所有的 $Q$ 预先设一个值,这就是 $Q$ 值的初始化。这些值是可以随机的,这里为了方便全部初始化为 $0$,但除了终止状态对应的值必须为 $\text{0}$ 之外,这点我们在讲时序差分的方法中有提到过,比如这里终止状态 $s_9$ 对应的所有 $Q$ 值,包括 $Q(s_9,a_1),Q(s_9,a_2),Q(s_9,a_3),Q(s_9,a_4)$ 等都必须为 $\text{0}$ ,并且也不参与 $Q$ 值的更新。 -表格的横和列对应状态和动作,数值表示对应的 $Q$ 值,比如最左上角的值表示 $Q(s_1,a_1)=0$,这就是 $Q$ 表格。在实践中,我们可以给所有的 $Q$ 预先设一个值,这就是 $Q$ 值的初始化。这些值是可以随机的,这里为了方便全部初始化为 $0$,但除了终止状态对应的值必须为 $\text{0}$ 之外,这点我们在讲时序差分的方法中有提到过,比如这里终止状态 $s_9$ 对应的所有 $Q$ 值,包括 $Q(s_9,a_1),Q(s_9,a_2),Q(s_9,a_3),Q(s_9,a_4)$ 等都必须为 $\text{0}$ ,并且也不参与 $Q$ 值的更新。 - -现在我们讲讲 $Q$ 值的更新过程,其实跟前面讲的状态价值更新是类似的。但不一样的是,前面讲状态价值的更新是蒙特卡洛方法,这次是时序差分方法。具体的做法是,我们会让机器人自行在网格中走动,走到一个状态,就把对应的 $Q$ 值 更新一次,这个过程就叫做 **探索** 。这个探索的过程也是时序差分方法结合了蒙特卡洛方法的体现。当然探索的方式有很多种,很难在读者初学的阶段一次性就全部倒腾出来,这也是为什么在前面讲时序差分方法的时候我们只讲了更新公式而没有讲实际是怎么操作的原因,之后会结合具体情况一一道来,下面我们讲讲 $\text{Q-learning}$ 算法中智能体是怎么探索的。 +$\qquad$ 现在我们讲讲 $Q$ 值的更新过程,其实跟前面讲的状态价值更新是类似的。但不一样的是,前面讲状态价值的更新是蒙特卡洛方法,这次是时序差分方法。具体的做法是,我们会让机器人自行在网格中走动,走到一个状态,就把对应的 $Q$ 值 更新一次,这个过程就叫做 **探索** 。这个探索的过程也是时序差分方法结合了蒙特卡洛方法的体现。当然探索的方式有很多种,很难在读者初学的阶段一次性就全部倒腾出来,这也是为什么在前面讲时序差分方法的时候我们只讲了更新公式而没有讲实际是怎么操作的原因,之后会结合具体情况一一道来,下面我们讲讲 $\text{Q-learning}$ 算法中智能体是怎么探索的。 ### 探索策略 -按理说来,直接根据 $Q$ 函数(即每次选择 $Q$ 值最大对应的动作)来探索是没有问题的。但是由于在探索的过程中 $Q$ 值也是估计出来的,然后还需要利用先前的估计值来更新 $Q$ 值(也就是自举的过程),换句话说,由于自举依赖于先前的估计值,因此这可能会导致估计出的价值函数存在某种程度上的偏差。 +$\qquad$ 按理说来,直接根据 $Q$ 函数(即每次选择 $Q$ 值最大对应的动作)来探索是没有问题的。但是由于在探索的过程中 $Q$ 值也是估计出来的,然后还需要利用先前的估计值来更新 $Q$ 值(也就是自举的过程),换句话说,由于自举依赖于先前的估计值,因此这可能会导致估计出的价值函数存在某种程度上的偏差。 -通俗的理解就是,如果我们一直基于某种思路去工作,工作完之后总结经验(也就是学习的过程)以便提高工作能力和效率,这种方式也许会让我们工作得越来越好,但任何一种思路都不是完美的,都会有一定的瑕疵,也就是说可能会慢慢走偏,此时换一种思路也许就会豁然开朗。实际上人类社会和科学的发展也有着异曲同工之处,举一个古老的例子,很久之前人们认为地球是宇宙的中心(即地心说),并且在公元2世纪将它形成一个体系化的理论,并且以此理论为基础也解决了很多当时难以捉摸的问题。 +$\qquad$ 通俗的理解就是,如果我们一直基于某种思路去工作,工作完之后总结经验(也就是学习的过程)以便提高工作能力和效率,这种方式也许会让我们工作得越来越好,但任何一种思路都不是完美的,都会有一定的瑕疵,也就是说可能会慢慢走偏,此时换一种思路也许就会豁然开朗。实际上人类社会和科学的发展也有着异曲同工之处,举一个古老的例子,很久之前人们认为地球是宇宙的中心(即地心说),并且在公元2世纪将它形成一个体系化的理论,并且以此理论为基础也解决了很多当时难以捉摸的问题。 -但是随着科学的进一步发展这种理论也开始走到极限,直到后面哥白尼提出日心说的理论,尽管当时哥白尼由于不被坚持地心说的守旧派而为此付出了沉重的代价。守旧派就相当于一直坚持同一个思路去探索学习,这种探索思路总会受限于当时人们的认知,并且迟早会到达极限,除非出现一个偶然的因素让我们切换一种思路探索并且学习到更多的东西。尽管在今天看来,地心说和日心说都不是准确的,但其实诸多类似的历史事件也告诉我们一个道理,我们需要牢牢掌握现有的知识形成自己的理论或者经验体系,同时也要保持好奇心与时俱进,这样才能长久地发展下去,对于强化学习中的智能体也是如此。 +$\qquad$ 但是随着科学的进一步发展这种理论也开始走到极限,直到后面哥白尼提出日心说的理论,尽管当时哥白尼由于不被坚持地心说的守旧派而为此付出了沉重的代价。守旧派就相当于一直坚持同一个思路去探索学习,这种探索思路总会受限于当时人们的认知,并且迟早会到达极限,除非出现一个偶然的因素让我们切换一种思路探索并且学习到更多的东西。尽管在今天看来,地心说和日心说都不是准确的,但其实诸多类似的历史事件也告诉我们一个道理,我们需要牢牢掌握现有的知识形成自己的理论或者经验体系,同时也要保持好奇心与时俱进,这样才能长久地发展下去,对于强化学习中的智能体也是如此。 -回到正题,$\text{Q-learning}$ 算法是采用了一个叫做 $\varepsilon-greedy$ 的探索策略,$\varepsilon-greedy$ 是指智能体在探索的过程中,会以 $1-\varepsilon$ 的概率按照 $Q$ 函数来执行动作,然后以剩下 $\varepsilon$ 的概率随机动作。这个 $1-\varepsilon$ 的过程就是前面所说的“守旧派”,即以现有的经验去动作,$\varepsilon$ 就是保持一定的好奇心去探索可能的更优的动作。当然,通常这个 $\varepsilon$ 的值会设置的特别小,比如 $\text{0.1}$ ,毕竟“守旧”并不总是一件坏事,新的东西出现的概率总是特别小的,如果保持过度的好奇心即 $\varepsilon$ 的值设得很大,就很有可能导致智能体既学不到新的东西也丢掉了已经学习到的东西,所谓“捡了芝麻丢了西瓜”。而且一般来说也会随着学到的东西增多而更少,就好比科学知识体系几近完备的现代,能够探索到新的东西的概率是特别特别小的。因此通常在实践中,这个 $\varepsilon$ 的值还会随着时步的增长而衰减,比如从 $\text{0.1}$ 衰减到 $\text{0.01}$ 。 +$\qquad$ 回到正题,$\text{Q-learning}$ 算法是采用了一个叫做 $\varepsilon-greedy$ 的探索策略,$\varepsilon-greedy$ 是指智能体在探索的过程中,会以 $1-\varepsilon$ 的概率按照 $Q$ 函数来执行动作,然后以剩下 $\varepsilon$ 的概率随机动作。这个 $1-\varepsilon$ 的过程就是前面所说的“守旧派”,即以现有的经验去动作,$\varepsilon$ 就是保持一定的好奇心去探索可能的更优的动作。当然,通常这个 $\varepsilon$ 的值会设置的特别小,比如 $\text{0.1}$ ,毕竟“守旧”并不总是一件坏事,新的东西出现的概率总是特别小的,如果保持过度的好奇心即 $\varepsilon$ 的值设得很大,就很有可能导致智能体既学不到新的东西也丢掉了已经学习到的东西,所谓“捡了芝麻丢了西瓜”。而且一般来说也会随着学到的东西增多而更少,就好比科学知识体系几近完备的现代,能够探索到新的东西的概率是特别特别小的。因此通常在实践中,这个 $\varepsilon$ 的值还会随着时步的增长而衰减,比如从 $\text{0.1}$ 衰减到 $\text{0.01}$ 。 -更确切地说,以 $1-\varepsilon$ 的概率按照 $Q$ 函数来执行动作的这个过程在强化学习中我们一般称作利用( $\text{exploitation}$ ),而以 $\varepsilon$ 的概率随机动作的过程称之为探索( $\text{exploration}$ )。什么时候需要探索的更多,什么时候需要利用的更多,其实是很难下定论的,这就是大多数强化学习情景中需要面临的**探索-利用窘境**( $\text{exploration-exploitation dilemma}$ )。我们需要在探索和利用之间做一个权衡,这其实跟深度学习中讲的**偏差-方差权衡**( $\text{Bias-Variance Tradeoff}$ )是如出一辙的。 +$\qquad$ 更确切地说,以 $1-\varepsilon$ 的概率按照 $Q$ 函数来执行动作的这个过程在强化学习中我们一般称作利用( $\text{exploitation}$ ),而以 $\varepsilon$ 的概率随机动作的过程称之为探索( $\text{exploration}$ )。什么时候需要探索的更多,什么时候需要利用的更多,其实是很难下定论的,这就是大多数强化学习情景中需要面临的**探索-利用窘境**( $\text{exploration-exploitation dilemma}$ )。我们需要在探索和利用之间做一个权衡,这其实跟深度学习中讲的**偏差-方差权衡**( $\text{Bias-Variance Tradeoff}$ )是如出一辙的。 -讲到这里,我们就可以贴出 $\text{Q-learning}$ 算法的伪代码了,如图 $\text{5.3}$ 所示。 +$\qquad$ 讲到这里,我们就可以贴出 $\text{Q-learning}$ 算法的伪代码了,如图 $\text{5.3}$ 所示。
@@ -145,14 +144,14 @@ $\qquad$ 我们会发现两者的更新方式是一样的,都是基于时序 ## Sarsa 算法 -$\text{Sarsa}$ 算法虽然在刚提出的时候被认为是 $\text{Q-learning}$ 算法的改进,但在今天看来是非常类似,但是模式却不同的两类算法,$\text{Q-learning}$ 算法被认为是 $\text{Off-Policy}$ 算法,而 $\text{Sarsa}$ 算法相对地则是 $\text{On-policy}$ 的,具体我们后面会展开说明。我们先来看 $\text{Sarsa}$ 算法,我们讲到 $\text{Sarsa}$ 算法跟 $\text{Q-learning}$ 算法是非常类似的,这是因为两者之间在形式上只有 $Q$ 值更新公式是不同的,如式 $\text(5.4)$ 所示: +$\qquad$ $\text{Sarsa}$ 算法虽然在刚提出的时候被认为是 $\text{Q-learning}$ 算法的改进,但在今天看来是非常类似,但是模式却不同的两类算法,$\text{Q-learning}$ 算法被认为是 $\text{Off-Policy}$ 算法,而 $\text{Sarsa}$ 算法相对地则是 $\text{On-policy}$ 的,具体我们后面会展开说明。我们先来看 $\text{Sarsa}$ 算法,我们讲到 $\text{Sarsa}$ 算法跟 $\text{Q-learning}$ 算法是非常类似的,这是因为两者之间在形式上只有 $Q$ 值更新公式是不同的,如式 $\text(5.4)$ 所示: $$ \tag{5.4} Q(s_t,a_t) \leftarrow Q(s_t,a_t)+\alpha[r_t+\gamma Q(s_{t+1},a_{t+1})-Q(s_t,a_t)] $$ -也就是说,$\text{Sarsa}$ 算法是直接用下一个状态和动作对应的 $Q$ 值来作为估计值的,而 $\text{Q-learning}$ 算法则是用下一个状态对应的最大 $Q$ 值。然后我们就可以贴出伪代码了,如图 $\text{5.4}$ 所示。 +$\qquad$ 也就是说,$\text{Sarsa}$ 算法是直接用下一个状态和动作对应的 $Q$ 值来作为估计值的,而 $\text{Q-learning}$ 算法则是用下一个状态对应的最大 $Q$ 值。然后我们就可以贴出伪代码了,如图 $\text{5.4}$ 所示。
@@ -161,16 +160,16 @@ $$ ## 同策略与异策略 -尽管 $\text{Q-learning}$ 算法和 $\text{Sarsa}$ 算法仅在一行更新公式上有所区别,但这两种算法代表的是截然不同的两类算法。我们注意到,$\text{Sarsa}$ 算法在训练的过程中当前策略来生成数据样本,并在其基础上进行更新。换句话说,策略评估和策略改进过程是基于相同的策略完成的,这就是**同策略算法**。相应地,像 $\text{Q-learning}$ 算法这样从其他策略中获取样本然后利用它们来更新目标策略,我们称作**异策略算法**。也就是说,异策略算法基本上是从经验池或者历史数据中进行学习的。这两类算法有着不同的优缺点,同策略相对来说更加稳定,但是效率较低,如同我们实战中展示的那样。而异策略通常来说更加高效,但是需要让获取样本的策略和更新的策略具备一定的分布匹配条件,以避免偏差。 +$\qquad$ 尽管 $\text{Q-learning}$ 算法和 $\text{Sarsa}$ 算法仅在一行更新公式上有所区别,但这两种算法代表的是截然不同的两类算法。我们注意到,$\text{Sarsa}$ 算法在训练的过程中当前策略来生成数据样本,并在其基础上进行更新。换句话说,策略评估和策略改进过程是基于相同的策略完成的,这就是**同策略算法**。相应地,像 $\text{Q-learning}$ 算法这样从其他策略中获取样本然后利用它们来更新目标策略,我们称作**异策略算法**。也就是说,异策略算法基本上是从经验池或者历史数据中进行学习的。这两类算法有着不同的优缺点,同策略相对来说更加稳定,但是效率较低,如同我们实战中展示的那样。而异策略通常来说更加高效,但是需要让获取样本的策略和更新的策略具备一定的分布匹配条件,以避免偏差。 ## 实战:Q-learning 算法 -本节开始我们的第一个算法实战,由于是第一个实战,所以会讲得偏详细一些,后面的算法实战部分可能会讲得越来越粗,如果读者们有不明白的地方,欢迎随时交流讨论。实战的思路会跟理论学习有所区别,并且因人而异,因此读者们在学习实战的时候做个参考即可,最重要的是有自己的想法。 +$\qquad$ 本节开始我们的第一个算法实战,由于是第一个实战,所以会讲得偏详细一些,后面的算法实战部分可能会讲得越来越粗,如果读者们有不明白的地方,欢迎随时交流讨论。实战的思路会跟理论学习有所区别,并且因人而异,因此读者们在学习实战的时候做个参考即可,最重要的是有自己的想法。 -此外,笔者认为**对于实战来说最重要的一点就是写好伪代码**。如果说理论部分是数学语言,实战部分就是编程语言,而伪代码则是从数学语言到编程语言之间的一个过渡,这也是笔者为什么在讲解每个算法的时候尽可能贴出伪代码的原因。在每个算法实战的内容中,笔者基本会按照定义算法,定义训练,定义环境,设置参数以及开始训练等步骤为读者们展开,这是笔者个人的编程习惯。由于这次我们是第一次讲到实战,所以会先讲一下定义训练,因为其中涉及到一个所有强化学习通用的训练模式。 +$\qquad$ 此外,笔者认为**对于实战来说最重要的一点就是写好伪代码**。如果说理论部分是数学语言,实战部分就是编程语言,而伪代码则是从数学语言到编程语言之间的一个过渡,这也是笔者为什么在讲解每个算法的时候尽可能贴出伪代码的原因。在每个算法实战的内容中,笔者基本会按照定义算法,定义训练,定义环境,设置参数以及开始训练等步骤为读者们展开,这是笔者个人的编程习惯。由于这次我们是第一次讲到实战,所以会先讲一下定义训练,因为其中涉及到一个所有强化学习通用的训练模式。 ### 定义训练 -回顾一下伪代码的第二行到最后一行,我们会发现一个强化学习训练的通用模式,首先我们会迭代很多个($M$)回合,在每回合中,首先重置环境回到初始化的状态,智能体根据状态选择动作,然后环境反馈中下一个状态和对应的奖励,同时智能体会更新策略,直到回合结束。这其实就是马尔可夫决策过程中智能体与环境互动的过程,写成一段通用的代码如下: +$\qquad$ 回顾一下伪代码的第二行到最后一行,我们会发现一个强化学习训练的通用模式,首先我们会迭代很多个($M$)回合,在每回合中,首先重置环境回到初始化的状态,智能体根据状态选择动作,然后环境反馈中下一个状态和对应的奖励,同时智能体会更新策略,直到回合结束。这其实就是马尔可夫决策过程中智能体与环境互动的过程,写成一段通用的代码如下: ```python for i_ep in range(train_eps): # 遍历每个回合 @@ -193,11 +192,11 @@ for i_ep in range(train_eps): # 遍历每个回合 ### 定义算法 -强化学习中有几个要素,智能体、环境、经验池(经回放),在实践中也需要逐一定义这些要素。我们一般首先定义智能体,或者说算法,在 $\text{Python}$ 中一般定义为类即可。再考虑一下智能体在强化学习中主要负责哪些工作。 +$\qquad$ 强化学习中有几个要素,智能体、环境、经验池(经回放),在实践中也需要逐一定义这些要素。我们一般首先定义智能体,或者说算法,在 $\text{Python}$ 中一般定义为类即可。再考虑一下智能体在强化学习中主要负责哪些工作。 #### 采样动作 -首先在训练中我需要采样动作与环境交互,于是我们可以定义一个类方法,命名为 `sample_action` ,如下: +$\qquad$ 首先在训练中我需要采样动作与环境交互,于是我们可以定义一个类方法,命名为 `sample_action` ,如下: ```python class Agent: @@ -316,7 +315,7 @@ self.epsilon_decay = 200 # e-greedy策略中epsilon的衰减率
图 $\text{5.6}$ $\text{CliffWalking-v0}$ 环境 $\text{Q-learning}$ 算法训练曲线
-在训练过程中我们打印出每回合的奖励,总共训练了 $300$ 个回合,结果如下: +$\qquad$ 在训练过程中我们打印出每回合的奖励,总共训练了 $300$ 个回合,结果如下: ```bash ... @@ -327,11 +326,11 @@ self.epsilon_decay = 200 # e-greedy策略中epsilon的衰减率 回合:280/300,奖励:-13.0,Epsilon:0.010 回合:300/300,奖励:-13.0,Epsilon:0.010 ``` -我们发现收敛值约在 $-13$ 左右波动,波动的原因是因为此时还存在 $0.01$ 的概率做随机探索。 +$\qquad$ 我们发现收敛值约在 $-13$ 左右波动,波动的原因是因为此时还存在 $0.01$ 的概率做随机探索。 -为了确保我们训练出来的策略是有效的,可以拿训好的策略去测试,测试的过程跟训练的过程差别不大,其一是智能体在测试的时候直接用模型预测的动作输出就行,即在训练中是采样动作(带探索),测试中就是预测动作,其二是训练过程中不需要更新策略,因为已经收敛了。 +$\qquad$ 为了确保我们训练出来的策略是有效的,可以拿训好的策略去测试,测试的过程跟训练的过程差别不大,其一是智能体在测试的时候直接用模型预测的动作输出就行,即在训练中是采样动作(带探索),测试中就是预测动作,其二是训练过程中不需要更新策略,因为已经收敛了。 -如图 $\text{5.7}$ 所示,我们测试了 $10$ 个回合,发现每回合获得的奖励都是 $-13$ 左右,说明我们学到的策略是比较稳定的。 +$\qquad$ 如图 $\text{5.7}$ 所示,我们测试了 $10$ 个回合,发现每回合获得的奖励都是 $-13$ 左右,说明我们学到的策略是比较稳定的。
@@ -341,18 +340,18 @@ self.epsilon_decay = 200 # e-greedy策略中epsilon的衰减率 ### 结果分析 -那么问题来了,为什么学到的策略每回合的奖励是 $-13$ 呢?回顾一下我们在前面介绍环境的时候讲到,我们一眼就能看出来最优的策略应当是从起点向上沿着 $24$ 号网格直线走到 $35$ 号网格最后到达终点,而这中间要走多少个网格呢?读者们可以数一下,不包括终点(走到终点得到的奖励是 $0$)的话正好就是 $13$ 步,每一步会得到 $-1$ 的奖励,总共加起来正好也是 $-13$ ,这说明智能体学到的策略很有可能就是最优的。具体我们还需要把智能体在测试的时候每回合每步的动作打印出来验证一下,打印结果如下: +$\qquad$ 那么问题来了,为什么学到的策略每回合的奖励是 $-13$ 呢?回顾一下我们在前面介绍环境的时候讲到,我们一眼就能看出来最优的策略应当是从起点向上沿着 $24$ 号网格直线走到 $35$ 号网格最后到达终点,而这中间要走多少个网格呢?读者们可以数一下,不包括终点(走到终点得到的奖励是 $0$)的话正好就是 $13$ 步,每一步会得到 $-1$ 的奖励,总共加起来正好也是 $-13$ ,这说明智能体学到的策略很有可能就是最优的。具体我们还需要把智能体在测试的时候每回合每步的动作打印出来验证一下,打印结果如下: ```bash 测试的动作列表:[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2] ``` -可以看到智能体学到的策略是先往上(即动作 $0$),然后一直往右(即动作 $1$)走十二格,最后再往下(即动作 $2$),这其实就是我们肉眼就能看出来的最优策略! +$\qquad$ 可以看到智能体学到的策略是先往上(即动作 $0$),然后一直往右(即动作 $1$)走十二格,最后再往下(即动作 $2$),这其实就是我们肉眼就能看出来的最优策略! ### 消融实验 -为了进一步探究 $\varepsilon$ 是随着采样步数衰减更好些,还是恒定不变更好,我们做了一个消融( $\text{Ablation}$ )实验,即将 $\varepsilon$ 设置为恒定的 $0.1$,如下: +$\qquad$ 为了进一步探究 $\varepsilon$ 是随着采样步数衰减更好些,还是恒定不变更好,我们做了一个消融( $\text{Ablation}$ )实验,即将 $\varepsilon$ 设置为恒定的 $0.1$,如下: ```python # 将初始值和最终值设置为一样,这样 epsilon 就不会衰减 @@ -361,39 +360,47 @@ self.epsilon_end = 0.1 # e-greedy策略中epsilon的最终值 self.epsilon_decay = 200 # e-greedy策略中epsilon的衰减率 ``` -然后重新训练和测试,得到的训练曲线如图 $\text{5.8}$ 所示: +$\qquad$ 然后重新训练和测试,得到的训练曲线如图 $\text{5.8}$ 所示:
图 $\text{5.8}$ $\text{Q-learning}$ 算法消融实验训练曲线
- -测试曲线如图 $\text{5.9}$ 所示: +$\qquad$ 测试曲线如图 $\text{5.9}$ 所示:
图 $\text{5.9}$ $\text{Q-learning}$ 算法消融实验训练曲线
-不难发现,虽然最后也能收敛,但是相对来说没有那么稳定,在更复杂的环境中 $\varepsilon$ 随着采样步数衰减的好处会体现得更加明显。 +$\qquad$ 不难发现,虽然最后也能收敛,但是相对来说没有那么稳定,在更复杂的环境中 $\varepsilon$ 随着采样步数衰减的好处会体现得更加明显。 ## 实战:Sarsa 算法 -由于 $\text{Sarsa}$ 算法与 $\text{Q-learning}$ 算法在实现上区别很小,感兴趣的读者可以直接阅读 $\text{JoyRL}$ 上的代码。 +$\qquad$ 由于 $\text{Sarsa}$ 算法与 $\text{Q-learning}$ 算法在实现上区别很小,感兴趣的读者可以直接阅读 $\text{JoyRL}$ 上的代码。 -在相同环境和参数设置下,得到的实验结果如图 $\text{5.10}$ 所示: +$\qquad$ 在相同环境和参数设置下,得到的实验结果如图 $\text{5.10}$ 所示:
图 $\text{5.10}$ $\text{Sarsa}$ 算法训练曲线
-测试曲线如图 $\text{5.11}$ 所示: +$\qquad$ 测试曲线如图 $\text{5.11}$ 所示:
图 $\text{5.11}$ $\text{Sarsa}$ 算法测试曲线
-我们发现相比于 $\text{Q-learning}$ 算法的 $300$ 回合收敛,$\text{Sarsa}$ 算法需要额外的 $100$ 个回合收敛,但是收敛之后会更稳定,没有一些波动过大的值。 +$\qquad$ 我们发现相比于 $\text{Q-learning}$ 算法的 $300$ 回合收敛,$\text{Sarsa}$ 算法需要额外的 $100$ 个回合收敛,但是收敛之后会更稳定,没有一些波动过大的值。 + +## 本章小结 + +$\qquad$ 本章主要介绍了两种经典的传统强化学习算法,即 $\text{Q-learning}$ 和 $\text{Sarsa}$ 算法。同时,这两种算法虽然非常近似,但本质上是两类不同的蒜贩,前者为 $\text{off-policy}$ 算法,后者为 $\text{on-policy}$ 算法。虽然这两种算法在目前强化学习实践中几乎不怎么用到,但却是后面 $\text{DQN}$ 算法的基础,读者需要熟练掌握。 + +## 练习题 +1. 什么是 $Q$ 值的过估计?有什么缓解的方法吗? +2. $\text{on-policy}$ 与 $\text{off-policy}$ 之间的区别是什么? +3. 为什么需要探索策略? \ No newline at end of file diff --git a/docs/ch6/main.md b/docs/ch6/main.md index dfce45b..3c300f5 100644 --- a/docs/ch6/main.md +++ b/docs/ch6/main.md @@ -180,3 +180,12 @@ $\qquad$ 循环神经网络($\text{recurrent neural network,RNN}$)适用 $\qquad$ 还有一种特殊的结构,叫做 $\text{Transformer}$。虽然它也是为了处理序列数据而设计的,但是是一个完全不同的结构,不再依赖循环来处理序列,而是使用自注意机制 ($\text{self-attention mechanism}$) 来同时考虑序列中的所有元素。并且 $\text{Transformer}$ 的设计特别适合并行计算,使得训练速度更快。自从被提出以后,$\text{Transformer}$ 就被广泛应用于自然语言处理领域,例如 $\text{BERT}$ 以及现在特别流行的 $\text{GPT}$ 等模型。 +## 6.7 本章小结 + +$\qquad$ 本章主要总结了深度学习中常见的一些网络结构,以及梯度下降技巧,读者需要了解相关的深度学习基础,以便于向之后的深度强化学习章节过渡。 + +## 6.8 练习题 + +1. 逻辑回归与神经网络之间有什么联系? +2. 全连接网络、卷积神经网络、循环神经网络分别适用于什么场景? +3. 循环神经网络在反向传播时会比全连接网络慢吗?为什么? \ No newline at end of file diff --git a/docs/ch6/main.pptx b/docs/ch6/main.pptx index 70054ad..4a67d4b 100755 Binary files a/docs/ch6/main.pptx and b/docs/ch6/main.pptx differ diff --git a/docs/ch7/main.md b/docs/ch7/main.md index aad229d..aff5cb0 100644 --- a/docs/ch7/main.md +++ b/docs/ch7/main.md @@ -305,4 +305,15 @@ $\qquad$ 最后展示一下我们的训练曲线和测试曲线,分别如图 $
图 $\text{7-7}$ $\text{CartPole-v1}$ 环境 $\text{DQN}$ 算法测试曲线
-$\qquad$ 其中我们该环境每回合的最大步数是 $200$,对应的最大奖励也为 $200$,从图中可以看出,智能体确实学到了一个最优的策略。 \ No newline at end of file +$\qquad$ 其中我们该环境每回合的最大步数是 $200$,对应的最大奖励也为 $200$,从图中可以看出,智能体确实学到了一个最优的策略,即达到收敛。 + +## 7.5 本章小结 + +$\qquad$ 本章讲了深度强化学习最为基础的 $\text{DQN}$ 算法,相比于 $\text{Q-learning}$ 算法,除了用神经网络来替代 $Q$ 表这项改进之外,还提出了目标网络、经验回放等技巧,主要优化引入神经网络带来的局部最小值问题。最后,我们利用 $\text{PyTorch}$ 框架实现了 $\text{DQN}$ 算法并取得了不错的效果。由于从本章开始所有的强化学习算法都是基于深度网络的,对于深度学习基础不够的读者来说,还需要先学习相关基础。 + +## 7.6 练习题 + +1. 相比于$\text{Q-learning}$ 算法,$\text{DQN}$ 算法做了哪些改进? +2. 为什么要在 $\text{DQN}$ 算法中引入 $\varepsilon-\text{greedy}$ 策略? +3. $\text{DQN}$ 算法为什么要多加一个目标网络? +4. 经验回放的作用是什么? \ No newline at end of file diff --git a/docs/ch8/main.md b/docs/ch8/main.md index 2733d5a..5642a59 100644 --- a/docs/ch8/main.md +++ b/docs/ch8/main.md @@ -4,7 +4,9 @@ $\qquad$ 本章将介绍一些基于 $\text{DQN}$ 改进的一些算法。这些 ## 8.1 Double DQN 算法 -$\qquad$ $\text{Double DQN}$ 算法是谷歌 $\text{DeepMind}$ 于 $\text{2015}$ 年 $\text{12}$ 月提出的一篇论文,主要贡献是通过引入两个网络用于解决 $Q$ 值过估计( $\text{overestimate}$ )的问题。顺便说一句,这里两个网络其实跟前面 $\text{DQN}$ 算法讲的目标网络是类似的,读者可能会产生混淆。实际上它们之间的关系是这样的,我们知道 $\text{DQN}$ 分别于 $\text{2013}$ 和 $\text{2015}$ 年提出了两个版本,后者就是目前较为成熟的 $\text{Nature DQN}$ 版本,前者就是单纯在 $\text{Q-learning}$ 算法基础上引入了深度网络而没有额外的技巧。而在中间的过程中 $\text{Double DQN}$ 算法被提出,因此 $\text{Nature DQN}$ 在发表的时候也借鉴了 $\text{Double DQN}$ 的思想,所以才会有目标网络的概念。尽管如此, $\text{Double DQN}$ 算法仍然有其独特的地方,因此我们还是将其单独拿出来讲。 +$\qquad$ $\text{Double DQN}$ 算法是谷歌 $\text{DeepMind}$ 于 $\text{2015}$ 年 $\text{12}$ 月提出的一篇论文,主要贡献是通过引入两个网络用于解决 $Q$ 值过估计( $\text{overestimate}$ )的问题。顺便说一句,这里两个网络其实跟前面 $\text{DQN}$ 算法讲的目标网络是类似的,读者可能会产生混淆。 + +$\qquad$ 实际上它们之间的关系是这样的,我们知道 $\text{DQN}$ 分别于 $\text{2013}$ 和 $\text{2015}$ 年提出了两个版本,后者就是目前较为成熟的 $\text{Nature DQN}$ 版本,前者就是单纯在 $\text{Q-learning}$ 算法基础上引入了深度网络而没有额外的技巧。而在中间的过程中 $\text{Double DQN}$ 算法被提出,因此 $\text{Nature DQN}$ 在发表的时候也借鉴了 $\text{Double DQN}$ 的思想,所以才会有目标网络的概念。尽管如此, $\text{Double DQN}$ 算法仍然有其独特的地方,因此我们还是将其单独拿出来讲。 > ① Hasselt H V , Guez A , Silver D .Deep Reinforcement Learning with Double Q-learning[J].Computer ence, 2015.DOI:10.48550/arXiv.1509.06461. @@ -91,7 +93,7 @@ $\qquad$ $\text{Noisy DQN}$ 算法 也是通过优化网络结构 > ③ Fortunato M , Azar M G , Piot B ,et al.Noisy Networks for Exploration[J]. 2017.DOI:10.48550/arXiv.1706.10295. -$\qquad$ 从 $\text{Q-learning}$ 算法开始,我们就讲到了探索-利用平衡的问题,常见的 $\varepsilon-greedy$ 策略是从智能体与环境的交互过程改善探索能力,以避免陷入局部最优解。而在深度强化学习中,由于引入了深度学习,深度学习本身也会因为网络模型限制或者梯度下降方法陷入局部最优解问题。也就是说,深度强化学习既要考虑与环境交互过程中的探索能力,也要考虑深度模型本身的探索能力,从而尽量避免陷入局部最优解的困境之中,这也是为什么经常有人会说强化学习比深度学习更难“炼丹”的原因之一。 +$\qquad$ 从 $\text{Q-learning}$ 算法开始,我们就讲到了探索-利用平衡的问题,常见的 $\varepsilon-\text{greedy}$ 策略是从智能体与环境的交互过程改善探索能力,以避免陷入局部最优解。而在深度强化学习中,由于引入了深度学习,深度学习本身也会因为网络模型限制或者梯度下降方法陷入局部最优解问题。也就是说,深度强化学习既要考虑与环境交互过程中的探索能力,也要考虑深度模型本身的探索能力,从而尽量避免陷入局部最优解的困境之中,这也是为什么经常有人会说强化学习比深度学习更难“炼丹”的原因之一。 $\qquad$ 回归正题,$\text{Noisy DQN}$ 算法其实是在 $\text{DQN}$ 算法基础上在神经网络中引入了噪声层来提高网络性能的,即将随机性应用到神经网络中的参数或者说权重,增加了 $Q$ 网络对于状态和动作空间的探索能力,从而提高收敛速度和稳定性。在实践上也比较简单,就是通过添加随机性参数到神经网络的线性层,对应的 $Q$ 值则可以表示为 $Q_{\theta+\epsilon}$,注意不要把这里的 $\text{epsilon}$ 跟 $\varepsilon-greedy$ 策略中的 $\varepsilon$ 混淆了。虽然都叫做 $\epsilon$ ,但这里 $\epsilon$ 是由高斯分布生成的总体分类噪声参数。 @@ -572,4 +574,13 @@ $\qquad$ 最后,我们可以将优先级经验回放和 $\text{DQN}$ 结合起
-
图 $\text{8-8}$ $\text{CartPole}$ 环境 $\text{PER DQN}$ 算法训练曲线
\ No newline at end of file +
图 $\text{8-8}$ $\text{CartPole}$ 环境 $\text{PER DQN}$ 算法训练曲线
+ +## 本章小结 + +$\qquad$ 本章主要讲解了 $\text{DQN}$ 的一些改进算法,主要解决 $Q$ 值过估计、探索策略差等问题,其中有些技巧是比较通用的,例如 $\text{Noisy DQN}$ 算法中再神经网络引入噪声来提高探索策略。读者在学习的过程中,一定要注意技巧本身的使用方式与泛用性,而不是作为单独的算法来看待。 + +## 练习题 + +1. $\text{DQN}$ 算法为什么会产生 $Q$ 值的过估计问题? +2. 同样是提高探索,$\text{Noisy DQN}$ 和 $\varepsilon-\text{greedy}$ 策略 有什么区别? \ No newline at end of file diff --git a/docs/ch9/main.md b/docs/ch9/main.md index b5fcc09..6bd4ef5 100644 --- a/docs/ch9/main.md +++ b/docs/ch9/main.md @@ -314,3 +314,14 @@ $$ $$ $\qquad$ 这个公式虽然看起来很复杂,但实现起来其实很简单,只需要在模型最后一层输出两个值,一个是均值,一个是方差,然后再用这两个值来构建一个高斯分布,然后采样即可,具体同样在后面的章节中展开。 + +## 9.6 本章小结 + +$\qquad$ 本章开始介绍强化学习另一大类的算法,即基于策略梯度的算法,并且分别从两种不同的角度推导了策略梯度的目标函数公式。此外,简要介绍了一个最基础的策略梯度算法,即 $\text{REINFORCE}$ 算法。最后介绍了常见策略函数的设计方法,为后面 $Actor-Critic$ 算法章节做铺垫。 + +## 9.7 练习题 + +1. 基于价值和基于策略的算法各有什么优缺点? +2. 马尔可夫平稳分布需要满足什么条件? +3. $\text{REINFORCE}$ 算法会比 $\text{Q-learning}$ 算法训练速度更快吗?为什么? +4. 确定性策略与随机性策略的区别? diff --git a/docs/figs/ch6/ggo.png b/docs/figs/ch6/ggo.png index e25f169..a8bb728 100644 Binary files a/docs/figs/ch6/ggo.png and b/docs/figs/ch6/ggo.png differ diff --git "a/words/\347\254\25410\347\253\240 Actor-Critic \347\256\227\346\263\225.docx" "b/words/\347\254\25410\347\253\240 Actor-Critic \347\256\227\346\263\225.docx" index 793ca4d..30fc440 100644 Binary files "a/words/\347\254\25410\347\253\240 Actor-Critic \347\256\227\346\263\225.docx" and "b/words/\347\254\25410\347\253\240 Actor-Critic \347\256\227\346\263\225.docx" differ diff --git "a/words/\347\254\25411\347\253\240 DDPG \344\270\216 TD3 \347\256\227\346\263\225.docx" "b/words/\347\254\25411\347\253\240 DDPG \344\270\216 TD3 \347\256\227\346\263\225.docx" deleted file mode 100644 index 39df5fd..0000000 Binary files "a/words/\347\254\25411\347\253\240 DDPG \344\270\216 TD3 \347\256\227\346\263\225.docx" and /dev/null differ diff --git "a/words/\347\254\25411\347\253\240 DDPG \347\256\227\346\263\225.docx" "b/words/\347\254\25411\347\253\240 DDPG \347\256\227\346\263\225.docx" new file mode 100644 index 0000000..c43eff4 Binary files /dev/null and "b/words/\347\254\25411\347\253\240 DDPG \347\256\227\346\263\225.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 771b570..f84dddc 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 c6ccbbd..f5e949f 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 2d4a299..63cc1e2 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 diff --git "a/words/\347\254\2545\347\253\240 \345\205\215\346\250\241\345\236\213\346\216\247\345\210\266.docx" "b/words/\347\254\2545\347\253\240 \345\205\215\346\250\241\345\236\213\346\216\247\345\210\266.docx" index 210f83e..6865f15 100644 Binary files "a/words/\347\254\2545\347\253\240 \345\205\215\346\250\241\345\236\213\346\216\247\345\210\266.docx" and "b/words/\347\254\2545\347\253\240 \345\205\215\346\250\241\345\236\213\346\216\247\345\210\266.docx" differ diff --git "a/words/\347\254\2546\347\253\240 \346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200.docx" "b/words/\347\254\2546\347\253\240 \346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200.docx" index 5d009e0..5e159e7 100644 Binary files "a/words/\347\254\2546\347\253\240 \346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200.docx" and "b/words/\347\254\2546\347\253\240 \346\267\261\345\272\246\345\255\246\344\271\240\345\237\272\347\241\200.docx" differ diff --git "a/words/\347\254\2547\347\253\240 DQN \347\256\227\346\263\225.docx" "b/words/\347\254\2547\347\253\240 DQN \347\256\227\346\263\225.docx" index 98b4355..5f6d0e4 100644 Binary files "a/words/\347\254\2547\347\253\240 DQN \347\256\227\346\263\225.docx" and "b/words/\347\254\2547\347\253\240 DQN \347\256\227\346\263\225.docx" differ diff --git "a/words/\347\254\2548\347\253\240 DQN\347\256\227\346\263\225\350\277\233\351\230\266.docx" "b/words/\347\254\2548\347\253\240 DQN\347\256\227\346\263\225\350\277\233\351\230\266.docx" index 3b764f4..8b325bf 100644 Binary files "a/words/\347\254\2548\347\253\240 DQN\347\256\227\346\263\225\350\277\233\351\230\266.docx" and "b/words/\347\254\2548\347\253\240 DQN\347\256\227\346\263\225\350\277\233\351\230\266.docx" differ diff --git "a/words/\347\254\2549\347\253\240 \347\255\226\347\225\245\346\242\257\345\272\246.docx" "b/words/\347\254\2549\347\253\240 \347\255\226\347\225\245\346\242\257\345\272\246.docx" index 3c3f8fc..a8dee76 100644 Binary files "a/words/\347\254\2549\347\253\240 \347\255\226\347\225\245\346\242\257\345\272\246.docx" and "b/words/\347\254\2549\347\253\240 \347\255\226\347\225\245\346\242\257\345\272\246.docx" differ