5. 免模型决策(Model-Free Control)

5. 免模型决策(Model-Free Control)

本系列文章来自David Silver 的网络公开课。若有问题,欢迎交流~
link: Teaching
原创内容,转载请联系作者。

On-Policy Monte-Carlo Control

Generalised Policy Iteration With Monte-Carlo Evaluation

一个通用的基于MC的Policy 迭代过程,应该包括以下两个部分:


  1. 首先,我们使用MC evaluation 来评估当前的value function,判断他是否已经收敛,如果已经收敛,说明他已经达到最优;
  2. 如果没有达到最优,那么使用贪心算法(greedy policy),来对当前的policy进行优化,得到新的policy;
  3. 用新的policy与环境进行交互,回到1. 重新进行评估,直到已经收敛为止

With Action-Value Function

在我们之前的动态规划中,我们根据MDPs使用V(s)的式子进行greedy policy:

\pi'(s)=arg \max_{a \in A}(R^a_s+\gamma \sum_{s^{'} \in S}P^a_{ss^{'}}V(s^{'}))

这就意味着,我们需要知道的具体数据,也就是说,我们需要知道环境内在的转化因素,但是在Model-Free的学习中,我们是不清楚这一点的。如果我们能够直接通过Q(s,a)来更新,这就是一个model-free的算法,因为:

\pi'(s)=arg \max_{a \in A} Q(s,a)

对应的优化过程变成:

在这个过程中,我们需要向之前一样证明,经过的贪心选择后, \pi_{k+1} 一定是比 \pi_k 更好的,除非他已经达到了最优解,证明过程和之前的思路一样:

\begin{align} Q^{\pi_k}(s,\pi_{k+1}(s))&=Q^{\pi_k}(s,arg \max_a(Q^{\pi_k(s,a)}))\\ &=\max_a Q^{\pi_k}(s,a)\\ & \ge Q^{\pi_k}(s,\pi_k(s)) \end{align}

比起之前的做法,我们把评估V(s)的过程转化成评估Q(s,a)的过程,其他的流程是没有变化的,但是,这依然存在问题:

  • 在every-visit MC过程中,每一个state-action pair 取的是每一次访问state时选择某一个action得到的return的平均值,first-visit 取得的是每一个episode首次访问state选择某个action得到的return的平均值,若我们期望得到真实的Q(s,a),我们就需要访问无限次的state-action pair 才可能实现
  • 另外一个问题是,在这个迭代过程中,有一些state-action是永远无法被访问到的。如果我们的是一个deterministic policy做初始化,那么,我们迭代结果而言,对于每一个状态,只会返回同一个action 的return的平均值。如果完全基于经验继续执行下去,我们没法访问所有的action,只会基于当前的喜好来不断的优化,这就是maintaining exploration 问题。

Infinite Number of Episodes

实际上,在DP算法中,我们也是逐渐逼近真实的value function的,我们有两个方式解决这个问题

  • 第一种方式是设定一个误差允许的量级,每一个比较每一次迭代得到的 Q^{\pi_k}(s,a) 的估计值的误差,当误差在允许范围的时候,我们就认为他已经得到我们所能接受的准确的近似值了,这是一个正确的解决方式,但是,他仍然需要大量的迭代,所以我们往往采用第二种方式。
  • 第二种方式,在一次迭代中,不再期望我们得到的就是真实的,一个极端的例子就是我们之前讲的value iteration,每一次迭代就进行一次policy的评估。所以说,这个方式在开始迭代的过程中得到的 Q^{\pi}(s,a) 可能是没意义的,但是经过多轮的迭代,最终会得到真实的 Q^{\pi}(s,a) ,也得到对应最优的 \pi ,其对应的结果如下图所示:

Maintaining Exploration

我们使用 \epsilon -policy 来进行更新,这个方案很简单,就是在原来的基础上,加了一个权重进行探索,具体而言:

\begin{equation} \pi(a|s)= \begin{cases} \epsilon/m + 1-\epsilon & a^*= arg \max_{a \in A} q_*(s,a) \\ \epsilon/m & otherrwise \\ \end{cases} \end{equation}

其中, m=|A(s)| ,也就是等于动作的总个数。其他没有变化,但是,我们仍然要证明,在这种情况下,我们的策略仍然是一定忘更好的方向调整的:

\begin{align} q^{\pi}(s,\pi'(s))&=\sum_a \pi'(s,a) q^{\pi}(s,a)\\ &=\frac{\epsilon}{m} \sum_a q^{\pi}(s,a)+(1-\epsilon) \max_a q^{\pi}(s,a)\\ &\ge \frac{\epsilon}{m} \sum_a q^{\pi}(s,a)+ (1-\epsilon) \sum_a\frac{\pi(s,a)-\frac{\epsilon}{m}}{1-\epsilon} q^{\pi}(s,a) \end{align}


这里解释一下不等号的意义:我们看第二项在做什么,这是让非负权重的q项加权后等于一,也就是说,他只保留 \pi(s,a) 策略中权重为 \epsilon/m + 1-\epsilon 的项,并且经过 1-\epsilon 归一化后,权重为1。所以说这项的值一定是小于等于 q^{\pi}(s,a) 所能产生的最大值的,除非新旧两个策略都是最优的,接下来可以进一步转化:

\begin{align} &\frac{\epsilon}{m} \sum_a q^{\pi}(s,a)+ (1-\epsilon) \sum_a \frac{\pi(s,a)-\frac{\epsilon}{m}}{1-\epsilon} q^{\pi}(s,a)\\ =&\frac{\epsilon}{m} \sum_a q^{\pi}(s,a) - \frac{\epsilon}{m} \sum_a q^{\pi}(s,a) + \sum_a \pi(s,a)q^{\pi}(s,a)\\ =&\sum_a \pi(s,a)q^{\pi}(s,a)\\ =&V^{\pi}(s) \end{align}


Pseudocode

GLIE:Greedy in Limit with Infinite Exploration

如名字所说,这是一种贪婪的思想,他是一种范式的定义,他有两个要求:

  • 所有的状态对在无线次的迭代后,应该都被无限次的访问到,意味着,对于任意的<s,a>:

\lim_{k \rightarrow \infty} N_k(s,a) = \infty

  • policy 最后能够变成传统的greedy policy,也就是说,对于任意的<s,a>:

\lim_{k \rightarrow \infty} \pi(a|s) = 1(a= arg \ max_{a' \in A}q_k(s,a))


其中,k是迭代的次数

具体的实现有很多种,比如:




Sarsa: On-Policy Temporal-Difference Learning

Sarsa 是一种时序差分法,就如前面所说的,他有以下的特点:

  • 更小的方差
  • 可以在线学习
  • 每一个step结束后就可以直接进行更新

Sarsa(0)

算法逻辑

Sarsa(0)所作出的改变很简单,就是将原本我们TD(0)更新V的过程,变成了更新Q,具体如下:

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},s_t))

其他和之前的TD(0)的算法没有变化,因此,我们也能够比较轻松的得到他的伪代码:


example:

图中是一个网格,我们需要从S走到G,X轴下标代表当前位置向上吹的风力大小,每一个step的reward=-1,到达goal的reward=0。我们以此来做到最快达到G的操作,令 \epsilon=0.1,\alpha=0.1,初始化q(s,a)=0

我们可以看到,在一开始的2000step中,我们没有完成任何的一个episode,因为一开始agent也不知道自己在干啥,只能随便走,但是当他完成了第一个episode的时候,episodes的完成速度明显提高,并且越来越快。因为我们policy已经越来越好,agent完成一次episode所需要的step也越来越短。

收敛理论:Convergence of Sarsa

在理论中,Sarsa算法要收敛到最优解,需要满足以下条件:

  • policy 必须满足 GILE
  • 必须是Robbins-Monro 序列(前面有提到过):

\sum_{t=1}^{\infty}\alpha_t=\infty\\ \sum_{t=1}^{\infty}\alpha_t ^2 < \infty

  • 但是实际应用中,我们通常不管这两个条件的约束

Sarsa( \lambda )

正如从TD(0)到TD( \lambda )的变化,Sarsa( \lambda )类似:

  • n-step q-return: q_t^{(n)}=R_{t+1}+ \gamma R_{t+1} + ... \gamma ^{n-1} R_{t+n}+\gamma ^n Q_t(S_{t+n})
  • q^\lambda return : q^{\lambda}=(1-\lambda)\sum_{n=1}^{\infty}\lambda^{n-1}q^{n}
  • Forward-view : Q(S_t,A_t) \leftarrow Q(S_t,A_t)+ \alpha (q^\lambda - Q(S_t,A_t))
  • Backward view :
    • eligibility traces : \begin{align} &Initial: E_0(s,a) = 0\\ &Iterate: E_{t}(s,a) = \gamma \lambda E_{t-1} + 1(S_t=s,A_t=a) \end{align}
    • TD-error: \delta_t = R_{t+1} + \gamma Q_t(S_{t+1},A_{t+1})-Q_t{(S_t,A_t)}
    • q(s,a): Q(s,a) \leftarrow Q(s,a)+ \alpha(\delta_t E_t(s,a))

Pseudocode

主要的不同支出就在于要同时根据s和a来更新value

Seara( \lambda )比起 n-step的好处

我们以下面这张图为例:

  • 假设现在agent通过该路径走到了*处,得到了奖励,那么对于one-step sarsa,agent记录下一步reward,所以我们看到,只有一个方格有带方向的箭头(这代表Q(s,a)的值和的方向).
  • 而Sarsa(\lambda )做的什么事情呢?当他走到*这点的时候,他会遍历所有的<s,a>,并且把这次得到的reward,通过eligibility traces赋权,加给每一个<s,a>。所以我们能看到,只要一次的reward,所有人都能收益。因为每一个<s,a>的相关程度都被eligibility traces记录下来了!这使得他的更新更为高效!
  • 如果是n-step呢? 确实,如果n大一点的话,他能够取得和图三一样的效果,但是在更大的环境中,我们n取多少,都是不够大的。而可以解决这个问题!



Off-Policy Learning

  • Look over someone’s shoulder
  • Learn about policy from experience sampled from

Off-Policy是什么

  • Off-Policy 让我们能够基于某一个现成的policy,来求得最优解
  • 他有两种policy,分别是:
    • Behavior policy :用于生成行为的behavior policy 我们用表示 \mu ,这是我们已知的策略;我们根据behavior policy 来行动,behavior policy 是有机会到达任意的action的。
    • Estimation policy:用于评估和改善的estimation policy,我们用 \pi 表示,他是deterministic policy。这是我们未知的,要学习的策略,最后会收敛到optimal Policy。

Off-policy 的重要作用

  • 当你需要从其他的agent甚至human来学习时
  • 当我们需要重新利用以前学习到的policies的时候
  • 我们可以让机器不断的进行exploratory policy,进行不断的探索,在这个过程中得到我们的optimal policy。
  • 我们可以同时进行多种策略的学习

Importance Sampling

重要性采样是我们用来根据已知策略来学习未知策略的桥梁,首先,对于一个分布而言,我们可以用下面的方式来求其期望:

E_{X\backsim P}[f(X)]= \sum P(X) f(X)

其中f(X)相当于:当随机变量为X时(X可能是一个state ,也可能是一个<s,a>),我们的value,而P(X)则对应这个随机变量发生概率。现在,假设P是我们需要估计的policy,而我们还有一个已知的策略 \mu ,我们设其概率分布函数为Q,则有:

\begin{align} E_{X \backsim P}[f(X)] &= \sum P(X)f(X)\\ &=\sum Q(X) \frac{P(X)}{Q(X) }(f(X))\\ &=E_{X \backsim Q} [\frac{P(X)}{Q(X) }f(X)] \end{align}


  • E_{X \backsim P}[f(X)] 的含义:它意味着,我们使用P这个策略进行采样,得到的一系列样本X,我们取这些样本的value的平均值,所以实际上,每一个随机变量的发生概率P(X),已经在我们采样的过程中隐含了,最后我们在计算某一个状态X的概率的时候,实际上就是把这个状态的采样结果直接累加而已,不用显式的把P(X)拿来计算。
  • 我们要做什么?我们现在知道了某一个策略函数Q(X)和用它进行的采样结果f(X), 希望用它来估计当前策略函数P(X)下对于随机变量X的value 也就是价值函数期望,也就是求 E_{X \backsim P}[f(X)] ,但是我们没有实际使用P(X) 的概率分布进行采样,那么,我们便可以通过使用Q(X)这个策略得到的f(X), 经过 \frac{P(X)}{Q(X)} 加权的形式,,来完成价值函数期望的估计。

我们下面具体在MC和TD两种情况下分析:

Off-Policy Monte-Carlo

Monte-Carlo 的一大问题就在于,她需要在整个episode结束之后再进行更新,我们现在通过策略来生成一个episode,并且得到其 G_t , \pi 是我们预估的policy,我们想得到在这个episode中,如果使用 \pi 去跑(现在我们空有这个策略,但是不去跑),应该得到多少的return,也就是我们现在要求得 G_t^{\frac{\pi}{\mu}} ,来更新我们的V(s), 根据Importance Sampling:

G_t^{\frac{\pi}{\mu}}=\frac{\pi(A_t|S_t)}{\mu(A_t|S_t)} \frac{\pi(A_{t+1}|S_{t+1})}{\mu(A_{t+1}|S_{t+1})}...\frac{\pi(A_T|S_T)}{\mu(A_T|S_T)} G_t

接着,我们可以通过求得的 G_t^{\frac{\pi}{\mu}} 进一步更新我们的V(s) 或者Q(s,a):

V(S_t)=V(S_t) + \alpha (G_t^{\frac{\pi}{\mu}}-V(S_t)))

这里我们可以看到两个特点:

  • \mu 在任何情况下不能为0,他必须是一个soft policy,否则我们的 \pi 的某些状态就没办法被评估和优化。
  • 如果一个episode很长,会有多次的噪音累加,所以他的方差很大,尤其在早期中,这样迭代的效率很慢

Off-Policy Temporal Difference

在时序差分法中,我们使用 \mu 的策略来生成一个episode,并且得到他的TD target: R_{t+1}+\gamma V(S_{t+1})

同样的,我们现在要做的是,如果我们用策略 \pi 去执行这个action,那么,他所得到的TD target 会和我们真实产生的target相同嘛?如果不相同,可信度是多少呢,同样利用importing sampling的公式,我们给这个target加一个权重,表示对他的可信度:

\frac{\pi(A_t|S_t)}{\mu(A_t|S_t)}(R_{t+1}+\gamma V(S_{t+1}))

如果前面的权值比例为1,说明现在我们的 \pi 会和 \mu 执行完全一样的动作,所以完全相信他,反之,则完全不信他,我们接下来把他带入进行更新:

V(S_t)=V(S_t)+\alpha (\frac{\pi(A_t|S_t)}{\mu(A_t|S_t)}(R_{t+1}+\gamma V(S_{t+1})) - V(S_t))

Off-Policy Q-Learning

Review

Q-learning 的特点就是,他不再使用importance sampling。我们使用behavior policy 生成实际的action A_{t+1} \backsim \mu(\centerdot|S) , 但是,使用我们的estimation policy 来生成后继的action A’ \backsim \pi(\centerdot|S) 。这就相当于,如果我现在像他一样采取 A_{t+1} ,到达了某个状态 S_{t+1} ,但是之后我要用我的estimation 的策略所来执行下一个动作,并根据这个来评价当前动作的好坏。具体的公式如下:

Q(S_t,A_t) = Q(S_t,A_t) + \alpha( R_{t+1} +\gamma Q(S_{t+1},A') -Q(S_t,A_t) )

在更新公式中, S_t 是我们的原本的状态,At是我们的behavior policy 实际采取的action,这之后,他会得到对应的reward R_{t+1}, 并且到达 S_{t+1} 。那么,现在我们根据我们的 estimation policy,求得: 当前状态下,对于 estimation policy 他会采用的代替策略:A', 输出对应的 Q(S_{t+1},A') , 因为这是,如果estimation policy真实行动所采取的policy,我们现在要优化的是这个policy。这样,就做到了Off-Policy 的更新了。

所以接下来的问题是,estimation policy 策略如何得到A'呢?

Special Case of Q-Learning

我们使用 greedy policy 作为 \pi (当然你也可以构想其他的方案)也就是:

\pi(S_{t+1}) = arg \max_{a'} Q(S_{t+1},a')

使用 \epsilon -policy 作为 执行策略 \mu ,这样,我们可以把更新公式简化为:

\begin{align} &R_{t+1} + \gamma Q(S_{t+1},A')\\ =&R_{t+1} + \gamma Q(S_{t+1},arg \max_{a'}(S_{t+1},a'))\\ =&R_{t+1} + \gamma \max_{a'} Q(S_{t+1},a') \end{align}

我们可以得到对应的算法伪代码

Comparation between Sarsa and Q-Learning

我们以此图为例来说明 Q-learning 比起 Sarsa的优点在哪,这幅图很简单,我们要尽快的从S到G,中间的 The Cliff 是不能被碰到的。我们先看结果,

  • Sarsa 最终 得到的 reward 高于Q-learning
  • Q-learning 得到了optimal path 而 Sarsa 得到的是safe path

造成这个是 \epsilon -policy导致的,Sarsa使用 \epsilon -policy进行 执行和预估,我们回顾一下Sarsa的更新公式:

\begin{align} Q(s,a) &= Q(s,a) + \alpha \delta e(s,a)\\ &=Q(s,a) + \alpha e(s,a) (r + \gamma Q(s',a') -Q(s,a)) \end{align}


关键在于,这里的 Q(s',a') , 他是来自相同的策略, \epsilon -policy。也就是说,他有一定的概率走向一个随机的方向,在optimal path的时候,这个随机的方向会导致agent撞到cliff,进而导致在这个位置的Q(s,a)低于远离 cliff的Q(s,a),因为离cliff越远,agent撞到cliff的概率越大,久而久之,他就发现safe path更适合它。

而Q-learning相反,我们同样回顾一下他的更新公式:

\begin{align} Q(s,a) = Q(s,a) + \alpha (r + \max_{a'}Q(s',a') - Q(s,a)) \end{align}

他的Q的求解是来自 greedy的,在更新一个状态的Q(s,a)的时候,他预估这个状态的整体价值,采用的是邻接状态的最大价值,所以说,并不会把撞墙的损耗纳入计算,所以他最后能够直接得到 optimal path。

另一方面,由于得到的policy和behavior policy是分开的,所以Q-learning实际执行的仍然是 \epsilon policy,所以他有一定的概率撞到cliff,所以平均下来,其reward自然比较低。


Summary

编辑于 2018-01-18

文章被以下专栏收录