q learning简单理解_如何用简单例子讲解 Q learning 的具体过程?

想了解更多好玩的人工智能应用,请关注公众号“机器AI学习 数据AI挖掘”,”智能应用"菜单中包括:颜值检测、植物花卉识别、文字识别、人脸美妆等有趣的智能应用。。

e8de0c8a57237b9a441318f193eccc03.png

一、Bandit算法回顾,MDP简单介绍

首先,我们指出在bandit算法中主要有两类流行的算法,一类是贪心算法(如uniform exploration, 640?wx_fmt=svg -greedy算法),还有一类是基于upper confidence bound的UCB算法。他们二者的具体差别在哪里呢?简单来说,就是他们二者对exploration和exploitation的分配思路不太一样。对这方面不太熟悉的同学,可见:

覃含章:在线学习(MAB)与强化学习(RL)[2]:IID Bandit的一些算法zhuanlan.zhihu.com68f96d508a54c3c37497adb164780836.png

话又说回来,在经典bandit算法当中,我们要做的无非就是通过一类pull arm的策略,尽快找到比较好的“arm”(reward较高的arm),然后尽可能多的去拉这些比较好的arm就是了。贪心算法无非就是永远以当前对每个arm的reward的估计直接作为依据,而UCB算法则是考虑了置信度的问题,因此考虑的是每个arm reward的置信区间的上界。

那么这个思想推广到更一般的马尔科夫决策过程问题中,可不可以呢?答案自然也是可以的。具体来说,我们考虑一般的episodic Markov decision process, 640?wx_fmt=svg 。其中 640?wx_fmt=svg 是所有状态(state)的集合,且状态数量有限, 640?wx_fmt=svg640?wx_fmt=svg 则是所有行动(action)的集合,行动数量也有限, 640?wx_fmt=svg640?wx_fmt=svg 则是每个episode中MDP状态转移的次数(因此这个MDP可以认为是finite horizon的)。640?wx_fmt=svg 就是我们熟知的状态转移矩阵(注意因为这里我们的状态和行动空间都是有限的,所以这个矩阵的维度也是有限的),即我们可以定义 640?wx_fmt=svg 来表示在 640?wx_fmt=svg 步中选择action 640?wx_fmt=svg 和处在state 640?wx_fmt=svg 情况下转移到其它state的分布。类似的,我们定义 640?wx_fmt=svg 为一个确定性的reward函数(与 640?wx_fmt=svg 有关)。

注意,我们这边考虑的是一个episodic MDP,也就是说这个MDP允许被重复很多个episodes。这也很好理解,比如我们如果要训练AlphaGo,那么每个episode就可以看作一局棋,我们势必要重复下很多盘棋才可能对一个比较好的下棋“策略”(policy)有所了解,而如果只下一盘或者很少盘数的棋,我们可能都没有办法对于怎么下棋这件事情,和不同的下棋策略赢的几率,有一个好的exploration。

那么我们就发现有两个核心的概念:

  1. 策略:policy的概念。在MDP中,我们定义一个policy 640?wx_fmt=svg640?wx_fmt=svg 个函数的集合:640?wx_fmt=svg 。也就是说,在每一步 640?wx_fmt=svg ,在不同的state下我们应该选择哪个action。

  2. 价值函数:value function的概念。这里我们需要定义著名的 640?wx_fmt=svg  function和 640?wx_fmt=svg  function。我们称 640?wx_fmt=svg 这个函数是在step 640?wx_fmt=svg 和state 640?wx_fmt=svg 上,根据policy 640?wx_fmt=svg 所能获得的期望剩余reward。也就是说, 640?wx_fmt=svg 。至于 640?wx_fmt=svg function,它和 640?wx_fmt=svg function主要的区别在于多一个自变量 640?wx_fmt=svg ,即,我们称 640?wx_fmt=svg 这个函数是在step 640?wx_fmt=svg 和state 640?wx_fmt=svg 上选择了action 640?wx_fmt=svg 之后,根据policy 640?wx_fmt=svg 所能获得的期望剩余reward。如果你对动态规划(dynamic programming)不熟悉,你可能会问,为什么要定义两个看起来很像的函数。一方面来说,这样子我们很方便就可以写出DP里著名的Bellman equation(或者说optimal induction,直接可以得到最优的policy的表达式);另一方面来说, 我们也可以说 640?wx_fmt=svg function就可以刻画DP本身的逻辑。而 640?wx_fmt=svg function则可以刻画我们实际算法做 640?wx_fmt=svg learning的作用对象。

本节最后说明,在我们的epsiode MDP setting,每个episode一开始,我们可以不失一般性地认为 640?wx_fmt=svg 是被某个adversary任意挑选(arbitrarily picked)的。


二、基于UCB算法的Q-learning

我们注意到,因为只是考虑有限的状态空间和行动空间,所以最优policy是一定存在的(这是DP的经典结果)。那么用 640?wx_fmt=svg function我们就可以刻画最优的policy 640?wx_fmt=svg :即让 640?wx_fmt=svg 对所有 640?wx_fmt=svg 的函数。因此,根据DP的最优迭代公式(Bellman equation),我们知道如下迭代成立:

640?wx_fmt=svg

注意这里我们用了简化的notation:640?wx_fmt=svg 如果你不熟悉DP,我们稍微来看一下这个迭代意味着什么。简单来说,核心是迭代的第二步,即最优的 640?wx_fmt=svg 函数的值应该是当前的reward 640?wx_fmt=svg ,加上最优的 640?wx_fmt=svg 函数从 640?wx_fmt=svg 步开始的值(这个在DP里面也叫做cost-to-go)。这其实也是DP所谓的tail-optimality。结合迭代的第一步说了最优的 640?wx_fmt=svg 函数值应该是 最优的 640?wx_fmt=svg 函数取得最好的action的值,即从后往前推,你在step 640?wx_fmt=svg 的时候,最优的policy就是要最大化 640?wx_fmt=svg 函数的值,也就是要最大化当前的reward加上从 640?wx_fmt=svg 步开始最优policy所带来的期望reward。这点,希望不熟悉DP的同学们好好体会。

dbde80f867ac443c557a27e1d1fef0a7.png

说明这一点更简单的例子见上图,即所谓的最短路(shortest path)问题。这个问题显然也可以看成是episodic MDP,在每个episode我们都想找到这个固定的图上的最短路,假设每两个节点之间我们事先不知道要花多少时间,而它符合某些随机变量的分布。那么,这个问题的最优policy显然就是满足tail optimality的,这是因为,如果我找到了一套走最短路的方法,那么很显然,即使我走到了途中某个节点,比如B,那么我从B走到F的最短路一定可以通过B->C + C->F的最短路(最优policy给出) 或者 B->D + D->F的最短路(最优policy给出)来比较得到。

那么说到这里,Q-learning的想法也就呼之欲出了。因为我们知道,如果我们能知道 640?wx_fmt=svg 的具体分布,我们马上就能求得 640?wx_fmt=svg ,也就能求出最优的policy。当然,实际情况中我们规定我们事先并不知道 640?wx_fmt=svg 的分布,我们能做的,只有在每个episode中的每步step,根据当前的state选择适当的action,并且根据我们选择的action随机(根据 640?wx_fmt=svg )跳到下个state,并且观察到对应的reward的一个sample。那么,一个很自然的想法,当我们收集了越来越多这些sample之后,我们就可以比较好的去估计这个 640?wx_fmt=svg 函数,估计好了这个 640?wx_fmt=svg 函数之后,我们的policy其实就是去最大化这个估计的 640?wx_fmt=svg 函数。嗯,思路其实就这么简单。

所以核心问题就是如何去估计这个 640?wx_fmt=svg 函数。如果沿用 640?wx_fmt=svg -greedy,自然意思就是直接用sample mean(对每个 640?wx_fmt=svg 来说)。而如果要用UCB的话,我们就需要对 640?wx_fmt=svg 函数求置信区间。这个自然就比bandit里面求置信区间要复杂了,因为 640?wx_fmt=svg 现在可不是什么IID的随机变量了,而是跟MDP有关的一个更加复杂的随机变量。好在Chi Jin, Zeyuan Allen-Zhu, Sebastien Bubeck, Michael Jordan这几个人最近确定了准确的形式把UCB的思想套用了过来(见开头的参考文献)。

6af16757660495e0d1ab3834bd03cb95.png
aed3471a68ec4030edf921a8abd07db8.png

他们的算法有两个形式,但其实大同小异,区别在于通过不同的集中不等式所需要的不同形式的upper confidence bound。简单来说,Bernstein不等式相比Hoeffding不等式还有对二阶矩的精细控制(即Algorithm 2中的 640?wx_fmt=svg 项),所以他们的Algorithm 2比起Algorithm 1能得到更好的regret bound。

不过我们这里因为只是谈一下大概的思想,所以后面只会具体提及Algorithm 1相关的分析思路。毕竟大的思想其实是一样的。这边我们看Algorithm 1,思路就如前面所说,是很直接的,算法中第7行就是如何对Q函数进行估计,一共有两项组成,第一项可以看成是优化算法中的momentum项,第二项就是核心的UCB bound迭代。这里我们注意到置信区间的长度,忽略log项,大概是 640?wx_fmt=svg 的, 640?wx_fmt=svg640?wx_fmt=svg 目前有的sample数量。那么当然,这边 640?wx_fmt=svg 步长的选取也是非常关键的。几位大佬机智地发现把步长取成 640?wx_fmt=svg ,而非传统一阶算法里常用的 640?wx_fmt=svg 就能得到满意的结果,意思就是单纯的uniform weight是不行的,而要给比较近的项更高的权重才可以。


三、一些分析

好了,本节我们就稍微具体看下Algorithm 1为什么可以work。尤其比如说步长为什么要选成 640?wx_fmt=svg 。当然这边也不可能照搬所有细节,所以想学完整proof的同学还是建议直接去翻原paper。

这边先重申下regret的定义(其实是expected regret,或者按照上次的说法是pseudo regret),很简单,就是

640?wx_fmt=svg

其中 640?wx_fmt=svg 是episode的总数, 640?wx_fmt=svg 就是我们算法在episode 640?wx_fmt=svg 所用的policy, 640?wx_fmt=svg 就是每个episode 640?wx_fmt=svg 最开始初始的state。

这边需要用一个额外的notation来说。我们让 640?wx_fmt=svg 表示在episode 640?wx_fmt=svg 的step 640?wx_fmt=svg 我们实际观察到的state和选择的action。然后如果我们让 640?wx_fmt=svg 表示episode 640?wx_fmt=svg 刚开始的 640?wx_fmt=svg 函数估计。我们就注意到Algorithm 1的第七行其实可以写成:

640?wx_fmt=svg

这个式子其实更能反应算法的本质:这也是Q-learning利用多个episode学习的关系式。对于分析来说,我们就希望能说明利用合适的步长 640?wx_fmt=svg ,我们这边估计出来的 640?wx_fmt=svg 相比 640?wx_fmt=svg 它的error不会累积地过于快。

对于步长,我们再定义这样一些量:

640?wx_fmt=svg ,

那么我们可以进一步把上面的式子展开,得到

640?wx_fmt=svg .

这边我们令 640?wx_fmt=svg 到第k个episode为止,在每个episode的第h个step,观测到 640?wx_fmt=svg 的次数, 640?wx_fmt=svg 则是之前在step 640?wx_fmt=svg 选择action 640?wx_fmt=svg 和处在state 640?wx_fmt=svg 的episodes。那么我们就发现,其实是这个量 640?wx_fmt=svg (当然它由 640?wx_fmt=svg 决定)来反应我们的Q-learning算法(Algorithm 1)对之前的UCB bound的权重分配。

2578ba20551ef92c015aca5d461e3b87.png

那么这边就有张图,画出了取不同 640?wx_fmt=svg 我们的 640?wx_fmt=svg 随次数增长的曲线。我们注意到相比我们最终选取的 640?wx_fmt=svg640?wx_fmt=svg 的步长完全是uniform分配的,不偏不倚,而 640?wx_fmt=svg 的步长则基本把所有权重都分配给了最近的15%左右的sample(对于分析来说,这个步长会导致很大的variance,导致过高的regret)。这么来看,我们选取的步长倒是显得比较中规中矩了~

具体来说,我们容易验证当 640?wx_fmt=svg ,我们有 640?wx_fmt=svg 对所有正整数 640?wx_fmt=svg 成立。而这也是每个episode我们能累计regret的阶,也就是说总共在这种步长下我们的regret累计最多也就是 640?wx_fmt=svg 的阶,而这算是个常数了。

那么之后的analysis都基于前面的式子,简单来说我们需要能够用 640?wx_fmt=svg 来bound住 640?wx_fmt=svg ,然后利用DP的迭代我们就能推出 640?wx_fmt=svg ,也就是regret的bound。具体的步骤其实也不算长,当然也不是说就可以一蹴而就,有兴趣的同学们可以自己先尝试推推看,然后再去看大佬在paper里的推法。

忽略log项,Algorithm 1可以得到 640?wx_fmt=svg 的regret bound( 640?wx_fmt=svg 是总共的步数),而Algorithm 2因为用了更精细的集中不等式,可以改进到 640?wx_fmt=svg 的regret bound。

之后再提一下他们得到的其它一些结果。主要还有两个:

1.他们构造了一个MDP的例子并说明 640?wx_fmt=svg greedy算法在这个例子上的regret至少是exponential的(exponential in 640?wx_fmt=svg )。这确实就说明在更一般的情形下640?wx_fmt=svg greedy和UCB算法在理论上的表现被进一步拉开了。。

2.他们也给了一个一般情形的lower bound,对任意算法,存在一个 640?wx_fmt=svg epsiode的MDP,使得算法的regret至少是 640?wx_fmt=svg 的。所以我们看到他们的Algorithm 2只和这个lower bound差了 640?wx_fmt=svg ,已经非常接近了。接下来就看谁能把这个gap close了,呵呵。

最后多说一句,其实bandit文献里面经常需要自己去”造“一些特殊的不等式然后算法配合之达到比较好的regret bound,这往往都是因为只控制一阶矩不够精细,需要引入二阶矩的一些精确估计才ok。当然可能有些人会觉得这些纯属是在玩bound,不过在bandit领域里应该都算是共识了。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值