目录
前言
学习赵老师讲授的强化学习的数学原理视频,本篇文章记录第五讲 Part 3:蒙特卡洛方法(MC Basic 算法例子),记录个人学习笔记,和大家一起分享交流😄
1. Illustrative example 1: step by step
下面我们通过两个例子来进一步学习 MC Basic ,刚才我们提到了 MC Basic 太简单、效率比较低,在实际当中不会用,但这个算法对于我们理解基于蒙特卡洛的 model-free 强化学习算法非常关键,所以希望大家通过这个例子进一步明确这个算法究竟在做什么。
实际上它非常简单,我们来看这样一个例子:

这里有一个初始的策略 π 0 \pi_0 π0 ,图中绿色箭头表示该策略,其它状态处这个策略都还不错,只是 s 1 s_1 s1 和 s 3 s_3 s3 处的策略不太好。我们下面就从 π 0 \pi_0 π0 出发,应用 MC Basic 算法找到一个 最优的策略。

MC Basic 算法和 policy iteration 一样分为两步,这个我们刚才已经介绍过了,那在 policy evaluation 中,就是要对任意的 s s s 和对任意的 a a a 求出 q π k ( s , a ) q_{\pi_k}(s,a) qπk(s,a) ,在这个例子里面我们一共有 9 个 state,每个 state 又对应 5 个 action,所以一共有 45 个 state-action pair ,需要算出 45 个 q π k q_{\pi_k} qπk 。
假设从每个 ( s , a ) (s,a) (s,a) 出发都要收集 n n n 条轨迹,再对这 n n n 条轨迹的 return 求平均,那么一共需要 45 × n 45 \times n 45×n 条轨迹。
得到 q π k q_{\pi_k} qπk 之后,第二步就是做 policy improvement ,这个很简单,在每个状态求出哪个 action 对应最大的 action value,我就选那个 action 就可以了。
因为时间关系,不可能把 45 个 q π k q_{\pi_k} qπk 全部算出来,我们这里只算 5 个,就是针对 s 1 s_1 s1 对应的 5 个 action,我们来看一下具体是怎么做的。

首先是做 policy evaluation ,我们刚才提到:从 ( s 1 , a 1 ) (s_1,a_1) (s1,a1) 出发的话,要收集 n n n 条轨迹,然后我对 n n n 条轨迹的 return 求平均,这样我才能求出来这个 q π k ( s 1 , a 1 ) q_{\pi_k}(s_1,a_1) qπk(s1,a1) 。
但是因为这个问题很简单,它的 policy 是 deterministic ,并且它的 环境也是 deterministic ,也就意味着从 ( s 1 , a 1 ) (s_1,a_1) (s1,a1) 出发,我不管采样多少次,最后所得到的轨迹都是相同的,所以 我只要采样一次就可以。
如果在更复杂的情况下, policy 是 stochastic ,或者 policy 是 deterministic 但是 环境是 stochastic ,如果从 ( s 1 , a 1 ) (s_1,a_1) (s1,a1) 出发多次采样会得到不同的轨迹,这时就需要采样多次再求平均,而这里只需要采样一次。
我们来看一下:从 ( s 1 , a 1 ) (s_1,a_1) (s1,a1) 出发进行一次采样,得到的轨迹是什么呢?

从图中可以看到 s 1 s_1 s1 它先向上走,又回到 s 1 s_1 s1 ,再向上走再回来,得到的轨迹就是 s 1 → a 1 s 1 → a 1 s 1 → a 1 ... \textcolor{blue}{s_1 \xrightarrow{a_1}} \textcolor{red}{s_1 \xrightarrow{a_1} s_1 \xrightarrow{a_1} \dots} s1a1 s1a1 s1a1 ... 这样一个轨迹,然后这个轨迹所对应的 return 我们就可以求出来:
q π 0 ( s 1 , a 1 ) = − 1 + γ ( − 1 ) + γ 2 ( − 1 ) + ... q_{\pi_0}(s_1, a_1) = -1 + \gamma(-1) + \gamma^2(-1) + \dots qπ0(s1,a1)=−1+γ(−1)+γ2(−1)+...
这个就是我们的 q π 0 ( s 1 , a 1 ) q_{\pi_0}(s_1,a_1) qπ0(s1,a1) 。

除了 ( s 1 , a 1 ) (s_1,a_1) (s1,a1) 之外还要算 ( s 1 , a 2 ) (s_1,a_2) (s1,a2)、 ( s 1 , a 3 ) (s_1,a_3) (s1,a3) 以及 ( s 1 , a 4 ) (s_1,a_4) (s1,a4)、 ( s 1 , a 5 ) (s_1,a_5) (s1,a5) ,这个方法都是类似的,这里就不再赘述了。
求出来 q π k q_{\pi_k} qπk 之后,下一步就是做 policy improvement。

简而言之,比较 ( s 1 , a ) (s_1,a) (s1,a) 这 5 个 action value 哪个最大,实际上这里 a 2 a_2 a2 和 a 3 a_3 a3 对应的值并列最大 ,具体的值大家可以对照上面的图去看一下。 a 2 a_2 a2 是往右, a 3 a_3 a3 是往下,这个直观上来看也是比较好的 action。由于它俩对应的 action value 是一样的 ,所以新策略可以任意选择 a 2 a_2 a2 或 a 3 a_3 a3(两者等价)。
这个新策略实际上已经是 最优的 了,也就是说,我们只 用一次迭代就找到了最优策略 ,原因在于这个例子很简单,而且除了 s 1 s_1 s1 之外,其它状态的策略本来就已经是最优的,所以轻松地就找到了最优策略。
大家可以自己练习下,比如用 MC Basic 的方法求出 s 3 s_3 s3 的最优策略,这里我只想提醒大家,有时候你自己动手写一写,比单纯看理解得更深刻。
2. Illustrative example 2: Episode length
下面我们来看第二个例子,第二个例子不再是展示怎么用 MC Basic 解决问题,而是用 MC Basic 得到最优策略之后,去分析这个最优策略有什么有意思的性质。

这里面我们重点关注的是这个 episode 的长度 ,什么意思呢?我们在用 MC Basic 的时候需要数据,这些数据就是从任意 ( s , a ) (s,a) (s,a) 出发采集的大量的 episode ,我们要计算 episode 的 return ,这个 episode 的长度理论上来说是越长越好,最好是无穷长,这样的话它所计算出来的 return 是最精确的。
但现实中 episode 不可能是无穷长 ,特别是在我们的 grid-world example 中,没有终止条件 ,如果你不人为设置一个 episode 的长度的话,它会一直这样持续下去,所以 episode 长度设置为多少才合适呢? 这个实际上是一个很有意思的问题,待会大家可以看一下。
这里的例子是一个 5×5 的网格世界,target 位于 ( 3 , 4 ) (3,4) (3,4) ,下面是一些标准的设置:
r b o u n d a r y = − 1 , r f o r b i d d e n = − 10 , r t a r g e t = 1 , γ = 0.9 r_{\mathrm{boundary}} = -1, \quad r_{\mathrm{forbidden}} = -10, \quad r_{\mathrm{target}} = 1, \quad \gamma = 0.9 rboundary=−1,rforbidden=−10,rtarget=1,γ=0.9
我们具体来看一下。

上图展示的就是我们用 MC Basic 在不同 episode length 下所得到的 optimal state value 和 optimal policy 的一个估计。
第一张图的结果显然不好,为什么呢?因为这里的 episode length 只用了 1 ,什么意思呢?就是从 s s s 出发执行 action a a a(假设要求的是 q π k ( s , a ) q_{\pi_k}(s,a) qπk(s,a)),之后跳到新状态并得到 reward,然后又跳到下一个状态、再得到 reward,即:
s → a s ′ , r → ⋯ s \xrightarrow{a} s',r \rightarrow \cdots sa s′,r→⋯
那 episode length 等于 1 意味着只到 s ′ , r s',r s′,r 这里就停止了,后面的就都不做了,所以这时候就用这个 reward 作为 episode 的 return,这个估计显然不准确。
那我们来看一下它有什么性质,大家可以看到只有紧挨着目标的这些状态,它们的 value 是正数 ,它们相对应的策略也都是正确的,其它状态的 value 全都是 0 ,它们的策略也都是不好的,value 是 0 意味着什么呢?意味着它们 根本就没有到达目标,因为只要到达目标,value 就会是正数。
所以从直观上来说这个也是比较容易理解的,大家可以想象一下我们在沙漠中:我们在这里,而水源在那里,我要向四面八方出发进行探索,但是我探索的半径比较短,只有 1 公里,假设水源离我 5 公里,那不管怎么样探索,肯定探测不到水源,所以这时候从这里出发的策略一定是不对的。
但反过来,如果水源离我很近,我探索的半径仍然是 1 公里,刚好就可以探索到它,这时我知道从这出发应该往上走,才能到达水源,所以 episode length 直观上可以理解为探索半径。
下面我们来看一下,如果增加 episode 的长度,会发生什么现象?
其实是非常有意思的,如果 episode length 变成 2 ,大家可以看一下,除了刚才靠近目标区域这几个状态是对的之外, ( 2 , 5 ) , ( 4 , 5 ) (2,5),(4,5) (2,5),(4,5) 这两个状态的策略也变成正确的了,为什么呢?因为从 ( 2 , 5 ) (2,5) (2,5) 出发,实际上是可以通过两步正好到达目标 ( 3 , 4 ) (3,4) (3,4) ,从 ( 4 , 5 ) (4,5) (4,5) 出发也能通过两步到达目标,它们所对应的 value 也是正数。
( 5 , 5 ) (5,5) (5,5) 这个状态的策略看起来是对的,实际上却是 随机产生 的,因为在 ( 5 , 5 ) (5,5) (5,5) 这个状态,向上、向左、原地不动三种动作的 action value 都是 0 ,它只是刚好随机选择了向左,它所对应的 value 是 0,说明它根本没有到达目标(需要 3 步才行),向左并非 "有意为之"。
如果把 episode length 增加到 3 ,大家可以看到,这个时候 ( 5 , 5 ) (5,5) (5,5) 的 value 就变成了正数 ,这时候的策略就是正确的策略。如果继续增加 episode length, ( 5 , 4 ) (5,4) (5,4) 这个状态的策略也会慢慢变成最优的。

如果一直增加,当 episode length 增加到 14 时,14 是什么呢?就是从 ( 1 , 4 ) (1,4) (1,4) 出发,需要 14 步才能到达目标,到达目标之后就会得到正的 return,然后它所对应的这个 value 也是一个正数。
同样地,在 ( 1 , 5 ) (1,5) (1,5) 这个地方它往上走也是 随机选择 的结果,因为它的 state value 是 0,意味着它实际上没有到达目标,即它可以原地不动,也可以往上走(action value 都是 0),只是恰好随机选择了往上。
但是当我增加 episode length 到 15 的时候, ( 1 , 5 ) (1,5) (1,5) 就可以到达目标了,证据是这里的 state value 已经是正数 了。如果我们继续增加这个 episode 的长度,比如说到 30 或者是到 100,这个策略基本上已经不怎么变化了,唯一变化的就是 state value---optimal state value 的估计值还在不断地变化。
episode length 很大 的时候,比如 100 或接近于无穷时,这时候所估计的 optimal state value 和真值就基本上是一样的了。
通过刚才的例子实际上我们发现了一些有意思的结果,我们下面总结一下。

首先,当 episode length 比较短时,只有离目标比较近的状态才能在这么短的步骤内找到目标 ,因此它们能找到正确的策略。随着 episode length 逐渐增加,离目标越来越远的那些状态也能慢慢地到达目标,从而找到最优的策略。
总而言之,episode length 必须要足够长 ,让所有的状态都有机会到达目标,同时它也 不需要无限长,只要足够长即可,本例中 "几十步、几百步" 这些具体数值只是给出直观感受,实际中要根据具体问题具体分析。
结语
本讲第三部分通过两个具体例子加深了对 MC Basic 算法的理解。第一个例子完整展示了算法的执行流程:在确定性的策略和环境下,每个 state-action pair 只需采样一条轨迹即可精确估计 action value;通过比较 5 个动作的 action value 完成策略改进,一次迭代就找到了最优策略。第二个例子则揭示了 episode length 这一关键参数的影响:episode 长度直观上相当于 "探索半径"---长度越短,只有离目标近的状态才能 "探测" 到目标并学到正确策略;随着长度增加,越来越远的状态逐步被 "点亮",最终所有状态都能找到通往目标的最优策略。
这一现象给了我们重要的实践启示:episode length 必须足够长,让所有状态都有机会在 episode 内到达目标区域;但也无需无限长,足够充分即可---不过需要留意的是,更长的 episode 仍会持续改善 state value 估计的精度。这也预示着后续算法改进的方向:如何更高效地利用有限长度的数据🤗。