强化学习笔记——4策略迭代、值迭代、TD算法

基于策略迭代的贝尔曼方程和基于值迭代的贝尔曼方程,关系还是不太理解

首先梳理一下:
通过贝尔曼方程将强化学习转化为值迭代和策略迭代两种问题
求解上述两种贝尔曼方程有三种方法:DP(有模型),MC(无模型),TD(DP和MC结合)
这三种只是方法,既可以用于求值迭代也可以用于求解策略迭代

在这里插入图片描述
在这里插入图片描述

我总结就是:值迭代方法通过求最优价值函数,可以间接得到最优策略
策略迭代是:初始化一个随机策略,然后按照当前策略迭代价值函数
再进行策略改进,二者交替直到策略基本不发生变化。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上述就是贝尔曼最优公式的过程,求解最优的策略
详细见
V(s)求解举例

直接看值迭代伪代码:

  1. 遍历每个状态S,对每个状态S遍历所有动作A
  2. 计算Q值
  3. 对于每个状态S选择Q值最大的那个动作作为更新的策略,最大Q值作为新的V(s)

在这里插入图片描述

策略迭代:分两步policy Evalution策略评估(就是求值函数),policy improvement(策略更新)

  1. 策略评估中,如何通过求解贝尔曼方程得到值函数?
  2. 策略更新中,为什么新策略Πk+1就比原策略Πk好?
  3. 为什么策略迭代可以找到最优策略?
  4. 值迭代和策略迭代直接什么关系?

policy Evalution本身也是个迭代要循环
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Q4:策略迭代用到了值迭代的结果,是基于值收敛的。
伪代码:

  1. 进入PolicyEvaluation,目的求解收敛的VΠk。对于每个状态S迭代。
  2. 计算每个状态S下每个动作A的Q值,选择最大的作为策略Πk+1
  3. 不断重复(一个1,2步骤表示一回合 )

在这里插入图片描述

对比两个伪代码发现:值迭代的值函数计算不强调某策略(Vk),因为它遍历所有状态的所有动作策略,然后计算Q值选最优动作为策略
策略迭代:计算值函数强调是某一策略(VΠk),在某一个具体策略下求出值函数,然后再遍历所有状态的所有动作,然后计算Q值选最优动作为更新的策略

=======================================================================

上述两方法,不可避免要求Q值。
蒙特卡洛方法,通过无模型方法求解Q值
从一个s,a出发走很多个回合计算回报平局值,即为Q(s,a)
有些改进 蒙特卡洛方法不用走很多个回合计算回报平局值,只一个回合得到回报,然后作为Q

在这里插入图片描述

TD算法: 无模型求解贝尔曼方程
包含一系列:TD0,SARSA,Qlearning,DQN
的都是求解贝尔曼公式:但有的求解基于值函数刻画的贝尔曼公式,有的求解基于动作价值函数刻画的贝尔曼公式
它结合了动态规划(DP)和蒙特卡洛方法(MC)的优点
在这里插入图片描述
基于表格的TD算法总结:
在这里插入图片描述
TD算法只是相当于做策略评估,不负责policy improvement

实现SARSA和Qlearning算法
import numpy as np
from collections import defaultdictclass QLearning:def __init__(self, env, alpha=0.1, gamma=0.99, epsilon=0.1):self.env = envself.alpha = alpha  # 学习率self.gamma = gamma  # 折扣因子self.epsilon = epsilon  # 探索率# 初始化Q表self.Q = defaultdict(lambda: np.zeros(len(env.action_space))) #用于创建一个长度为 len(env.action_space) 的全零数组。def choose_action(self, state):if np.random.rand() < self.epsilon:# 随机选择动作索引action_idx = np.random.choice(len(self.env.action_space))return self.env.action_space[action_idx]  # 探索else:# 选择Q值最大的动作action_idx = np.argmax(self.Q[state])return self.env.action_space[action_idx]  # 利用def learn(self, state, action, reward, next_state, done):# 将状态转换为可哈希的键next_state_key = next_statecurrent_q = self.Q[state][self.env.action_space.index(action)]max_next_q = np.max(self.Q[next_state_key])# Q-learning更新公式new_q = current_q + self.alpha * (reward + self.gamma * max_next_q - current_q)self.Q[state][self.env.action_space.index(action)] = new_qclass SARSA:def __init__(self, env, alpha=0.1, gamma=0.99, epsilon=0.1):self.env = envself.alpha = alpha  # 学习率self.gamma = gamma  # 折扣因子self.epsilon = epsilon  # 探索率# 初始化Q表self.Q = defaultdict(lambda: np.zeros(len(env.action_space)))def choose_action(self, state):if np.random.rand() < self.epsilon: #以概率 ϵ 随机选择动作# 随机选择动作索引action_idx = np.random.choice(len(self.env.action_space))return self.env.action_space[action_idx]  # 探索else:# 选择Q值最大的动作action_idx = np.argmax(self.Q[state])return self.env.action_space[action_idx]  # action_idx动作索引,返回具体动作(0, 1), (1, 0), (0, -1), (-1, 0), (0, 0)def learn(self, state, action, reward, next_state, next_action, done):next_state_key = next_statecurrent_q = self.Q[state][self.env.action_space.index(action)]next_q = self.Q[next_state_key][self.env.action_space.index(next_action)]# SARSA更新公式new_q = current_q + self.alpha * (reward + self.gamma * next_q - current_q) #一步TD更新# 更新Q表self.Q[state][self.env.action_space.index(action)] = new_q

上述使用Q表每次记录下来Q值,下次(s,a)可以直接读取Q值

还有一种方法是用函数、神经网络计算Q值,输入(s,a)输出Q,然后梯度下降优化函数的参数,使得Q值计算更准确。

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

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

相关文章

计算机网络 笔记 网络层 3

IPv6 IPv6 是互联网协议第 6 版&#xff08;Internet Protocol Version 6&#xff09;的缩写&#xff0c;它是下一代互联网协议&#xff0c;旨在解决 IPv4 面临的一些问题&#xff0c;以下是关于 IPv6 的详细介绍&#xff1a; 产生背景&#xff1a; 随着互联网的迅速发展&…

【搜索回溯算法篇】:拓宽算法视野--BFS如何解决拓扑排序问题

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;搜索回溯算法篇–CSDN博客 文章目录 一.广度优先搜索&#xff08;BFS&#xff09;解决拓扑排…

23.Word:小王-制作公司战略规划文档❗【5】

目录 NO1.2.3.4 NO5.6​ NO7.8.9​ NO10.11​ NO12​ NO13.14 NO1.2.3.4 布局→页面设置对话框→纸张&#xff1a;纸张大小&#xff1a;宽度/高度→页边距&#xff1a;上下左右→版式&#xff1a;页眉页脚→文档网格&#xff1a;勾选只指定行网格✔→ 每页&#xff1a;…

视频脚本生成器(基于openai API和streamlit)

utils.py&#xff1a; # 所有和ai交互的代码放进utils.py里&#xff08;utils 通常是 “utilities” 的缩写&#xff0c;意为 “实用工具” 或 “实用函数”&#xff09;from langchain.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI from lan…

Android --- CameraX讲解

预备知识 surface surfaceView SurfaceHolder surface 是什么&#xff1f; 一句话来说&#xff1a; surface是一块用于填充图像数据的内存。 surfaceView 是什么&#xff1f; 它是一个显示surface 的View。 在app中仍在 ViewHierachy 中&#xff0c;但在wms 中可以理解为…

Longformer:处理长文档的Transformer模型

Longformer&#xff1a;处理长文档的Transformer模型 摘要 基于Transformer的模型由于自注意力操作的二次复杂度&#xff0c;无法处理长序列。为了解决这一限制&#xff0c;我们引入了Longformer&#xff0c;其注意力机制与序列长度呈线性关系&#xff0c;使其能够轻松处理数…

python学opencv|读取图像(五十二)使用cv.matchTemplate()函数实现最佳图像匹配

【1】引言 前序学习了图像的常规读取和基本按位操作技巧&#xff0c;相关文章包括且不限于&#xff1a; python学opencv|读取图像-CSDN博客 python学opencv|读取图像&#xff08;四十九&#xff09;原理探究&#xff1a;使用cv2.bitwise()系列函数实现图像按位运算-CSDN博客…

MySQL为什么默认引擎是InnoDB ?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL为什么默认引擎是InnoDB &#xff1f;】面试题。希望对大家有帮助&#xff1b; MySQL为什么默认引擎是InnoDB &#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MySQL 默认引擎是 InnoDB&#xff0c;主要…

蓝桥杯真题k倍区间

题目如下 代码解析&#xff1a; 成功AC

python项目之requirements.txt文件

Python项目中可以包含一个 requirements.txt 文件&#xff0c;用于记录所有依赖包及其精确的版本号用以新环境部署。 当我们开发新项目的时候&#xff0c;会用virtualenv创建很多python独立环境&#xff0c;这时候就会出现在不同环境下安装相同的模块的情况&#xff0c;这时候…

算法题(53):对称二叉树

审题&#xff1a; 需要我们判断二叉树是否满足对称结构&#xff0c;并返回判断结果 思路&#xff1a; 方法一&#xff1a;递归 其实是否对称分成两部分判断 第一部分&#xff1a;根节点是否相等 第二部分&#xff1a;根节点一的左子树和根节点二的右子树是否相等&#xff0c;根…

使用 cmake

使用前注意 : CMake是一种跨平台的构建系统&#xff0c;它用于管理软件构建过程&#xff0c;尤其适合多语言、多配置的项目。CMake不直接构建软件&#xff0c;而是生成特定构建工具&#xff08;如Makefile或Visual Studio项目&#xff09;所需的配置文件。 如果仅仅使用 qt 编…

AI软件外包需要注意什么 外包开发AI软件的关键因素是什么 如何选择AI外包开发语言

1. 定义目标与需求 首先&#xff0c;要明确你希望AI智能体做什么。是自动化任务、数据分析、自然语言处理&#xff0c;还是其他功能&#xff1f;明确目标可以帮助你选择合适的技术和方法。 2. 选择开发平台与工具 开发AI智能体的软件时&#xff0c;你需要选择适合的编程语言、…

学习数据结构(5)单向链表的实现

&#xff08;1&#xff09;头部插入 &#xff08;2&#xff09;尾部删除 &#xff08;3&#xff09;头部删除 &#xff08;4&#xff09;查找 &#xff08;5&#xff09;在指定位置之前插入节点 &#xff08;6&#xff09;在指定位置之后插入节点 &#xff08;7&#xff09;删除…

深入理解MySQL 的 索引

索引是一种用来快速检索数据的一种结构, 索引使用的好不好关系到对应的数据库性能方面, 这篇文章我们就来详细的介绍一下数据库的索引。 1. 页面的大小: B 树索引是一种 Key-Value 结构&#xff0c;通过 Key 可以快速查找到对应的 Value。B 树索引由根页面&#xff08;Root&am…

Vue-cli 脚手架搭建

安装node.js 官网下载node.js安装包&#xff0c;地址&#xff1a;Node.js — Download Node.js 先在node.js即将要安装的路径下创建两个文件夹&#xff1a;node_cache&#xff08;缓存&#xff09;、node_global&#xff08;全局&#xff09; 点击安装包&#xf…

深度解析 DeepSeek R1:强化学习与知识蒸馏的协同力量

DeepSeek-R1 的问世&#xff0c;无疑在 AI 领域激起了千层浪。自发布仅一周&#xff0c;它便凭借卓越的性能和创新的技术&#xff0c;成为 AI 社区热议的焦点&#xff0c;代表着人工智能在推理和理解能力上的重大飞跃。今天我们一起深度解析一下DeepSeek-R1 一、强大基石&…

openssl 生成证书 windows导入证书

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

笔记本搭配显示器

笔记本&#xff1a;2022款拯救者Y9000P&#xff0c;显卡RTX3060&#xff0c;分辨率2560*1600&#xff0c;刷新率&#xff1a;165Hz&#xff0c;无DP1.4口 显示器&#xff1a;2024款R27Q&#xff0c;27存&#xff0c;分辨率2560*1600&#xff0c;刷新率&#xff1a;165Hz &…

在php中怎么打开OpenSSL

&#xff08;点击即可进入聊天助手&#xff09; 背景 在使用php做一些项目时,有用到用户邮箱注册等,需要开启openssl的能力 在php系统中openssl默认是关闭状态的,在一些低版本php系统中,有的甚至需要在服务器终端后台,手动安装 要打开OpenSSL扩展&#xff0c;需要进行以下步骤 …