强化学习:Q-learning与DQN(Deep Q Network)

本文介绍了强化学习中的Q-learning方法,详细阐述了Q值表、ε-greedy策略及其算法流程。接着讲解了DQN(Deep Q Network),通过引入神经网络解决大规模状态和动作空间的问题,并解释了Experience replay和Fixed Q-target策略,帮助理解DQN的收敛机制。
该文章已生成可运行项目,

  Q-learning是一种很常用很传统的强化学习方法,DQN是Q-learning和神经网络的结合,是近年来很火的强化学习方法。

Q-learning

  Q-learning会输出一张Q值表,如果有m个状态,n个动作,这个Q值表的size就是m*n;使用时,查表就行,先确定当前状态s,在看这个状态s对应的那一行,在输出这一行Q 值最大的动作,就完成了一次决策过程。

  所以,使用Q-learning,首先要设计状态空间s(会有哪些状态),动作空间a(会有哪些动作),以及reward。最最简单的例子,一维迷宫,假如一共有五个格子,最后一个格子是出口(T,target),机器(A,agent)最开始处于第一个格子,机器可以选择的动作是向左走一格或者向右走一格,初始状态如下:

A   _   _   _   T A ~\_~ \_~ \_~ T A _ _ _ T

不难想到,我们的状态空间可以设置成5个状态(对应A处于五个格子的状态),动作空间可以设置成两个动作(对应A向左向右的动作),reward可以设置如下,其中 s ′ s' s表示在当前状态s采取动作a后,会跳转到的下一个状态。

r e w a r d ( s , a ) = { 1 s ′ = T 0 e l s e reward(s,a)=\begin{cases} 1 & s'= T \\ 0 & else \end{cases} reward(s,a)={10s=Telse

如果机器在初始状态选择向右走这一动作,下一个状态就变成下面,这个转换带来的reward就是0。

_   A   _   _   T \_ ~A~ \_~ \_~ T _ A _ _ T

  Q值的更新利用贝尔曼方程

Q t a r g e t = R + γ max ⁡ a ′ Q ( s ′ , a ′ ) (1) Q_{target} = R + \gamma \max_{a'} Q(s', a') \tag{1} Qtarget=R+γamaxQ(s,a)(1)

Q ( s , a ) = Q ( s , a ) + α ( Q t a r g e t − Q ( s , a ) ) (2) Q(s,a) = Q(s,a)+\alpha(Q_{target}-Q(s,a)) \tag{2} Q(s,a)=Q(s,a)+α(QtargetQ(s,a))(2)

其中, s ′ s' s表示在状态 s s s选择了动作 a a a后跳转到的下一个状态, max ⁡ a ′ Q ( s ′ , a ′ ) \max_{a'} Q(s', a') maxaQ(s,a)表示选取下一个状态 s ′ s' s中的最大Q值(对应Q值表中 s ′ s' s这一行的最大值)。 α \alpha α是学习率, γ \gamma γ是未来reward换算到当前时刻状态的衰减,表示未来Q值对当前状态的带有衰减的影响,如果我们一直套用迭代公式(1),

Q t a r g e t = R + γ max ⁡ a ′ Q ( s ′ , a ′ ) = R + γ ( R ′ + γ max ⁡ a ′ ′ Q ( s ′ ′ , a ′ ′ ) ) = R + γ ( R ′ + γ ( R ′ ′ + γ max ⁡ a ′ ′ ′ Q ( s ′ ′ ′ , a ′ ′ ′ ) ) ) = … = R + γ R ′ + γ 2 R ′ ′ + γ 3 R ′ ′ ′ + … \begin{aligned} Q_{target} & = R + \gamma \max_{a'} Q(s', a') \\ & = R + \gamma(R'+\gamma\max_{a''} Q(s'', a'')) \\ & = R + \gamma(R'+\gamma(R''+\gamma \max_{a'''} Q(s''', a'''))) \\ & = \dots \\ & = R + \gamma R'+\gamma^2 R''+\gamma^3 R'''+\dots \\ \end{aligned} Qtarget=R+γamaxQ(s,a)=R+γ(R+γamaxQ(s,a))=R+γ(R+γ(R+γamaxQ(s,a)))==R+γR+γ2R+γ3R+

可以看到,当前时刻Q的目标值其实是未来reward 按照 γ \gamma γ衰减的和。如果 γ = 0 \gamma=0 γ=0,则说明当前状态的Q值更新,只和跳转的下一状态有关;如果 γ = 1 \gamma=1 γ=1,则说明未来决策的所有reward对当前状态的Q值更新有影响,且影响程度一样。

一些名词

  transition:一次transition就是执行一次下列过程,对当前状态 s s s,选取动作 a a a后,进入下一时刻状态 s ′ s' s,拿到奖励 r r r;可以表示为 ( s , a , r , s ′ ) (s,a,r,s') (s,a,r,s)
  episode:一次episode就是一套完整的决策过程,按照上面的一维迷宫的例子,就是从初始状态,到找到出口target,之间包含的所有transition。有点类似监督学习中的epoch。

epsilon-greedy

  Q值表会有一个初始值,为了让Q值表在学习之初,能够尽可能的探索更多的状态,可以设置一个 ϵ \epsilon ϵ概率,即对于每一次transition,有 1 − ϵ 1-\epsilon 1ϵ概率,会随机选择动作 a a a,而不是选取状态 s s s对应的Q值最大的 a a a,这样就能进入不同的下一时刻状态 s ′ s' s,探索更多的可能。

  随着episode的增加, ϵ \epsilon ϵ可以逐渐增大,这样在学习晚期能够更深入的挖掘已经学习到的好的决策过程,减少对未知的探索,所以这是一个explore vs exploit的过程。

算法流程

  超参数:learning_rate( α \alpha α), reward_decay( γ \gamma γ), e_greedy( ϵ \epsilon ϵ

DQN

  Q-learning如果状态很多,动作很多时,需要建立的Q值表也会十分的庞大,因此我们可以利用神经网络来计算Q值,利用神经网络的输出来代替查找Q值表得到的Q值。

  有两种可选方案,我们把神经网络抽象成 f ( ⋅ ) f(·) f(),方案一: Q = f ( s , a ) Q=f(s,a) Q=f(s,a),即利用神经网络学习状态s和采用状态a对应的Q值,相当于学习Q值表的一个表格;方案二: Q = f ( s ) Q=f(s) Q=f(s),即利用神经网络,一次性学习状态s采取各个动作的Q值,神经网络输出 Q Q Q是一个向量,长度是动作总数,相当于学习Q值表的一行。

  DQN还使用了两个有效的策略,即Experience replay和Fixed Q-target,来打乱经历之间的相关性,有助于收敛。

记忆库(Experience replay)

  记忆库会存储过去出现的transition。如果我们设置记忆库的大小N=500,则超过N之后,存入的transition会覆盖掉记忆库中最早存入的transition。

  这样,神经网络就可以利用批学习,例如设置batch=32,从记忆库中打乱顺序随机取出batch个transition,进入神经网络利用反向传播学习参数。为何要随机取transition,这是为了打乱transition之间的相关性。

固定Q-目标(Fixed Q-target)

  我们知道,在监督学习中,神经网络的更新需要计算loss的梯度反向传播,在DQN中也是如此,那么DQN的label是什么呢?这就需要另一个策略————Fixed Q-target。

  在这个策略下,需要维持两个一模一样结构的神经网络,两个网络分别叫做eval_net和target_net。看名字就知道,eval_net是用来计算估计值的,target_net是用来计算目标值的。对于一个transition(s, a, r, s’),s会输入eval_net来计算估计Q值q_eval,s‘会输入target_net来计算目标Q值q_target,q_target再经过贝尔曼方程得到真正的目标label y

y = r + γ × q _ t a r g e t y = r + \gamma \times q\_target y=r+γ×q_target

在训练神经网络参数时用损失函数(Loss function)计算q_eval和y的损失,在梯度反向传递即可,就不再用公式(2)了。这个反向更新只更新eval_net。

  所谓Fixed Q-targets,就是使得target_net的参数更新延迟发生,从而打乱相关性。经过若干步骤eval_net的更新会发生一次taregt_net的更新,由于taregt_net于eval_net的结构一模一样,所以taregt_net的更新很简单,传值就可以了。

t a r g e t _ n e t = e v a l _ n e t target\_net = eval\_net target_net=eval_net

算法流程

  初始化过程:初始化操作。初始化神经网络的参数,同时也会执行若干次transition来初始化记忆库。例如,记忆库的容量N=500,可以选择执行200次transition来初始化记忆库,这样学习过程可以从记忆库中抽取batch个transition,进行学习了。

  存储过程:更新记忆库。每发生一次transition,都会存入记忆库,超出记忆库容量N,会先删去记忆库中最早存入的transition。在存储过程中,只执行eval_net来获取Q值,进而根据实际情况,得到动作,奖励,和下一状态。

  学习过程:更新eval_net参数。可以选择发生若干步存储过程,执行一次学习过程。

  更新过程:更新target_net参数。一般发生若干步学习过程,执行一次更新过程。


参考文献:
Q-learning(莫凡):https://morvanzhou.github.io/tutorials/machine-learning/reinforcement-learning/2-1-A-q-learning/

Q-learning参考代码(莫凡):https://github.com/MorvanZhou/Reinforcement-learning-with-tensorflow/blob/master/contents/2_Q_Learning_maze/RL_brain.py

DQN(莫凡):https://morvanzhou.github.io/tutorials/machine-learning/reinforcement-learning/4-2-DQN2/

DQN参考代码(莫凡):https://github.com/MorvanZhou/Reinforcement-learning-with-tensorflow/tree/master/contents/5_Deep_Q_Network

强化学习——值函数与Bellman方程:https://blog.csdn.net/VictoriaW/article/details/78839929?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase

AI学习笔记——深度Q-Learning(Deep Q-Learing(DQN)):https://www.jianshu.com/p/72cab5460ebe

本文章已经生成可运行项目
源码直接下载地址: https://pan.quark.cn/s/a4b39357ea24 ### Home Bus 协议概述 Home Bus协议,亦被称为家庭总线协议,是由日本研发的一种专门应用于家庭自动化领域的通信标准。该协议在商用空调及其他家用电器的远程操控方面具备广泛的应用范围。借助Home Bus协议,设备之间能够达成高效的通信,使用户能够更加便利地监管家庭中的各类智能设备。 ### ECHONET协议及其背景 Home Bus协议ECHONET协议存在紧密的联系,实际上,ECHONET代表了一种更为具体的技术规范,其目的在于为家庭自动化领域构建一个开放且统一的通信标准。ECHONET由ECHONET财团负责维护支持,该组织致力于推动该协议的进步标准化进程。ECHONET协议的应用范围不仅限于家庭环境,还包括了楼宇自动化以及工业自动化等多个领域。 #### ECHONET的历史版本及修订记录 - **Version 1.0**:发布于2000年3月18日,同年7月对联盟成员公开,最终于同年对公众发布。 - **Version 1.01**:在2001年5月23日,向联盟成员发布,主要进行了补充勘误工作。 - **Version 2.00**:2001年8月7日,针对联盟成员发布。此版本中将电源线A电源线B两种方式合并为单一电源线方式(基于电源线A),并对相关描述进行了调整。 - **Version 2.01**:2001年11月9日,进行了一些必要的修正,包括排版错误的修正、术语的标准化等。 - **Version 2.10**:经历预览版草案阶段后,于2002年3月7日正式对联盟成员开放。此次更新主要涉及第3部分关于状态转换的描述修改。 -...
源码直接下载地址: https://pan.quark.cn/s/a4b39357ea24 依据所提供的文档材料,可以归纳出以下核心知识点: 1. **TM1668控制器**:TM1668属于一种专为驱动LED显示屏设计的专用驱动集成电路,其特别适用于驱动数码管,能够达成多路LED的驱动控制,从而提升了显示的效率。 2. **程序简化时序控制**:程序完成了对TM1668芯片的操作,其功能已经达到最简化程度,且时序设置正确无误。在编程过程中,确保时序的准确性至关重要,因为它直接关联到设备能否正常运作。 3. **寄存器操作**:在编程实践中,运用了 uchar、int 等数据类型来表示数据及控制位。uchar或许是一种8位无符号字符类型,用于存储数据信息。同时,还涉及到对特定位的操作,比如 & 、 >> 等,这些操作用于设定或检测数据位的状态。 4. **硬件控制位**:在代码中,设定了用于控制TM1668的硬件控制位,涵盖 STB(片选信号)、CLK(时钟信号)以及 DIO(数据输入输出信号)。这些控制位的作用在于向TM1668发送指令数据信息。 5. **数码管显示控制**:借助一系列的 send_data 函数调用,向TM1668发送控制指令数据,以此来调控数码管的显示状态。例如,设定显示位、挑选显示地址、将数据传输至特定的数码管显示单元等。 6. **定时器中断**:在程序设计中,应用了定时器中断(INT0_timer)来周期性地执行任务。通过设定定时器的初始值(TH0TL0),定时器在倒计时完成后会触发中断,使得程序能够以固定的频率更新数码管的显示内容。 7. **中断服务程序**:设定了一个中断服务程序,在定时器中断发生时被调用。在中断服务程序...
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 在信息技术领域中,DM码(Data Matrix Code)被视为一种二维条形码规范,其功能在于储存海量信息,并在工业自动化、电子元件标记等众多场景中得到普遍应用。DM码的辨识过程是图像处理及计算机视觉学科内的核心研究方向,它涵盖了图像采集、初步处理、特征提取以及模板比对等多个环节。在VC++平台之上,借助MFC(Microsoft Foundation Classes)库开展DM码辨识能够构建一个高效的应用开发环境。 我们将探讨"自适应阈值分割"这一流程。在DM码辨识的进程中,图像的初步处理扮演着至关重要的角色,而阈值分割则是将图像实现二值化的常用手段。自适应阈值分割能够依据图像的局部属性灵活设定阈值,有效处理光照不均、对比度较低等情况。这通常涉及到计算每个像素点邻近区域内的平均灰度级别,并设定一个阈值,通过像素点自身的灰度值其邻近区域灰度值的关联来判定其最终呈现的黑白状态。这样的方法能够确保DM码在复杂的图像背景下依然能够被精确地辨识出来。 随后,"快速定位"技术也是DM码辨识过程中的关键环节。在图像经过二值化处理后,需要迅速识别出DM码所在的位置。一种常用的方法是进行边缘检测,例如采用Canny算子或Sobel算子,这些方法能够识别出图像中的轮廓线。然后,借助矩形模板匹配,例如通过霍夫变换探测直线,并结合交点信息来确定DM码的四个顶点,从而精确获取DM码的位置信息。 在MFC框架的支持下,我们可以运用其图形设备接口(GDI+)以及OpenCV等库来实现上述功能。GDI+提供了丰富的绘图工具,能够便捷地处理图像的显示初步处理;而OpenCV则包含了大量的图像处理算法,...
标题SpringBoot博物馆综合服务管理系统的设计实现AI更换标题第1章引言介绍博物馆综合服务管理系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景意义阐述博物馆信息化管理的必要性系统开发的重要性。1.2国内外研究现状分析国内外博物馆管理系统的研究现状存在的不足。1.3研究方法以及创新点概述本文的研究方法,并指出系统的创新之处。第2章相关理论介绍系统开发所需的相关技术理论。2.1SpringBoot框架介绍阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.2数据库技术介绍系统所采用的数据库技术,如MySQL等。2.3Web开发技术概述Web开发技术,包括前端后端技术。2.4系统安全技术介绍系统安全相关的技术,如数据加密、用户认证等。第3章系统需求分析设计详细分析系统的需求,并给出系统的设计方案。3.1系统需求分析从功能需求、性能需求等方面对系统进行详细分析。3.2系统架构设计给出系统的总体架构设计,包括各个模块的功能划分。3.3数据库设计设计系统的数据库结构,包括表结构、字段设计等。3.4界面设计展示系统的用户界面设计,包括页面布局、交互设计等。第4章系统实现详细介绍系统的实现过程,包括各个模块的实现方法。4.1系统开发环境搭建介绍系统开发所需的软件、硬件环境及其配置方法。4.2核心功能模块实现详细介绍系统核心功能模块的实现代码逻辑。4.3系统集成测试阐述系统各个模块的集成方法以及系统测试的过程结果。第5章系统应用效果评估介绍系统的应用情况,并对系统的效果进行评估。5.1系统应用情况系统在博物馆中的实际应用情况。5.2系统效果评估从性能、用户满意度等方面对系统效果进行评估。5.3对比方法分析通过其他系统对比,分析本系统的优势不足。第6章结论展望总结本文的研究成果,并展望未来的研究方向。6.1研究结论概括本文的主要研
已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 在计算机硬件监控领域,掌握CPU(中央处理器)的温度状况具有核心意义,因为过高的温度水平可能会对其性能造成负面影响,甚至引发硬件层面的损坏。Intel作为全球范围内居于领先地位的CPU生产厂商,其产品在个人电脑服务器市场得到了广泛部署。本文将系统性地阐释如何借助驱动程序获取Intel CPU的温度数据,并深入分析相关技术细节。 Intel CPU内部构建了数字温度传感器(Digital Thermal Sensor,DTS),该组件负责实时追踪核心温度的变化情况。这些传感器所采集的数据能够通过系统管理接口(System Management Interface,SMI)或 ACPI(Advanced Configuration and Power Interface)机制向操作系统进行呈现。操作系统以及第三方应用程序可以通过访问这些数据来评估温度状态。 获取CPU温度的一种常规途径是借助硬件监控工具,例如HWMonitor、Core Temp等软件。此类工具多数情况下依赖于Microsoft的WMI(Windows Management Instrumentation)服务,该服务为应用程序提供了查询系统信息的标准化接口,其中包括温度数据。针对Intel CPU,WMI内置了一个名为"MSCTM"(Microsoft Core Temp Monitor)的类别,能够用于查询CPU的温度读数。 另一种技术方案涉及自主开发驱动程序或利用开源驱动库,比如lm_sensors,这是一个专门为Linux系统设计的硬件监控库。在Linux操作系统环境中,用户可以通过执行`sudo se...
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 在Android系统程序设计中,有时需要依据设备制造商或操作系统版本来达成特定功能或进行适配。 这个名为"判断android手机是华为小米魅族系统"的工具类正是为了应对此类场景而构建,它能够协助程序员识别用户设备属于华为、小米还是魅族等品牌。 该类通常会集成一系列函数,用于检测设备的制造商信息,进而明确其所属的ROM类型。 我们需要明确Android ROM的概念。 Android ROM(Read-Only Memory)指的是Android系统的固件,它包含了Android操作系统的底层组件、驱动程序以及个性化的用户界面。 不同厂商如华为(EMUI)、小米(MIUI)魅族(Flyme)会基于Android源代码进行深度开发,形成各自独有的ROM,提供了各自独有的功能用户体验。 在开发这个工具类时,程序员通常会借助Android提供的`Build`类,该类包含了关于设备的多种信息,例如设备制造商、型号、版本等。 例如,可以使用以下代码片段来获取设备制造商: ```java String manufacturer = Build.MANUFACTURER; ``` 接下来,我们可以依据`manufacturer`值来判断手机品牌。 如果为"huawei",则设备属于华为;如果为"xiaomi",则代表小米;如果为"meizu",则意味着魅族。 当然,实际应用中可能还需要考虑其他品牌,因此工具类通常会包含一个函数,如`checkBrand()`,它会遍历所有已知的品牌并进行对比: ```java public static boolean isHuawei() { return "huaw...
已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 快速傅里叶变换(FFT)是一种高效的离散傅立叶变换(DFT)方法,能够将时域信号有效地转换为频域表示。这种转换方式在信号处理、图像处理、通信工程等多个领域具有广泛的应用价值,因为它能够揭示出信号的频率构成,进而辅助进行信号特征的分析。 在实际操作过程中,信号首先需要通过ADC(模拟到数字转换器)进行采样处理。依据奈奎斯特定理,采样频率应当超过信号最高频率的两倍,以此防止出现混叠现象。如果设定采样频率为Fs,信号频率为F,采样点数为N,那么FFT运算的结果将输出N个复数,每一个复数都对应一个特定的频率成分。 每一个FFT运算结果中的点的模值反映了对应频率下的信号幅度大小。比如,如果原始信号的峰值为A,那么除了直流分量(第一个点)之外的其他点的模值是A的N/2倍,而直流分量的模值则是A的N倍。此外,相位信息则表示了该频率下信号的相位状况。 FFT运算的结果呈现出对称分布的特性,通常情况下,我们只需关注其中前半部分(即小于采样频率一半的频率范围),因为这部分包含了所有正频率成分的信息。频率分辨率采样时间呈现反比关系,若需提升频率分辨率,则必须增加采样点数或延长采样时间。 比如,当采样率为1024Hz,且采样1024个点时,频率分辨率能够达到1Hz;而如果采样持续时间为2秒,即采集2048个点,频率分辨率则可以提升至0.5Hz。计算FFT运算结果中某个频率点n(n≠1,且n≤N/2)所对应的信号表达式可以表示为An/(N/2) * cos(2πFn*t + Pn),即2*An/N * cos(2πFn*t + Pn)。对于直流分量n=1的情况,其幅度为A1/N。 以下通过一个包含直...
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值