强化学习1——多臂老虎机(上)

在强化学习中,关注智能体在与环境的交互中学习,成为试错型学习。多臂老虎机不存在状态信息,只有动作和奖励,是最简单的“和环境交互中学习“。

什么是多臂老虎机

老虎机_百度百科 (baidu.com) 多臂老虎机即有多个摇杆的老虎机,每个摇杆获得奖励的概率分布 R 不同,每次拉动摇杆,可以根据该摇杆的奖励概率分布,有概率获得奖励 r

我们需要在每根拉杆的奖励概率分布未知的情况下,在操作T次后,获得最高的累计奖励,因此需要在寻找获奖概率最高的拉杆从拉过的杆中选择获奖最多(间接体现在已知的拉杆中获奖概率最高)的拉杆进行权衡。
image.png

数学化表达多臂老虎机、累积懊悔与估计期望

数学化形式上表达多臂老虎机

定义一个元组 < A , R > <A,R> <A,R> ,其中:

  • A表示动作合集,假定老虎机为K根拉杆,即 < a 1 , . . . . , a K > <a_1,....,a_K> <a1,....,aK> ,每一个动作 a x ∈ A a_x\in A axA ,表示拉动一个第x个拉杆
  • R为奖励概率分布,拉动每一根拉杆的动作 a x a_x ax 都对应着一个属于自己的奖励概率分布 R ( r x ∣ a x ) R(r_x|a_x) R(rxax) ,不同拉杆的奖励分布一般不同

每一步只能拉动一个拉杆,则我们的目标为在有限的步数T的情况下,让奖励最大化,即 m a x ∑ t = 1 T r t , r t R ( r t ∣ a t ) max\sum_{t=1}^{T}r_t,r_t~R(r_t|a_t) maxt=1Trt,rt R(rtat)

累积懊悔

对于每一个动作a,定义其期望奖励为 Q ( a ) Q(a) Q(a) (每次拉动不一定获奖,有获奖概率,则也有获奖期望),则至少存在一根拉杆,期望奖励不小于(可能等于)其他任意一个拉杆,将最大、最优期望奖励表示为 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) ,在一些问题中,最大化累计奖励可以等于最小化累计懊悔,为此我们需要了解T次操作后,累计懊悔的表达式 σ R = ∑ t = 1 T R ( a t ) \sigma _R=\sum_{t=1}^{T}R(a_t) σR=t=1TR(at)

估计期望奖励

根据每次拉动拉杆得到的奖励,估计各动作的期望奖励。 ∀ 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 → \to T do
    • 选取某根拉杆,记作 a x a_x ax
    • 得到奖励 r x r_x rx
    • 更新计数器 N ( a x ) = N ( a x ) + 1 N(a_x)=N(a_x)+1 N(ax)=N(ax)+1
    • 更新期望奖励估值 Q ^ ( a x ) = Q ^ ( a x ) + 1 N ( a t ) [ r t − Q ^ ( a t ) ] \hat Q(a_x)=\hat Q(a_x)+\frac{1}{N(a_t)}[r_t-\hat Q(a_t)] Q^(ax)=Q^(ax)+N(at)1[rtQ^(at)]
  • end for

最后一步推导过程如下面步骤所示:
Q k = 1 k ∑ i = 1 k r i = 1 k ( r k + ∑ i = 1 k − 1 r i ) = 1 k ( r k + ( k − 1 ) Q k − 1 ) = 1 k ( r k + k Q k − 1 − Q k − 1 ) = Q k − 1 + 1 k [ r k − Q k − 1 ] \begin{aligned} Q_{k}& =\frac1k\sum_{i=1}^kr_i \\ &=\frac{1}{k}\left(r_k+\sum_{i=1}^{k-1}r_i\right) \\ &=\frac1k(r_k+(k-1)Q_{k-1}) \\ &=\frac1k(r_k+kQ_{k-1}-Q_{k-1}) \\ &=Q_{k-1}+\frac1k[r_k-Q_{k-1}] \end{aligned} Qk=k1i=1kri=k1(rk+i=1k1ri)=k1(rk+(k1)Qk1)=k1(rk+kQk1Qk1)=Qk1+k1[rkQk1]
下面我们通过代码来表示拉杆数为10的多臂老虎机,每根拉杆奖励服从伯努利分布R统计学(01): 伯努利分布、二项分布 - 知乎 (zhihu.com),奖励为 1 代表获奖,奖励为 0 代表没有获奖。

import numpy as np
import matplotlib.pyplot as pltclass BernoullBandit:#K表示拉杆的个数def __init__(self, K):self.K = Kself.probs=np.random.uniform(size=K) #随机生成K个0-1之间的数,作为拉杆的概率self.bestIdx=np.argmax(self.probs) #返回概率最大的下标self.bestProb=self.probs[self.bestIdx] #最大的获奖概率def step(self,k):# 生成随机数,如果小于self.probs[k],则代表获得奖励1if np.random.rand()<self.probs[k]:return 1else:return 0np.random.seed(1) #设定随机种子,使得实验具有可重复性
K=10
bandit10Arm=BernoullBandit(K)
print(f'初始概率分布:{bandit10Arm.probs}')
print(f'初始概率最大的下标:{bandit10Arm.bestIdx},最大的概率:{bandit10Arm.bestProb}')
初始概率分布:[4.17022005e-01 7.20324493e-01 1.14374817e-04 3.02332573e-011.46755891e-01 9.23385948e-02 1.86260211e-01 3.45560727e-013.96767474e-01 5.38816734e-01]
初始概率最大的下标:1,最大的概率:0.7203244934421581

搭建框架,实现多臂老虎机的求解

class Solver:# 多臂老虎机基本框架def _init_(self,bandit):self.bandit=banditself.counts=np.zeros(self.bandit.K) #记录每个拉杆被点击的次数self.regret=0. #当前步的累积懊悔self.actions=[] #记录每次选择的拉杆self.regrets=[] #记录每一步的累积懊悔def updateRegret(self,k):# 更新当前步的累积懊悔,并保存累积懊悔self.regret+=self.bandit.bestProb-self.bandit.probs[k]self.regrets.append(self.regret)def runOneStep(self):# 返回当前动作选择哪一根杠杆raise NotImplementedErrordef run(self,numSteps):# numSteps为总运行次数for _ in range(numSteps):k=self.runOneStep()self.counts[k]+=1self.actions.append(k)self.updateRegret(k)

本文由博客一文多发平台 OpenWrite 发布!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[python]gym安装报错ERROR: Failed building wheel for box2d-py

报错截图&#xff1a; box2d是一个游戏领域的2D图形C引擎&#xff0c;用来模拟2D刚体物体运动和碰撞。 swig是一个将c/c代码封装为Python库的工具&#xff08;是Python调用c/c库的一种常见手段&#xff09;&#xff0c;所以在运行时box2d会依赖到swig。而swig并不是一个python库…

vivado xsim 终端 模拟

只模拟的话直接终端运行会快很多 计数器举例 mkdir srccounter.v module counter(input wire clk,input wire rst_n,output reg[31:0] cnt ); always (posedge clk or negedge rst_n)if(!rst_n)cnt < 31h0;elsecnt < cnt1;endmodule tb.v module tb; wire[31:0] out…

Guarded Suspension模式--适合等待事件处理

Guarded是被守护、被保卫、被保护的意思&#xff0c; Suspension则是暂停的意思。 如果执行现在的处理会造成问题&#xff0c; 就让执行处理的线程进行等待--- 这就是Guarded Suspension模式。 模式通过让线程等待来保证实例的安全性。 一个线程ClientThread会将请求 Request的…

MyBatis 源码分析(四):反射模块

前言 上一篇我们了解了Mybatis解析器模块&#xff0c;MyBatis 源码分析&#xff08;三&#xff09;&#xff1a;解析器模块 本篇我们来了解反射模块。相比 parsing 包来说&#xff0c;reflection 包的代码量大概是 2-3 倍。当然&#xff0c;不要慌&#xff0c;都是比较简单的代…

16、Kubernetes核心技术 - 节点选择器、亲和和反亲和

目录 一、概述 二、节点名称 - nodeName 二、节点选择器 - nodeSelector 三、节点亲和性和反亲和性 3.1、亲和性和反亲和性 3.2、节点硬亲和性 3.3、节点软亲和性 3.4、节点反亲和性 3.5、注意点 四、Pod亲和性和反亲和性 4.1、亲和性和反亲和性 4.2、Pod亲和性/反…

【Java技术专题】「攻破技术盲区」攻破Java技术盲点之unsafe类的使用指南(打破Java的安全管控— sun.misc.unsafe)

Java后门机制 — sun.misc.unsafe 打破Java的安全管控关于Unsafe的编程建议实例化Unsafe后门对象使用sun.misc.Unsafe创建实例单例模式处理实现浅克隆&#xff08;直接获取内存的方式&#xff09;直接使用copyMemory原理分析 密码安全使用Unsafe类—示例代码 运行时动态创建类超…

lombok注解 @Data使用在继承类上时出现警告解决

一、警告问题 1、Data注解 Data 包含了 ToString、EqualsAndHashCode、Getter / Setter和RequiredArgsConstructor的功能。 当使用 Data注解时&#xff0c;则有了 EqualsAndHashCode注解&#xff08;即EqualsAndHashCode(callSuperfalse)&#xff09;&#xff0c;那么就会在此…

Transformer-MM-Explainability

two modalities are separated by the [SEP] token&#xff0c;the numbers in each attention module represent the Eq. number. E h _h h​ is the mean&#xff0c; ∇ \nabla ∇A : ∂ y t ∂ A {∂y_t}\over∂A ∂A∂yt​​for y t y_t yt​ which is the model’s out…

新手小白必了解c语言之字符串函数

本篇介绍字符串库函数为 目录 引言 一&#xff1a;字符串函数的头文件为#include 二&#xff1a;求字符串长度函数 &#xff08;strlen&#xff09; 1.函数介绍 2.函数使用举例 3.模拟实现 三&#xff1a;字符串复制函数(strcpy) 1.函数介绍 2.函数使用举例 3.模…

Java BIO、NIO、AIO、Netty知识详解(值得珍藏)

1. 什么是IO Java中I/O是以流为基础进行数据的输入输出的&#xff0c;所有数据被串行化(所谓串行化就是数据要按顺序进行输入输出)写入输出流。简单来说就是java通过io流方式和外部设备进行交互。 在Java类库中&#xff0c;IO部分的内容是很庞大的&#xff0c;因为它涉及的领…

计算机环境安全

操作系统安全----比如windows,linux 安全标识--实体唯一性 windows---主体&#xff1a;账户&#xff0c;计算机&#xff0c;服务 安全标识符SID-Security Identifier 普通用户SID是1000&#xff0c;管理用SID是500 linux---主体&#xff1a;用户&#xff0c;用户组&#xf…

Next.js 第一次接触

因为需要整个漂亮的在线文档&#xff0c;所以接触了next.js&#xff0c;因为对前端js本身不够熟悉&#xff0c;别说对react.js 又不会&#xff0c;时间又不允许深入研究&#xff0c;所以&#xff0c;为了加一个导航菜单&#xff0c;极其痛苦。 有点小bug&#xff0c;不过不影响…