add MDP chapter
@@ -1,246 +1,333 @@
|
||||
# 表格型方法
|
||||
|
||||
这节课我们通过最简单的`表格型的方法`来讲解如何使用 value-based 方法去求解强化学习。
|
||||
|
||||
## Sarsa
|
||||
|
||||
### MDP
|
||||
# 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$ 的概率是多少。
|
||||
|
||||
这样子的一个状态转移概率是具有`马尔可夫性质(Markov Property)`的(系统下一时刻的状态仅由当前时刻的状态决定,不依赖于以往任何状态)。因为这个状态转移概率,它是下一时刻的状态是取决于当前的状态,它和之前的 $s_{t-1}$ 和 $s_{t-2}$ 都没有什么关系。然后再加上说这个过程也取决于智能体跟环境交互的这个$a_t$ ,所以有一个决策的一个过程在里面。我们就称这样的一个过程为`马尔可夫决策过程(Markov Decision Process, MDP)`。
|
||||
|
||||
|
||||
MDP 就是序列决策这样一个经典的表达方式。MDP 也是强化学习里面一个非常基本的学习框架。状态、动作、状态转移概率和奖励 $(S,A,P,R)$,这四个合集就构成了强化学习 MDP 的四元组,后面也可能会再加个衰减因子构成五元组。
|
||||
|
||||
这节课我会给大家介绍马尔可夫决策过程。在介绍马尔可夫决策过程之前,我会给大家介绍它的简化版本:马尔可夫链以及马尔可夫奖励过程,通过跟这两种过程的比较,我们可以更生动地理解马尔可夫决策过程。第二部分我会给大家介绍马尔可夫决策过程中的 policy evaluation,就是当给定一个决策过后我们怎么去计算它的价值函数。第三部分,我会给大家介绍马尔可夫决策过程的控制,具体有两种算法:`policy iteration` 和 `value iteration`。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
我们把这些可能的动作和可能的状态转移的关系画成这样子的一个树状图。它们之间的关系就是一个从 $s_t$ 到 $a_t$ ,再到 $s_{t+1}$ ,再到 $a_{t+1}$,再到 $s_{t+2}$ 这样子的一个过程。
|
||||
|
||||
我们去跟环境交互,我们只能走完整的一条通路。这里面产生了一系列的一个决策的过程,就是我们跟环境交互产生了一个经验。然后我们会使用 P 函数和 R 函数来去描述环境。P 函数就是状态转移的概率,R 函数就是 Reward function。P 函数实际上反映的是环境的一个随机性。比方说,在熊发怒的情况下,我如果选择装死,假设熊看到人装死就一定会走的话,我们就称在这里面的这个状态转移概率就是百分之百。但如果说在熊发怒的情况下,我选择跑路而导致说我有可能跑成功以及跑失败,出现这两种情况。那我们就可以用概率去表达一下说转移到其中一种情况的概率大概 10%,另外一种情况的概率大概是 90% 会跑失败。**如果我们知道这些状态转移概率和奖励函数的话,我们就说这个环境是已知的,因为我们是用这两个函数去描述环境的。**如果是已知的话,我们其实可以用动态规划去计算说,我如果要逃脱熊,那么能够逃脱熊概率最大的最优策略是什么。很多强化学习的经典的算法都是 model-free 的,就是环境是未知的这样子的一个情况下,我们强化学习怎么去解决。
|
||||
上图介绍了在强化学习里面 agent 跟 environment 之间的交互,agent 在得到环境的状态过后,它会采取行为,它会把这个采取的行为返还给环境。环境在得到 agent 的行为过后,它会进入下一个状态,把下一个状态传回 agent。在强化学习中,agent 跟环境就是这样进行交互的,这个交互过程其实是可以通过马尔可夫决策过程来表示,所以马尔可夫决策过程是强化学习里面的一个基本框架。在马尔可夫决策过程中,它的环境是 fully observable ,就是全部可以观测的,但是很多时候在环境里面有些量是不可观测的,但是在这个部分观测的问题也可以转换成一个 MDP 的问题。
|
||||
|
||||

|
||||
因为现实世界中人类第一次遇到熊之前,我们根本不知道我们能不能跑得过熊。所以刚刚那个10%、90%的概率也就是虚构出来的概率,熊到底在什么时候会往什么方向去转变的话,我们经常是不知道的。我们是处在一个未知的环境里的,也就是这一系列的决策的 P 函数和 R 函数是未知的。这就是 model-based 跟 model-free 的一个最大的区别。强化学习就是可以用来解决用完全未知的和随机的环境。
|
||||
|
||||
强化学习要像人类一样去学习了,人类学习的话就是一条路一条路的去尝试一下,先走一条路,我看看结果到底是什么。多试几次,只要能活命的,我们其实可以慢慢的了解哪个状态会更好。我们用价值函数 $V(s)$ 来代表这个状态是好的还是坏的。然后用这个 Q 函数来判断说在什么状态下做什么动作能够拿到最大奖励,我们用 Q 函数来表示这个状态-动作值。
|
||||
在介绍马尔可夫决策过程之前,我会给大家首先梳理一下马尔可夫、马尔可夫奖励过程。这两个过程是马尔可夫决策过程的一个基础。
|
||||
|
||||

|
||||
## Markov Processes
|
||||
|
||||
接下来就会介绍 Q 函数。在经过多次尝试和那个熊打交道之后,人类就可以对熊的不同的状态去做出判断,我们可以用状态动作价值的来表达说在某个状态下,为什么动作 1 会比动作 2 好。因为动作 1 的价值比动作 2 要高。这个价值就叫 Q 函数。如果说这个 Q 表格是一张已经训练好的表格的话,那这一张表格就像是我们的一本生活手册。我们就知道在熊发怒的时候,装死的价值会高一点。在熊离开的时候,我们可能偷偷逃跑的会比较容易获救。这张表格里面 Q 函数的物理意义就是我选择了这个动作之后我最后面能不能成功,就是我需要去计算我在这个状态下,我选择了这个动作,后续能够一共拿到多少总收益。如果我可以预估未来的总收益的大小,我们当然知道在当前的这个状态下选择哪个动作,价值更高。我选择某个动作是因为我未来一共可以拿到的那个价值会更高一点。所以强化学习它的目标导向性很强,环境给了这个 reward 是一个非常重要的反馈,它就是根据环境的 reward 的反馈来去做选择。
|
||||
如果一个状态转移是符合马尔可夫的,那我们就是说一个状态的下一个状态只取决于它当前状态,而跟它当前状态之前的状态都没有关系。比如说我们这里有一个 $h_t$,它包含了之前的所有状态,但是我们这里的转移从当前 $s_t$ 转到 $s_{t+1}$ 这个状态,他是直接就等于它之前所有的状态,这一个我们说某一个过程,它是满足马尔可夫特征的,就是再说未来的转移跟过去是独立的,它只取决于现在。这个马尔可夫特征其实是所有马尔可夫过程的一个基础。
|
||||
|
||||
未来的总收益是一个什么样的概念,为什么可以用这个来评价当前这个动作是好是坏。举个例子,假设说一辆车在路上,当前是红灯,我们直接走的那个收益就很低,因为违反交通规则,这是就是当前的单步收益。可是如果我们这是一辆救护车,我们正在运送病人,把病人快速送达医院的收益非常的高,而且越快你的收益越大。很可能是我们这个时候应该要闯红灯,因为未来的远期收益太高了。这也是为什么说强化学习需要去学习远期的收益,因为现实世界当中这个奖励往往是延迟的,是有delay 的。
|
||||

|
||||
|
||||
所以我们一般会从当前状态开始,后续有可能会收到所有收益加起来计算。当前动作的 Q 的价值,让 Q 的价值可以真正的代表当前这个状态动作的真正的价值。
|
||||
让我们首先来看一看马尔可夫链。举个例子,这个图里面有四个状态,这四个状态从 $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 的概率留在这里,所以描述这样的状态转移,我们可以用这一个状态转移矩阵。状态转移矩阵类似于一个 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$ 。通过对这个状态的采样,我们就可以生成了很多这样的轨迹。
|
||||
|
||||
但是有的时候你目光放的太长远不好,因为如果说事情很快就结束的话,你考虑到最后一步的收益无可厚非,。如果说是一个持续的没有尽头的任务,即`持续式任务(Continuing Task)`。你把所有未来的收益全部相加,作为当前的状态价值就很不合理。股票的例子就很典型了,我们要关注的是累积的收益。可是如果说十年之后才有一次大涨大跌,你要把十年后的收益也作为当前动作的考虑因素,显然我们不会这么做。那我们会怎么办呢,就有句俗话说得好,就对远一点的东西呢,我们就当做近视就不需要看得太清楚,我们就可以适当引入这个衰减因子 $\gamma$ 来去计算这个未来总收益。$\gamma \in [0,1]$ 。越往后 $\gamma^n$ 就会越小,也就是说越后面的收益对当前价值的影响就会越小。
|
||||
## Markov Reward Process(MRP)
|
||||
|
||||

|
||||
|
||||
|
||||
举个具体的例子来看看这些计算出来的是什么效果。这是一个悬崖问题。这个问题是需要智能体从出发点 S 出发,然后到达目的地 G,同时避免掉进悬崖(cliff),掉进悬崖的话就会有负一百分的惩罚,但游戏不会结束,它会被直接拖回起点,游戏继续。为了到达目的地的话,我们可以沿着蓝线和红线走。
|
||||
这里我们再来看一看马尔可夫奖励过程,马尔可夫奖励过程是马尔可夫链再加上了一个奖励函数。我们在定义马尔可夫奖励过程之中,这个转移矩阵跟它的这个状态都是跟马尔可夫链一样的,这里多了一个是这个奖励函数。奖励函数是一个期望,它说当你当到达某一个状态的时候,可以获得多大的奖励,然后这里另外定义了一个这个 discount factor $\gamma$ 。
|
||||
|
||||

|
||||
|
||||
在这个环境当中,我们去怎么去计算状态动作价值,就是未来的总收益的话。假设我走一条路,然后这条路的话,我从这个状态出发,在这里选择是向上,这里选择向右,选择向右。
|
||||
|
||||
如果 $\gamma = 0$,然后用这个公式去计算的话,它相当于考虑的就是一个单步的收益。我们可以认为它是一个目光短浅的一个计算的方法。
|
||||
|
||||
但 $\gamma = 1$ 的话,那就等于是说把后续所有的收益可能都全部加起来。在这里悬崖问题,你每走一步都会拿到一个 -1 分的 reward。只有到了终点之后,它才会停止。如果说 $\gamma =1 $的话,我们用这个公式去计算,就这里是 -1。然后这里的话,未来的总收益就是 $-1+-1=-2$ 。
|
||||
|
||||
如果让 $\gamma = 0.6$ 的话,就是目光没有放得那么的长远,计算出来是这个样子的。
|
||||
|
||||
|
||||
利用 $G_{t}=R_{t+1}+\gamma G_{t+1}$ 这个公式从后往前推。
|
||||
$$
|
||||
\begin{array}{l}
|
||||
G_{7}=R+\gamma G_{8}=-1+0.6 *(-2.176)=-2.3056 \approx-2.3 \\
|
||||
G_{8}=R+\gamma G_{9}=-1+0.6 *(-1.96)=-2.176 \approx-2.18 \\
|
||||
G_{9}=R+\gamma G_{10}=-1+0.6 *(-1.6)=-1.96 \\
|
||||
G_{10}=R+\gamma G_{11}=-1+0.6 *(-1)=-1.6 \\
|
||||
G_{12}=R+\gamma G_{13}=-1+0.6 * 0=-1 \\
|
||||
G_{13}=0
|
||||
\end{array}
|
||||
$$
|
||||
|
||||
|
||||
这里的计算是我们选择了一条路,走完这条路径上每一个状态动作的价值,我们可以看一下右下角这个图,如果说我走的不是这条路,我走的是这一条路,那我算出来那个状态动作价值的 Q 值可能是这样。那我们就知道,当小乌龟在 -12 这个点的时候,往右边走是 -11,往上走是 -15。它自然就知道往右走的价值更大,小乌龟就会往右走
|
||||
这里是我们刚才看的马尔可夫链,如果把奖励也放上去的话,就是说到达每一个状态,我们都会获得一个奖励。这里我们可以定义比如说它 $s_1$ 状态的时候可以获得 5 的奖励,到达 $s_7$ 的时候,它有 10 的奖励,其它状态它没有任何奖励。因为我们这里状态是有限的,所以我们可以用一个向量来表示这个奖励函数。这个向量就是表示了每个点的奖励的大小。我们可以通过一个形象的例子来理解马尔代夫奖励过程,你其实可以把它看成一个纸船,就是当我们把一个纸船放到一个河流之中去,那么它就会随着这个河流而流动,它自身其实是没有动力,所以你可以把这个马尔可夫奖励过程看成是一个随波逐流的例子,当我们从某一个点开始的时候,这个纸船它就会随着这个我们事先定义好的状态转移进行流动,然后它到达每个状态过后,我们就有可能获得一些奖励。
|
||||
|
||||

|
||||
最后我们要求解的就是类似于这样子的一张 Q 表格。就是它的行数是所有的状态数量,一般可以用坐标来表示表示格子的状态,也可以用 1、2、3、4、5、6、7 来表示不同的位置。Q 表格一共四列的话就代表说是上下左右四个动作。最开始这张 Q 表格会全部初始化为零,然后在 agent 不断地去和环境交互得到不同的轨迹,当交互的次数足够多的时候,我们就可以估算出每一个状态下,每个行动的平均总收益去更新这个 Q 表格。怎么去更新 Q 表格就是我们接下来要引入的强化学习的强化概念。
|
||||
|
||||
强化概念的就是我们可以用下一个状态的价值来更新当前状态的价值。其实就是强化学习里面有一个bootstrap(自助)的概念。在强化学习里面,你可以每走一步更新一下 Q 表格,然后用下一个状态的 Q 值来更新这个状态的 Q 值。
|
||||
这里我们进一步定义一些概念,第一个是这个 Horizon 的概念,它说明了我们同一个 episode 或者是整个一个轨迹的长度。然后它是由有限个步数决定的。另外,这里我们再定一个 return。Return 说的是我们把奖励进行折扣,然后获得的这个收益。这个 return 的定义你可以看到它是从你后面得到的 return 逐步叠加起来,然后这里有一个叠加系数,就是越往后的得到的奖励,我们折扣的越多,就说明我们其实更希望得到现有的奖励,未来我们的奖励的话就要把它打折扣。当我们有了这个 return 过后,我们就可以正式定义一个状态的价值了,就是 state value function。然后对于这个马尔可夫奖励过程,它里面定义成是关于这个 return 的期望, $G_t$ 是我们之前定义的 discounted return。然后我们这里取了一个期望,期望就是说从这个状态开始,你有可能获得多大的价值,所以这个期望也可以看成是一个对未来可能获得奖励的一个它的当前价值的一个表现。就是当你进入某一个状态过后,你现在就有多大的价值。
|
||||
|
||||

|
||||
|
||||
这种单步更新的方法叫做`时序差分`的更新方法。为了让大家更好理解强化学习里面时序差分的这种更新方法。我这里就找了一下它的的物理意义。我们先理解一下巴普洛夫的条件反射实验了。这个实验讲的是什么呢?就是小狗对盆里面的食物,它会产生无条件刺激分泌唾液。一开始小狗对于铃声这种中性刺激是没有反应的。可是我们把这个铃声和这个食物结合起来,每次先给它响一下铃,再给它喂食物。多次重复之后,当铃声响起的时候,小狗也会开始流口水。盆里的肉可以认为是强化学习里面最后面的那个延迟的 reward。声音的刺激可以认为是有 reward 的那个状态之前的一个状态。多次重复实验之后,最后的这个 reward 会强化小狗对于这个声音的条件反射,它会让小狗知道说这个声音代表着有食物,这个声音对于小狗来说也就有了价值,它听到这个声音也会也会流口水。
|
||||
这里我们简短地解释一下为什么需要 discounted factor。这第一点是我们是想避免在有些马尔可夫过程,它是自己是带环的,就像它没有并没有终结,然后我们想避免这个无穷的奖励。另外,我们是想把这个不确定性也表示出来,希望尽可能快地得到奖励,而不是在未来某一个点得到奖励。然后另外如果这个奖励是它是有实际价值的了,我们可能是更希望立刻就得到奖励,而不是我们后面再得到奖励。在人的行为里面来说的话,其实也是大家也是想得到立刻奖励了。另外,在有些状态的时候,我们这个系数也可以把它设为 0。比如说,当我们设为 0 过后,然后我们就只关注了它当前的奖励。另外,我们也可以把它设为 1,设为 1 的话就是对未来并没有折扣,未来获得的奖励跟我们当前获得的奖励是一样的。价值是一样的,这个系数其实是应该可以作为强化学习 agent 的一个 hyper parameter 来进行调整,然后就会得到不同行为的 agent。
|
||||
|
||||

|
||||
|
||||
巴普洛夫效应揭示的是中性刺激(铃声)跟无条件刺激(食物)紧紧挨着反复出现的时候,条件刺激也可以引起无条件刺激引起的唾液分泌,然后形成这个条件刺激。这种中性刺激跟无条件刺激在时间上面的结合,我们就称之为强化。 强化的次数越多,条件反射就会越巩固。小狗原本不觉得铃声有价值的,经过强化之后,小狗就会慢慢地意识到铃声也是有价值的,它可能带来带来食物。更重要是一种条件反射巩固之后,我们再用另外一种新的刺激和条件反射去结合,还可以形成第二级条件反射,同样还可以形成第三级条件反射。在人的身上是可以建立多级的条件反射的。举个例子,比如说一般我们遇到熊都是这样一个顺序,看到树上有熊瓜,然后看到熊之后,突然熊发怒,扑过来了。经历这个过程之后,我们可能最开始看到熊才会瑟瑟发抖,后面就是看到树上有熊爪就已经有害怕的感觉了。也就说在不断的重复试验之后,下一个状态的价值,它是可以不断地去强化影响上一个状态的价值的。
|
||||
这里我们再来看一看,在这个马尔可夫奖励过程里面,它如何计算它的价值。这个马尔可夫奖励过程依旧是这个状态转移。它的奖励函数是定义成这样,它在进入第一个状态的时候,他会得到 5 的奖励,进入第七个状态的时候会得到 10 的奖励,其它状态都没有奖励。我们现在可以计算每一个轨迹得到的奖励,比如我们这里对于这个 $s_4,s_5,s_6,s_7$ 整个轨迹的奖励进行计算,我们这里折扣系数是0.5。那么我们在 $s_4$ 的时候,我们并没有任何奖励,所以这里是零。下一个状态 $s_5$ 的时候,因为我们已经到了下一步了,所以我们要把 $s_5$ 进行一个折扣,$s_5$ 本身也是没有奖励的。然后是到$s_6$ ,然后也没有任何奖励。折扣系数应该是下两步,所以我们要再乘以 $\frac{1}{2}$ 。然后这里终于我们到达$s_7$ ,然后我们获得了一个奖励。但是因为 $s_7$ 这个状态是我们试过以后的未来我们才获得的奖励,所以我们要进行三次折扣。所以对于这个轨迹,它的 return 就是一个1.25,类似地,我们可以得到其它轨迹的 return 。
|
||||
|
||||
这里就自然而然引出了一个问题,当我们有了一些轨迹的实际 return。那我们怎么计算它的价值函数。比如说我们现在想知道 $s_4$ 状态的价值。就是当你进入 $s_4$ 后,它的价值到底如何。
|
||||
|
||||
那么一个可行的做法,就是说我们可以产生很多轨迹,然后把这里的轨迹都叠加起来。比如我们现在可以从 $s_4$ 开始,然后采样生成很多轨迹,然后我们都把它的 return 计算出来,然后可以直接把它取一个平均,然后作为你进入 $s_4$ 它的价值,这其实是一种计算价值函数的一个办法,通过这个蒙特卡罗采样的办法计算 $s_4$ 的状态,我们接下来会进一步介绍这个蒙特卡洛算法
|
||||
|
||||

|
||||
|
||||
为了让大家更加直观感受下一个状态影响上一个状态效果,这里推荐斯坦福大学的一个网站:[Temporal Difference Learning Gridworld Demo](https://cs.stanford.edu/people/karpathy/reinforcejs/gridworld_td.html)。这个网站模拟了就是这种单步更新的过程中,所有格子的一个状态价值的变化过程。我们可以看到格子里面有几个 -1的 reward。只有一个 +1 reward 的那个格子。
|
||||
但是这里我们采取了另外一种计算方法,我们通过一定的推导就可以从这个价值函数里面推导出 `Bellman Equation(贝尔曼等式)`。Bellman Equation 定义了你当前状态跟未来状态之间的这个关系。比如 $s'$ 我们可以把它看成未来的所有状态。然后这里有一个转移 $P(s'|s)$ ,就是我们从当前状态转移到未来状态,那么它之间是满足于这个关系,然后我们可以把第二部分这部分看成是一个 Discounted sum of future reward。$V(s')$ 代表的是未来某一个状态的价值,那么我们从当前这个位置开始有一定的概率去到未来的所有状态,所以我们要把这个概率也写上去,这个转移矩阵也写上去,然后我们就得到了未来状态。然后再乘以一个 $\gamma$。这样就可以把未来为折扣,然后再加上我们当前立刻可以得到的这个奖励,这样就组成了这个 Bellman Equation。这个推导过程,大家其实可以去练习练习,就从这个定义出发,然后把它分解开,我们就可以得到 Bellman Equation。
|
||||
|
||||

|
||||
|
||||
玩起来是这样的,先初始化一下,然后开始时序差分的更新过程,训练的过程你会看到这个小黄球不断的在试错。但探索当中会先迅速地发现有 reward 的地方。最开始的时候,只是这些有 reward 的格子 才有价值,当不断的重复走这些路线的时候,这些有价值的格子,它可以去慢慢的影响它附近的格子的价值。反复训练之后,有 reward 的这些格子周围的格子的状态就会慢慢的被强化,然后强化就是当它收敛到最后一个最优的状态了,就是把这些价值最终收敛到一个最优的情况之后,那个小黄球就会自动地知道,就是我一直往价值高的地方走,我就能够走到能够拿到 reward 的地方。
|
||||
|
||||
### Temporal Difference
|
||||
Bellman Equation 定义了状态之间迭代关系。假设我们现在有一个马尔可夫转移矩阵是右边这个样子。然后 Bellman Equation 描述的就是当前状态到未来状态的一个转移,你可以发现,从假设我们当前是在 $s_1$, 那么它只可能去到三个未来的状态。一个是它有 0.1 的概率留在它当前这个位置,另外有 0.2 的概率,它去到才 $s_2$ 状态。另外 0.7 的概率去到 $s_4$ 的状态,所以我们要把这个转移乘以它的这个未来的状态,再加上它的 immediate reward 就会得到它当前状态的价值。所以 Bellman Equation 定义的就是当前状态跟未来状态的一个迭代的关系。
|
||||
|
||||

|
||||
|
||||
这种强化方式其实在数学上面一行公式就表达出来了。这种更新的方式叫做`时序差分(Temporal Difference)`。这个公式就是说可以拿下一步的 Q 值 $Q(S_{t+_1},A_{t+1})$ 来更新我这一步的 Q 值 $Q(S_t,A_t)$ 。
|
||||
另外我们可以把 Bellman Equation 写成一种矩阵的形式,这下面就是矩阵的一个具体形式。我们首先有这个转移矩阵。我们当前这个状态是一个向量 $[V(s_1),V(s_2),\cdots,V(s_N)]^T$。我们可以写成迭代的形式。我们每一行来看的话,V 这个向量乘以了转移矩阵里面的某一行,然后再加上它当前的这个可以得到的 reward,然后就会回到它当前的这个价值。
|
||||
|
||||
为了理解这个公式,如图所示,我们先把 $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),我们对 return 做一下简单的数学变化,可以知道
|
||||
当我们写成如下的矩阵形式后
|
||||
$$
|
||||
G_t = R_{t+1}+ \gamma G_{t+1}
|
||||
V = R+ \gamma PV
|
||||
$$
|
||||
|
||||
|
||||
也就是说,我们拿 $Q(S_t,A_t)$ 来逼近这个 $G_t$ , 那 $Q(S_{t+1},A_{t+1})$ 其实就是近似这个 $G_{t+1}$ ,那我们可以把 $G_{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})$ 之后,就可以做一次更新。
|
||||
让我们可以直接得到一个`解析解(analytic solution)`,就通过矩阵求逆的过程,就可以把这个 V 的这个价值直接求出来。但是一个问题是这个矩阵求逆的过程的复杂度是 $O(N^3)$。所以就当我们状态非常多的时候,比如说从我们现在十个状态到一千个状态,到一百万个状态。那么当我们有一百万个状态的时候,这个转移矩阵就会是个一百万乘以一百万的一个矩阵。这样一个大矩阵的话求逆是非常困难的,所以这种通过解析解去解,只能对于很小量的马尔可夫奖励过程。
|
||||
|
||||

|
||||
|
||||
我们看看用代码去怎么去实现。了解单步更新的一个基本公式之后,代码实现就很简单了。这个是环境,这个是 agent 。我们每次跟环境交互一次之后呢,就可以 learn 一下。我们向环境输出 action,
|
||||
另外求解这个价值函数,我们有这个迭代的方法来解这种状态非常多的这个马尔可夫奖励过程,这里迭代的方法就有几种。比如说我们可以通过动态规划(Dynamic Programming)的方法,然后也可以通过蒙特卡罗的办法,就通过采样的办法去计算它。另外我们也可以通过 Temporal-Difference Learning 的那个办法。这个 Temporal-Difference Learning 叫 TD Leanring,就是动态规划和蒙特卡罗的一个结合。
|
||||
|
||||
然后从环境当中拿到那 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。这边我们给出 [Sarsa 的 Python 实现](https://github.com/datawhalechina/leedeeprl-notes/tree/master/codes/Sarsa)。
|
||||
这里首先我们来看一个蒙特卡罗的一个办法来计算它的一个价值函数,这个蒙特卡罗就跟我们之前采用的这个方法是很类似,就说我们当得到一个马尔可夫奖励过程过后,我们可以从某一个状态开始,然后让它让把这个小船放进去,让它随波逐流,这样就会产生一个轨迹。产生了一个轨迹过后,人们就会得到一个奖励,那么就直接把它的 Discounted 的奖励 $g$ 直接算出来。算出来过后就可以把它积累起来,当积累到一定的轨迹数量过后,然后直接除以这个轨迹,然后就会得到它的这个价值。
|
||||
|
||||
## Sarsa(λ)
|
||||
比如说我们要算 $s_4$ 状态的一个价值,就可以从 $s_4$ 状态开始,然后随机产生很多轨迹,就产生很多小船,然后扔到这个转移矩阵里面去,然后它就会随波逐流,然后产生轨迹。每个轨迹,我们可以算到它的这个 return 。那么每个轨迹都会得到一个 return,让我们得到大量的 return 。比如说一百个、一千个的 return ,然后直接取一个平均,那么就可以等价于它现在这个 $s_4$ 这个价值。因为 $s_4$ 的价值 $V(s_4)$ 就是定义了你未来可能得到多少的这个奖励。这就是蒙特卡罗采样的方法。
|
||||
|
||||
Sarsa 属于单步更新法,也就是说每执行一个动作,就会更新一次价值和策略。如果不进行单步更新,而是采取 $n$ 步更新或者回合更新,即在执行 $n$ 步之后再来更新价值和策略,这样就得到了 $n$ 步 Sarsa。具体来说,对于 Sarsa,在 $t$ 时刻其价值的计算公式为
|
||||
$$
|
||||
q_{t}=r_{t}+\gamma Q\left(s_{t+1}, a_{t+1}\right)
|
||||
$$
|
||||
而对于 $n$ 步 Sarsa,它的 $n$ 步 Q 收获为
|
||||
$$
|
||||
q_{t}^{(n)}=r_{t}+\gamma r_{t+1}+\cdots+\gamma^{n-1} r_{t+n-1}+\gamma^{n} Q\left(s_{t+n}, a_{t+n}\right)
|
||||
$$
|
||||
如果给 $q_t^{(n)}$ 加上衰减因子 $\lambda$ 并进行求和,即可得到 Sarsa($\lambda$) 的 Q 收获:
|
||||
$$
|
||||
q_{t}^{\lambda}=(1-\lambda) \sum_{n=1}^{\infty} \lambda^{n-1} q_{t}^{(n)}
|
||||
$$
|
||||
因此,$n$ 步 Sarsa($\lambda$)的更新策略可以表示为
|
||||
$$
|
||||
Q\left(s_{t}, a_{t}\right) \leftarrow Q\left(s_{t}, a_{t}\right)+\alpha\left(q_{t}^{\lambda}-Q\left(s_{t}, a_{t}\right)\right)
|
||||
$$
|
||||
总的来说,Sarsa 和 Sarsa($\lambda$) 的差别主要体现在价值的更新上。
|
||||
我们也可以用这个动态规划的一个办法,就通过这种一直去迭代它的 Bellman Equation ,然后让它最后收敛,我们就可以得到它的一个状态。所以在这里算法二就是一个迭代的一个算法,通过这个 bootstraping 的一个办法,然后去不停地迭代这个 Bellman Equation。然后当这个最后更新的状态跟你上一个状态变化并不大的时候,这个更新就可以停止。那么我们就可以输出这个最新的这个 $V'(s)$ 作为它当前的状态。所以这里就是利用到了 Bellman Equation,就把 Bellman Equation 变成一个 Bellman Update。这样就可以得到它的一个价值。
|
||||
|
||||
|
||||
|
||||
## Q-learning
|
||||
|
||||

|
||||
|
||||
Sarsa 是一种 on-policy 策略。Sarsa 优化的是它实际执行的策略。它直接拿下一步会执行的 action 来去优化 Q 表格,所以 on-policy 在学习的过程中,只存在一种策略,它用一种策略去做 action 的选取,也用一种策略去做优化。所以 Sarsa 知道它下一步的动作有可能会跑到悬崖那边去,所以它就会在优化它自己的策略的时候,会尽可能的离悬崖远一点。这样子就会保证说,它下一步哪怕是有随机动作,它也还是在安全区域内。
|
||||
|
||||
而 off-policy 在学习的过程中,有两种不同的策略。第一个策略是我们希望学到一个最佳的目标策略,另外一个策略是探索环境的策略,它可以大胆地去探索到所有可能的轨迹,然后喂给这个目标策略去学习。而且喂给目标策略的数据中并不需要 $a_{t+1}$ ,而 Sarsa 是有 $a_{t+1}$ 的。比如说目标策略优化时候,Q-learning 才不管你下一步去往哪里探索,会不会掉悬崖,我就只选我收益最大一个最优的策略。探索环境的策略,我们叫做 `behavior policy(行为策略)`,它像是一个战士,可以在环境里面探索所有的动作和轨迹和经验,然后把这些经验的交给目标策略去学习。`Target policy(目标策略)`就像是在后方指挥战术的一个军师,它可以根据自己的经验来学习最优的策略,不需要去和环境交互。
|
||||
## Markov Decision Process(MDP)
|
||||
|
||||

|
||||
|
||||
我们通过对比的方式来去理解 `Q-learning`。Q-learning 是 off-policy 的时序差分学习方法,Sarsa 是 on-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}$ 的值。
|
||||
|
||||
在Q-learning 中,Q函数的估计方法为
|
||||
$$
|
||||
Q(s, a) \leftarrow Q(s, a)+\alpha\left(r+\gamma \max _{a^{\prime}} Q\left(s^{\prime}, a^{\prime}\right)-Q(s, a)\right)
|
||||
$$
|
||||
相当于让 $Q(s,a)$ 直接去估计最优状态值函数 $Q^*(s,a)$。
|
||||
|
||||
> 事实上,Q-learning 算法被提出的时间更早,Sarsa 算法是 Q-learning 算法的改进。
|
||||
|
||||
相对于马尔可夫奖励过程,马尔可夫决策过程多了一个 action,就是它多了一个 decision,其它的定义跟马尔可夫奖励过程都是类似的。这里我们多了一个决策,多了一个 action ,那么这个状态转移也多了一个 condition,就是它多了一个你采取某一种行为,然后你未来的状态会不同,它不仅是依赖于你当前的状态,也依赖于在当前状态你这个 agent 它采取的这个行为会决定它未来的这个状态走向。对于这个价值函数,它也是多了一个条件,多了一个你当前的这个行为,就说你可以得到的奖励是基于你当前的状态以及当年你采取的行为会决定你在当前可能得到的奖励多少。
|
||||
|
||||

|
||||
|
||||
Sarsa 和 Q-learning 的更新公式都是一样的,区别只在 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 最大的那个动作。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-learning 的 Python实现](https://github.com/datawhalechina/leedeeprl-notes/tree/master/codes/Q-learning)。
|
||||
|
||||
### Q-function Bellman Equation
|
||||
|
||||
记策略 $\pi $ 的状态-动作值函数为 $Q^{\pi}(s_t,a_t)$,它表示在状态 $s_t$ 下,执行动作 $a_t$ 会带来的累积奖励 $G_t$ 的期望,具体公式为:
|
||||
$$
|
||||
\begin{aligned} Q ^ { \pi } \left( s _ { t } , a _ { t } \right) & = \mathbb { E } \left[ G _ { t } \mid s _ { t } , a _ { t } \right] \\ & = \mathbb { E } \left[ r _ { t } + \gamma r _ { t + 1 } + \gamma ^ { 2 } r _ { t + 2 } + \cdots \mid s _ { t } , a _ { t } \right] \\ & = \mathbb { E } \left[ r _ { t } + \gamma \left( r _ { t + 1 } + \gamma r _ { t + 2 } + \cdots \right) \mid s _ { t } , a _ { t } \right]
|
||||
\\ & =\mathbb { E } [ r _ { t }|s_t,a_t] + \gamma \mathbb{E}[r_{t+1}+ \gamma r_{t+2}+\cdots|s_t,a_t] \\
|
||||
& = \mathbb{E}[ r _ { t }|s_t,a_t]+ \gamma \mathbb{E}[G_{t+1}|s_t,a_t]
|
||||
\\ &= \mathbb { E } \left[ r _ { t } + \gamma Q ^ { \pi } \left( s _ { t + 1 } , a _ { t + 1 } \right) \mid s _ { t } , a _ { t } \right] \end{aligned}
|
||||
$$
|
||||
上式是 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})$ 有关,因此,状态-动作值函数的计算可以通过动态规划算法来实现。
|
||||
|
||||
>Bellman Equation 就是当前状态与未来状态的迭代关系,表示当前状态的值函数可以通过下个状态的值函数来计算。Bellman Equation 因其提出者、动态规划创始人 Richard Bellman 而得名 ,也 叫作“动态规划方程”。
|
||||
|
||||
从另一方面考虑,在计算 $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^{\pi}\left(s_{t}, a_{t}\right)=\mathbb{E}_{s_{t+1}, a_{t+1}}\left[r_{t}+\gamma Q^{\pi}\left(s_{t+1}, a_{t+1}\right) \mid s_{t}, a_{t}\right]
|
||||
$$
|
||||
|
||||
Q-learning 算法在使用过程中,可以根据获得的累积奖励来选择策略,累积奖励的期望值越高,价值也就越大,智能体越倾向于选择这个动作。因此,最优策略 $\pi^*$ 对应的状态-动作值函数 $Q^*(s_t,a_t)$ 满足如下关系式:
|
||||
|
||||
$$
|
||||
Q^{*}\left(s_{t}, a_{t}\right)=\max _{\pi} Q^{\pi}\left(s_{t}, a_{t}\right)=\mathbb{E}_{s_{t+1}}\left[r_{t}+\gamma \max _{a_{t+1}} Q\left(s_{t+1}, a_{t+1}\right) \mid s_{t}, a_{t}\right]
|
||||
$$
|
||||
|
||||
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)$ 做一定比例的更新:
|
||||
$$
|
||||
\begin{aligned}
|
||||
Q^{*}\left(s_{t}, a_{t}\right) \leftarrow Q^{*}\left(s_{t}, a_{t}\right)+\alpha\left(r_{t}+\gamma \max _{a_{t+1}} Q^{*}\left(s_{t+1}, a_{t+1}\right)-Q^{*}\left(s_{t}, a_{t}\right)\right)
|
||||
\end{aligned}
|
||||
$$
|
||||
其中 $\alpha$ 是更新比例(学习速率)。这种渐进式的更新方式,可以减少策略估计造成的影响,并且最终会收敛至最优策略。
|
||||
policy 定义了我们在某一个步骤某一个状态的时候应该采取什么样的行为,当我们知道当前状态过后,我们可以带入这个策函数(policy function),那我们会得到一个概率,概率就象征了在所有可能的行为里面怎样去采取行动。就可能有 0.7 的概率往左走,有 0.3 的概率往右走,这样是一个概率的一个表示。另外这个策略也可能是确定的,它有可能是直接输出一个值,或者就直接告诉你当前应该采取什么样的行为,而不是一个行为的概率。然后这里我们有一个假设,就这个概率函数,它应该是静态的(stationary),不同时间点,你采取的行为其实都是对这个 policy function 进行采样。
|
||||
|
||||

|
||||
|
||||
下面讲一下 on-policy 和 off-policy 的区别。
|
||||
|
||||
* 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 则相对非常保守,会选择一条相对安全的迭代路线。
|
||||
这里说明了马尔可夫决策过程跟马尔可夫奖励过程的之间的一个转换,就是当我们已知一个马尔可夫决策过程以及我们已知一个 policy $\pi$ 的时候,那我们可以把马尔可夫决策过程转换成马尔可夫奖励过程。我们这里在马尔可夫决策过程里面,它的转移函数 $P(s'|s,a)$ 是基于它当前状态以及它当前的 action,因为我们现在已经已知它的这个 policy function,就是说在每一个状态,我们知道它可能采取的行为的概率,那么就可以直接把这个 action 进行加和,直接把这个 a 去掉,那我们就可以得到一个对于马尔可夫奖励过程的一个转移。这里就并没有 action 在这个里面,对于这个奖励函数,我们也可以把这个 action 拿掉,这样就会得到一个类似于马尔可夫奖励过程的一个奖励函数。
|
||||
|
||||

|
||||
|
||||
总结如上图所示。
|
||||
|
||||
|
||||
这里我们再来看一看,马尔科夫决策过程里面它状态转移跟之前马尔可夫奖励过程以及马尔可夫链的一个差异。对于之前的马尔可夫链的过程,它的转移是直接就决定,就从你当前是S,那么就直接通过这个转移概率就直接决定了你下一个状态会是什么。但是对于马尔可夫决策过程,它的中间多了一层这个行为 a ,就是说在你当前这个状态的时候,你首先要决定的是采取某一种行为。那么你会到了某一个黑色的这个节点,到了这个黑色的节点,因为你有一定的不确定性,当你当前状态决定过后以及你当前采取的行为过后,你到未来的状态其实也是一个概率分布。所以你采取行为以及你决定,然后你可能有有多大的概率到达某一个未来状态,以及另外有多大概率到达另外一个状态。所以在这个当前状态跟未来状态转移过程中这里多了一层决策性,这里是马尔可夫决策过程跟之前的马尔可夫过程很不同的一个地方。这里这个行为是由 agent 决定,所以这里我们多了一个 component,agent 会采取这个行为来决定这个未来的状态转移。
|
||||
|
||||

|
||||
|
||||
顺着马尔可夫决策过程的定义,我们可以把 state-value function,就是在马尔可夫决策过程里面的价值函数也进行一个定义,它的定义是跟马尔可夫奖励过程是类似的,但是这里我们的一个期望 expectation over policy,就是这个期望是基于这个你采取的这个 policy ,就当你的 policy 决定过后,让我们通过对这个 policy 进行采样,然后我们可以得到一个期望。那么就可以计算出它的这个价值函数。这里我们另外引入了一个 Q 函数,action-value function。
|
||||
|
||||
这个 Q 函数定义的是某一个状态某一个行为,然后它有可能得到的这个 return 的一个期望,这里期望其实也是 over 这个 policy function。所以你需要对这个 policy function 进行一个加和。然后最后得到它的这个价值。第三步,这里导出了价值函数跟Q函数之间的一个关系。价值函数跟 Q 函数的关系,就是直接对价值函数中的行为函数进行加和,就可以得到这个价值。
|
||||
|
||||

|
||||
|
||||
我们这里会得到一个 `Bellman Expectation Equation`,通过对它价值函数的定义,然后我们可以对它进行一个分解,我们就可以直接又得到一个这个类似于我们之前马尔可夫奖励过程的 Bellman Equation,这里叫 Bellman Expectation Equation。 因为这里期望是期望于它所有的这个 policy 所有可能的行为都把它 marginalize 掉,然后得到 return。那么对于 Q 函数,我们也可以做类似的分解,那么也可以得到对于 Q 函数的这个 Bellman Expectation Equation。
|
||||
|
||||
Bellman Expectation Equation 定义了你当前状态跟未来状态之间的一个关联。
|
||||
|
||||

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

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

|
||||
|
||||
* [百面深度学习](https://book.douban.com/subject/35043939/)
|
||||
同样对于 Q 函数,我们也可以进行这样的一个推导,就我们现在的根节点是这个Q函数的一个节点。这个 Q 函数是对于黑色的这个节点。我们下一时刻的这个Q函数是叶子节点,有四个黑色结点。那么我们这里也有两个加和。
|
||||
|
||||
* [神经网络与深度学习](https://nndl.github.io/)
|
||||
第一层加和是我们先把这个叶子节点从黑节点推到这个白色的这个节点,进了它的这个状态,就当我们到达某一个状态过后,这个白色极点,然后再进行一个加和,这样就把它重新推回到当前节点的一个Q函数,所以这个等式就决定了未来 Q 函数跟当前 Q 函数之间的这个关联。
|
||||
|
||||

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

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

|
||||
|
||||
这里我们再来进一步把这个例子,看一看它这个怎么做 policy evaluation,怎么在这个决策过程里面计算它每一个状态的价值。现在我们假设环境里面它有两种行为,就是往左走跟往右走的行为。然后我们这里 reward 的定义。因为其实这个现在的奖励函数应该是关于行为以及状态两个变量的一个函数,但我们这里就说,对于所有行为不管你采取什么行为,然后你只要是到达状态一了,然后都有五的奖励。只要是你到达状态 $s_7$ 了,然后你有十的奖励,然后中间没有任何奖励。那么假设我们现在采取的一个策略,这个策略我们说我们不管在任何状态,我们采取的策略都是往左走,我们也这里假设我们的价值这个折扣因子是零,那么直接就可以得到对于这样一个 deterministic policy,那么最后估算出的价值函数是是一致的。怎么得到这个结果,其实我们就可以直接在去 run 这个 iterative Equation,就把这个 Bellman Expectation Equation 拿到这个里面来,然后不停的迭代,最后它会收敛。收敛过后,然后它的值就是它每一个状态的价值。
|
||||
|
||||

|
||||
|
||||
我们再来看另外一个情况,就是如果我们这里有折扣了,这个折扣因子是 0.5,我们就可以通过这个等式进行迭代
|
||||
$$
|
||||
v_{t}^{\pi}(s)=\sum_{a} P(\pi(s)=a)\left(r(s, a)+\gamma \sum_{s^{\prime} \in S} P\left(s^{\prime} \mid s, a\right) v_{t-1}^{\pi}\left(s^{\prime}\right)\right)
|
||||
$$
|
||||
然后就会得到它的状态。另外一个练习的一个例子,就是说我们现在采取的 policy 在每个状态,我们有 0.5 的概率往左走。另外有 0.5 的概率往右走,那么放到这个状态里面去如何计算。其实也是把这个 Bellman Expectation Equation 拿出来,然后进行迭代就可以算出来了,就当我们开始的时候,我们可以初始化。初始化这个不同的 $v(s')$ 都会有一个值,那么放到这个里面去迭代,最后它的 $v$ ,然后就会算出来。
|
||||
|
||||

|
||||
|
||||
接下来我会给大家介绍马尔可夫决策过程的预测跟控制。这两个问题是马尔可夫决策过程里面的核心问题。对于 prediction,它的意思是说当我们给定一个马尔可夫决策过程以及一个给定的 policy $\pi$ ,那我们去计算它的 value function,就等于每个状态它的价值函数是多少。control 这个问题是说我们去寻找一个最佳的一个策略,它的 input 就是马尔可夫决策过程,输出是通过去寻找它的最佳策略,然后同时输出它的最佳价值函数(optimal value function)以及它的这个最佳策略(optimal policy)。在 MDP 里面,Prediction 和 control 都可以通过这个动态规划去解决。
|
||||
|
||||

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

|
||||
|
||||
首先我们来看一下 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,把如下的等式拿出来,
|
||||
$$
|
||||
v_{t+1}(s)=\sum_{a \in \mathcal{A}} \pi(a \mid s)\left(R(s, a)+\gamma \sum_{s^{\prime} \in \mathcal{S}} P\left(s^{\prime} \mid s, a\right) v_{t}\left(s^{\prime}\right)\right)
|
||||
$$
|
||||
然后反复迭代,然后就会得到一个收敛的价值函数的值,这个函数因为我们已经给定了它的这个 policy function,那我们可以直接把它简化成一个马尔可夫奖励过程的一个表达形式,那么它的形式就更简洁一些,就相当于我们把这个 $a$ 去掉。然后这样它就只有价值函数跟转移函数了。那我们通过去迭代这个更简化的一个函数,这样我们也可以得到它每个状态的价值,因为不管是在马尔可夫奖励过程以及马尔可夫决策过程,它的这个价值函数包含的这个变量都是只跟这个状态有关就相当于进入某一个状态,未来可能得到多大的价值。
|
||||
|
||||

|
||||
|
||||
比如现在这个环境是一个 small gridworld 的一个例子,就在我们这个环境非常简单。然后这个 agent 的目的是从某一个状态开始,它为了出去这个状态,它的终止状态就是左上角跟右上角,然后这里总共有14个状态,因为我们把每个位置就是用一个状态来表示。然后这个 agent 它采取的行为,我们说它的这个 policy function 就直接先给定了。我们说它在每一个状态都是随机游走。你说它们在每一个状态就是上下左右行走,它在边缘状态的时候,比如说在第四号状态的时候,它往左走的话,它是依然存在现在这个第四号状态,我们加了这个限制。然后这里我们给的奖励函数就是说你在这个每走一步,然后你就会得到一个负的奖励。所以这个 agent 需要尽快地到达这个终止状态。转态之间的转移也是确定的。比如我们从第六号状态往上走,它就会直接到达第二状态,因为很多时候有些环境是 probabilistic 的话,就是说 agent 在第六号状态,它选择往上走的时候,有可能地板是滑的,然后它可能滑到第三号状态或者第一号状态去,这就是有概率的一个转移。但我们这里说这个环境把它简化,从六号往上走,然后它就到了二号或者往右走然后它就到达七号。所以直接把这个迭代来解它。因为我们已经知道每一个概率以及它的这个概率转移,那么就直接可以进行一个简短的迭代,然后就会算出它每一个状态的一个价值。
|
||||
|
||||

|
||||
|
||||

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

|
||||
|
||||
在这样的环境里面,现在我们想计算它每一个状态的价值。然后这里我们也定义了它的 reward function。你可以看到有些状态上面有一个 R 的这个值。比如我们这边有些值是为负的,然后在这个棋盘的中间这个位置,可以能看到有一个 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 函数。我们可以直接在这个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 来进行的,当取它最大的这个状态的时候,它会满足下面这个等式:
|
||||
$$
|
||||
q^{*}(s, a)=R(s, a)+\gamma \sum_{s^{\prime} \in S} P\left(s^{\prime} \mid s, a\right) \max _{a^{\prime}} q^{*}\left(s^{\prime}, a^{\prime}\right)
|
||||
$$
|
||||
|
||||
|
||||

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

|
||||
|
||||
value iteration 这个算法目的是为了得到一个最佳的一个策略。一个解法是直接把这个 Bellman Optimallity backup,
|
||||
|
||||
它这个等式拿进来进行迭代,迭代很多次,然后收敛过后得到的那个值就是它的最佳的那个值。所以你看这个算法,开始的时候,它是先把所有值初始化,通过每一个状态,然后它会进行这个迭代。把等式 22 插到 等式 23 里面,那就是Bellman Optimallity backup 的那个等式。有了这个等式过后,然后进行不停的迭代,迭代过后,然后收敛。然后就会得到这个 $V^*$ 。当我们有这个 $V^*$ 过后,一个问题是如何进一步推算出它的最佳策略。最佳策略的话,我们可以直接用这个arg max,就先把它的 Q 函数重构出来,重构出来过后,我们可以对每一个列对应的最大的那个 action 就是应该它现在的最佳策略,这样我们可以就可以把这个最佳策略从这个这个最佳价值函数里面推导出来。
|
||||
|
||||

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

|
||||
|
||||

|
||||
|
||||
我们这里在可以来看一个 Demo,MDP 控制的过程。让我们首先来看这个 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。如果是一个 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 它,最后它就会达到最优的状态。
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 456 KiB After Width: | Height: | Size: 145 KiB |
|
Before Width: | Height: | Size: 965 KiB After Width: | Height: | Size: 305 KiB |
|
Before Width: | Height: | Size: 335 KiB After Width: | Height: | Size: 261 KiB |
|
Before Width: | Height: | Size: 216 KiB After Width: | Height: | Size: 255 KiB |
|
Before Width: | Height: | Size: 158 KiB After Width: | Height: | Size: 276 KiB |
|
Before Width: | Height: | Size: 335 KiB After Width: | Height: | Size: 278 KiB |
|
Before Width: | Height: | Size: 271 KiB After Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 520 KiB After Width: | Height: | Size: 305 KiB |
|
Before Width: | Height: | Size: 367 KiB After Width: | Height: | Size: 162 KiB |
|
Before Width: | Height: | Size: 454 KiB After Width: | Height: | Size: 270 KiB |
|
Before Width: | Height: | Size: 683 KiB After Width: | Height: | Size: 130 KiB |
|
Before Width: | Height: | Size: 494 KiB After Width: | Height: | Size: 274 KiB |
|
Before Width: | Height: | Size: 325 KiB After Width: | Height: | Size: 202 KiB |
|
Before Width: | Height: | Size: 322 KiB After Width: | Height: | Size: 188 KiB |
BIN
docs/chapter2/img/2.22.png
Normal file
|
After Width: | Height: | Size: 245 KiB |
BIN
docs/chapter2/img/2.23.png
Normal file
|
After Width: | Height: | Size: 207 KiB |
BIN
docs/chapter2/img/2.24.png
Normal file
|
After Width: | Height: | Size: 196 KiB |
BIN
docs/chapter2/img/2.25.png
Normal file
|
After Width: | Height: | Size: 150 KiB |
BIN
docs/chapter2/img/2.26.png
Normal file
|
After Width: | Height: | Size: 148 KiB |
BIN
docs/chapter2/img/2.27.png
Normal file
|
After Width: | Height: | Size: 82 KiB |
BIN
docs/chapter2/img/2.28.png
Normal file
|
After Width: | Height: | Size: 785 KiB |
BIN
docs/chapter2/img/2.29.png
Normal file
|
After Width: | Height: | Size: 567 KiB |
|
Before Width: | Height: | Size: 280 KiB After Width: | Height: | Size: 74 KiB |
BIN
docs/chapter2/img/2.30.png
Normal file
|
After Width: | Height: | Size: 560 KiB |
BIN
docs/chapter2/img/2.31.png
Normal file
|
After Width: | Height: | Size: 198 KiB |
BIN
docs/chapter2/img/2.32.png
Normal file
|
After Width: | Height: | Size: 278 KiB |
BIN
docs/chapter2/img/2.33.png
Normal file
|
After Width: | Height: | Size: 230 KiB |
BIN
docs/chapter2/img/2.34.png
Normal file
|
After Width: | Height: | Size: 202 KiB |
BIN
docs/chapter2/img/2.35.png
Normal file
|
After Width: | Height: | Size: 269 KiB |
BIN
docs/chapter2/img/2.36.png
Normal file
|
After Width: | Height: | Size: 114 KiB |
BIN
docs/chapter2/img/2.37.png
Normal file
|
After Width: | Height: | Size: 320 KiB |
BIN
docs/chapter2/img/2.38.png
Normal file
|
After Width: | Height: | Size: 406 KiB |
BIN
docs/chapter2/img/2.39.png
Normal file
|
After Width: | Height: | Size: 487 KiB |
|
Before Width: | Height: | Size: 208 KiB After Width: | Height: | Size: 176 KiB |
BIN
docs/chapter2/img/2.40.png
Normal file
|
After Width: | Height: | Size: 751 KiB |
BIN
docs/chapter2/img/2.41.png
Normal file
|
After Width: | Height: | Size: 216 KiB |
BIN
docs/chapter2/img/2.42.png
Normal file
|
After Width: | Height: | Size: 203 KiB |
BIN
docs/chapter2/img/2.43.png
Normal file
|
After Width: | Height: | Size: 114 KiB |
BIN
docs/chapter2/img/2.44.png
Normal file
|
After Width: | Height: | Size: 196 KiB |
BIN
docs/chapter2/img/2.45.png
Normal file
|
After Width: | Height: | Size: 290 KiB |
BIN
docs/chapter2/img/2.46.png
Normal file
|
After Width: | Height: | Size: 194 KiB |
BIN
docs/chapter2/img/2.47.png
Normal file
|
After Width: | Height: | Size: 269 KiB |
BIN
docs/chapter2/img/2.48.png
Normal file
|
After Width: | Height: | Size: 182 KiB |
BIN
docs/chapter2/img/2.49.png
Normal file
|
After Width: | Height: | Size: 184 KiB |
|
Before Width: | Height: | Size: 271 KiB After Width: | Height: | Size: 202 KiB |
BIN
docs/chapter2/img/2.50.png
Normal file
|
After Width: | Height: | Size: 265 KiB |
BIN
docs/chapter2/img/2.51.png
Normal file
|
After Width: | Height: | Size: 262 KiB |
BIN
docs/chapter2/img/2.52.png
Normal file
|
After Width: | Height: | Size: 169 KiB |
BIN
docs/chapter2/img/2.53.png
Normal file
|
After Width: | Height: | Size: 650 KiB |
BIN
docs/chapter2/img/2.54.png
Normal file
|
After Width: | Height: | Size: 322 KiB |
BIN
docs/chapter2/img/2.55.png
Normal file
|
After Width: | Height: | Size: 407 KiB |
BIN
docs/chapter2/img/2.56.png
Normal file
|
After Width: | Height: | Size: 420 KiB |
BIN
docs/chapter2/img/2.57.png
Normal file
|
After Width: | Height: | Size: 456 KiB |
BIN
docs/chapter2/img/2.58.png
Normal file
|
After Width: | Height: | Size: 439 KiB |
BIN
docs/chapter2/img/2.59.png
Normal file
|
After Width: | Height: | Size: 710 KiB |
|
Before Width: | Height: | Size: 283 KiB After Width: | Height: | Size: 165 KiB |
BIN
docs/chapter2/img/2.60.png
Normal file
|
After Width: | Height: | Size: 726 KiB |
BIN
docs/chapter2/img/2.61.png
Normal file
|
After Width: | Height: | Size: 746 KiB |
BIN
docs/chapter2/img/2.62.png
Normal file
|
After Width: | Height: | Size: 725 KiB |
BIN
docs/chapter2/img/2.63.png
Normal file
|
After Width: | Height: | Size: 73 KiB |
BIN
docs/chapter2/img/2.64.png
Normal file
|
After Width: | Height: | Size: 364 KiB |
BIN
docs/chapter2/img/2.65.png
Normal file
|
After Width: | Height: | Size: 205 KiB |
|
Before Width: | Height: | Size: 162 KiB After Width: | Height: | Size: 262 KiB |
|
Before Width: | Height: | Size: 296 KiB After Width: | Height: | Size: 424 KiB |
|
Before Width: | Height: | Size: 390 KiB After Width: | Height: | Size: 256 KiB |