多臂老虎机问题

news2024/11/14 4:17:26

1.问题简介

多臂老虎机问题可以被看作简化版的强化学习问题,算是最简单的“和环境交互中的学习”的一种形式,不存在状态信息,只有动作和奖励。多臂老虎机中的探索与利用(exploration vs. exploitation)问题一直以来都是一个特别经典的问题,理解它能够帮助我们学习强化学习。

2.问题介绍

2.1问题定义

多臂老虎机(multi-armed bandit,MAB)问题中,有一个拥有 K根拉杆的老虎机,拉动每一根拉杆都对应一个关于奖励的概率分布R。我们每次拉动其中一根拉杆,就可以从该拉杆对应的奖励概率分布中获得一个奖励 。我们在各根拉杆的奖励概率分布未知的情况下,从头开始尝试,目标是在操作 T次拉杆后获得尽可能高的累积奖励。由于奖励的概率分布是未知的,因此我们需要在“探索拉杆的获奖概率”和“根据经验选择获奖最多的拉杆”中进行权衡。

2.2形式化描述 

多臂老虎机问题可以表示为一个元组\left \langle A,R \right \rangle,其中:

  • A为动作集合,其中一个动作表示拉动一个拉杆。若多臂老虎机一共有K根拉杆,那动作空间就是集合\left \{ a_{1},\cdots a_{i},\cdots ,a_{k}\right \},我们用a_{t}\ni A表示任意一个动作;
  • R为奖励概率分布,拉动每一根拉杆的动作a都对应一个奖励概率分布R(r|a),拉动不同拉杆的奖励分布通常是不同的。

        假设每个时间步只能拉动一个拉杆,多臂老虎机的目标为最大化一段时间步T内累积的奖励: max\sum_{t=1}^{T}r_{i},r_{i}~R(\cdot |a_{t})

其中a_{t}表示在第t时间步拉动某一拉杆的动作,r_{t}表示动作a_{t}获得的奖励。

对于每一个动作a,定义其期望奖励为:

于是,至少存在一根拉杆,它的期望奖励不小于拉动其他任意一根拉杆,我们将该最优期望奖励表示为:

懊悔(regret)定义为拉动当前拉杆的动作a与最优拉杆的期望奖励差,即 :

R(a)=Q^{*}-Q(a)​​​​​​​

累积懊悔(cumulative regret)即操作 T次拉杆后累积的懊悔总量,对于一次完整的T步决策\left \{ a_{1},a_{2},\cdots ,a_{T} \right \},累积懊悔为 :

MAB 问题的目标为最大化累积奖励,等价于最小化累积懊悔。

为了知道拉动哪一根拉杆能获得更高的奖励,我们需要估计拉动这根拉杆的期望奖励。由于只拉动一次拉杆获得的奖励存在随机性,所以需要多次拉动一根拉杆,然后计算得到的多次奖励的期望,其算法流程如下所示:

 以上 for 循环中的第四步如此更新估值,是因为这样可以进行增量式的期望更新,为什么不按照常规方法将所有数求和再除以次数呢?具体原因如下:

因为如果将所有数求和再除以次数,其缺点是每次更新的时间复杂度和空间复杂度均为 O(n)。而采用增量式更新,时间复杂度和空间复杂度均为O(1) 。

3. 代码实现

以下代码来实现一个拉杆数为 10 的多臂老虎机。其中拉动每根拉杆的奖励服从伯努利分布(Bernoulli distribution),即每次拉下拉杆有P的概率获得的奖励为 1,有1-P的概率获得的奖励为 0。奖励为 1 代表获奖,奖励为 0 代表没有获奖。

# 导入需要使用的库,其中numpy是支持数组和矩阵运算的科学计算库,而matplotlib是绘图库
import numpy as np
import matplotlib.pyplot as plt


class BernoulliBandit:
    """ 伯努利多臂老虎机,输入K表示拉杆个数 """
    def __init__(self, K):
        self.probs = np.random.uniform(size=K)  # 随机生成K个0~1的数,作为拉动每根拉杆的获奖
        # 概率
        self.best_idx = np.argmax(self.probs)  # 获奖概率最大的拉杆
        self.best_prob = self.probs[self.best_idx]  # 最大的获奖概率
        self.K = K

    def step(self, k):
        # 当玩家选择了k号拉杆后,根据拉动该老虎机的k号拉杆获得奖励的概率返回1(获奖)或0(未
        # 获奖)
        if np.random.rand() < self.probs[k]:
            return 1
        else:
            return 0


np.random.seed(1)  # 设定随机种子,使实验具有可重复性
K = 10
bandit_10_arm = BernoulliBandit(K)
print("随机生成了一个%d臂伯努利老虎机" % K)
print("获奖概率最大的拉杆为%d号,其获奖概率为%.4f" %
      (bandit_10_arm.best_idx, bandit_10_arm.best_prob))

接下来我们用一个 Solver 基础类来实现上述的多臂老虎机的求解方案。需要实现下列函数功能:根据策略选择动作、根据动作获取奖励、更新期望奖励估值、更新累积懊悔和计数。在下面的 MAB 算法基本框架中,我们将根据策略选择动作根据动作获取奖励更新期望奖励估值放在 run_one_step() 函数中,由每个继承 Solver 类的策略具体实现。而更新累积懊悔和计数则直接放在主循环 run() 中。

class Solver:
    """ 多臂老虎机算法基本框架 """
    def __init__(self, bandit):
        self.bandit = bandit
        self.counts = np.zeros(self.bandit.K)  # 每根拉杆的尝试次数
        self.regret = 0.  # 当前步的累积懊悔
        self.actions = []  # 维护一个列表,记录每一步的动作
        self.regrets = []  # 维护一个列表,记录每一步的累积懊悔

    def update_regret(self, k):
        # 计算累积懊悔并保存,k为本次动作选择的拉杆的编号
        self.regret += self.bandit.best_prob - self.bandit.probs[k]
        self.regrets.append(self.regret)

    def run_one_step(self):
        # 返回当前动作选择哪一根拉杆,由每个具体的策略实现
        raise NotImplementedError

    def run(self, num_steps):
        # 运行一定次数,num_steps为总运行次数
        for _ in range(num_steps):
            k = self.run_one_step()
            self.counts[k] += 1
            self.actions.append(k)
            self.update_regret(k)

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

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

相关文章

Zabbix“专家坐诊”第189期问答汇总

问题一 Q&#xff1a;您好&#xff0c;为什么在shell脚本中&#xff0c;不写mysql命令的绝对路径&#xff0c;zabbix获取不到输出的值&#xff1f; A&#xff1a;mysql默认命令是针对root等有权限才能直接使用的&#xff0c;其他用户要使用要指定命令路径。 Q&#xff1a;zab…

SLB负载均衡haproxy的安装及使用

1.介绍 HAProxy是什么 HAProxy是一个免费的负载均衡软件&#xff0c;可以运行于大部分主流的Linux操作系统上。 HAProxy提供了L4(TCP)和L7(HTTP)两种负载均衡能力&#xff0c;具备丰富的功能。HAProxy的社区非常活跃&#xff0c;版本更新快速&#xff08;最新稳定版1.7.2于2…

【剧前爆米花--爪哇岛寻宝】网络互连,网络通信和网络分层

作者&#xff1a;困了电视剧 专栏&#xff1a;《JavaEE初阶》 文章分布&#xff1a;这是一篇关于网络初识的文章&#xff0c;在这篇文章中讲解了局域网广域网&#xff0c;IP地址&#xff0c;端口以及网络分层等相关内容&#xff0c;希望对你有所帮助&#xff01; 目录 网络互连…

无线通信网 - 无线局域网 WLAN(802.11 标准)

文章目录 1 概述2 WLAN2.1 802.11 标准2.2 网络分类2.3 通信技术 3 扩展3.1 移动通信3.2 网工软考真题 1 概述 #mermaid-svg-UcgosJsdJfSTEm0Y {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-UcgosJsdJfSTEm0Y .err…

PMO和PM必备六大复盘方法工具汇总

无论是对于企业还是个人来说&#xff0c;复盘都是一个能让我们快速成长的方法&#xff0c;尤其是项目经理和PMO&#xff0c;你是带领项目团队的&#xff0c;每一次项目的完成&#xff0c;都有很多经验&#xff0c;俗话说&#xff0c;最大的浪费是经验的浪费&#xff01; 复盘的…

如何解决国外主机托管中遇到的常见问题?

在国际化发展的今天&#xff0c;越来越多的企业和个人选择将网站托管在国外主机上。这样做的好处是显而易见的&#xff0c;如更好的网站访问速度、更多的服务器资源、更优质的服务和更灵活的管理权限等。但同时&#xff0c;使用国外主机也会带来一些问题。本文将讨论国外主机托…

浪潮信息龙蜥联合实验室领衔成立 Serverless SIG 打造标准化开源解决方案

近日&#xff0c;浪潮信息龙蜥联合实验室在龙蜥社区领衔成立 Serverless SIG&#xff08;服务器无感知计算 SIG&#xff09;&#xff0c;并举行了首届 Serverless SIG MeetUp&#xff0c;活动由浪潮信息龙蜥联合实验室主办&#xff0c;来自浪潮信息、天津大学、阿里云、Intel、…

面板数据熵权topsis法分析流程

面板数据熵权topsis法分析流程 一、案例背景 当前有9家公司连续5年&#xff08;2018-2022年&#xff09;的财务指标数据&#xff0c;想要通过这份数据&#xff0c;确定9家公司的财务排名情况。因为各项财务指标的权重有所不同&#xff0c;所以选择使用熵权topsis法进行研究。 …

unity GI 系统

间接光没有办法实现实时计算&#xff0c;所以需要一套GI系统去处理间接光。 GI系统主要解决的是间接光漫反射的实现&#xff0c;实现的载体是LightMap、Light Probe、Refletion Probe。需要一个后台程序&#xff08;离线渲染器&#xff09;来实现离线渲染。可以根据不同的物体…

iPhone清理工具:4Easysoft iPhone Cleaner for Mac

4Easysoft iPhone Cleaner for Mac是一款Mac上的iPhone清理软件&#xff0c;它可以帮助用户清理iPhone上的垃圾文件、缓存文件、无用图片和视频等&#xff0c;从而释放iPhone的存储空间&#xff0c;提高设备的性能。全面扫描您的 iOS 设备并对不必要的数据进行分类。轻松删除 i…

【软件测试面试】面试技巧,让面试官记住的自我介绍,疯狂收割offer.....

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 在讨论如何自我介…

CASAIM全自动3d测量仪自动检测差速器差壳全尺寸测量装配检测

随着汽车行业的新变化&#xff0c;汽车零部件行业也呈现出新的发展趋势。汽车零部件产品作为汽车制造业的配套产业&#xff0c;发展也十分迅速。  差速器作为汽车关键零部件&#xff0c;由差速器差壳、行星齿轮、半轴齿轮、半轴和行星齿轮轴组装而成。 差速器差壳通常采用一…

算法基础(三)(共有20道例题)

七、数学知识 &#xff08;一&#xff09;质数 质数&#xff08;素数&#xff09; 的定义&#xff1a; 互质的定义&#xff1a;除了1以外&#xff0c;两个没有其他共同质因子的正整数称为互质&#xff0c;比如3和7互质。因为1没有质因子&#xff0c;1与任何正整数&#xff08…

ASEMI代理ADI亚德诺ADM202EARNZ-REEL车规级芯片

编辑-Z ADM202EARNZ-REEL芯片参数&#xff1a; 型号&#xff1a;ADM202EARNZ-REEL 工作电压范围&#xff1a;4.5-5.5V VCC电源电流&#xff1a;2.5 mA 输入逻辑阈值低&#xff1a;0.8V 输入逻辑阈值高&#xff1a;2.4V 输出电压摆幅&#xff1a;9.0V 变送器输出电阻&am…

IMF: Interactive Multimodal Fusion Model for Link Prediction

[2303.10816] IMF: Interactive Multimodal Fusion Model for Link Prediction (arxiv.org) 目录 1 背景 2 贡献 3 模型 3.1 Overall Architecture 3.2 Modality-Specific Encoders 3.3 Multimodal Fusion 3.4 Contextual Relational Model 3.5 Decision Fusion 3.6 …

GNSS监测站在滑坡和地质灾害中的应用

《地质灾害防治条例》涉及的地质灾害包括崩塌、滑坡、泥石流、地面沉降、地面塌陷和地裂缝等&#xff0c;已成为我国主要的自然灾害&#xff0c;严重威胁着人民的生命财产安全和生存环境以及国家重大工程的建设&#xff0c;制约着我国国民经济的可持续发展。 我国的地质灾害监…

【gcd性质】最小公倍数挑战

题目-最小公倍数挑战 (51nod.com) 题意&#xff1a; 思路&#xff1a; 要找到三个数使得他们的lcm尽可能大 那就让这三个数都两两互质&#xff0c;且三个数的积尽可能大 若n为奇数&#xff0c;考虑n-1和n-2 n和n-1一定互质&#xff0c;那么考虑n和n-2是否互质 结论是&…

【计算机基本原理-数据结构】数据结构中树的详解

【计算机基本原理-数据结构】数据结构中树的详解 1&#xff09;总览2&#xff09;树的相关概念3&#xff09;二叉树、满二叉树、完全二叉树4&#xff09;二叉查找树 - BST5&#xff09;平衡二叉树 - AVL6&#xff09;红黑树7&#xff09;哈弗曼树8&#xff09;B 树9&#xff09…

【数据结构】删除二叉树中的结点;树与二叉树的相互转换(含二叉树/二叉排序树的基本运算)

定义二叉树结点和树结点结构体&#xff1a; #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<stdbool.h>typedef int BTDataType; typedef int TDataType;//二叉树 typedef struct BinaryTreeNode {struct BinaryTreeNode* left;…

python requests一个非常蠢的问题: post请求中data和json的区别

问题 最近在写java的ODD cucumber的框架&#xff0c;其中的接口调用相比python来说非常繁琐&#xff0c;很不友好&#xff0c;如下图 所以我打算先用python调一下这个接口,代码如下&#xff0c;url已做脱敏处理 import requests url "http://xxxxxxxxxxxxxxxxxxx:966…