一、Introduction
(一) 什么是动态规划(Dynamic Programming)
Dynamic:问题的动态顺序或时间成分
Programming:优化“程序”,即policy
我们认为问题是拥有某种时间或顺序方面的特性,也就是问题一步接一步地进行改变,我们尝试某些特殊的步骤来解决这些问题。
数学规划:线性规划或二次规划,它的含义就是像数学家一样,使用程序优化程序,它实质上指的就是一种policy。案例:从状态到动作的映射开始,然后你不断优化程序,以采取最优行为。
- 解决复杂问题的方法
- 通过将它们分解为子问题
- 解决子问题
- 结合解决子问题
(二)动态规划的要求
对于具有两个属性的问题,动态规划是一种非常通用的解决方案:
- 最优化结构
- 应用最优原理
- 最优解可以分解为子问题
最优化结构的含义是我们刻意将某些整体性问题分解为两个或多个子问题,在得到子问题的最优解后我们也就知道了整体问题的最优解。
- 重叠子问题
- 子问题重复出现多次
- 解决方案可以缓存和重用
我们不会对不满足以上两个条件的问题使用动态规划
- 马尔可夫决策过程同时满足这两个属性
- 贝尔曼方程提供递归分解
- 值函数存储和重用解决方案
缓存我们目前找到的MDP的最优值信息,通过value function可以找到任一状态出发的解决方法,可以找到最优的行动方式
(三)Planning by Dynamic Programming
- 动态规划假定您完全了解MDP
知道MDP的结构,MDP中的动态变化和奖励,完全了解环境的工作原理。 - 用于MDP中的计划
- 对于预测来说:
- Input:MDP and policy
- or:MRP
- Output:value function
在知道policy的情况下球的更多的奖励
- 或者对于control
- Input:MDP
- Output:value function
- and:最优policy
我们并不知道policy,我们想知道在所有的policy中选择哪一个才会在MDP中得到最多的奖励。
(四)动态规划的其他应用
动态规划用于解决许多其他问题,例如:
- 调度算法
- 字符串算法(如:序列比对)
- 图算法(如:最短路径算法)
- 图模型问题(如:Viterbi algorithm)‘
- 生物信息学(如:晶格模型)
二、Policy Evaluation
(一)Iterative Policy Evaluation
- 问题:评估给定的策略
- 解决方案:Bellman期望备份的迭代应用
- 使用同步备份
- 在每次迭代k + 1
- 对于所有状态
- 从更新
- 其中是的后继状态
- 稍后我们将讨论异步备份
- 讲座结束时将证明的收敛
使用贝尔曼方程来评估policy,解决control问题,你知道了MDP和policy,采取这个policy奖励会是多少。
是一个向量,也就是MDP的value,从某个初始的value开始,一般初始取0(0表示我们没有在任何地方得到任何指令),接下来每一步都要用贝尔曼方程,向前看一步,就能找到一个新的value函数,迭代多次,得到真正的value函数。
(二)Iterative Policy Evaluation(2)
为了实现动态规划我们将会将这个方程转化为迭代更新操作。
我们在叶节点存储我们先前迭代的value,然后就可以求得下一次迭代的value。
将k迭代产生的值插入到叶节点,通过存储的这些值,我们就能计算出路径下一次迭代产生的一个新value
(三)Evaluating a Random Policy in the Small Gridworld
- 没有折扣情况的MDP()
- 非终端状态 1,...,14
- 一个终端状态(以阴影正方形显示两次)
- 退出网格的动作保持状态不变
- 直到达到最终状态,奖励为-1
-
agent遵循统一的随机策略
(四)Iterative Policy Evaluation in Small Gridworld
-1.7如何得到?
应用公式
在本问题中,公式中,,,(因为执行一个action只能到达一个状态)
向北走:得到即时奖励-1,回到原地,加上上一步原地的value为-1,
向南走:得到即时奖励-1,到下个状态,加上上一步该状态的value为-1,
向西走:得到即时奖励-1,到下个状态,加上上一步该状态的value为0,
向东走:得到即时奖励-1,到下个状态,加上上一步该状态的value为-1,
将上述四项加到一块,
右边的policy是根据左边的value值,应用贪婪算法得到的,可以发现到最后policy是可以收敛的,因为k=3的时候policy就不再改变。
三、Policy Iteration
(一)如何改进policy
- 提供一个policy
- 评估policy
- 应用贪婪的方法来改进policy
- 评估policy
- 在Small Gridworld中,改进策略是最佳的,
- 一般而言,需要进行更多迭代的改进/评估
- 但是,此策略迭代过程始终收敛于
无论你从哪里开始,无论你的value函数是什么、policy是什么,最终你总会得到最优的value函数和最优的policy。
示例:杰克的租车
- States:两个地点,每个地点最多20辆车
- Actions:一夜之间在各地点之间最多可移动5辆汽车
- Reward:每辆租车$ 10(必须可以得到)
- Transitions:汽车归还和请求是随机的
- 泊松分布,n个归还/请求,概率为
- 第一个位置:平均请求数= 3,平均归还= 3
-
第二个位置:平均请求数= 4,平均归还= 2
首先是一个随机policy,然后用value function,然后用value function得到new policy,然后再用value function评估,然后得到更新的policy,然后再评估,最终得到最优policy。
(二)Policy Improvement
- 考虑一个确定性策略,
-
我们可以通过贪婪的方法改进这个策略
-
这就可以一步提高任何状态s的值
找到使得q的值最大的action,这个action比之前一个特定的action要好。
- 因此,它改善了价值函数,
-
如果改进停止
-
然后满足Bellman最优方程
- 因此对所有的 ,
- 所以是最优policy
(三)Extensions to Policy Iteration
1、Modified Policy Iteration
修改的策略迭代
基本思想:提前停止迭代
- policy评估需要收敛到吗?
- 还是应该引入停止条件
- 例如value function 的
- 还是在k次迭代策略评估后停止?
- 例如,在小型网格世界中,k = 3足以实现最佳策略
- 为什么不每次迭代都更新策略?即在k = 1之后停止
- 这等效于值迭代(下一部分)
2、Generalised Policy Iteration
policy evaluation algorithm、policy improvement algorithm不再是固定的,可以用任意的算法
四、Value Iteration
(一)Value Iteration in MDPs
1、Principle of Optimality(最优原则)
任何最佳策略都可以细分为两个部分
- 最佳的第一个动作
- 紧随后继状态S'的最优策略
定理(Principle of Optimality)
一个策略 从状态s获得最佳值,,当且仅当 - 从可到达的任意状态
- 从状态获得最佳值,
2、Deterministic Value Iteration(确定性值迭代)
- 如果我们知道子问题的解决方案
- 然后可以通过一步查找来找到解决方案
- 价值迭代的思想是迭代地应用这些更新
- 直觉:从最终的奖励开始,然后倒退
- 仍适用于循环的,随机的MDP
3、Example: Shortest Path
应用此公式进行计算
每移动一步得到的奖励为-1,,
因为每个action只能到唯一一个后继状态,
- -1=max{
向北:即时奖励-1,加上回到原地的上个状态value=0,相加为-1;
向南:即时奖励-1,加上到达的下个格子的上个状态value=0,相加为-1;
向西:即时奖励-1,加上到达的下个格子的上个状态value=0,相加为-1;
向东:即时奖励-1,加上到达的下个格子的上个状态value=0,相加为-1;} - -2=max{
向北:即时奖励-1,加上回到原地的上个状态value=-1,相加为-2;
向南:即时奖励-1,加上到达的下个格子的上个状态value=-1,相加为-2;
向西:即时奖励-1,加上到达的下个格子的上个状态value=-1,相加为-2;
向东:即时奖励-1,加上到达的下个格子的上个状态value=-1,相加为-2;} - -3=max{
向北:即时奖励-1,加上回到原地的上个状态value=-2,相加为-3;
向南:即时奖励-1,加上到达的下个格子的上个状态value=-2,相加为-3;
向西:即时奖励-1,加上到达的下个格子的上个状态value=-2,相加为-3;
向东:即时奖励-1,加上到达的下个格子的上个状态value=-2,相加为-3;} - -3=max{
向北:即时奖励-1,加上到达的下个格子的上个状态value=-5,相加为-6;
向南:即时奖励-1,加上回到原地的上个状态value=-5,相加为-6;
向西:即时奖励-1,加上到达的下个格子的上个状态value=-5,相加为-6;
向东:即时奖励-1,加上到达的下个格子的上个状态value=-5,相加为-6;} - -6=max{
向北:即时奖励-1,加上回到原地的上个状态value=-5,相加为-6;
向南:即时奖励-1,加上到达的下个格子的上个状态value=-2,相加为-6;
向西:即时奖励-1,加上回到原地的上个状态value=-5,相加为-6;
向东:即时奖励-1,加上到达的下个格子的上个状态value=-2,相加为-6;}
4、Value Iteration
- 问题:找到一个最优的policy
- 方法:迭代应用贝尔曼最优备份(Bellman optimality backup)
- 用同步备份(synchronous backups)
- 在每个迭代
- 对于每个states
- 从更新
- 收敛到稍后将证明.
- 与policy Iteration 不同,这里没有明确的policy
-
中间值函数(value function)可能不符合任何policy
我们认为value function是对所有子问题的兑现方案,最优的value是来自,有人告诉我们,我会从那个状态获得多少奖励,现在问题是我们该如何利用这些信息来构造一个先前那一步骤的最优value函数,我们需要做的是向前看一步,为了构造这棵树我们使用了贝尔曼最优方程。
我们来看看这棵树的树叶,树叶将他们存储起来,我们归纳的前提是:我们的最优解来自于我们的树叶,我们将这个存储起来我们最大化的所有的东西,那么在根处,我们就得到了最优值,value迭代的思想是不断地重复更新,从任意值开始,我们会很直观的找到答案,把这个存储起来,我们就得到了一个新的value函数,存储新的value函数得到更好的value函数。
5、Example of Value Iteration in Practice
http://www.cs.ubc.ca/~poole/demos/mdp/vi.html
6、Synchronous Dynamic Programming Algorithms(同步动态规划算法)
- 算法基于状态值函数或
- 对于m个动作和n个状态,每次迭代的复杂度
n种状态,每个状态可以执行m个action,每个action又可能有n个后继状态。 - 还可应用与action-value函数或q_*(s,a)
- 每次迭代的复杂度
总共有mn个每个action-value对,后继有mn个action-value对,所以为
五、Extension to Dynamic Programming
(一)Asynchronous Dynamic Programming
异步动态编程
- 到目前为止介绍的DP方法使用了同步备份
- 即所有状态都并行备份
- 异步DP以任何顺序分别备份状态
一般来说,你可以挑选任何state,并将该state进行备份。你可以立即行动,可以立即插入你的新的value函数,它会在底部进行备份,你并不需要等待全部状态更新完。你需要更新的是单一的状态,而不是整个状态空间。 - 对于每个选定状态,应用合适的备份
- 可以大大减少计算
- 如果继续选择所有状态,则保证收敛
不管你选择的顺序是怎么样的,只要你持续选择,那么你的算法都会收敛到最优value函数。
异步动态规划的三个简单思路:
- In-place dynamic programming
- Prioritised sweeping
- Real-time dynamic programming
实时动态规划
1、In-Place Dynamic Programming
-
Synchronous value iteration存储值函数的两个副本
对于S中的所有s
-
In-place value iteration仅存储值函数的一个副本
对于S中的所有s
放弃了区分新的和旧的,将它进行扫描,然后无论我们的次序是什么,我们总是使用最新的版本,我们会即时更新我们的value函数,无论我们到了哪一种状态,我们将会使用的是最新的value,因为最新的value包含更多的信息,会更高效。
唯一的问题是你该如何安排state的次序,才能以最有效的方式进行计算。这表明知道问题的某些状态,你可以更加高效的进行计算。它就像一条长廊,我们扫描到了那个状态,即该状态是目标朝向了我们源方向,这说明迭代通过一次扫描所有的状态,我们就能找到最佳的解决方案。你不需要进行不同的扫描,因为你是从目标出开始的,你找到了目标的最优值,你回退一步,现在你插入的最新的value,然后再该状态再回退一步,插入最新value,再回退......。一直使用最新的估计来进行更新,这样会更加高效。加入你扫描到其他东西,那么你什么都不会得到。因此,排序真的很重要。
2、Prioritised Sweeping
思想:找到评估MDP状态重要性的标准。现在我们知道了你可以以任何顺序更新你的状态。我们应该首先更新哪些状态呢?
我们来组织一个优先级序列,来看看哪个状态相较于其他状态更好。我们会以某种顺序进行更新,依据就是state的重要性。
-
使用Bellman误差的幅度指导状态选择
我们的直觉告诉我们,改变最多的state,比如:更新之前该状态value是0,更新之后value状态为1000,这将会对之后的计算产生巨大的影响。
- 备份保存的Bellman误差最大的状态
- 每次备份后更新受影响状态的Bellman误差
- 需要了解逆向动态(先前状态)
- 通过组织优先级队列可以有效地实现
3、Real-Time Dynamic Programming
思想:选择那些agent真正访问过的state。我们并不是简单的扫描所有的东西,实际上是,在真实环境中运行一个agent,搜集真正的样本,使用来自某个轨迹的真正的样本。
- 想法:仅与agent相关的状态
- 运用agent的经验来指导状态的选择
- 在每个时间步之后
- 备份状态
(二)Full-width and sample backups
1、Full-Width Backups
- DP使用full-width备份
- 对于每个备份(同步或异步)
- 每个后继的状态和动作都被考虑
- 使用有关MDP转换和reward function的知识
- DP对中等规模的问题(数百万个状态)有效
- 对于大问题,DP受到贝尔曼的维数诅咒
- 状态数随状态变量数呈指数增长
-
即使一次备份也可能太昂贵
2、Sample Backups
- 在随后的课程中,我们将考虑样本备份
- 使用sample rewards and sample transitions
- 代替reward function和transition dynamics
- Advantages:
- Model-free:无需MDP的先验知识
- 通过采样打破维数的诅咒
- 备份成本是恒定的,与无关
3、Approximate Dynamic Programming
- 近似value function
- 使用函数逼近器
- 将动态规划应用于
- 例如:拟合值迭代在每个迭代k重复一次,
- Sample states
- 对于每个状态,使用Bellman最优方程估算目标值
使用目标训练下一个value function