根据是否需要对环境建立模型将强化学习方法分为基于模型的(model-based)强化学习方法和无模型(model-free)的强化学习方法。
基于模型的强化学习方法和无模型的强化学习方法。有一些主要区别,但是也有很多相似之处:
本章试图去整合基于模型的强化学习方法和无模型的强化学习方法。
环境的模型(model)是指agent能够用它来预测环境将如何对其动作作出反应的任何事物。给定一个状态和动作,一个模型会预测下一个状态和下一个奖励。
如果一个模型是随机的,那么会有几种可能的下一个状态和下一个奖励,每个都有一定的发生概率。
举个例子,如果考虑对12个骰子之和建模,一个分布模型可以生成所有可能的和的值及其发生概率,而一个样本模型则会根据这个概率分布来生成单个和。在动态规划中的模型—也就是MDP动态特性 p ( s ′ , r ∣ s , a ) p(s^{\prime},r|s,a) p(s′,r∣s,a)是一个分布模型;而在第5章的blackJack例子是一个样本模型。
分布模型相对于样本模型更强大,因为它可以用来生成样本,但是在很多应用中获取样本模型相比与分布模型要容易的多。
那么模型有什么用呢?模型可以用来模拟minic(或仿真simulate)经验:
在两种情况下,我们都说模型是用来模拟环境(simulate the environment)和产生模拟经验(simulated experience)的。
本书中规划(planning)被定义为任何以环境模型为输入,并生成或改进与它进行交互的策略的计算过程
根据这个定义,在人工智能领域,有两种不同的规划方法:
本章中提出一个统一视角,即所有的状态空间规划算法都有一个通用的结构,如下图所示,包括有两个基本思想:
使用这种视角来看待规划方法,强调了规划方法与学习方法之间的关系。学习方法和规划方法的核心都是通过回溯操作来估计价值函数。不同之处在于,规划利用模型生成的仿真经验,学习方法使用从环境得到的真实经验。不考虑这种差异导致的其他差异(如何评估性能,如何产生丰富的经验等)的话,这种通用结构意味着许多思想和算法可以在规划和学习之间迁移。特别是,在许多情况下学习算法可以代替规划方法的关键回溯步骤。因为学习方法只需要经验作为输入,而且在许多情况下,它们可以被应用到模拟经验中,就像应用到真实经验中一样。
下图的算法流程展示了一个例子,它是被称为随机采样单步表格型Q规划算法(random-sample one-step tabular Q-planning),它基于one-step Q-learning和样本模型的随机采样方法。它可以收敛到相应环境模型下的最优策略,并且与在真实环境的one-step Q-learning的最优策略收敛条件相同(1. 每个”状态-动作“对必须在步骤1中被无限次选中;2. 随着时间的推移, α \alpha α需要适当地减小)
对于一个规划agent,实际经验至少扮演了两个角色:
经验、模型、价值函数、策略的关系如下图所示,箭头代表产生影响和改进的关系方向。经验可以直接地或通过模型间接地改善价值函数和策略,而与”规划“相关的是后一种方式,被称为间接强化学习(indirect reinforment learning)
直接强化学习和间接强化学习各有优缺点:
直接方法好还是间接方法好,有很多争论,而本书作者的观点是,在所有争论中,不同观点之间的差异性被夸大了,而分享两种观点的相似性比将它们对立起来反而能给我们更多的启发。举个例子,在本书中作者强调了动态规划和时序差分方法之间的内在相似性,尽管其中一个是为规划而设计的,另一个是为无模型学习设计。
Dyna-Q包括上面图片中所有的过程,规划、动作、模型学习和直接强化学习,该过程持续迭代:
Dyna智能体的一个整体框架图如下图,它是Dyna-Q算法的一个样例。
下图是Dyna-Q算法的一个伪代码,从概念上讲,规划、动作、模型学习和直接强化学习在Dyna的智能体中是同时并行进行的,而在串行计算机的实现中,每一步我们都要制定它们发生的顺序。 下图的 M o d e l ( s , a ) Model(s, a) Model(s,a)表示基于“状态-动作”对 ( s , a ) (s,a) (s,a)预测的后继状态和后继奖励的内容。 直接强化学习、模型学习、规划分别由步骤(d)、(e)、(f)来实现,如果(e)和(f)被省略,剩下的算法就是单步表格型Q-learning了。
例8.1 Dyna迷宫示例了带规划的agent相比与不带规划的agent性能更好,如下图(Figure 8.2)所示
创建的模型可能因为如下原因是不正确的:
当模型不正确时,规划过程就可能计算出次优的策略。有些情况下,规划计算出的次优策略会使我们很快发现并修正模型错误,这一般会在模型比较“乐观”的时候发生,即模型倾向于预测出比真实情况可能更大的奖励或更好的状态转移。规划智能体尝试利用这些机会,很快就发现这些机会根本不存在,于是感知到模型错误,继而修正模型。比如【例子8.2 Blocking Maze】给出的下面图片(Figure 8.4)展示了一个有较小的建模错误然后得到修复的迷宫示例。图中左上角示意了一开始的目标路径是在右边,1000步之后,最短路径变成了最左边的路径,如图中右上角所示。图中的下半部分表示在1000步内两种智能体都找到了最优路径,环境改变时,智能体在一段时间内没有奖励(曲线变平)的一段,而过了一段时间后,它们都学习到了新的最优动作。
而当环境比以前更好,但以前正确的策略并没有反映这些改善时,智能体的学习就会遇到很大困难,这些情况下,建模错误可能在很长时间甚至一直都不会被检测到。 【例子8.3 Shortcut Maze】给出的下面图片(Figure 8.5)展示这种环境变好引起的问题。一开始最优路径在屏障的左侧(左上角),3000步后,沿着右侧多了一条较短的路径。图中的下半部分表明Dyna-Q不会切换到捷径,它从没有意识到捷径的存在。
这里遇到的学习问题是第2章的探索与利用之间矛盾的另一个版本。在“规划”的语境里,探索意味着尝试那些改善模型的动作,而利用则意味着以当前模型的最优方式来执行动作。我们希望智能体通过探索来发现环境的变化,但又不希望探索太多使得平均性能大大降低。如以前讨论过的一样,没有银弹,但简单的启发式方法常常很有效。
解决了例子8.3里的Dyna-Q+就使用启发式方法。它对每一个“状态-动作”对进行跟踪,记录它自上一次在与环境进行真实交互时出现以来,已经过了多少时刻。时间越长,我们就越有理由推测这个“状态-动作”相关的环境动态性会产生变化,它的模型很可能是不正确的。为了鼓励尝试很久未出现的动作,为该动作相关的模拟经验设置的“额外奖励”被提供给智能体:如果模型对一个单步转移的奖励是r,这个转移有 τ \tau τ个时间步内没有被尝试,那么在更新时就会采用 r + κ τ r+\kappa \sqrt{\tau} r+κτ,其中的 κ \kappa κ是一个比较小的数字。虽然这些试探是有代价的,就像迷宫任务中一样,这种计算上的好奇心(computational curiosity)是值得付出额外代价的。
在前面的Dyna智能体中,模拟转移是从所有先前经历过的”状态-动作“对中随机均匀采样得到的,均匀采样更新的方式存在效率较低的缺点,尤其当状态空间非常大时。
规划计算的反向聚焦(backward focusing):从任意的价值发生变化的状态中进行反向操作,要么进行有用的更新,要么就终止信息传播。
优先级遍历(prioritized sweeping):根据价值变化来对更新进行优先级排序。如果某个”状态-动作“二元组在更新之后的价值变化是不可忽略的,就可以将它放入到优先队列维护,这个队列是按照价值改变的大小来进行优先级排序的。当队列头部的”状态-动作“对被更新时,也会计算它对其前导”状态-动作“对的影响,如果这些影响大于某个较小的阈值,就把相应的前导”状态-动作“对也插入到优先队列中(如果已经在队列中,则保留优先级最高的)。这种方法可以使得价值变化的影响被有效地反向传播直到影响消失,算法如下图所示:
单步更新方法主要在三个维度产生变化:
前两个维度组合出四类更新,用于近似四个价值函数: q ∗ q_* q∗, v ∗ v_* v∗, q π q_{\pi} qπ, v π v_{\pi} vπ。而三个维度组合出8类更新,其中7个对应着特定的算法(第8个不产生任何有用的更新),这些算法的回溯图如下图所示。
考虑一种将期望更新和采样更新用于近似 q ∗ q_* q∗的特殊例子,这里状态和动作都是离散的,近似价值函数Q用表格表示,环境动态模型用 p ^ ( s ′ , r ∣ s , a ) \hat{p}(s^{\prime},r|s,a) p^(s′,r∣s,a)表示,状态-动作对s, a的期望更新为:
Q ( s , a ) ← ∑ s ′ , r p ^ ( s ′ , r ∣ s , a ) [ r + γ m a x a ′ Q ( s ′ , a ′ ) ] ( 8.1 ) Q(s, a) \leftarrow \sum_{s^{\prime}, r} \hat{p}(s^{\prime},r|s,a) [r + \gamma max_{a^{\prime}} Q(s^{\prime}, a^{\prime})] \ \qquad (8.1) Q(s,a)←s′,r∑p^(s′,r∣s,a)[r+γmaxa′Q(s′,a′)] (8.1)
对应的s, a的采样更新是类似Q-learning的更新,给定后继状态 S ′ S^{\prime} S′和奖励R(来自模型):
Q ( s , a ) ← Q ( s , a ) + α [ R + γ m a x a ′ Q ( s ′ , a ′ ) − Q ( s , a ) ] ( 8.2 ) Q(s, a) \leftarrow Q(s, a) + \alpha [R + \gamma max_{a^{\prime}} Q(s^{\prime}, a^{\prime}) - Q(s, a)] \ \qquad (8.2) Q(s,a)←Q(s,a)+α[R+γmaxa′Q(s′,a′)−Q(s,a)] (8.2)
上式的 α \alpha α是一个通常为正数的步长参数。
当环境是随机环境时,在给定状态和动作的情况下,后继状态有多种可能,此时期望更新和采样更新差异很明显:
对于一个特定的初始二元组s,a,设b是分支因子(branching factor),即对于所有可能的后继状态 s ′ s^{\prime} s′,其中 p ^ ( s ′ ∣ s , a ) > 0 \hat{p}(s^{\prime}|s, a)>0 p^(s′∣s,a)>0的数目。则这个二元组的期望更新需要的计算量大约是采样更新的b倍。如果有足够的时间来完成期望更新,则所得到的的估计总体上应该比b次采样更新更好,因为没有采样误差。但是如果没有足够的时间来完成一次期望更新,那么采样更新总是比较可取的,因为它们至少可以通过少于b次的更新来改进估计值。
在给定一个单位的计算量,是否采用期望更新比采用b倍次数的采样更新会更好呢?下图(Figure 8.7)展示了这个问题的分析结果。
两种状态更新过程中的算力分配方法:
on-policy可以显著提高规划的速度
在短期内,根据on-policy分布进行采样有助于聚焦于接近初始状态的后继状态;而从长期来看,聚焦于on-pollicy分布则可能存在危害,因为通常发生的各种状态都已经有了正确的估计值,采样到它们没什么用。所以根据on-policy分布的采样对于大尺度问题可能具有很大的优势。
实时动态规划(real-time dynamic programming, RTDP)是动态规划价值迭代算法的on-policy轨迹采集采样版本。RTDP是异步DP算法的一个例子。异步DP算法不是根据对状态集合的系统性遍历来组织的,它可以采用任何顺序和其他状态恰好可用的任何价值来计算某个状态的价值函数更新。在RTDP中,更新顺序是由真实或模拟轨迹中状态被访问的顺序决定的。
optimal partial policy: 策略对于相关的状态是最优的,而对于不相关的状态则可以指定任意的甚至是未定义的动作。
RTDP的两个优点:
规划过程至少有两种运行方式:
决策时规划在不需要快速相应的应用程序是最有用的。
如果低延迟动作选择优先,则在后台进行规划通常能够更好地计算出一个策略,以便可以将其迅速地应用于每个新遇到的状态。
人工智能中经典的状态空间规划方法是决策时规划,整体被统称为启发式搜索(heuristic search)。
在启发式搜索中,对于遇到的每个状态,建立一个树结构,该结构包含了后面各种可能的延续。将近似价值函数应用于叶子结点,然后向当前状态节点回溯,回溯更新在当前状态的状态动作节点处停止。一旦这些节点的回溯价值全部被计算后,选择最好的作为当前动作,然后舍弃所有回溯值。
贪心策略、 ϵ \epsilon ϵ策略和UCB动作选择方法与启发式搜索并没有差别很大,只是它们的规模更小,例如,为了计算给定模型和状态价值函数下的贪心动作,我们必须从每个可能的动作出发,将所有可能的后继状态的奖励考虑进去并进行价值估计,然后选择最优动作。因此我们可以将启发式搜索看作单步贪心策略的某种扩展。
需要采用比单步搜索更深的搜索方式的原因是为了获得更好的动作选择。如果有一个完美的环境模型和一个不完美的动作价值函数,那么实际上更深的搜索通常会产生更好的策略。另一方面,搜索越深,需要的计算越多,通常导致响应时间越长。
Rollout(有翻译称为预演)算法是一种基于Monte Carlo控制的决策时规划算法,Monte Carlo控制应用于以当前状态为起点的采样轨迹模拟。Rollout算法通过平均许多起始于可能的动作并遵循给定的策略的模拟轨迹的回报来估计动作价值。当动作价值的估计被认为足够准确时,对应最高估计值的动作会被执行,之后这个过程再从得到的后继状态继续进行。
rollout 这个词来源于backgammon游戏中通过playing out即rolling out来估计一个棋局局面的价值。
与第5章 的Monte Carlo控制算法不一样,rollout算法的目标不是为了估计一个最优动作价值函数 q ∗ q_* q∗,或对于给定的策略 π \pi π的完整动作-价值函数 q π q_{\pi} qπ。相反,rollout算法只对一个给定策略的被称为rollout策略和每一个当前状态做出动作价值的Monte Carlo估计。作为决策时规划算法,rollout算法只是即时地利用这些动作价值的估计值,然后丢弃它们。
rollout算法的目的是为了改进rollout策略的性能,而不是找到最优的策略。过去的经验表明,rollout算法表现的出人意料地有效。但改进后的策略的性能取决于rollout策略的性质以及基于Monte Carlo价值估计的动作的排序。从直观上看,基础rollout策略越好,价值的估计越准确,rollout算法得到的策略就越可能更好。
因此就涉及了时间约束和更好的价值估计的权衡,因为更好的rollout策略一般都意味着要花更多的时间来模拟足够多的轨迹从而得到一个良好的价值估计。rollout算法需要的计算时间取决于:
平衡上述这些因素在rollout算法的应用中很重要,但也有一些方法可以缓解这个问题:
蒙特卡洛树搜索(Monte Carlo Tree Search, MCTS)是一种rollout算法,它通过累积Monte Carlo模拟得到价值估计来不停地将模拟导向高奖励轨迹。这个算法有很多变体,其中一个变体对于2016年的AlphaGo获胜有很关键的作用。MCTS在很多任务中被证明是有效的,包括普通的游戏,但是不限于游戏,如果有一个简单到可以进行快速多步模拟的环境模型,它也可以有效地解决单智能题序贯决策问题。
MCTS在遇到一个新状态后,首先用来选择智能体在这个状态下的动作,之后它又会被用来选择后继状态下的动作,依此类推。而每一次的执行都是一个循环重复的过程:模拟许多从当前状态开始运行到终止状态(或运行到折扣系数使得更遥远的奖励对回报值的贡献小到可以忽略为止)的轨迹。MCTS的核心思想是对从当前状态出发的多个模拟状态不断地聚焦,这通过扩展从更早的模拟获得较高评估值的轨迹的初始片段来实现的。
在计算过程中,只维护部分的Monte Carlo估计值,这些估计值对应于会在几步内到达的“状态-动作”对所形成的子集,这就形成了一棵以当前状态为根节点的树,如下图所示:
如上图所示,一个基本版的MCTS的每一次循环中包括下面四个步骤:
MCTS为什么能取得注入效果有以下几点原因: