SARAS算法

SARAS算法

代码仓库:https://github.com/daiyizheng/DL/tree/master/09-rl

Sarsa算法是一种强化学习算法,用于解决马尔可夫决策过程(MDP)问题。它是一种基于值函数的方法,可以用于学习最优策略。本文将介绍Sarsa算法的流程。

SARSA算法流程


算法中各个参数的意义:

  • alpha是学习率, 来决定这次的误差有多少是要被学习的, alpha是一个小于1 的数.
  • gamma 是对未来 reward 的衰减值. 我们可以这样想象.
  • Q表示的是Q表格.
  • Epsilon greedy 是用在决策上的一种策略, 比如 epsilon = 0.9 时, 就说明有90% 的情况我会按照 Q 表的最优值选择行为, 10% 的时间使用随机选行为. 【这也是结合了强化学习中探索和利用的概念】

算法输入:迭代轮数 T T T,状态集 S S S, 动作集 A A A, 步长 α \alpha α,衰减因子 γ \gamma γ, 探索率 ϵ \epsilon ϵ,
输出:所有的状态和动作对应的价值 Q Q Q

  1. 随机初始化所有的状态和动作对应的价值 Q Q Q. 对于终止状态其 Q Q Q值初始化为0.
  2. for i from 1 to T,进行迭代。
    a) 初始化S为当前状态序列的第一个状态。设置 A A A ϵ − \epsilon- ϵ贪婪法在当前状态 S S S选择的动作。
    b) 在状态 S S S执行当前动作 A A A,得到新状态 S ′ S' S和奖励 R R R
    c) 用 ϵ − \epsilon- ϵ贪婪法在状态 S ′ S' S选择新的动作 A ′ A' A
    d) 更新价值函数 Q ( S , A ) Q(S,A) Q(S,A): Q ( S , A ) = Q ( S , A ) + α ( R + γ Q ( S ′ , A ′ ) − Q ( S , A ) ) Q(S,A) = Q(S,A) + \alpha(R+\gamma Q(S',A') - Q(S,A)) Q(S,A)=Q(S,A)+α(R+γQ(S,A)Q(S,A))
    e) S = S ′ , A = A ′ S=S', A=A' S=S,A=A
    f) 如果 S ′ S' S是终止状态,当前轮迭代完毕,否则转到步骤b)

这里有一个要注意的是,步长 α \alpha α一般需要随着迭代的进行逐渐变小,这样才能保证动作价值函数 Q Q Q可以收敛。当 Q Q Q收敛时,我们的策略 ϵ − \epsilon- ϵ贪婪法也就收敛了。

与SARSA相比,Q-learning具有以下优点和缺点:


其实两种算法区别就在于对下一个状态的动作价值的估计,Q学习基于目标策略选定的动作,估计了一个价值,但是行为策略并不一定会真的选取执行这个动作。而SARSA则说,我自己选取的动作,我就是死也要执行。从“对下一个状态的评估”这个角度来说,SARSA更加谨慎,因为他基于他当前的策略选择最好的动作来执行,而QLearning则更大胆一点,下一个动作不一定就是目标策略的最优动作,甚至可能是随表挑的动作。

Q-learning直接学习最优策略,而SARSA在探索时学会了近乎最优的策略。
Q-learning具有比SARSA更高的每样本方差,并且可能因此产生收敛问题。当通过Q-learning训练神经网络时,这会成为一个问题。
SARSA在接近收敛时,允许对探索性的行动进行可能的惩罚,而Q-learning会直接忽略,这使得SARSA算法更加保守。如果存在接近最佳路径的大量负面报酬的风险,Q-learning将倾向于在探索时触发奖励,而SARSA将倾向于避免危险的最佳路径并且仅在探索参数减少时慢慢学会使用它。

注意: Q学习的区别只在于target的计算方法不同
SARSA的target计算公式:
target = Q(next_state,next_action) * gamma + reward
Q学习的target计算公式:
target = max(Q(next_state)) * gamma + reward

代码

  1. 环境
import gym#定义环境
class MyWrapper(gym.Wrapper):def __init__(self):#is_slippery控制会不会滑env = gym.make('FrozenLake-v1',render_mode='rgb_array',is_slippery=False)super().__init__(env)self.env = envdef reset(self):state, _ = self.env.reset()return statedef step(self, action):state, reward, terminated, truncated, info = self.env.step(action)over = terminated or truncated#走一步扣一份,逼迫机器人尽快结束游戏if not over:reward = -1#掉坑扣100分if over and reward == 0:reward = -100return state, reward, over#打印游戏图像def show(self):from matplotlib import pyplot as pltplt.figure(figsize=(3, 3))plt.imshow(self.env.render())plt.show()env = MyWrapper()env.reset()env.show()
  1. Q动作价值函数
import numpy as np#初始化Q表,定义了每个状态下每个动作的价值
Q = np.zeros((16, 4))Q
  1. 单挑轨迹数据
from IPython import display
import random#玩一局游戏并记录数据
def play(show=False):data = []reward_sum = 0state = env.reset()over = Falsewhile not over:action = Q[state].argmax()if random.random() < 0.1:action = env.action_space.sample()next_state, reward, over = env.step(action)data.append((state, action, reward, next_state, over))reward_sum += rewardstate = next_stateif show:display.clear_output(wait=True)env.show()return data, reward_sumplay()[-1]
  1. 训练
#训练
def train():#共更新N轮数据for epoch in range(2000):#玩一局游戏并得到数据for (state, action, reward, next_state, over) in play()[0]:#Q矩阵当前估计的state下action的价值value = Q[state, action]#实际玩了之后得到的reward+(next_state,next_action)的价值*0.9target = reward + Q[next_state, Q[next_state].argmax()] * 0.9#value和target应该是相等的,说明Q矩阵的评估准确#如果有误差,则应该以target为准更新Q表,修正它的偏差#这就是TD误差,指评估值之间的偏差,以实际成分高的评估为准进行修正update = (target - value) * 0.02#更新Q表Q[state, action] += updateif epoch % 100 == 0:print(epoch, play()[-1])train()

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

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

相关文章

Java虚拟机运行时数据区结构详解

Java虚拟机运行时数据区结构如图所示 程序计数器 程序计数器&#xff08;Program Counter Register&#xff09;是一块较小的内存空间&#xff0c;它可以看作是当前线程所执行的字节码的行号指示器。 多线程切换时&#xff0c;为了能恢复到正确的执行位置&#xff0c;每条线程…

ajax异步传值以及后端接收参数的几种方式

异步传值 第一种呢&#xff0c;也是最简单的一种&#xff0c;通过get提交方式&#xff0c;将参数在链接中以问号的形式进行传递 // 前台传值方法 // 触发该方法调用ajaxfunction testAjax(yourData) {$.ajax({type: "get", // 以get方式发起请求url: "/yo…

Nginx + RTMP + nginx-http-flv-module 环境搭建(CentOS 7)

文章目录 1. 引言2. 安装 Nginx3. 安装依赖库4. 下载编译 Nginx with RTMP 模块5. 配置 Nginx6. 启动 Nginx7. 推流测试8. 播放测试9. 拓展9.1 鉴权配置9.2 HTTPS 配置9.3 安全性配置 10. 小结 &#x1f389;Nginx RTMP nginx-http-flv-module 环境搭建&#xff08;CentOS 7&…

浙江大学数据结构陈越 第一讲 数据结构和算法

数据结构 数据结构是计算机科学中用来组织和存储数据的方式。它可以理解为一种组织数据的方式&#xff0c;能够有效地管理和操作数据&#xff0c;以及提供对数据进行存储、检索、更新和删除等操作的方法。常见的数据结构包括数组、链表、栈、队列、树和图等&#xff0c;它们各自…

【原创】java+swing+mysql车辆维修管理系统设计与实现

摘要&#xff1a; 车辆维修管理系统是一个用于管理和追踪车辆维修过程的系统&#xff0c;它能够提高效率&#xff0c;减少错误&#xff0c;并提供详细的车辆历史记录&#xff0c;可以帮助车辆维修企业实现信息化管理&#xff0c;提高工作效率和客户满意度&#xff0c;降低运营…

kubernetes集群编排(10)

目录 prometheus监控 部署prometheus 部署nginx监控实例 部署prometheus-adapter prometheus监控 部署prometheus 创建项目仓库并上传镜像 [rootk8s2 helm]# vim prometheus-values.yaml alertmanager:alertmanagerSpec:image:repository: prometheus/alertmanagertag: v0.24.0…

OpenAI发布会震撼AI界,千字文全面解读

你的朋友圈是否被近日 OpenAI 的开发者大会刷屏了&#xff1f;这是预料之中的事。在近日&#xff0c;OpenAI 首度召开了旨在定义未来应用市场的开发者大会。 让我们迅速捕捉 OpenAI 最新的动态以及 ChatGPT 的更新亮点。 1、OpenAI 最新动态 今晨的盛会聚焦于以下要点&#xf…

什么是自动化测试框架?常用的自动化测试框架有哪些?

无论是在自动化测试实践&#xff0c;还是日常交流中&#xff0c;经常听到一个词&#xff1a;框架。之前学习自动化测试的过程中&#xff0c;一直对“框架”这个词知其然不知其所以然。 最近看了很多自动化相关的资料&#xff0c;加上自己的一些实践&#xff0c;算是对“框架”…

LeetCode - 141. 环形链表 (C语言,快慢指针,配图)

141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; 1. 什么是快慢指针 这里我们我们将介绍环形链表的经典解法——快慢指针&#xff0c;简单理解&#xff0c;指针移动快的叫做快指针fast&#xff0c;移动速度慢的叫慢指针slow。一般我们设快指针走两步&#xff0c;慢指针走…

Spring6(一):入门案例

文章目录 1. 概述1.1 Spring简介1.2 Spring 的狭义和广义1.3 Spring Framework特点1.4 Spring模块组成 2 入门2.1 构建模块2.2 程序开发2.2.1 引入依赖2.2.2 创建java类2.2.3 创建配置文件2.2.4 创建测试类测试 2.3 程序分析2.4 启用Log4j2日志框架2.4.1 引入Log4j2依赖2.4.2 加…

编译智能合约以及前端交互工具库(Web3项目一实战之三)

我们已然在上一篇 Web3项目灵魂所在之智能合约编写(Web3项目一实战之二) ,为项目写好了智能合约代码。 但身为开发人员的我们,深知高级编程语言所编写出来的代码,都是需要经过编译,而后外部方能正常调用。很显然,使用solidity这门新的高级编程语言编写出来的智能合约,也…

【前端】使用json-server报错

当我们使用json-server模仿后端接口时需要运行json-server --watch index.json这个命令生成增删改查接口但是可能会报这个错误&#xff0c;如图 这时我们运行 npm i json-server -g命令即可&#xff0c;然后再重新运行json-server --watch index.json就行了