强化学习(三)基于动态规划 Dynamic Programming 的求解方法

文章目录

  • 1. 动态规划与强化学习的联系
  • 2. 利用动态规划求解最优价值函数
    • 2.1 案例背景
    • 2.2 策略评估(预测)
    • 2.3 策略迭代(控制)


在前文《强化学习的数学框架:马尔科夫决策过程 MDP》中,我们用马尔可夫过程抽象表示强化学习模型,并基于价值函数的贝尔曼方程迭代求出示例中的最优价值函数(策略),这种基于值迭代的方法,可以视为是动态规划的特例。本文基于前文的马尔可夫假设和贝尔曼方程,讨论如何使用动态规划(Dynamic Programming,DP)迭代地更新价值函数以求解强化学习1

1. 动态规划与强化学习的联系

动态规划是常见的用来解决优化问题的方法,但使用该方法求解的问题需要满足以下两个关键条件:

  1. 具有最优子结构:即待优化问题的最优解可以由若干个小问题的最优解构成,在每个阶段求解子问题的最优解可以最终获得原问题的最优解;
  2. 具有重叠子问题:即每个阶段计算的问题都与前面阶段的问题有所重叠,因此可以存储子问题的求解结果,基于前序子问题的结果递推出后续子问题的结果,来避免重复计算,加快计算效率。

这里可以用动态规划的方法实现前文案例中的两个计算,而这也是强化学习当中的两个基本问题:

  1. 预测问题。给定强化学习的状态集 S S S,动作集 A A A,模型状态转化概率矩阵 P P P,采取动作的即时奖励 R R R,奖励衰减因子 γ \gamma γ,以及动作策略 π \pi π,在这些条件下,求解策略 π \pi π 的状态价值函数 v ( π ) v(\pi) v(π),该过程也称为 策略评估(Policy Evaluation)
  2. 控制问题。给定强化学习的状态集 S S S,动作集 A A A,模型状态转化概率矩阵 P P P,采取动作的即时奖励 R R R,奖励衰减因子 γ \gamma γ,求解最优的状态价值函数 v ∗ v_* v 和最优策略 π ∗ \pi_* π,该过程也称为 策略迭代(Policy Iteration)

在《强化学习的数学框架:马尔科夫决策过程 MDP》中我们用的是求解方程组的方式获得给定策略下的状态价值,以及最优价值函数,本文我们利用动态规划的方式,迭代地更新状态价值以及最优价值函数。由于状态价值和动作价值都能作为策略依据,这里我们以状态价值的贝尔曼方程为例:

v π ( s ) = ∑ a ∈ A π ( a ∣ s ) ( R t a + γ ∑ s ′ ∈ S ( P s s ′ a v π ( s ′ ) ) ) v_{\pi}(s)=\sum_{a\in A} \pi(a|s)(R_t^a+\gamma \sum_{s'\in S}(P^a_{ss'}v_{\pi}(s'))) vπ(s)=aAπ(as)(Rta+γsS(Pssavπ(s)))

在给定策略下,我们假设在第 k k k 轮迭代已经计算出了所有的状态的状态价值,那么在第 k + 1 k+1 k+1 轮我们可以利用第 k k k 轮计算出的状态价值计算出第 k + 1 k+1 k+1 轮的状态价值,这样可以不断地逼近贝尔曼方程的实际值,将上述式子增加迭代周期下标,如下:

v ( k + 1 ) ( s ) = ∑ a ∈ A π ( a ∣ s ) ( R t a + γ ∑ s ′ ∈ S ( P s s ′ a v ( k ) ( s ′ ) ) ) v_{(k+1)}(s)=\sum_{a\in A} \pi(a|s)(R_t^a+\gamma \sum_{s'\in S}(P^a_{ss'}v_{(k)}(s'))) v(k+1)(s)=aAπ(as)(Rta+γsS(Pssav(k)(s)))

可以通过赋予初始状态估计价值,然后代入上式不断迭代,得到更新后的新的状态估计价值,经过若干代之后得到的即为该策略下的状态价值函数 v ( π ) v(\pi) v(π)

这里我们仍然沿用前文的案例,方便大家对两种求解方式有一个更深刻的理解,后续对大规模算例下DP求解和规划器求解的效率差异进行对比。

2. 利用动态规划求解最优价值函数

2.1 案例背景

现有一个关于学生开始的马尔科夫决策过程2,左上角的圆圈是当前的起始位置(状态),右上角的方框是终点位置(状态)。学生可以采取的动作为下图弧线上的红色字符串,有 S t u d y , F a c e b o o k , Q u i t , S l e e p , P u b Study,Facebook,Quit,Sleep,Pub Study,Facebook,Quit,Sleep,Pub,各个状态下采取动作对应的即时奖励 R R R 的值在相关弧线上。现需要找到最优的状态价值或动作价值函数,以期能够达成最优策略。

在这里插入图片描述
其中,在每个非结束状态处,都有两种可选择的动作,假设该例子中给定的策略 π \pi π 是随机策略,在每个非结束状态都有 π ( a ∣ s ) = 0.5 \pi(a|s)=0.5 π(as)=0.5 的概率选择其中一个动作,且定义奖励衰减因子 γ = 1 \gamma=1 γ=1,即初始策略下会考虑当前及未来全量的累积奖励。

设置终点状态的价值为 0 0 0,其他各个非结束状态的初始估计值设为 0 0 0。定义左上 s 1 s_1 s1、左下 s 2 s_2 s2、中下 s 3 s_3 s3、右下 s 4 s_4 s4 四个圆圈的状态价值为 v 1 , v 2 , v 3 , v 4 v_1,v_2,v_3,v_4 v1,v2,v3,v4

2.2 策略评估(预测)

利用动态规划求解给定策略下的状态价值函数,这个是强化学习的预测问题,通常称为策略评估(Policy Evaluation)。该方法下的基本思路是,从任意一个初始状态价值函数开始,依据给定的策略,结合贝尔曼方程、状态转移概率和动作的即时奖励,同步地迭代更新状态价值函数,直至其收敛(状态估计价值的迭代更新量非常少),即为该策略下最终的状态价值函数。

通过以下公式迭代地更新各个状态的估计价值:

v ( k + 1 ) ( s ) = ∑ a ∈ A π ( a ∣ s ) ( R t a + γ ∑ s ′ ∈ S ( P s s ′ a v ( k ) ( s ′ ) ) ) v_{(k+1)}(s)=\sum_{a\in A} \pi(a|s)(R_t^a+\gamma \sum_{s'\in S}(P^a_{ss'}v_{(k)}(s'))) v(k+1)(s)=aAπ(as)(Rta+γsS(Pssav(k)(s)))

例如,初始时 v 1 = 0 , v 2 = 0 , v 3 = 0 , v 4 = 0 v1=0,v2=0,v3=0,v4=0 v1=0,v2=0,v3=0,v4=0,将该值代入上式,得到第 1 1 1 代的状态价值 v 1 1 = 0.5 × ( − 1 + 0 ) + 0.5 × ( 0 + 0 ) = − 0.5 v^1_1=0.5\times (-1+0)+0.5\times (0+0)=-0.5 v11=0.5×(1+0)+0.5×(0+0)=0.5,依次类推,迭代 10 10 10 次的代码及迭代后的结果如下:

v1,v2,v3,v4,v5 = 0,0,0,0,0
print(f"k={0} v1={v1}, v2={v2}, v3={v3}, v4={v4}")
for k in range(1, 10):
    new_v1 = 0.5*(-1+v1) + 0.5 * (v2)
    new_v2 = 0.5*(-1+v1) + 0.5 * (-2+v3)
    new_v3 = 0.5 * (-2+v4)
    new_v4 = 0.5*10 + 0.5 * (1+0.2*v2+0.4*v3+0.4*v4)
    v1,v2,v3,v4 = new_v1,new_v2,new_v3,new_v4
    print(f"k={k} v1={v1}, v2={v2}, v3={v3}, v4={v4}")
k=0 v1=0, v2=0, v3=0, v4=0
k=1 v1=-0.5, v2=-1.5, v3=-1.0, v4=5.5
k=2 v1=-1.5, v2=-2.25, v3=1.75, v4=6.25
k=3 v1=-2.375, v2=-1.375, v3=2.125, v4=6.875
k=4 v1=-2.375, v2=-1.625, v3=2.4375, v4=7.1625
k=5 v1=-2.5, v2=-1.46875, v3=2.58125, v4=7.2575
k=6 v1=-2.484375, v2=-1.459375, v3=2.62875, v4=7.320875
k=7 v1=-2.471875, v2=-1.4278125, v3=2.6604375, v4=7.3439875
k=8 v1=-2.44984375, v2=-1.40571875, v3=2.67199375, v4=7.35810375
k=9 v1=-2.42778125, v2=-1.388925, v3=2.679051875, v4=7.365447625

最终的结果收敛至给定策略下的状态价值函数,即得到了所有状态的基于随机策略的估计价值。

如上式所示,如果策略评估基于的是非常复杂的模型(状态空间、动作空间庞大)的话,动态规划的计算量仍非常庞大,每次迭代都对所有的状态价值进行更新的方法称为 同步动态规划算法,相比于 异步动态规划算法,同步更新的方法可能会导致更多的计算消耗,但相对更容易实现,以及在一些情况下更容易证明其收敛性。而异步更新的方式更适合于大规模状态空间的问题,即每次迭代有选择地更新部分状态,能极大提高算法效率,但由于更新的不确定性,其收敛性难以保证。

2.3 策略迭代(控制)

同理,我们利用动态规划的方法求解最优价值函数,这个是强化学习的控制问题,通常称为策略迭代(Policy Iteration)。类似于策略评估,该价值迭代能够从任意的初始状态价值函数迭代收敛至最优价值函数。

假设最优策略为 π ∗ \pi_* π,最优价值函数为 v ∗ v_* v,基于贪婪策略,智能体在某个状态下选择的行为是能,使其能够达到后续可能的状态中估计价值最大的。具体通过以下公式迭代地更新各个状态的最优估计价值,每经过一次迭代,状态的估计价值更倾向于选择的最优策略对应的后续状态:

v ∗ k + 1 ( s ) = max ⁡ a ( R t a + γ ∑ s ′ ∈ S ( P s s ′ a v ∗ k ( s ′ ) ) ) v_{*}^{k+1}(s)=\max_{a} (R_t^a+\gamma \sum_{s'\in S}(P^a_{ss'}v_{*}^k(s'))) vk+1(s)=amax(Rta+γsS(Pssavk(s)))

更多时候,由于模型及其复杂,需要先对当前策略进行评估,得到当前策略的最终状态价值,再根据该状态价值以一定的方法(比如贪婪法)更新策略 π ∗ \pi_* π,循环该过程直至收敛到最优价值函数(策略)。
在这里插入图片描述
如上面的策略评估结果,在 k = 3 k=3 k=3 时,根据得到的状态价值就能得到最优的动作策略,因此在这里并不需要继续迭代至收敛,而是可以开始迭代地更新策略,这样能使得问题求解的收敛速度更快。

这里演示策略的迭代过程,例如,初始的状态价值为 v 1 = 0 , v 2 = 0 , v 3 = 0 , v 4 = 0 v1=0,v2=0,v3=0,v4=0 v1=0,v2=0,v3=0,v4=0,将该值代入上式,更新得到第 1 1 1 代的状态估计价值,依次类推,迭代 10 10 10 次的代码及迭代的结果如下:

v1,v2,v3,v4,v5 = 0,0,0,0,0
print(f"k={0} v1={v1}, v2={v2}, v3={v3}, v4={v4}")
for K in range(1, 10):
    v1 = max(0+v2, -1+v1)
    v2 = max(-1+v1, -2+v3)
    v3 = max(0, -2+v4)
    v4 = max(10, 1+0.2*v2+0.4*v3+0.4*v4)
    print(f"K={K} v1={v1}, v2={v2}, v3={v3}, v4={v4}")
k=0 v1=0, v2=0, v3=0, v4=0
K=1 v1=0, v2=-1, v3=0, v4=10
K=2 v1=-1, v2=-2, v3=8, v4=10
K=3 v1=-2, v2=6, v3=8, v4=10
K=4 v1=6, v2=6, v3=8, v4=10
K=5 v1=6, v2=6, v3=8, v4=10
K=6 v1=6, v2=6, v3=8, v4=10
K=7 v1=6, v2=6, v3=8, v4=10
K=8 v1=6, v2=6, v3=8, v4=10
K=9 v1=6, v2=6, v3=8, v4=10

由于该案例较为简单,在迭代到第 4 4 4 代时,价值函数已经收敛到最优。

总的而言,动态规划在求解规模较小的强化学习问题时易实现且有效,但当问题规模增大时,例如每个状态后续的可能状态非常多时,每次迭代都要对这些状态及之后的状态价值进行更新,总的计算量将指数级增长,因此,针对这个问题有学者提出蒙特卡洛方法来求解强化学习,该方法将在后续文章中进行介绍。


  1. 强化学习(三)用动态规划(DP)求解:https://www.cnblogs.com/pinard/p/9463815.html ↩︎

  2. UCL 强化学习第二章节讲义 https://www.davidsilver.uk/wp-content/uploads/2020/03/MDP.pdf ↩︎

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32 软件I2C方式读取MT6701磁编码器获取角度例程

STM32 软件I2C方式读取MT6701磁编码器获取角度例程 📍相关篇《STM32 软件I2C方式读取AS5600磁编码器获取角度例程》🌿《Arduino通过I2C驱动MT6701磁编码器并读取角度数据》🔰MT6701芯片和AS5600从软件读取对比,只是读取的寄存器和…

Adobe AE(After Effects)2024下载地址及安装教程

Adobe After Effects是一款专业级别的视觉效果和动态图形处理软件,由Adobe Systems开发。它被广泛用于电影、电视节目、广告和其他多媒体项目的制作。 After Effects提供了强大的合成和特效功能,可以让用户创建出令人惊艳的动态图形和视觉效果。用户可以…

【OpenGL实验】在python、Qt5、pyOpenGL程序的若干要点

实验效果图: 代码 目录 一、说明二、关于QGLWidget2.1 三个方便的虚函数2.2 析构函数2.3 QGLWidget析构函数 三、关于QGLWidget的三个虚函数分工3.1 initializeGL:数据准备、数据绑定分离3.2 resizeGL:视角改变函数3.3 paintGL:…

苍穹外卖分类管理

分析 需求分析 SQL的写法 1 在mapper中写 2 在xml中写 Mapper public interface CategoryMapper {/*** 插入数据* param category*/AutoFill(OperationType.INSERT)Insert("insert into category(type, name, sort, status, create_time, update_time, create_user, upd…

docker安装并跑通QQ机器人实践(2)-签名服务器bs-qsign搭建

在前文中,我们详尽阐述了QQ机器人的搭建过程及其最终实现的各项功能展示。接下来,我们将转向探讨该项目基于Docker构建服务的具体实践。本篇将以QQ机器人签名服务——qsign为起点,逐步展开论述。 1 获取和运行 xzhouqd/qsign:8.9.63 镜像 1.…

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从)

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从) 一、准备工作二、搭建nfs服务器2.1 安装 NFS 服务器软件包(所有节点执行)2.2 设置共享目录2.3 启动 NFS 服务器2.4 设置防火墙规则(可选&am…

【ROS2】搭建ROS2-Humble + Vscode开发流程

【ROS2】搭建ROS2-Humble Vscode开发流程 文章目录 【ROS2】搭建ROS2-Humble Vscode开发流程1.基本环境配置2.搭建Vscode开发环境 1.基本环境配置 基本的环境配置包括以下步骤: 安装ROS2-Humble,可以参考这里安装一些基本的工具,可以参考…

Webrtc 信令服务器实现

webrtc建联流程图 由上图可知,所谓的信令服务器其实就是将peer的offer/candidate/answer传给对端而已。这样的话实现方式就有很多种了,目前普遍的方式HTTP/HTTPS,WS/WSS。像webrtc-demo-peerconnection就是实现HTTP这种方式。本文使用WS&…

APIGateway的认证

APIGateway的支持的认证如下: 我们从表格中可以看到,HTTP API 不支持资源策略的功能,另外是通过JWT的方式集成Cognito的。 对于REST API则是没有显示说明支持JWT认证,这个我们可以通过Lambda 自定义的方式来实现。 所以按照这个…

LangChain-Chatchat 开源知识库来了

LangChain-Chatchat 开源知识库来了 LangChain-Chatchat 架构设计LangChain-ChatChat 具体实现过程 一键本地离线部署软件环境硬件环境支持三种部署方式 LangChain-Chatchat 是基于 ChatGLM 等大语言模型与 LangChain 等应用框架实现,开源、可离线部署的 RAG 检索增…

Django数据导出与导入问题

执行: python manage.py loaddata data.json 的常见错误: * 1. UnicodeDecodeError: utf-8 codec cant decode byte 0xff in position 0: invalid start byte* 2. raise JSONDecodeError("Unexpected UTF-8 BOM (decode using utf-8-sig)",...django.core.serializer…

vue的就地更新与v-for的key属性

vue的就地更新 Vue中的就地更新到底是怎么回事,为什么会存在就地更新的现象? 注意下面的例子,使用v-for指令时,没有绑定key值,才有就地更新的现象,因为Vue默认按照就地更新的策略来更新v-for渲染的元素列表…

windows Webrtc +VS2019 (M124)下载编译以及调通测试demo

下载depot tools 设置梯子 git config --global http.proxy 127.0.0.1:10000 git config --global https.proxy 127.0.0.1:10000 下载 $ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git 设置depot_tools目录为环境变量 下载webrtc # 设置系统代…

CommunityToolkit.Mvvm笔记1---Instruction

CommunityToolkit.Mvvm是一个官方社区套件(Windows Community Toolkit),延续了MVVMLight的风格,是一个现代、快速和模块化的 MVVM 库。 它是 .NET 社区工具包的一部分。 第一:入门安装 1,用NuGget安装,搜索Community…

.NET 发布,部署和运行应用程序

.NET应用发布 发布.Net应用有很多种方式,下面列举三种发布方式: 单文件发布跨平台发布Docker发布 单文件发布 右键工程,选择“发布”,部署模式选择“独立”,目标运行时选择自己想要部署到的系统,我这里用…

【Windows10】Anaconda3安装+pytorch+tensorflow+pycharm

文章目录 一、下载anaconda0.双击下载的文件1. 选择All users2. 安装路径3. 勾选环境变量和安装python4.安装完成5.添加环境变量6.测试是否安装成功 二、安装pytorch(先看四!先检查一下自己电脑是不是只能安装GPU版的1.查看conda图形化界面2.在安装pytor…

ES源码二:集群启动过程

命令行参数解析 Elasticsearch:在main里面创建了Elasticsearch实例,然后调用了main方法,这个main方法最终会调用到父类Command的main方法 这里做了几件事: 注册一个 ShutdownHook,其作用就是在系统关闭的时候捕获IO…

使用SpringBoot3+Vue3开发公寓管理系统

项目介绍 公寓管理系统可以帮助公寓管理员更方便的进行管理房屋。功能包括系统管理、房间管理、租户管理、收租管理、房间家具管理、家具管理、维修管理、维修师傅管理、退房管理。 功能介绍 系统管理 用户管理 对系统管理员进行管理,新增管理员,修改…

CentOS 7开机启动过程,引导和服务,密码的修改

开机启动过程: 引导过程:1.开机自检(BIOS)->2.MBR引导->GRUB菜单->加载内核kernel->systemd进程初始化 程序:执行特定任务的一串代码,静态,存在硬盘中。 进程:运行中的程序叫进程&#xff0…

Unity 点击次数统计功能

介绍 💡.调用方便,发生点击事件后直接通过"xxx".CacheClick缓存 💡. 在允许的时间间隔内再次点击会累计点击次数,直到超出后触发事件 传送门👈