$, 其中 $R$ 表示从 $S$ 到 $S'$ 能够获得的奖励期望, $\gamma$ 为折扣因子, $A$ 为动作集合;
+
+马尔可夫最重要的性质是下一个状态只与当前状态有关,与之前的状态无关,也就是 $p(s_{t+1} | s_t)= p(s_{t+1}|s_1,s_2,...,s_t)$。
+
+**2-2** 友善的面试官:请问我们一般怎么求解马尔可夫决策过程?
+
+我们求解马尔可夫决策过程时,可以直接求解贝尔曼方程或动态规划方程:
+
+$$V(s)=R(S)+ \gamma \sum_{s' \in S}p(s'|s)V(s')$$
+
+特别地,其矩阵形式为 $\mathrm{V}=\mathrm{R}+\gamma \mathrm{PV}$。但是贝尔曼方程很难求解且计算复杂度较高,所以可以使用动态规划、蒙特卡洛以及时序差分等方法求解。
+
+**2-3** 友善的面试官:请问如果数据流不具备马尔可夫性质怎么办?应该如何处理?
+
+如果不具备马尔可夫性,即下一个状态与之前的状态也有关,若仅用当前的状态来求解决策过程,势必导致决策的泛化能力变差。为了解决这个问题,可以利用循环神经网络对历史信息建模,获得包含历史信息的状态表征,表征过程也可以使用注意力机制等手段,最后在表征状态空间求解马尔可夫决策过程问题。
+
+**2-4** 友善的面试官:请分别写出基于状态价值函数的贝尔曼方程以及基于动作价值函数的贝尔曼方程。
+
+(1)基于状态价值函数的贝尔曼方程: $V_{\pi}(s) = \sum_{a}{\pi(a|s)}\sum_{s',r}{p(s',r|s,a)[r(s,a)+\gamma V_{\pi}(s')]}$;
+
+(2)基于动作价值函数的贝尔曼方程: $Q_{\pi}(s,a)=\sum_{s',r}p(s',r|s,a)[r(s',a)+\gamma V_{\pi}(s')]$。
+
+**2-5** 友善的面试官:请问最佳价值函数 $V^*$ 和最佳策略 $\pi^*$ 为什么等价呢?
+
+最佳价值函数的定义为 $V^* (s)=\max_{\pi} V_{\pi}(s)$ ,即我们搜索一种策略 $\pi$ 来让每个状态的价值最大。$V^*$ 就是到达每一个状态其的最大价值,同时我们得到的策略就可以说是最佳策略,即$ \pi^{*}(s)=\underset{\pi}{\arg \max }~ V_{\pi}(s)$ 。最佳策略使得每个状态的价值函数都取得最大值。所以如果我们可以得到一个最佳价值函数,就可以说某一个马尔可夫决策过程的环境被解。在这种情况下,其最佳价值函数是一致的,即其达到的上限的值是一致的,但这里可能有多个最佳策略对应于相同的最佳价值。
+
+**2-6** 友善的面试官:能不能手写一下第$n$步的价值函数更新公式呀?另外,当 $n$ 越来越大时,价值函数的期望和方差是分别变大还是变小呢?
+
+$n$ 越大,方差越大,期望偏差越小。价值函数的更新公式如下:
+
+$$
+Q\left(S, A\right) \leftarrow Q\left(S, A\right)+\alpha\left[\sum_{i=1}^{n} \gamma^{i-1} r_{t+i}+\gamma^{n} \max _{a} Q\left(S',a\right)-Q\left(S, A\right)\right]
+$$
diff --git a/docs/chapter3/chapter3.md b/docs/chapter3/chapter3.md
index be3d49b..58d9537 100644
--- a/docs/chapter3/chapter3.md
+++ b/docs/chapter3/chapter3.md
@@ -6,7 +6,7 @@
强化学习是一个与时间相关的序列决策的问题。例如,如图 3.1 所示,在 $t-1$ 时刻,我看到熊对我招手,下意识的动作就是逃跑。熊看到有人逃跑,就可能觉得发现了猎物,并开始发动攻击。而在 $t$ 时刻,我如果选择装死的动作,可能熊咬咬我、摔几下就觉得挺无趣的,可能会走开。这个时候我再逃跑,可能就成功了,这就是一个序列决策过程。
-在输出每一个动作之前,我们可以选择不同的动作。比如在 $t$ 时刻,我选择逃跑的时候,可能熊已经追上来了。如果在 $t$ 时刻,我没有选择装死,而是选择逃跑,这个时候熊已经追上来了,那么我就会转移到不同的状态。有一定的概率我会逃跑成功,也有一定的概率我会逃跑失败。我们用状态转移概率 $p\left[s_{t+1}, r_{t} \mid s_{t}, a_{t}\right]$ 来表示在状态 $s_t$ 选择动作 $a_t$ 的时候,转移到转态 $s_{t+1}$ ,而且得到奖励 $r_t$ 的概率是多少。状态转移概率是具有**马尔可夫性质**的(系统下一时刻的状态仅由当前时刻的状态决定,不依赖于以往任何状态)。因为在这个过程中,下一时刻的状态取决于当前的状态 $s_t$,它和之前的 $s_{t-1}$ 和 $s_{t-2}$ 没有关系。再加上这个过程也取决于智能体与环境交互的 $a_t$ ,所以包含了决策的过程,我们称这样的过程为马尔可夫决策过程。马尔可夫决策过程就是序列决策的经典的表现方式。马尔可夫决策过程也是强化学习里面一个非常基本的学习框架。状态、动作、状态转移概率和奖励 $(S$、$A$、$P$、$R)$,这4个合集就构成了强化学习马尔可夫决策过程的四元组,后面也可能会再加上折扣因子构成五元组。
+在输出每一个动作之前,我们可以选择不同的动作。比如在 $t$ 时刻,我选择逃跑的时候,可能熊已经追上来了。如果在 $t$ 时刻,我没有选择装死,而是选择逃跑,这个时候熊已经追上来了,那么我就会转移到不同的状态。有一定的概率我会逃跑成功,也有一定的概率我会逃跑失败。我们用状态转移概率 $p\left[s_{t+1}, r_{t} \mid s_{t}, a_{t}\right]$ 来表示在状态 $s_t$ 选择动作 $a_t$ 的时候,转移到状态 $s_{t+1}$ ,而且得到奖励 $r_t$ 的概率是多少。状态转移概率是具有**马尔可夫性质**的(系统下一时刻的状态仅由当前时刻的状态决定,不依赖于以往任何状态)。因为在这个过程中,下一时刻的状态取决于当前的状态 $s_t$,它和之前的 $s_{t-1}$ 和 $s_{t-2}$ 没有关系。再加上这个过程也取决于智能体与环境交互的 $a_t$ ,所以包含了决策的过程,我们称这样的过程为马尔可夫决策过程。马尔可夫决策过程就是序列决策的经典的表现方式。马尔可夫决策过程也是强化学习里面一个非常基本的学习框架。状态、动作、状态转移概率和奖励 $(S$、$A$、$P$、$R)$,这4个合集就构成了强化学习马尔可夫决策过程的四元组,后面也可能会再加上折扣因子构成五元组。
diff --git a/docs/chapter3/chapter3_questions&keywords.md b/docs/chapter3/chapter3_questions&keywords.md
index 75e226a..1de8738 100644
--- a/docs/chapter3/chapter3_questions&keywords.md
+++ b/docs/chapter3/chapter3_questions&keywords.md
@@ -1,108 +1,117 @@
-# Chapter3 表格型方法
+# 第三章 表格型方法
-## 1 Keywords
+## 关键词
-- **P函数和R函数:** P函数反应的是状态转移的概率,即反应的环境的随机性,R函数就是Reward function。但是我们通常处于一个未知的环境(即P函数和R函数是未知的)。
-- **Q表格型表示方法:** 表示形式是一种表格形式,其中横坐标为 action(agent)的行为,纵坐标是环境的state,其对应着每一个时刻agent和环境的情况,并通过对应的reward反馈去做选择。一般情况下,Q表格是一个已经训练好的表格,不过,我们也可以每进行一步,就更新一下Q表格,然后用下一个状态的Q值来更新这个状态的Q值(即时序差分方法)。
-- **时序差分(Temporal Difference):** 一种Q函数(Q值)的更新方式,也就是可以拿下一步的 Q 值 $Q(S_{t+_1},A_{t+1})$ 来更新我这一步的 Q 值 $Q(S_t,A_t)$ 。完整的计算公式如下:$Q(S_t,A_t) \larr Q(S_t,A_t) + \alpha [R_{t+1}+\gamma Q(S_{t+1},A_{t+1})-Q(S_t,A_t)]$
-- **SARSA算法:** 一种更新前一时刻状态的单步更新的强化学习算法,也是一种on-policy策略。该算法由于每次更新值函数需要知道前一步的状态(state),前一步的动作(action)、奖励(reward)、当前状态(state)、将要执行的动作(action),即 $(S_{t}, A_{t}, R_{t+1}, S_{t+1}, A_{t+1})$ 这几个值,所以被称为SARSA算法。agent每进行一次循环,都会用 $(S_{t}, A_{t}, R_{t+1}, S_{t+1}, A_{t+1})$ 对于前一步的Q值(函数)进行一次更新。
+- **概率函数和奖励函数**:概率函数定量地表达状态转移的概率,其可以表现环境的随机性。但是实际上,我们经常处于一个未知的环境中,即概率函数和奖励函数是未知的。
-## 2 Questions
+- **Q表格**:其表示形式是表格,其中表格的横轴为动作(智能体的动作),纵轴为环境的状态,每一个坐标点对应某时刻智能体和环境的状态,并通过对应的奖励反馈选择被执行的动作。一般情况下,Q表格是一个已经训练好的表格,不过我们也可以每执行一步,就对Q表格进行更新,然后用下一个状态的Q值来更新当前状态的Q值(即时序差分方法)。
-- 构成强化学习MDP的四元组有哪些变量?
+- **时序差分(temporal difference,TD)方法**:一种Q函数(Q值)的更新方式,流程是使用下一步的Q值 $Q(s_{t+1},a_{t+1})$ 来更新当前步的Q值 $Q(s_t,a_t)$。完整的计算公式如下:$Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha [r_{t+1}+\gamma Q(s_{t+1},a_{t+1})-Q(s_t,a_t)]$ 。
- 答:状态、动作、状态转移概率和奖励,分别对应(S,A,P,R),后面有可能会加上个衰减因子构成五元组。
+- **Sarsa算法**:一种更新前一时刻状态的单步更新的强化学习算法,也是一种同策略学习算法。该算法由于每次更新Q函数时需要知道前一步的状态、动作、奖励以及当前时刻的状态、将要执行的动作,即 $s_{t}$、$a_{t}$、$r_{t+1}$、$s_{t+1}$、$a_{t+1}$ 这几个值,因此被称为 Sarsa 算法。智能体每进行一次循环,都会用 $s_{t}$、$a_{t}$、$r_{t+1}$、$s_{t+1}$、$a_{t+1}$ 对前一步的Q值(函数)进行一次更新。
-- 基于以上的描述所构成的强化学习的“学习”流程。
- 答:强化学习要像人类一样去学习了,人类学习的话就是一条路一条路的去尝试一下,先走一条路,我看看结果到底是什么。多试几次,只要能一直走下去的,我们其实可以慢慢的了解哪个状态会更好。我们用价值函数 $V(s)$ 来代表这个状态是好的还是坏的。然后用这个 Q 函数来判断说在什么状态下做什么动作能够拿到最大奖励,我们用 Q 函数来表示这个状态-动作值。
+## 习题
-- 基于SARSA算法的agent的学习过程。
+**3-1** 构成强化学习的马尔可夫决策过程的四元组有哪些变量?
- 答:我们现在有环境,有agent。每交互一次以后,我们的agent会向环境输出action,接着环境会反馈给agent当前时刻的state和reward。那么agent此时会实现两个方法:
+状态、动作、状态转移概率和奖励,分别对应$(S,A,P,R)$,后面有可能会加上折扣因子构成五元组。
+
+**3-2** 请通俗地描述强化学习的“学习”流程。
+
+可以将强化学习的“学习”流程类比于人类的学习流程。人类学习就是尝试每一条路,并记录尝试每一条路后的最终结果。在人类尝试的过程中,其实就可以慢慢地了解到哪一条路(对应于强化学习中的状态概念)会更好。我们用价值函数 $V(s)$ 来定量表达该状态的优劣,然后用Q函数来判断在什么状态下做什么动作能够得到最大奖励,在强化学习中我们用Q函数来表示状态-动作值。
+
+**3-3** 请描述基于Sarsa算法的智能体的学习过程。
+
+对于环境和智能体。两者每交互一次以后,智能体都会向环境输出动作,接着环境会反馈给智能体当前时刻的状态和奖励。那么智能体此时会进行两步操作:
+
+(1)使用已经训练好的Q表格,对应环境反馈的状态和奖励选取对应的动作进行输出。
+
+(2)我们已经拥有了$(s_{t}, a_{t}, r_{t+1}, s_{t+1}, a_{t+1})$ 这几个值,并直接使用 $a_{t+1}$ 更新我们的Q表格。
+
+**3-4** Q学习算法和Sarsa算法的区别是什么?
+
+Sarsa算法是Q学习算法的改进(这句话可参考论文 “On-Line Q-Learning Using Connectionist Systems”的摘要部分),详细描述如下。
+
+(1)首先,Q学习是异策略的时序差分学习方法,而 Sarsa 算法是同策略的时序差分学习方法。
+
+(2)其次,Sarsa算法在更新Q表格的时候所用到的 $a'$ 是获取下一个Q值时一定会执行的动作。这个动作有可能是用 $\varepsilon$-贪心方法采样出来的,也有可能是 $\mathrm{max}_Q$ 对应的动作,甚至是随机动作。
+
+(3)但是Q学习在更新Q表格的时候所用到的Q值 $Q(S',a')$ 对应的动作不一定是下一步会执行的动作,因为下一步实际会执行的动作可能是因为进一步的探索而得到的。Q学习默认的动作不是通过行为策略来选取的,它默认 $a'$ 为最佳策略对应的动作,所以Q学习算法在更新的时候,不需要传入 $a'$ ,即 $a_{t+1}$ 。
+
+(4)更新公式的对比(区别只在目标计算部分)。
+
+Sarsa算法的公式:$r_{t+1}+\gamma Q(s_{t+1}, a_{t+1})$ 。
+
+Q学习算法的公式:$r_{t+1}+\gamma \underset{a}{\max} Q\left(s_{t+1}, a\right)$ 。
+
+总结起来,Sarsa算法实际上是用固有的策略产生 {$S,A,R,S',A'$} 这一条轨迹,然后使用 $Q(s_{t+1},a_{t+1})$ 更新原本的Q值 $Q(s_t,a_t)$ 。但是Q学习算法并不需要知道实际上选择的动作,它默认下一个动作就是Q值最大的那个动作。所以Sarsa算法的动作通常会更加“保守胆小”,而对应的Q学习算法的动作会更加“莽撞激进”。
+
+**3-5** 同策略和异策略的区别是什么?
+
+Sarsa算法就是一个典型的同策略算法,它只用一个 $\pi$ ,为了兼顾探索和开发,它在训练的时候会显得有点儿“胆小怕事”。它在解决悬崖寻路问题的时候,会尽可能地远离悬崖边,确保哪怕自己不小心向未知区域探索了一些,也还是处在安全区域内,不至于掉入悬崖中。
+
+Q学习算法是一个比较典型的异策略算法,它有目标策略(target policy),用 $\pi$ 来表示。此外还有行为策略(behavior policy),用 $\mu$ 来表示。它分离了目标策略与行为策略,使得其可以大胆地用行为策略探索得到的经验轨迹来优化目标策略。这样智能体就更有可能探索到最优的策略。
+
+比较Q学习算法和Sarsa算法的更新公式可以发现,Sarsa算法并没有选取最大值的操作。因此,Q学习算法是非常激进的,其希望每一步都获得最大的奖励;Sarsa算法则相对来说偏保守,会选择一条相对安全的迭代路线。
+
+
+## 面试题
+
+**3-1** 友善的面试官:同学,你能否简述同策略和异策略的区别呢?
+
+同策略和异策略的根本区别在于生成样本的策略和参数更新时的策略是否相同。对于同策略,行为策略和要优化的策略是同一策略,更新了策略后,就用该策略的最新版本对数据进行采样;对于异策略,其使用任意行为策略来对数据进行采样,并利用其更新目标策略。例如,Q学习在计算下一状态的预期奖励时使用了最大化操作,直接选择最优动作,而当前策略并不一定能选择到最优的动作,因此这里生成样本的策略和学习时的策略不同,所以Q学习算法是异策略算法;相对应的Sarsa算法则是基于当前的策略直接执行一次动作选择,然后用动作和对应的状态更新当前的策略,因此生成样本的策略和学习时的策略相同,所以Sarsa算法为同策略算法。
+
+**3-2** 友善的面试官:能否细致地讲一下Q学习算法,最好可以写出其 $Q(s,a)$ 的更新公式。另外,它是同策略还是异策略,原因是什么呢?
+
+Q学习是通过计算最优动作价值函数来求策略的一种时序差分的学习方法,其更新公式为
+
+$$
+Q(s, a) \leftarrow Q(s, a) + \alpha [r(s,a) + \gamma \max_{a'} Q(s', a') - Q(s, a)]
+$$
+
+其是异策略的,由于Q更新使用了下一个时刻的最大值,因此其只关心哪个动作使得 $Q(s_{t+1}, a)$ 取得最大值,而实际上到底采取了哪个动作(行为策略),Q学习并不关心。这表明优化策略并没有用到行为策略的数据,所以说它是异策略的。
+
+**3-3** 友善的面试官:好的,看来你对于Q学习算法很了解,那么能否讲一下与Q学习算法类似的Sarsa算法呢,最好也可以写出其对应的 $Q(s,a)$ 更新公式。另外,它是同策略还是异策略,为什么?
+
+Sarsa算法可以算是Q学习算法的改进,其更新公式为
+
+$$
+Q(s, a) \leftarrow Q(s, a) + \alpha [r(s,a) + \gamma Q(s', a') - Q(s, a)]
+$$
+
+其为同策略的,Sarsa算法必须执行两次动作得到 $(s,a,r,s',a')$ 才可以更新一次;而且 $a'$ 是在特定策略 $\pi$ 的指导下执行的动作,因此估计出来的 $Q(s,a)$ 是在该策略 $\pi$ 下的Q值,样本生成用的 $\pi$ 和估计的 $\pi$ 是同一个,因此是同策略。
+
+**3-4** 友善的面试官:请问基于价值的方法和基于策略的方法的区别是什么?
+
+(1)生成策略上的差异,前者确定,后者随机。基于价值的方法中动作-价值对的估计值最终会收敛(通常是不同的数,可以转化为0~1的概率),因此通常会获得一个确定的策略;基于策略的方法不会收敛到一个确定的值,另外他们会趋向于生成最佳随机策略。如果最佳策略是确定的,那么最优动作对应的值函数的值将远大于次优动作对应的值函数的值,值函数的大小代表概率的大小。
+
+(2)动作空间是否连续,前者离散,后者连续。基于价值的方法,对于连续动作空间问题,虽然可以将动作空间离散化处理,但离散间距的选取不易确定。过大的离散间距会导致算法取不到最优动作,会在最优动作附近徘徊;过小的离散间距会使得动作的维度增大,会和高维度动作空间一样导致维度灾难,影响算法的速度。而基于策略的方法适用于连续的动作空间,在连续的动作空间中,可以不用计算每个动作的概率,而是通过正态分布选择动作。
+
+(3)基于价值的方法,例如Q学习算法,是通过求解最优价值函数而间接地求解最优策略;基于策略的方法,例如REINFORCE等算法直接将策略参数化,通过策略搜索、策略梯度或者进化方法来更新参数以最大化回报。基于价值的方法不易扩展到连续动作空间,并且当同时采用非线性近似、自举等策略时会有收敛问题。策略梯度具有良好的收敛性。
+
+(4)另外,对于价值迭代和策略迭代,策略迭代有两个循环,一个是在策略估计的时候,为了求当前策略的价值函数需要迭代很多次;另一个是外面的大循环,即策略评估、策略提升。价值迭代算法则是一步到位,直接估计最优价值函数,因此没有策略提升环节。
+
+**3-5** 友善的面试官:请简述一下时序差分方法。
+
+时序差分算法是使用广义策略迭代来更新Q函数的方法,核心是使用自举,即价值函数的更新使用下一个状态的价值函数来估计当前状态的价值。也就是使用下一步的Q值 $Q(s_{t+1},a_{t+1})$ 来更新当前步的Q值 $Q(s_t,a_t) $。完整的计算公式如下:
+
+$$
+Q(s_t,a_t) \leftarrow Q(s_t,a_t) + \alpha [r_{t+1}+\gamma Q(s_{t+1},a_{t+1})]
+$$
+
+**3-6** 友善的面试官:请问蒙特卡洛方法和时序差分方法是无偏估计吗?另外谁的方差更大呢?为什么?
+
+蒙特卡洛方法是无偏估计,时序差分方法是有偏估计;蒙特卡洛方法的方差较大,时序差分方法的方差较小,原因在于时序差分方法中使用了自举,实现了基于平滑的效果,导致估计的价值函数的方差更小。
+
+**3-7** 友善的面试官:能否简单说一下动态规划方法、蒙特卡洛方法和时序差分方法的异同点?
+
+相同点:都用于进行价值函数的描述与更新,并且所有方法都基于对未来事件的展望计算一个回溯值。
+
+不同点:蒙特卡洛方法和时序差分方法属于免模型方法,而动态规划属于有模型方法;时序差分方法和蒙特卡洛方法,因为都是免模型的方法,所以对于后续状态的获知也都是基于试验的方法;时序差分方法和动态规划方法的策略评估,都能基于当前状态的下一步预测情况来得到对于当前状态的价值函数的更新。
+
+另外,时序差分方法不需要等到试验结束后才能进行当前状态的价值函数的计算与更新,而蒙特卡洛方法需要与环境交互,产生一整条马尔可夫链并直到最终状态才能进行更新。时序差分方法和动态规划方法的策略评估不同之处为免模型和有模型,动态规划方法可以凭借已知转移概率推断出后续的状态情况,而时序差分方法借助试验才能知道。
- 1.使用已经训练好的Q表格,对应环境反馈的state和reward选取对应的action进行输出。
-
- 2.我们已经拥有了$(S_{t}, A_{t}, R_{t+1}, S_{t+1}, A_{t+1})$ 这几个值,并直接使用 $A_{t+1}$ 去更新我们的Q表格。
+蒙特卡洛方法和时序差分方法的不同在于,蒙特卡洛方法进行了完整的采样来获取长期的回报值,因而在价值估计上会有更小的偏差,但是也正因为收集了完整的信息,所以价值的方差会更大,原因在于其基于试验的采样得到,和真实的分布有差距,不充足的交互导致较大方差。而时序差分方法则相反,因为它只考虑了前一步的回报值,其他都是基于之前的估计值,因而其价值估计相对来说具有偏差大方差小的特点。
-- Q-learning和Sarsa的区别?
-
- 答:Sarsa算法是Q-learning算法的改进。(这句话出自「神经网络与深度学习」的第 342 页)(可参考SARSA「on-line q-learning using connectionist systems」的 abstract 部分)
-
- 1. 首先,Q-learning 是 off-policy 的时序差分学习方法,Sarsa 是 on-policy 的时序差分学习方法。
-
- 2. 其次,Sarsa 在更新 Q 表格的时候,它用到的 A' 。我要获取下一个 Q 值的时候,A' 是下一个 step 一定会执行的 action 。这个 action 有可能是 $\varepsilon$-greddy 方法 sample 出来的值,也有可能是 max Q 对应的 action,也有可能是随机动作。但是就是它实实在在执行了的那个动作。
-
- 3. 但是 Q-learning 在更新 Q 表格的时候,它用到这个的 Q 值 $Q(S',a')$ 对应的那个 action ,它不一定是下一个 step 会执行的实际的 action,因为你下一个实际会执行的那个 action 可能会探索。Q-learning 默认的 action 不是通过 behavior policy 来选取的,它是默认 A' 为最优策略选的动作,所以 Q-learning 在学习的时候,不需要传入 A',即 $a_{t+1}$ 的值。
-
- 4. 更新公式的对比(区别只在target计算这一部分):
-
- - Sarsa的公式: $R_{t+1}+\gamma Q(S_{t+1}, A_{t+1})$ ;
- - Q-learning的公式:$R_{t+1}+\gamma \underset{a}{\max} Q\left(S_{t+1}, a\right)$
-
- Sarsa 实际上都是用自己的策略产生了 S,A,R,S',A' 这一条轨迹。然后拿着 $Q(S_{t+1},A_{t+1})$ 去更新原本的 Q 值 $Q(S_t,A_t)$。 但是 Q-learning 并不需要知道,我实际上选择哪一个 action ,它默认下一个动作就是 Q 最大的那个动作。所以基于此,Sarsa的action通常会更加“保守”、“胆小”,而对应的Q-Learning的action会更加“莽撞”、“激进”。
-
-- On-policy和 off-policy 的区别?
-
- 答:
-
- 1. Sarsa 就是一个典型的 on-policy 策略,它只用一个 $\pi$ ,为了兼顾探索和利用,所以它训练的时候会显得有点胆小怕事。它在解决悬崖问题的时候,会尽可能地离悬崖边上远远的,确保说哪怕自己不小心探索了一点了,也还是在安全区域内不不至于跳进悬崖。
- 2. Q-learning 是一个比较典型的 off-policy 的策略,它有目标策略 target policy,一般用 $\pi$ 来表示。然后还有行为策略 behavior policy,用 $\mu$ 来表示。它分离了目标策略跟行为策略。Q-learning 就可以大胆地用 behavior policy 去探索得到的经验轨迹来去优化我的目标策略。这样子我更有可能去探索到最优的策略。
- 3. 比较 Q-learning 和 Sarsa 的更新公式可以发现,Sarsa 并没有选取最大值的 max 操作。因此,Q-learning 是一个非常激进的算法,希望每一步都获得最大的利益;而 Sarsa 则相对非常保守,会选择一条相对安全的迭代路线。
-
-
-## 3 Something About Interview
-
-- 高冷的面试官:同学,你能否简述on-policy和off-policy的区别?
-
- 答: off-policy和on-policy的根本区别在于生成样本的policy和参数更新时的policy是否相同。对于on-policy,行为策略和要优化的策略是一个策略,更新了策略后,就用该策略的最新版本对于数据进行采样;对于off-policy,使用任意的一个行为策略来对于数据进行采样,并利用其更新目标策略。如果举例来说,Q-learning在计算下一状态的预期收益时使用了max操作,直接选择最优动作,而当前policy并不一定能选择到最优的action,因此这里生成样本的policy和学习时的policy不同,所以Q-learning为off-policy算法;相对应的SARAS则是基于当前的policy直接执行一次动作选择,然后用这个样本更新当前的policy,因此生成样本的policy和学习时的policy相同,所以SARAS算法为on-policy算法。
-
-- 高冷的面试官:小同学,能否讲一下Q-Learning,最好可以写出其 $Q(s,a)$ 的更新公式。另外,它是on-policy还是off-policy,为什么?
-
- 答: Q-learning是通过计算最优动作值函数来求策略的一种时序差分的学习方法,其更新公式为:
- $$
- Q(s, a) \larr Q(s, a) + \alpha [r(s,a) + \gamma \max_{a'} Q(s', a') - Q(s, a)]
- $$
- 其是off-policy的,由于是Q更新使用了下一个时刻的最大值,所以我们只关心哪个动作使得 $Q(s_{t+1}, a)$ 取得最大值,而实际到底采取了哪个动作(行为策略),并不关心。这表明优化策略并没有用到行为策略的数据,所以说它是 off-policy 的。
-
-- 高冷的面试官:小朋友,能否讲一下SARSA,最好可以写出其Q(s,a)的更新公式。另外,它是on-policy还是off-policy,为什么?
-
- 答:SARSA可以算是Q-learning的改进(这句话出自「神经网络与深度学习」的第 342 页)(可参考SARSA「on-line q-learning using connectionist systems」的 abstract 部分),其更新公式为:
- $$
- Q(s, a) \larr Q(s, a) + \alpha [r(s,a) + \gamma Q(s', a') - Q(s, a)]
- $$
- 其为on-policy的,SARSA必须执行两次动作得到 $(s,a,r,s',a') $才可以更新一次;而且 $a'$ 是在特定策略 $\pi$ 的指导下执行的动作,因此估计出来的 $Q(s,a)$ 是在该策略 $\pi$ 之下的Q-value,样本生成用的 $\pi$ 和估计的 $\pi$ 是同一个,因此是on-policy。
-
-- 高冷的面试官:请问value-based和policy-based的区别是什么?
-
- 答:
-
- 1. 生成policy上的差异:前者确定,后者随机。Value-Base中的 action-value估计值最终会收敛到对应的true values(通常是不同的有限数,可以转化为0到1之间的概率),因此通常会获得一个确定的策略(deterministic policy);而Policy-Based不会收敛到一个确定性的值,另外他们会趋向于生成optimal stochastic policy。如果optimal policy是deterministic的,那么optimal action对应的性能函数将远大于suboptimal actions对应的性能函数,性能函数的大小代表了概率的大小。
- 2. 动作空间是否连续,前者离散,后者连续。Value-Base,对于连续动作空间问题,虽然可以将动作空间离散化处理,但离散间距的选取不易确定。过大的离散间距会导致算法取不到最优action,会在这附近徘徊,过小的离散间距会使得action的维度增大,会和高维度动作空间一样导致维度灾难,影响算法的速度;而Policy-Based适用于连续的动作空间,在连续的动作空间中,可以不用计算每个动作的概率,而是通过Gaussian distribution (正态分布)选择action。
- 3. value-based,例如Q-learning,是通过求解最优值函数间接的求解最优策略;policy-based,例如REINFORCE,Monte-Carlo Policy Gradient,等方法直接将策略参数化,通过策略搜索,策略梯度或者进化方法来更新策略的参数以最大化回报。基于值函数的方法不易扩展到连续动作空间,并且当同时采用非线性近似、自举和离策略时会有收敛性问题。策略梯度具有良好的收敛性证明。
- 4. 补充:对于值迭代和策略迭代:策略迭代。它有两个循环,一个是在策略估计的时候,为了求当前策略的值函数需要迭代很多次。另外一个是外面的大循环,就是策略评估,策略提升这个循环。值迭代算法则是一步到位,直接估计最优值函数,因此没有策略提升环节。
-
-- 高冷的面试官:请简述以下时序差分(Temporal Difference,TD)算法。
-
- 答:TD算法是使用广义策略迭代来更新Q函数的方法,核心使用了自举(bootstrapping),即值函数的更新使用了下一个状态的值函数来估计当前状态的值。也就是使用下一步的 $Q$ 值 $Q(S_{t+1},A_{t+1})$ 来更新我这一步的 Q 值 $Q(S_t,A_t) $。完整的计算公式如下:
- $$
- Q(S_t,A_t) \larr Q(S_t,A_t) + \alpha [R_{t+1}+\gamma Q(S_{t+1},A_{t+1})]
- $$
-
-- 高冷的面试官:请问蒙特卡洛方法(Monte Carlo Algorithm,MC)和时序差分(Temporal Difference,TD)算法是无偏估计吗?另外谁的方法更大呢?为什么呢?
-
- 答:蒙特卡洛方法(MC)是无偏估计,时序差分(TD)是有偏估计;MC的方差较大,TD的方差较小,原因在于TD中使用了自举(bootstrapping)的方法,实现了基于平滑的效果,导致估计的值函数的方差更小。
-
-- 高冷的面试官:能否简单说下动态规划、蒙特卡洛和时序差分的异同点?
-
- 答:
-
- - 相同点:都用于进行值函数的描述与更新,并且所有方法都是基于对未来事件的展望来计算一个回溯值。
-
- - 不同点:蒙特卡洛和TD算法隶属于model-free,而动态规划属于model-based;TD算法和蒙特卡洛的方法,因为都是基于model-free的方法,因而对于后续状态的获知也都是基于试验的方法;TD算法和动态规划的策略评估,都能基于当前状态的下一步预测情况来得到对于当前状态的值函数的更新。
-
- 另外,TD算法不需要等到实验结束后才能进行当前状态的值函数的计算与更新,而蒙特卡洛的方法需要试验交互,产生一整条的马尔科夫链并直到最终状态才能进行更新。TD算法和动态规划的策略评估不同之处为model-free和model-based 这一点,动态规划可以凭借已知转移概率就能推断出来后续的状态情况,而TD只能借助试验才能知道。
-
- 蒙特卡洛方法和TD方法的不同在于,蒙特卡洛方法进行完整的采样来获取了长期的回报值,因而在价值估计上会有着更小的偏差,但是也正因为收集了完整的信息,所以价值的方差会更大,原因在于毕竟基于试验的采样得到,和真实的分布还是有差距,不充足的交互导致的较大方差。而TD算法与其相反,因为只考虑了前一步的回报值 其他都是基于之前的估计值,因而相对来说,其估计值具有偏差大方差小的特点。
-
- - 三者的联系:对于$TD(\lambda)$方法,如果 $ \lambda = 0$ ,那么此时等价于TD,即只考虑下一个状态;如果$ \lambda = 1$,等价于MC,即考虑 $T-1$ 个后续状态即到整个episode序列结束。
+三者的联系:对于TD($\lambda$)方法,如果 $\lambda = 0$ ,那么此时等价于时序差分方法,即只考虑下一个状态;如果 $\lambda = 1$ ,等价于蒙特卡洛方法,即考虑 $T-1$ 个后续状态直到整个试验结束。
diff --git a/docs/chapter4/chapter4_questions&keywords.md b/docs/chapter4/chapter4_questions&keywords.md
index e1d5786..b2f7f6b 100644
--- a/docs/chapter4/chapter4_questions&keywords.md
+++ b/docs/chapter4/chapter4_questions&keywords.md
@@ -1,119 +1,137 @@
-# Chapter4 梯度策略
+# 第四章 策略梯度
-## 1 Keywords
+## 关键词
-- **policy(策略):** 每一个actor中会有对应的策略,这个策略决定了actor的行为。具体来说,Policy 就是给一个外界的输入,然后它会输出 actor 现在应该要执行的行为。**一般地,我们将policy写成 $\pi$ 。**
-- **Return(回报):** 一个回合(Episode)或者试验(Trial)所得到的所有的reward的总和,也被人们称为Total reward。**一般地,我们用 $R$ 来表示它。**
-- **Trajectory:** 一个试验中我们将environment 输出的 $s$ 跟 actor 输出的行为 $a$,把这个 $s$ 跟 $a$ 全部串起来形成的集合,我们称为Trajectory,即 $\text { Trajectory } \tau=\left\{s_{1}, a_{1}, s_{2}, a_{2}, \cdots, s_{t}, a_{t}\right\}$。
-- **Reward function:** 根据在某一个 state 采取的某一个 action 决定说现在这个行为可以得到多少的分数,它是一个 function。也就是给一个 $s_1$,$a_1$,它告诉你得到 $r_1$。给它 $s_2$ ,$a_2$,它告诉你得到 $r_2$。 把所有的 $r$ 都加起来,我们就得到了 $R(\tau)$ ,代表某一个 trajectory $\tau$ 的 reward。
-- **Expected reward:** $\bar{R}_{\theta}=\sum_{\tau} R(\tau) p_{\theta}(\tau)=E_{\tau \sim p_{\theta}(\tau)}[R(\tau)]$。
-- **REINFORCE:** 基于策略梯度的强化学习的经典算法,其采用回合更新的模式。
+- **策略(policy)**:在每一个演员中会有对应的策略,这个策略决定了演员的后续动作。具体来说,策略就是对于外界的输入,输出演员现在应该要执行的动作。一般地,我们将策略写成 $\pi$ 。
-## 2 Questions
+- **回报(return)**:一个回合(episode)或者试验(trial)得到的所有奖励的总和,也被人们称为总奖励(total reward)。一般地,我们用 $R$ 来表示它。
-- 如果我们想让机器人自己玩video game, 那么强化学习中三个组成(actor、environment、reward function)部分具体分别是什么?
+- **轨迹(trajectory)**:一个试验中我们将环境输出的状态 $s$ 与演员输出的动作 $a$ 全部组合起来形成的集合称为轨迹,即 $\tau=\left\{s_{1}, a_{1}, s_{2}, a_{2}, \cdots, s_{t}, a_{t}\right\}$ 。
- 答:actor 做的事情就是去操控游戏的摇杆, 比如说向左、向右、开火等操作;environment 就是游戏的主机, 负责控制游戏的画面负责控制说,怪物要怎么移动, 你现在要看到什么画面等等;reward function 就是当你做什么事情,发生什么状况的时候,你可以得到多少分数, 比如说杀一只怪兽得到 20 分等等。
+- **奖励函数(reward function)**:用于反映在某一个状态采取某一个动作可以得到的奖励分数,这是一个函数。即给定一个状态-动作对 ($s_1$,$a_1$) ,奖励函数可以输出 $r_1$ 。给定 ($s_2$,$a_2$),它可以输出 $r_2$。 把所有的 $r$ 都加起来,我们就得到了 $R(\tau)$ ,它代表某一个轨迹 $\tau$ 的奖励。
-- 在一个process中,一个具体的trajectory $s_1$,$a_1$, $s_2$ , $a_2$ 出现的概率取决于什么?
+- **期望奖励(expected reward)**:$\bar{R}_{\theta}=\sum_{\tau} R(\tau) p_{\theta}(\tau)=E_{\tau \sim p_{\theta}(\tau)}[R(\tau)]$。
- 答:
+- **REINFORCE**:基于策略梯度的强化学习的经典算法,其采用回合更新的模式。
- 1. 一部分是 **environment 的行为**, environment 的 function 它内部的参数或内部的规则长什么样子。 $p(s_{t+1}|s_t,a_t)$这一项代表的是 environment, environment 这一项通常你是无法控制它的,因为那个是人家写好的,或者已经客观存在的。
- 2. 另一部分是 **agent 的行为**,你能控制的是 $p_\theta(a_t|s_t)$。给定一个 $s_t$, actor 要采取什么样的 $a_t$ 会取决于你 actor 的参数 $\theta$, 所以这部分是 actor 可以自己控制的。随着 actor 的行为不同,每个同样的 trajectory, 它就会有不同的出现的概率。
+## 习题
-- 当我们在计算 maximize expected reward时,应该使用什么方法?
+**4-1** 如果我们想让机器人自己玩视频游戏,那么强化学习中的3个组成部分(演员、环境、奖励函数)具体分别代表什么?
- 答: **gradient ascent(梯度上升)**,因为要让它越大越好,所以是 gradient ascent。Gradient ascent 在 update 参数的时候要加。要进行 gradient ascent,我们先要计算 expected reward $\bar{R}$ 的 gradient 。我们对 $\bar{R}$ 取一个 gradient,这里面只有 $p_{\theta}(\tau)$ 是跟 $\theta$ 有关,所以 gradient 就放在 $p_{\theta}(\tau)$ 这个地方。
+演员做的事情就是操控游戏的摇杆,比如向左、向右、开火等操作;环境就是游戏的主机,负责控制游戏的画面、控制怪物如何移动等;奖励函数就是当执行什么动作、发生什么状况的时候,我们可以得到多少分数,比如击杀一只怪兽得到20分、被对手暴击扣除10分、完成任务得到10分等。
-- 我们应该如何理解梯度策略的公式呢?
+**4-2** 在一个过程中,一个具体的轨迹{$s_1 , a_1 , s_2 , a_2$}出现的概率取决于什么?
- 答:
- $$
- \begin{aligned}
- E_{\tau \sim p_{\theta}(\tau)}\left[R(\tau) \nabla \log p_{\theta}(\tau)\right] &\approx \frac{1}{N} \sum_{n=1}^{N} R\left(\tau^{n}\right) \nabla \log p_{\theta}\left(\tau^{n}\right) \\
- &=\frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T_{n}} R\left(\tau^{n}\right) \nabla \log p_{\theta}\left(a_{t}^{n} \mid s_{t}^{n}\right)
- \end{aligned}
- $$
- $p_{\theta}(\tau)$ 里面有两项,$p(s_{t+1}|s_t,a_t)$ 来自于 environment,$p_\theta(a_t|s_t)$ 是来自于 agent。 $p(s_{t+1}|s_t,a_t)$ 由环境决定从而与 $\theta$ 无关,因此 $\nabla \log p(s_{t+1}|s_t,a_t) =0 $。因此 $\nabla p_{\theta}(\tau)=
- \nabla \log p_{\theta}\left(a_{t}^{n} | s_{t}^{n}\right)$。 公式的具体推导可见我们的教程。
-
- 具体来说:
-
- * 假设你在 $s_t$ 执行 $a_t$,最后发现 $\tau$ 的 reward 是正的, 那你就要增加这一项的概率,即增加在 $s_t$ 执行 $a_t$ 的概率。
- * 反之,在 $s_t$ 执行 $a_t$ 会导致$\tau$ 的 reward 变成负的, 你就要减少这一项的概率。
-
-- 我们可以使用哪些方法来进行gradient ascent的计算?
-
- 答:用 gradient ascent 来 update 参数,对于原来的参数 $\theta$ ,可以将原始的 $\theta$ 加上更新的 gradient 这一项,再乘以一个 learning rate,learning rate 其实也是要调的,和神经网络一样,我们可以使用 Adam、RMSProp 等优化器对其进行调整。
-
-- 我们进行基于梯度策略的优化时的小技巧有哪些?
-
- 答:
-
- 1. **Add a baseline:**为了防止所有的reward都大于0,从而导致每一个stage和action的变换,会使得每一项的概率都会上升。所以通常为了解决这个问题,我们把reward 减掉一项叫做 b,这项 b 叫做 baseline。你减掉这项 b 以后,就可以让 $R(\tau^n)-b$ 这一项, 有正有负。 所以如果得到的 total reward $R(\tau^n)$ 大于 b 的话,就让它的概率上升。如果这个 total reward 小于 b,就算它是正的,正的很小也是不好的,你就要让这一项的概率下降。 如果$R(\tau^n)0: 梯度被推向了该方向
- - 如果 A(s,a)<0: (我们的action比该state下的平均值还差) 梯度被推向了反方
+(3)经典的Q学习算法只需要学习Q函数,路径衍生策略梯度需要多学习一个策略 $\pi$,其目的在于最大化Q函数,希望得到的演员可以让Q函数的输出尽可能的大,这与生成对抗网络里面的生成器的概念类似。
- 但是这样就需要两套 value function,所以可以使用TD error 做估计:$A(s,a)=r+\gamma V(s')-V(s)$。
+(4)与原来的Q函数一样,我们要把目标Q网络取代掉,路径衍生策略梯度中也要把目标策略取代掉。
+
+
+## 面试题
+
+**9-1** 友善的面试官:请简述一下异步优势演员-评论员算法(A3C),另外A3C是同策略还是异策略的模型呀?
+
+A3C是异步优势演员-评论员算法,其中,评论员学习价值函数,同时有多个演员并行训练并且不时与全局参数同步。A3C旨在并行训练,是同策略算法。
+
+**9-2** 友善的面试官:请问演员-评论员算法有何优点呢?
+
+(1)相比以价值函数为中心的算法,演员-评论员算法应用了策略梯度的技巧,这能让它在连续动作或者高维动作空间中选取合适的动作,而Q学习做这件事会很困难。
+
+(2)相比单纯策略梯度,演员-评论员算法应用了Q学习或其他策略评估的做法,使得演员-评论员算法能进行单步更新而不是回合更新,比单纯的策略梯度的效率要高。
+
+**9-3** 友善的面试官:请问异步优势演员-评论员算法具体是如何异步更新的?
+
+下面是异步优势演员-评论员算法的大纲,由于其为异步多线程算法,我们只对其中某一单线程进行分析。
+
+(1)定义全局参数 $\theta$ 和 $w$ 以及特定线程参数 $\theta'$ 和 $w'$。
+
+(2)初始化时间步 $t=1$。
+
+(3)当 $T \leqslant T_{\mathrm{max}}$:
+
+- 重置梯度:$\mathrm{d} \theta = 0$ 并且 $\mathrm{d}w = 0$。
+
+- 将特定于线程的参数与全局参数同步:$\theta' = \theta$ 以及 $w'=w$。
+- 令 $t_{\mathrm{start}} =t$ 并且随机采样一个初始状态 $s_t$。
+- 当 ($s_t!=$ 终止状态)并且$t−t_{\mathrm{start}} \leqslant t_{\mathrm{max}}$。
+ - 根据当前线程的策略选择当前执行的动作 $a_t\sim\pi_{\theta'}(a_t|s_t)$,执行动作后接收奖励 $r_t$ 然后转移到下一个状态 $s_{t+1}$。
+ - 更新 $t$ 以及 $T$:$t=t+1$ 并且 $T=T+1$。
+- 初始化保存累积奖励估计值的变量。
+- 对于 $i=t_1, \dots ,t_{\mathrm{start}}$:
+ - $r \gets \gamma r+r_i$;这里的 $r$ 是 $G_i$ 的蒙特卡洛估计。
+ - 累积关于参数 $\theta'$ 的梯度:$\mathrm{d} \theta \gets \mathrm{d}\theta + \nabla_{\theta'} \mathrm{log} \pi_{\theta'}(a_i|s_i)(r−V_{w'}(s_i))$。
+ - 累积关于参数 $w'$ 的梯度:$\mathrm{d}w \gets \mathrm{d}w+ \mathrm{\partial} (r-V_{w'}(s_i))^2 / \mathrm{\partial} w'$。
+- 分别使用 $\mathrm{d}\theta$ 以及 $\mathrm{d}w$ 异步更新 $\theta$ 以及 $w$。
+
+**9-4** 友善的面试官:演员-评论员算法中,演员和评论员两者的区别是什么?
+
+演员是策略模块,输出动作;评论员是判别器,用来计算价值函数。
+
+**9-5** 友善的面试官:演员-评论员算法框架中的评论员起了什么作用?
+
+评论员衡量当前决策的好坏。结合策略模块,当评论员判别某个动作的选择是有益的时候,策略就更新参数以增大该动作出现的概率,反之减小该动作出现的概率。
+
+**9-6** 友善的面试官:简述异步优势演员-评论员算法的优势函数。
+
+优势函数的计算公式为 $A(s,a)=Q(s,a)-V(s)=r+\gamma V(s')-V(s)$ ,其可以定量地表示选择动作 $a$ 的优势。即当动作 $a$ 低于价值函数的平均值的时候,优势函数为负值;反之为正值。其是一个标量,具体来说:
+
+(1)如果 $A(s,a)>0$ ,梯度被推向正方向;
+
+(2)如果 $A(s,a)<0$ ,即我们的动作比该状态下的平均值还差,则梯度被推向反方向。
+
+这样就需要两个价值函数,所以可以使用时序差分方法做误差估计:$A(s,a)=r+\gamma V(s')-V(s)$ 。
diff --git a/docs/img/ch13/13.1.png b/docs/img/ch13/13.1.png
new file mode 100644
index 0000000..d3f88a0
Binary files /dev/null and b/docs/img/ch13/13.1.png differ
diff --git a/docs/img/ch13/13.2.png b/docs/img/ch13/13.2.png
new file mode 100644
index 0000000..bd14ba0
Binary files /dev/null and b/docs/img/ch13/13.2.png differ
diff --git a/docs/img/ch13/13.3.png b/docs/img/ch13/13.3.png
new file mode 100644
index 0000000..aca0bee
Binary files /dev/null and b/docs/img/ch13/13.3.png differ
diff --git a/docs/img/ch13/13.4.png b/docs/img/ch13/13.4.png
new file mode 100644
index 0000000..b20f36f
Binary files /dev/null and b/docs/img/ch13/13.4.png differ
diff --git a/docs/img/ch13/13.5.png b/docs/img/ch13/13.5.png
new file mode 100644
index 0000000..b056976
Binary files /dev/null and b/docs/img/ch13/13.5.png differ
diff --git a/docs/img/ch13/13.6.png b/docs/img/ch13/13.6.png
new file mode 100644
index 0000000..f40cce1
Binary files /dev/null and b/docs/img/ch13/13.6.png differ
diff --git a/docs/img/ch13/13.7.png b/docs/img/ch13/13.7.png
new file mode 100644
index 0000000..de333c9
Binary files /dev/null and b/docs/img/ch13/13.7.png differ
diff --git a/docs/img/ch13/13.8.png b/docs/img/ch13/13.8.png
new file mode 100644
index 0000000..630e8ac
Binary files /dev/null and b/docs/img/ch13/13.8.png differ