1、时序差分法基本概念

  虽然蒙特卡洛方法可以在不知道状态转移概率矩阵的前提下,灵活地求解强化学习问题,但是蒙特卡洛方法需要所有的采样序列都是完整的状态序列。如果我们没有完整的状态序列就无法用蒙特卡洛方法求解。此外蒙特卡洛方法的高方差依然存在。

  时序差分法简称为TD法。TD法是一种结合蒙特卡洛法和动态规划法的方法。从算法的结构来看,TD法和蒙特卡洛法类似,都是“无模型学习” 的方法,也同样通过采样模拟交互序列的方法进行求解。

  时序差分法和蒙特卡洛方法的区别主要有:

  1)蒙特卡洛方法要等到最后结果才能学习,而时序差分法可以在任一阶段进行学习,具有更快速更灵活的更新状态进行估值。

  2)时序差分法是基于即时奖励和下一状态的预估价值来替代当前状态在状态序列结束时可能得到的回报,是当前状态价值的有偏估计。而蒙特卡洛法则使用实际的收获来更新状态价值,是某一状态价值的无偏估计(注:其实这里的本质上是是否求期望的问题,蒙特卡洛通过采样多条序列来求期望,可以代替总体样本的无偏估计,但是因为序列的多样性导致方差较大,而时序差分法是直接预估下一状态的值来更新当前状态的值函数,这种预估本身就和真实值存在一定的偏差,但也因为只用到了下一状态的值,因此随机性较小,方差相对来说更小)。

  3)时序差分法的方差较蒙特卡洛方法更小,且对初始值敏感,但比蒙特卡洛方法更高效。

  时序差分法不止是有单步序列,还可以扩展到N步,当N足够大,甚至趋于无穷时,就等价于蒙特卡洛方法了。

  时序差分法可以分为在线策略(on-policy,也可称为同策略)和 离线策略(off-policy,也可称为异策略)。目前在线策略最常见的算法是SARSA算法,离线策略最常见的是Q-Learning算法。

  在线策略和离线策略主要的区别在于:

  1)在线策略中当前状态下的动作选择和下一状态下的动作选择一般都是 $\epsilon - greedy$ 法(注:下一状态的动作选择决定了下一状态的Q值,而下一状态的Q值是TD目标中的一部分);

  2)离线策略中当前状态的动作选择用$\epsilon - greedy$ 法,而下一状态的动作选择用贪婪法。

2、SARSA算法

  SARSA算法从名字上看起来有些奇怪,实际上它是由五个关键因子组成的:

  S:当前状态

  A:当前行动

  R:模拟得到的奖励

  S:模拟进入的下一个状态

  A:模拟中采取的下一个动作

  SARSA算法中只涉及到上面五个变量。算法表达式如下:

    $q(S,A) = q(S,A) + \alpha(R+\gamma q(S',A') - q(S,A))$

  从上式中可以看到价值函数的更新之和当前奖励 $R$ 和下一状态的价值函数 $q(S',A')$ 有关。

  SARSA算法的具体流程如下:

  1)随机初始化所有的状态和动作对应的价值函数 $q$ ,对于终止状态的 $q$ 值初始化为0。

  2)开始迭代,初始化 $S$ 为当前状态序列的第一个状态,设置 $A$ 为 $\epsilon$ - 贪婪法在当前状态 $S$ 选择的动作。

  3)在状态 $S$ 下执行当前动作 $A$ ,得到新状态 $S'$ 和奖励 $R$。

  4)用 $\epsilon$ - 贪婪法在状态 $S'$ 选择新的动作 $A'$。

  5)更新价值函数 $q(S,A)$:

    $q(S,A) = q(S,A) + \alpha {R+\gamma q(S',A') - q(S,A)}$

  6)一直迭代直至所有的$q(S, A)$收敛,在这里步长 $\alpha$ 一般需要随着迭代的进行逐渐变小,这样才能保证动作价值函数收敛。

  SARSA算法相比蒙特卡洛算法并不会更好,虽然方差降低了,但是偏差高。简单来说,SARSA算法和蒙特卡洛法代表了两个极端:一个为了追求极小的方差而使得偏差大;另一个为了缩小偏差而导致方差大。

3、Q-Learning算法

  Q-Learning算法大体上和SARSA算法相同,唯一不同的就是在进行价值函数更新时,SARSA在状态 $S'$ 时采用 $\epsilon$ - 贪婪法选择 $ A'$ ,而Q-Learning 算法在状态 $S'$ 时直接采用常见的贪婪法选择 $A'$ ,也就是选择是的动作价值函数 $q(S',A') $最大的动作。

  Q-Learning 算法的公式如下:

    $q(S,A) = q(S,A) + \alpha(R+\gamma \max_a q(S',A') - q(S,A))$

  Q-Learning 算法的具体流程如下:

  1)随机初始化所有的状态和动作对应的价值函数 $q$ ,对于终止状态的 $q$ 值初始化为0。

  2)开始迭代,初始化 $S$ 为当前状态序列的第一个状态,设置 $A$ 为 $\epsilon$ - 贪婪法在当前状态 $S$ 选择的动作。

  3)在状态 $S$ 下执行当前动作 $A$ ,得到新状态 $S'$ 和奖励 $R$。

  4)用 常见的贪婪法在状态 $S'$ 选择新的动作 $A'$。

  5)更新价值函数 $q(S,A)$:

    $q(S,A) = q(S,A) + \alpha(R+\gamma q(S',A') - q(S,A))$

  6)当价值函数更新后,新的状态为 $S'$ ,之前基于常见的贪婪法选择的 $A'$ 要重新基于 $\epsilon$ - 贪婪法去选择(也就是说价值最大的动作只是在更新价值函数时使用,不会真正执行,最后真正执行的动作还是要基于 $\epsilon$ - 贪婪法)。

  7)一直迭代直至所有的$q(S, A)$收敛,在这里步长 $\alpha$ 一般需要随着迭代的进行逐渐变小,这样才能保证动作价值函数收敛。

  在时序差分的方法中,我们把TD目标看作是最优策略(TD目标是$R_t + \gamma V(S_{t+1})$,事实上随着策略的更新,TD目标一直是变化的)。Q-Learning直接学习的是最优策略,而SARSA在学习最优策略的同时还在做探索。这导致我们在学习最优策略的时候,如果用SARSA,为了保证收敛,需要制定一个策略,使$\epsilon$ - 贪婪法的超参数$\epsilon$ 在迭代的过程中逐渐变小。Q-Learning没有这个烦恼。

  另外一个就是Q-Learning直接学习最优策略,但是最优策略会依赖于训练中产生的一系列数据,所以受样本数据的影响较大,因此受到训练数据方差的影响很大,甚至会影响Q函数的收敛。

  在学习过程中,SARSA在收敛的过程中鼓励探索,这样学习过程会比较平滑,不至于过于激进,导致出现像Q-Learning可能遇到一些特殊的最优“陷阱”。

  在实际应用中,如果我们是在模拟环境中训练强化学习模型,推荐使用Q-Learning,如果是在线生产环境中训练模型,则推荐使用SARSA。

  对于Q-Learning和SARSA这样的时序差分算法,对于小型的强化学习问题是非常灵活有效的,但是在大数据时代,异常复杂的状态和可选动作,使Q-Learning和SARSA要维护的Q表(注:Q表实际上就是存储当前问题的状态空间和动作空间下的所有状态-动作对的值函数)异常的大,甚至远远超出内存,这限制了时序差分算法的应用场景。在深度学习兴起后,基于深度学习的强化学习开始占主导地位。

强化学习(三)—— 时序差分法(SARSA和Q-Learning)的更多相关文章

  1. 强化学习三:Dynamic Programming

    1,Introduction 1.1 What is Dynamic Programming? Dynamic:某个问题是由序列化状态组成,状态step-by-step的改变,从而可以step-by- ...

  2. 强化学习(五)用时序差分法(TD)求解

    在强化学习(四)用蒙特卡罗法(MC)求解中,我们讲到了使用蒙特卡罗法来求解强化学习问题的方法,虽然蒙特卡罗法很灵活,不需要环境的状态转化概率模型,但是它需要所有的采样序列都是经历完整的状态序列.如果我 ...

  3. 【转载】 强化学习(五)用时序差分法(TD)求解

    原文地址: https://www.cnblogs.com/pinard/p/9529828.html ------------------------------------------------ ...

  4. 强化学习9-Deep Q Learning

    之前讲到Sarsa和Q Learning都不太适合解决大规模问题,为什么呢? 因为传统的强化学习都有一张Q表,这张Q表记录了每个状态下,每个动作的q值,但是现实问题往往极其复杂,其状态非常多,甚至是连 ...

  5. Flink + 强化学习 搭建实时推荐系统

    如今的推荐系统,对于实时性的要求越来越高,实时推荐的流程大致可以概括为这样: 推荐系统对于用户的请求产生推荐,用户对推荐结果作出反馈 (购买/点击/离开等等),推荐系统再根据用户反馈作出新的推荐.这个 ...

  6. 强化学习之 免模型学习(model-free based learning)

    强化学习之 免模型学习(model-free based learning) ------ 蒙特卡罗强化学习 与 时序查分学习 ------ 部分节选自周志华老师的教材<机器学习> 由于现 ...

  7. 基于Keras的OpenAI-gym强化学习的车杆/FlappyBird游戏

    强化学习 课程:Q-Learning强化学习(李宏毅).深度强化学习 强化学习是一种允许你创造能从环境中交互学习的AI Agent的机器学习算法,其通过试错来学习.如上图所示,大脑代表AI Agent ...

  8. 强化学习(Reinfment Learning) 简介

    本文内容来自以下两个链接: https://morvanzhou.github.io/tutorials/machine-learning/reinforcement-learning/ https: ...

  9. DQN(Deep Q-learning)入门教程(一)之强化学习介绍

    什么是强化学习? 强化学习(Reinforcement learning,简称RL)是和监督学习,非监督学习并列的第三种机器学习方法,如下图示: 首先让我们举一个小时候的例子: 你现在在家,有两个动作 ...

  10. 强化学习模型实现RL-Adventure

    源代码:https://github.com/higgsfield/RL-Adventure 在Pytorch1.4.0上解决bug后的复现版本:https://github.com/lucifer2 ...

随机推荐

  1. JS隐藏号码中间4位

    function resetPhone(phone) { var str = String(phone) var len = str.length; var prev,next; if (len &g ...

  2. Web前端开发必备

    前端学习相关书籍 关于书籍 HTML.CSS 类别书籍,都是大同小异,在当当网.卓越网搜索一下很多推荐.如果感觉学的差不多了,可以关注一下<CSS禅意花园>,这个很有影响力. Javasc ...

  3. 2018-06-29 "西游记"主题Python入门示例尝试-数据结构 5.1-5.1.2

    (见前: 中文代码示例视频演示Python入门第五章 数据结构 仍然基于官方文档, 欢迎建议(尤其是如何取材). 5. Data Structures - More on Lists 列表详述 > ...

  4. Dynamics 365-部分用户访问环境缓慢

    链接来自MS MVP 罗勇大神的Dynamics 365中部分账号使用系统明显缓慢怎么办?先这么干! 之前项目中也遇到过客户部分账户访问环境缓慢的问题,在此做个记录,等再碰到了,以此思路进行尝试

  5. Android Room框架学习笔记

    一.使用 1.build.gradle引入 compile "android.arch.persistence.room:runtime:1.0.0" annotationProc ...

  6. coTurn测试程序之turnutils_stunclient.exe

    测试使用方法,作为STUN客户端,仅用于测试STUN服务是否正常运行. 使用coTurn服务启动STUN/TURN服务后,执行以下命令即可: turnutils_stunclient -p 61.18 ...

  7. Spark操作parquet文件

    package code.parquet import java.net.URI import org.apache.hadoop.conf.Configuration import org.apac ...

  8. [20180927]ora-01426.txt

    [20180927]ora-01426.txt --//链接:http://www.itpub.net/thread-2105458-1-1.html1.环境:SCOTT@test01p> @ ...

  9. C#-简介(一)

    1.C#语言简介 C#计算机语言 是一门高级计算机语言 他的开发模式更接近人类和社会的思维模式,有助于提高开发效率 C#历史 1998年COOL这个项目是C#语言的前身,由微软 Anders Hejl ...

  10. timeout 命令

    命令简介 运行指定的命令,如果在指定时间后仍在运行,则杀死该进程.用来控制程序运行的时间. 使用方法 1 2 3 timeout [选项] 数字[后缀] 命令 [参数]... 后缀 s 代表秒(默认值 ...