强化学习入门笔记(Reinforcement Learning,RL) 强推!
由于本人的近期研究方向涉及到强化学习,本科时已经学习过了,但是感觉还是有些概念和算法没有学懂学透,所以想重新系统性的学习一下,记录了整个学习过程,而且对当时没有理解不是特别深刻的内容有了一些更加深刻的理解,所以希望把学习的过程记录下来,也帮助其他的初学者能够快速入门强化学习。并且为了加深理解,会涉及一些公式。
(ps:第二遍学习了,知识真的越学越新,如果第一遍没有读懂,可能过一遍,等应用学习一段时间,可以返回来再看,真的有不同的理解),希望这份笔记能给你带来帮助。) 记录一下时间:
第一次撰写时间:20241111
强化学习(Reinforcement Learning)
一.总体概念
首先从大致上理解一下强化学习。传统的机器学习可以大致分为:有监督学习、无监督学习、强化学习。
- 有监督学习 是从外部监督者提供的带标签的训练集中学习。
- 非监督学习 是从为标注的数据集中找到隐含结构的学习过程,例如K-means算法
- 强化学习更偏重于智能体与环境之间的交互。一个智能体(agent)在一个特定的环境(environment)中最大化它所能获得的奖励。通过感知所处的环境的状态(state)作出行动(action),与环境交互之后进行状态转移并得到对应的奖赏(reward),最终得到累积回报(return)。而这的方式被叫做强化学习或RL(Reinforcement Learning)。而RL学习的范式非常类似于人类学习知识的过程,也正因如此,RL被视为实现AGI重要途径。
  
二.强化学习特点:
- 试错学习:强化学习一般没有直接的指导信息,Agent 要以不断与 Environment 进行交互,通过试错的方式来获得最佳策略(Policy)。
- 延迟回报:强化学习的指导信息很少,而且往往是在事后(最后一个状态(State))才给出的。比如 围棋中只有到了最后才能知道胜负。
三.相关术语
根据上述对于强化学习的描述,可以注意到对应的术语包括environment, state,action,reward,return,以下将详细介绍对应的概念。
- 环境(environment)是一个外部系统,智能体处于这个系统中,能够感知到这个系统并且能够基于感知到的状态作出一定的动作,并且环境根据作出的动作给智能体一个奖赏。
- 状态(state):状态是对环境的当前状态的完整描述,不会隐藏环境的信息。所有的状态构成了状态空间(state space)
- 行动(action):智能体处于当前环境状态下作出一个动作。所有可以执行的动作构成了动作空间(action space),其中包括离散动作空间(例如:前后左右四个动作)和连续的状态空间(例如:智能体的旋转角度,360度都可以)。
- 奖励(reward):是由环境所给的一个反馈信号,该信号表明了智能体在某一步采取动作的表现,如果表现的很好,对应的reward大一点,否则就小一点。
- 回报(return):智能体从当前状态一直到最终状态所获的累积奖励
(这里注意区别return和reward)
四.强化学习问题的基本设定:
根据上述的描述,已经对强化学习有了基本的概念,接下来让我们用形式化的数学语言来更好的表示强化学习问题:
 强化学习可以用一个四元组表示,如下:
<A, S, R, P>
Action space : A 
State space : S
Reward: R : S × A × S → R
Transition : P :S × A → S 
说明:<A,S,R,P>是强化学习的形式化表达。其中A代表智能体的动作空间(包括离散的状态空间和连续的状态空间);S表示状态空间;R是奖赏,可以看出来是一个函数映射的形式,表示智能体处在状态s,执行了某一个动作a,与环境交互后转换到了s‘,得到的奖赏(Reward)为r。所以, ( s , a , s ′ ) → r (s,a,s')→r (s,a,s′)→r;P表示状态转移函数,下一个状态完完全取决于环境。
 根据上述的说明,此处也引出几个重要的概念,并详细介绍,对后续理解算法具有重要作用:
- 策略(Policy)
 策略是智能体用于决定下一步之行什么动作的规则。具体是指Agent在状态s时,所要作出的action的选择,一般定义为 π \pi π,是强化学习中的核心问题。可以视为智能体在感知到环境s后动作a到一个映射。这个策略可以是确定性的,即在当前状态下只会选择一个确定的动作( a = π ( s ) a= \pi(s) a=π(s),其中a为智能体处于状态s下用策略 π \pi π所选择的动作a);也可以是随机的(不确定的),这个时候 π \pi π不再是一个确定的动作,而是当前所能选择的动作的一个概率分布(例如当前状态下智能体可以执行4个上下左右动作,在当前的策略下,对应的概率为上:0.6;下:0.1;左:0.1;右:0.2,并且概率总和为1),以上的确定策略和随机策略可以用数学表示为:
 s t o c h a s t i c P o l i c y : ∑ π ( a ∣ s ) = 1 stochasticPolicy: \sum{\pi(a|s)}=1 stochasticPolicy:∑π(a∣s)=1 d e t e r m i n i s t i c P o l i c y : π ( s ) : S → A deterministicPolicy: \pi(s):S→A deterministicPolicy:π(s):S→A
- 状态转移(State Transition)
 智能体在环境中作出某种交互(动作)之后,将会转移到下一个状态,这种状态的转移取决于环境本身,而且这种转移也可以分为随机性和确定性转移。确定性转移表示根据当前状态和作出的动作只能转移到唯一的状态。而随机性转移则是由于环境的不确定性,导致可能下一个状态的转移是概率性的,可以用状态概率密度函数表示:
 p ( s ′ ∣ s , a ) = P ( S ′ = s ′ ∣ S = s , A = a ) p(s'|s,a)=P(S'=s'|S=s,A=a) p(s′∣s,a)=P(S′=s′∣S=s,A=a)
 大多数情况下,对于智能体来说,环境是未知的,并且环境也可能发生变化,而上述的函数描述了在当前环境和行动下,衡量系统状态向某一个状态转移的概率是多少。
- 回报 (Return)
  
 回报也可以被称为累积奖赏,cumulated future reward,一般表示为U,定义为
 U t = R t + R t + 1 + . . . . R T U_t = R_t+R_{t+1}+....R_T Ut=Rt+Rt+1+....RT其中 R t R_t Rt代表每一步动作的奖赏reward,而对于智能体来说,就是最大化Return,一定是累积奖赏。
 未来的奖励不如现在等值的奖励那么好(比如一年后给100块不如现在就给),所以 R t + 1 R_{t+1} Rt+1的权重要比 R t R_{t} Rt的小。
 在实际表示中,加入了折扣回报率用来表示折扣回报,如下:
 U t = R t + γ R t + 1 + γ 2 R t + 2 + . . . U_t = R_t+\gamma R_{t+1}+\gamma ^2R_{t+2}+... Ut=Rt+γRt+1+γ2Rt+2+...其中 γ \gamma γ表示折扣率。
4.价值函数(Value-based function)
 举例来说,在象棋游戏中,定义赢得游戏得1分,其他动作得0分,状态是棋盘上棋子的位置。仅从1分和0分这两个数值并不能知道智能体在游戏过程中到底下得怎么样。例如:象棋中在某一步中吃了对方的车,这步的reward会很大,但是由于这一步导致被将军,所以对于最终的目标来说,这一步也并不好。
 为了对在整个游戏过程中对状态(当前的棋面对最后来说怎么样)进行评估,从而引入价值函数使用期望对未来的收益进行预测,一方面不必等待未来的收益实际发生就可以获知当前状态的好坏,另一方面通过期望汇总了未来各种可能的收益情况。使用价值函数可以很方便地评价不同策略的好坏。
注意价值函数和奖赏的区别
为了更加严谨,用数学表述:
 Reward 定义的是评判一次交互中的立即的(immediate sense)回报好坏。而Value function则定义的是从长期看action平均回报的好坏。一个状态s的value是其长期期望Reward的高低。定义 V π ( s ) V_\pi(s) Vπ(s)是策略状态s长期期望收益,Q_\pi(s,a)是策略在状态s下,采取动作a的长期期望收益。
 定义 G t G_t Gt为长期回报期望(Return)
  G t = ∑ n = 0 N γ n r t + n G_t = \sum_{n=0}^N \gamma^nr_{t+n} Gt=n=0∑Nγnrt+n状态s的价值函数V为:
  V π ( s ) = E π [ G t ∣ S t = s ] V_\pi(s) = E_\pi[G_t|S_t=s] Vπ(s)=Eπ[Gt∣St=s]
 在状态s下采取动作a的动作价值函数Q为:
  Q π ( s , a ) = E π [ G t ∣ S t = s , A t = a ] Q_\pi(s,a) = E_\pi[G_t|S_t=s,A_t=a] Qπ(s,a)=Eπ[Gt∣St=s,At=a]
 在强化学习中,价值函数和Q函数之间存在一定的关系,可以通过转换公式相互表达。主要的转换方式如下:
 从 Q 函数转换到状态价值函数
- 对于确定性策略
 如果我们选取的是一个贪婪策略,即在状态
 𝑠中选择能最大化 Q 值的动作,则价值函数可以表示为: V s = m a x a Q ( s , a ) V_s=max_aQ(s,a) Vs=maxaQ(s,a)该公式适用于寻找最优策略时(即在状态 s 中采取最佳动作的情况下)。
- 对于随机策略
 如果策略 π(a∣s) 是随机的,即每个动作 𝑎 在状态 s 的概率不相同,那么价值函数可以表示为 Q 函数的期望: V s = ∑ i π ( a i ∣ s ) ∗ Q ( s , a i ) V_s=\sum_i\pi(a_i|s)*Q(s,a_i) Vs=i∑π(ai∣s)∗Q(s,ai)这里,价值函数 𝑉(𝑠)是在策略 𝜋下,对所有动作加权的 Q 值之和。这个转换公式表示的是在随机策略下,期望的长期回报。
 从价值函数转换到 Q 函数
 假设我们知道执行动作 𝑎会从状态 𝑠 转移到下一个状态 𝑠′,那么 Q 函数可以表示为: Q ( s , a ) = E [ r + γ V ( s ′ ) ∣ s , a ] Q(s,a) =E[ r+\gamma V(s')|s,a] Q(s,a)=E[r+γV(s′)∣s,a]在此情况下,Q 函数表示在状态 𝑠下采取动作 𝑎后获得的即时奖励 𝑟加上未来回报的折现值。而这个就是非常有名的Bellman等式
五.算法分类
按照环境是否已知划分:免模型学习(Model-Free) vs 有模型学习(Model-Based)
- Model-free就是不去学习和理解环境,环境给出什么信息就是什么信息,常见的方法有policy optimization和Q-learning。
- Model-Based是去学习和理解环境,学会用一个模型来模拟环境,通过模拟的环境来得到反馈。Model-Based相当于比Model-Free多了模拟环境这个环节,通过模拟环境预判接下来会发生的所有情况,然后选择最佳的情况。
一般情况下,环境都是不可知的,无法对环境进行建模,只能被动接受环境的反馈
按照学习方式划分:在线策略(On-Policy) vs 离线策略(Off-Policy)
- On-Policy是指agent必须本人在场, 并且一定是本人边玩边学习。典型的算法为Sarsa。
- Off-Policy是指agent可以选择自己玩, 也可以选择看着别人玩, 通过看别人玩来学习别人的行为准则,离线学习同样是从过往的经验中学习, 但是这些过往的经历没必要是自己的经历,任何人的经历都能被学习,也没有必要是边玩边学习,玩和学习的时间可以不同步。典型的方法是Q-learning,以及Deep-Q-Network。
按照学习目标划分:基于策略(Policy-Based)和基于价值(Value-Based)。
- Policy-Based的方法直接输出下一步动作的概率,根据概率来选取动作。但不一定概率最高就会选择该动作,还是会从整体进行考虑。适用于非连续和连续的动作。常见的方法有Policy gradients。
- Value-Based的方法输出的是动作的价值,选择价值最高的动作。适用于非连续的动作。常见的方法有Q-learning、Deep Q Network和Sarsa。
 更为厉害的方法是二者的结合:Actor-Critic,Actor根据概率做出动作,Critic根据动作给出价值,从而加速学习过程,常见的有A2C,A3C,DDPG等。
六.具体算法
- Q-learning算法(基于价值的方法)
- 算法思路:Q-learning算法是一个基于价值函数(value-based)的方法,不直接输出每一个状态下对应的动作的概率,而是通过计算每一步下采取某一个动作的价值,从而动作价值最大(累计收益最大)的那个动作,从而得到最佳策略。
- 算法流程:
 后续更新
-  Deep Q Network(DQN)(基于价值的方法) 
 后续更新
-  Policy Gradient(基于策略的方法) 
 后续更新
-  Actor Critic(基于价值与基于策略二者结合) 
 后续更新
相关文章:
 
强化学习入门笔记(Reinforcement Learning,RL) 强推!
由于本人的近期研究方向涉及到强化学习,本科时已经学习过了,但是感觉还是有些概念和算法没有学懂学透,所以想重新系统性的学习一下,记录了整个学习过程,而且对当时没有理解不是特别深刻的内容有了一些更加深刻的理解&a…...
C++ QT 工具日志异步分批保存
C QT 工具软件一般可以如此实现日志保存: #define THREAD_ID (reinterpret_cast<qulonglong>(QThread::currentThreadId()) & 0x0FFF) #define TIME (QDateTime::currentDateTime().toString("yyyy_MM_dd_hh_mm_ss_zzz"))#define LOGD(msg) qD…...
win32com库基于wps对Word文档的基础操作
win32com库基于wps对Word文档的基础操作 文章目录 win32com库基于wps对Word文档的基础操作新建/打开文档段落操作(Paragraph)字体设置(Font)图表操作(Shape) 参考链接: WAS API手册 新建/打开文档 import win32com import win32com.client as win32 # 启动WPS进程 word_obj …...
Kubernetes 网络之深度探索:网络模型与 CNI 插件
Kubernetes 网络之深度探索:网络模型与 CNI 插件 在 Kubernetes 中,网络是一个至关重要的组成部分。它不仅决定了容器之间如何通信,还影响着整个集群的可扩展性和稳定性。本节课将深入剖析 Kubernetes 的网络模型以及 CNI(Container Network Interface)网络插件。 一、K…...
Go 模块管理教程:go.mod 与依赖版本控制
Go 模块管理教程:go.mod 与依赖版本控制 Go 从版本 1.11 开始引入了 Go Modules,通过 go.mod 文件来管理项目的依赖关系和版本。Go 模块系统大大简化了 Go 项目的依赖管理,解决了之前 GOPATH 模式的许多问题。本教程将介绍如何使用 Go 模块管…...
大数据 ETL + Flume 数据清洗 — 详细教程及实例(附常见问题及解决方案)
大数据 ETL Flume 数据清洗 — 详细教程及实例 1. ETL 和 Flume 概述1.1 ETL(Extract, Transform, Load)1.2 Flume 概述 2. Flume 环境搭建2.1 下载并安装 Flume2.2 启动 Flume 3. Flume 配置和常见 Source、Sink、Channel3.1 Flume Source3.2 Flume Si…...
鸿蒙next版开发:订阅应用事件(ArkTS)
在HarmonyOS 5.0中,ArkTS提供了强大的应用事件订阅机制,允许开发者订阅和处理系统或应用级别的事件。这一功能对于监控应用行为、优化用户体验和进行性能分析至关重要。本文将详细介绍如何在ArkTS中订阅应用事件,并提供示例代码进行说明。 应…...
F litter 开发之flutter_local_notifications
flutter_local_notifications 消息通知 flutter_local_notifications地址 flutter_local_notifications: ^18.0.1class NotificationHelper {//工厂模式调用该类时,默认调用此方法,将实例对象返回出去static NotificationHelper? _instance null;sta…...
springboot参数校验
springboot 参数校验 Validated 以及 Valid - 唏嘘- - 博客园 SpringBoot参数校验Validated、Valid_springboot validate-CSDN博客...
 
Spring生态学习路径与源码深度探讨
引言 Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学…...
 
C++:set详解
文章目录 前言一、set概念介绍二、set的使用1. 插入删除相关2. 查找相关1)find2)count3)lower_bound与upper_bound4)equal_range 三、set的值是不能修改的原理四、基于哈希表的set总结 前言 根据应用场景的不同,STL总…...
 
(一)- DRM架构
一,DRM简介 linux内核中包含两类图形显示设备驱动框架: FB设备:Framebuffer图形显示框架; DRM:直接渲染管理器(Direct Rendering Manager),是linux目前主流的图形显示框架; 1&am…...
 
Docker了解
Docker是一种容器化技术,它可以将应用程序和其依赖项打包到一个独立的、可移植的容器中,以便在不同的环境中运行。Docker基于Linux操作系统的容器化技术,可以提供更轻量、更快速、更灵活、更一致的应用部署和管理方式。 Docker的基本概念包括…...
 
【DL】YOLO11 OBB目标检测 | 模型训练 | 推理
本文进行YOLO11的旋转目标检测任务,旋转目标检测能够更精确地定位和描述那些非水平排列的目标,比如倾斜的飞机、船舶等。在原始的目标检测中,添加一个角度预测,实现定向边界框检测。 话不多说,先来个效果图!!! YOLO11中的旋转目标检测的特点 ▲更精确的定位:通过使用…...
vue读取本地excel文件并渲染到列表页面
1.安装插件(版本0.18.5) npm i xlsx 2.封装插件 <template><div class"container"><slot></slot></div> </template><script> import * as XLSX from xlsx export default {name: ReadExcel,props: {filePath: {type: …...
github 以及 huggingface下载模型和数据
runningcheese/MirrorSite: 镜像网站合集 (github.com) huggingface 下载模型和数据使用snapshot_download的方法 不会修改HuggingFace模型下载默认缓存路径?一篇教会你!_huggingface默认下载路径-CSDN博客 下载模型 使用snapshot_download 使用snapshot_down…...
 
使用 Vue 配合豆包MarsCode 实现“小恐龙酷跑“小游戏
作者:BLACK595 “小恐龙酷跑”,它是一款有趣的离线游戏,是Google给Chrome浏览器加的一个有趣的彩蛋。当我们浏览器断网时一只像素小恐龙便会出来提示断网。许多人认为这只是一个可爱的小图标, 但当我们按下空格后,小恐…...
 
51c视觉~合集6
我自己的原文哦~ https://blog.51cto.com/whaosoft/11603901 #CSWin-UNet 将自注意力机制集成到UNet中!CSWin-UNet:U型分割方法,显著提高计算效率和感受野交互!本文提出了CSWin-UNet,这是一种新颖的U型分割方法&…...
STM32(hal库)在串口中,USART和uart有什么区别?
在STM32的HAL库中,USART和UART都是用于串口通信的模块,但它们在功能特性和使用场景上存在一些区别。以下是对两者的详细比较: 一、功能特性 UART(通用异步收发器): 是一种串行、异步、全双工的通信协议。通…...
机器学习、深度学习面试知识点汇总
下面是本人在面试中整理的资料和文字,主要针对面试八股做浅显的总结,大部分来源于ChatGPT,中间有借鉴一些博主的优质文章,已经在各文中指出原文。有任何问题,欢迎随时不吝指正。 文章系列图像使用动漫 《星游记》插图…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
 
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
 
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
 
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
 
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
 
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
