强化学习(四)动态规划——1

news2024/9/25 9:55:13

动态规划算法(DP):在马尔可夫决策过程(MDP)的完美环境模型下计算最优策略。但其在强化学习中实用性有限,其一是它是基于环境模型已知;其二是它的计算成本很大。但它在理论伤仍然很重要,其他的一些算法与动态规划算法(DP)十分相似,只是计算量小及没有假设环境模型已知。

动态规划算法(DP)和一般的强化学习算法的关键思想都是基于价值函数对策略的搜索,如前所述,一旦我们找到满足贝尔曼最优方程的最优价值函数 v ∗ v_\ast v q ∗ q_\ast q,我们就可以很容易地获得最优策略。
v ∗ ( s ) = max ⁡ a E [ R t + 1 + γ v ∗ ( S t + 1 ) ∣ S t = s , A t = a ] = max ⁡ a ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ v ∗ ( s ′ ) ] , o r q ∗ ( s , a ) = E [ R t + 1 + γ max ⁡ a ′ q ∗ ( S t + 1 , a ′ ) ∣ S t = s , A t = a ] = ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ max ⁡ a ′ q ∗ ( s ′ , a ′ ) ] \begin{aligned} v_\ast(s) &=\max_a\Bbb{E}[R_{t+1}+\gamma v_\ast(S_{t+1})|S_t=s,A_t=a]\\ &=\max_a\sum_{s^\prime,r}p(s^\prime,r|s,a)\Big[r+\gamma v_\ast(s^\prime)\Big],\quad \rm{or}\\ q_\ast(s,a)&=\Bbb{E}\Big[R_{t+1}+\gamma\max_{a^\prime}q_\ast(S_{t+1},a^\prime)\Big |S_t=s,A_t=a\Big]\\ &=\sum_{s^\prime,r}p(s^\prime,r|s,a)\Big[r+\gamma\max_{a^\prime}q_\ast(s^\prime,a^\prime)\Big] \end{aligned} v(s)q(s,a)=amaxE[Rt+1+γv(St+1)St=s,At=a]=amaxs,rp(s,rs,a)[r+γv(s)],or=E[Rt+1+γamaxq(St+1,a) St=s,At=a]=s,rp(s,rs,a)[r+γamaxq(s,a)]

1、策略评估(预测)

首先,我们考虑如何计算任意策略 π \pi π 下的状态价值函数 v π v_\pi vπ,我们称其为策略评估
v π ( s ) ≐ E π [ G t ∣ S t = s ] = E π [ R t + 1 + γ G t + 1 ∣ S t = s ] = E π [ R t + 1 + γ v π ( S t + 1 ) ∣ S t = s ] = ∑ a π ( a ∣ s ) ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ v π ( s ′ ) ] \begin{aligned} v_\pi(s)&\doteq \Bbb{E}_\pi[G_t|S_t=s]\\ &=\Bbb{E}_\pi[R_{t+1}+\gamma G_{t+1}|S_{t}=s]\\ &=\Bbb{E}_\pi[R_{t+1}+\gamma v_\pi(S_{t+1})|S_t=s]\\ &=\sum_a\pi(a|s)\sum_{s^\prime,r}p(s^\prime,r|s,a)\Big[r+\gamma v_\pi(s^\prime)\Big] \end{aligned} vπ(s)Eπ[GtSt=s]=Eπ[Rt+1+γGt+1St=s]=Eπ[Rt+1+γvπ(St+1)St=s]=aπ(as)s,rp(s,rs,a)[r+γvπ(s)]

其中, π ( a ∣ s ) \pi(a|s) π(as) 表示在策略 π \pi π 下当状态为 s s s 时采取动作 a a a 的概率,以 π \pi π 为下标的期望是指其计算是基于策略 π \pi π 的。只要保证 γ < 1 \gamma<1 γ<1 及存在终止状态,则 v π v_\pi vπ 存在且唯一。

如果环境动态模型完全已知,那么上述方程可通过迭代计算来求解,即
v k + 1 ( s ) ≐ E π [ R t + 1 + γ v k ( S t + 1 ) ∣ S t = s ] = ∑ a π ( a ∣ s ) ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ v π ( s ′ ) ] \begin{aligned} v_{k+1}(s)&\doteq \Bbb{E}_\pi[R_{t+1}+\gamma v_k(S_{t+1})|S_t=s]\\ &=\sum_a\pi(a|s)\sum_{s^\prime,r}p(s^\prime,r|s,a)\Big[r+\gamma v_\pi(s^\prime)\Big] \end{aligned} vk+1(s)Eπ[Rt+1+γvk(St+1)St=s]=aπ(as)s,rp(s,rs,a)[r+γvπ(s)]

显然 v k = v π v_k=v_\pi vk=vπ 是这个更新规则的不动点,因为贝尔曼方程保证了其相等,实际上在保证 v π v_\pi vπ 存在的条件下,当 k → ∞ k\rightarrow\infty k时,序列 { v k } \{v_k\} {vk}可以收敛至序列 v π v_\pi vπ,这种算法成为迭代策略评估

为了使 v k + 1 v_{k+1} vk+1 相比 v j v_j vj 更加逼近 v π v_\pi vπ,迭代策略评估对每个状态 s s s 应用如下操作:用状态 s s s 的旧价值来更新 s s s 的新价值,再用 s s s 的新价值替换 s s s 的旧价值,我们称这种操作为预期更新。迭代策略评估的每次更新都会产生新的估计价值函数 v k + 1 v_{k+1} vk+1

若要编写程序实现上述的迭代策略评估,必须使用两个数组,一个储存旧价值 v k ( s ) v_k(s) vk(s),另一个储存新价值 v k + 1 ( s ) v_{k+1}(s) vk+1(s),我们用旧价值数组来一个接一个地计算新价值数组,过程中可以立刻改变旧价值数组,也可以更新完毕再改变旧价值数组,这两种方法均收敛于 v π v_\pi vπ,事实上前者收敛速度更快。

在这里插入图片描述

1.1、案例网格世界

在这里插入图片描述
网格中除了灰色格子每个格子都对应一种状态,即非终端状态为 S = { 1 , 2 , ⋯   , 14 } \cal {S}=\{1,2,\cdots,14\} S={1,2,,14},每个状态都有四种可能的动作,即 A = { u p , d o w n , r i g h t , l e f t } \cal{A}=\{\rm{up,down,right,left}\} A={up,down,right,left},每种状态都会使得状态发生变化(注意,移动至网格外的动作会使状态保持不变),在到达终端状态之前,所有的奖励都是 -1,终端状态为灰色格子(尽管为两个格子,但实际是一个状态),因此 r ( s , a , s ′ ) = − 1 r(s,a,s^\prime)=-1 r(s,a,s)=1,假设智能体遵循等概率随机策略(等概率随机选择动作),计算每个状态到终止状态的期望收益。

1.2、代码

import numpy as np

world_size = 4  # 网格为4*4
a_position = [0, 0]
b_position = [world_size - 1, world_size - 1]
actions = [
    np.array([0, -1]),  # 左
    np.array([-1, 0]),  # 上
    np.array([0, 1]),   # 右
    np.array([1, 0])    # 下
]
action_prob = 0.25


def step(state, action):
    """
    :param state: 当前状态,坐标的list,比如[1,1]
    :param action: 当前采取的动作
    :return: 下一个状态(坐标的list)和reward
    """
    if state == a_position:
        return a_position, 0
    if state == b_position:
        return b_position, 0

    next_position = (np.array(state) + action).tolist()
    x, y = next_position
    # 判断是否出界
    if x < 0 or x >= world_size or y < 0 or y >= world_size:
        reward = - 1.0
        next_position = state
    else:
        reward = - 1.0
    return next_position, reward


def grid_world_value_function():
    value = np.zeros((world_size, world_size))
    episode = 0
    while True:
        episode += 1
        # 每轮迭代都会产生一个new_value,直到new_value和value很接近即收敛为止
        new_value = np.zeros_like(value)
        for i in range(world_size):
            for j in range(world_size):
                for action in actions:
                    (next_i, next_j), reward = step([i, j], action)
                    new_value[i, j] += action_prob * (reward + value[next_i, next_j])
        error = np.sum(np.abs(new_value - value))
        if error < 1e-4:
            break
        value = new_value
    return value


if __name__ == '__main__':
    value1 = grid_world_value_function()
    print(value1)

1.3、结果展示

[[  0.         -13.99990421 -19.99985806 -21.99984116]
 [-13.99990421 -17.99987496 -19.99985901 -19.99985806]
 [-19.99985806 -19.99985901 -17.99987496 -13.99990421]
 [-21.99984116 -19.99985806 -13.99990421   0.        ]]

2、策略改进

我们计算策略的价值函数的原因是为了找到更好的策略,假设我们已经知道某策略 π \pi π 的价值函数 v π v_\pi vπ,对于某些状态我们想知道是否应该改变策略,虽然我们根据 v π v_\pi vπ 知道当前的策略有“多好”,但是更换策略是“更好”还是“更差”呢?一种方法就是在状态 s s s 时确定性地选择动作价值函数最高的动作 a a a,然后遵循现有的策略 π \pi π
q π ( s , a ) ≐ E [ R t + 1 + γ v π ( S t + 1 ) ∣ S t = s , A t = a ] = ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ v π ( s ′ ) ] \begin{aligned} q_\pi(s,a)&\doteq \Bbb{E}[R_{t+1}+\gamma v_\pi(S_{t+1})|S_t=s,A_t=a]\\ &= \sum_{s^\prime,r}p(s^\prime,r|s,a)\Big[r+\gamma v_\pi(s^\prime)\Big] \end{aligned} qπ(s,a)E[Rt+1+γvπ(St+1)St=s,At=a]=s,rp(s,rs,a)[r+γvπ(s)]

关键在于它是大于还是小于 v π ( s ) v_\pi(s) vπ(s),如果它更大,那么也就是说在状态 s s s 选择一次(根据上述公式,只有这一次的动作选择不遵循策略 π \pi π)动作 a a a 的策略比一直遵循策略 π \pi π 要更好,那么也就是说每次遇到状态 s s s 都确定性地选择动作 a a a 会更好,事实上新策略确实更好。

假设 π \pi π π ′ \pi^\prime π 是任意一对确定性策略,有 q π ( s , π ′ ( s ) ) ≥ v π ( s ) q_\pi(s,\pi^\prime(s))\geq v_\pi(s) qπ(s,π(s))vπ(s),也就是说策略 π ′ \pi^\prime π 优于策略 π \pi π,也就是说它在所有状态下均获得更多的期望收益,即 v π ′ ( s ) ≥ v π ( s ) v_{\pi^\prime}(s)\geq v_\pi(s) vπ(s)vπ(s),我们称其为策略改进定理

到目前为止,在给定策略及其价值函数的条件下,我可以轻松地在单个状态下对动作的更改,我们将其延伸至所有状态下动作的更改,即在每个状态下根据 q π ( s , a ) q_\pi(s,a) qπ(s,a) 来选择最佳的动作,也就是选择新的贪心策略 π ′ \pi^\prime π,即
π ′ ( s ) ≐ arg max ⁡ a q π ( s , a ) = arg max ⁡ a E [ R t + 1 + γ v π ( S t + 1 ) ∣ S t = s , A t = a ] = arg max ⁡ a ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ v π ( s ′ ) ] \begin{aligned} \pi^\prime(s)&\doteq \argmax_aq_\pi(s,a)\\ &=\argmax_a\Bbb{E}[R_{t+1}+\gamma v_\pi(S_{t+1})|S_t=s,A_t=a]\\ &=\argmax_a\sum_{s^\prime,r}p(s^\prime,r|s,a)\Big[r+\gamma v_\pi(s^\prime)\Big] \end{aligned} π(s)aargmaxqπ(s,a)=aargmaxE[Rt+1+γvπ(St+1)St=s,At=a]=aargmaxs,rp(s,rs,a)[r+γvπ(s)]

贪心策略采取的是在短期内看起来最好的动作,可以看出它优于原策略。根据原策略的价值函数通过贪心方法改进原策略,从而得到新策略,我们称其为策略改进

到目前为止,我考虑的是确定性策略这种特殊情况,事实上,上述所有思想可以很容易地扩展到随机策略。

3、策略迭代

一旦通过价值函数 v π v_\pi vπ 改进策略 π \pi π,得到更好的策略 π ′ \pi^\prime π,我们就可以计算价值函数 v π ′ v_{\pi^\prime} vπ,再改进策略 π ′ \pi^\prime π,得到更好的策略 π ′ ′ \pi^{\prime\prime} π′′,由此我们可以得到一系列单调改进的策略和价值函数:
π 0 ⟶ E v π 0 ⟶ I π 1 ⟶ E v π 1 ⟶ I π 2 ⟶ E ⋯ ⟶ I π ∗ ⟶ E v ∗ \pi_0\stackrel{E}{\longrightarrow}v_{\pi_0}\stackrel{I}{\longrightarrow}\pi_1\stackrel{E}{\longrightarrow}v_{\pi_1}\stackrel{I}{\longrightarrow}\pi_2\stackrel{E}{\longrightarrow}\cdots\stackrel{I}{\longrightarrow}\pi_\ast\stackrel{E}{\longrightarrow}v_\ast π0Evπ0Iπ1Evπ1Iπ2EIπEv

其中 ⟶ E \stackrel{E}{\longrightarrow} E 表示策略评估, ⟶ I \stackrel{I}{\longrightarrow} I 表示策略改进,每个策略都优于前一个策略。由于有限马尔可夫决策过程只有有限个策略,因此该过程必然会在有限次的迭代中收敛到最优策略和最优价值函数。

这种寻找最优策略的方法被称为策略迭代,完整算法如下所示,可以看出每次策略评估本身就是一次迭代计算,都是从前一个策略的价值函数开始,这通常会使得策略评估的收敛速度大大提高。
在这里插入图片描述

4、值迭代

策略迭代的一个缺点是:它得每次迭代都要进行策略评估,这本身就是一个冗长的迭代计算,而策略评估只有在极限的情况下才收敛到 v π v_\pi vπ,我们是否可以在此之前就截断迭代呢?答案是可以的。实际上,在保证策略迭代收敛的前提下,可以通过多种方式截断策略迭代中的策略评估过程,一种特殊的方式是,策略评估时每个状态仅更新一次就停止,这种算法称为值迭代。它可以写成一个特别简单的更新操作,其中结合了策略改进和截断策略评估:
v k + 1 ( s ) ≐ max ⁡ a E [ R t + 1 + γ v k ( S t + 1 ) ∣ S t = s , A t = a ] = max ⁡ a ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ v k ( s ′ ) ] \begin{aligned} v_{k+1}(s)&\doteq \max_a\Bbb{E}[R_{t+1}+\gamma v_k(S_{t+1})|S_t=s,A_t=a]\\ &=\max_a\sum_{s^\prime,r}p(s^\prime,r|s,a)[r+\gamma v_k(s^\prime)] \end{aligned} vk+1(s)amaxE[Rt+1+γvk(St+1)St=s,At=a]=amaxs,rp(s,rs,a)[r+γvk(s)]

对于任意的 v 0 v_0 v0,序列 { v k } \{v_k\} {vk} 都会收敛于 v ∗ v_\ast v。理解值迭代的另一种方法就是参考贝尔曼最优方程,只需要将贝尔曼最优方程转换为更新规则即可获得值迭代。最好我们看一下值迭代是如何终止的,与策略评估一样,值迭代需要无限次迭代才能精确收敛到 v ∗ v_\ast v,但实际上,值函数在一次迭代过程只发生了极小的变换,我们就停止迭代,完整算法如下所示:
在这里插入图片描述
值迭代在每次迭代过程中都有效的结合了一次策略评估和一次策略改进,通过在每个策略改进之间插入多个策略评估,通常可以实现更快的收敛。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1403569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vscode 顶部Menu(菜单)栏消失如何恢复

Vscode 顶部Menu(菜单)栏消失如何恢复&#xff1f; 首先按一下 Alt按键&#xff0c;看一下是否恢复了菜单栏如果恢复了想了解更进一步的设置&#xff0c;或是没能恢复菜单栏&#xff0c;可以看后续。 1.首先点击左下角 齿轮&#xff0c;打开settings; 或者 直接 ctrl 逗号 …

如何本地搭建Splunk Enterprise数据平台并实现任意浏览器公网访问

文章目录 前言1. 搭建Splunk Enterprise2. windows 安装 cpolar3. 创建Splunk Enterprise公网访问地址4. 远程访问Splunk Enterprise服务5. 固定远程地址 前言 本文主要介绍如何简单几步&#xff0c;结合cpolar内网穿透工具实现随时随地在任意浏览器&#xff0c;远程访问在本地…

java SSM项目预算生成管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM项目预算生成管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的 源代码和数据库&#xff0c;系统主…

《WebKit 技术内幕》学习之十(1): 插件与JavaScript扩展

虽然目前的浏览器的功能很强 &#xff0c;但仍然有其局限性。早期的浏览器能力十分有限&#xff0c;Web前端开发者希望能够通过一定的机制来扩展浏览器的能力。早期的方法就是插件机制&#xff0c;现在流行次啊用混合编程&#xff08;Hybird Programming&#xff09;模式。插件…

小微企业科技创新之策略:人才、投入、模式、技术、支持四管齐下

对于小微企业来说&#xff0c;搞科技创新需要从多个方面入手。以下是一些可供参考的方法&#xff1a; 明确创新方向&#xff1a;首先&#xff0c;企业需要明确自己的创新方向和目标&#xff0c;这有助于聚焦资源&#xff0c;避免盲目投入。同时&#xff0c;企业需要对市场进行…

charles使用指南

一、什么是charles Charles 是一个http代理、管理以及反向代理工具&#xff0c;它允许开发者查看本地机器和互联网之间的关于http、https的所有通信&#xff0c;包含请求、响应以及他们的请求头、响应头。 它的主要功能包含&#xff1a; 1、SSL代理 2、带宽限制 3、ajax断…

如何查看Linux CPU占有率

目录 1、top 2、htop 3、vmstat 4、mpstat 5、iostat 查看嵌入式设备CPU占有率是评估系统资源使用情况的重要方式。 在Linux系统中&#xff0c;有多种方法可以查看CPU占有率&#xff0c;这里介绍几种常用的命令行工具。 1、top 这是最常用的命令之一&#xff0c;它提供了…

go语言(十三)-----interface

一、Interface 通用万能类型 空接口int&#xff0c;string&#xff0c;float&#xff0c;struct都实现了interface都可以用interface{}类型,引用任意的数据类型 package mainimport "fmt"//interface()是万能数据类型 func myFunc(arg interface{}) {fmt.Println(&…

[娱乐]索尼电视安装Kodi

索尼电视不能直接apk安装kodi应用 android studio安装后附带 abd&#xff0c; 路径 C:\Users\[yourname]\AppuoData\Local\Android\Sdk\platform-tools\adb.exe安卓电视点击内部版本号&#xff0c;启用开发者模式 adb 连接索尼安卓电视&#xff0c;记得电视上运行调试 abi选…

函数传参数组时,使用数组形参的本质

c语言中函数的调用分为两种方式&#xff1a;传址调用、传值调用。 传值调用我们都知道就是将实参的值传送给被调函数&#xff0c;让被调函数的形参接收这个值&#xff0c;从而形参内存中的数据就变成了实参的一份拷贝。 而传址调用则是将实参的地址传送过去&#xff0c;然后令…

IaC基础设施即代码:Terraform 创建 docker 网络与容器资源

目录 一、实验 1.环境 2.Terraform查看版本 3.Linux主机安装Docker 4.Terraform使用本地编译&#xff08;In-house&#xff09;的Providers 5.Docker-CE 开启远程API 6. Linux主机拉取镜像 7.Terraform 创建docker 网络资源 8.Terraform 创建docker 容器资源 一、实验 …

8.3 Springboot整合Redis 之Jedis方式

文章目录 前言一、Maven依赖二、新增子Module:tg-book-redis三、Jedis配置类3.1 Jedis连接池核心配置说明四、Jedis 工具类五、新增controller测试前言 Jedis是Redis官方推荐的Java客户端连接工具,用法非常简单,Jedis的API与Redis的API可以说是一模一样,所以非常有利于熟悉…

【K8S 云原生】K8S的包包管理器-helm

目录 一、helm概念 1、什么是helm 2、helm的概念&#xff1a; 二、实验部署&#xff1a; 1、安装helm&#xff1a; 2、对chart仓库的基本使用&#xff1a; 2.1、查看和更新chart仓库 2.2、安装chart 2.3、卸载chart&#xff1a; 3、helm自定义模版&#xff1a; 3.1、…

未来趋势:视频美颜SDK与增强现实(AR)的融合

当下&#xff0c;视频美颜SDK不断演化&#xff0c;成为用户记录和分享生活时不可或缺的一部分。同时&#xff0c;增强现实技术也以其独特的沉浸感和交互性受到青睐&#xff0c;被广泛应用于游戏、教育、医疗等领域。 一、视频美颜与AR的结合 1.实时美颜的AR增值体验 借助AR的…

【Springboot】日志

1.日志的使用 日志主要用于记录程序运行的情况。我们从学习javase的时候就使用System.out.println();打印日志了&#xff0c;通过打印的日志来发现和定位问题&#xff0c;或根据日志来分析程序运行的过程。在Spring的学习中,也经常根据控制台的⽇志来分析和定位问题 。 日志除…

《WebKit 技术内幕》学习之七(1): 渲染基础

《WebKit 技术内幕》之七&#xff08;1&#xff09;&#xff1a; 渲染基础 WebKit的布局计算使用 RenderObject 树并保存计算结果到 RenderObject 树。 RenderObject 树同其他树&#xff08;如 RenderLayer 树等&#xff09;&#xff0c;构成了 WebKit 渲染的为要基础设施。 1…

w23靶场安装

一、实验环境 服务器&#xff1a;phpstudyv8.1.13 靶场&#xff1a;Bees二、实验目的 提供一个靶场环境 三、实验步骤 bees靶场安装 1.启动小皮的apache和mysql 2.在小皮V8.1.1.3版本上创建bees网站&#xff0c;选择的php版本最好在5.x&#xff0c;不然会有php解析错误。…

Windows系统如何修改Nginx配置实现远程访问多个本地站点

文章目录 1. 下载windows版Nginx2. 配置Nginx3. 测试局域网访问4. cpolar内网穿透5. 测试公网访问6. 配置固定二级子域名7. 测试访问公网固定二级子域名 1. 下载windows版Nginx 进入官方网站(http://nginx.org/en/download.html)下载windows版的nginx 下载好后解压进入nginx目…

samba服务搭建,并将共享目录映射到windows

系统版本&#xff1a;centos7 1、centos 安装samba yum -y install samba 2、查看安装信息 rpm -qa |grep samba 3、设置开机自启动 systemctl enable smb.service systemctl enable nmb.service 4、设置samba服务器配置文件 sudo vi /etc/samba/smb.conf 注意&#…

mysql进阶-执行计划

目录 1. 概念 2. 使用 3. 具体相关字段含义 3.1 id 3.2 select_type 3.3 table 3.4 partition 3.5 type 3.6 possible_key 3.7 key 3.8 key_len 3.9 ref 3.10 row 3.11 filtered 3.12 extra 1. 概念 一条语句通过优化器之后&#xff0c;会生成具体的执行计划用…