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

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

相关文章

golang中reflect包的常用方法

《golang中reflect包的常用方法》Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录reflect包方法总结类型 (Type) 方法值 (Value) 方法reflect包方法总结

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

在Golang中实现定时任务的几种高效方法

《在Golang中实现定时任务的几种高效方法》本文将详细介绍在Golang中实现定时任务的几种高效方法,包括time包中的Ticker和Timer、第三方库cron的使用,以及基于channel和go... 目录背景介绍目的和范围预期读者文档结构概述术语表核心概念与联系故事引入核心概念解释核心概念之间的关系

在Linux终端中统计非二进制文件行数的实现方法

《在Linux终端中统计非二进制文件行数的实现方法》在Linux系统中,有时需要统计非二进制文件(如CSV、TXT文件)的行数,而不希望手动打开文件进行查看,例如,在处理大型日志文件、数据文件时,了解... 目录在linux终端中统计非二进制文件的行数技术背景实现步骤1. 使用wc命令2. 使用grep命令

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复