强化学习(二)多臂老虎机 “Multi-armed Bandits”——2

news2024/12/23 17:21:40

1、增量算法估计动作价值

由之前的内容可知,某一个动作被选择 n − 1 n-1 n1 次后,该动作的价值估计值为
Q n ≐ R 1 + R 2 + ⋯ + R n − 1 n − 1 Q_n\doteq\dfrac{R_1+R_2+\cdots+R_{n-1}}{n-1} Qnn1R1+R2++Rn1

很明显,随着时间的推移,内存和计算的需求逐渐增长,为此设计增量算法,已知 Q n Q_n Qn 和第 n n n 次的奖励 R n R_n Rn,则这 n n n 次奖励的新平均值计算如下:
Q n + 1 = 1 n ∑ i = 1 n R i = 1 n ( R n + ∑ i = 1 n − 1 R i ) = 1 n ( R n + ( n − 1 ) 1 n − 1 ∑ i = 1 n − 1 R i ) = 1 n ( R n + ( n − 1 ) Q n ) = 1 n ( R n + n Q n − Q n ) = Q n + 1 n [ R n − Q n ] \begin{aligned} Q_{n+1}&=\dfrac{1}{n}\sum_{i=1}^nR_i\\[3ex] &=\dfrac{1}{n}\Big(R_n+\sum_{i=1}^{n-1}R_i\Big)\\[3ex] &=\dfrac{1}{n}\Big(R_n+(n-1)\dfrac{1}{n-1}\sum_{i=1}^{n-1}R_i\Big)\\[3ex] &=\dfrac{1}{n}\Big(R_n+(n-1)Q_n\Big)\\[3ex] &=\dfrac{1}{n}\Big(R_n+nQ_n-Q_n\Big)\\[3ex] &=Q_n+\dfrac{1}{n}\Big[R_n-Q_n\Big] \end{aligned} Qn+1=n1i=1nRi=n1(Rn+i=1n1Ri)=n1(Rn+(n1)n11i=1n1Ri)=n1(Rn+(n1)Qn)=n1(Rn+nQnQn)=Qn+n1[RnQn]

这种方法只需要 Q n Q_n Qn n n n 的内存,且每次只需要很小的计算量。这是一种后面会经常出现的形式,其一般表示为:
N e w E s t i m a t e ← O l d E s t i m a t e + S t e p S i z e [ T a r g e t − O l d E s t i m a t e ] NewEstimate\leftarrow OldEstimate+StepSize\Big[Target-OldEstimate\Big] NewEstimateOldEstimate+StepSize[TargetOldEstimate]

其中 [ T a r g e t − O l d E s t i m a t e ] \Big[Target-OldEstimate\Big] [TargetOldEstimate] 是估计的误差,它通过向“目标”靠近来降低。在增量算法中使用的步长参数( S t e p S i z e StepSize StepSize)随时间而变化,该方法用的是 1 n \dfrac{1}{n} n1,后续我们一般用 α \alpha α α t ( a ) \alpha_t(a) αt(a) 来表示步长参数。

下面展示使用增量算法计算样本平均值以及 ϵ − \epsilon- ϵ 贪心算法的伪代码
在这里插入图片描述

2、奖励随时间变化问题

目前未知,我们讨论的方法都是基于奖励不随时间变化的问题,而对于奖励随时间变化的情况下,我们一般侧重于近期奖励,即给予近期奖励比以往奖励更多的权重。最常用的方法之一就是用定步长参数
Q n + 1 ≐ Q n + α [ R n − Q n ] Q_{n+1}\doteq Q_n+\alpha\Big[R_n-Q_n\Big] Qn+1Qn+α[RnQn]

其中步长参数 α ∈ ( 0 , 1 ] \alpha\in(0,1] α(0,1] 为常数,这就导致 Q n + 1 Q_{n+1} Qn+1 是过去奖励与初始估计 Q 1 Q_1 Q1的加权平均值
Q n + 1 = Q n + α [ R n − Q n ] = α R n + ( 1 − α ) Q n = α R n + ( 1 − α ) [ α R n − 1 + ( 1 − α ) Q n − 1 ] = α R n + ( 1 − α ) α R n − 1 + ( 1 − α ) 2 Q n − 1 = ( 1 − α ) n Q 1 + ∑ i = 1 n α ( 1 − α ) n − i R i \begin{aligned} Q_{n+1}&=Q_n+\alpha\Big[R_n-Q_n\Big]\\[2ex] &=\alpha R_n + (1-\alpha)Q_n\\[2ex] &=\alpha R_n + (1-\alpha)[\alpha R_{n-1}+(1-\alpha)Q_{n-1}]\\[2ex] &=\alpha R_n + (1-\alpha)\alpha R_{n-1}+(1-\alpha)^2Q_{n-1}\\[2ex] &=(1-\alpha)^nQ_1 + \sum_{i=1}^n\alpha(1-\alpha)^{n-i}R_i \end{aligned} Qn+1=Qn+α[RnQn]=αRn+(1α)Qn=αRn+(1α)[αRn1+(1α)Qn1]=αRn+(1α)αRn1+(1α)2Qn1=(1α)nQ1+i=1nα(1α)niRi

为什么称其为加权平均,因为权重之和 ( 1 − α ) n + ∑ i = 1 n α ( 1 − α ) n − i = 1 (1-\alpha)^n+ \sum_{i=1}^n\alpha(1-\alpha)^{n-i} =1 (1α)n+i=1nα(1α)ni=1。另外可以看出, R i R_i Ri 的权重随着奖励数量的增加而减小,因此我们也称为指数近期加权平均(exponential recency-weighted average)。

接下来我们讨论一下变步长参数。设 α n ( a ) \alpha_n(a) αn(a) 为第 n n n 次选择动作 a a a 时,用于处理所获奖励的步长参数。如前所述, α n ( a ) = 1 n \alpha_n(a)=\dfrac{1}{n} αn(a)=n1,该方法由大数定律可以保证动作价值的估计值收敛于其真实值。当然并不是所有的变步长都保证收敛,可以保证以概率 1 收敛的必要条件是:
∑ n = 1 ∞ α n ( a ) = ∞ a n d ∑ n = 1 ∞ α n 2 ( a ) < ∞ \sum_{n=1}^\infty\alpha_n(a)=\infty\quad {and} \quad\sum_{n=1}^\infty\alpha^2_n(a)<\infty n=1αn(a)=andn=1αn2(a)<

这两个收敛条件可以理解为:第一个条件要保证步长足够大,从而克服任何的初始条件或随机波动;第二个条件保证最终步长变小到足以保证收敛。由此可以看出,对于 α n ( a ) = 1 n \alpha_n(a)=\dfrac{1}{n} αn(a)=n1 满足两个收敛条件,而对于 α n ( a ) = α \alpha_n(a)=\alpha αn(a)=α 不满足第二个收敛条件,这表明估计值一直不会完全收敛,而是继续变化以相应最近收到的奖励,这对于奖励随时间变化的情况是有利的,此外满足上述两个收敛条件的步长参数往往收敛速度很慢,因此实际中很少使用。

3、初始值

到目前为止,所有讨论的方法都在一定程度上依赖初始的动作价值估计 Q 1 ( a ) Q_1(a) Q1(a),也就是说这些方法都会因为 Q 1 ( a ) Q_1(a) Q1(a) 的取值而产生偏差。对于样本平均方法,一旦所有动作至少被选择一次,那么偏差就会消失,但是对于定步长参数的方法,偏差会随着时间的推移而减少但不会消失。这其实有好有坏,不利的一面是,初始值设定变成了一组必须用户进行挑选的参数;有利的一面是,这也提供了一种简单的方法,通过合理设置初始值从而加快收敛速度。

初始动作价值的设定也可以作为鼓励探索的简单方法,例如之前的多臂老虎机问题,其真实动作价值 q ∗ q_\ast q 服从期望为 0,方差为 1 的正态分布,若我们将初始动作价值估计设为 5,那么无论选择哪种动作,奖励都小于初始的动作价值估计,那么无论是完全的贪心方法还是 ϵ − \epsilon- ϵ 贪心方法,系统总是会进行相当数量的探索。

代码部分

import numpy as np
import matplotlib.pyplot as plt

# 初始值设定
step = 2000
alpha = 0.1

q_true = np.random.normal(0, 1, 10)  # 真实的动作价值
optimal_true = np.argmax(q_true)  # 最优动作
q_estimate1 = np.zeros(10)  # 估计的动作价值
q_estimate2 = np.full(10, 5.1)  # 估计的动作价值

epsilon1 = 0.9  # 贪心概率
epsilon2 = 0.9  # 贪心概率

optimal_count1 = 0
optimal_count2 = 0
optimal_probability1 = np.zeros(step)
optimal_probability2 = np.zeros(step)
action_space = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

for i in range(step):
    if (np.random.uniform() > epsilon1) or (q_estimate1.all() == 0):
        machine_name = np.random.choice(action_space)
        if machine_name == optimal_true:
            optimal_count1 += 1
        optimal_probability1[i] = 100 * optimal_count1 / (i+1)
        reward = np.random.normal(q_true[machine_name], 1, 1)
        q_estimate1[machine_name] = q_estimate1[machine_name] + alpha * (reward - q_estimate1[machine_name])
    else:
        machine_name = np.argmax(q_estimate1)
        if machine_name == optimal_true:
            optimal_count1 += 1
        optimal_probability1[i] = 100 * optimal_count1 / (i + 1)
        reward = np.random.normal(q_true[machine_name], 1, 1)
        q_estimate1[machine_name] = q_estimate1[machine_name] + alpha * (reward - q_estimate1[machine_name])

for i in range(step):
    if (np.random.uniform() > epsilon1) or (q_estimate2.all() == 5):
        machine_name = np.random.choice(action_space)
        if machine_name == optimal_true:
            optimal_count2 += 1
        optimal_probability2[i] = 100 * optimal_count2 / (i+1)
        reward = np.random.normal(q_true[machine_name], 1, 1)
        q_estimate2[machine_name] = q_estimate2[machine_name] + alpha * (reward - q_estimate2[machine_name])
    else:
        machine_name = np.argmax(q_estimate2)
        if machine_name == optimal_true:
            optimal_count2 += 1
        optimal_probability2[i] = 100 * optimal_count2 / (i + 1)
        reward = np.random.normal(q_true[machine_name], 1, 1)
        q_estimate2[machine_name] = q_estimate2[machine_name] + alpha * (reward - q_estimate2[machine_name])

plt.plot(optimal_probability1, label="Q1 = 0, e = 0.1")
plt.plot(optimal_probability2, label="Q1 = 5.1, e = 0.1")

plt.xlabel('Steps')
plt.ylabel('Optimal action')
plt.legend()
plt.show()

在这里插入图片描述

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

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

相关文章

【AIGC-文本/图片生成视频系列-10】SparseCtrl:在文本生成视频的扩散模型中添加稀疏控制

目录 一. 项目概述 二. 方法详解 三. 应用结果 四.个人思考 由于扩散模型生成空间的不确定性&#xff0c;仅仅通过文本生成视频时&#xff0c;会导致模糊的视频帧生成。 今天解析的SparseCtrl&#xff0c;是一种有效解决上述问题的方案&#xff0c;通过带有附加编码器的时…

为啥4位单片机那么LOW,还没被淘汰?

我以为8位的51单片机已经够低端了&#xff0c;没想到竟然还有4位单片机&#xff01;它到底有什么优势&#xff1f;用在什么领域&#xff1f; 在刚开始学习单片机的时候&#xff0c;我一直以为用越高端的芯片就越牛逼。 而现实&#xff0c;公司做产品和我们单片机学习者&#xf…

12V充4.2V单节锂电池充电管理芯片

12V充4.2V单节锂电池充电管理芯片&#xff1a;高效、简单、实用的充电解决方案 随着智能设备的普及&#xff0c;电池充电管理已经成为一个热门话题。本文将介绍一款12V到4.2V*UIC9527单节锂电池充电管理芯片&#xff0c;它具有简单、高效、实用等特点&#xff0c;广泛应用于各…

spring boot学习第八篇:kafka

目录 1、安装kafka 1.1确认jdk是否安装OK 1.2下载kafka 1.3安装kafka 1.4验证kafka 2、连接kafka 3、在java中操作kafka 1、安装kafka 1.1确认jdk是否安装Ok java -version 1.2下载kafka wget http://archive.apache.org/dist/zookeeper/zookeeper-3.4.14/zookeeper-…

RTSP协议播放不兼容TPLINK摄像头的处理办法

报错的内容是Number of element invalid in origin string. 位置如图 数据内容是 "- 14665860 31787219 1 IN IP4 172.16.108.70" 两个数字中间多了一个空格&#xff0c;导致判断数据不等于6 所以数据输入的时候把中间的空格去掉一个即可。 if (array.Length …

【K8S 】K8S配置资源管理

一、Secret&#xff1a; 1、概念 用来保存密码。token&#xff0c;敏感的K8S资源 这类数据可以直接存放在镜像中&#xff0c;但是放在Secret中可以更方便的控制&#xff0c;减少暴露的风险 Secret&#xff1a;保存加密的信息 2、Secret类型&#xff1a; docker-registry&am…

如何有效构建进攻性的网络安全防护策略

文章目录 前言一、进攻性安全策略的价值&#xff08;一&#xff09;进攻性安全和防御性安全的区别&#xff08;二&#xff09;进攻性安全带来一种新的测试和防御的方法&#xff08;三&#xff09;进攻性安全策略也比防御性安全策略更具前瞻性 二、进攻性安全策略的类型&#xf…

Transformer 位置编码

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

LeetCode刷题---随机链表的复制

解题思路&#xff1a; 使用哈希表来解决该问题 因为题中要求是深拷贝 首先对原链表遍历&#xff0c;将原链表每个节点和新链表每个节点形成对应关系&#xff0c;存入到哈希表中&#xff0c;key为原链表的节点&#xff0c;value为新链表的节点。 之后重置辅助链表指向原链表头节…

Jmemter

一、背景 有时候需要自己观察某些接口在一定并发下处理能力如果&#xff0c;那么Jmeter是一个很好的工具。 我所需要测试的接口是http接口&#xff0c;通过postman就可以发起请求&#xff0c;但postman单笔请求太慢&#xff0c;需要持续给接口一定压力&#xff0c;那么需要用J…

Docker登录MySQL,密码正确却提示密码错误

当我输入了正确的MySQL密码的时候确提示我密码错误&#xff1a; ERROR 1045 (28000): Access denied for user rootlocalhost (using password: YES) docker run --name mysql_master \ -e MYSQL_ROOT_PASSWORD123123 \ -v /root/mysql_master/data:/var/lib/mysql \ -v /root…

【电商API】DIY网络爬虫收集电商数据

DIY网络爬虫收集电商数据 网络爬虫是最常见和使用最广泛的数据收集方法。DIY网络爬虫确实需要一些编程知识&#xff0c;但整个过程比一开始看起来要简单得多。 当然&#xff0c;爬虫的有效性取决于许多因素&#xff0c;例如目标的难度、网站方的反爬虫措施等。如果将网络抓取用…

Spring IOC 源码分析

​ 什么是 IoC IoC &#xff08;Inversion of control &#xff09;控制反转。它是一种思想不是一个技术实现。描述的是&#xff1a;Java开发领域对象的创建以及管理的问题。 例如&#xff1a;现有类A依赖于类B。传统的开发方式 &#xff1a;往往是在类A中手动通过new关键字…

华为埋头造车,躺赚的却是黄牛?

文 | AUTO芯球 作者 | 雷歌 华为和赛力斯正在重庆哼哧a哼哧建厂造车&#xff0c;黄牛却在网上倒卖订单躺着赚钱。 前两天雷歌刚去试驾了问界M9&#xff0c;现场一车难求。 今天回来一看&#xff0c;好家伙&#xff0c;咸鱼上&#xff0c;黄牛们大量倒卖M9的大定订单&#x…

2024年机器人和人工智能将通过4种方式改变行业

文 | BFT机器人 前言&#xff1a; 2023年是人工智能界充满创造性和突破性的一年&#xff0c;包括生成式人工智能在内的人工智能 (AI) 技术的出现引起了全球的关注并占据了头条新闻。然而&#xff0c;生成式人工智能在企业中的应用仍处于早期阶段&#xff0c;如何最好地利用这项…

Markdown 时序图绘制详解

✍️作者简介&#xff1a;小北编程&#xff08;专注于HarmonyOS、Android、Java、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a; 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN &#x1f514;如果文章对您有一定的帮助请&#x1f…

消费增值模式:从五折购物到利润共享的商业逻辑

在当今的商业环境中&#xff0c;消费者和商家之间的关系已经不再是简单的买卖。如何让消费者在购物的同时&#xff0c;也能享受到更多的价值&#xff0c;成为了各大平台争相探索的焦点。近日&#xff0c;一种名为“消费增值模式”的创新逻辑正在引起广泛的关注。这一模式以产品…

iOS UI掉帧和卡顿优化解决方案记录

UI卡顿原理 在 VSync 信号到来后&#xff0c;系统图形服务会通过 CADisplayLink 等机制通知 App&#xff0c;App 主线程开始在 CPU 中计算显示内容&#xff0c;比如视图的创建、布局计算、图片解码、文本绘制等。随后 CPU 会将计算好的内容提交到 GPU 去&#xff0c;由 GPU 进行…

postman 简单测试(一)

1.postman官网 Postman API Platform 2.研究了一下postman 一些简单的功能&#xff0c;自己做个记录&#xff0c;同时希望能节约点测试时间。 2.1新建一个 collections 长期测的话&#xff0c;最好注册一个账号&#xff0c;开放更多功能。 2.2新建一个请求 后端要先搭建起来…

怎么将文件上传到linux系统

1.在虚拟机VMware上设置–选项-共享文件夹-启用 2.添加&#xff0c;依次选择【下一步】&#xff0c;浏览时&#xff0c;选择本机要上传的文件夹 3.勾上【启用此共享】&#xff0c;完成即可 4.在linux输入命令找到共享文件&#xff0c;共享的目录默认是/mnt/hgfs&#xff0…