【强化学习-读书笔记】动态规划(策略评估、价值迭代、策略迭代算法)

参考 
Reinforcement Learning, Second Edition  
An Introduction 
By Richard S. Sutton and Andrew G. Barto

动态规划 (Dynamic Programming, DP) 是一类优化方法,在给定一个用马尔可夫决策过程 (MDP) 描述的完备环境模型的情况下,其可以计算最优的策略。

Recall: Bellman Equation

我们知道 v π v_\pi vπ的贝尔曼方程可以写作如下形式:
v π ( s ) = ∑ a π ( a ∣ s ) ∑ s ′ , r p ( s ′ , r ∣ s , a ) [ r + γ v π ( s ′ ) ] v_\pi(s)=\sum_a \pi(a|s) \sum_{s',r} p(s',r|s,a)[r+\gamma v_{\pi}(s')] vπ(s)=aπ(as)s,rp(s,rs,a)[r+γvπ(s)]
如何求解最优策略 v ∗ ( s ) v_*(s) v(s)呢?
实际上对于每一个可能的状态 s ∈ S s\in \mathcal{S} sS,都有这样的一个方程,因此可以通过解这样一组贝尔曼方程组来直接求解出 v ∗ ( s ) v_*(s) v(s)。但是问题在于许多场景的状态空间很大,因此难以直接利用解方程的方式来求。因此我们考虑迭代的方式。

Example Task —— 最短路径任务

在这里插入图片描述
为了说明以下三个不同的算法,我们引入一个 exmaple task。 智能体的目标是找到从任意一个点出发怎么走才能最快到达图上的两个终止状态。每走一步, r = − 1 r=-1 r=1;如果出界,就保持原来的状态不动。
我们希望智能体能够找到最优价值函数 v ∗ ( s ) v_*(s) v(s) 或者最优策略 π ∗ ( a ∣ s ) \pi_*(a|s) π(as)(以矩阵表示)
在这里插入图片描述

策略评估算法

策略评估(Policy Evaluation)算法的核心思想在于,如果存在最优价值函数 v ∗ ( s ) v_*(s) v(s),那么 v ∗ ( s ) v_*(s) v(s)实际上就是贝尔曼方程的一个不动点,我们从任意一个 V 0 V_0 V0出发,不断迭代贝尔曼方程,最终收敛到的价值函数就是最优价值函数。 Δ \Delta Δ记录前后两个价值函数矩阵的最大差值,当差值足够小,就认为找到了 v ∗ ( s ) v_*(s) v(s)
在这里插入图片描述

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
STOP = np.array([[1,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,1]
])
V = np.array([[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]
]).astype('float')
V_new = V.copy()
actions = [(0,1),(1,0),(0,-1),(-1,0)]
gamma = 1.0
states = [(i,j) for i in range(4) for j in range(4)]
print(states)
for step in range(100):                                        # 对应贝尔曼方程for state in states:                                       # for s \in Sif STOP[state]:continuev = V[state]res = 0for action in actions:                                 # \sum as_next = [action[0]+state[0], action[1]+state[1]]# 处理边界动作if s_next[0]<0:s_next[0]=0if s_next[0]>3:s_next[0]=3if s_next[1]<0:s_next[1]=0if s_next[1]>3:s_next[1]=3# print(state,'a:',action,'-> s',s_next)r = -1                                             # 每走一步奖励固定是 -1res += 1/4 * (r + gamma * V[tuple(s_next)])        # \pi(a|s) [r + \gamma V(s)]V_new[state] = resdelta = (abs(V_new-V)).max()V = V_new.copy()if delta < 0.01:plt.figure(figsize=(3,2))sns.heatmap(V,annot=True,cmap='Blues_r')plt.title('$V_\pi(s)$ @ step={}  $\Delta$={:0.4f}'.format(step,delta),color='green')plt.xlabel('x66ccff')plt.ylabel('迭代策略评估')plt.show()print('break at delta={:.4f}, step={}'.format(delta, step))breakelif step <= 3:plt.figure(figsize=(3,2))sns.heatmap(V,annot=True,cmap='Blues_r')plt.title('$V_\pi(s)$ @ step={}  $\Delta$={:0.4f}'.format(step,delta),color='black')plt.ylabel('迭代策略评估')plt.show()

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
策略评估使用了长达 88 步才达到收敛

价值迭代(Value Iteration)

价值迭代仅仅是将贝尔曼最优方程变为一条更新规则。另外,除了从达到最大值的状态更新以外,价值迭代与策略评估的更新公式几乎完全相同

价值迭代(v 更新取 max)和策略评估(不动点)的区别仅仅在于多了一个取所有后继状态的价值的 max ⁡ \max max ,而不是平均(期望)价值。
在这里插入图片描述

STOP = np.array([[1,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,1]
])
V = np.array([[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]
]).astype('float')
V_new = V.copy()
actions = [(0,1),(1,0),(0,-1),(-1,0)]
gamma = 1.0
states = [(i,j) for i in range(4) for j in range(4)]
print(states)
for step in range(100):                                        # 对应贝尔曼方程for state in states:                                       # for s \in Sif STOP[state]:continuev = V[state]# res = 0res_a_ls = []                                          # <------ 修改的地方for action in actions:                                 # \sum as_next = [action[0]+state[0], action[1]+state[1]]# 处理边界动作if s_next[0]<0:s_next[0]=0if s_next[0]>3:s_next[0]=3if s_next[1]<0:s_next[1]=0if s_next[1]>3:s_next[1]=3# print(state,'a:',action,'-> s',s_next)r = -1                                             # 每走一步奖励固定是 -1# res += 1/4 * (r + gamma * V[tuple(s_next)])        # \pi(a|s) [r + \gamma V(s)]res_a = (r + gamma * V[tuple(s_next)])               # <------ 修改的地方res_a_ls.append(res_a)                               # <------ 修改的地方V_new[state] = max(res_a_ls)                             # <------ 修改的地方 delta = (abs(V_new-V)).max()V = V_new.copy()if delta < 0.01:plt.figure(figsize=(3,2))sns.heatmap(V,annot=True,cmap='Blues_r')plt.title('$V_\pi(s)$ @ step={}  $\Delta$={:0.4f}'.format(step,delta),color='green')plt.xlabel('x66ccff')plt.ylabel('价值迭代')plt.show()print('break at delta={:.4f}, step={}'.format(delta, step))breakelif step <= 3:plt.figure(figsize=(3,2))sns.heatmap(V,annot=True,cmap='Blues_r')plt.title('$V_\pi(s)$ @ step={}  $\Delta$={:0.4f}'.format(step,delta),color='black')plt.ylabel('价值迭代')plt.show()

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
注意到,价值迭代只用了3步就达到了收敛,比策略评估算法快得多。

策略迭代(Policy Iteration)

策略迭代与前两者不同,不仅仅维护 V π ( s ) V_\pi(s) Vπ(s)矩阵,还维护表示策略的 π ( a ∣ s ) \pi(a|s) π(as)矩阵,两者交替进行更新

其分为两个阶段:

  • 策略评估(根据最优动作 π ( a ∣ s ) \pi(a|s) π(as) 更新 V π V_\pi Vπ,而不是求平均)
  • 策略改进(根据 V π V_\pi Vπ 更新每一个状态 s s s 的最优动作 π ( a ∣ s ) \pi(a|s) π(as)

因此策略迭代相当于在策略评估算法(但没有求平均,而是 π \pi π直接给出 a a a)的基础上,加了一个策略改进的部分。
在这里插入图片描述
在这里插入图片描述

STOP = np.array([[1,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,1]
])
V = np.array([[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]
]).astype('float')
V_new = V.copy()
actions = [(0,1),(1,0),(0,-1),(-1,0)]
gamma = 1.0
states = [(i,j) for i in range(4) for j in range(4)]
print(states)# 策略迭代新增
np.random.seed(42)
Policy = np.random.randint(0,4,16).reshape(4,4) # 随机初始化策略
Policy

array([[2, 3, 0, 2],
[2, 3, 0, 0],
[2, 1, 2, 2],
[2, 2, 3, 0]])

for step in range(100):                                        # 对应贝尔曼方程######################## a) 先根据策略Policy进行价值更新for state in states:                                       # for s \in Sif STOP[state]:continuev = V[state]res = 0# res_a_ls = []                             # <------修改的地方# for action in actions:                    # <------修改的地方  # 不需要 for aaction = actions[Policy[state]]             # <------修改的地方  # 根据 Policy 选择as_next = [action[0]+state[0], action[1]+state[1]]# 处理边界动作if s_next[0]<0:s_next[0]=0if s_next[0]>3:s_next[0]=3if s_next[1]<0:s_next[1]=0if s_next[1]>3:s_next[1]=3r = -1                                             # 每走一步奖励固定是 -1res = (r + gamma * V[tuple(s_next)])        # \pi(a|s) [r + \gamma V(s)]# res_a = (r + gamma * V[tuple(s_next)])     # <------修改的地方# res_a_ls.append(res_a)                     # <------修改的地方# V_new[state] = max(res_a_ls)               # <-------修改的地方V_new[state] = resdelta = (abs(V_new-V)).max()V = V_new.copy()############################ b) 对每一个状态更新策略for state in states:res_ls = []for i in range(4):s_next = [actions[i][0] + state[0] , actions[i][1] + state[1]]# 处理边界动作if s_next[0]<0:s_next[0]=0if s_next[0]>3:s_next[0]=3if s_next[1]<0:s_next[1]=0if s_next[1]>3:s_next[1]=3res_a = (r + gamma * V[tuple(s_next)])res_ls.append(res_a)best_action_index = np.argmax(res_ls)Policy[state] = best_action_indexif delta < 0.01:plt.figure(figsize=(3,2))sns.heatmap(V,annot=True,cmap='Blues_r')plt.title('$V_\pi(s)$ @ step={}  $\Delta$={:0.4f}'.format(step,delta),color='green')plt.xlabel('x66ccff')plt.ylabel('策略迭代')plt.show()print('break at delta={:.4f}, step={}'.format(delta, step))breakelif step <= 3:plt.figure(figsize=(3,2))sns.heatmap(V,annot=True,cmap='Blues_r')plt.title('$V_\pi(s)$ @ step={}  $\Delta$={:0.4f}'.format(step,delta),color='black')plt.ylabel('策略迭代')plt.show()

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

策略迭代也用了3步达到最优。这三种方法最终得到的 V π V_\pi Vπ都不同,但是都是最优策略(看图容易验证,只要往浅色区域走,总能最快到达终止位置)

异步动态规划

上面的三种算法都是完全遍历完所有状态 s s s,再进行策略/价值的更新的(实际上也就是存储了新旧两个矩阵)。关键问题在于,遍历所有状态很多情况下是不可能的,比如围棋的合法状态空间大概为 1 0 170 10^{170} 10170,这是没法遍历的。

异步 DP 就是选择性地更新某些状态,从而增加了算法的灵活性。可以选择任意的状态 s s s进行更新,有的状态可能已经更新了很多次,但是有的状态甚至可以没有更新。

异步 DP 的优势在于

  • 有可能减少计算量,并不需要完全遍历所有状态
  • 有可能多考虑一些关键状态,从而提高效率

广义策略迭代(GPI)

广义策略迭代 (GPI) 指让策略评估和策略改进相互作用的一般思路
策略迭代示意图

策略迭代包含两个过程:

  • π \pi π 更新 V V V a = arg ⁡ max ⁡ a π ( a ∣ s ) , a → s ′ → V ( s ′ ) a=\arg \max_a \pi(a|s), a \to s' \to V(s') a=argmaxaπ(as),asV(s)
  • V V V 更新 π \pi π(选择 max r + γ V ( s ′ ) r+\gamma V(s') r+γV(s) 的动作)

这两个过程交替进行。
广义策略迭代示意图

但是在广义策略迭代中,交替不是必须的也不是必须要更新所有状态

GPI 允许在某些特殊情况下甚至有可能仅有一个状态在评估流程中得到更新(用 π \pi π 更新 V V V),然后马上就返回到改进流程(用 V V V 更新 π \pi π)。

几乎所有的强化学习方法都可以被描述为 GPI 。也就是说,几乎所有方法都包含明确定义的策略和价值函数,且如右图所示,策略总是基于特定的价值函数进行改进,价值函数也始终会向对应特定策略的真实价值函数收敛。GPI 中,我们也可以让每次走的步子小一点,部分地实现其中一个目标。无论是哪种情况,尽管没有直接优化总目标.但评估和改进这两个流程结合在一起,就可以最终达到最优的总目标

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

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

相关文章

优化问题笔记(2)

目录 3. 约束优化问题的全局解3.1 凸优化问题3.2 二次优化问题3.3 无约束二次优化问题3.4 一个典型的二次等式约束二次优化问题 Reference 3. 约束优化问题的全局解 3.1 凸优化问题 局部解成为全局解的一类重要的优化问题是所谓凸优化问题. 我们称优化问题 ( f , D ) (f,\ma…

算法-动态规划

动态规划算法 应用场景-背包问题 介绍 动态规划(Dynamic Programming)算法的核心思想是&#xff1a;将大问题划分为小问题进行解决&#xff0c;从而一步步获取最优解的处理算法动态规划算法与分治算法类似&#xff0c;其基本思想也是将待求解问题分解成若干个子问题&#xff0…

Centos7运行pyppeteer报错Browser closed unexpectedly经验总结【必须手动安装谷歌浏览器以自动安装一些依赖】

参考解决方案&#xff1a;pyppeteer.errors.BrowserError: Browser closed unexpectedly - Stack Overflow ldd ~/.local/share/pyppeteer/local-chromium/588429/chrome-linux/chrome | grep not found 注意&#xff1a;安装google-chrome是为了安装这些缺失的so库&#xff0…

针对这两个趋势,3.0全新新零售商业模式可以采取以下策略:

国内市场确实存在“消费升级”和“消费降级”两个趋势&#xff0c;这是由于不同消费者群体的需求和购买力存在差异。消费升级主要发生在高端市场&#xff0c;消费者愿意为高品质、高价值、高价格的商品和服务付出更多。而消费降级则主要发生在中低端市场&#xff0c;消费者更加…

修改antd表单Form.Item的label颜色的方法

默认的Form.item的标签颜色为黑色&#xff0c;但是如果我是用深色背景&#xff0c;这样的情况下表单就看不清楚label了&#xff0c;就像下面的情况&#xff0c;密码两个字完全看不到&#xff0c;所以想把它改为白色字体&#xff0c;就像上面的账号两个字一样&#xff1a; 所以怎…

随笔记录-springboot_LoggingApplicationListener+LogbackLoggingSystem

环境&#xff1a;springboot-2.3.1 加载日志监听器初始化日志框架 SpringApplication#prepareEnvironment SpringApplicationRunListeners#environmentPrepared EventPublishingRunListener#environmentPrepared SimpleApplicationEventMulticaster#multicastEvent(Applicati…

HarmonyOS ArkTS Tab使用方法(十五)

一&#xff0c;使用方法 Android中Java代码使用fragment进行Tab切换&#xff0c;下面使用HarmonyOS ArkTS 语言实现Tab的使用&#xff0c;代码如下&#xff1a; /** Copyright (c) 2022 Huawei Device Co., Ltd.* Licensed under the Apache License, Version 2.0 (the "…

(4)Linux的Redirect 重定向以及打包与压缩

&#x1f4ad; 写在前面 本章仍然是继续对Linux 常用指令进行介绍&#xff0c;将讲解重定向、时间相关的指令、文件查找和打包压缩等指令。我们将初次理解 "Linux下一切皆文件"这一概念&#xff0c;我将通过一个有趣的故事去讲解它。 初识重定向&#xff08;Redire…

如何在本地Docker中部署MinIO服务并实现远程访问管理界面

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器&#xff0c;可以在各种环境中运行&#xff0c;例如本地、Docker容器、Kubernetes集群等。它兼…

全国巡展“2024人工智能展·世亚智博会”3月上海·4月杭州·6月北京

近年来&#xff0c;我国积极布局人工智能产业&#xff0c;竞跑“未来赛道”。随着各行业、各领域对人工智能需求的日益增长&#xff0c;与实体经济深度融合的新模式不断涌现&#xff0c;形成了具有中国特色的研发体系和应用生态&#xff0c;引领着经济社会各领域从数字化、网络…

web前端项目-影视网站开发

影视网站 本项目主要使用到了 HTML&#xff1b;CSS&#xff1b;JavaScript脚本技术&#xff1b;AJAX无刷新技术&#xff1b;jQuery等技术实现了动态影视网页 运行效果&#xff1a; 一&#xff1a;index.html <!DOCTYPE> <html lang"en"> <head>…

python采集电影数据JS逆向, 并制作可视化

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 环境使用&#xff1a; Python 3.10 Pycharm nodejs 模块使用&#xff1a; requests -> pip install requests execjs -> pip install pyexecjs json …

电流源输出的是直流电还是交流电(高精度电流源)

电流源是一种能够提供电流输出的电子设备&#xff0c;它可以产生直流电流或交流电流&#xff0c;具体取决于其设计和应用的需要。 首先&#xff0c;我们来讨论电流源输出直流电的情况。直流电是指电流的方向始终保持不变的电流形式。在一些特定的应用中&#xff0c;需要稳定的、…

【全志T113-i】OK113i-S开发板-适配10寸LCD显示

前言 本文介绍如何在OK113i-S开发板上适配一个自己的10寸LCD。 OK113i-S 是一个优秀的开发板&#xff0c;支持lvds 单8&#xff0c;双8显示&#xff0c;最大分辨率1280x800 也支持RG666显示&#xff0c;由于我手头只有lvds 单8&#xff0c;40pin的显示器&#xff0c;今天我就…

设计模式—装饰模式

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 装饰模式—穿衣服&#x1f48e;总结 装饰模式—穿衣服 装饰模式&#xff08;Decorator&#xff09;可以动态的给对象添加一些额外的职责。 Component是定义一个对象接口&#xff0c;可以给这些对象动态地添加职责。…

Flutter ios 使用ListView 。滚动时 AppBar 改变颜色问题

在Ios 中 列表滚动条向下滚动一段距离后 会导致 AppBar 颜色改变 可以给 AppBar 或者 AppBarTheme。 scrolledUnderElevation: 0.0 属性 全局&#xff1a; MaterialApp(theme: ThemeData(appBarTheme: AppBarTheme(scrolledUnderElevation: 0.0)) ) 局部&#xff1a; App…

代码随想录算法训练营第二十天 |654.最大二叉树 、 617.合并二叉树 、700.二叉搜索树中的搜索 、 98.验证二叉搜索树

今天学习内容&#xff1a;654.最大二叉树 、 617.合并二叉树 、700.二叉搜索树中的搜索 、 98.验证二叉搜索树 讲解&#xff1a;代码随想录 654.最大二叉树 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 最大二叉树的构建过程如上&#xff0c;图…

STM32----HAL库函数

1.STM32系统框架 1.1 Cortex-M内核&芯片 1.2 F1系统框架 4个主动单元4个被动单元 AHB&#xff1a;高级高性能总线 APH&#xff1a;高级外围总线 其中 1 为 主动单元 &#xff0c; 2为被动单元 总线时钟频率&…

低代码开发平台的优势及应用场景分析

文章目录 低代码是什么&#xff1f;低代码起源低代码分类低代码的能力低代码的需求市场需要专业开发者需要数字化转型需要 低代码的趋势如何快速入门低代码开发低代码应用领域 低代码是什么&#xff1f; 低代码&#xff08;Low-code&#xff09;是著名研究机构Forrester于2014…

充电器如何测试?有哪些测试参数?用电源模块自动化测试系统测试需要哪些步骤?

充电器测试参数 1. 输入、输出电压测试 通过万用表或者其它精密测试设备测量充电器的输入、输出电压测试&#xff0c;检测输入、输出电压是否在规定范围内&#xff0c;以免造成设备损坏。 2. 输入、输出电流测试 测试充电器的输入、输出电流&#xff0c;确保其符合设计要求&…