强化学习笔记-01多臂老虎机问题

news2024/11/15 21:28:03

本文是博主对《Reinforcement Learning- An introduction》的阅读笔记,不涉及内容的翻译,主要为个人的理解和思考。

1. 多臂老虎机问题

 多臂老虎机问题是指存在K个老虎机,每个老虎机的获胜金额是一个未知的概率分布且相互独立,假设我们有N次参与机会,如何选择每次参与的老虎机才能使得累积获胜金额最大?

对于这个问题,我们首先可以知道,每次选择的老虎机应该是期望获胜金额最大的机器,即:

A_t = arg max_a\ Q(a),\ Q(a) = E[R|a]

A_t表示第t次选择的老虎机,Q(a)表示老虎机a的期望获胜金额,由于实际上我们只能根据历史数据进行估计,实际的形式为:

A_t = arg max_a\ Q_t(a),\ Q_t(a) = E[R_t|a]

所以对于多臂老虎机问题最本质的问题在于对Q(a)的预估,这同强化学习中的价值函数V(s)及Q(s,a)是类似的。Q(a)的计算相对是简单的,其表示的期望可以由历史获胜金额的均值来表示。

Q_t(a) = \frac{R_1(a)+R_2(a)+... +R_{t-1}(a)}{n-1} \\ = \frac{1}{n-1}(R_{t-1}(a) + (n-2)Q_{t-1}(a)) \\ = Q_{t-1}(a) + \frac{1}{n-1}(R_{t-1}(a) - Q_{t-1}(a))

上式中的R(a)表示每次选择老虎机a时的奖励,n表示总共选择a的次数,Q_{t-1}(a)表示前一次选择老虎机a时的奖励预估。上式代表了新Q(a)是通过旧Q(a)进行更新的。

但是由于参与次数是有限的,一方面我们需对每个老虎机a进行大量的参与,才能对Q(a)进行较精确估计,另一方面为了保证整体的收益,我们需要尽可能地参与Q(a)高的老虎机。前者类似于强化学习中的explore过程,后者类似于exploit过程,如何去平衡这两者是balancing exploration and exploitation是多臂老虎机问题的重要难点,下一节我们将考虑几种方法用于解决这个问题。

关于更新权重的问题:

在很多情况下,我们会发现Q(a)的更新式子是如下形式的:

Q_t(a) = Q_{t-1}(a) + \alpha_t(a) (R_{t-1}(a) - Q_{t-1}(a))

其通过α(a)代替了1/n,同时给出了如下条件下,Q(a)的更新是收敛的:

很多情况下我们会让 α(a)设为某个固定的值α,虽然当奖励分布Q是静态的时(不会随时间变化)并不能保证完全收敛,但是在实际上多数情况下奖励分布Q都是动态的,在这种情况下设为某个固定的值α往往也是可行的。

2. Balance Exploration and Exploitation的基本优化方法

A) ε-greedy

greedy(贪心算法)一般是指每次只选择当前Q最大的,即A_t = arg max_a\ Q_t(a),而ε-greedy算法是指每次有一定较小的概率ε来平均选择其他项,即

\begin{cases} & A_t = argmax_a\ Q_t(a),\text{ if } p= 1-\varepsilon \\ & \tilde{A_t}\neq A_t, \text{ if } p=\varepsilon \end{cases}

ε-greedy算法提供了最基础的形式来进行探索,通过ε值选择可以确定exploration和exploitation的平衡点。

B) UCB(Upper-Confidence-Bound)

UCB算法在原来的Q预估的基础上添加了一个上界的预估,这个上界当参与次数少的时候会大,而当参与足够多时,上界会收缩,这种方式保证了对未知的探索

A_t=argmax_a\ [Q_t(a) + c\sqrt{\frac{In(t)}{N_t(a)}}]

上式中的t表示当前总共参与的次数,N_t(a)表示当前a的总共参与次数,c表示上界预估项的权重,通过c值选择可以确定exploration和exploitation的平衡点。

UCB这种方式包含了对Q预估的不确定性的定量估计,但当Q分布是动态变化时(即分布会随时间发生变化),会失去了探索动力,另一方面,当前动作空间特别大时,N_t(a)的计算也很困难。

C) 合理初始值Optimistic Initial Values

这种方式是给Q预估的初始值设置为一个较大值(一般情况下要远大于估计的均值)Q_0(a)=+M,这种方式能保证在刚开始的情况下,各个机器都有均衡的概率被选择到,这种方式实现上比较简单好用,当各机器的奖励分布是静态时,其可以达到同ε-greedy算法类似的收益,甚至要好。但当机器的奖励分布是动态变化时(nonstationary problems),这种方式经过了长期迭代后,会失去了探索动力,UCB也有类似的问题。

D) 梯度方法Gradient algorithms

梯度方法根据动作的preference函数H(a)来选择参与的机器,其选择方式是通过一个概率决策函数π来确定的

\pi_t(a) = Pr\{A_t = a\} = \frac{e^{H_t(a)}}{\sum^K_{b=1} e^{H_t(b)}}

所有机器在t时刻的选择概率之和为1,即

\sum^k_{b=1} \pi_t(b) = 1

其中preference函数H(a)的计算式子为下式,其中R_t表示t时刻的收益,\bar{R_t}表示累积到t时刻的平均收益。

\begin{cases} & H_{t+1}(A_t) \doteq H_{t}(A_t) + \alpha (R_t - \bar{R_t})(1-\pi_t (A_t)) \text{ if } a=A_t \\ & H_{t+1}(a) \doteq H_{t}(a) - \alpha (R_t - \bar{R_t})\pi_t (a)\text{ if } a\neq A_t \\ & H_{0}(a) = 0 \end{cases}

这种更新方式为什么被称之为梯度方法呢?实际上preference函数H(a)是为了最大化总体收益即E[R],因此我们考虑H(a)的更新方向是使得E[R]的最大的梯度方向,即:

H_{t+1}(a)=H_{t}(a) + \alpha \frac{\partial E[R_t]}{\partial H_{t}(a)}

这里的E[R]表示是当前收益的期望,q(b)表示机器b的期望收益。

E[R_t]=\sum^K_{b=1}\pi_t(b)q_*(b)

接下来,我们计算梯度:

\frac{\partial E[R_t]}{\partial H_{t}(a)}=\frac{\partial }{\partial H_{t}(a)}[\sum^K_{b=1}\pi_t(b)q_*(b)]\\ =\sum^K_{b=1}(q_*(b)-X_t)\frac{\partial \pi_t(b)}{\partial H_{t}(a)}\\ = \sum^K_{b=1}(q_*(b)-X_t)\frac{\partial }{\partial H_{t}(a)}[\frac{e^{H_t(b)}}{\sum^K_{c=1}e^{H_t(c)} }]\\ = \sum^K_{b=1}(q_*(b)-X_t)[\frac{\frac{\partial H_t(b)}{\partial H_{t}(a)}e^{H_t(b)}(\sum^K_{c=1}e^{H_t(c)})-e^{H_t(b)}e^{H_t(a)}} {(\sum^K_{c=1}e^{H_t(c)})^2 }]\\ = \sum^K_{b=1}(q_*(b)-X_t)[1|_{a=b}\pi_t(b)-\pi_t(b)\pi_t(a)]\\ =\sum^K_{b=1}(q_*(b)-X_t)(1|_{a=b}-\pi_t(a))\pi_t(b)\\ =(q_*(b)-X_t)(1|_{a=b}-\pi_t(a))

上式中的X表示一个同所选a不相关的变量,由于下式。

\sum^K_{b=1}\frac{\partial \pi_t(b)}{\partial H_{t}(a)}=0

为什么要选择引入这个变量X?首先我们考虑机器b的期望收益q(b)实际上是很难预估的,所以我们实际用R即时收益来代替(称之为随机梯度法),如果设置X=0,仍是会收敛的,但是由于R本身带有一定的随机性,为了避免更新步伐太大,所以一般设置X_t=\bar{R_t},表示过去平均的总体收益。

E) 贝叶斯方法Bayesian methods

贝叶斯方法的逻辑是假设Q(a)是某种先验分布(如高斯分布,beta分布等),然后随着参与,不断更新Q(a)参数估计。在动作选择时,采用的是类似于后验采样(称之为posterior sampling or Thompson sampling)来选择动作。其原理是每一轮根据不同动作的Q(a)分布采样生成各自Q,然后再选择Q最高的a作为本轮的动作,这种方式兼顾exploration和exploitation。

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

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

相关文章

一文解决Opencv四大经典算子——sobel算子、scharr算子、laplacian算子、canny算子

Opencv四大算子 Sobel算子Scharr算子laplacian算子canny算子总结边缘是像素值发生跃迁的位置,是图像的显著特征之一,在图像特征提取,对象检测,模式识别等方面都有重要的作用! Sobel算子 sobel算子对图像求一阶导数。一阶导数越大,说明像素在该方向的变化越大,边缘信号越…

python链接池和pymysql批量入库——从0实现大规模异步爬虫框架项目4

我将这个链接池和批量入库封装了一个工具类上传了pypi,可以直接import使用 使用也较为简单,导入PooledDBhelper的DBhelper,调用DBhelper.PooledDBhelper()方法传入数据库链接信息创建一个链接池即可 pip install PooledDBhelper1.0.0 -----------------…

虚析构函数的作用

类的析构函数是为了释放内存资源,析构函数不被调用的话就会造成内存泄漏。虚析构函数定义为虚析构函数是为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。但并不是要把所有类的析构函数都写成虚函数。只有当一个类被用来作为基…

信息论复习—卷积码

目录 卷积码的基本概念: 卷积码与分组码的不同特点: 卷积码的构造与表示方法: 卷积码编码器的结构: 卷积码(3,1,3): 卷积码的卷积关系: 卷积码的生成矩阵: 卷积码的多项式: 系统码结构的卷积码: 卷积码的监督矩阵: 卷积…

Pipenv使用指南:轻量级虚拟环境管理工具详解

前言 终于能够挤出一点时间来总结最近学到的一些技术知识点了,博主这两周被居家隔离-集中隔离-居家隔离来回折腾,现在终于是得到解放能够空出的时间来写写博客了,但是项目又催的紧,写博文的时间还是有限,这周我会尽量…

正则语言的性质

正则语言的性质 一、正则语言的性质 1.正则语言的泵引理 设LLL是正则语言,则存在与LLL相关的常数nnn满足:对于任何LLL中的串www,如果∣w∣≥n|w|\geq n∣w∣≥n,则我们就能把www打断为三个串wxyzwxyzwxyz使得: y̸ϵ…

2011年专业408

文章目录0 结果1 题目2 思路2.1 思路1(暴力解:排序)2.2 思路2(较优解:归并合并数组)2.3 思路3(较优解:数组指针后移)2.4 思路4(最优解:两个数组的…

ARM BTI指令介绍

目录 一、JOP 二、BTI 三、启用BTI 四、BTI是怎么实现的 一、JOP JOP(Jump-oriented programming)类似于ROP(Return-Oriented Programming)。在 ROP 攻击中,会扫描出useful gadgets(易被攻击的一段代码…

【数据结构】顺序队列的原理及实现

1.什么是队列 队列是一种比较特殊的线性表,特殊就在于它只允许在表的前端来进行删除,在表的后端来进行插入,队列它是一种操作受限制的线性表。插入的一端称为队尾,删除的一端称为队头,队列里没有元素就称它为空队列。…

快速使用代码编辑工具vim+ctags+cscope快捷使用itop3568开发板

当以上配置全部完成后,每当拿到新的工程代码,进入相关代码目录,利用 vim ./命令打 开当前目录, 然后 crtl 生成插件所需文件,最后使用命令:qa!退出 vim。此步只需进行一 次。 在此目录中打开任意代码文件或任意子目录…

jdk8新特性-日期时间

1、介绍 日期时间类在Java开发中是必不可少的,前后端如何传递时间参数、数据库的时间在Java中对应什么类型、Java中时间转换的各种方式有哪些? 2、Date类 Date类是JDK1.0时期推出来的第一代时间类,位于java.util包下,是最常用的…

unctf easy_serialize反序列化字符逃逸

&#xfeff;ctf题目平台&#xff1a;UNCTF - HACKING 4 FUN。web题难度适中 easy_serialize 题目源码&#xff1a; <?php include "function.php"; $action $_POST[action]; $name $_POST[name]; $pass $_POST[pass]; $email $_POST[email]; ​ function …

南京小米java面经(一面)

目录1.java支持多继承吗2.线程的生命周期3.线程和进程的区别4.单例模式有几种5.写一下双重锁的单例6.jvm有哪些区域7.jvm哪些区域是线程共享的&#xff0c;哪些是线程私有的8.gc中判断对象可回收的方式有哪些9.gc垃圾回收算法有哪些10.哪些对象可以作为gc root11.gc中的引用计数…

软件设计师教程(四)程序设计语言基础知识

软件设计师教程 软件设计师教程&#xff08;一&#xff09;计算机系统知识-计算机系统基础知识 软件设计师教程&#xff08;二&#xff09;计算机系统知识-计算机体系结构 软件设计师教程&#xff08;三&#xff09;计算机系统知识-计算机体系结构 程序设计语言知识软件设计师…

工资管理系统

一、系统简介 工资管理涉及企业管理的多个方面&#xff0c;如员工基本信息、员工在职离岗、员工考勤、员工加班等等。根据这些信息&#xff0c;在每个月的固定时间&#xff0c;生成全体员工的月工资&#xff0c;部门月工资以及全厂月工资。对于月工资&#xff0c;能够实现按照员…

机器学习【西瓜书/南瓜书】--- 第五章 神经网络

1.神经元模型 1.1 M-P神经元模型 输出函数&#xff1a; 其中θ为阈值&#xff0c; ω i为第i个神经元的连接权重&#xff0c; xi为来自第i个神经元的输入。 1.2 激活函数 阶跃函数&#xff1a; 理论上我们使用阶跃函数。将输入值映射为输出值为0/1&#xff0c;显然1为神经元…

Windows下编译安装OpenCASCADE

OpenCASCADE (以下简称OCC)是一套开源的几何建模系统&#xff0c;提供了曲面、实体等建模方式&#xff0c;已经广泛应用在CAD、CAE、CAM等软件开发。 OpenCASCADE官网已经提供OpenCASCADE的编译安装方法&#xff0c;本文结合实操过程&#xff0c;简述其过程。 零、环境 操作系…

Databend v0.9.0 版本发布

各位社区小伙伴们&#xff0c;历经数月开发&#xff0c;Databend 于 2023 年 1 月 13 日迎来了 v0.9.0 版本的正式发布&#xff01; 这次新版本是 Databend 迈向 1.0 版本的最后一个大版本&#xff0c;也是迄今为止我们对核心代码重构幅度最大的一个版本&#xff01;相较于 v0…

C++ string容器,cha*

目录 1.string基本概念 2.string构造函数,char* 3.string赋值操作 4.string字符串拼接,append 5.string查找和替换,find,replace 6.string字符串比较,compare 7.string字符存取[].at&#xff0c;取&#xff0c;修改单个字符&#xff0c;size返回字符串长度 8.string插入和…

数学建模学习笔记(13)分类模型

分类模型分类问题的基本概念逻辑斯蒂回归&#xff08;Logistic&#xff09;Fisher线性判别分析多分类问题的SPSS求解分类问题的基本概念 分类问题概述&#xff1a;对于给定的一个对象&#xff0c;根据其特征将其划分到多个已给定的类别中的一个。 二分类和多分类&#xff1a;…