这里说的 Dynamic Programming 实际是工行就是我们算法中所说的动态规划,为了在以后在看到 Dynamic Programming 不再陌生,这里统一使用 Dynamic Programming,简写为(DP)
一、Introduction
1) 什么是 DP
- Dynamic:问题的序列或者时间组成部分(sequential or temporal component to the problem)
- Programming:优化一个“程序”,比如一个策略(Policy)
- DP 实际上是解决复杂问题的一种方法,这个方法将问题分解为子问题:
- 解决这些子问题
- 将子问题的解决方案进行整合
2) DP 的要求
- DP 实际上是一种非常通用的解决方案,这种解决方案主要用于解决有下面两个性质的问题:
- 最优子结构(Optimal substructure):一个问题的最优解可以由子问题的最优解有效构造出来;【这样保证了原问题的最优解可以通过子问题的最优解推导出来】
- 重叠子问题(Overlapping subproblems):原问题可以分解为若干子问题,并且这些子问题重复出现(我们可以将子问题的最优解缓存并重复利用)
- 马尔可夫决策过程(MDP)满足上面的两个性质,因此可以使用 DP 来求解:
- Bellman 方程给出了MDP 的递推分解
- Value Function 可以存储并重复利用已经获取的结果
3)Planning by DP
-
这里要知道 planning 的含义,这个在第一节中已经提到过:
- DP 假设有 MDP 的所有知识,即模型是已知的【这并不是一个完整的强化学习问题】
- 注意:本节实际上就是围绕着 planning 进行的
-
Planning 可以解决下面两类问题:
-
For Prediction:【Policy 是已知的】
-
For Control:【Policy 是未知的,需要找出最佳的 Policy】
-
4)DP 的其他应用
二、Policy Evaluation
1) Iterative Policy Evaluation
-
问题:评估给定一个Policy
-
解决方法:迭代地使用 Bellman Expectation backups
-
从一个初始化的 MDP 的 Value Function 开始,迭代地使用 Bellman Expectation:
v 1 → v 2 → . . . → v π v_1 \rightarrow v_2 \rightarrow ... \rightarrow v_{\pi} v1→v2→...→vπ -
使用 同步备份(synchronous backups)
-
在每一次迭代 k + 1 ,对于 S 中的每一个状态 s,都进行更新:利用 v k ( s ′ ) v_k(s^{'}) vk(s′) 来更新 v k + 1 ( s ) v_{k+1}(s) vk+1(s),其中, s ′ s^{'} s′ 是 s 的下一个状态;
-
图文并茂:
-
-
举个栗子:
-
首先介绍例子的前提条件:
- 折扣因子 γ = 1 \gamma = 1 γ=1
- 下图中,灰色的两个块是终止状态,其他的 14 个是非终止状态
- 导致会超出格子之外的动作,其最终状态还是在原地
- 每次动作的奖励是 -1(包括保持在原地的动作),直到达到终止状态
- 选在四个方向的概率是相同的,都是 0.25
-
迭代过程:
-
三、Policy Iteration
1)优化 Policy 的方法
-
给定一个 Policy π \pi π
-
Evaluate 这个 Policy:
v π ( s ) = E [ R t + 1 + γ R t + 1 + . . . ∣ S t = s ] v_{\pi}(s) = E[R_{t+1} + \gamma R_{t+1} + ...| S_t = s] vπ(s)=E[Rt+1+γRt+1+...∣St=s] -
优化 Policy:
π ′ = g r e e d y ( V π ) \pi^{'} = greedy(V_{\pi}) π′=greedy(Vπ)
-
2) Policy Improvement
-
考虑一个确定的(deterministic policy), a = π ( s ) a = \pi (s) a=π(s)
-
我们可以通过贪婪的策略来优化 Policy:
-
假如我们仅仅考虑一步的话,这种方法可以提升任何状态下的 value:
-
因此,这种方法可以提升 value Function:
-
当优化停止的时候,有:
-
这就会满足 Bellman Optimality Equation
-
因此,对于所有的 S 中的状态 s,都有 $ v_{\pi}(s) = v_{*}(s)$ ,所以 π \pi π 是一个最佳 policy
3) Modified Policy Iteration
- 这里提出的主要问题是,类似于上面的网格问题,我们可以看到 Value Function 是比较难以收敛的,但是 Policy 是比较容易收敛的
- 可行的解决方案:【早停】
- 直接设置迭代次数
- 每次迭代更新一次策略
- 设定一个阈值,比较两次迭代的价值函数平方差
四、Value Iteration
1) 最优性原则(Principle of Optimality)【定理】
-
任何一个最佳 Policy 都可以分解为下面的两个部分:
- 一个最佳的第一个动作 A ∗ A_{*} A∗
- 从下一个状态 s ′ s^{'} s′ 开始的最佳 Policy
-
【定理】最优性原则
2) 确定性的价值迭代(Deterministic Value Iteration)
-
当我们知道子问题的解 v ∗ ( s ′ ) v_{*}(s^{'}) v∗(s′)
-
那么整个问题的解,就可以通过多看一步来获取:
-
value Iteration 实际上就是迭代地使用上面的方法进行更新【实际上就是从最后的奖励开始,反向递推】
-
这种对于存在循环或者随机的 MDPs 仍然是适用的
-
一个简单的例子
-
最终状态是不一定已知的,也不一定必须存在的,这个例子中的最终状态只是用来便于理解;
-
实际上我们是在每一步更新所有状态的 value
-
3)价值迭代(Value Iteration)
-
过程描述:
- 问题:找到最佳 Policy π \pi π
- 解决方案:迭代地使用 Bellman Optimality backup v 1 → v 2 → . . . → v ∗ v_1 \rightarrow v_2 \rightarrow ... \rightarrow v_* v1→v2→...→v∗
- 使用同步备份(synchronous backups)
- 在每一次迭代过程 k + 1 中,对于每一个状态 s ∈ S s \in S s∈S , 从 v k ( s ′ ) v_k(s^{'}) vk(s′) 来更新 v k + 1 ( s ) v_{k+1}(s) vk+1(s)
- 这里并没有一个显性的 Policy 存在【与 Policy Iteration 的区别】
- 中间的值函数可能不对应任何的 Policy
-
图文并茂:
-
value Iteration 的例子
4) DP 算法总结
五、Extensions to Dynamic Programming
1)异步动态规划(Asynchronous Dynamic Programming)
-
之前的都是同步动态规划(synchronous backups),因为我们在每一步都对所有状态的 value 进行更新
-
异步的动态规划(Asynchronous DP)对状态进行备份的时候是独立地,可以是任何顺序
- 对于每一个选中的状态,采用合适的 backup
- 可以显著地减少计算
- 如果所有的状态能够持续被选中,那么是可以保证收敛的
-
异步动态规划中三个不同的方法(idea):
- In-place dynamic programming
- Prioritised sweeping
- Real-time dynamic programming
-
In-Place Dynamic Programming
-
Prioritised Sweeping
- 维护一个队列,挑选出更加重要的状态进行更新;这个更加重要可能是更新后变化最大的,而不是更新之后毫无变化的
-
Real-Time Dynamic Programming
- 更新智能体正在访问的状态
-
2) Full-Width Backups and Sample Backups
3) Approximate Dynamic Programming

六、Contraction Mapping
- 可以自己看看 PPT,不是重点