强化学习(四) 蒙特卡洛方法

2024-06-04 05:44

本文主要是介绍强化学习(四) 蒙特卡洛方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如果算不出来,那就统计。

dp需要完备的环境模型,而蒙特卡洛方法不需要。后者只需要采样。或者说,经验。
此外,蒙特卡洛方法不是自举的,不通过其它价值估计来更新自己的价值估计(与dp不同)。不满足马尔可夫性时仍可用。

蒙特卡洛不是在线的,而是在一幕结束后才进行调整。

蒙特卡洛方法做了一件什么事?

求q派(s,a)。
求出来相当于完成了策略评估,完成之后使用广义策略迭代来改进策略,跟dp一样。因此重点是评估。

首次访问型MC

在这里插入图片描述

这次不是决策树了,因为是采样,所以是整个过程是单线的,无分叉。
G就是累积回报。
第一行的意思是,给定S0,按照策略,做出动作A0,获得回报R1,环境变为S1,依此类推。
t是从大到小的,原因是折扣gamma会更多作用于后发生的事情(个人理解)。
“除非”这行,意思是如果某状态是首次出现,则加入返回列表。
为什么是列表呢?我们当然希望充分利用采样结果,对于这次采样中出现的每一个状态,我们都产生了一个数据,放在列表里。

文字描述

完成整幕序列,从后往前更新G,更新过程中赋值s的V。
用样本回报估计期望回报。

蒙特卡洛方法的优势

  • 可以通过实际经历和模拟经历学习
  • 因为不是自举的,让感兴趣状态为初态,就可以只计算感兴趣状态的价值函数

蒙特卡洛方法解决问题的一般过程

最终需要确定策略,所以其实q*是必算的。v*可以不算。
只有在已知环境模型的时候,才能轻易在q和v之间转换。

q的确定同样依赖于采样。但对于一些策略来说,有的动作并不会被选择,如果无法采样,我们所知晓的最优动作候选人就不够多。而采样方法决定的“单线”是不可变的。
有两种解决思路。第一种是依赖初态,想采什么状态-动作就让它为初态。第二种是使用软性策略。

同轨和离轨

同轨,目标策略更新与行动策略有关;离轨,目标策略更新与行动策略无关。
同轨和离轨是解决explore-exploit的两种思想。同轨收敛快,但在最优性上有妥协。离轨由于数据来源不同方差更大收敛慢,但通用性更强。
在这里插入图片描述
在这里插入图片描述
至于离轨,其可行性的理论基础是重要度采样。
在这里插入图片描述
对于首次访问型,(5.5)的分母始终为1;对于每次访问型,(5.5)的分母为s状态出现的次数。
重要度就是两个概率密度函数在这个s上的比值,这个比值有的时候小,而有的时候可能极大,导致方差很大。显然,如果两个概率密度函数比较接近,方差才会比较小。
加权重要度采样是为了减小方差。试想如果分子中有一些比值特别大,分母也会特别大,从而缓解极端情况。

附录

软性

软性策略是指在一个情境下采取各种动作的概率都不为零,相对应的是确定性策略。

统计学的基本思想

可以分为描述和预测。
描述,比如小学学的扇形统计图、折线统计图。
预测,通过样本估计整体,再比如线性拟合。实质是归纳法。
已知分布,意味着任意挑一个被试,我能知道它有多大的可能性是什么水平。

重要度采样

https://www.jianshu.com/p/22fb279aa16b
基本想法是我们可以基于分布 B 的样本来估计分布 A 的属性。
一个场景是估计人群的平均收入,长尾问题,采样效果并不理想(因为很多群体你调查不到)。解决方法之一就是,过度采样你容易接触到的群体,减少采样不容易接触到的群体。然后通过重要度来修正。
降低过度采样的样本的重要性,提高欠采样的样本的重要性。
除了缓解rare event难采样的问题,还有减小标准差的作用。

接受-拒绝采样

有些博客喜欢摆一张正方形内切圆求圆周率的图,我感觉并不贴切。摆python代码的就更无助于理解了。
采样到底是什么?
采样就像往数轴上扔飞镖。一个区间飞镖的总个数,就会形成一个柱子。每个区间都有柱子,用曲线连起来就大致形成了乘k之后的概率密度函数。(概率密度函数乘k之后,仍然能表示飞镖落在各个区间的相对可能性。归一只是让它有更好的数学性质。)
统计就是,观察一个人扔飞镖,看了一小会,就预测他下一个飞镖会扔在哪里。
那么什么是接受-拒绝采样呢?
你手下有两个飞镖运动员,它们一个能扔出正态分布,一个能扔出均匀分布。
你听说有人能扔出下面的分布(z=1.2113),在这里插入图片描述
你想见识一下。
你让正态分布的手下扔飞镖。如果你不做任何操作,肯定扔出正态分布。
如果你拔掉一部分飞镖,最终在飞镖盘上就有可能剩下这个奇特的分布。
什么时候拔呢?引用jteng的图:
在这里插入图片描述
如果蓝线和红线在某一z下很接近,那么最好别拔掉(拔掉意味着降低蓝线在这一点的高度)。不拔的概率是红线高度/蓝线高度。
我们希望少拔,这样投手可以少投一些飞镖。因此应当尽可能降低蓝线。
拔还是不拔,这件事可以用一个均匀分布来描述,我在0-1间均匀抽一个小数,如果小于0.6就不拔。那不拔的概率就是0.6。
拔了就是拒绝,没拔就是接受,这就是拒绝-接受采样。

重要度采样跟接受-拒绝采样有些像,都借助了常见分布。
接受-拒绝采样的结果是一个样本集,一个你想看见的飞镖盘。
重要度采样的结果是样本特征,一个数字化过后的你想看见的飞镖盘。

参考链接

脉络清晰,蒙特卡洛方法-接受拒绝-重要性-MCMC
https://blog.csdn.net/qq_33302004/article/details/115338116

四种数据

  • 定类,如颜色
  • 定序,如年级,尺码(SML),军衔
  • 定距,如温度。特征是0点模糊。
  • 定比,如工资。特征是比值有含义,你的工资是我的工资的两倍。

切比雪夫不等式

作用是,对任意分布,能判断均值附近的数据有多少。
定量是1-1/k^2。这里的k可以不是整数。

如果是正态分布,那可以查Z表获得任意区间的数据有多少。

为什么百度百科说中心极限定理是首席定理

https://blog.csdn.net/qq_32572085/article/details/88934098
样本的平均值约等于总体的平均值。
不管总体是什么分布,任意一个总体的样本平均值都会围绕在总体的整体平均值周围,并且呈正态分布。
第一行其实阐释了统计的基本思想,就是我们可以用样本的平均值来估计总体的平均值。
我们还想知道总体的方差/标准差。
我们可以用样本的方差来估计总体的方差,但分母却是n-1。

原因是用样本均值代替样本期望是不完美的。
样本均值的引入,使得我们只知道样本中n-1个数据就能推导出最后一个数据。
在这里插入图片描述
综上,我们发现,用均值代替期望会导致方差偏小,分母替换成n-1可以补偿;至于为什么是n-1而不是n-2,是因为使用均值代替期望时有一个数据是不独立的。

大数定理

为当样本数据无限大时,样本均值趋于总体均值。

极大似然法

目的是估计分布的参数。
在这里插入图片描述
极大似然函数,以正态分布为例,有两个输入变量。随着输入变量的不同,样本点x1出现的概率不同。
试想,如果μ=x1,x1出现的概率肯定比较大。而μ离x1很远、σ很小的时候,x1出现的概率就比较小。
我们取n个点,合适的μ和σ会使这n个点出现概率的乘积最大。

二项分布

问题始于,做n次实验,事件发生k次的概率。
给定n和p,横轴为k,纵轴为事件发生k次的概率。

问题场景如下:
在这里插入图片描述
在p接近0.5,n较大的时候,可以用正态分布模拟二项分布。
将这个正态分布转为标准正态分布,就能查Z表。复杂度就从O(n)变成O(1)了。

这篇关于强化学习(四) 蒙特卡洛方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1029220

相关文章

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

macOS无效Launchpad图标轻松删除的4 种实用方法

《macOS无效Launchpad图标轻松删除的4种实用方法》mac中不在appstore上下载的应用经常在删除后它的图标还残留在launchpad中,并且长按图标也不会出现删除符号,下面解决这个问... 在 MACOS 上,Launchpad(也就是「启动台」)是一个便捷的 App 启动工具。但有时候,应

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE