动手学强化学习第2章多臂老虎机

news2025/4/9 5:21:57

2.1简介

多臂老虎机问题可以被看作简化版的强化学习问题。但是其只有动作和奖励没有状态信息,算是简化版的强化学习问题。

2.2问题介绍

2.2.1问题定义

在多臂老虎机(MAB)问题中,有一个有K根拉杆的老虎机,拉动每一根拉杆都对应一个关于奖励的概率分布 R R R。我们每次拉动其中一根拉杆,就可以从该拉杆对应的奖励概率分布中获得一个奖励 r r r
我们在各个拉杆的奖励概率分布未知的情况下,从头尝试,目标是操作T次拉杆后获得尽可能高的累积奖励。
由于奖励的概率分布是未知的,所以我们需要在探索拉杆的获奖概率根据经验选择获奖最多的拉杆中进行权衡。采用怎样的操作策略才能使获得的累积奖励最高便是多臂老虎机问题。
在这里插入图片描述

2.2.2形式化描述

多臂老虎机问题可以表示为一个元组 < A , R > <A,R> <A,R>,其中:

  • A为动作集合,其中一个动作表示拉动一个拉杆。若多臂老虎机一共有K根拉杆,那动作空间就是集合,我们用 a t ∈ A a_t\in A atA表示任意一个动作
  • R为奖励概率分布,拉动每一根拉杆的动作a都对应一个奖励概率分布R(r|a),不同拉杆的奖励分布通常是不同的。
    假设每个时间步只能拉动一个拉杆,多臂老虎机的目标为最大化一段时间步T内累积的奖励: m a x ∑ t = 1 T r t , r t ∼ R ( ⋅ ∣ a t ) max \sum\limits_{t=1}^Tr_t,r_{t} \sim R(\cdot|a_t) maxt=1Trt,rtR(at),其中 a t a_t at表示在第t时间步拉动某一拉杆的动作, r t r_t rt表示动作 a t a_t at获得的奖励。

r t ∼ R ( ⋅ ∣ a t ) r_t ∼ R(·|a_t) rtR(at) 中,符号 ⋅ · 表示一个占位符,通常用来表示条件概率的输入或条件。在这个上下文中,它表示奖励 r t r_t rt 是从奖励分布 R 中根据条件 a t a_t at 抽取的。也就是说,它指代了在给定动作 a t a_t at 的条件下,奖励 r t r_t rt 的分布。
这种表示方法用于表达随机性和条件性概率分布,它告诉我们奖励 r t r_t rt 是依赖于代理选择的动作 a t a_t at 而发生的,不同的动作可能导致不同的奖励分布。这对于解释多臂老虎机问题中的随机性和条件性关系非常有用。

2.2.3累积懊悔

对于每一个动作a,我们定义其期望奖励为 Q ( a ) = E r ∼ R ( ⋅ ∣ a ) [ r ] Q(a)=\mathbb{E}_{r \sim R(\cdot|a)}[r] Q(a)=ErR(a)[r],于是,至少存在一根拉杆,它的期望奖励不小于拉动其他任意一根拉杆,我们将该最优期望奖励表示为 Q ∗ = m a x a ∈ A Q ( a ) Q^*=max_{a\in A}Q(a) Q=maxaAQ(a)。为了更加直观、方便地观察拉动一根拉杆的期望奖励离最优拉杆期望奖励的差距,我们引入懊悔(regret)概念。
懊悔定义为拉动当前拉杆的动作a与最优拉杆的期望奖励差,即 R ( a ) = Q ∗ − Q ( a ) R(a)=Q^*-Q(a) R(a)=QQ(a)
累积懊悔(cumulative regret)即操作T次拉杆后累积的懊悔总量,对于一次完整的T步决策 { a 1 , a 2 , . . . , a T } \{a_1,a_2,...,a_T\} {a1,a2,...,aT},累积懊悔为 σ R = ∑ t = 1 T R ( a t ) \sigma_R=\sum\limits_{t=1}^TR(a_t) σR=t=1TR(at),MAB问题的目标为最大化累积奖励,等价于最小化累积懊悔。

符号 E \mathbb{E} E 表示数学期望(Expectation),而不带修饰的 “E” 通常用于表示一般的期望值。它们之间的区别在于:

  1. E \mathbb{E} E:这是一种数学符号,通常用于表示数学期望操作。在LaTeX等数学标记系统中, E \mathbb{E} E通常用于表示数学期望,表示对随机变量的期望值。数学期望是一个用于描述随机变量平均值的概念。通常,数学期望表示为:
    E [ X ] \mathbb{E}[X] E[X]
    其中,X 是随机变量, E [ X ] \mathbb{E}[X] E[X] 表示随机变量 X 的期望值。
  2. E:这是字母 “E” 的一般表示,可能用于表示其他数学或物理概念中的变量或符号,不一定表示数学期望。如果没有明确的上下文或标记,它可能表示其他概念,而不是期望操作。

所以, E \mathbb{E} E 是专门用于表示数学期望的符号,而 “E” 可能用于其他用途。当你看到 E [ X ] \mathbb{E}[X] E[X],它明确表示对随机变量 X 的数学期望,而 “E” 会根据上下文的不同而有不同的含义。

Q ( a ) = E r ∼ R ( ⋅ ∣ a ) [ r ] Q(a)=\mathbb{E}_{r \sim R(\cdot|a)}[r] Q(a)=ErR(a)[r]这个方程表示了动作值函数 Q(a) 的定义,其中 Q(a) 表示对动作 a 的期望奖励值。让我来解释它:

  • Q ( a ) Q(a) Q(a):这是动作值函数,表示选择动作 a 后的期望奖励值。动作值函数告诉代理在选择特定动作 a 时,可以预期获得多少奖励。
  • E r ∼ R ( ⋅ ∣ a ) [ r ] \mathbb{E}_{r \sim R(\cdot|a)}[r] ErR(a)[r]:这是期望操作,表示对随机变量 r 的期望,其中 r 来自奖励分布 R(·|a)。这个期望操作告诉我们,在给定动作 a 的情况下,随机抽取的奖励 r 的期望值。

具体来说, Q ( a ) Q(a) Q(a) 是在选择动作 a 后,从奖励分布 R(·|a) 中随机抽取奖励 r 并计算其期望值的结果。这是一种在强化学习中用于估计动作的价值的常见方法。代理使用动作值函数来指导其决策,选择具有最高动作值的动作,以最大化累积奖励。

2.2.4估计期望奖励

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

  • 对与 ∀ a ∈ A \forall a \in A aA,初始化计数器 N ( a ) = 0 N(a)=0 N(a)=0和期望奖励估值 Q ^ ( a ) = 0 \hat Q(a)=0 Q^(a)=0
  • for t = 1 → T t=1 →T t=1Tdo
    • 选取某根拉杆,该动作记为 a t a_t at
    • 得到奖励 r t r_t rt
    • 更新计数器: N ( a t ) = N ( a t ) + 1 N(a_t)=N(a_t)+1 N(at)=N(at)+1
    • 更新期望奖励估值: Q ^ ( a t ) = Q ^ ( a t ) + 1 N ( a t ) [ r t − Q ^ ( a t ) ] \hat Q(a_t)=\hat Q(a_t)+\frac{1}{N(a_t)}[r_t-\hat Q(a_t)] Q^(at)=Q^(at)+N(at)1[rtQ^(at)]
  • end for
    以上for循环中的第四步如此更新估值,是因为这样可以进行增量式的期望更新,公式如下。
    Q k = 1 k ∑ i = 1 k r i = Q_k=\frac{1}{k}\sum\limits_{i=1}^k r_i= Qk=k1i=1kri=
    在这里插入图片描述
    如果将所有数求和再除以次数,其缺点是每次更新的时间复杂度和空间复杂度均为 O ( n ) O(n) O(n)。而采用增量式更新,时间复杂度和空间复杂度均为 O ( 1 ) O(1) O(1)

下面我们编写代码来实现一个拉杆数为 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))
随机生成了一个10臂伯努利老虎机
获奖概率最大的拉杆为1号,其获奖概率为0.7203

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

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

相关文章

简单使用 Hugo 博客

之前用过 hugo&#xff0c;本次来分享一波&#xff0c;确实简单好用&#xff0c;可以持续使用&#xff0c;尤其是喜欢 GO语言的同学 hugo Hugo是一个用 Go语言 编写的静态网站生成器&#xff0c;可以快速地生成高效、安全和易于管理的静态网站。Hugo具有速度快、可定制性强、…

Linux引导故障排除:从问题到解决方案的详细指南

1 BIOS初始化 通电->对硬件检测->初始化硬件时钟 2 磁盘引导及其修复 2.1 磁盘引导故障 磁盘主引导记录&#xff08;MBR&#xff09;是在0磁道1扇区位置&#xff0c;446字节。 MBR作用&#xff1a;记录grub2引导文件的位置 2.2 修复 步骤&#xff1a;1、光盘进…

Javascript笔记:Web页面中的事件处理

1 任务队列 2事件处理&#xff1a;⼀个只有宏任务的示例 3 Web⻚⾯中的事件处理 3.1 定时器与事件处理&#xff1a;一个实例 4 Web⻚⾯中的事件处理 5 事件在DOM中的传播 5.1 两个阶段

C++ (Chapter 1)

C (一) 1.C的命名空间 先来看一个C语言的例子: 下面这段代码是可以正常运行的. #include<stdio.h> int rand 0; int main() {printf("%d \n", rand);return 0; }但是,包含了一个头文件之后,甚至无法通过编译. #include<stdio.h> #include<stdli…

尘封已久的功能!iPhone 15带来了一项早该使用的电池功能

了解如何在iPhone 15上检查电池周期&#xff0c;在设备使用寿命的某个阶段将非常有用。只要简单地看一眼完成的循环次数&#xff0c;你就可以确定你的电池有多健康&#xff0c;以及你是否需要很快更换它。 这是iPhone在过去一直缺失的东西。iPhone上有检查电池周期的数据&…

Altium Designer实用系列(三)----部分问题解决办法(连完所有的线之后还存在飞线,isolated copper...)

一、常见问题解决 1.1 连完所有的线之后还存在飞线 出现此问题可以尝试把该PCB先关闭&#xff0c;然后关闭Altium Designer软件。之后再打开Altium Designer&#xff0c;之后再进行DRC电气检查&#xff0c;可解决该问题。 1.2 isolated copper:split plane(xxx)on … 该问题…

计算机毕业设计选什么题目好?springboot智慧养老中心管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

C++入门篇1

文章目录 C入门篇11、命名空间1.1、命名空间定义1.2、命名空间的使用 2、输入&输出3、缺省参数3.1、缺省参数概念3.2、缺省参数分类 C入门篇1 1、命名空间 1.1、命名空间定义 命名空间是什么&#xff1f;是一种将相关功能和数据封装在一起的方式&#xff0c;以避免名称冲…

nginx如何安装 以及nginx的配置文件

Nginx 网站服务 是一个高性能 轻量级web服务软件&#xff0c; 高新能&#xff1a;对http并发连接的处理能很高&#xff0c;单台处理器可支持30000-50000个并发请求&#xff0c;&#xff08;一般设置在20000个左右&#xff09; 轻量级&#xff1a;nginx软件很小&#xff0c;安装…

c语言:通讯录管理系统(动态分配内存版)

前言&#xff1a;在大多数高校内&#xff0c;都是通过设计一个通讯录管理系统来作为c语言课程设计&#xff0c;通过一个具体的系统设计将我们学习过的结构体和函数等知识糅合起来&#xff0c;可以很好的锻炼学生的编程思维&#xff0c;本文旨在为通讯录管理系统的设计提供思路和…

GPU 基础知识整理

萌新&#xff1a; 在接触一款硬件时我会&#xff1a;基础硬件结构&#xff0c;线程结构&#xff0c;内存布局&#xff0c;数据吞吐量&#xff0c;等方面进行学习 首先GPU的特点: 并行性能&#xff1a;GPU 是专门设计用于并行计算的硬件&#xff0c;通常具有大量的处理单元&am…

Vue中的监视属性

一、监视属性的使用 &#xff08;一&#xff09;配置watch进行监视 当我们想要监视一个属性改变的时候就可以使用监视属性监视其变化并进行操作。 语法格式如下&#xff1a; watch:{ 监视属性名称 : { // 监视属性的配置项 } } 1. handler函数 当监视的属性发生变化时就调…

进程死锁的处理策略之预防死锁,避免死锁以及死锁的检测和解除

1.不允许死锁发生 1.静态策略&#xff1a;预防死锁 知识回顾:死锁的产生必须满足四个必要条件&#xff0c;只要其中一个或者几个条件不满足&#xff0c;死锁就不会发生。 1.破环互斥条件 互斥条件: 只有对必须互斥使用的资源的争抢才会导致死锁。 如果把只能互斥使用的资源…

数据结构和算法(12):词典

词典 逻辑上的词典&#xff0c;是由一组数据构成的集合&#xff0c;其中各元素都是由关键码和数据项合成的词条&#xff08;entry&#xff09;。 映射&#xff08;map&#xff09;结构与词典结构一样&#xff0c;也是词条的集合。 二者的差别仅仅在于&#xff0c;映射要求不同…

cpp文件操作

文件操作 数据流 在cpp中&#xff0c;流&#xff08;stream&#xff09;是一个抽象概念&#xff0c;用于描述如何从一个位置到又一个位置传输数据。流主要用于I/O操作。 数据流包括两大类&#xff1a;1. 输入流(istream)&#xff1a;数据从某个源流入程序, 2. 输出流(ostrea…

CCF CSP认证历年题目自练Day28

题目一 试题编号&#xff1a; 202109-1 试题名称&#xff1a; 数组推导 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 样例1输入 6 0 0 5 5 10 10 样例1输出 30 15 样例2输入 7 10 20 30 40 50 60 75 样例2输出 285 285 题目分析&#xff08;个人理解&#…

yml显示不了小树叶图标解决办法

问题描述 在项目中&#xff0c;idea新建yml文件不显示小绿叶图标 1、解决办法一 找到下图设置&#xff1a;file -> settings -> Plugins 查看spring boot插件是非已安装&#xff08;按照下图步骤查看&#xff09; 2、解决办法二 ctrlalts&#xff0c;去File Types查…

记一次使用vue-markdown在vue中解析markdown格式文件,并自动生成目录大纲

先上效果图 如图所示&#xff0c;在网页中&#xff0c;能直接解析markdown文档&#xff0c;并且生成目录大纲&#xff0c;也支持点击目录标题跳转到对应栏目中&#xff0c;下面就来讲讲是如何实现此功能的。 1、下载vue-markdown yarn add vue-markdown 2、在页面中渲染markdo…

MySQL数据生成工具mysql_random_data_load

在看MySQL文章的时候偶然发现生成数据的工具&#xff0c;此处直接将软件作者的文档贴了过来&#xff0c;说明了使用方式及下载地址 Random data generator for MySQL Many times in my job I need to generate random data for a specific table in order to reproduce an is…

2023.10 秋爽版 java 软件授权激活 架构 java代码混淆 按日期授权 不联网

什么是代码混淆&#xff1f; 代码混淆是一种技术&#xff0c;用于在不改变代码功能的情况下&#xff0c;通过改变代码的结构和逻辑&#xff0c;使之变得更难理解和分析&#xff0c;从而增加反向工程的难度。 为什么要进行代码混淆&#xff1f; 在Java应用程序中&#xff0c;…