RL - 强化学习 Decaying Epsilon Greedy 算法解决多臂老虎机问题

news2024/11/24 14:32:44

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

DEG

Decaying Epsilon Greedy 算法是一种强化学习中的探索策略,可以平衡开发和探索之间的矛盾。基本思想是,以一个递减的概率 epsilon 随机选择一个动作,以 1-epsilon 的概率选择当前最优的动作。随着学习的进行,epsilon 逐渐减小,从而增加利用已知信息的机会,减少随机探索的次数。这种算法可以保证每个动作都有一定的概率被访问到,同时也可以收敛到最优策略。

1. 强化学习

强化学习(Reinforcement Learning):强化学习是机器通过与环境交互来实现目标的一种计算方法。

关注于:序列决策制定(Sequential Decision Making)

强化学习使用智能体或代理(Agent)表示做决策的机器,Agent包括3个要素,即感知(State)、决策(Action)、奖励(Return)。

类似于随机过程:
下一刻的状态 ∼ P ( ⋅ ∣ 当前状态,智能体动作 ) 下一刻的状态 \sim P(·|当前状态,智能体动作) 下一刻的状态P(当前状态,智能体动作)
在交过过程中,每一轮获得的奖励信号可以进行累加,形成智能体的整体回报(Return),而回报的期望,就是价值(Value)。

强化学习的数据分布,即占用度量(Occupancy Measure)。

有监督学习,数据分布不变,优化模型:
最优模型 = a r g   m i n 模型   E ( 特征、标签 ) ∼ 数据分布 [ 损失函数 ( 标签,模型 ( 特征 ) ) ] 最优模型 = \underset{模型}{arg \ min} \ E_{(特征、标签)\sim数据分布}[损失函数(标签,模型(特征))] 最优模型=模型arg min E(特征、标签)数据分布[损失函数(标签,模型(特征))]
强化学习,数据分布变化,优化策略:
最优策略 = a r g   m a x 策略   E ( 状态、动作 ) ∼ 策略的占用度量 [ 奖励函数 ( 状态、动作 ) ] 最优策略 = \underset{策略}{arg \ max} \ E_{(状态、动作) \sim 策略的占用度量}[奖励函数(状态、动作)] 最优策略=策略arg max E(状态、动作)策略的占用度量[奖励函数(状态、动作)]

2. 多臂老虎机问题

多臂老虎机(Multi-Armed Bandit)问题,只有动作和奖励,没有状态,主要关注于探索(Exploration)和利用(Exploitation),即探索拉杆的获奖概率,根据经验选择获奖最多的拉杆(根据期望),设计策略,平衡探索和利用的次数,使得累积奖励最大化。

懊悔值(Regret)类似于损失值,最大化累积奖励,等价于最小化累积懊悔。

期望更新公式, r k r_{k} rk 是第 k 次的奖励值,增量更新的时间复杂度O(1):
Q k = Q k − 1 + 1 k [ r k − Q k − 1 ] Q_{k} = Q_{k-1} + \frac{1}{k}[r_{k} - Q_{k-1}] Qk=Qk1+k1[rkQk1]

3. Decaying Epsilon Greedy 算法

ϵ  -  G r e e d y \epsilon \ \text{-} \ Greedy ϵ - Greedy 算法,在完全贪婪算法的基础上,增加噪声 ϵ \epsilon ϵ,每次以概率 1 − ϵ 1-\epsilon 1ϵ 选择以往经验中期望奖励估值最大的拉杆(利用),以概率 ϵ \epsilon ϵ 随机选择一根拉杆(探索),公式如下:
a i = { a r g   m a x a ∈ A   Q ( a ) ,采样概率  1 − ϵ 从 A 中随机选择,采样概率  ϵ a_{i} = \begin{cases} arg \ \underset{a \in A}{max} \ Q(a),采样概率 \ 1-\epsilon \\ 从A中随机选择,采样概率 \ \epsilon \\ \end{cases} ai={arg aAmax Q(a),采样概率 1ϵA中随机选择,采样概率 ϵ
ϵ  -  G r e e d y \epsilon \ \text{-} \ Greedy ϵ - Greedy 算法,累积懊悔是线性增长的。优化的 D e c a y i n g   ϵ  -  G r e e d y Decaying \ \epsilon \ \text{-} \ Greedy Decaying ϵ - Greedy 算法, ϵ \epsilon ϵ 值随时间 t t t 衰减,反比例衰减,即 ϵ = 1 t \epsilon = \frac{1}{t} ϵ=t1 累计懊悔是次线性(sublinear)增长的,优于 ϵ  -  G r e e d y \epsilon \ \text{-} \ Greedy ϵ - Greedy 算法。

ϵ  -  G r e e d y \epsilon \ \text{-} \ Greedy ϵ - Greedy 算法:

EG

D e c a y   ϵ  -  G r e e d y Decay \ \epsilon \ \text{-} \ Greedy Decay ϵ - Greedy 算法:

DEG

源码如下:

class BernoulliBandit(object):
  """
  经典的 Bernoulli 多臂老虎机
  """
  def __init__(self, K, seed=42):
    np.random.seed(seed)
    self.probs = np.random.uniform(size=K)
    self.best_idx = np.argmax(self.probs)
    self.best_prob = self.probs[self.best_idx]
    self.K = K

    print(f"随机生成一个 {K} 臂的伯努利老虎机")
    print(f"老虎机获奖概率: {[round(i, 4) for i in self.probs]}")
    print(f"获奖概率最大的拉杆是 {self.best_idx} 号,相应的获奖概率是 {round(self.best_prob, 4)}")

  def step(self, k):
    if np.random.rand() < self.probs[k]:
      return 1
    else:
      return 0

class Solver(object):
  """
  MAB 求解的基类
  """
  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):
    """
    更新懊悔值
    """
    self.regret += self.bandit.best_prob - self.bandit.probs[k]  # 概率懊悔值
    self.regrets.append(self.regret)  # 记录概率懊悔值

  def run_one_step(self):
    """
    返回拉动哪一根拉杆
    1. 根据策略选择动作
    2. 根据动作获得奖励
    3. 更新期望奖励估值
    """
    raise NotImplementedError

  def run(self, num_steps):  # 执行
    for _ in range(num_steps):
      k = self.run_one_step()  # 动作是k
      self.counts[k] += 1    # 更新选择次数
      self.actions.append(k)
      self.update_regret(k)  # 更新懊悔值

class EpsilonGreedy(Solver):
  """
  Epsilon Greedy 算法
  """
  def __init__(self, bandit, epsilon=0.01, init_prob=1.0):
    super(EpsilonGreedy, self).__init__(bandit)

    self.epsilon = epsilon
    # 初始化全部拉杆的期望,后续逐渐更新
    self.estimates = np.array([init_prob] * self.bandit.K)

  def run_one_step(self):
    if np.random.random() < self.epsilon:
      k = np.random.randint(0, self.bandit.K)   # 随机选择一个拉杆
    else:
      k = np.argmax(self.estimates)   # 选择最大期望的拉杆
    r = self.bandit.step(k)
    # 更新期望,先run,再更新count,所以count+1,更新期望
    self.estimates[k] += 1. / (self.counts[k] + 1) * (r - self.estimates[k])
    return k

class DecayingEpsilonGreedy(Solver):
  """
  随着时间衰减的 Epsilon-Greedy 算法
  """
  def __init__(self, bandit, init_prob=1.0):
    super(DecayingEpsilonGreedy, self).__init__(bandit)
    self.estimates = np.array([init_prob] * self.bandit.K)
    self.total_count = 0

  def run_one_step(self):
    self.total_count += 1
    epsilon = 1 / self.total_count
    if np.random.random() < epsilon:
      k = np.random.randint(0, self.bandit.K)
    else:
      k = np.argmax(self.estimates)

    r = self.bandit.step(k)
    self.estimates[k] += 1 / (self.counts[k] + 1) * (r - self.estimates[k])
    return k

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

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

相关文章

第15章:索引的数据结构

一、为什么使用索引 1.索引是存储引擎用于快速找到记录的一种数据结构。相当于一本书的目录。在进行数据查找时&#xff0c;首先查看查询条件是否命中某条索引&#xff0c;符合则通过索引查找相关数据。如果不符合则需要全表扫描&#xff0c;一条一条查找记录&#xff0c;直到…

Layui源码解读之define函数

一、layui.define 用法 layui.define([mods], callback) 通过layui.define该方法可在新的 JS 文件中定义一个 layui 模块。 mods 是可选的&#xff0c;用于声明该模块所依赖的模块。callback 为模块加载完毕的回调函数&#xff0c;它返回一个 exports 参数&#xff0c;用于输出…

鸿蒙App开发选择Java还是JavaScript?

众所周知&#xff0c; Java和 JavaScript是两种编程语言&#xff0c;这两种语言在不同的环境中都有许多用途。在鸿蒙 App开发中&#xff0c; Java和 JavaScript是两种常见的编程语言&#xff0c;它们都具有广泛的应用&#xff0c;并且都有其独特的优势。下面我们将就这两种编程…

LiveGBS国标GB/T28181国标平台功能-电子地图移动位置订阅mobileposition地图定位GPS轨迹坐标位置获取redis获取位置

LiveGBS国标GB/T28181国标平台功能-电子地图移动位置订阅mobileposition地图定位GPS轨迹坐标位置获取redis获取位置 1、位置订阅1.1、国标设备编辑1.2、选择设备开启位置订阅1.3、全局开启位置订阅1.4、通过目录订阅获取位置(少数情况) 2、经纬度信息查询2.1、访问接口获取2.1.…

详解iPaaS与RPA的区别及各自的应用场景

随着企业数字化转型的加速&#xff0c;业务系统集成和自动化流程成为关键议题。本文旨在探讨iPaaS&#xff08;Integration Platform as a Service&#xff09;与RPA&#xff08;Robotic Process Automation&#xff09;在业务系统集成方面的区别&#xff0c;它们各自的用途和适…

python数据分析案例——零售商店电子销售订单分析

一、项目背景 通过"扫描"零售商店电子销售点个别产品的条形码而获得的消费品销售的详细数据。 这些数据提供了有关所售商品的数量、特征和价值以及价格的详细信息。 二、数据来源 https://www.kaggle.com/marian447/retail-store-sales-transactions 三、提出问…

windows11@OpenWith@选择文件打开方式导致卡死@windows11任务栏显示秒

文章目录 OpenWith选择文件打开方式导致卡死解决方案 windows11任务栏显示秒显示秒的注册表设置取消显示秒: OpenWith选择文件打开方式导致卡死 关键在于一个名为openwith的进程出现问题该进程有时会卡死,并且无法关闭,这个bug存在很久了,具体参考:Windows11 - Microsoft Comm…

MySQL 多行函数

文章目录 多行函数1. 求 country 表中&#xff0c;所有国家人口的平均值&#xff0c;其 SQL 语句实现如下&#xff1a;2. 求 country 表中&#xff0c;所有国家人口的总数&#xff0c;其 SQL 语句实现如下&#xff1a;3. 求 country 表中&#xff0c;人口最多和最少国家的人口数…

KD7742耐压接地泄漏绝缘四合一并行测试仪

一、产品简介 KD7742耐压接地泄漏绝缘四合一并行测试仪具有交/直流耐压、绝缘电阻等项目的测试分析功能&#xff0c;能显示电压、电流和电阻的波形图以及趋势图&#xff0c;以便更直观的监测分析绝缘性能和绝缘崩溃时的各项指标&#xff0c;适用于高要求的测试分析场合。 产品具…

Pig项目新加权限类型生成Token并且解决验证问题

前言 这个教程可能不是最好的,也许是最直白的,你只需要找到对应的地方跟着博主一起去修改就能操作成功,今天用添加 mini 的授权模式的例子说一下这个 mini 模式是自己自定义的,你想叫什么都行 最近可烦死了快被折磨死人,在昨天睡了一觉,今天就解决问题了…睡一觉就能解决问题,那…

教你一步步使用实现TensorFlow 进行对象检测

在本文中,我们将学习如何使用 TensorFlow Hub 预训练模型执行对象检测。TensorFlow Hub 是一个库和平台,旨在共享、发现和重用预训练的机器学习模型。TensorFlow Hub 的主要目标是简化重用现有模型的过程,从而促进协作、减少冗余工作并加速机器学习的研发。用户可以搜索社区…

【数据结构与算法分析inC-MarkAllen】2-算法分析

文章目录 第二章——算法分析2.1 算法评价的量化理论2.1.1 函数渐进增长四种渐进增长定义运算法则两个函数相对增长率判断 2.1.2 算法分析的计算机模型2.1.3 要分析的目标最坏情况 2.1.4 一般法则for循环嵌套for循环顺序语句分支语句二分函数调用 2.2 计算方法2.2.1 循环主体中…

Android应用的加固与逆向

文章目录 前言名词释义加固手段逆向dex文件resources.arscReact Native TODO文档链接工具参考加固工具逆向工具 前言 加固与逆向是安卓攻防的两个方面。搞安卓研发时间长了就不可避免走到这一步。既要研究别人的实现&#xff0c;又要保护好自己的东西。个人认为&#xff0c;逆…

糖尿病首创新药的中国梦

《多肽链》原创出品 作者&#xff5c;慕白 在中国上市一款first-in-class&#xff08;FIC&#xff09;全球首创新药&#xff0c;有多难&#xff1f;先来看一组数据对比。 按照美国FDA的药品评价和研究中心&#xff08;CDER&#xff09;报告数据&#xff0c;2022年有37款新药…

chatgpt赋能python:介绍Python中二次函数的基本知识

介绍Python中二次函数的基本知识 在Python中&#xff0c;二次函数是一个重要的概念&#xff0c;它是由一个二次项、一次项和一个常数项构成的一个代数式。二次函数在数学和物理学中都有广泛的应用&#xff0c;了解二次函数的基本知识对于学习和理解这些领域都是非常重要的。在…

uni-app实现 app 小程序 手机端H5扫码功能

首先 扫码这个功能小程序和App都是有现成的方法 但是H5是不行的 我们可以看这样一段代码 <template><view><!-- #ifdef MP-WEIXIN --><button click"scan">扫描</button><view v-if"result">{{result}}</view>…

长尾词挖掘,挖掘百度相关词和下拉词的操作步骤

什么是下拉词 在搜索引擎的搜索框输入一个关键词的时候&#xff0c;搜索框会推荐一些与这个关键词有关联的长尾关键词&#xff0c;如“汉服”。 什么是相关词 在搜索引擎的搜索框输入一个关键词的时候&#xff0c;一般会推荐与这个关键词相关的长尾关键词。如“汉服”。 挖…

【SpringBoot系列】SpringBoot中 @Configuration 和 @Component 的区别及原理分析

示例 //Component Configuration public class AppConfig {Beanpublic Foo foo() {System.out.println("foo() invoked...");Foo foo new Foo();System.out.println("foo() 方法的 foo hashcode: " foo.hashCode());return foo;}Beanpublic Eoo eoo() {…

华为OD机试真题B卷 Java 实现【等差数列】,附详细解题思路

一、题目描述 等差数列 2&#xff0c;5&#xff0c;8&#xff0c;11&#xff0c;14。。。。 从 2 开始的 3 为公差的等差数列。 输出求等差数列前n项和。 数据范围&#xff1a; 1≤n≤1000 。 二、输入描述 输入一个正整数n。 三、输出描述 输出一个相加后的整数。 四…

Dell电脑出现ac power adapter电压异常的解决办法

最近这段时间不知怎么的&#xff0c;dell笔记本电脑一开机就出现下面错误&#xff1a; The AC Power Adapter Wattage Cannot be Determined. 无法确定此交流电源的功率信息。 The Battery Maynot Charge. 电池将可能无法充电。 The System Will Adjust the Performance to Ma…