Sarsa VS Q-Learning

news/2024/5/18 21:47:39 标签: 人工智能, 深度学习, 强化学习

前言

1.如何计算价值函数?

为了使模型训练的最好,学习到更多有用的知识即完成任务的最好策略。对策略好坏的评价标准自然是得到最多最好的奖励,那么如何找到最好的最好的奖励,即如何得到最好的价值函数?
首先对于在状态s,根据策略采取行为 a 的总奖励q是 当前奖励R 和 对未来各个可能的状态转化奖励的期望v组成,根据一定的 ϵ 概率每次选择奖励最大q或探索,便可以组成完整的策略,那么目标就变成了计算这个 q 值,然后根据q选择策略就好。
在这里插入图片描述

  • 穷举法:把所有可能的路径和状况都试一遍计算,直接比较最后哪条路的总价值最大。
  • 动态规划(DP):将一个问题拆成几个子问题,分别求解这些子问题,反向推断出大问题的解。即要求最大的价值,那么根据递推关系,根据上一循环得到的价值函数来更新当前循环。但是它需要知道具体环境的转换模型,计算出实际的价值函数。相比穷举法,动态规划即考虑到了所有可能,但不完全走完。
  • 蒙特卡洛(MC):采样计算。即通过对采样的多个完整的回合(如玩多次游戏直到游戏结束),在回合结束后来完成参数的计算,求平均收获的期望并对状态对动作的重复出现进行计算,最后再进行更新。

在这里插入图片描述
状态价值函数和动作价值函数的更新就为:
在这里插入图片描述
这种方法是价值函数q的无偏估计,但方差高(因为需要评价每次完成单次采样的结果,波动往往很大)。

  • 时序差分(TD):步步更新。不用知道全局,走一步看一步的做自身引导。即此时与下一时刻的价值函数差分(也可以理解是现实与预测值的差距)来近似代替蒙特卡洛中的完整价值。
    在这里插入图片描述
    那么:
    在这里插入图片描述
    所以它是有偏估计,但是方差小,也便于计算,在实践中往往用的最多。

一、 Sarsa算法简介

Sarsa 是一种on-policy算法,它优化的是它实际执行的策略,它直接用下一步会执行的动作去优化 Q 表格。
在学习的过程中,只存在一种策略,它用同一种策略去做动作的选取和优化。所以 Sarsa 知道它下一步的动作有可能会跑到悬崖那边去,它就会在优化自己的策略的时候,尽可能离悬崖远一点。

1.更新公式

在这里插入图片描述

2.预测策略

  • Sarsa算法采用ε 贪心搜索的策略

3.代码

链接:https://pan.baidu.com/s/1LOTz2xTbNbu6DrEpYAnnZw?pwd=ps7l
提取码:ps7l

二、Q-Learning算法简介

Sarsa 是一种off-policy算法,它优化的是它所有执行的策略,它用下一步会执行的所有动作去优化 Q 表格。
在学习的过程中,存在两种策略,它用一种策略去做动作的选取,用另一种策略优化。所以 Q-Learning 不知道它下一步的动作有可能会跑到悬崖那边去,它就会在优化自己的策略的时候,找到一条风险比较大的路。

1.更新公式

在这里插入图片描述

2.二者区别

Q-learning 和 SARSA 这两个公式区别就在Q value 更新方式上,Q-learning 是用max的方式更新Q value ,也就是说这个max方式就是他的更新策略(不带有探索性,完全的贪婪)。但是Q-learning的执行策略是带有epsilon的探索方式。所以他就是Off Policy

3.预测策略

  • Q-learning 算法采用ε 贪心搜索的策略

4.代码

链接:https://pan.baidu.com/s/1j3igmVPZ6eTLAaOy2qTp8A?pwd=vca7
提取码:vca7


http://www.niftyadmin.cn/n/229863.html

相关文章

深度学习之CD数据集创建

深度学习之数据集创建1. 原始文件相关文件路径2. 数据集创建2.1 数据格式一2.2 数据格式二1. 原始文件相关文件路径 原始路径 对于label图片文件,通道需要为单通道,如果不是单通道,训练数据会报错 报错信息例如:ValueError: Mask…

Git的详细过程

目录一、创建新仓库二、添加和提交三、推送改动四、分支五、解决冲突六、标签6.1 log七、修改文件八、配置别名九、备注一、创建新仓库 创建新文件夹,打开,执行: git init (初始化)来创建新的Git仓库 从远程库克隆&a…

Linux系统调用之mmap,munmap函数

前言 如果,想要深入的学习Linux系统调用中的mmap,munmap函数,还是需要去自己阅读Linux系统中的帮助文档。 具体输入命令: man 2 mmap/munmap即可查阅到完整的资料信息。 mmap函数 在Linux中,mmap()是一个用于创建内存映射的系统…

linux 消息队列 msgget/msgsnd/msgrecv

专栏内容:linux下并发编程个人主页:我的主页座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.目录 前言 概述 原理 消息队列的大小 查看资源 接口 代码演示 结尾 前言 本专栏主要…

Apple苹果开发者Certificates, Identifiers Profiles创建

1.创建Profile: 登陆Apple开发者账号,进入开发者后台,选择Profiles 然后点击Generate a Profile生成一个配置 选择配置类型 点击继续 选择APP ID 创建APP ID 注册一个新的APP id 选择应用类型,然后点击继续

c语言多线程pthread库概览

- pthread.h #man pthread - pthread_t th; pthread_create(&th,NULL,a_func,NULL); #afunc :(void *)->(void*) - main不等待线程的,主死线程也死 - pthread_join(th,NULL);等待线程th - 多线程跑时,不知道谁先走,线程可交叉执行 #in…

.Net Forms Resize 12 Crack

.Net Forms Resize 12 Crack 添加了对Microsoft Visual Studio 2022(v17.5.3)及更高版本的支持。 增加了对Microsoft Windows Server 2019和2022的支持。 改进并调整引擎大小(大约快20%)。 更新与受支持的第三方控件的新版本的兼容性。 添加了新的Microsoft Framework 4.8.1库。…

ForkJoinPool + RecursiveTask 来计算数组元素和

ForkJoinPool 是什么? ForkJoinPool 是一个 Java 并发编程框架,用于解决分治算法中的任务拆分、执行、合并等问题,是 Java 7 引入的一个新的工具类。 ForkJoinPool 的基本思想是将一个大任务划分成若干个小任务,然后并行执行这些…