关于强化学习的一份介绍

在这篇文章中,我将介绍与强化学习有关的一些东西,具体包括相关概念、k-摇臂机、强化学习的种类等。

一、基本概念

所谓强化学习就是去学习:做什么才能使得数值化的收益信号最大化。学习者不会被告知应该采取什么动作,而是必须通过自己去发现哪些动作会产生最丰厚的收益。

所以,我们可以发现强化学习会带来一个独有的挑战,即试探与开发之间的折中平衡。也就是说,智能体(agent)必须开发已有的经验来获取收益,但于此同时也要进行试探,使得未来可以获得更好的动作选择空间。

强化学习也可以通过马尔科夫决策过程(MDP)来描述,即是说:机器在环境中,每下一次的行动仅与当前状态有关,但在之后选择并进行了某一项行动后,这个行动会反馈回刚才的决策中。

其中关于MDP,我们可以有这样的一个定义:

马尔科夫决策过程是一个五元组 S,A,P,R,γ其中:

S 表示状态集合;

A 表示动作集合;

P 是状态转移概率矩阵,表示在状态 s 采取动作 aa 后转移到状态 s′ 的概率;

R 是奖励函数,表示在状态 s 采取动作 a 后得到的即时奖励;

γ 是折扣因子,用于减少未来奖励的影响。

而MDP中的马尔可夫是指马尔可夫性质,即下一状态的概率分布只依赖于当前状态,而不依赖于历史状态序列。

我们知道强化学习中存在一个反馈机制,当智能体执行某个动作后,它会从环境中获得即时奖励,并且环境会转移到一个新的状态。这种反馈不是直接改变动作被选择的概率,而是通过更新智能体的策略来间接影响未来的动作选择。策略是一个从状态到动作的概率分布,智能体学习的策略将决定它在特定状态下选择特定动作的概率。

总节来说就是:智能体在执行动作后会收到奖励并转移到新状态,但这并不直接改变动作被选择的概率。相反,它是通过更新策略来影响未来的决策。

然后是强化学习中其他的一些概念:

智能体 (Agent): 是执行动作的学习实体。

环境 (Environment): 是智能体所处的世界,它根据智能体的动作给出响应。

状态 (State): 描述了环境的当前情况。(强化学习十分依赖状态这一概念,它既可以作为策略和价值函数的输入,又同时作为模型的输入与输出。)

动作 (Action): 智能体可以执行的行为。

奖励 (Reward): 环境对智能体采取的动作给予的反馈,用数值表示,智能体的目标就是最大化累计奖励。

在这里补充一下,一些优化方法,如遗传算法、模拟退火算法等方法它们都可以用于解决强化学习的问题,而不必显式运用价值函数。它们都采用大量静态策略,每个策略在扩展的较长时间与环境的一个独立实例进行交互。这些方法选择获取了最多收益的策略以及其变种来产生下一代的策略,然后继续循环更替,我们将之称为进化方法,因为我们不难发现它们的过程与生物的进化过程十分相似。不过这些进化方法忽视了强化学习问题中的一些有用结构:它们忽略了所有策略是状态到动作的函数这一事实,同时也没有注意个体在生命周期中都有经历过哪些状态,采取了哪些动作。所以,尽管进化与学习间有许多的共性,并且二者往往是相伴的,但我们还是会认为进化方法并不适用于强化学习问题。

二、K-摇臂机

K-摇臂机(Multi-Armed Bandit, MAB)问题是强化学习中的一个经典问题,也是一个简单的强化学习问题,它可以帮助我们理解在不确定情况下如何做出最佳决策。

2.1 定义

假设你在一家赌场里面对一台有 k 个摇臂的老虎机,每个摇臂都有不同的中奖概率。每次拉其中一个摇臂,你都会得到一个奖励(通常是金钱)。你的目标是在有限次尝试内最大化累计奖励。在这个问题中,“摇臂”代表不同的选项,“多臂”则指多个选择。

2.2 问题特点

探索与利用(Exploration vs. Exploitation):这是MAB问题的核心。你需要在探索(尝试不同的摇臂以了解它们的平均奖励)和利用(拉最有可能带来高奖励的摇臂)之间找到一个平衡点。

不确定性:在开始时,你对每个摇臂的期望奖励一无所知,必须通过试验来估计每个摇臂的真实期望值。

即时反馈:每次拉摇臂后,你会立即得到一个奖励,这是一个即时反馈问题。

2.3 ε-greedy 策略

我们可以使用价值的估计来进行动作的选择,这一类方法统称为“动作-价值”方法。那么,一种自然的方式就是通过计算实际收益的平均值来估计动作的价值:

Q_t(a)=\frac{\sum_{i=1}^{t-1} R_i*\mathbb{I}A_i=a}{\sum_{i=1}^{t-1} \mathbb{I}A_i=a}

所以,最简单的一种动作选择方法就是选择具有最高估计值的动作,即进行贪心选择。但这时会出现一个问题,就是这种贪心选择只顾眼前的收益,而可能会失去更大的收益,因为它不会选择那些虽然当前是低价值但在未来会去的极高价值的动作。那么,我们需要对其改进,我们让agent在大部分时间里是贪心的,但有时(以很小的概率ε)会去独立于动作-价值估计值而从所有的动作中等概率随机做出选择,而这种方法就是ε-贪心(greedy) 策略,所以可以总结出它的概念为:

ε-greedy 策略:大部分时间选择当前估计奖励最高的摇臂(利用),一小部分时间随机选择一个摇臂(探索)。

我们令Q(k)记录摇臂k的平均奖赏,若摇臂k被尝试了n次,得到的奖赏为v1,v2,v3……,vn,那么平均奖赏为:

Q(k)=\frac{1}{n}\sum_{i=1}^{n}v_{i}

此时,如果我们直接用该式来计算平均奖赏则需要记录n个平均奖赏值,所以为了更加高效,我们采用增量式计算,即每尝试一次后就立即更新Q(k),那么这个平均奖赏就应更新为:

Q_{n}(k)=\frac{1}{n}((n-1)*Q_{n-1}+v_{n})\\ =Q_{n-1}(k)+\frac{1}{n}(v_{n}-Q_{n-1}(k))

具体用一个代码举例:

import numpy as np
import random


class MultiArmedBandit:
    def __init__(self, num_arms, epsilon=0.1):
        self.num_arms = num_arms
        # 初始化每个摇臂的实际平均奖励
        self.true_rewards = np.random.normal(loc=0.0, scale=1.0, size=num_arms)
        # 初始化每个摇臂的经验平均奖励
        self.estimates = np.zeros(num_arms)
        # 初始化每个摇臂的尝试次数
        self.attempts = np.zeros(num_arms, dtype=int)
        # 探索与利用的参数
        self.epsilon = epsilon

    def pull_arm(self, arm):
        reward = np.random.normal(loc=self.true_rewards[arm], scale=1.0)
        return reward

    def update_estimate(self, arm, reward):
        # 使用增量式更新公式
        self.attempts[arm] += 1
        self.estimates[arm] += (reward - self.estimates[arm]) / self.attempts[arm]

    def choose_arm(self):
        if random.random() < self.epsilon:
            # 探索:随机选择一个摇臂
            return random.randint(0, self.num_arms - 1)
        else:
            # 利用:选择估计奖励最高的摇臂
            return np.argmax(self.estimates)


# 参数设置
num_arms = 10
epsilon = 0.1
num_trials = 1000

# 创建 K-摇臂机对象
bandit = MultiArmedBandit(num_arms, epsilon)

# 进行多次尝试
for trial in range(num_trials):
    chosen_arm = bandit.choose_arm()
    reward = bandit.pull_arm(chosen_arm)
    bandit.update_estimate(chosen_arm, reward)

# 打印结果
print("True Rewards:", bandit.true_rewards)
print("Estimated Rewards:", bandit.estimates)
print("Attempts per Arm:", bandit.attempts)

其运行结果为:

True Rewards: [ 0.05273471  1.40458756  0.32813439 -1.25692634 -0.67451511 -1.97502727
 -0.60326298 -0.22662436 -0.49297712  0.25822946]
Estimated Rewards: [ 0.54674629  1.45132379  0.18953721 -1.67282471  0.1013343  -2.52797267
 -1.07719265  0.19331869 -0.47083797  0.14306436]
Attempts per Arm: [ 12 922  11   8   3   6  10  13   5  10]
2.4 乐观初始值

目前,我们所讨论的方法都在一定程度上依赖于初始动作值Q_1(a)的选择,但这样一来,它们就是有偏的,在统计学的角度来看。不过,在实际中,这并非是一个问题,但它会称为用户需要调整的一个参数。那么,这个初始值该如何分配呢?可以考虑分配一个较高的初始值,以鼓励agent在早期多做尝试,以发现真正优秀的动作,而这样的一个思路就是乐观初始值的思路。

2.5 置信度上界

在之前的动作-价值的估计总会存在不确定性,所以试探的存在是必要的。所以在非贪心动作中,最好是根据动作的潜力来选择可能事实上优秀的动作,这就要考虑它们的估计值有多接近最大值,以及估计这些动作的不确定风性。一个有效的思路就是基于置信度上界的动作选择,即按照这个公式:

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

其中,平方根项是对 a 动作值估计的不确定性或方差的度量。因此,最大值的大小是动作 a 的可能真实值上界,而参数 c 决定了置信水平。

2.6 梯度摇臂机算法

现在,让我们针对每个动作 a 考虑学习一个数值化的偏好函数H_t(a)。偏好函数越大,动作就越频繁地被选择,但偏好函数的概念并非从“收益”上提出的。只有一个动作对另一个动作的相对偏好才是重要的,那么对于如下的这个softmax分布来说,若对于每一个动作的偏好函数都加上1000,则不会对动作概率产生任何影响,式子如下:

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

其中,\pi_t(a)表示动作 a 在时刻 t 被选择的概率。另外,所有偏好函数的初始值都是一样的,所以它们被选择的概率是一样的。

2.7 关联搜索

关联搜索任务也叫上下文相关的摇臂机,它既涉及采用学习去搜索最优的动作,又将这些动作与表现最优时的情景关联在一起。它介于k摇臂机问题与完整的强化学习问题之间。它与完整的强化学习问题相似的点是它需要学习一种策略,但它与k摇臂机相似是体现在每个动作只影响即时收益。所以,如果允许动作可以影响下一刻的情景与收益那么就是完整的学习问题。

三、分类

如果我们按照有无环境模型来对强化学习去分类的话,它可以被分为两类,一是有模型的强化学习,二是无模型的强化学习。具体地:

基于模型的强化学习(Model-Based RL):在这种设置下,智能体尝试构建一个环境的模型,然后利用这个模型来预测未来的状态和奖励,从而做出决策。这种方法的优点是可以减少与真实环境的交互次数,但缺点是模型构建可能会引入误差。

无模型的强化学习(Model-Free RL):智能体不试图构建环境模型,而是直接从与环境的交互中学习。这类方法包括基于价值的方法(如Q-Learning)、基于策略的方法(如Policy Gradients)和Actor-Critic方法。

如果我们按照学习目标去分类的话,那么强化学习可以分为策略优化与Q-Learning

策略优化(Policy Optimization):直接优化策略本身,使其在长期能够获得更高的累计奖励。

Q-Learning:学习动作-价值函数,即在给定状态下采取某个动作所能获得的预期未来奖励。

此外还有特殊类型的,比如:

逆向强化学习(Inverse Reinforcement Learning, IRL):从观察到的专家行为中学习奖励函数。

层级强化学习(Hierarchical Reinforcement Learning, HRL):将任务分解成多个子任务,每个子任务可以独立学习,从而简化整体学习过程。

部分可观测的强化学习(Partially Observable Markov Decision Processes, POMDPs):当环境不是完全可观测时,智能体需要处理不确定性的信息。

此上

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

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

相关文章

嵌入式硬件杂谈(二)-芯片输入接入0.1uf电容的本质(退耦电容)

引言&#xff1a;对于嵌入式硬件这个庞大的知识体系而言&#xff0c;太多离散的知识点很容易疏漏&#xff0c;因此对于这些容易忘记甚至不明白的知识点做成一个梳理&#xff0c;供大家参考以及学习&#xff0c;本文主要针对芯片输入接入0.1uf电容的本质的知识点的进行学习。 目…

近几年新笔记本重装系统方法及一些注意事项

新笔记本怎么重装系统&#xff1f; 近几年的新笔记本默认开启了raid on模式或vmd选项&#xff0c;安装过程中会遇到问题&#xff0c;新笔记本电脑重装自带的系统建议采用u盘方式安装&#xff0c;默认新笔记本有bitlocker加密机制&#xff0c;如果采用一键重装系统或硬盘方式安装…

GPIO相关的寄存器(重要)

目录 一、GPIO相关寄存器概述 二、整体介绍 三、详细介绍 1、端口配置低寄存器&#xff08;GPIOx_CRL&#xff09;&#xff08;xA...E&#xff09; 2、端口配置高寄存器&#xff08;GPIOx_CRH&#xff09;&#xff08;xA...E&#xff09; 3、端口输入数据寄存器&#xff…

华为Mate 70临近上市:代理IP与抢购攻略

随着科技的飞速发展&#xff0c;智能手机已经成为我们日常生活中不可或缺的一部分。而在众多智能手机品牌中&#xff0c;华为一直以其卓越的技术和创新力引领着行业的发展。近日&#xff0c;华为Mate 70系列手机的发布会正式定档在11月26日&#xff0c;这一消息引发了众多科技爱…

NVR录像机汇聚管理EasyNVR多品牌NVR管理工具视频汇聚技术在智慧安防监控中的应用与优势

随着信息技术的快速发展和数字化时代的到来&#xff0c;安防监控领域也在不断进行技术创新和突破。NVR管理平台EasyNVR作为视频汇聚技术的领先者&#xff0c;凭借其强大的视频处理、汇聚与融合能力&#xff0c;展现出了在安防监控领域巨大的应用潜力和价值。本文将详细介绍Easy…

MySQL:表设计

表的设计 从需求中获得类&#xff0c;类对应到数据库中的实体&#xff0c;实体在数据库中表现为一张一张的表&#xff0c;类中的属性就对应着表中的字段&#xff08;也就是表中的列&#xff09; 表设计的三大范式&#xff1a; 在数据库设计中&#xff0c;三大范式&#xff0…

单元测试时报错找不到@SpringBootConfiguration

找到问题出现原因&#xff1a; 错误表示 Spring Boot 在运行测试时无法找到 SpringBootConfiguration 注解。 通常&#xff0c;SpringBootTest注解用于加载 Spring Boot 应用上下文&#xff0c;但它需要找到一个带有SpringBootConfiguration&#xff08;或者Configuration&am…

Python爬虫下载新闻,Flask展现新闻(2)

上篇讲了用Python从新闻网站上下载新闻&#xff0c;本篇讲用Flask展现新闻。关于Flask安装网上好多教程&#xff0c;不赘述。下面主要讲 HTML-Flask-数据 的关系。 简洁版 如图&#xff0c;页面简单&#xff0c;主要显示新闻标题。 分页&#xff0c;使用最简单的分页技术&…

信捷PLC转以太网连接电脑方法

信捷XC/XD/XL等系列PLC如何上下载程序?可以选择用捷米特JM-ETH-XJ模块轻松搞定,并不需要编程&#xff0c;即插即用&#xff0c;具体看见以下介绍&#xff1a; 产品介绍 捷米特JM-ETH-XJ是专门为信捷PLC转以太网通讯面设计&#xff0c;可实现工厂设备信息化需求&#xff0c;对…

【头歌实训:拆分单链表】

头歌实训&#xff1a;拆分单链表 文章目录 任务描述相关知识单链表的基本概念单链表的头结点单链表的特点单链表插入一个结点单链表删除一个结点删除操作的语句如下&#xff1a; 创建单链表头插法建立单链表尾插法建立单链表 输出单链表 编程要求测试说明输入格式输出格式样例…

渑池县中药材产业党委莅临河南广宇企业管理集团有限公司参观交流

11月14日&#xff0c;渑池县人大副主任、工商联主席杨航率县中药材产业党委代表团一行13人&#xff0c;莅临河南广宇集团参观交流。河南广宇集团总经理王峰、副总经理王培等领导热情接待并陪同参观、座谈。 代表团一行首先参观了集团旗下郑州美信中医院&#xff08;庚贤堂中医药…

零基础Java第十九期:认识String(一)

目录 一、String的重要性 二、String的常用方法 2.1. 字符串构造 2.2. String对象的比较 2.3. 字符串查找 2.4. 转化 2.4. 字符串替换 2.5. 字符串拆分 2.6. 字符串截取 一、String的重要性 在C语言中已经涉及到字符串了&#xff0c;但是在C语言中要表示字符串只能…

基于Lora通讯加STM32空气质量检测WIFI通讯

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着环境污染问题的日益严重&#xff0c;空气质量的监测与管理已经…

JMeter中添加请求头

在JMeter中添加请求头的步骤如下&#xff1a; 1.打开HTTP信息头管理器 &#xff1a; 首先&#xff0c;你需要进入JMeter的HTTP请求组件。这可以通过在HTTP请求测试元素上右键点击&#xff0c;然后选择“添加 > 配置元件 > HTTP信息头管理器”来完成。 2.添加新的请求头…

面试_ABtest原理简介

01 什么是ABtest ABtest来源于假设检验&#xff0c;现有两个随机均匀的有样本组A、B&#xff0c;对其中一个组A做出某种改动&#xff0c;实验结束后分析两组用户行为数据&#xff0c;通过显著性检验&#xff0c;判断这个改动对于我们所关注的核心指标是否有显著的影响&#xf…

PCB+SMT线上报价系统+PCB生产ERP系统自动化拼板模块升级

PCB生产ERP系统的智能拼版技术&#xff0c;是基于PCB前端报价系统获取到的用户或市场人员已录入系统的板子尺寸及set参数等&#xff0c;按照最优原则或利用率最大化原则自动进行计算并输出拼版样式图和板材利用率&#xff0c;提高工程人员效率&#xff0c;减少板材的浪费。覆铜…

Kubernetes 10 问,测测你对 k8s 的理解程度

Kubernetes 10 问 假设集群有 2 个 node 节点&#xff0c;其中一个有 pod&#xff0c;另一个则没有&#xff0c;那么新的 pod 会被调度到哪个节点上&#xff1f; 应用程序通过容器的形式运行&#xff0c;如果 OOM&#xff08;Out-of-Memory&#xff09;了&#xff0c;是容器重…

《操作系统 - 清华大学》3 -3:连续内存分配:内存碎片与分区的动态分配

文章目录 0. 概述1. 内存碎片问题2. 动态分配3. 首次适配算法4. 最优适配算法5. 最差适配算法 0. 概述 内存分配是操作系统管理过程中很重要的环节&#xff0c;首先需要考虑的是一块连续区域分配的过程&#xff0c;这个过程中会有很多问题&#xff0c;首先比较关注的一个问题是…

CICD持续集成与持续交付

一 CICD是什么 CI/CD 是指持续集成&#xff08;Continuous Integration&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;或持续交付&#xff08;Continuous Delivery&#xff09; 1.1 持续集成&#xff08;Continuous Integration&#xff09; 持续集成…

[前端面试]javascript

js数据类型 简单数据类型 null undefined string number boolean bigint 任意精度的大整数 symbol 创建唯一且不变的值&#xff0c;常用来表示对象属性的唯一标识 复杂数据类型 object&#xff0c;数组&#xff0c;函数,正则,日期等 区别 存储区别 简单数据类型因为其大小固定…