深度强化学习系列(二):强化学习基础

交流请加群:580043385

我的知乎专栏同步发布:https://zhuanlan.zhihu.com/p/22542101


转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/53031551


本文是强化学习的基础,主要参考 Divid Silver 教程,Reinforcement Learning:An Introduction,以及周志华的西瓜书。


可能之前大家已经听过了强化学习的介绍,因此,我首先问几个问题:

  1. 强化学习和MDP过程是一回事吗?

  2. 强化学习和监督学习的区别是什么?

  3. 什么是值迭代,什么是策略迭代?

  4. 有模型和无模型的强化学习的各自有什么样的学习方法?

  5. 强化学习和深度学习其实很早就有了,为什么深度强化学习到了2013才开始爆发?

总体理解:


强化学习指的是在一系列的情景之下,通过多步恰当的决策来达到一个目标的学习过程,是一种序列多步决策的问题。强化学习的目标就是要寻找一个能使得我们获得最大累积奖赏的策略。强化学习的最终奖赏在多步动作之后才能观察到,可以看出强化学习有别于传统的机器学习,是不能立即得到标记的,而只能得到一个反馈,也可以说强化学习是一种标记延迟的监督学习。

强化学习任务通常通过马尔科夫决策过程来描述:对于处于环境E当中的状态为s(s属于状态空间S)的感知单元M,它采取某种动作a(a属于 动作空间A)达到另一状态s‘,得到的奖励为r(r属于奖励R);所以整个过程可以表示为:M=<S,A,S',R>。过程中执行的某个操作时,并不能立即获得这个操作是否能达到目标,仅能得到一个当前的反馈。因此需要 不断摸索,才能总结到一个好的策略 。摸索这个策略的过程,实际上就是强化学习的过程。

通常来讲每一个动作的奖励并不是以一个固定的值出现的,而是以一定的概率分布出现。因此,需要不断的去尝试出,到底各个动作的期望奖励是多少,这个过程被称作是探索(Exploration)的过程(这个过程一般来平均的去尝试每一种动作,通过很多次(越多越好,越准确)的尝试得到每一个动作的期望的结果,这种方式最大的问题是:你知道当前期望最高的奖励,但是为了探索你就失去了使用当前最好的机会);另一种方式被称作是利用(Exploitation),既然当前已经得到了最大期望的动作,那就直接使用它就好了(这种方式,应用了当前最好的策略,但是它仍然是以一定概率出现而已,说不定你还是得不到最大的;另一点,这样不去探索,万一最好的还在后面勒?)。


文章还是从一个周志华课本当中的例子开始:

摇臂赌博机是用来理解强化学习很好的一个例子,但是不足之处就是它一步就获得了最终的奖励。如图所示假设摇臂赌博机存在5个臂,玩家在投入一个硬币以后可以按下其中的一只臂。每个臂以一定的概率吐出硬币(假设吐出的个数分别为:5个,5个,10个,2个,2个),但是玩家并不知道。玩家的目的就是要通过一定的策略进行选择最大化收益,也就是得到尽量多的硬币。

在这个当中就开始采取探索和利用的方式。假设我很有钱,不怕花钱。于是我分别花了1000块测试了每一个摇臂出币的概率,最终测试的结果是1,2,3,4,5号臂分别出币的次数是100,200,100,50,150,那么我就可以知道每一个摇臂的出币的概率分别为:10%,20%,10%,5%以及15%。那么我们就知道在某一个状态下投入一颗币,采取选择第一只臂的策略得到的期望奖励值为:0.5个硬币,之后的摇臂依次为1个,1个,0.1个,0.3个。

那么在接下来,我们直接采取其中期望收益最高的2或者是3号策略就好了。那么其实我们会发现也许要发现这样一个分布情况,也不根本就不需要测试这么多次就可以得到。这样也是节约成本以及增加收益的一种方式。但是,你也可能会觉得,1000次还不够,尝试的次数越多越接近真实的概率,于是你在每一个臂上面测试直到一万次,然后之后的每一次都执行其中期望最大的策略。

其实我们在探索的过程中也是摇消耗资源的,因此从最大收益的角度讲,大量的进行探索并不是一种好的策略;而不进行探索也是差的策略。因此采用: ϵ \epsilon -greedy算法: 就是以 ϵ \epsilon  的概率进行探索,采用1- ϵ \epsilon 的概率使用当前最好的策略。这样是在探索和利用当中的一个平衡。

我们这样来表示摇臂k在经历过n次尝试以后得到的平均奖励:

 上式当中需要记录每一次的奖励值,显然更加高效的方式是引入增量式计算,记录好上一次的平均奖励,然后用这次的收益来更新平均奖励: 

MDP:

马尔科夫决策过程可以表示为:M=<S,A,Pss′,S',R> :

状态集合S: 有限状态state集合,s表示某个特定状态

动作集合A: 有限动作action集合,a表示某个特定动作

状态转移矩阵P: 矩阵每一项是从S中一个状态s转移到另一个状态{s’}的概率

Pss′=P[ S t + 1 S_{t+1} =s′| S t S_{t} =s]以及执行动作a后从一个状态转移到另一个概率为

Pss′a=P[ S t + 1 S_{t+1} =s′| S t S_{t} =s, A t A_{t} =a]。这里的状态转移矩阵决定了马尔可夫性质,即未来状态只与当前状态有关而与过去状态无关。矩阵一行之和为1。

策略π: 状态s下执行动作a的概率,π(a|s)=P[ A t A_{t} =a| S t S_{t} =s]

reward函数R: 这个函数是immediate reward的期望,即在时刻t的时候,agent执行某个action后下一个时刻立即能得到的reward R t + 1 R_{t+1} 的期望,它由当前的状态决定。

discount γ:Gt是t时刻之后未来执行一组action能够获得的reward,即t+1、t+2、t+3…未来所有时刻reward之和,是未来时刻reward在当前时刻的体现,但是越往后的时刻它能反馈回来的reward需要乘以一个discount系数,系数γ∈[0,1]会产生一个打折的效果,这是因为并没有一个完美的模型能拟合出未来会发生什么,未来具有不确定性,同时这样计算会方便,避免了产生状态的无限循环,在某些情况下,即时产生的reward即  R t + 1 R_{t+1} 会比未来时刻更值得关注,符合人的直觉。因此 G t G_{t} =Rt+1+γRt+2+…

状态值函数V(s): 即基于t时刻的状态s能获得的return的期望,V(s)=E[ G t G_{t} | S t S_{t} =s]

,这里是仅按照状态转移矩阵选择执行何种动作,如果加入动作选择策略,那么函数就变成 V π V_{\pi} (s)= E π E_{\pi} [ G t G_{t} |St=s]

动作值函数 Q π Q_{\pi} (s,a): 基于t时刻的状态s,选择特定的一个action后能获得的return期望, 这里的选择过程就隐含加入了策略。

Q π Q_{\pi} (s,a)= E π E_{\pi} [ G t G_{t} |St=s,At=a]


状态值函数& 状态-动作值函数

强化学习是通过奖励或惩罚来学习怎样选择能产生最大积累奖励的行动的算法。为了找到最好的行动,非常有效的方式是,找到那些奖励最大的状态就好了,即在我们目前的环境(environment)中首先找到最有价值的状态states。例如,在赛车跑道上最有价值的是终点线(这里好像就是你冲刺要达到deadline的前一步,这个状态肯定最有价值),这也是奖励最多的状态,因此在跑道之上的状态也比在跑道之外的状态更有价值。(其实这里面就是递归的思想,当你找到了最有价值的状态,你只需要想办法得到这个状态就好了)

最有价值的state可能不只一个,一旦我们确定了哪些状态是最有价值的,我们就可以给这些状态赋奖励值。例如,当赛车偏离跑道时,这些状态就被赋予惩罚;而当赛车跑完一圈时,就会收到一个奖励;当赛车跑出当前最短的时间时,也会收到一个奖励;等等。

我们可以将这些状态和奖励当成一个离散函数,比如在跑道上每隔100m就设定为一个状态点,距离越近的状态价值越高。文章中是把跑道看作 1×1 的方格。对应到这些方格中的奖励就可以用数字表示。例如目标状态的奖励可能为 10,而偏离跑道的方格的惩罚为 -2,其它方格的奖励为 0。最佳的行动是让函数的值越高越好(即最大奖励)的行动。

这些状态中,有些中间状态并不一定有奖励(奖励为 0),但是这些状态是通向奖励状态的必经之路。例如,你必须在跑完一圈之前转弯,或者必须跑完一圈才有机会跑出最短时间。而对于越是接近于终点的状态则可以设置比较高的reward,这也是比较合理的。

需要注意的一点是值函数求解的是一个 累积奖励,通过找到最大的值的状态,然后朝着这个方向前进,但是想想是有问题的:在一场的跑步比赛当中距离终点很远的一个状态只要朝着目标前进,它的奖励值也会很大。但是这显然不合理。因此,在值函数当中会引入一个折扣因子discount Factor,由此使得离他较远的状态给他的奖励贡献是比较小的。因此,折扣因子是一个0~1之间的数,,并且随着距离的增加,这个值会越来越小。当折扣因子为 0.5 时,仅经过 3 次状态改变,奖励值就会变成初始值的八分之一,所以 agent 更倾向于搜索临近状态的奖励值。(其实不加discount factor,累积的时候除以总的迭代次数的倒数也是一样的道理)

状态值函数就是对处在某一种状态下的期望收益的函数描述,可以表示为:

其实他可以理解为在某种状态使用某种策略得到的一种期望收益。

通过Bellman方程我们可以推导到一个非常简单的表达:

 

每一种策略其实有对应各种的执行动作,我们通过某种具体的动作得到的值函数就称之为状态-动作值函数。

二者的关系和比较:

State-value function 优化的目的是为了得到当前状态s的最大的奖励,也就是会穷尽所有的策略来得到一个最大值;Action-value function 优化问题的目的是求解出当前状态s和当前动作a的情况下求解出最大的奖励值,也就是说穷尽所有的策略找到一个最优的策略使得Q函数最大。这二者具有很强的相关性。假设我知道一个当前最好的动作action a*,那么显然q(s,a*)>= v(s)。因此,问题转化为: 


策略迭代和值迭代

在对深度强化问题进行建模以后,我们开始求解最优的策略。求解的方式主要有两种:1. 策略迭代2.值迭代

对两种算法进行理论的说明:

策略迭代式最直观的方式,解决途径主要分为两步,示意图见图1:

· Policy Evaluation:基于当前的Policy计算出每个状态的value function

· Policy Improvment:基于当前的value function,采用贪心算法来找到当前最优的Policy

下面通过两个例子来说明:

      

图中的标号表示各个状态,其中所有的单步状态转移得到的reward 为-1,每一个运动方向的概率都是1/4. 目标是:以最好的策略从状态方格的任意一个位置达到 阴影的位置 。例如: 我现在处在状态5,经过强化学习告诉我,最好的移动策略是什么。 

我们对每一个状态下的值函数进行初始化,然后进行策略迭代。我们发现第一次迭代,除了目标的位置,所有的位置的值函数由于状态转移的奖励都是-1因此,全部变为-1. 我们继续的考虑第二次迭代,代入策略迭代的公式,得到如下的结果。我们来看其中的 -1.7的位置的计算方式:

                   

如上图所示,那k=2当中的例子来说明:-1.7 = -1.0 + 0*1/4+3*(1/4.0)*(-1.0)-2.0 = -1.0 + 4*(1/4.0)*(-1)第一个-1.0表示的是值函数当中的R,后面代表到下一个状态的值函数的值。

策略迭代包括两个步骤:1. 策略评估; 2.策略更新。策略评估当中即求出各个状态的值函数的值;策略更新则是在该状态下采取策略(图中所用的是greedy的策略,也就是找值最大的方向),知道多次迭代的策略都不在变化,如上图中k=无穷的时候,去计算每一个状态的值函数已经收敛了,也就是说策略不会再改变,但是实际上只要策略都没有再发生改变,就可以结束策略迭代得到最终的结果了。如下图所示:

                                                                 

再来看一个值迭代的例子:

                                                        

problem 中我假设某一个状态已经到达了g的位置,那么这一个状态就算是成功了,奖励值刚好为0;再看g右边的那个点,对它来说最好的策略是直接向左移动,g下方的那个点同理;再看g右二的那个点,最优的策略就是到达右一的位置,所以值为:-1(该步的状态转换)加上-1(下一状态的值函数的值)=-2. 同理,当得到右二为-2的时候就可以很快的得到右三位-3,如此进行迭代,得到最终的v7。得到每一个值以后,顺着值增大的方向就是各个状态state的决策方向了。

                                         


无模型学习

在免模型学习的情况下,策略迭代算法会遇到几个问题:

首先,是策略无法评估,因为无法做全概率展开。此时 只能通过在环境中执行相应的动作观察得到的奖赏和转移的状态、一种直接的策略评估代替方法就是“采样”,然后求平均累积奖赏,作为期望累积奖赏的近似,这称为“蒙特卡罗强化学习”。

第二,就是策略迭代算法估计的是 状态值函数(state value function) V,而最终的策略是通过 状态动作值函数(state-action value function) Q 来获得。模型已知时,有很简单的从 V 到 Q 的转换方法,而模型未知 则会出现困难。所以我们将估计对象从 V 转为 Q,即:估计每一对 “状态-动作”的值函数。

无模型并不是代表不能够被MDP来描述,而是指的当中的当中的参数是未知的。

1. 蒙特卡洛算法

一个简单的例子可以解释蒙特卡罗方法,假设我们需要计算一个不规则图形的面积,那么图形的不规则程度和分析性计算(比如积分)的复杂程度是成正比的。而采用蒙特卡罗方法是怎么计算的呢?首先你把图形放到一个已知面积的方框内,然后假想你有一些豆子,把豆子均匀地朝这个方框内撒,散好后数这个图形之中有多少颗豆子,再根据图形内外豆子的比例来计算面积。当你的豆子越小,撒的越多的时候,结果就越精确。

蒙特卡罗方法 不需要对环境的完整知识,仅仅需要经验就可以求解最优策略,这些经验可以在线获得或者根据某种模拟机制获得。经验其实就是训练样本,比如在初始状态s,遵循策略π,最终获得了总回报R,这就是一个样本。如果我们有许多这样的样本,就可以估计在状态s下,遵循策略π的期望回报,也就是状态值函数Vπ(s)了。蒙特卡罗方法就是依靠样本的平均回报来解决增强学习问题的。要注意的是,我们仅将蒙特卡罗方法定义在episode task上,所谓的episode task就是指不管采取哪种策略π,都会在有限时间内到达终止状态并获得回报的任务。比如玩棋类游戏,在有限步数以后总能达到输赢或者平局的结果并获得相应回报。

2. 时序差分算法

与基于 策略迭代 和 值迭代的算法相比,蒙特卡洛算法需要采样完成一个轨迹之后,才能进行值估计(value estimation),这样看,就感觉蒙特卡洛速度很慢啊!据说主要原因在于 蒙特卡洛没有充分的利用强化学习任务的 MDP 结构。但是, TD 充分利用了 “MC”和 动态规划的思想,做到了更加高效率的免模型学习。

MC 的本质是通过多次采样后计算平均 作为期望累积奖赏的近似。但是由于是 一个轨迹采样完成后 才对各个 状态-动作对进行更新,所以是属于“批处理”的方式,那么怎么将其改成 online版本的呢?从而实现 增量的更新?

众所周知 Online版本的算法与 批处理很大的不同在于, online可以实现 一个一个的递增的更新,那么此处就有:

不妨假设在 第 t 次采样的时候,已经估计出 值函数 Q(s, a),则在第 t + 1 次采样的时候,就有:

Q t + 1 π ( x , a ) = Q t π ( x , a ) + 1 t + 1 ( r t + 1 Q t π ( x , a ) ) Q_{t+1}^{\pi} (x, a) = Q_{t}^{\pi} (x, a) + \frac{1}{t+1}(r_{t+1} - Q^{\pi}_t (x, a))  

r

猜你喜欢

转载自blog.csdn.net/u012192662/article/details/53031551