Loading [MathJax]/jax/element/mml/optable/BasicLatin.js

欢迎访问我的个人博客: orzyt.cn

David Silver强化学习Lecture3:动态规划

posted @   orzyt  阅读(455)  评论(0编辑  收藏  举报
分类: 强化学习

动态规划

  • 动态(Dynamic): 问题中的时序部分

  • 规划(Planning): 对问题进行优化

动态规划将问题分解为子问题, 从子问题的解中得到原始问题的解.


动态规划的性质

  • 最优子结构(Optimal substructure)

    • 应用最优性原则(Principle of optimality)
    • 最优解可以从子问题的最优解中得到
  • 重叠子问题(Overlapping subproblems)

    • 相同的子问题出现多次
    • 问题的解可以被缓存和复用

马尔可夫决策过程满足上面两种性质:

贝尔曼方程 给出了问题的递归分解表示, 值函数 存储和复用了问题的解.

vπ(s)=aAπ(a|s)(Ras+γsSPassvπ(s))


用动态规划进行Planning

动态规划假设我们知道MDP的所有知识, 包括状态、行为、转移矩阵、奖励甚至策略等.

对于预测(Prediction)问题:

  • 输入:

    • MDP <S,A,P,R,γ> 和 策略 π
    • MRP <S,Pπ,Rπ,γ>
  • 输出: 值函数 vπ

对于控制(Control)问题:

  • 输入:

    • MDP <S,A,P,R,γ>
  • 输出:

    • 最优值函数 v
    • 最优策略 π

策略评估

问题: 评估一个给定的策略 π
求解: 对贝尔曼期望方程进行迭代, v1v2vπ

通常使用同步备份(synchronous backups)方法:

对于第 k+1 次迭代, 所有状态 s 在第 k+1 时刻的价值 vk+1(s)vk(s) 进行更新, 其中 ss 的后继状态.

迭代策略评估

vk+1(s)=aAπ(a|s)(Ras+γsSPassvk(s))vk+1=Rπ+γPπvk


迭代策略评估算法:

迭代策略评估算法用来估计 Vvπ.

这里使用in-place版本, 即只保留一份 v 数组, 没有新旧之分.

通常来说, 该方法也能收敛到 vπ, 而且收敛速度可能更快.

终止条件: max 小于给定的误差 \Delta

迭代策略评估伪代码

例子: Small Gridworld [代码]

Small Gridworld
Small Gridworld Solution

策略改进

让我们考虑一个确定性策略(即对于一个状态来说, 其采取的动作是确定的, 而不是考虑每个动作的概率) a = \pi(s).

我们可以通过贪心选择来改进策略 \pi:

\pi ^ { \prime } ( s ) = \underset { a \in \mathcal { A } } { \operatorname { argmax } } q _ { \pi } ( s , a )

即状态 s 的新策略为令动作值函数 q_{\pi}(s, a) 取得最大值的动作.

相应地, 动作值函数 q _ { \pi } \left( s , \pi ^ { \prime } ( s ) \right) 得到了改进:

q _ { \pi } \left( s , \pi ^ { \prime } ( s ) \right) = \max _ { a \in \mathcal { A } } q _ { \pi } ( s , a ) \geq q _ { \pi } ( s , \pi ( s ) ) = v _ { \pi } ( s ) \\ {\scriptsize 由于是确定性策略, 才会有 v_{\pi}(s) = q_{\pi}(s, \pi(s))} \tag{1}

注: 确定性策略下的动作值函数 q_{\pi}(s, a) 为:

\begin{aligned} q _ { \pi } ( s , a ) & = \mathbb { E } \left[ R _ { t + 1 } + \gamma v _ { \pi } \left( S _ { t + 1 } \right) | S _ { t } = s , A _ { t } = a \right] \\ & = \sum _ { s ^ { \prime } , r } p \left( s ^ { \prime } , r | s , a \right) \left[ r + \gamma v _ { \pi } \left( s ^ { \prime } \right) \right] \end{aligned} \tag{2}

从而, 值函数 v _ { \pi ^ { \prime } } ( s ) 也得到了改进:

\begin{aligned} v_\pi(s) & \le q_\pi(s,\pi^{'}(s)) {\scriptsize //公式(1)} \\ &={\Bbb E}[R_{t+1} + \gamma v_\pi(S_{t+1})|S_t=s, A_t=\pi^{'}(s)] {\scriptsize //公式(2)} \\ &={\Bbb E}_{\pi'}[R_{t+1}+\gamma v_\pi(S_{t+1})|S_t=s]\ {\scriptsize //注意外层是在新策略 \pi^{'} 下求期望} \\ & \le {\Bbb E}_{\pi'}[R_{t+1}+\gamma q_\pi(S_{t+1},\pi'(S_{t+1}))|S_t=s] {\scriptsize //对状态S_{t+1}使用公式(1)} \\ &= {\Bbb E}_{\pi'}[R_{t+1}+\gamma {\Bbb E}_{\pi'}\left[ R_{t+2}+\gamma v_{\pi}\left( S_{t+2}\right) | S_{t+1}, A_{t+1}=\pi^{'}(S_{t+1}) \right] | S_t=s]\\ &= {\Bbb E}_{\pi'}[R_{t+1}+\gamma R_{t+2}+\gamma^2 v_{\pi}\left( S_{t+2} \right)|S_t=s] {\scriptsize //去掉括号内的期望} \\ & \le {\Bbb E}_{\pi'}[R_{t+1}+\gamma R_{t+2}+\gamma ^2 q_\pi(S_{t+2},\pi'(S_{t+2}))|S_t=s] {\scriptsize //对状态S_{t+2}使用公式(1)} \\ &= {\Bbb E}_{\pi'}[R_{t+1}+\gamma R_{t+2}+\gamma^2 {\Bbb E}_{\pi'}\left( R_{t+3}+\gamma v_{\pi}\left( S_{t+3} \right) \right)|S_t=s]\\ &= {\Bbb E}_{\pi'}[R_{t+1}+\gamma R_{t+2}+\gamma^2 R_{t+3}+\gamma^3 v_{\pi}\left( S_{t+3} \right)|S_t=s]\\ & \vdots \\ & \le {\Bbb E}_{\pi'}[R_{t+1}+\gamma R_{t+2}+\gamma^2 R_{t+3}+\gamma^3 R_{t+4} + \dots |S_t=s]\\ &=v_{\pi^{'}}(s) \\ \end{aligned}

当改进停止时, 有如下等式:

q _ { \pi } \left( s , \pi ^ { \prime } ( s ) \right) = \max _ { a \in \mathcal { A } } q _ { \pi } ( s , a ) = q _ { \pi } ( s , \pi ( s ) ) = v _ { \pi } ( s ) \tag{3}

可以说, 此时公式(3)满足了贝尔曼最优方程:

v _ { \pi } ( s ) = \max _ { a \in \mathcal { A } } q _ { \pi } ( s , a )

从而, 对所有状态 s 来说, 有v_{\pi}(s) = v_{*}(s), 即策略 \pi 改进到了最优策略.


策略迭代

策略迭代

给定一个策略 \pi, 我们可以首先对策略进行评估, 然后根据值函数 v_{\pi} 进行贪心地改进策略.

\pi _ { 0 } \stackrel { \mathrm { E } } { \longrightarrow } v _ { \pi _ { 0 } } \stackrel { \mathrm { I } } { \longrightarrow } \pi _ { 1 } \stackrel { \mathrm { E } } { \longrightarrow } v _ { \pi _ { 1 } } \stackrel { \mathrm { I } } { \longrightarrow } \pi _ { 2 } \stackrel { \mathrm { E } } { \longrightarrow } \cdots \stackrel { \mathrm { I } } { \longrightarrow } \pi _ { * } \stackrel { \mathrm { E } } { \longrightarrow } v _ { * }

其中, \stackrel { \mathrm { E } } { \longrightarrow } 表示策略评估, \stackrel { \mathrm { I } } { \longrightarrow } 表示策略改进.

  • 评估(Evaluate):

v _ { \pi } ( s ) = \mathbb { E } \left[ R _ { t + 1 } + \gamma R _ { t + 2 } + \ldots | S _ { t } = s \right]

  • 改进(Improve):

\pi^{'} = \text{greedy}(v_{\pi})

由于每个策略都比前一个策略更优, 同时一个有限状态的马尔可夫决策过程(finite MDP)仅有有限个策略, 因此该过程一定能够在有限次的迭代中收敛到最优策略 \pi_{*} 和最优值函数 v_{*}.


策略迭代

策略迭代算法:

策略迭代算法分为: 初始化, 策略评估 以及 策略改进 三部分.

其中, 策略改进部分的终止条件为: 是否所有状态的策略不再发生变化.

策略迭代算法

例子: Jack’s Car Rental [代码] (先占个坑 , 等有时间把这个例子详细写下)

Jack’s Car Rental

策略迭代求解结果:

Jack’s Car Rental Solution

图中纵坐标是位置 1 的汽车数量, 横坐标是位置 2 的汽车数量, 该问题共有 21 \times 21 个状态.

图中的等高线将状态划分为不同的区域, 区域内的数值代表相应的策略(正数代表从位置 1 移往位置 2 的汽车数量, 负数则往反方向移动).


策略迭代的扩展

改良策略迭代

策略评估并不需要真正的收敛到 v_{\pi}. (比如在 Small Gridworld例子中, 迭代 k=3次 即可以得到最优策略.)

为此我们可以引进终止条件, 如:

  • 值函数的 \epsilon -收敛
  • 简单地迭代 k 次便停止策略评估

或者每次迭代(即 k=1 )都对策略进行更新改进, 这种情况等价于值迭代(value iteration).


广义策略迭代

广义策略迭代(Generalized Policy iteration,GPI)指代让策略评估(policy-evaluation)和策略改进(policyimprovement)过程进行交互的一般概念, 其不依赖于两个过程的粒度(granularity)和其他细节.

几乎所有强化学习方法都可以很好地被描述为GPI. 也就是说, 它们都具有可辨识的策略与值函数. 其中, 策略 \pi 通过相应的值函数 v 进行改进, 而值函数 V 总是趋向策略 \pi 的值函数 v^{\pi}. 如下图所示,

广义策略迭代

值迭代

策略迭代的一个缺点是它的每次迭代都涉及策略评估, 这本身就是一个需要对状态集进行多次扫描的耗时迭代计算.

而在值迭代的过程中, 并没有出现显式的策略, 并且中间过程的值函数可能也不和任何策略对应.


最优性原则

一个最优策略可以被分解为两部分:

  • 当前状态的最优动作 A_{*}
  • 后继状态 S^{\prime} 的最优策略
最优性原则

该原则的意思是说, 一个策略 \pi(a|s) 在状态 s 取到最优值函数 v_{\pi}(s) = v_{*}(s) 当且仅当 对于所有从状态 s 出发可到达的状态 s^{\prime}, 策略 \pi 也能够在状态 s^{\prime} 取到最优值函数.


确定性值迭代

如果我们已经知道子问题的最优解 v_{\*}(s^{\prime}), 那么状态 s 的最优解可以通过向前看(lookahead)一步得到, 这称为值迭代(Value Iteration):

v_{*}(s) \gets \max \limits_{a \in \mathcal{A}} \left( \mathcal{R}_{s}^{a} + \gamma \sum \limits_{s' \in \mathcal{S}} \mathcal{P}_{ss'}^{a} v_{*}(s') \right)


值迭代算法:

值迭代算法和策略迭代算法一样, 是用来估计最优策略 \pi_{\*} 的, 它将策略评估和策略改进有效地结合在了一起.

值迭代算法

同步动态规划算法总结

问题 贝尔曼方程 算法
预测(Prediction) 贝尔曼期望方程 迭代策略评估
控制(Control) 贝尔曼期望方程 + 贪心策略改进 策略迭代
控制(Control) 贝尔曼最优方程 值迭代

对于有 m 个动作和 n 个状态 的MDP来说, 每次迭代的时间复杂度如下:

函数 复杂度
v_{\pi}(s) or v_{*}(s) \mathcal{O}(mn^2)
q_{\pi}(s, a) or q_{*}(s, a) \mathcal{O}(m^2n^2)

动态规划的扩展

异步动态规划

同步DP算法的主要缺点是每次迭代都需要对整个状态集进行扫描, 这对于状态数非常多的MDP来说耗费巨大. 而异步DP算法则将所有的状态独立地,以任意顺序进行备份, 并且每个状态的更新次数不一, 这可以显著地减少计算量.

为了保证算法的正确收敛, 异步动态规划算法必须保证所有状态都能够持续地被更新(continue to update the values of all the states), 也就是说在任何时刻任何状态都有可能被更新, 而不能忽略某个状态.

异步DP算法主要有三种简单的思想:

  • 就地动态规划(In-place dynamic programming)
  • 优先扫描(Prioritised sweeping)
  • 实时动态规划(Real-time dynamic programming)

就地动态规划

同步DP保留值函数的两个备份, v_{new}v_{old}

{\color{red} {v_{new}(s)}} \gets \max \limits_{a \in \mathcal{A}} \left( \mathcal{R}_{s}^{a} + \gamma \sum \limits_{s' \in \mathcal{S}} \mathcal{P}_{ss'}^{a} {\color{red} {v_{old}(s')}} \right)

就地值迭代只保留值函数的一个备份.

{\color{red} {v(s)}} \gets \max \limits_{a \in \mathcal{A}} \left( \mathcal{R}_{s}^{a} + \gamma \sum \limits_{s' \in \mathcal{S}} \mathcal{P}_{ss'}^{a} {\color{red} {v(s')}} \right)


优先扫描

使用贝尔曼误差的大小来进行状态的选择:

\left| \max _ { a \in \mathcal { A } } \left( \mathcal { R } _ { s } ^ { a } + \gamma \sum _ { s ^ { \prime } \in \mathcal { S } } \mathcal { P } _ { s s ^ { \prime } } ^ { a } v \left( s ^ { \prime } \right) \right) - v ( s ) \right|

  • 仅备份有最大贝尔曼误差的状态

  • 在每次备份后, 需要更新受到影响的状态(即备份状态的前驱状态)的贝尔曼误差

  • 可以使用优先队列进行实现


实时动态规划

  • 思想: 只使用和Agent相关的状态
  • 使用Agent的经验来进行状态的选择
  • 在每个时间步 S_t, A_t, R_{t+1} 对状态 S_t 进行备份

{\color{red} {v \left( S _ { t } \right)}} \gets \max _ { a \in \mathcal { A } } \left( \mathcal { R } _ { {\color{red}{S _ { t }}} } ^ { a } + \gamma \sum _ { s ^ { \prime } \in \mathcal { S } } \mathcal { P } _ { {\color{red} {S _ { t }}} s ^ { \prime }} ^ { a } {\color{red} {v \left( s ^ { \prime } \right)}} \right)


全宽和采样备份

全宽备份

  • DP使用全宽备份(full-width backups)

  • 对于每次备份(不管同步还是异步)

    • 每个后继状态和动作都会被考虑进去
    • 需要知道MDP转移矩阵和奖励函数
  • 对于大规模DP问题会遇到维数灾难

  • 进行一次备份都太奢侈了


采样备份

采样备份(Sample Backups)使用采样的奖励和采样的转移 < S , A , R , S ^ { \prime } > 来替代奖励函数 \mathcal{R} 和 转移矩阵 \mathcal{P}.

采样备份的优点:

  • Model-free: 不需要知道MDP的先验知识
  • 通过采样缓解维数灾难
  • 备份代价成为常量, 独立于状态数 n = |\mathcal{S}|

压缩映射

关于上面的种种算法, 我们可能会有如下疑问:

  • 值迭代是否会收敛到 v_{*} ?
  • 迭代策略评估是否会收敛到 v_{\pi} ?
  • 策略迭代是否会收敛到 v_{*} ?
  • 解唯一吗 ?
  • 算法收敛速度有多快 ?

为了解决这些问题, 需要引入压缩映射(contraction mapping)理论.
可以参考: 如何证明迭代式策略评价、值迭代和策略迭代的收敛性?


(关于压缩映射理论有时间再补充, 先到这里吧...)

编辑推荐:
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
阅读排行:
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞
点击右上角即可分享
微信分享提示