• 机器学习 | 强化学习(2) | 动态规划求解(Planning by Dynamic Programming)


    动态规划求解(Planning by Dynamic Programming)

    动态规划概论

    • 动态(Dynamic):序列性又或是时序性的问题部分
    • 规划(Programming):最优化一个程序(Program),i.e 一种策略
      • 线性规划(Linear Programming)

    显然马尔科夫决策过程就符合动态规划的顺序

    因为相信带伙对于DP都是懂哥了,这里就没记录多少东西

    策略评价(Policy Evaluation)

    • 问题:评价一个给定的策略\(\pi\)
    • 解决:使用贝尔曼期望的一个状态进行迭代
    • \(v_1\rightarrow v_2\rightarrow \dots\rightarrow v_\pi\)
    • 同步状态更新
      • 对于每一代\(k+1\)
      • 一切状态\(s\in\mathcal{S}\)
      • \(v_k(s')\)更新\(v_{k+1}(s)\)
      • 其中\(s'\)\(s\)的后续节点
    • 后面会提到非同步的状态更新
    • \(v_\pi\)的收敛性也可以得到证明

    由贝尔曼方程,我们得到:

    \[\begin{align} v_{k+1}(s) & = \mathcal{\sum_{a\in A}\pi(a|s)\Bigg( R^a_s + \gamma\sum_{s'\in S} P ^ a_{ss'}v_k(s') \Bigg)}\\ v^{k+1} & = \mathcal{R ^ \pi + \gamma P ^ \pi v ^ k} \end{align} \]

    值得留意的是,上一节课谈到最优策略是固定的,为此我们的\(\pi\)是对某一个最优动作的选择,即\(\pi(a|s)\)本质上是退化类似于\([0 \ 0 \ 1 \ 0 \ 0\dots]\)的分布,或者说指定一个\(s\),可以用一个数字来表示\(\pi(a|s)\)

    [这里是习题/样例]

    策略迭代(Policy Iteration)

    • 给定策略\(\pi\)

      • 评价策略\(\pi\)

      • \[v_\pi(s) = \mathbb{E}[R_{t+1} + \gamma R_{t+2} + \dots|S_t = s] \]

      • 通过过贪心算法改进策略

      • \[\pi' = greedy(s_\pi) \]

    • 最终经过改进的策略乃是最优的,\(\pi'=\pi^*\)

    • 一般来说,多轮的迭代是必要的

    • 策略迭代必定收敛于\(\pi^*\)

    [这里是样例,习题]

    • 对于一个确定的策略,\(a = \pi(s)\)

    • 我们通过贪心算法改进策略

      \[\pi'(s) = \mathop{argmax}_{a\in A} q_\pi(s,a) \]

    • 每一步从每一个状态去更新价值函数

      \[q_\pi(s, \pi'(s)) = \max_{a \in A} q_\pi(s,a)\ge q_\pi(s,\pi(s))=v_\pi(s) \]

    • 因此去更新状态-价值函数,\(v_{\pi'}(s)\ge v_\pi(s)\)

      \[\begin{align} v_\pi(s) & \le q_\pi(s,\pi'(s)) = \mathbb{E}_{\pi'}[R_{t+1}+\gamma v_\pi(S_{t+1})|S_t = s] \\ & \le q_\pi(s,\pi'(s)) = \mathbb{E}_{\pi'}[R_{t+1}+\gamma q_\pi(S_{t+1},\pi'(S_{t+1})) |S_t = s]\\ & \le q_\pi(s,\pi'(s)) = \mathbb{E}_{\pi'}[R_{t+1} + \gamma R_{t+2} +\gamma^2 q_\pi(S_{t+1},\pi'(S_{t+1})) |S_t = s] \\ & \le q_\pi(s,\pi'(s)) = \mathbb{E}_{\pi'}[R_{t+1} + \gamma R_{t+2} +\dots |S_t = s] \\ & = v_{\pi'}(s) \end{align} \]

    • 若迭代没有进一步改进,即:

      \[q_\pi(s,\pi'(s)) = \max_{a\in A} q_\pi(s,a) = q_\pi(s,\pi(s))=v_\pi(s) \]

    • 那么贝尔曼最优方程即得解:

      \[v_\pi(s)=\max_{a\in A}q_\pi(s,a) \]

    • 因此\(v_\pi(s)=v_*(s),\forall s \in S\)

    终止条件

    • 策略评价是否真的需要完全收敛于\(v_\pi\)呢?
    • 或者说我们是否可以人为地规定一个终止条件
      • e.g. 价值函数的\(\epsilon\)-收敛
    • 又或者\(k\)轮迭代之后即可终止
      • 例如说之前给出的gridworld样例中\(k=3\)的情况中就已经是最优策略了
    • 为何不一次迭代就全部更新策略
      • i.e. 第一代就停止更新了
      • P.S. 本质上是价值递归(Value Iteration),下面章节会讲的

    价值迭代(Value Iteration)

    对于任何一个最优策略都可以划分为以下两个部分

    • 最优动作\(A_*\)
    • 最优策略下跟随的下一个后继状态\(S'\)

    最优化原理:

    当一个策略\(\pi(a|s)\)从状态\(s\)出发达到最优价值,即\(v_\pi(s)=v_*(s)\)

    有且仅有:

    • 对于所有能够从状态\(s\)转移到的状态\(s'\)
    • \(\pi\)\(s'\)出发也得到了达到最优价值,即\(v_\pi(s')=v_*(s')\)

    因此

    • 如果我们能求解子问题\(s_*(s')\)

    • 那么\(v_*(s)\)的解只需要向前一步就能解出来

      \[v_*(s) \leftarrow \mathcal{\max_{a\in A} R^a_s + \gamma \sum_{s'\in S}P^a_{ss'}v_*(s')} \]

    • 此处就是价值迭代的核心思想:利用这个公式迭代更新公式

    • 原理阐释:从最终的回报开始进行反向传播

    • 对于循环、随机的马尔科夫决策过程同样适用

    算法原理:

    • 问题:寻找最优策略\(\pi\)

    • 解决方案:迭代利用贝尔曼最优备份方案

    • \(v_1\rightarrow v_2\rightarrow\dots\rightarrow v_*\)

    • 采用同步备份更新

      • 对于每一代\(k+1\)
      • 一切状态\(s\in S\)
      • \(v_k(s')\)更新\(v_{k+1}(s)\)
    • \(v_*\)的收敛后面会证明

    • 相对于策略迭代,并不显式输出一个策略

    • 中间状态的价值函数并不表示任何有意义的策略

    公式原理:

    \[v_{k+1}(s) = \mathcal{\max_{a\in A}\Bigg( R^a_s + \gamma\sum_{s'\in S}P^a_{ss'} v_k(s')\Bigg)} \]

    矩阵形式:

    \[v_{k+1} = \mathcal{\max_{a\in A} R^a + \gamma P^a v_k} \]

    一个demo

    http://www.cs.ubc.ca/~poole/demos/mdp/vi.html

    总结概要

    问题 贝尔曼方程 算法
    预测问题 贝尔曼期望方程 迭代策略评价
    决策问题 贝尔曼期望方程+贪心算法策略提升 策略迭代
    决策问题 贝尔曼最优方程 价值迭代
    • 基于状态-价值函数\(V_pi(s)\)或者是\(s_*(s)\)的算法
    • 时间复杂度:每一代\(O(mn^2)\),其中\(m\)为动作、\(n\)为状态
    • 基于动作-价值函数\(q_\pi(s,a)\)或者是\(q_*(s,a)\)
    • 时间复杂度:每一代\(O(m^2 n^2)\)

    动态规划的拓展

    • 目前用到的DP都是同步备份更新的
    • 而异步更新DP则通过某种顺序独立更新每一个状态
    • 对于每一个选定的状态采取最适合的备份进行更新
    • 能够显著地减少计算的消耗
    • 若所有状态一直被选中则确保收敛了

    三种异步动态规划的简单思想

    • 原地DP
    • 优先扫描
    • 实时DP

    原地DP

    一般来说,价值迭代都会存储着两份价值函数的拷贝

    \[v_{new}(s) \leftarrow \mathcal{ \max_{a\in A} \Bigg( R^a_s + \gamma\sum_{s'\in S}P^a_{sss}v_{old}(s') \Bigg)} \]

    其中\(v_{old}\)\(v_{new}\)之间就是两个备份

    而原地DP则只存储一份价值函数的备份:

    \[v(s) \leftarrow \mathcal{ \max_{a\in A} \Bigg( R^a_s + \gamma\sum_{s'\in S}P^a_{sss}v(s') \Bigg)} \]

    直接就使用最新的\(v(s')\),因为包含更多信息,但是难点在于如何安排更新顺序

    一般会采取贝尔曼误差去选择要更新价值函数

    \[\mathcal{\Bigg| \max_{a\in A} \Bigg(R^a_s + \gamma\sum_{s'\in S}P^a_{ss'}v(s') \Bigg) - v(s) \Bigg|} \]

    • DP利用全广度备份
    • 在中等规模问题相当有效
    • 但是在高维数据会显得低效
    • 通过邻接链表的形式可以改造DP
  • 相关阅读:
    Shell脚本查看apk签名信息
    Android Studio中的六种依赖
    Gradle build设置自动log开关
    转-Android Studio系列教程六--Gradle多渠道打包
    经验分享
    Android Studio build dex jar
    iPhone6搜索如何打开?详细使用方法
    Android Studio 简单设置
    Android Studio常见问题 -- uses-sdk:minSdkVersion 8 cannot be smaller than version 9 declared in library
    iOS开发学习记录【整理】
  • 原文地址:https://www.cnblogs.com/uzuki/p/14289683.html
Copyright © 2020-2023  润新知