马尔可夫决策过程。

  • 在介绍马尔可夫决策过程之前,先介绍它的简化版本:马尔可夫链以及马尔可夫奖励过程,通过跟这两种过程的比较,我们可以更生动地理解马尔可夫决策过程。

  • 第二部分会介绍马尔可夫决策过程中的 policy evaluation,就是当给定一个决策过后,怎么去计算它的价值函数。

  • 第三部分会介绍马尔可夫决策过程的控制,具体有两种算法:policy iterationvalue iteration

上图介绍了在强化学习里面 agent 跟 environment 之间的交互,agent 在得到环境的状态过后,它会采取行为,它会把这个采取的行为返还给环境。环境在得到 agent 的行为过后,它会进入下一个状态,把下一个状态传回 agent。在强化学习中,agent 跟环境就是这样进行交互的,这个交互过程是可以通过马尔可夫决策过程来表示的,所以马尔可夫决策过程是强化学习里面的一个基本框架。在马尔可夫决策过程中,它的环境是 fully observable ,就是全部可以观测的。但是很多时候环境里面有些量是不可观测的,但是这个部分观测的问题也可以转换成一个 MDP 的问题。

在介绍马尔可夫决策过程之前,先给大家梳理一下马尔可夫、马尔可夫奖励过程。这两个过程是马尔可夫决策过程的一个基础。

Markov Process(MP)

如果一个状态转移是符合马尔可夫的,那就是说一个状态的下一个状态只取决于它当前状态,而跟它当前状态之前的状态都没有关系。比如说我们这里有一个 $h_t$,它包含了之前的所有状态。但是这里的转移从当前 $s_t$ 转到 $s_{t+1}$ 这个状态,它是直接就等于它之前所有的状态。如果某一个过程满足马尔可夫性质(Markov Property),就是说未来的转移跟过去是独立的,它只取决于现在。马尔可夫性质是所有马尔可夫过程的基础。

首先看一看马尔可夫链(Markov Chain)。举个例子,这个图里面有四个状态,这四个状态从 $s_1,s_2,s_3,s_4$ 之间互相转移。比如说从 $s_1$ 开始,

  • $s_1$ 有 0.1 的概率继续存活在 $s_1$ 状态,

  • 有 0.2 的概率转移到 $s_2$,

  • 有 0.7 的概率转移到 $s_4$ 。

如果 $s_4$ 是我们当前状态的话,

  • 它有 0.3 的概率转移到 $s_2$ ,

  • 有 0.2 的概率转移到 $s_3$ ,

  • 有 0.5 的概率留在这里。

我们可以用状态转移矩阵(State Transition Matrix)来描述这样的状态转移。状态转移矩阵类似于一个 conditional probability,当我们知道当前我们在 $s_t$ 这个状态过后,到达下面所有状态的一个概念。所以它每一行其实描述了是从一个节点到达所有其它节点的概率。

上图是一个马尔可夫链的例子,我们这里有七个状态。比如说从 $s_1$ 开始到 $s_2$ ,它有 0.4 的概率,然后它有 0.6 的概率继续存活在它当前的状态。 $s_2$ 有 0.4 的概率到左边,有 0.4 的概率到 $s_3$ ,另外有 0.2 的概率存活在现在的状态,所以给定了这个状态转移的马尔可夫链后,我们可以对这个链进行采样,这样就会得到一串的轨迹。

下面我们有三个轨迹,都是从同一个起始点开始。假设还是从 $s_3$ 这个状态开始,

  • 第一条链先到了 $s_4$, 又到了 $s_5$,又往右到了 $s_6$ ,然后继续存活在 $s_6$ 状态。

  • 第二条链从 $s_3$ 开始,先往左走到了 $s_2$ 。然后它又往右走,又回到了$s_3$ ,然后它又往左走,然后再往左走到了 $s_1$ 。

  • 通过对这个状态的采样,我们生成了很多这样的轨迹。

Markov Reward Process(MRP)

马尔可夫奖励过程(Markov Reward Process, MRP) 是马尔可夫链再加上了一个奖励函数。在 MRP 中,转移矩阵跟它的这个状态都是跟马尔可夫链一样的,多了一个奖励函数(reward function)奖励函数是一个期望,就是说当你到达某一个状态的时候,可以获得多大的奖励,然后这里另外定义了一个 discount factor $\gamma$ 。

这里是我们刚才看的马尔可夫链,如果把奖励也放上去的话,就是说到达每一个状态,我们都会获得一个奖励。这里我们可以设置对应的奖励,比如说到达 $s_1$ 状态的时候,可以获得 5 的奖励,到达 $s_7$ 的时候,有 10 的奖励,其它状态没有任何奖励。因为这里状态是有限的,所以我们可以用一个向量来表示这个奖励函数,这个向量表示了每个点的奖励的大小。

我们可以通过一个形象的例子来理解 MRP,你可以把它看成一个纸船。我们把一个纸船放到河流之中,那么它就会随着这个河流而流动,它自身是没有动力的,所以你可以把 MRP 看成是一个随波逐流的例子,当我们从某一个点开始的时候,这个纸船就会随着事先定义好的状态转移进行流动,它到达每个状态过后,我们就有可能获得一些奖励。

这里我们进一步定义一些概念。

  • 第一个是 horizon ,它说明了同一个 episode 或者是整个一个轨迹的长度,它是由有限个步数决定的。

  • 这里我们再定义一个 return。Return 说的是我们把奖励进行折扣,然后获得的这个收益。Return 可以定义为奖励的逐步叠加,然后这里有一个叠加系数,就是越往后得到的奖励,折扣得越多。这说明我们其实更希望得到现有的奖励,未来的奖励就要把它打折扣。

  • 当我们有了这个 return 过后,就可以正式定义一个状态的价值了,就是 state value function。然后对于这个MRP,它里面定义成是关于这个 return 的期望, $G_t$ 是我们之前定义的 discounted return。然后我们这里取了一个期望,期望就是说从这个状态开始,你有可能获得多大的价值。所以这个期望也可以看成是一个对未来可能获得奖励的它的当前价值的一个表现。就是当你进入某一个状态过后,你现在就有多大的价值。

这里我们解释一下为什么需要 discounted factor。

  • 有些马尔可夫过程是带环的,它并没有终结,我们想避免这个无穷的奖励。

  • 我们想把这个不确定性表示出来,希望尽可能快地得到奖励,而不是在未来某一个点得到奖励。

  • 如果这个奖励是有实际价值的,我们可能是更希望立刻就得到奖励,而不是后面再得到奖励。

  • 在人的行为里面来说的话,大家也是想得到即时奖励。

  • 在有些时候可以把这个系数设为 0。设为 0 过后,我们就只关注了它当前的奖励。我们也可以把它设为 1,设为 1 的话就是对未来并没有折扣,未来获得的奖励跟当前获得的奖励是一样的。这个系数其实可以作为强化学习 agent 的一个 hyperparameter 来进行调整,然后就会得到不同行为的 agent。

这里我们再来看一看,在这个 MRP 里面,如何计算它的价值。这个 MRP 依旧是这个状态转移。它的奖励函数是定义成这样,它在进入第一个状态的时候会得到 5 的奖励,进入第七个状态的时候会得到 10 的奖励,其它状态都没有奖励。

我们现在可以计算每一个轨迹得到的奖励,比如我们对于这个 $s_4,s_5,s_6,s_7$ 轨迹的奖励进行计算,这里折扣系数是 0.5。

  • 在 $s_4$ 的时候,奖励为零。

  • 下一个状态 $s_5$ 的时候,因为我们已经到了下一步了,所以我们要把 $s_5$ 进行一个折扣,$s_5$ 本身也是没有奖励的。

  • 然后是到 $s_6$,也没有任何奖励,折扣系数应该是 $\frac{1}{4}$ 。

  • 到达 $s_7$ 后,我们获得了一个奖励,但是因为 $s_7$ 这个状态是未来才获得的奖励,所以我们要进行三次折扣。

所以对于这个轨迹,它的 return 就是一个 1.25,类似地,我们可以得到其它轨迹的 return 。

这里就引出了一个问题,当我们有了一些轨迹的实际 return,怎么计算它的价值函数。比如说我们想知道 $s_4$ 状态的价值,就是当你进入 $s_4$ 后,它的价值到底如何。一个可行的做法就是说我们可以产生很多轨迹,然后把这里的轨迹都叠加起来。比如我们可以从 $s_4$ 开始,采样生成很多轨迹,都把它的 return 计算出来,然后可以直接把它取一个平均作为你进入 $s_4$ 它的价值。这其实是一种计算价值函数的办法,通过这个蒙特卡罗采样的办法计算 $s_4$ 的状态。接下来会进一步介绍蒙特卡罗算法。

但是这里我们采取了另外一种计算方法,我们通过一定的推导就可以从这个价值函数里面推导出 Bellman Equation(贝尔曼等式)Bellman Equation 定义了当前状态跟未来状态之间的这个关系

其中:

  • $s'$ 可以看成未来的所有状态。

  • 转移 $P(s'|s)$ 是指从当前状态转移到未来状态的概率。

  • 第二部分可以看成是一个 Discounted sum of future reward。

  • $V(s')$ 代表的是未来某一个状态的价值。我们从当前这个位置开始,有一定的概率去到未来的所有状态,所以我们要把这个概率也写上去,这个转移矩阵也写上去,然后我们就得到了未来状态,然后再乘以一个 $\gamma$,这样就可以把未来的奖励打折扣。

未来打了折扣的奖励加上当前立刻可以得到的奖励,就组成了这个 Bellman Equation。Bellman Equation 的推导过程如下:

Bellman Equation 就是当前状态与未来状态的迭代关系,表示当前状态的值函数可以通过下个状态的值函数来计算。Bellman Equation 因其提出者、动态规划创始人 Richard Bellman 而得名 ,也叫作“动态规划方程”。

Bellman Equation 定义了状态之间的迭代关系。假设有一个马尔可夫转移矩阵是右边这个样子。Bellman Equation 描述的就是当前状态到未来状态的一个转移。假设我们当前是在 $s_1$, 那么它只可能去到三个未来的状态:有 0.1 的概率留在它当前这个位置,有 0.2 的概率去到 $s_2$ 状态,有 0.7 的概率去到 $s_4$ 的状态,所以我们要把这个转移乘以它未来的状态的价值,再加上它的 immediate reward 就会得到它当前状态的价值。所以 Bellman Equation 定义的就是当前状态跟未来状态的一个迭代的关系。

我们可以把 Bellman Equation 写成一种矩阵的形式。首先有这个转移矩阵。我们当前这个状态是一个向量 $[V(s_1),V(s_2),\cdots,V(s_N)]^T$。我们可以写成迭代的形式。我们每一行来看的话,$V$ 这个向量乘以了转移矩阵里面的某一行,再加上它当前可以得到的 reward,就会得到它当前的价值。

当我们写成如下的矩阵形式后:

就可以直接得到一个解析解(analytic solution):

我们可以通过矩阵求逆的过程把这个 V 的这个价值直接求出来。但是一个问题是这个矩阵求逆的过程的复杂度是 $O(N^3)$。所以当状态非常多的时候,比如说从十个状态到一千个状态,到一百万个状态。那么当我们有一百万个状态的时候,这个转移矩阵就会是个一百万乘以一百万的矩阵,这样一个大矩阵的话求逆是非常困难的,所以这种通过解析解去解,只能对于很小量的 MRP。

接下来我们来求解这个价值函数。我们可以通过迭代的方法来解这种状态非常多的 MRP。

这里迭代的方法就有几种,

  • 我们可以通过动态规划的方法,

  • 也可以通过蒙特卡罗的办法,就通过采样的办法去计算它,

  • 也可以通过 Temporal-Difference Learning 的办法。这个 Temporal-Difference LearningTD Leanring,它是动态规划和蒙特卡罗的一个结合。

首先我们用蒙特卡罗的办法来计算它的价值函数。蒙特卡罗就跟我们之前采用的这个方法很类似,就说我们当得到一个 MRP 过后,我们可以从某一个状态开始,把这个小船放进去,让它随波逐流,这样就会产生一个轨迹。产生了一个轨迹过后,就会得到一个奖励,那么就直接把它的 discounted 的奖励 $g$ 算出来。算出来过后就可以把它积累起来,得到 return $G_t$。 当积累到一定的轨迹数量过后,直接用 $G_t$ 除以轨迹数量,就会得到它的价值。

比如说我们要算 $s_4$ 状态的一个价值。我们就可以从 $s_4$ 状态开始,随机产生很多轨迹,就产生很多小船,然后扔到这个转移矩阵里面去,然后它就会随波逐流,产生轨迹。每个轨迹,我们可以算到它的这个 return。每个轨迹都会得到一个 return,让我们得到大量的 return 。比如说一百个、一千个的 return ,然后直接取一个平均,那么就可以等价于现在 $s_4$ 这个价值,因为 $s_4$ 的价值 $V(s_4)$ 定义了你未来可能得到多少的奖励。这就是蒙特卡罗采样的方法。

我们也可以用这个动态规划的办法,一直去迭代它的 Bellman Equation,让它最后收敛,我们就可以得到它的一个状态。所以在这里算法二就是一个迭代的算法,通过 bootstrapping(拔靴自助) 的办法,然后去不停地迭代这个 Bellman Equation。当这个最后更新的状态跟你上一个状态变化并不大的时候,更新就可以停止,我们就可以输出最新的 $V'(s)$ 作为它当前的状态。所以这里就是把 Bellman Equation 变成一个 Bellman Update,这样就可以得到它的一个价值。

动态规划的方法基于后继状态值的估计来更新状态值的估计(算法二中的第 3 行用 $V'$ 来更新 $V$ )。也就是说,它们根据其他估算值来更新估算值。我们称这种基本思想为 bootstrapping。

Markov Decision Process(MDP)

相对于 MRP,马尔可夫决策过程(Markov Decision Process)多了一个 decision,其它的定义跟 MRP 都是类似的。这里我们多了一个决策,多了一个 action ,那么这个状态转移也多了一个 condition,就是你采取某一种行为,然后你未来的状态会不同。它不仅是依赖于你当前的状态,也依赖于在当前状态你这个 agent 它采取的这个行为会决定它未来的这个状态走向。对于这个价值函数,它也是多了一个条件,多了一个你当前的这个行为,就是说你当前的状态以及你采取的行为会决定你在当前可能得到的奖励多少。

Policy 定义了在某一个状态应该采取什么样的行为。当我们知道当前状态过后,可以带入这个 policy function,那我们会得到一个概率,概率就代表了在所有可能的行为里面怎样去采取行动。就可能有 0.7 的概率往左走,有 0.3 的概率往右走,这样是一个概率的表示。另外这个策略也可能是确定的,它有可能是直接输出一个值,或者就直接告诉你当前应该采取什么样的行为,而不是一个行为的概率。然后这里我们有一个假设,就是这个概率函数应该是静态的(stationary),不同时间点,你采取的行为其实都是对这个 policy function 进行采样。

这里说明了 MDP 跟 MRP 的之间的一个转换。已知一个 MDP 和一个 policy $\pi$ 的时候,我们可以把 MDP 转换成 MRP。在 MDP 里面,转移函数 $P(s'|s,a)$ 是基于它当前状态以及它当前的 action。因为我们现在已知它 policy function,就是说在每一个状态,我们知道它可能采取的行为的概率,那么就可以直接把这个 action 进行加和,直接把这个 a 去掉,那我们就可以得到对于 MRP 的一个转移,这里就没有 action。对于这个奖励函数,我们也可以把 action 拿掉,这样就会得到一个类似于 MRP 的奖励函数。

这里我们看一看,MDP 里面的状态转移跟 MRP 以及 MP 的一个差异。

  • 马尔可夫过程的转移是直接就决定。比如当前状态是 s,那么就直接通过这个转移概率决定了下一个状态是什么。

  • 但对于 MDP,它的中间多了一层这个行为 a ,就是说在你当前这个状态的时候,首先要决定的是采取某一种行为,那么你会到了某一个黑色的节点。到了这个黑色的节点,因为你有一定的不确定性,当你当前状态决定过后以及你当前采取的行为过后,你到未来的状态其实也是一个概率分布。所以你采取行为后,你可能有多大的概率到达某一个未来状态,以及另外有多大概率到达另外一个状态。所以在这个当前状态跟未来状态转移过程中这里多了一层决策性,这是 MDP 跟之前的马尔可夫过程很不同的一个地方。在马尔可夫决策过程中,行为是由 agent 决定,所以多了一个 component,agent 会采取行为来决定未来的状态转移。

  • 顺着 MDP 的定义,我们可以把 state-value function,就是在 MDP 里面的价值函数也进行一个定义,它的定义是跟 MRP 是类似的,但是这里 expectation over policy,就是这个期望是基于你采取的这个 policy ,就当你的 policy 决定过后,我们通过对这个 policy 进行采样来得到一个期望,那么就可以计算出它的这个价值函数。

  • 这里我们另外引入了一个 Q 函数(action-value function)这个 Q 函数定义的是在某一个状态采取某一个行为,然后它有可能得到的这个 return 的一个期望。这里期望其实也是 over policy function。所以你需要对这个 policy function 进行一个加和,然后最后得到它的这个价值。

  • 对 Q 函数中的行为函数进行加和,就可以得到价值函数。

通过对状态-价值函数进行一个分解,我们就可以得到一个类似于之前 MRP 的 Bellman Equation,这里叫 Bellman Expectation Equation

对于 Q 函数,我们也可以做类似的分解,也可以得到对于 Q 函数的 Bellman Expectation Equation。

Bellman Expectation Equation 定义了你当前状态跟未来状态之间的一个关联。

那我们进一步进行一个简单的分解。等式 8 和等式 9 代表了价值函数跟 Q 函数之间的一个关联。我们把等式 8 插入到等式 9,就可以得到等式 11,它象征了你当前时刻的 Q 函数跟未来时刻的 Q 函数之间的一个关联。也可以把等式 9 插入等式 8 中,得到等式 10。等式 10 代表了当前状态的价值跟未来状态价值之间的一个关联。

这里有一个概念叫 Backup。Backup 类似于 bootstrapping 之间这个迭代关系,就对于某一个状态,它的当前这个价值是跟它未来价值线性相关的。你可以看到我们这里有两层加和。第一层加和就是这个叶子节点,然后往上走一层的话,我们就可以把未来的这个价值 $s'$ backup 到黑色的节点。然后再有一层加和,第二层加和,这个加和是把 action 进行加和。得到黑色节点的价值过后,再往上 backup 一层,然后就会推到根节点的价值,根节点就是我们当前状态。所以 Backup Diagram 定义了你未来下一时刻的状态跟你上一时刻的状态之间的一个关联。

同样对于 Q 函数,我们也可以进行这样的一个推导,就现在的根节点是这个 Q 函数的一个节点。这个 Q 函数是对于黑色的这个节点。我们下一时刻的这个 Q 函数是叶子节点,有四个黑色结点。那么我们这里也有两个加和。

第一层加和是先把这个叶子节点从黑节点推到这个白色的这个节点,进了它的这个状态,就当我们到达某一个状态过后,这个白色极点,然后再进行一个加和,这样就把它重新推回到当前节点的一个 Q 函数,所以这个等式就决定了未来 Q 函数跟当前 Q 函数之间的这个关联。

当我们知道一个 MDP 以及要采取的策略 $\pi$ ,那我们计算价值函数的过程,就是 policy evaluation。就像我们在评估这个策略,我们会得到多大的奖励。Policy evaluation 在有些地方也被叫做 prediction,也就是预测你当前采取的这个策略最终会产生多少的价值。

MDP,你其实可以把它想象成一个摆渡的人在这个船上面,她可以控制这个船的移动,这样就避免了这个船随波逐流。因为在每一个时刻,这个人会决定采取什么样的一个行为,这样会把这个船进行导向。MRP 跟马尔可夫链的过程的话,这个纸的小船会随波逐流,然后产生轨迹。MDP 的不同就是我们有一个 agent 去控制这个船,这样我们就可以尽可能多地获得奖励。

我们再看下 policy evaluation 的例子,怎么在这个决策过程里面计算它每一个状态的价值。

  • 假设环境里面有两种行为:往左走和往右走。

  • 现在的奖励函数应该是关于行为以及状态两个变量的一个函数。但我们这里就说,不管你采取什么行为,只要到达状态 $s_1$,就有 5 的奖励。只要你到达状态 $s_7$ 了,就有 10 的奖励,中间没有任何奖励。

  • 假设我们现在采取的一个策略,这个策略是说不管在任何状态,我们采取的策略都是往左走,这里假设价值折扣因子是零,那么对于 deterministic policy,最后估算出的价值函数是一致的。怎么得到这个结果,我们可以直接在去 run 这个 iterative equation,就把这个 Bellman Expectation Equation 拿到这个里面来,然后不停地迭代,最后它会收敛。收敛过后,它的值就是它每一个状态的价值。

再来看另外一个情况,就是如果折扣因子是 0.5,我们可以通过这个等式进行迭代:

然后就会得到它的状态。

另外一个练习的例子,就是说我们现在采取的 policy 在每个状态,我们有 0.5 的概率往左走,有 0.5 的概率往右走,那么放到这个状态里面去如何计算。其实也是把这个 Bellman Expectation Equation 拿出来,然后进行迭代就可以算出来了,就当我们开始的时候,我们可以初始化。初始化这个不同的 $v(s')$ 都会有一个值,那么放到这个里面去迭代,最后它的 $v$ ,然后就会算出来。

MDP 的 predictioncontrol 是 MDP 里面的核心问题。

  • Prediction 是说给定一个 MDP 以及一个 policy $\pi$ ,去计算它的 value function,就对于每个状态,它的价值函数是多少。

  • Control 是说我们去寻找一个最佳的策略:

    • 它的 input 就是 MDP,

    • 输出是通过去寻找它的最佳策略,然后同时输出它的最佳价值函数(optimal value function)以及它的最佳策略(optimal policy)。

  • 在 MDP 里面,prediction 和 control 都可以通过这个动态规划去解决。

  • 要强调的是,这两者的区别就在于,

    • 预测问题是给定一个 policy,我们要确定它的 value function 是多少。

    • 而控制问题是在没有 policy 的前提下,我们要确定最优的 value function 以及对应的决策方案。

  • 实际上,这两者是递进的关系,在强化学习中,我们通过解决预测问题,进而解决控制问题。

举一个例子来说明 prediction 与 control 的区别。

首先是预测问题:在上图的方格中,我们规定从 A $\to$ A' 可以得到 +10 的奖励,从 B $\to$ B' 可以得到 +5 的奖励,其它步骤的奖励为 -1。现在,我们给定一个 policy:在任何状态中,它的行为模式都是随机的,也就是上下左右的概率各 25%。那么,预测问题要做的就是,在这种决策模式下,我们的 value function 是什么,也就是如上图 b 所示。

接着是控制问题:在控制问题中,问题背景与预测问题相同,唯一的区别就是:不再限制 policy。也就是说行为模式是未知的,我们要自己确定。所以我们通过解决控制问题,求得每一个状态的最优的 value function(如上图 b 所示),也得到了最优的 policy(如上图 c 所示)。

简单总结下,控制问题要做的就是,给定同样的条件,在所有可能的策略下最优的价值函数是什么?最优策略是什么?

首先我们来看一下动态规划。动态规划是说我们把可以把一个问题分解成一个最佳子结构,当我们可以把一些子结构都可以解决的话,那么它就可以组成一个最优的解。MDP是满足动态规划的要求的,就是在 Bellman Equation 里面,我们可以把它分解成一个递归的一个结构。当我们把它分解成一个递归的结构的时候,如果我们的子问题子状态能得到一个值,那么它的未来状态因为跟子状态是直接相连的,那我们也可以继续推算出来,所以这个价值函数就可以储存它以及重用它的最佳的解。所以动态规划是解 MDP prediction 和 control 一个非常有效的方式。

首先看一下 policy evaluation。Policy evaluation 就是当给定一个 MDP 的时候,我们有一个事先定好的 policy。那么我们可以获得多少的价值。就对于当前这个策略,我们可以得到多大的这个 value function。这里一个方法是说,我们直接把这个 Bellman Expectation Backup,这个等式拿出来,变成一个迭代的过程,这样反复迭代直到收敛。这样就可以计算它的一个过程。这个迭代过程是可以看作是 synchronous backup 的一个过程。等式 14 说的就是这个 Bellman Expectation Backup,我们把这个转换成一个动态规划的迭代。当我们得到上一时刻的 $v_t$ 的时候,那我们下一时刻就通过这个递归的一个关系,我们可以推出下一时刻的这个值,那么反复去迭代它,最后它的值就是从 $v_1,v_2$ 到最后收敛过后这个值。这个值就是我们当前给定的 policy 对应的价值函数。

Policy evaluation 的核心思想就是直接把这个 Bellman expectation backup,把如下的等式拿出来,

然后反复迭代,然后就会得到一个收敛的价值函数的值。

因为我们已经给定了这个函数的 policy function,那我们可以直接把它简化成一个 MRP 的表达形式,那么它的形式就更简洁一些,就相当于我们把这个 $a$ 去掉,如下式所示:

这样它就只有价值函数跟转移函数了。通过去迭代这个更简化的一个函数,我们也可以得到它每个状态的价值。因为不管是在 MRP 以及 MDP,它的这个价值函数包含的这个变量都是只跟这个状态有关,就相当于进入某一个状态,未来可能得到多大的价值。

比如现在这个环境是一个 small gridworld 的例子。这个 agent 的目的是从某一个状态开始,然后到达终点状态。它的终止状态就是左上角跟右上角,这里总共有 14 个状态,因为我们把每个位置就是用一个状态来表示。然后这个 agent 它采取的行为,我们说它的这个 policy function 就直接先给定了,它在每一个状态都是随机游走,它们在每一个状态就是上下左右行走。它在边缘状态的时候,比如说在第四号状态的时候,它往左走的话,它是依然存在第四号状态,我们加了这个限制。

这里我们给的奖励函数就是说你每走一步,就会得到一个负的奖励。所以这个 agent 需要尽快地到达这个终止状态。状态之间的转移也是确定的。比如从第六号状态往上走,它就会直接到达第二号状态。很多时候有些环境是 probabilistic 的话,就是说 agent 在第六号状态,它选择往上走的时候,有可能地板是滑的,然后它可能滑到第三号状态或者第一号状态,这就是有概率的一个转移。但这里把这个环境进行了简化,从六号往上走,它就到了二号。所以直接用这个迭代来解它。因为我们已经知道每一个概率以及它的这个概率转移,那么就直接可以进行一个简短的迭代,然后就会算出它每一个状态的价值。

我们再来看一个动态的例子,首先推荐斯坦福大学的一个网站:Temporal Difference Learning Gridworld Demo ,这个网站模拟了单步更新的过程中,所有格子的一个状态价值的变化过程。

这里有很多格子,每个格子都代表了一个状态。在每个格子里面有一个初始值零。然后在每一个状态,它还有一些箭头,这个箭头就是说它在当前这个状态应该采取什么样的策略。我们这里采取一个随机的策略,不管它在哪一个状态,它上下左右的概率都是相同的。比如在某个状态,它都有上下左右 0.25 的概率采取某一个行为,所以它是一个完全随机的一个行为。

在这样的环境里面,我们想计算它每一个状态的价值。我们也定义了它的 reward function,你可以看到有些状态上面有一个 R 的值。比如我们这边有些值是为负的,我们可以看到格子里面有几个 -1 的 reward,只有一个 +1 reward 的格子。在这个棋盘的中间这个位置,可以看到有一个 R 的值是 1.0,为正的一个价值函数。 所以每个状态对应了一个值,然后有一些状态没有任何值,就说明它的这个 reward function,它的奖励是为零的。

我们开始做这个 policy evaluation,policy evaluation 是一个不停迭代的过程。当我们初始化的时候,所有的 $v(s)$ 都是 0。我们现在迭代一次,迭代一次过后,你发现有些状态上面,值已经产生了变化。比如说那些有奖励的值,比如有些状态的值的 R 为 -1,迭代一次过后,它就会得到 -1 的这个奖励。对于中间这个绿色的,因为它的奖励为正,所以它是 + 1 的状态。

所以当迭代第一次的时候,$v(s)$ 某些状态已经有些值的变化。

我们再迭代一次(one sweep),然后发现它就从周围的状态也开始有值。因为周围状态跟之前有值的状态是临近的,所以它就相当于把旁边这个状态转移过来。所以当我们逐渐迭代的话,你会发现这个值一直在变换。等迭代了很多次过后,很远的这些状态的价值函数已经有些值了,而且你可以发现它这里整个过程呈现逐渐扩散开的一个过程,这其实也是 policy evaluation 的一个可视化。当我们每一步在进行迭代的时候,就远的状态就会得到了一些值,就逐渐从一些已经有奖励的这些状态,逐渐扩散,当你 run 很多次过后,它就逐渐稳定下来,最后值就会确定不变,这样收敛过后,每个状态上面的值就是它目前得到的这个 value function 的值。

Policy evaluation 是说给定一个 MDP 和一个 policy,我们可以估算出它的价值函数。这个问题的另外一方面是说如果我们只有一个 MDP,如何去寻找一个最佳的策略,然后可以得到一个最佳价值函数(Optimal Value Function)。Optimal Value Function 的定义是说,我们去搜索一种 policy $\pi$ ,然后我们会得到每个状态它的状态值最大的一个情况,$v^*$ 就是到达每一个状态,它的值的极大化情况。在这种极大化情况上面,我们得到的策略就可以说它是最佳策略(optimal policy)。Optimal policy 使得每个状态,它的状态函数都取得最大值。所以当我们说某一个 MDP 的环境被解了过后,就是说我们可以得到一个 optimal value function,然后我们就说它被解了。在这种情况下面,然后我们它的最佳的价值函数是一致的,就它达到了这个 upper bound,它的值是一致的,但是这里可能有多个最佳的 policy,多个 policy 可以取得相同的最佳价值。

怎么去寻找这个最佳的 policy ,这里一个隐含条件是当我们取得最佳的价值函数过后,我们其实可以通过对这个 Q 函数进行极大化,然后得到最佳的价值。当所有东西都收敛过后,因为 Q 函数是关于状态跟动作的一个函数,所以对某一个状态采取一个行为,然后可以使得这个 Q 函数最大化,那么就这个行为就应该是最佳的行为。所以当我们能优化出一个 Q 函数,我们可以直接在这个 Q 函数上面取一个让这个 action 最大化的值,就可以直接提取出它的最佳策略。

这里一种策略搜索办法是我们可以去穷举。假设我们有有限多个状态、有限多个行为可能性,那么每个状态我们可以采取这个 A 种行为的策略,那么总共就是 $|A|^{|S|}$ 个可能的 policy。那么有一种方法是直接可以把这个把穷举一遍,然后算出每种策略的 value function,然后对比一下可以得到最佳策略。但是一个问题是这样的穷举非常没有效率,所以我们要采取另外的一些办法,所以在解这个搜索最佳策略的方法有两种比较常用的方法:一种是叫 policy iteration,另外一种是叫 value iteration 的一个方法。

所以我们在寻找这个最佳策略的过程就是 MDP 的控制过程,MDP Control 说的就是怎么去寻找一个最佳的策略,然后我们可以得到一个最大的价值函数。对于一个事先定好的 MDP 过程,当这个 agent 去采取策略的时候,我们可以说它这个最佳策略一般都是确定的。而且它是 stationary,它不会随着时间的变化。但是不一定是 unique,多种行为然后都会取得相同的这个这个价值。

首先我们来看一下 policy iteration。policy iteration 也是一个迭代算法。它主要由两个步骤组成,

  • 第一个步骤是 policy evaluation,就跟我们之前说的这个评价一个已有的这个价值函数的价值是一致的,就是我们当前我们在优化这个 policy $\pi$ ,所以在优化过程中得到一个最新的这个 policy 。让我们先保证这个 policy 不变,那么去估计它出来的这个价值。给定当前的policy function,去估计这个 v 函数。

  • 取得 v 函数过后,我们可以进一步推算出它的 Q 函数。得到 Q 函数过后,那我们就直接去取它的极大化。在 Q 函数上面取极大化,这样我们就有了第二步骤:改进它的策略。通过在这个 Q 函数上面做一个贪心的搜索,这样就会进一步改进它的策略。

  • 这两个步骤就一直是在迭代进行,所以在这个 policy iteration 里面,在初始化的时候,我们有一个初始化的 $V$ 和 $\pi$ 。然后就是在这两个过程之间迭代,左边这幅图上面这根曲线就是我们当前这个 v 的值,下面是 policy 的值。就跟踢皮球一样,我们先给定当前已有的这个 policy function,然后去算它的这个 v。算出 v 过后,我们会得到一个 Q 函数,Q 函数我们采取 greedy 的策略,这样我们有踢皮球,踢回这个 policy 。然后就会进一步改进那个 policy ,得到一个改进的 policy 过后,它还不是最佳的,我们再进行 policy evaluation,然后又会得到一个新的 value function。基于这个新的 value function 再进行 Q 函数的极大化 ,这样就逐渐迭代,然后就会得到收敛。

这里再来看一下第二个步骤 policy improvement,我们是如何改进它的这个策略。当我们得到这个 v 值过后,我们就可以通过这个 reward function 以及状态转移把它的这个 Q-function 算出来。对于每一个状态,第二个步骤会得到它的一个新一轮的这个 policy ,就在每一个状态,我们去取使它得到最大值的 action。你可以把这个 Q 函数看成一个 Q-table。横轴是它的所有状态,纵轴是它的可能的 action。Q 函数得到过后,Q-table 就得到了。

那么对于某一个状态,每一列里面我们会取最大的那个值,最大值对应的那个 action 就是它现在应该采取了更佳的action。所以你看这里下面这个 arg max 操作就说在每个状态里面,我们去采取一个 action,这个 action 就是能使这一列的 Q 最大化的那个动作。

当我们一直在采取这个 arg max 这个操作的时候,我们会得到一个单调的递增。我们通过采取这种 greedy ,这种 arg max 这个操作,就会得到更好的或者不变的 policy,而不会使它这个价值函数变差。所以当这个改进停止过后,我们就会得到一个最佳策略。

当改进停止过后,我们取它极大化的这个 action 之后,它直接就会变成它的这个价值函数,即

所以我们在这里有了一个新的等式:

上式被称为 Bellman Optimality Equation这个 Bellman Optimality Equation 满足的时候,是说整个 MDP 已经到达最佳的状态。它到达最佳状态过后,对于我们这个 Q 函,取它最大的 action 时候的那个值,就是直接等于它的最佳的这个 value function。只有当整个状态已经收敛过后,得到一个最佳的 policy 的时候,这个条件才是满足的。

最佳的价值函数到达过后,这个 Bellman Optimlity Equation 就会满足。我们满足过后,就有这个 max 操作,当我们取最大的这个 action 的时候对应的那个值就是当前那个状态的最佳的价值函数。

我们可以把第一个等式插入到第二个等式里面去,然后就会得到这个 Q 函数之间的这个转移。它下一步这个状态我们取了这个 max 这个值过后,就会也跟它下一个最佳的这个状态等价。

Q-learning 是基于 Bellman Optimality Equation 来进行的,当取它最大的这个状态的时候,它会满足下面这个等式:

Value iteration 说的是我们把 Bellman Optimality Equation 当成一个 update rule 来进行。之前我们是说上面这个等式只有当整个状态已经到达最佳状态的时候,然后才满足。但这里可以把它转换成一个 backup 的等式。 Backup 就是说一个迭代的等式,我们不停地去迭代 Bellman Optimality Equation,到了最后,它能逐渐趋向于最佳的策略,所以这也是 value iteration 算法的精髓,就是我们去为了得到最佳的 $v^$ ,对于每个状态它的 $v^$ 这个值,我们直接把这个 Bellman Optimality Equation 进行迭代,迭代了很多次之后它就会收敛。

  • Value iteration 算法的目的是为了得到一个最佳的策略。

  • 一个解法是直接把这个 Bellman Optimality backup,把它这个等式拿进来进行迭代,迭代很多次,收敛过后得到的那个值就是它的最佳的那个值。

  • 所以这个算法开始的时候,它是先把所有值初始化,通过每一个状态,然后它会进行这个迭代。把等式 22 插到等式 23 里面,就是 Bellman Optimallity backup 的那个等式。有了这个等式过后,然后进行不停地迭代,迭代过后,然后收敛。然后就会得到这个 $v^$ 。当我们有这个 $v^$ 过后,一个问题是如何进一步推算出它的最佳策略。

  • 最佳策略的话,我们可以直接用 arg max,就先把它的 Q 函数重构出来,重构出来过后,每一个列对应的最大的那个 action 就是它现在的最佳策略。这样就可以把最佳策略从最佳价值函数里面推导出来。

上图是一个可视化的过程。在一个 grid world 中,不管你在哪一个位置开始,我们都希望能够到 goal 的这个点,左上角的那个点。因为它是一个迭代过程,然后这里可视化了从 $v_1$ 到 $v_7$ 每一个状态的值的变化,它的这个值逐渐在变化。而且因为它每走一步,就会得到一个负的值,所以它需要尽快地到达左上角,可以发现离它越远的那个值就越大。$v_7$ 收敛过后,右下角那个值是 -6,也就相当于它要走六步,才能到达最上面那个值。而且离这个目的地越近,它的价值越大。

我们来看一个 MDP 控制的 Demo。首先来看这个 policy iteration。之前的例子,它们在每个状态都是采取固定的随机策略,就每个状态都是 0.25 的概率往上往下往左往右,这里没有策略的改变。但是我们现在想做 policy iteration,就是想每个状态都进行改变。Policy iteration 的过程是一个迭代过程。

我们先在这个状态里面 run 一遍 policy evaluation,就得到了一个 value function,每个状态都有一个 value function。

现在进行 policy improvement,按 policy update。按这个 policy update 过后,你可以发现有些格子里面的 policy 已经产生变化。比如说对于中间这个 -1 的这个状态,它的最佳策略是往下走。当你到达这个状态后,你应该往下,这样就会得到最佳的这个值。绿色旁边的这个方块的策略也改变了,它现在选取的最佳策略是往左走,在当前状态的时候,最佳策略应该是往左走。

我们再 run 下一轮的 policy evaluation,你发现它的这个值又被改变,很多次过后,然后它会更新。

我们再 run policy update,你发现每个状态里面的值基本都改变,它不再是上下左右随机在变了,它会选取一个最佳的策略。

我们再 run 这个 policy evaluation,它的值又再不停地变化,变化之后又收敛了。

我们再来 run 一遍 policy update。现在它的值又会有变化,就在每一个状态,它的这个最佳策略也会产生一些改变。

再来在这个状态下面进行改变,现在你看基本没有什么变化,就说明整个 MDP 已经收敛了。所以现在它每个状态的值就是它当前最佳的 value function 的值以及它当前状态对应的这个 policy 已经是最佳的 policy。我们可以简单来看,比如说现在我们在右上角这个 0.38 的这个位置,现在我们直接就可以根据它每个状态的这个值,比如现在右上角,然后它说现在应该往下走,我们往下走一步。它又说往下走,然后再往下走。现在我们有两个选择,一个是往左走,一个往下走。我们现在往下走,随着这个箭头的指示,我们就会到达中间 1.20 的一个价值的一个状态。如果能达到这个状态的话,我们会得到很多 reward 。这个说明了 policy iteration 可以把 gridworld 解决掉。解决掉的意思是说,不管在哪个状态,都可以顺着它这个状态对应的最佳的这个策略来到达可以获得最多奖励的一个状态。

我们再用 value iteration 来解 MDP,点第 3 个 value iteration。 当它的这个值确定下来过后,然后它会产生它的最佳状态,这个最佳状态跟 policy iteration 得出来的最佳策略是一致的,就可以得到一个最佳的一个策略。然后在每个状态,我们跟着这个最佳策略走,就会到达最多可以得到奖励的一个状态。

这个 Demo 里面是一个代码,就是为了解一个叫 FrozenLake 的例子,这个例子是 OpenAI Gym 里的一个环境,跟 gridworld 很像,不过它每一个状态转移是一个 probability。

我们再来对比下 policy iteration 和 value iteration,这两个算法都可以解 MDP 的控制问题。

  • Policy iteration 由两部分组成:policy evaluation 和 policy improvement。它很清楚地把这个过程分成了两步,就首先对于当前已经搜索到的策略函数,然后对它进行一个估值,得到估值过后,把 Q 函数算出来,我们进一步进行改进。

  • 但对于 value iteration 的话,它是直接把 Bellman Optimality Equation 拿进来,然后直接去寻找最佳的 value function,没有 policy function 在这里面,当我们把这个 optimal value function 算出来过后,那我们可以在最后再执行一步这个提取过程,最佳策略提取过程。这样就可以把它的最佳策略抽取过来。

这里是一个总结,就对于 MDP 里面的 prediction 和 control 都是用动态规划来讲,我们其实采取了不同的 Bellman Equation。

这里的计算是我们选择了一条路,计算出这条路径上每一个状态动作的价值。我们可以看一下右下角这个图,如果说我走的不是红色的路,而是蓝色的路,那我算出来的 Q 值可能是这样。那我们就知道,当小乌龟在 -12 这个点的时候,往右边走是 -11,往上走是 -15,它自然就知道往右走的价值更大,小乌龟就会往右走。

类似于上图,最后我们要求解的就是一张 Q 表格,它的行数是所有的状态数量,一般可以用坐标来表示表示格子的状态,也可以用 1、2、3、4、5、6、7 来表示不同的位置。Q 表格的列表示上下左右四个动作。最开始这张 Q 表格会全部初始化为零,然后 agent 会不断地去和环境交互得到不同的轨迹,当交互的次数足够多的时候,我们就可以估算出每一个状态下,每个行动的平均总收益去更新这个 Q 表格。怎么去更新 Q 表格就是接下来要引入的强化概念。

强化就是我们可以用下一个状态的价值来更新当前状态的价值,其实就是强化学习里面有一个 bootstrap 的概念。在强化学习里面,你可以每走一步更新一下 Q 表格,然后用下一个状态的 Q 值来更新这个状态的 Q 值,这种单步更新的方法叫做时序差分

为了让大家更好地理解时序差分这种更新方法,这边给出它的物理意义。我们先理解一下巴普洛夫的条件反射实验,这个实验讲的是小狗会对盆里面的食物无条件产生刺激,分泌唾液。一开始小狗对于铃声这种中性刺激是没有反应的,可是我们把这个铃声和食物结合起来,每次先给它响一下铃,再给它喂食物,多次重复之后,当铃声响起的时候,小狗也会开始流口水。盆里的肉可以认为是强化学习里面那个延迟的 reward,声音的刺激可以认为是有 reward 的那个状态之前的一个状态。多次重复实验之后,最后的这个 reward 会强化小狗对于这个声音的条件反射,它会让小狗知道这个声音代表着有食物,这个声音对于小狗来说也就有了价值,它听到这个声音也会流口水。

巴普洛夫效应揭示的是中性刺激(铃声)跟无条件刺激(食物)紧紧挨着反复出现的时候,条件刺激也可以引起无条件刺激引起的唾液分泌,然后形成这个条件刺激。这种中性刺激跟无条件刺激在时间上面的结合,我们就称之为强化。 强化的次数越多,条件反射就会越巩固。小狗本来不觉得铃声有价值的,经过强化之后,小狗就会慢慢地意识到铃声也是有价值的,它可能带来食物。更重要是一种条件反射巩固之后,我们再用另外一种新的刺激和条件反射去结合,还可以形成第二级条件反射,同样地还可以形成第三级条件反射。

在人的身上是可以建立多级的条件反射的,举个例子,比如说一般我们遇到熊都是这样一个顺序,看到树上有熊爪,然后看到熊之后,突然熊发怒,扑过来了。经历这个过程之后,我们可能最开始看到熊才会瑟瑟发抖,后面就是看到树上有熊爪就已经有害怕的感觉了。也就说在不断的重复试验之后,下一个状态的价值,它是可以不断地去强化影响上一个状态的价值的。

为了让大家更加直观感受下一个状态影响上一个状态,我们再次推荐这个网站:Temporal Difference Learning Gridworld Demo。

我们先初始化一下,然后开始时序差分的更新过程。在训练的过程中,你会看到这个小黄球在不断地试错,在探索当中会先迅速地发现有 reward 的地方。最开始的时候,只是这些有 reward 的格子 才有价值。当不断地重复走这些路线的时候,这些有价值的格子可以去慢慢地影响它附近的格子的价值。反复训练之后,有 reward 的这些格子周围的格子的状态就会慢慢地被强化,强化就是当它收敛到最后一个最优的状态了,就是把这些价值最终收敛到一个最优的情况之后,那个小黄球就会自动地知道,就是我一直往价值高的地方走,就能够走到能够拿到 reward 的地方。

Temporal Difference

这种强化方式其实在数学上面一行公式就表达出来了,这种更新的方式叫做时序差分(Temporal Difference)。这个公式就是说可以拿下一步的 Q 值 $Q(S{t+1},A_{t+1})$ 来更新我这一步的 Q 值 $Q(S_t,A_t)$ 。

为了理解这个公式,如上图所示,我们先把 $R{t+1}+\gamma Q\left(S{t+1}, A_{t+1}\right.)$ 当作是一个目标值,就是 $Q(S_t,A_t)$ 想要去逼近的一个目标值。我们想要计算的就是 $Q(S_t,A_t)$ 。因为最开始 Q 值都是随机初始化或者是初始化为零,它需要不断地去逼近它理想中真实的 Q 值,我们就叫 target 。Target 就是带衰减的未来收益的总和。

我们用 $G_t$ 来表示未来收益总和(return),并且对它做一下数学变化:

就可以知道 $G_t = R{t+1}+ \gamma G{t+1}$。

也就是说,我们拿 $Q(S_t,A_t)$ 来逼近 $G_t$,那 $Q(S{t+1},A{t+1})$ 其实就是近似 $G{t+1}$。我就可以用 $Q(S{t+1},A{t+1})$ 近似 $G{t+1}$,然后把 $R{t+1}+Q(S{t+1},A_{t+1})$ 当成目标值。

$Q(S_t,A_t)$ 就是要逼近这个目标值。我们用软更新的方式来逼近。软更新的方式就是 $\alpha$ ,每次我只更新一点点,$\alpha$ 有点类似于学习率。最终的话,Q 值都是可以慢慢地逼近到真实的 target 值。这样我们的更新公式只需要用到当前时刻的 $S{t},A_t$,还有拿到的 $R{t+1}, S{t+1},A{t+1}$ 。

该算法由于每次更新值函数需要知道当前的状态(state)、当前的动作(action)、奖励(reward)、下一步的状态(state)、下一步的动作(action),即 $(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})$ 之后,就可以做一次更新。

我们看看用代码去怎么去实现。了解单步更新的一个基本公式之后,代码实现就很简单了。右边是环境,左边是 agent 。我们每次跟环境交互一次之后呢,就可以 learn 一下,向环境输出 action,然后从环境当中拿到 state 和 reward。Agent 主要实现两个方法,一个就是根据 Q 表格去选择动作,输出 action。另外一个就是拿到 $(S{t}, A{t}, R{t+1}, S{t+1}, A_{t+1})$ 这几个值去更新我们的 Q 表格。

我们直接看这个框框里面的更新公式, 和之前的公式是一模一样的。$S'$ 就是 $S_{t+1}$ 。我们就是拿下一步的 Q 值来更新这一步的 Q 值,不断地强化每一个 Q。

Q-learning: Off-policy TD Control

Sarsa 是一种 on-policy 策略。Sarsa 优化的是它实际执行的策略。它直接拿下一步会执行的 action 来去优化 Q 表格,所以 on-policy 在学习的过程中,只存在一种策略,它用一种策略去做 action 的选取,也用一种策略去做优化。所以 Sarsa 知道它下一步的动作有可能会跑到悬崖那边去,所以它就会在优化它自己的策略的时候,会尽可能的离悬崖远一点。这样子就会保证说,它下一步哪怕是有随机动作,它也还是在安全区域内。

而 off-policy 在学习的过程中,有两种不同的策略。第一个策略是我们希望学到一个最佳的目标策略,另外一个策略是探索环境的策略,它可以大胆地去探索到所有可能的轨迹,然后喂给这个目标策略去学习。而且喂给目标策略的数据中并不需要 $a{t+1}$ ,而 Sarsa 是有 $a{t+1}$ 的。比如目标策略优化的时候,Q-learning 才不管你下一步去往哪里探索,会不会掉悬崖,我就只选我收益最大一个最优的策略。

我们通过对比的方式来去理解 Q-learning。Q-learning 是 off-policy 的时序差分学习方法,Sarsa 是 on-policy 的时序差分学习方法。

在 Q-learning 中,Q函数的估计方法为

相当于让 $Q(s,a)$ 直接去估计最优状态值函数 $Q^*(s,a)$。

事实上,Q-learning 算法被提出的时间更早,Sarsa 算法是 Q-learning 算法的改进。

Sarsa 和 Q-learning 的更新公式都是一样的,区别只在 target 计算的这一部分,

下面讲一下 on-policy 和 off-policy 的区别。

总结如上图所示。

Sarsa 实际上都是用自己的策略产生了 S,A,R,S',A' 这一条轨迹。然后拿着 $Q(S{t+1},A{t+1})$ 去更新原本的 Q 值 $Q(S_t,A_t)$。 但是 Q-learning 并不需要知道我实际上选择哪一个 action ,它默认下一个动作就是 Q 最大的那个动作。Q-learning 知道实际上 behavior policy 可能会有 10% 的概率去选择别的动作,但 Q-learning 并不担心受到探索的影响,它默认了就按照最优的策略来去优化目标策略,所以它可以更大胆地去寻找最优的路径,它会表现得比 Sarsa 大胆非常多。

对 Q-learning 进行逐步地拆解的话,跟 Sarsa 唯一一点不一样就是并不需要提前知道 $A_2$ ,我就能更新 $Q(S_1,A_1)$ 。在训练一个 episode 这个流程图当中,Q-learning 在 learn 之前它也不需要去拿到 next action $A'$,它只需要前面四个 $ (S,A,R,S')$ 也就可以了,这一点就是跟 Sarsa 有一个很明显的区别。

Q-function Bellman Equation

记策略 $\pi $ 的状态-动作值函数为 $Q^{\pi}(s_t,a_t)$,它表示在状态 $s_t$ 下,执行动作 $a_t$ 会带来的累积奖励 $G_t$ 的期望,具体公式为:

上式是 MDP 中 Q-function 的 Bellman 方程的基本形式。累积奖励 $G_t$ 的计算,不仅考虑当下 $t$ 时刻的动作 $a_t$ 的奖励 $r_t$,还会累积计算对之后決策带来的影响(公式中的 $\gamma$ 是后续奖励的衰减因子)。从上式可以看出,当前状态的动作价值 $Q^{\pi}(s_t,a_t)$ ,与当前动作的奖励 $r_t$ 以及下一状态的动作价值 $Q^{\pi}(s{t+1},a{t+1})$ 有关,因此,状态-动作值函数的计算可以通过动态规划算法来实现。

从另一方面考虑,在计算 $t$ 时刻的动作价值 $Q^{\pi}(s_t,a_t)$ 时,需要知道在 $t$、$t+1$、$t+2 \cdots \cdots$ 时刻的奖励,这样就不仅需要知道某一状态的所有可能出现的后续状态以及对应的奖励值,还要进行全宽度的回溯来更新状态的价值。这种方法无法在状态转移函数未知或者大规模问题中使用。因此,Q-learning 采用了浅层的时序差分采样学习,在计算累积奖励时,基于当前策略 $\pi$ 预测接下来发生的 $n$ 步动作($n$ 可以取 1 到 $+\infty$)并计算其奖励值。

具体来说,假设在状态 $s_t$ 下选择了动作 $a_t$,并得到了奖励 $r_t$ ,此时状态转移到 $s{t+1}$,如果在此状态下根据同样的策略选择了动作 $a{t+1}$ ,则 $Q^{\pi}(s_t,a_t)$ 可以表示为

Q-learning 算法在使用过程中,可以根据获得的累积奖励来选择策略,累积奖励的期望值越高,价值也就越大,智能体越倾向于选择这个动作。因此,最优策略 $\pi^$ 对应的状态-动作值函数 $Q^(s_t,a_t)$ 满足如下关系式:

Q-learning 算法在学习过程中会不断地更新 Q 值,但它并没有直接采用上式中的项进行更新,而是采用类似于梯度下降法的更新方式,即状态 $s_t$ 下的动作价值 $Q^(s_t,a_t)$ 会朝着状态 $s{t+1}$ 下的动作价值 $r{t}+\gamma \max {a{t+1}} Q^{}\left(s{t+1}, a{t+1}\right)$ 做一定比例的更新:

其中 $\alpha$ 是更新比例(学习速率)。这种渐进式的更新方式,可以减少策略估计造成的影响,并且最终会收敛至最优策略。

  • 如果是一个 prediction 的问题,即 policy evaluation 的问题,那就直接是把这个 Bellman Expectation Equation 拿进来,就是不停地 run 这个 Bellman Expectation Equation,这样我们就可以去估计出给定的这个策略,然后可以得到的价值函数。

  • 对于 control,

    • 如果采取的算法是 policy iteration,那这里用的是 Bellman Expectation Equation 。把它分成两步,先上它的这个价值函数,再去优化它的策略,然后不停迭代。这里用到的只是 Bellman Expectation Equation。

    • 如果采取的算法是 value iteration,那这里用到的 Bellman Equation 就是 Bellman Optimality Equation,通过 arg max 这个过程,不停地去 arg max 它,最后它就会达到最优的状态。

  • 表格型方法

    这节课我们通过最简单的表格型的方法(tabular methods)来讲解如何使用 value-based 方法去求解强化学习。

    Sarsa: On-policy TD Control

    MDP

    强化学习的三个重要的要素:状态、动作和奖励。强化学习智能体跟环境是一步一步交互的,就是我先观察一下状态,然后再输入动作。再观察一下状态,再输出动作,拿到这些 reward 。它是一个跟时间相关的序列决策的问题。

    举个例子,在 $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-1}$ 和 $s{t-2}$ 都没有什么关系。然后再加上说这个过程也取决于智能体跟环境交互的这个$a_t$ ,所以有一个决策的一个过程在里面。我们就称这样的一个过程为马尔可夫决策过程(Markov Decision Process, MDP)

    MDP 就是序列决策这样一个经典的表达方式。MDP 也是强化学习里面一个非常基本的学习框架。状态、动作、状态转移概率和奖励 $(S,A,P,R)$,这四个合集就构成了强化学习 MDP 的四元组,后面也可能会再加个衰减因子构成五元组。

    如上图所示,我们把这些可能的动作和可能的状态转移的关系画成一个树状图。它们之间的关系就是从 $s_t$ 到 $a_t$ ,再到 $s{t+1}$ ,再到 $a{t+1}$,再到 $s_{t+2}$ 这样子的一个过程。

    我们去跟环境交互,只能走完整的一条通路。这里面产生了一系列的一个决策的过程,就是我们跟环境交互产生了一个经验。我们会使用 P 函数(probability function)R 函数(reward function)来去描述环境。P 函数就是状态转移的概率,P 函数实际上反映的是环境的一个随机性。

    比如,在熊发怒的情况下,我如果选择装死,假设熊看到人装死就一定会走的话,我们就称在这里面的状态转移概率就是百分之百。但如果说在熊发怒的情况下,我选择跑路而导致可能跑成功以及跑失败,出现这两种情况。那我们就可以用概率去表达一下说转移到其中一种情况的概率大概 10%,另外一种情况的概率大概是 90% 会跑失败。如果我们知道这些状态转移概率和奖励函数的话,就说这个环境是已知的,因为我们是用这两个函数去描述环境的。如果是已知的话,我们其实可以用动态规划去计算说,如果要逃脱熊,那么能够逃脱熊概率最大的最优策略是什么。很多强化学习的经典算法都是 model-free 的,就是环境是未知的。

    因为现实世界中人类第一次遇到熊之前,我们根本不知道能不能跑得过熊,所以刚刚那个 10%、90% 的概率也就是虚构出来的概率。熊到底在什么时候会往什么方向去转变的话,我们经常是不知道的。我们是处在一个未知的环境里的,也就是这一系列的决策的 P 函数和 R 函数是未知的,这就是 model-based 跟 model-free 的一个最大的区别。强化学习就是可以用来解决用完全未知的和随机的环境。

    强化学习要像人类一样去学习,人类学习的话就是一条路一条路地去尝试一下,先走一条路,看看结果到底是什么。多试几次,只要能活命的。我们可以慢慢地了解哪个状态会更好,我们用价值函数 $V(s)$ 来代表这个状态是好的还是坏的。然后用 Q 函数来判断说在什么状态下做什么动作能够拿到最大奖励,用 Q 函数来表示这个状态-动作值。

    接下来就会介绍 Q 函数。在多次尝试和熊打交道之后,人类就可以对熊的不同的状态去做出判断,我们可以用状态动作价值的来表达说在某个状态下,为什么动作 1 会比动作 2 好,因为动作 1 的价值比动作 2 要高,这个价值就叫 Q 函数。如果 Q 表格是一张已经训练好的表格的话,那这一张表格就像是我们的一本生活手册。我们就知道在熊发怒的时候,装死的价值会高一点。在熊离开的时候,我们可能偷偷逃跑的会比较容易获救。

    这张表格里面 Q 函数的意义就是我选择了这个动作之后,我最后面能不能成功,就是我需要去计算在这个状态下,我选择了这个动作,后续能够一共拿到多少总收益。如果可以预估未来的总收益的大小,我们当然知道在当前的这个状态下选择哪个动作,价值更高。我选择某个动作是因为我未来可以拿到的那个价值会更高一点。所以强化学习的目标导向性很强,环境给了这个 reward 是一个非常重要的反馈,它就是根据环境的 reward 的反馈来去做选择。

    Q: 为什么可以用未来的总收益来评价当前这个动作是好是坏?

    A: 举个例子,假设一辆车在路上,当前是红灯,我们直接走的收益就很低,因为违反交通规则,这就是当前的单步收益。可是如果我们这是一辆救护车,我们正在运送病人,把病人快速送达医院的收益非常的高,而且越快你的收益越大。在这种情况下,我们很可能应该要闯红灯,因为未来的远期收益太高了。这也是为什么强化学习需要去学习远期的收益,因为在现实世界中奖励往往是延迟的,是有 delay 的。所以我们一般会从当前状态开始,把后续有可能会收到所有收益加起来计算当前动作的 Q 的价值,让 Q 的价值可以真正地代表当前这个状态下,动作的真正的价值。

    但有的时候你把目光放得太长远不好,因为如果事情很快就结束的话,你考虑到最后一步的收益无可厚非。如果是一个持续的没有尽头的任务,即持续式任务(Continuing Task),你把未来的收益全部相加,作为当前的状态价值就很不合理。股票的例子就很典型了,我们要关注的是累积的收益。可是如果说十年之后才有一次大涨大跌,你显然不会把十年后的收益也作为当前动作的考虑因素。那我们会怎么办呢,有句俗话说得好,对远一点的东西,我们就当做近视,就不需要看得太清楚,我们可以引入这个衰减因子 $\gamma$ 来去计算这个未来总收益,$\gamma \in [0,1]$,越往后 $\gamma^n$ 就会越小,也就是说越后面的收益对当前价值的影响就会越小。

    举个例子来看看计算出来的是什么效果。这是一个悬崖问题,这个问题是需要智能体从出发点 S 出发,到达目的地 G,同时避免掉进悬崖(cliff),掉进悬崖的话就会有负一百分的惩罚,但游戏不会结束,它会被直接拖回起点,游戏继续。为了到达目的地的话,我们可以沿着蓝线和红线走。

    在这个环境当中,我们怎么去计算状态动作价值(未来的总收益)。

  • 如果 $\gamma = 0$, 假设我走一条路,并从这个状态出发,在这里选择是向上,这里选择向右。如果 $\gamma = 0$,用这个公式去计算的话,它相当于考虑的就是一个单步的收益。我们可以认为它是一个目光短浅的计算的方法。

  • 如果 $\gamma = 1$,那就等于是说把后续所有的收益都全部加起来。在这里悬崖问题,你每走一步都会拿到一个 -1 分的 reward,只有到了终点之后,它才会停止。如果 $\gamma =1 $ 的话,我们用这个公式去计算,就这里是 -1。然后这里的话,未来的总收益就是 $-1+-1=-2$ 。

  • 如果 $\gamma = 0.6$,就是目光没有放得那么的长远,计算出来是这个样子的。利用 $G{t}=R{t+1}+\gamma G_{t+1}$ 这个公式从后往前推。

  • 探索环境的策略,我们叫做 behavior policy(行为策略),它像是一个战士,可以在环境里面探索所有的动作和轨迹和经验,然后把这些经验交给目标策略去学习。

  • Target policy(目标策略)就像是在后方指挥战术的一个军师,它可以根据自己的经验来学习最优的策略,不需要去和环境交互。

  • Sarsa 在更新 Q 表格的时候,它用到的 A' 。我要获取下一个 Q 值的时候,A' 是下一个 step 一定会执行的 action 。这个 action 有可能是 $\varepsilon$-greddy 方法 sample 出来的值,也有可能是 max Q 对应的 action,也有可能是随机动作。但是就是它实实在在执行了的那个动作。

  • 但是 Q-learning 在更新 Q 表格的时候,它用到这个的 Q 值 $Q(S',a')$ 对应的那个 action ,它不一定是下一个 step 会执行的实际的 action,因为你下一个实际会执行的那个 action 可能会探索。Q-learning 默认的 action 不是通过 behavior policy 来选取的,它是默认 A' 为最优策略选的动作,所以 Q-learning 在学习的时候,不需要传入 A',即 $a_{t+1}$ 的值。

  • 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 是一个典型的 on-policy 策略,它只用一个 $\pi$ 。为了兼顾探索和利用,所以它训练的时候会显得有点胆小怕事。它在解决悬崖问题的时候,会尽可能地离悬崖边上远远的,确保说哪怕自己不小心探索了一点,也还是在安全区域内,不至于跳进悬崖。

  • Q-learning 是一个比较典型的 off-policy 的策略,它有目标策略 target policy,一般用 $\pi$ 来表示。然后还有行为策略 behavior policy,用 $\mu$ 来表示。它分离了目标策略跟行为策略。Q-learning 就可以大胆地用 behavior policy 去探索得到的经验轨迹来去优化我的目标策略。这样子我更有可能去探索到最优的策略。

  • 比较 Q-learning 和 Sarsa 的更新公式可以发现,Sarsa 并没有选取最大值的 max 操作。因此,Q-learning 是一个非常激进的算法,希望每一步都获得最大的利益;而 Sarsa 则相对非常保守,会选择一条相对安全的迭代路线。

第二章 马尔可夫决策过程及表格型方法相关推荐

  1. 强化学习蘑菇书Easy RL第二、三章学习(马尔可夫决策过程、表格型方法)

    马尔可夫决策过程概述 Markov Process(MP)通常来说是未来状态的条件概率分布仅依赖于当前的状态.在离散随机过程里,我们需要把随机变量所有可能取值的集合放到一个状态空间里,在强化学习里,我 ...

  2. 强化学习组队学习task02——马尔可夫决策过程及表格型方法

    文章目录 一.马尔科夫决策过程 1.马尔科夫链 2.马尔科夫奖励过程 (1)贝尔曼公式(Bellman equation) (2)迭代法 蒙特卡罗办法 动态规划方法 3.马尔科夫决策过程 MDP的价值 ...

  3. 第 2 章 马尔可夫决策过程

    策略评估 智能体与环境之间的交互,智能体得到环境的状态后,它会采取动作,并把这个采取的动作返还给环境.环境得到智能体的动作后,它会进入下一个状态,把下一个状态传给智能体.  1. 马尔可夫奖励过程 马 ...

  4. 【EasyRL学习笔记】第三章 表格型方法(Q-Table、Sarsa、Q-Learning)

    文章目录 一.马尔可夫决策过程 1.1 有模型 1.2 免模型 1.3 有模型与免模型的区别 二.Q表格 三.免模型预测 3.1 蒙特卡洛方法 3.1.1 蒙特卡洛方法特点 3.1.2 蒙特卡洛方法步 ...

  5. 【强化学习】《动手学强化学习》马尔可夫决策过程

    [强化学习]<动手学强化学习>马尔可夫决策过程 一.随机过程.马尔可夫过程.马尔可夫奖励过程 二.马尔可夫决策过程 三.蒙特卡洛方法 四.最优策略与贝尔曼最优方程 一.随机过程.马尔可夫过 ...

  6. 强化学习从基础到进阶-案例与实践[3]:表格型方法:Sarsa、Qlearning;蒙特卡洛策略、时序差分等以及Qlearning项目实战

    [强化学习原理+项目专栏]必看系列:单智能体.多智能体算法原理+项目实战.相关技巧(调参.画图等.趣味项目实现.学术应用项目实现 专栏详细介绍:[强化学习原理+项目专栏]必看系列:单智能体.多智能体算 ...

  7. 【EasyRL学习笔记】第二章 Markov Decision Process 马尔可夫决策过程

    文章目录 一.马尔可夫过程 1.1 马尔可夫性质 1.2 马尔可夫链 1.3 马尔可夫过程的例子 二.马尔可夫奖励过程 2.1 回报与价值函数 2.2 贝尔曼方程 2.3 计算马尔可夫奖励过程价值的迭 ...

  8. [强化学习-3] Devil 课程第二章解析+ 学生马尔可夫决策过程代码

    马尔可夫决策过程(MDP) 一:介绍 马尔可夫决策过程是用来形式化地描述强化学习中的环境 其中环境是完全可以观测的 值得注意的是,大部分强化学习问题都可以看作 MDP 问题. 简单地理解,MDP是用来 ...

  9. 第3章:有限马尔可夫决策过程

    参考书籍: Reinforcement Learning An introduction 第二版 作者:Richard S. Sutton and Andrew G. Barto 以及此书的中文版&l ...

最新文章

  1. BugkuCTF-社工
  2. SpringMVC Root WebApplicationContext启动流程
  3. OBJECT_ID()的使用方法
  4. 一般性能服务器图片及介绍,服务器内部主要几种硬件以及它们的作用介绍
  5. K均值聚类关于初始聚类中心的探讨
  6. XCTest+XCTool
  7. 射极跟随器实验报告数据处理_电压跟随器秘笈:运放构成电压跟随器的稳定性问题探讨...
  8. 根据两点坐标计算两点距离
  9. 苹果设备解锁工具iToolab UnlockGo Mac
  10. JVM上篇:内存与垃圾回收
  11. 服务器虚拟化厂家排名,鹿死谁手?桌面虚拟化厂商实力大比拼
  12. Linux 入门必备命令
  13. 【元器件学习笔记—电阻】(8)——电阻分压电路
  14. 彩虹域名授权平台系统正版源码 带下载更新功能
  15. IBM-kmeans-坏盘预测
  16. PHP7 Windows10环境搭建
  17. 字典生成----在线密码破解工具hydra和medusa的使用
  18. Android 解屏代码
  19. VS2019MFC实现汉诺塔游戏(鼠标拖动盘子无轨迹、连续演示、单步演示)
  20. P2P担保的法律探析

热门文章

  1. 树莓派Linux内核配置、编译以及烧录详细步骤
  2. 健壮F.T.+新裸金属重磅发布,全新升级版ZStack加速新基建
  3. 初识vue-baidu-map
  4. 饥荒联机版修改在线模式
  5. 收不到验证码怎么办?
  6. 跟我学习搭建一个SSR
  7. 磁盘操作系统(DOS)
  8. 推荐模型-上下文感知-2016:FNN模型【FM家族】【FM+MLP=FNN】
  9. ye lynn yama Loafer 已发送,请注意查收
  10. 直播疑难杂症排查(7)— 黑屏、花屏、闪屏问题