zoukankan      html  css  js  c++  java
  • 强化学习中的无模型 基于值函数的 Q-Learning 和 Sarsa 学习

    强化学习基础:

    注:

    在强化学习中  奖励函数和状态转移函数都是未知的,之所以有已知模型的强化学习解法是指使用采样估计的方式估计出奖励函数和状态转移函数,然后将强化学习问题转换为可以使用动态规划求解的已知模型问题。

    强化学习问题由于采用了MDP数学形式来构建的,由此贝尔曼方程式是我们最常用的,如下:

    基础知识可参考:

    https://www.cnblogs.com/devilmaycry812839668/p/10306175.html

    =======================================================

    值迭代求解MDP

    最优性原理:

    最优性原理说的是一个序列问题中一个片段如果为最优的,那么其子片段也为最优。

    例如:

    最短路径问题中,如果  A  ->  B ->  C  ->  D  ->   E   ->  F  ->   G  是    A到B的最短路径,那么

    B到F的最短路径必为   B ->  C  ->  D  ->   E   ->  F

    C到E的最短路径必为      C  ->  D  ->   E  

    C到G的最短路径必为       C  ->  D  ->   E   ->  F  ->   G  

    根据最优性原理我们可以知道在任意一个最优决策过程中的任何子过程也必为最优决策,所以在任意一个决策step中我们的策略都应该是最优的,根据贝尔曼方程可知在任意状态的决策如果最优那么决策为唯一动作,即state-action 值最大的那个动作作为策略在该状态的选择动作,由此我们得出贝尔曼最优方程式如下:

    贝尔曼最优性方程:

     根据最优性原理贝尔曼方程我们可以知道最优决策必然满足贝尔曼最优方程,而贝尔曼最优方程也可反向推出满足贝尔曼最优方程的策略为最优决策。

    下图 参照西瓜书(周志华)

    使用 以上知识对MDP求解最优策略的方式我们叫做值迭代(即使用贝尔曼最优方程),本文不给出值迭代的具体算法步骤,因为不是本文重点,只给出其算法思想

     

     

    上图取自西瓜书

    =====================================================

     根据上面的知识我们知道了对于已知模型的情况(即对强化学习问题进行采样,先估计出状态转换概率和奖励函数,于是将强化学习问题转换为了MDP问题)可以采用值迭代的方式求解最优策略,这个知识点是我们推导出Q-learning的一个先知条件,下面介绍无模型的情况下如何求解最优策略(即不先对状态转换概率和奖励函数进行抽样估计)

     

     

    Gxy(s)  表示 第x试验中第y次出现状态s  这一时刻开始到  x 试验结束总共获得的累积奖励。

    蒙特卡洛采样是我们对  状态值V  进行直接采样的方法。

    蒙特卡洛采样:

    以下引自:

    https://www.cnblogs.com/devilmaycry812839668/p/10308770.html

    在MDP里评估策略的时候,由于奖赏和转移都是知道的,所以可以直接用这两个函数算评估值。现在这两个函数都不知道,那怎么办呢?

    这个Q值函数实际上是个期望,所以直接用采样来替代期望就可以了。换句话说,就是拿该策略在环境里面去跑,看跑出来什么结果。

     

    如此一来,我们就可以去评价一个策略的好坏。

    以蒙特卡洛采样进行对策略评估  是我们采用蒙特卡洛采样来解决强化学习的一种方法, 当然蒙特卡洛采样只能用来评估一种策略,那么我们在使用蒙特卡洛采样之前也必然需要有一个要被采样的策略才行,这里我们一般使用 epsilo-贪婪策略,当然初始的V值、Q值我们一般可以设置为0, 这样我们使用蒙特卡洛采样学习到的策略就是  epsilo贪婪策略。

    上图取自西瓜书

    上图说的意思是我们每一次采样,即对一次按照策略运行后的轨迹来更新该轨迹上的各 状态-动作 值,其更新方式(第六步)详细见下图:

     这里给出的两个图可以发现 西瓜书中的递增计算均值和下图的递增计算均值一个算的q值,一个是v值。

    假设是执行两次的action选择就结束,即         x0 ,  a0,   r1,  x1,        a1,   r2,  x2,      a2   r3,  x3 

     而我们进行了三次episode  :

    第一次:    x0 ,  a0,   r1,  x1,        a1,   r2,  x2,      a2   r3,  x3 

    第二次: x0 ,  a0,   r1,  x1,        a1,   r2,  x2,      a2   r3,  x3 

    第三次:    x0 ,  a0,   r1,  x1,        a1,   r2,  x2,      a2   r3,  x3 

    第一次的   x0   a0   分布为    state0   action1    

    第二次的   x0   a0   分布为    state0   action2

    第三次的   x0   a0   分布为    state0   action1

     那么   V(state0)=( (第一次的   r1+r2+r3) + (第二次的   r1+r2+r3)  +  (第三次的   r1+r2+r3) )/  3

    q(state0, action1)= ( (第一次的   r1+r2+r3)  +  (第三次的   r1+r2+r3) )/  2

    q(state0, action2)=    (第二次的   r1+r2+r3) 

    这就是区别, 由于我们在使用蒙特卡洛采样对epsilo贪婪策略采样之后需要对策略进行改进,而使用V值不能直接用来判断哪个动作选择更好,而q值可以,所以我们一般采样q值。

    策略改进就是 判断当前状态的那个q值高,则设置其为 贪婪策略的动作,  该种方式也叫做同策略的方式。

    根据上面的描述我们也可以知道我们最后学习到的策略  不是贪婪策略,而是  epsilo贪婪策略,但是在实际中我们在使用学习到的策略时会将其近似为贪婪策略,即不以epsilo的概率探索所有动作,而是直接唯一确定的选择最大q值的动作。

     

     有上述的算法步骤可以看出我们采用蒙特卡洛采样来学习强化策略时  一般采用的是  每次访问蒙特卡洛方法

    还有一个需要注意的地方是  每次按照现有的策略  进行一次采样(一个episode, 从开始状态,开始状态集合中的一个状态开始进行采样到该episode结束),我们对采样过程中的每个q(s,a)进行更新,这时候整个策略也就发生了变化,因为涉及到的  q(s,a)  变化后  状态s的最大q值 选择的  action 是可能发生变化的。所有我们在每次对一个episode采样后都是需要更新策略的。这里由于我们采样的策略为epsilo贪婪策略,而更新的仍是epsilo贪婪策略,于是称这种方式为同策略的蒙特卡洛采样的强化学习方法。

    问题:

    我们最终需要得到的策略是确定性策略,我们获得或者说是学习到的策略是不确定策略(epsilo贪婪策略),最终输出的策略是将epsilo策略进行估计,给出贪婪策略,即确定性策略。

    根据bandit problem 我们知道epsilo贪婪策略是解决有限次采样并保证较大可能获得最优选择的一种在采样时带有探索能力的方法,而在bandit problem中我们要求所有采样过程中所获得的reward总和尽量最大, 而在蒙特卡洛采样问题中却没有这个要求,问什么说这两种情况下是等价的,所以都使用epsilo贪婪策略来进行探索?我们知道在蒙特卡洛采样的强化学习方法中我们并不是一定要知道哪个q(s,a)的值一定是多少,而是要知道在不同状态s下 最大的那个q(s,a)所对应的a是什么,那么我们可不可以全部采用探索策略来采样呢,也就是说在有限次的采样中,如100次,有动作a1和动作a2,我们对q(s,a1)采样50次, q(s,a2)采样50次,这样会不会更好呢?如果说真实的q(s, a1)和q(s,a2)相差较大 我们没必要都采样50次,这样的话浪费了太多的采样在较小的q值对应的action上, 而q(s, a1) 和  q(s,  a2) 相差较小 我们各采样50次,可以保证  q(s, a1) 和  q(s,  a2)的方差较小,但是偏差较大,这时反而更是无法判断q(s, a1)和q(s, a2)到底哪个更大哪个更小。这就涉及了这么一个问题,在有限次的采样中 如何判断  q(s, a1) 和  q(s, a2) 哪个更大?

    如果全部都采样q(s,  a1)  无疑  q(s,  a1) 偏差最小, 全部都采样q(s,  a2)  无疑  q(s,  a2) 偏差最小,  但是我们只采样q(s, a1)的时候  q(s,  a2)=0 ,    只采样q(s, a2)的时候  q(s,  a1)=0 ,    这时候我们会以较大的不确定性选择动作,即对q(s, a1)采样100次是就肯定选择a1, 反之选择a2 ,  该种方法采样出的确定性策略具有较大的变动性,所以不选择。

    而各选50次,导致确实各q值都得到了充分探索,但是各个q值都具备较大偏差(因为各个q值采样都不充分),但方差较小 ,方差不好说,或许也很大,但是这种情况我们难以判断具体哪个q值更大,所以选择具有较大变动和不确定性。每个q值由于都采样不充分,所以导致每个q值距离真实的q值都有较大偏差,无法判断哪个q值最优,即使采样后最大的q值由于其采样的不充分我们都无法确认该值一定准确,由此无法判断该值是否一定为最优选择。

    而采用 epsilo贪婪策略, 可以尽量在有限次采样过程中使各q值偏差较小(即都得到一定程度上的采样),使各q值不会有较大偏差。epsilo贪婪策略可以是最大的q值偏差较小,其他q值也能得到一定采样(各q值相差较大的情况),   各q值相差较小的情况 使各q值得到充分采样的同时也会较准确的采样出最大q值。

    我们采样的遵循原则就是在有限次采样过程中,能更多的采样到最优决策路径

    如下图,更多的采样到最优策略的决策路径,这需要 第一,采样中知道哪个路径最优, 第二,要最优的那个路径尽量多采样。由此我们发现这个问题和bandit problem是相同的,都是在有限次采样中更多的采样到最优的那个选择。

     为了找出那一条决策路径最优,我们希望该条路径能尽可能的多被采样,以此保证该路径为最优决策路径的可信性,由此我们采用epsilo贪婪策略。

    另一种观点是为找出最优决策路径,不仅应使目前显示最优的路径被多采样,如果其它路径采样次数过少的话也应该多采样,于是有了UCB方法。

    还有一种观点认为如果最优路径和其它路径值相差过大的话则应该加大对最优路径的采样次数,于是有了soft采样方法。

    有效采样次数中,为找出最优路径,首先应该保证最优路径被采样到较多次数,以此其结果可信,偏差较小, 同时也应该使其它路径也采样到一定次数。

    对最优路径的采样可以看做是利用操作,对其它路径的采样可以看做是探索操作

     问题?

     在有限次采样过程中,最优路径选择的次数最大化   和   路径选择获得的收益总和最大化   是否等价?

    最优路径选择的越多   我们或者的收益总和的期望值  越大,   假设第一回100次采样 a,   b  两个动作, 第二回也100次采样 a,   b  两个动作, 

    假设a动作的路径回报最大(期望值最大),第一回选择a动作55次, b动作45次,分别收获 120,100  。

    第二回选择a动作55次, b动作45次,分别收获 90, 95  。

    也就是说最优动作选择的越多,不一定收获的总和就最多,但是从期望上看确是最多的。

    ==========================================================

     

       在这一策略状态下的期望为     , 策略为epsilo贪婪策略。

    所以

    而在q_learning  中我们使用    max q(s,  a)  估计   V(s)  ,

    而在 saras   中  我们使用   epsilo贪婪策略选择 q(s,  a) 来估计   V(S),   其实   E( q(s, a) )=V(s)     (a 为状态S下的任意可选状态 ),因为是同策略,q(s,  a) 和  V(S) 都是指在当前策略下, 但是这时假设共有动作a1和a2   那么有 q(s, a1) 和  q(s, a2) , q(s, a1)和q(s, a2)并不是根据当前策略求得的,而是根据不断更新的策略采样累加获得的,根据非静态的递增迭代均值可以知道越是后采样的reward对q值影响越大,虽然    q(s, a1) 和  q(s, a2) 的期望不等于 V(s)  ,我们也可以使用epsilo贪婪策略选择  q(s, a1) 和  q(s, a2)  来代替 选择 q(s,  a) 来估计   V(S) , 从而估计当前策略下的单次的episode的采样reward总和。

    之所以需要用   q(s,a) 来估计   V(S)  是因为即使在当前策略下 假设s状态有动作a1和a2   那么有 q(s, a1) 和  q(s, a2) 也无法算出  V(S)  ,  这是因为 q(s, a1)和q(s, a2)并不是根据当前策略求得的,而是根据不断更新的策略采样累加获得的。

     

  • 相关阅读:
    【笔记】C++自学笔记系列02:类的组合与类的友元
    【windows程序设计】系列02:显示屏幕分辨率
    【笔记】C++自学笔记系列01:基础知识
    【windows程序设计】系列03:窗口与消息
    【windows程序设计】系列04:文本输出
    【Boost】系列05:数值与字符串转换
    【windows程序设计】系列01
    【Boost】系列04:实用技巧之禁止类拷贝构造和赋值
    【gdb】基本操作
    性能测试基本流程介绍(《软件性能测试过程详解与安全剖析》)
  • 原文地址:https://www.cnblogs.com/devilmaycry812839668/p/10486497.html
Copyright © 2011-2022 走看看