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

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

相关文章

检查 Nginx 是否启动的几种方法

《检查Nginx是否启动的几种方法》本文主要介绍了检查Nginx是否启动的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1. 使用 systemctl 命令(推荐)2. 使用 service 命令3. 检查进程是否存在4

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

MySQL字符串转数值的方法全解析

《MySQL字符串转数值的方法全解析》在MySQL开发中,字符串与数值的转换是高频操作,本文从隐式转换原理、显式转换方法、典型场景案例、风险防控四个维度系统梳理,助您精准掌握这一核心技能,需要的朋友可... 目录一、隐式转换:自动但需警惕的&ld编程quo;双刃剑”二、显式转换:三大核心方法详解三、典型场景

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

springboot中配置logback-spring.xml的方法

《springboot中配置logback-spring.xml的方法》文章介绍了如何在SpringBoot项目中配置logback-spring.xml文件来进行日志管理,包括如何定义日志输出方式、... 目录一、在src/main/resources目录下,也就是在classpath路径下创建logba

SQL Server中行转列方法详细讲解

《SQLServer中行转列方法详细讲解》SQL行转列、列转行可以帮助我们更方便地处理数据,生成需要的报表和结果集,:本文主要介绍SQLServer中行转列方法的相关资料,需要的朋友可以参考下... 目录前言一、为什么需要行转列二、行转列的基本概念三、使用PIVOT运算符进行行转列1.创建示例数据表并插入数

C++打印 vector的几种方法小结

《C++打印vector的几种方法小结》本文介绍了C++中遍历vector的几种方法,包括使用迭代器、auto关键字、typedef、计数器以及C++11引入的范围基础循环,具有一定的参考价值,感兴... 目录1. 使用迭代器2. 使用 auto (C++11) / typedef / type alias

python项目打包成docker容器镜像的两种方法实现

《python项目打包成docker容器镜像的两种方法实现》本文介绍两种将Python项目打包为Docker镜像的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录简单版:(一次成功,后续下载对应的软件依赖)第一步:肯定是构建dockerfile,如下:第二步

C# GC回收的方法实现

《C#GC回收的方法实现》本文主要介绍了C#GC回收的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、什么是 GC? 二、GC 管理的是哪部分内存? 三、GC 什么时候触发?️ 四、GC 如何判断一个对象是“垃圾