贝尔曼最优方程【BOE】

news2024/11/17 12:20:17

强化学习笔记

主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程,个人觉得赵老师的课件深入浅出,很适合入门.

第一章 强化学习基本概念
第二章 贝尔曼方程
第三章 贝尔曼最优方程


文章目录

  • 强化学习笔记
  • 一、最优策略
  • 二、贝尔曼最优方程(BOE)
  • 三、BOE的求解
    • 1 求解方法
    • 2 实例
  • 四、BOE的最优性
  • 参考资料


上一节讲了贝尔曼方程,这一节继续在贝尔曼方程的基础上讲贝尔曼最优方程,后面的策略迭代和值迭代算法都是根据贝尔曼最优方程来的.

一、最优策略

强化学习的最终目标是获得最优策略,所以有必要首先定义什么是最优策略。该定义基于状态值,比如,我们考虑两个给定策略 π 1 \pi_1 π1 π 2 \pi_2 π2。若任一状态 π 1 \pi_1 π1的状态值大于等于 π 2 \pi_2 π2的状态值,即:
v π 1 ( s ) ≥ v π 2 ( s ) , ∀ s ∈ S , v_{\pi_1}(s)\geq v_{\pi_2}(s),\quad\forall s\in\mathcal{S}, vπ1(s)vπ2(s),sS,
那么我们称 π 1 \pi_1 π1是比 π 2 \pi_2 π2更好的策略.最优策略就是所有可能的策略中最好的,定义如下:

截屏2024-03-19 16.34.52

如何得到这个策略呢?需要求解贝尔曼最优方程.

二、贝尔曼最优方程(BOE)

贝尔曼最优方程(Bellman Optimal Equation,BOE),就是最优策略条件下的贝尔曼方程
v ( s ) = max ⁡ π ∑ a π ( a ∣ s ) ( ∑ r p ( r ∣ s , a ) r + γ ∑ s ′ p ( s ′ ∣ s , a ) v ( s ′ ) ) , ∀ s ∈ S = max ⁡ π ∑ a π ( a ∣ s ) q ( s , a ) s ∈ S \begin{aligned} v\left(s\right)& =\max_{\pi}\sum_{a}\pi(a|s)\left(\sum_{r}p(r|s,a)r+\gamma\sum_{s'}p(s'|s,a)v(s')\right),\quad\forall s\in\mathcal{S} \\ &=\max_{\pi}\sum_{a}\pi\left(a|s\right)q\left(s,a\right)\quad s\in{\mathcal S} \end{aligned} v(s)=πmaxaπ(as)(rp(rs,a)r+γsp(ss,a)v(s)),sS=πmaxaπ(as)q(s,a)sS
注意:

  1. p ( r ∣ s , a ) , p ( s ′ ∣ s , a ) p(r|s,a),p(s^{\prime}|s,a) p(rs,a),p(ss,a) 给定
  2. v ( s ) , v ( s ′ ) v(s),v(s^{\prime}) v(s),v(s) 是需要计算的变量
  3. π \pi π为优化变量

我们可以发现贝尔曼最优方程存在两个未知数 v v v π \pi π,一个方程怎么求解两个未知数呢?我们以下列式子说明,是可以求解的。
截屏2024-03-17 15.26.11

也就是说在求解时,可以固定一个变量,先求max的变量.

截屏2024-03-17 15.28.38

受上面例子的启发,考虑到 ∑ a π ( a ∣ s ) = 1 \sum_a\pi(a|s)=1 aπ(as)=1,我们有:

υ ( s ) = max ⁡ π ∑ a π ( a ∣ s ) ( ∑ r p ( r ∣ s , a ) r + γ ∑ s ′ p ( s ′ ∣ s , a ) v ( s ′ ) ) , = max ⁡ π ∑ a π ( a ∣ s ) q ( s , a ) = max ⁡ a ∈ A ( s ) q ( s , a ) \begin{aligned} \upsilon(s)& \begin{aligned}=\max_{\color{red}{\pi}}\sum_{a}\pi(a|s)\left(\sum_{r}p(r|s,a)r+\gamma\sum_{s'}p(s'|s,a)v(s')\right),\end{aligned} \\ &=\max_{\color{red}{\pi}}\sum_{a}\color{red}{\pi(a|s)}q(s,a) \\ &=\max_{\color{red}{a\in\mathcal{A}(s)}}q(s,a) \end{aligned} υ(s)=πmaxaπ(as)(rp(rs,a)r+γsp(ss,a)v(s)),=πmaxaπ(as)q(s,a)=aA(s)maxq(s,a)
我们通过先对 π \pi π变量求max,最后将问题转换为:
v ( s ) = max ⁡ a ∈ A ( s ) q ( s , a ) v(s)=\max_{\color{red}{a\in\mathcal{A}(s)}}q(s,a) v(s)=aA(s)maxq(s,a)而这个方程与 π \pi π无关了,只有一个变量,那就是 v ( s ) v(s) v(s)(向量形式),如何求解这个方程呢?下面介绍如何用迭代法进行求解.

三、BOE的求解

1 求解方法

我们考虑BOE的向量形式:
v = f ( v ) = max ⁡ π ( r π + γ P π v ) v=f(v)=\max_{\pi}(r_\pi+\gamma P_\pi v) v=f(v)=πmax(rπ+γPπv)而这个函数 f f f是一个压缩映射,压缩常数为 γ \gamma γ,证明见参考资料1的对应章节。什么是压缩映射?
定义(压缩映射)

如果存在 α ∈ ( 0 , 1 ) \alpha\in(0,1) α(0,1),使得函数 g g g ∀ x 1 , x 2 ∈ dom ⁡ g \forall x_1,x_2\in \operatorname{dom} g x1,x2domg满足
∥ g ( x 1 ) − g ( x 2 ) ∥ ≤ α ∥ x 1 − x 2 ∥ \|g(x_1)-g(x_2)\|\leq\alpha\|x_1-x_2\| g(x1)g(x2)αx1x2则我们称 g g g为一个压缩映射,称常数 α \alpha α为压缩常数.

f f f是压缩映射有什么用呢?这里需要先介绍一下压缩映射原理.

定理(压缩映射原理)

g g g [ a , b ] [a,b] [a,b] 上的一个压缩映射,则

  1. g g g [ a , b ] [ a, b] [a,b]存在唯一的不动点 ξ = g ( ξ ) \xi=g\left(\xi\right) ξ=g(ξ) ;
  2. 任何初始值 x 0 ∈ [ a , b ] x_0\in[a,b] x0[a,b] 和递推公式
    x n + 1 = g ( x n ) , n ∈ N ∗ x_{n+1}=g\left(x_n\right),n\in N^* xn+1=g(xn)nN 生成的数列 { x n } \{x_n\} {xn} 一定收敛于 ξ \xi ξ.

这也就是说,压缩映像原理给出了一个求不动点的方法,而BOE的 f f f是压缩映射,因此我们有

截屏2024-03-19 19.29.54

具体来看每一次迭代怎么算:

截屏2024-03-19 19.32.10

当我们计算每个状态 s s s时,我们由 v k ( s ′ ) v_k(s') vk(s)可以计算得到 q k ( s , a ) q_k(s,a) qk(s,a),然后再求最大就得到 v k + 1 ( s ) v_{k+1}(s) vk+1(s)了。值得注意的是上述方程右端取得最优值时,我们有:
π k + 1 ( a ∣ s ) = { 1 a = a ∗ , 0 a ≠ a ∗ . \pi_{k+1}(a|s)=\begin{cases} 1 & a=a^*,\\ 0 & a\neq a^*. \end{cases} πk+1(as)={10a=a,a=a.其中 a ∗ = arg ⁡ max ⁡ a q k ( s , a ) a^*=\arg\max\limits_a q_k(s,a) a=argamaxqk(s,a),这个策略被称为greedy policy,也就是每次都选择动作值(q值)最大的动作.

Note:

  • 值得注意的是,任意给 v 0 ∈ dom ⁡ f v_0\in\operatorname{dom} f v0domf,都能收敛到不动点.

2 实例

我们考虑如下这样一个问题,还是智能体走格子:

  • 状态集: s 1 , s 2 , s 3 s_1,s_2,s_3 s1,s2,s3其中 s 2 s_2 s2是目标状态.
  • 动作集: a l , a 0 , a r a_l,a_0,a_r al,a0,ar分别代表向左、原地不动、向右.
  • 奖励:进入 s 2 s_2 s2+1,走出格子-1。

截屏2024-03-19 19.45.20
回顾上一章讲动作值函数和状态值函数的关系,我们可以写出 q ( s , a ) q(s,a) q(s,a) v ( s ) v(s) v(s)的关系:
截屏2024-03-19 19.48.32
下面给定一个 v ( s ) v(s) v(s)的初始值,进行迭代:
截屏2024-03-19 19.53.21

显然,从直观上我们知道当前策略已经是最好的了。如果继续进行迭代,得到的策略不会再改变了,那么迭代算法怎么停止呢?停止准则可以通过如下公式进行判断:
∥ v k + 1 − v k ∥ ≤ ϵ \|v_{k+1}-v_k\|\leq\epsilon vk+1vkϵ其中 ϵ \epsilon ϵ是一个给定的很小的值,也就是相邻两次 v v v相差很小时,我们认为 v v v已经逼近精确值了.

四、BOE的最优性

上面介绍怎么求解BOE的过程中,我们同时通过greedy policy的方法得到了最优策略:
π ∗ = arg ⁡ max ⁡ π ( r π + γ P π v ∗ ) \pi^*= \arg\max\limits_\pi (r_\pi+\gamma P_\pi v^*) π=argπmax(rπ+γPπv)其中 v ∗ v^* v π ∗ \pi^* π对应的状态值,那么求解贝尔曼最优方程得到的这个 π ∗ \pi^* π是不是最优策略呢?有如下定理进行保证.

截屏2024-03-19 20.08.54

这个定理保证了,我们通过求解BOE得到的策略是最优策略,证明见参考资料1的对应章节.

截屏2024-03-19 20.10.41

参考资料

  1. Zhao, S. Mathematical Foundations of Reinforcement Learning. Springer Nature Press and Tsinghua University Press.
  2. Sutton, Richard S., and Andrew G. Barto. Reinforcement learning: An introduction. MIT press, 2018.

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

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

相关文章

边缘计算【智能+安全检测】系列教程-- Jeton Agx Orin 基础环境搭建

1 .前期准备 Jetson Agx Orin 比Jetson Agx Orin Xavier的算力要高,性能要好通常用来做自动驾驶的AI推理,具体外观如下图 1.刷机软件sdkmanager:下载链接 NVIDIA账号需要注册,正常一步一步往下走就行。在ubuntu18以上的系统安…

每日一题 --- 两两交换链表中的节点[力扣][Go]

两两交换链表中的节点 题目:24. 两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1&a…

图解Kafka架构学习笔记(三)

准备Kafka环境 这里推荐使用Docker Compose快速搭建一套本地开发环境。 以下docker-compose.yml文件用来搭建一套单节点zookeeper和单节点kafka环境,并且在8080端口提供kafka-ui管理界面。 version: 2.1services:zoo1:image: confluentinc/cp-zookeeper:7.3.2hos…

ARMday7作业

实现三个按键的中断,现象和代码 do_ipr.c #include "stm32mp1xx_gic.h" #include "stm32mp1xx_exti.h" extern void printf(const char *fmt, ...); unsigned int i 0; void do_irq(void) {//获取要处理的中断的中断号unsigned int irqnoGI…

抽取CLOB字段中XML的特定元素的VALUE值

在ORACLE数据库中,有时XML文件会被保存在CLOB字段中。 这时候,若是我们要获取此字段XML中特定元素的VALUE值,就需要用到xmltype 这个函数。 如下面的 XML文件,保存在 TABLE_A 的CLOB_K 字段,若是我们要获取其中的 Y…

Windows11 安装VitrulBox Ubuntu20 虚拟机启动后卡在“Freeing initrd memory: 131304K”

步骤:点击启动Ubuntu后,一直起不来?没办法正常关机,选择重启又一直卡在这里,原来是同样的错误 Freeing initrd memory: 131304K 原因:本机联想小新14Pro,AMD 7840HS,锐龙版。而Ryze…

OpenCV4.9.0开源计算机视觉库核心功能(核心模块)

转到:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV 介绍使用 下一篇:如何使用OpenCV扫描图像、查找表和时间测量 ​ OpenCV核心功能主要有以下各个:本文将开始介绍下列内容: Mat - 基…

深度学习pytorch——可视化visdom(持续更新)

安装可看:e: Error while finding module specification for ‘visdom.server‘ (ModuleNotFoundError: No module name-CSDN博客 在命令行窗口使用python -m visdom.server,会出现一个web地址,在浏览器中访问,即可看见在python中…

nvm更换node.js的版本

自行下载nvm 打开cmd 1. nvm ls 列出目前已经下载的node版本,和正在使用的node版本 2. nvm install v版本号 下载某个版本 3. nvm uninstall v版本号 卸载某个版本 4. nvm use 版本号 切换到某个版本

树状数组原理和代码

树状数组 求下标的对应 求i管着的下标的范围 方法:拆掉最右侧的1然后1 到你自己 query sum 1-i的和 拆掉最右侧的1 再把下一个数值吸收到sum 重复这个过程直到全变0为止 add 方法:加上最右侧的1 到上限为止 lowbit方法 单点增加范围查询模板 #inc…

[leetcode] 240. 搜索二维矩阵 II

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,…

从抛硬币试验看概率论的基本内容及统计方法

一般说到概率,就喜欢拿抛硬币做例子。大多数时候,会简单认为硬币正背面的概率各为二分之一,其实事情远没有这么简单。这篇文章会以抛硬币试验为例子并贯穿全文,引出一系列概率论和数理统计的基本内容。这篇文章会涉及的有古典概型…

Java实现JDBC编程

1 数据库编程的必备条件 编程语言,如Java,C、C、Python等 数据库,如Oracle,MySQL,SQL Server等 数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如&#x…

【Linux】对进程地址空间的理解

一、关于进程地址空间的简单理解 进程地址空间其实是分了很多个区域的,区域划分的本质就是区域内的各个地址都是可以使用的。如同下面这个图所示: 无论是环境变量的地址还是环境变量表的地址,所存放的地址都在栈的上部。这里的已初始化数据和…

java多线程编程面试题总结

一些最基本的基础知识就不总结了,参考之前写的如下几篇博客,阅读顺序从上到下,依次递进。 java 多线程 多线程概述及其三种创建方式 线程的常用方法 java 线程安全问题 三种线程同步方案 线程通信(了解) java 线程池…

JavaEE企业级分布式高级架构师课程

教程介绍 本课程主要面向1-5年及以上工作经验的Java工程师,大纲由IT界知名大牛 — 廖雪峰老师亲自打造,由来自一线大型互联网公司架构师、技术总监授课,内容涵盖深入spring5设计模式/高级web MVC开发/高级数据库设计与开发/高级响应式web开发…

arm作业3

key_inc.c #include"key_inc.h"void key1_it_config(){//使能GPIOF外设时钟RCC->MP_AHB4ENSETR | (0x1<<5);//将PF9设置为输入模式GPIOF->MODER & (~(0x3<<18));//设置由PF9管脚产生EXTI9事件EXTI->EXTICR3 & (~(0XFF<<8));EXTI-…

微服务(基础篇-002-Ribbon)

目录 Ribbon负载均衡&#xff08;1&#xff09; 负载均衡的原理&#xff08;1.1&#xff09; 负载均衡策略&#xff08;1.2&#xff09; Ribbon-IRule(1.2.1) 修改负载均衡的方法&#xff08;1.2.2&#xff09; 懒加载&#xff08;1.3&#xff09; 饥饿加载&#xff08;1…

【Linux】模拟实现shell(bash)

目录 常见的与shell互动场景 实现代码 全部代码 homepath()接口 const char *getUsername()接口 const char *getHostname()接口 const char *getCwd()接口 int getUserCommand(char *command, int num)接口 void commandSplit(char *in, char *out[])接口 int execut…

python每日可视化分析:从过去到现代数据分析的演进

分析目标 本文旨在探索数据分析发展历程中的关键时刻&#xff0c;包括重要人物的贡献和大事件的发生。通过对比不同年代的数据分析技术和方法&#xff0c;我们可以更好地理解数据分析如何成为今天决策制定不可或缺的一部分。 分析步骤 收集数据&#xff1a;搜集关于数据分析历…