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

2023-05-16

文章目录

  • Q-learning
    • 一些名词
    • epsilon-greedy
    • 算法流程
  • DQN
    • 记忆库(Experience replay)
    • 固定Q-目标(Fixed Q-target)
    • 算法流程

  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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

强化学习:Q-learning与DQN(Deep Q Network) 的相关文章

  • 使用Python代码下载网易音乐歌曲

    刚刚写了一堆 xff0c 最终放弃了 xff0c 后来百度查找到一个接口 xff0c http music 163 com song media outer url id 61 这里填歌曲id mp3 这个URL就可以下载了 xff0c 现
  • Spring是如何管理Bean

    常常听老师说容器 xff0c 容器是什么 xff1f spring中是如何体现的 xff1f 一直有疑惑 xff0c 这两天看了一下Spring管理bean的Demo xff0c 对于Spring中的容器有了简单的认识 我们知道 xff0c
  • Python如何用TKinter搭建图形界面窗口,并通过多进程的方式调用功能函数

    用Python开发图形界面和程序时 xff0c 经常会对图形界面的搭建感到失望 xff0c 或许是由于对图形界面不熟悉的原因吧 xff0c 总之一想到图形界面 xff0c 就感觉会很费时 费力 xff0c 编程的积极性大幅下降 最近 xff
  • 巧用 Matplotlib 动画,让你的 Python 可视化大放异彩

    柠檬2069 点击右侧关注 xff0c 遇见更好的自己 xff01 巧用 Matplotlib 动画 让你的 Pyt
  • ubuntu里设置从串口登录

    1 Create a file called etc init ttyS0 conf containing the following ttyS0 getty This service maintains a getty on ttyS0
  • Linux proc目录详解

    目录 1 什么是proc 2 proc目录介绍 2 1 proc cpuinifo CPU的信息 型号 家族 缓存大小等 2 2 proc meminfo物理内存 交换空间 2 3 proc mounts 已加载的文件系统的列表 2 4 p
  • Linux 系统守护进程管理 --(start-stop-daemon)

    目录 一 功能 二 格式 2 1 搜索匹配的过程 2 2选项 2 2 1匹配选项 2 2 2只对 start有效的选项 2 2 3只对 停止有效的选项 2 2 4其他选项 三 应用 3 1 启动进程 3 1 1 强制启动 3 1 2 默认启
  • linux kill -9 杀不掉的进程

    kill 9 发送SIGKILL信号给进程 xff0c 将其终止 xff0c 但对于以下两种情况不适用 1 该进程是僵尸进程 xff08 STAT z xff09 xff0c 此时进程已经释放所有的资源 xff0c 但是没有被父进程释放 僵
  • 划分子网例题详解

    划分子网例题详解 网络基础考试题目 1 xff0c 假设取得网络地址200 200 200 0 xff0c 子网掩码为255 255 255 0 现在一个子网有100台主机 xff0c 另外4个子网有20台主机 xff0c 请问如何划分子网
  • ssh无秘钥登录报错sign_and_send_pubkey: signing failed: agent refused operation

    ssh连接远程主机时 xff0c 出现 sign and send pubkey signing failed agent refused operation 错误 xff0c 并且还是需要输入密码 表示ssh agent 已经在运行了 x
  • Linux开启路由转发功能

    标记一下 xff0c 今天想让一台Red Hat Enterprise Linux 7开通iptables的nat转发功能 xff0c 找了半天 A服务器 xff1a 192 168 30 20 24 B服务器 xff1a 192 168
  • E: Some index files failed to download. They have been ignored, or old ones used instead.解决方案

    1 删除 var lib apt lists 所有文件 sudo rm var lib apt lists vf 有文件夹不能删除的话使用 sudo rm rf var lib apt lists sudo rm var lib apt l
  • Microsoft Windows Vista

    Microsoft Windows Vista是微软Windows操作系统的最新版本 xff0c 于2005年7月22日微软正式公布了这一名字 原代号为Longhorn Windows Vista的内部版本是6 0 xff08 即Windo
  • tcp retransmission原因

    TCP协议是一个可靠的协议 它通过重新发送 retransmission 来实现TCP片段传输的可靠性 简单的说 xff0c TCP会不断重复发送TCP片段 xff0c 直到片段被正确接收 TCP片段丢失 TCP头部的checksum 接收
  • 数据库死锁原因及解决办法

    死锁 xff08 Deadlock xff09 所谓死锁 xff1a 是指两个或两个以上的进程在执行过程中 xff0c 因争夺资源而造成的一种互相等待的现象 xff0c 若无外力作用 xff0c 它们都将无法推进下去 此时称系统处于死锁状态
  • spring和springmvc父子容器的关系

    大家都知道 xff0c 在spring的配置中要分开配置service层的注解扫描 xff0c 以及springmvc变现层的注解扫描 xff0c 如下 xff1a lt 扫描加载Service实现类 gt lt context compo
  • pageHelper分页插件实现原理及使用方法

    插件官方网站 xff1a https github com pagehelper Mybatis PageHelper tree master src main java com github pagehelper 实现原理 xff1a 使
  • 虚拟机Linux系统安装nginx服务器并启动的步骤

    工作前的准备 xff1a 1 装有Linux的虚拟机 2 nginx安装包 xff0c 注意是gz结尾的压缩文件 具体步骤1 xff1a 1 nginx安装环境 nginx是 C 语言开发 xff0c 建议在 linux 上运行 xff0c
  • 什么是反射机制,有什么作用

    1 反射机制定义 反射的概念是由Smith在1982年首次提出的 xff0c 主要是指程序可以访问 检测和修改其本身状态或行为的一种能力 在Java环境中 xff0c 反射机制允许程序在执行时获取某个类自身的定义信息 xff0c 例如熟悉和
  • 模块化建立项目流程(Maven聚合模块)

    先说项目使用Maven的好处 1 项目构建 Maven定义了软件开发的整套流程体系 xff0c 并进行了封装 xff0c 开发人员只需要指定项目的构建流程 xff0c 无需针对每个流程编写自己的构建脚本 2 依赖管理 除了项目构建 xff0

随机推荐

  • 如何在linux下判断web服务是否开启?

    对于web服务的开启的判断有以下几种常用方法 xff1a 1 端口查看 xff1a 本地 xff1a ss xff0c netstat xff0c lsof 1 2 3 4 5 6 7 8 9 10
  • git基本命令

    最近再写一些项目上传到github xff0c 所以要用到git命令 本地需要先安装git客户端 xff0c 然后指定一个git地址为本地仓库 然后右键git bash here打开git命令界面 首先服务端需要创建一个项目以便clone到
  • jps查看Java线程,jstack查看具体线程堆状态

    想要使用jps需要配置环境变量 xff0c 在classpath后在加一个指定Java bin目录 具体命令如下 t2挂起了 xff0c 堆里面显示t2为RUNNABLE xff0c suspend xff0c resume废弃使用 IBM
  • python之ssh连接

    paramiko是用python语言写的一个模块 xff0c 遵循SSH2协议 xff0c 支持以加密和认证的方式 xff0c 进行远程服务器的连接 跟常用软件xshell xftp功能一样 xff0c 但是可以连接多台服务器 xff0c
  • 记录一个类加载变量引发的问题

    类加载变量导致的问题 类加载变量导致的问题 类加载变量导致的问题 因为项目需要 xff0c 银行要求使用weblogic部署并且启动所有项目 xff0c 不允许项目单独开服务启动一般都有这样的要求 xff0c 我所在的项目组有两个单独mai
  • lottie库动画方案

    什么是lottie Lottie是一个库 xff0c 可以解析使用AE制作的动画 xff08 需要用bodymovin导出为json格式 xff09 xff0c 支持web ios android和react native 在web侧 xf
  • for 循环嵌套性能的比较

    有人对着汇编语言不够一屑 xff0c 认为那已经是古老的低级语言 xff0c 是当今的非主流语言 xff0c 学了也不知道有什么用 是的 xff0c 我们不得不承认 xff0c 作为一门古老的语言 xff0c 汇编已经完成了历史赋予它的使命
  • Windows PowerShell打开方法与常用命令

    Windows PowerShell 是一种命令行外壳程序和脚本环境 xff0c 使命令行用户和脚本编写者可以利用 NET Framework 的强大功能 本文来介绍一下它的打开方法和常用的命令 启动方式 Win10系统可以在Cortana
  • Python实现微信自动回复

    先安装 itchat requests itchat uos itchat uos主要解决微信提示禁止网页登录导致登录失败的问题 以下有三种可玩方式 xff1a 1 回复好友 源代码如下 xff1a wechat autoreply imp
  • 体验华为操作系统 openEuler 20.03 LTS linux

    安装华为linux openEuler 20 03 LTS 一直在用centos xff0c 但redhat马上不再对其支持更新了 xff0c 刚好华为发行了社区版linux xff08 ps 难道是centos倒下 xff0c 华为ope
  • c++实现的阻塞队列

    阻塞队列 block queue 什么是阻塞队列 xff1a 在多线程编程时当有多个线程访问一个队列时如果队列为空 xff0c 则获取队列中元素的方法就会阻塞 xff0c 直到队列中有元素可以获取 解决的问题 xff1a 队列的线程安全问题
  • kafka生产者客户端架构和处理流程

    Kafka生产者客户端整体架构如图 xff1a 整个生产者客户端主要有两个线程 xff0c 主线程以及Sender线程 Producer在主线程中产生消息 xff0c 然后通过拦截器 xff0c 序列化器 xff0c 分区器之后缓存到消息累
  • 19、常用类——Collections 类

    Collections 类 Collections 则是集合类的一个工具类 帮助类 xff0c 其中提供了一系列静态方法 xff0c 用于对集合中元素进行排序 搜索以及线程安全等各种操作 常用方法 public static lt T ex
  • 【时间规划】C/C++发展之路--读书

    0 xff1a 图书馆的N本C xff0c C 43 43 书 1 xff1a C语言深度解剖 2 xff1a 高质量C 43 43 c编程指南 3 xff1a C 43 43 primer第四版 4 xff1a Windows程序设计 5
  • SpringSecurity(十七)------CSRF

    一 引入 从刚开始学习Spring Security时 xff0c 在配置类中一直存在这样一行代码 xff1a http csrf disable 如果没有这行代码导致用户无法被认证 这行代码的含义是 xff1a 关闭csrf防护 二 什么
  • Android Native Leak分析

    Native Heap 为 Android C 43 43 层 xff08 也为so库 xff09 所分配的内存 问题描述解决方式数据分析 问题解决方法获取数据方法脚本 python3解析结果 出现问题技巧 问题描述 使用dumspsys
  • CentOS 7安装Python 3.6,pip3报错问题

    在CentOS 7上安装Python3 6 3后 xff0c 在使用pip命令时报如下错误 Traceback most recent call last File 34 usr Python3 6 3 lib python3 6 site
  • SpringCloud调用接口流程

    Spring Cloud调用接口过程 Spring Cloud 在接口调用上 xff0c 大致会经过如下几个组件配合 xff1a Feign gt Hystrix gt Ribbon gt Http Client xff08 apache
  • seata的部署和集成

    一 部署Seata的tc server 1 下载 首先我们要下载seata server包 xff0c 地址在http seata io zh cn blog download html 当然 xff0c 课前资料也准备好了 xff1a 2
  • 强化学习:Q-learning与DQN(Deep Q Network)

    文章目录 Q learning一些名词epsilon greedy算法流程 DQN记忆库 Experience replay 固定Q 目标 Fixed Q target 算法流程 Q learning是一种很常用很传统的强化学习方法 xff