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. java体系架构

    java概念 java本身是一种面向对象的语言,最显著的特性有两方面,一是所谓的“书写一次,到处运行”(write once ,run anywhrer),能够非常容易的获得跨平台能力,另外就是垃圾收 ...

  2. Redis学习一(基础入门).

    一.前言 Redis是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.key-Value 的数据库.并提供多种语言的API. 通常,Redis 将数据存储于 ...

  3. BootStrapTable 错误

    异常:Cannot read property 'field' of undefined 场景:使用BootStrapTable展示数据时,控制台报错 解决:给table加上 thead 和 tbod ...

  4. 用kafka实现消息推送

    一个人知道的Topic是单点推送,大家都知道Topic是广播. kafka消息消费机制: 1.广播消费:通过定义topic前缀来标识属于广播的消息(例如:topicname:gonggao153568 ...

  5. 我为什么推荐Prettier来统一代码风格

    译者按: 关于代码风格,不同的人有不同的偏好,其实并没有什么绝对的对错.但是,有2条原则应该是对的: 少数服从多数:用工具统一风格. 原文: Why robots should format our ...

  6. sql片段

    1):定义sql片段 <!-- 定义sql片段 --> <!-- id: sql片段的标识 经验:1:基于单表来定义sql片段,这样的话sql片段的可重用性才高 2:sql片段中不要 ...

  7. node起步

    首先,在项目目录下创建一个叫 app.js 的文件,并写如以下代码: app.js const http = require('http'); const hostname = '127.0.0.1' ...

  8. CSS3动画属性:动画(animation)

    一:动画(animation)的参数详解 由于上面用到了animation动画,这里详细介绍下这个animation的参数. 简介 CSS动画(Animations)简单说就是在一段固定的动画时间内暗 ...

  9. JS之innerHTML,innerText,outerHTML,textContent的用法与区别

    示例html代码: <div id="test"> <span style="color:red">test1</span> ...

  10. Django引入静态文件

    在HTML文件中引入方式: 简单引入一个bootstrap中的内敛表单,效果图如下: