强化学习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 plt

class BernoullBandit:
    #K表示拉杆的个数
    def __init__(self, K):
        self.K = K
        self.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],则代表获得奖励1
        if np.random.rand()<self.probs[k]:
            return 1
        else:
            return 0

np.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-01
 1.46755891e-01 9.23385948e-02 1.86260211e-01 3.45560727e-01
 3.96767474e-01 5.38816734e-01]
初始概率最大的下标:1,最大的概率:0.7203244934421581

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

class Solver:
    # 多臂老虎机基本框架
    def _init_(self,bandit):
        self.bandit=bandit
        self.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 NotImplementedError

    def run(self,numSteps):
        # numSteps为总运行次数
        for _ in range(numSteps):
            k=self.runOneStep()
            self.counts[k]+=1
            self.actions.append(k)
            self.updateRegret(k)

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

原子性、CAS操作

Java中的原子性操作 所谓原子性操作&#xff0c;是指执行一系列操作时&#xff0c;这些操作要么全部执行&#xff0c;要么全部不执行&#xff0c;不存在只执行其中一部分的情况。 在设计计数器时一般都先读取当前值&#xff0c;然后1,再更新。 这个过程是读—改—写的过程&a…

Java学习苦旅(二十二)——MapSet

本篇博客将详细讲解Map和Set。 文章目录 搜索概念模型 MapMap.Entry<K, V>Map的常用方法说明TreeMap和HashMap的区别 Set常用方法说明TreeSet和HashSet的区别 结尾 搜索 概念 Map和set是一种专门用来进行搜索的容器或者数据结构&#xff0c;其搜索的效率与其具体的实例…

记一个React组件入参不当导致页面卡死的问题

一、问题描述 1.1 触发现象 点击按钮后页面卡死 1.2 最小 Demo CodeSandBox&#xff1a;https://codesandbox.io/p/sandbox/react-hook-component-stuck-755wcyinscode&#xff1a;https://inscode.csdn.net/ import ./App.css; import React, { useState, useEffect } f…

GPT实战系列-简单聊聊LangChain

GPT实战系列-简单聊聊LangChain LLM大模型相关文章&#xff1a; GPT实战系列-ChatGLM3本地部署CUDA111080Ti显卡24G实战方案 GPT实战系列-Baichuan2本地化部署实战方案 GPT实战系列-大话LLM大模型训练 GPT实战系列-探究GPT等大模型的文本生成 GPT实战系列-Baichuan2等大模…

docker的基础知识

介绍docker 什么是docker Docker是一种开源的容器化平台&#xff0c;可以让开发人员将应用程序与其依赖的运行时环境一起打包到一个称为容器的独立单元中。这个容器可以在任何支持Docker的机器上运行&#xff0c;提供了一种快速和可移植的方式来部署应用程序。Docker的核心组件…

嵌入式(六)模数转换ADC | ADC 工作模式 寄存器 轮询和中断方式

文章目录 1 CC2530的ADC模块2 ADC工作模式3 ADC相关寄存器3.1数据寄存器3.2 控制寄存器 4 ADC初始化配置5 ADC使用方式5.1 轮询方式5.2 中断方式 模拟/数字转换 (Analog to Digital Converter&#xff0c;简称ADC) 是将输入的模拟信号转换为数字信号。 各种被测控的物理量&…

GeoServer发布地图服务(WMS、WFS)

文章目录 1. 概述2. 矢量数据源3. 栅格数据源 1. 概述 我们知道将GIS数据大致分成矢量数据和栅格数据&#xff08;地形和三维模型都是兼具矢量和栅格数据的特性&#xff09;。但是如果用来Web环境中&#xff0c;那么使用图片这个栅格形式的数据载体无疑是最为方便的&#xff0…

实战Flink Java api消费kafka实时数据落盘HDFS

文章目录 1 需求分析2 实验过程2.1 启动服务程序2.2 启动kafka生产 3 Java API 开发3.1 依赖3.2 代码部分 4 实验验证STEP1STEP2STEP3 5 时间窗口 1 需求分析 在Java api中&#xff0c;使用flink本地模式&#xff0c;消费kafka主题&#xff0c;并直接将数据存入hdfs中。 flin…

VQ-VAE(Neural Discrete Representation Learning)论文解读及实现

pytorch 实现git地址 论文地址&#xff1a;Neural Discrete Representation Learning 1 论文核心知识点 encoder 将图片通过encoder得到图片点表征 如输入shape [32,3,32,32] 通过encoder后输出 [32,64,8,8] (其中64位输出维度) 量化码本 先随机构建一个码本&#xff0c;维度…

三大主要排序方法总结:快速排序,选择排序,冒泡排序

本文介绍&#xff1a;三大排序方法&#xff08;快速排序&#xff0c;选择排序&#xff0c;冒泡排序&#xff09;&#xff08;后续期间可能会发布一篇关于qsort函数的文章&#xff09; 自我介绍&#xff1a;一个脑子不好的大一学生&#xff0c;c语言接触还没到半年&#xff0c;…

Spring面试篇

Spring面试篇 前置知识ApplicationContextInitializerApplicationListenerBeanFactoryBeanDefinitionBeanFactoryPostProcesssorAwareInitialzingBean&#xff0c;DisposableBeanBeanPostProcessor SpringBoot启动流程IOC容器初始化流程Bean生命周期Bean循环依赖解决 SpringMvc…

Java-IO流-15

文件操作 文件创建 package com.edu.file;import org.junit.jupiter.api.Test;import java.io.File; import java.io.IOException;public class Demo01 {public static void main(String[] args) {}Test//方式1public void create01(){String filePath "D:\\new1.txt&q…

阿里云服务器地域如何选择?

阿里云服务器地域和可用区怎么选择&#xff1f;地域是指云服务器所在物理数据中心的位置&#xff0c;地域选择就近选择&#xff0c;访客距离地域所在城市越近网络延迟越低&#xff0c;速度就越快&#xff1b;可用区是指同一个地域下&#xff0c;网络和电力相互独立的区域&#…

JSP+Servlet 重要知识点 (含面试题)

JSP是Servlet技术的扩展&#xff0c;本质上就是Servlet的简易方式。JSP编译后是“类servlet”。 这里提一句&#xff1a; jsp已经没有深入学习的必要了&#xff0c;除了维护老项目能用上一些&#xff0c;基本属于被淘汰的边缘了。Servlet还是有必要学习一下&#xff0c;比如sp…

Java:Stream流

文章目录 1、体验Stream流2、Stream流的常见生成方式3、Stream流中间操作方法4、Stream流终结操作方法5、Stream流的收集操作6、Stream流综合练习6.1 练习16.2 练习26.3 练习3 以下代码使用JDK11编写。 1、体验Stream流 &#xff08;1&#xff09;案例需求 按照下面的要求完成…

如何使用css隐藏掉滚动条

1.解决方案 在滚动元素上再包裹一个父元素&#xff0c;然后&#xff0c;该元素添加如下代码&#xff1a; &#xff08;注&#xff1a;PC端浏览器滚动条为8px&#xff09;使元素偏移原来位置8px&#xff0c;目的就是将滚动条区域移动到父元素边框外面&#xff0c;然后&#xff…

AI教我学编程之AI自刀

AI教我学编程系列学习第二课 — C#变量类型 上节回顾知识梳理C#基本变量类型 对话AI分歧产生本段总结 它说得对吗&#xff1f;我随即发问经典AI自刀他来了 总结 上节回顾 在上一节中我们发现&#xff0c;AI工具似乎还不能达到教学的水平&#xff0c;所以在本节中&#xff0c;…

ORA-600 adg无法查询故障

再续前缘 ORA-600[12406]故障解决-CSDN博客 当你点背的时候&#xff0c;看似一个简单的case&#xff0c;总是会迎来反转 上次改完参数没两天&#xff0c;又出现了报错不同&#xff0c;但是现象相似的情况 这次是 ORA-600 [kksgaGetNoAlloc_Int0] 这次出现故障的范围更大&a…

【Spring Boot 源码学习】SpringApplication 的定制化介绍

Spring Boot 源码学习系列 SpringApplication 的定制化介绍 一、引言二、往期内容三、主要内容1. 基础配置1.1 设置关闭 Banner1.2 设置自定义 Banner 打印对象1.3 设置应用程序主入口类1.4 设置用于创建应用程序上下文的工厂1.5 添加 BootstrapRegistry 初始化器实现1.6 设置或…

Python学习之路——函数进阶

目录 一、函数的多返回值 &#xff08;一&#xff09;如何操作 &#xff08;二&#xff09;代码示例 二、函数的多种传参方式 &#xff08;一&#xff09;位置参数 &#xff08;二&#xff09;关键字参数 &#xff08;三&#xff09;缺省参数 1、定义 2、作用 3、代码示…