RL - 强化学习 上置信界算法 (UCB) 和 汤普森采样算法 (TS)

news2024/12/29 9:47:49

欢迎关注我的CSDN:https://spike.blog.csdn.net/
本文地址:https://blog.csdn.net/caroline_wendy/article/details/130983835

TS

上置信界算法和汤普森采样算法是两种解决多臂老虎机问题的经典方法。多臂老虎机问题是一种探索与利用的平衡问题,即在有限的尝试次数内,如何选择最优的动作(拉动哪根拉杆)来最大化累积奖励。上置信界算法是一种基于置信区间的方法,根据每个动作的期望奖励和不确定性来计算一个上界,然后选择上界最大的动作。汤普森采样算法是一种基于贝叶斯推断的方法,根据每个动作的先验分布和观测数据来更新后验分布,然后,从后验分布中采样一个参数,再根据该参数选择最优的动作。这两种方法都能有效地平衡探索与利用,从而达到较低的累积懊悔。

1. 上置信界算法 (Upper Confidence Bound)

在强化学习的任务重,一个行动的不确定性越大,就越具有探索的价值,探索之后,可能发现的期望奖励很大。上置信界(UCB,Upper Confidence Bound)算法是基于不确定性的策略算法,使用 霍夫丁不等式(Hoeffding’s inequality)。核心思想就是,在已有的期望中,加入不确定性度量 U ^ ( a t ) \hat{U}(a_{t}) U^(at) ,根据霍夫丁不等式(Hoeffding’s inequality),设置较小概率p,用于超过期望的上界,一般p是随着时间逐渐减少的,可以设置为 p = 1 t p=\frac{1}{t} p=t1,因此:

p = e − 2 N ( a t ) U ^ ( a t ) 2 U ^ ( a t ) = − log ⁡ p 2 ( N ( a t ) ) p = e^{-2N(a_{t})\hat{U}(a_{t})^{2}} \\ \hat{U}(a_{t})=\sqrt{\frac{-\log{p}}{2(N(a_{t}))}} p=e2N(at)U^(at)2U^(at)=2(N(at))logp

p p p 是最贱减少的概率, N ( a t ) N(a_{t}) N(at) 是选择的次数, U ( a t ) U(a_{t}) U(at) 是不确定性度量。起始选择次数是0,避免除数为0,额外加1,同时代入 p = 1 t p=\frac{1}{t} p=t1

U ^ ( a t ) = log ⁡ t 2 ( N ( a t ) ) + 1 \\ \hat{U}(a_{t})=\sqrt{\frac{\log{t}}{2(N(a_{t}))+1}} U^(at)=2(N(at))+1logt

则最终的选择策略,由基于期望 Q ^ ( a ) \hat{Q}(a) Q^(a),转换为基于UCB, c c c 是系数,用于控制不确定性度量的占比,可以设置为1,即:

a t = arg ⁡ m a x a ∈ A [ Q ^ ( a ) ] a t = arg ⁡ m a x a ∈ A [ Q ^ ( a ) + c ⋅ U ^ ( a t ) ] a_{t} = \arg{max}_{a\in{A}}[\hat{Q}(a)] \\ a_{t} = \arg{max}_{a\in{A}}[\hat{Q}(a) + c·\hat{U}(a_{t})] at=argmaxaA[Q^(a)]at=argmaxaA[Q^(a)+cU^(at)]

源码如下:

class UCB(Solver):
    """
    UCB 算法,继承 Solver 类
    """
    def __init__(self, bandit, coef, init_prob=1.0):
        super(UCB, self).__init__(bandit)
        self.total_count = 0
        self.estimates = np.array([init_prob] * self.bandit.K)
        self.coef = coef

    def run_one_step(self):
        self.total_count += 1
        ucb = self.estimates + self.coef * np.sqrt(
            np.log(self.total_count) / (2 * (self.counts + 1)))
        k = np.argmax(ucb)
        r = self.bandit.step(k)
        self.estimates[k] += 1. / (self.counts[k] + 1) * (r - self.estimates[k])
        return k

2. 汤普森采样算法 (Thompson Sampling)

汤普森采样是计算所有拉杆的最高奖励概率的蒙特卡洛采样方法,主要基于Beta分布,不同的期望值,有着不同的采样概率,通过不断修正期望范围,随机采样概率。

源码如下:

class ThompsonSampling(Solver):
    def __init__(self, bandit):
        super(ThompsonSampling, self).__init__(bandit)
        self._a = np.ones(self.bandit.K)
        self._b = np.ones(self.bandit.K)

    def run_one_step(self):
        samples = np.random.beta(self._a, self._b)
        k = np.argmax(samples)
        r = self.bandit.step(k)

        self._a[k] += r
        self._b[k] += 1 - r
        return k

Beta 分布:

Beta 分布是一种定义在 (0,1) 区间的连续概率分布,有两个形状参数 α 和 β,可以用来描述伯努利试验的成功概率的不确定性。Beta分布的概率密度函数为:
f ( x ; α , β ) = 1 B ( α , β ) x α − 1 ( 1 − x ) β − 1 f(x;α,β) = \frac{1}{B(α,β)}x^{α-1}(1-x)^{β-1} f(x;α,β)=B(α,β)1xα1(1x)β1 其中,B(α,β)是Beta函数。与Gamma函数有如下关系: B ( α , β ) = Γ ( α ) Γ ( β ) Γ ( α + β ) B(α,β) = \frac{\Gamma(α)\Gamma(β)}{\Gamma(α+β)} B(α,β)=Γ(α+β)Γ(α)Γ(β) Beta分布的期望和方差分别为:
E ( X ) = α α + β V a r ( X ) = α β ( α + β ) 2 ( α + β + 1 ) E(X) = \frac{α}{α+β} \\ Var(X) = \frac{αβ}{(α+β)^2(α+β+1)} E(X)=α+βαVar(X)=(α+β)2(α+β+1)αβ Beta分布可以看作是一个概率的概率密度分布,用来建模二项分布和均匀分布之间的关系。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java easypoi 导出excel 并合并相关列

在项目开发中经常会使用到合并列&#xff0c;格式如下&#xff1a; 1.引入easypoi <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId></dependency><dependency><groupId>cn.aftertur…

设计模式详解之策略模式

作者&#xff1a;刘文慧 策略模式是一种应用广泛的行为型模式&#xff0c;核心思想是对算法进行封装&#xff0c;委派给不同对象来管理&#xff0c;本文将着眼于策略模式进行分享。 一、概述 我们在进行软件开发时要想实现可维护、可扩展&#xff0c;就需要尽量复用代码&#x…

chatgpt赋能python:Python什么情况下用类

Python什么情况下用类 在Python编程中&#xff0c;类是一种重要的数据结构&#xff0c;它是面向对象编程的核心。类可定义数据类型&#xff0c;并把数据与操作数据的函数组合在一起。因此&#xff0c;通过使用类&#xff0c;我们可以将数据、函数和其他方法组合在一起&#xf…

OLAP系列:四、clickhouse分布式表使用指南

一、背景 ClickHouse中最强大的表引擎当属MergeTree&#xff08;合并树&#xff09;引擎及该系列&#xff08;*MergeTree&#xff09;中的其他引擎&#xff0c;支持索引和分区&#xff0c;地位可以相当于innodb之于Mysql。 而且基于MergeTree&#xff0c;还衍生出了很多小弟&a…

【量化分析】绘制指标线EWM和MACD(1)

目录 一、说明 二、使用mplfinance的前提 2.1 mplfinance生态圈 2.1 安装mplfinance 三、mplfinance绘图 3.1 单变量图 3.2 将用户自己生成的曲线添加到 mplfinance plot() 四、显示EWM和MACD 一、说明 在做量化分析的时候&#xff0c;需要有能力计算种种曲线&#xff…

ShowMeBug 持续升级,提供高信效度支撑的技术招聘方案

去年年底&#xff0c;全新升级版的 ShowMeBug ——一款支持实战编程的技术能力评估平台&#xff0c;首次揭开了它神秘的面纱。 而近日&#xff0c;ShowMeBug 再次迎来一系列产品更新&#xff0c;它将以全新的面貌&#xff0c;提供高信效度支撑的技术招聘方案&#xff0c;持续助…

chatgpt赋能python:Python人脸登录:这项技术将颠覆传统的登录方式

Python人脸登录&#xff1a;这项技术将颠覆传统的登录方式 简介 在互联网时代&#xff0c;登录是每个人使用网站或软件的第一步&#xff0c;但是传统的用户名和密码登录已经不能满足用户的需求。不断的爆出各种账户泄露事件、密码猜测和密码被盗等问题&#xff0c;导致用户的…

cleanmymac要不要下载装机?好不好用

当我们收到一台崭新的mac电脑&#xff0c;第一步肯定是找到一款帮助我们管理电脑运行的“电脑管家”&#xff0c;监控内存运行、智能清理系统垃圾、清理Mac大文件旧文件、消除恶意软件、快速卸载更新软件、隐私保护、监控系统运行状况等。基本在上mac电脑防护一款CleanMyMac就够…

生成程序片段(程序依赖图PDG)

生成程序片段(程序依赖图PDG) 生成程序片段 标准方法是&#xff1a; 基于依赖性分析的切片。 使用程序依赖图表示依赖。 从中生成切片。 我们将专注于这种方法。但是&#xff0c;还有其他选择。 程序依赖图 The Program Dependence Graph (PDG) 表示数据和控制依赖项&#xf…

Servlet的常用Api—HttpServletResponse

Servlet的常用Api—HttpServletResponse &#x1f50e;核心方法setContentType && setCharacterEncodingsendRedirect关于Keep-Alive关于状态码 && Body &#x1f50e;结尾 &#x1f50e;核心方法 方法描述(void) setStatus(int sc)为该响应设置状态码(void) s…

2023年4月和5月随笔

1. 回头看 为了不耽误学系列更新&#xff0c;4月随笔合并到5月。 日更坚持了151天&#xff0c;精读完《SQL进阶教程》&#xff0c;学系统集成项目管理工程师&#xff08;中项&#xff09;系列更新完成。 4月和5月两月码字114991字&#xff0c;日均码字数1885字&#xff0c;累…

python的AutoGui库(1)获取鼠标实时位置

1.安装AutoGui库,与库的导入 PyAutoGUI是一个纯Python的GUI自动化工具&#xff0c;其目的是可以用程序自动控制鼠标和键盘操作&#xff0c;多平台支持&#xff08;Windows&#xff0c;OS X&#xff0c;Linux&#xff09;。可以用pip安装&#xff0c;Github上有源码。 使用命令…

Ceph应用

//存储类型 块存储 一对一&#xff0c;只能被一个主机挂载使用&#xff0c;数据以块为单位进行存储&#xff0c;典型代表: 硬盘 文件存储 一对多&#xff0c;能被多个主机同时挂载使用&#xff0c;数据以文件的形式存储的(元数据和实际数据是分开存储的)&#xff0c;并且有…

Python学习笔记 - 探索33个保留关键字

Python编程语言中有33个保留关键字&#xff0c;这些关键字在Python语法中有特殊含义&#xff0c;不能用作变量名、函数名或其他标识符。 33个保留字&#xff08;关键字&#xff09; 不能冲突的关键词 33 个 来看看都有哪些关键字。 import keyword print("&#xff0c;…

面试专题:java多线程(3)---关于 Atomic 原子类

1.介绍一下Atomic 原子类Atomic 翻译成中文是原子的意思。在化学上&#xff0c;我们知道原子是构成一般物质的最小单位&#xff0c;在化学反应中是不可分割的。在我们这里 Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候&#xff0c;一个操作一旦开…

cpolar内网穿透创建实现远程办公---无需公网IP

文章目录 前言1.本地访问简介2. cpolar内网穿透3. 公网远程访问4. 固定公网地址 转发自cpolar极点云的文章&#xff1a;外网远程访问公司内网用友畅捷通T财务软件 – 远程办公 前言 用友畅捷通T适用于异地多组织、多机构对企业财务汇总的管理需求&#xff1b;全面支持企业对远…

JavaScript 客户端脚本语言 选择器、事件

JavaScript发展史 JavaScript介绍 JavaScript ( 简称 JS): 是一种轻量级客户端脚本语言&#xff0c;通常被直接嵌入 HTML 页面&#xff0c;在浏览器上执 行。 JavaScript 的主要用途 : 使网页具有交互性&#xff08;如果不去使用js&#xff0c;只是使用html css那么只是…

chatgpt赋能python:Python主网站的SEO优化

Python主网站的SEO优化 作为一名有10年Python编程经验的工程师&#xff0c;我一直非常关注Python官方网站的SEO优化&#xff0c;因为官方网站对于传播Python语言的影响至关重要。在这篇文章中&#xff0c;我将介绍一些Python主网站的SEO优化策略&#xff0c;并总结一些结论&am…

程序切片(定义+用途)

程序切片(定义用途) 介绍 让我们假设我们测试了一个程序 p 并失败了&#xff08;错误的 输出&#xff09;。然后我们想找出导致失败&#xff08;故障&#xff09;的原因。 现在假设我们要更改程序的一部分。我们可能会问&#xff1a;程序的哪些其他部分受到影响 我们想找到导致…

1728_c语言标准库memcpy函数的简单使用

全部学习汇总&#xff1a; GreyZhang/c_basic: little bits of c. (github.com) 欢迎路过的YUAN类朋友相互交流&#xff0c;以下是我的联系方式&#xff1a; Email&#xff1a;greyzhang126.com 微信&#xff1a;grey0612 静态代码检测遇到了一处memcpy函数使用的错误&#…