第六篇:强化学习策略迭代 通俗解释

news/2024/11/8 17:12:08/

你好,我是zhenguo(郭震)

今天,介绍强化学习第6篇:策略迭代

策略迭代是马尔可夫决策过程(MDP)中的一种求解方法,当然也是强化学习常用求解方法。

它的思想可以用通俗的方式解释如下:

假设你正在玩一个迷宫游戏,目标是找到迷宫的出口。你每到达一个迷宫的某个位置,都需要根据当前的状态(位置)来选择一个行动(向上、向下、向左、向右)来移动。

你希望找到一种「最优的策略」,即在每个位置都选择最好的行动,从而尽快找到迷宫的出口。

策略迭代的思想也非常直接,就是通过不断「改进策略」来寻找最优策略。

它分为两个主要步骤:策略评估和策略改进。

兑现为代码:

# 策略迭代算法
def policy_iteration():max_iterations = 1000  # 最大迭代次数for _ in range(max_iterations):policy_evaluation()  # 策略评估policy_improvement()  # 策略改进

如何做策略评估?如何做策略改进呢?

策略评估

策略评估的算法思想直接说还是有些难,我们先通过例子来阐述。

我们依然还是以迷宫游戏为例子。

我们定义迷宫状态空间大小和动作空间大小分别为9和4,即在3*3的网格中,动作有4种,上下左右,对应代码:

num_states = 9
num_actions = 4

有了它们,我们就有了策略,一个二维数组,即每一个状态下对应的4种动作的取值概率,对应代码如下:

policy = np.ones((num_states, num_actions)) / num_actions

策略迭代方法还有一个值函数,值函数的入参是状态,返回价值大小,因此它的结构为如下,初始状态,每个状态的值大小为0.

values = np.zeros(num_states)

有了这些定义,我们再理解策略评估:

对当前的策略进行评估,计算每个状态的值函数(表示在该状态下能够获得的预期累积奖励)。通过迭代计算每个状态的值函数,直到值函数收敛。

再通俗一点来说,就是迭代,比如1000次,在当前策略下,对每个状态遍历,求出每个状态对应的值函数,不断更新上面定义的values值函数,直到收敛。

所以它的代码框架,大概如下所示:

iter = 0
while iter<1000:for s in range(num_states):new_values = f(policy[s], a, s_) # f是一个数学公式if np.max(np.abs(new_values - values)) < delta:break # 停止迭代values = new_valuesiter += 1

上面代码中f是一个数学公式,写一篇详细来阐述代码实现。

策略改进

接下来,策略迭代第二步,「策略改进」

在策略改进阶段,根据已经计算得到的值函数,更新策略,以便在每个状态下选择更好的行动。通过比较每个行动的价值(即采取该行动后的预期累积奖励),选择在每个状态下最好的行动,从而改进策略。

policy是一个[num_states, num_actions]二维数组,在策略改进这一步实际上就是不断更新每个state下的最优action,就是更新policy二维数组的第二个维度num_actions取值。

所以它的代码框架,大概如下所示:

for s in range(num_states):q_values = q(values[s], s, a) # q函数new_policy = np.zeros(num_actions)new_policy[best_action] = 1policy[s] = new_policy # 更新s下的策略为new_policy

总结

策略迭代的过程是循环进行策略评估和策略改进,直到策略收敛到最优策略为止。

在每次迭代中,我们都会根据当前的策略评估值函数,并根据评估得到的值函数改进策略,然后再次进行策略评估,不断循环迭代,直到最终找到最优策略。

策略迭代是一种通过反复评估和改进策略的方法来求解马尔可夫决策过程的算法。它通过不断优化策略和值函数来找到最优策略,并帮助我们在迷宫游戏等问题中做出最佳的决策。

感谢你的点赞和转发,让我更新更有动力


http://www.ppmy.cn/news/93343.html

相关文章

2024王道数据结构考研丨第六篇:查找、排序

到此&#xff0c;2024王道数据结构考研笔记专栏“基础知识”部分已更新完毕&#xff0c;其他内容持续更新中&#xff0c;欢迎 点此 订阅&#xff0c;共同交流学习… 文章目录 第七章 查找7.1查找表相关概念 第八章 排序8.1排序的基本概念8.2 插入排序8.2.1直接插入排序8.2.2折半…

Convolutional Neural Network 的 PyTorch 实现(二)使用TensorRT进行推理加速

本文章针对 Windows 10 系统 目录 TensorRT 环境安装与配置zlibwapi.dll 安装与配置TensorRT 实现 CUDA CuDNN的安装&#xff1a; 参考文章 TensorRT 环境安装与配置 下载链接 TensorRT 本文章针对 Windows10、CUDA10.2 的PC&#xff0c;选择相对应的安装包完成下载。 解压后在…

js内置对象

对象 面向对象是干嘛的 封装–>把代码包装起来,不能随意访问/修改 只能通过特定方法 继承–>继承父类的属性/方法 多态–>同一个类型有不同的样式 面向过程:吃狗屎–>描述的是一个过程 用代码去说明,这个过程是怎么样的:做什么 面向对象:狗吃屎–>描述的是一个…

C++中的函数模板

目录 1. 什么是函数模板&#xff1f; 2. 如何定义函数模板&#xff1f; 3. 如何使用函数模板&#xff1f; 4. 函数模板与函数重载的区别是什么&#xff1f; 5. 函数模板与类模板有何异同点&#xff1f; 1. 什么是函数模板&#xff1f; - 函数模板是一种通用的函数描述&…

基于 1 AT89C51 单片机的电子时钟设计报告

一、设计要求与目的 1〕设计要求以 AT89C51 单片机为核心的时钟&#xff0c;在 LCD 显示器上显示当前的 时间。 2〕、使用字符型 LCD 显示器显示当前时间。显示格式为"时时&#xff1a;分分&#xff1a;秒秒〞。 3〕、用 3 个功能键操作来设置当前时间。 4〕、熟悉掌握 pr…

C语言函数大全-- x 开头的函数(3)

C语言函数大全 本篇介绍C语言函数大全-- x 开头的函数 1. xdr_opaque 1.1 函数说明 函数声明函数功能bool_t xdr_opaque(XDR *xdrs, char *buf, u_int len);用于编码或解码任意长度的二进制数据 参数&#xff1a; xdrs &#xff1a; 指向 XDR 数据结构的指针&#xff0c;表…

一个torch.nn.MultiheadAttention的使用例子

# 来源&#xff1a;https://towardsdatascience.com/illustrated-self-attention-2d627e33b20a import torch import torch.nn as nnbatch 2# TODO MHA n_q, n_k, n_v 3, 4, 4 d_q, d_k, d_v 5, 5, 5 # 必须一致embed_dim d_q num_heads 8 dmodel embed_dim * num_heads…

【Python】Requests库基本使用

知识目录 一、写在前面✨二、Requests库三、接口调用四、总结撒花&#x1f60a; 一、写在前面✨ 大家好&#xff01;我是初心&#xff0c;希望我们一路走来能坚守初心&#xff01; 今天跟大家分享的文章是 Python中Requests库在爬虫和自动化中的使用 &#xff0c;希望能帮助到…