Q-learning

2023-11-07

学习增强学习有段时间了,也接触了Q-learning了。但对此理解不是很透彻,知道看到头条文章对一篇post翻译文才对此有了较深的理解,特此copy,望见谅。

目录:

  1. 故事案例
  2. Q-table简介
  3. Q-learning 算法:学习动作值函数(action value function)
  4. Q-learning 算法流程
  5. Q-learning 算法的伪代码

故事案例:骑士和公主

通过 Q-learning 深入理解强化学习

假设你是一名骑士,并且你需要拯救上面的地图里被困在城堡中的公主。

你每次可以移动一个方块的距离。敌人是不能移动的,但是如果你和敌人落在了同一个方块中,你就会死。你的目标是以尽可能快的路线走到城堡去。这可以使用一个「按步积分」系统来评估。

  • 你在每一步都会失去 1 分(每一步失去的分数帮助智能体训练的更快)

  • 如果碰到了一个敌人,你会失去 100 分,并且训练 episode 结束。

  • 如果进入到城堡中,你就获胜了,获得 100 分。

那么问题来了:如何才能够创建这样的智能体呢?

下面我将介绍第一个策略。假设智能体试图走遍每一个方块,并且将其着色。绿色代表「安全」,红色代表「不安全」。

通过 Q-learning 深入理解强化学习

同样的地图,但是被着色了,用于显示哪些方块是可以被安全访问的。

接着,我们告诉智能体只能选择绿色的方块。

但问题是,这种策略并不是十分有用。当绿色的方块彼此相邻时,我们不知道选择哪个方块是最好的。所以,智能体可能会在寻找城堡的过程中陷入无限的循环。

Q-Table 简介

下面我将介绍第二种策略:创建一个表格。通过它,我们可以为每一个状态(state)上进行的每一个动作(action)计算出最大的未来奖励(reward)的期望。

得益于这个表格,我们可以知道为每一个状态采取的最佳动作。

每个状态(方块)允许四种可能的操作:左移、右移、上移、下移。

通过 Q-learning 深入理解强化学习

「0」代表不可能的移动(如果你在左上角,你不可能向左移动或者向上移动!)

在计算过程中,我们可以将这个网格转换成一个表。

这种表格被称为 Q-table(「Q」代表动作的「质量」)。每一列将代表四个操作(左、右、上、下),行代表状态。每个单元格的值代表给定状态和相应动作的最大未来奖励期望。

通过 Q-learning 深入理解强化学习

每个 Q-table 的分数将代表在给定最佳策略的状态下采取相应动作获得的最大未来奖励期望。

为什么我们说「给定的策略」呢?这是因为我们并不实现这些策略。相反,我们只需要改进 Q-table 就可以一直选择最佳的动作。

将这个 Q-table 想象成一个「备忘纸条」游戏。得益于此,我们通过寻找每一行中最高的分数,可以知道对于每一个状态(Q-table 中的每一行)来说,可采取的最佳动作是什么。

太棒了!我解决了这个城堡问题!但是,请等一下... 我们如何计算 Q-table 中每个元素的值呢?

为了学习到 Q-table 中的每个值,我们将使用 Q-learning 算法。

Q-learning 算法:学习动作值函数(action value function)

动作值函数(或称「Q 函数」)有两个输入:「状态」和「动作」。它将返回在该状态下执行该动作的未来奖励期望。

通过 Q-learning 深入理解强化学习

我们可以把 Q 函数视为一个在 Q-table 上滚动的读取器,用于寻找与当前状态关联的行以及与动作关联的列。它会从相匹配的单元格中返回 Q 值。这就是未来奖励的期望。

通过 Q-learning 深入理解强化学习

在我们探索环境(environment)之前,Q-table 会给出相同的任意的设定值(大多数情况下是 0)。随着对环境的持续探索,这个 Q-table 会通过迭代地使用 Bellman 方程(动态规划方程)更新 Q(s,a) 来给出越来越好的近似。

Q-learning 算法流程

通过 Q-learning 深入理解强化学习

通过 Q-learning 深入理解强化学习

Q-learning 算法的伪代码

步骤 1:初始化 Q 值。我们构造了一个 m 列(m = 动作数 ),n 行(n = 状态数)的 Q-table,并将其中的值初始化为 0。

通过 Q-learning 深入理解强化学习

步骤 2:在整个生命周期中(或者直到训练被中止前),步骤 3 到步骤 5 会一直被重复,直到达到了最大的训练次数(由用户指定)或者手动中止训练。

步骤 3:选取一个动作。在基于当前的 Q 值估计得出的状态 s 下选择一个动作 a。

但是……如果每个 Q 值都等于零,我们一开始该选择什么动作呢?在这里,我们就可以看到探索/利用(exploration/exploitation)的权衡有多重要了。

思路就是,在一开始,我们将使用 epsilon 贪婪策略:

  • 我们指定一个探索速率「epsilon」,一开始将它设定为 1。这个就是我们将随机采用的步长。在一开始,这个速率应该处于最大值,因为我们不知道 Q-table 中任何的值。这意味着,我们需要通过随机选择动作进行大量的探索。

  • 生成一个随机数。如果这个数大于 epsilon,那么我们将会进行「利用」(这意味着我们在每一步利用已经知道的信息选择动作)。否则,我们将继续进行探索。

  • 在刚开始训练 Q 函数时,我们必须有一个大的 epsilon。随着智能体对估算出的 Q 值更有把握,我们将逐渐减小 epsilon。

通过 Q-learning 深入理解强化学习

步骤 4-5:评价!采用动作 a 并且观察输出的状态 s' 和奖励 r。现在我们更新函数 Q(s,a)。

我们采用在步骤 3 中选择的动作 a,然后执行这个动作会返回一个新的状态 s' 和奖励 r。

接着我们使用 Bellman 方程去更新 Q(s,a):

通过 Q-learning 深入理解强化学习

如下方代码所示,更新 Q(state,action):

New
 Q value = Current Q value + lr * [Reward + discount_rate * (highest Q 
value between possible actions from the new state s’ ) — Current Q value
 ]

让我们举个例子:

通过 Q-learning 深入理解强化学习

  • 一块奶酪 = +1

  • 两块奶酪 = +2

  • 一大堆奶酪 = +10(训练结束)

  • 吃到了鼠药 = -10(训练结束)

步骤 1:初始化 Q-table

通过 Q-learning 深入理解强化学习

初始化之后的 Q-table

步骤 2:选择一个动作。从起始点,你可以在向右走和向下走其中选择一个。由于有一个大的 epsilon 速率(因为我们至今对于环境一无所知),我们随机地选择一个。例如向右走。

通过 Q-learning 深入理解强化学习

通过 Q-learning 深入理解强化学习

我们随机移动(例如向右走)

我们发现了一块奶酪(+1),现在我们可以更新开始时的 Q 值并且向右走,通过 Bellman 方程实现。

步骤 4-5:更新 Q 函数

通过 Q-learning 深入理解强化学习

通过 Q-learning 深入理解强化学习

  • 首先,我们计算 Q 值的改变量 ΔQ(start, right)。

  • 接着我们将初始的 Q 值与 ΔQ(start, right) 和学习率的积相加。

可以将学习率看作是网络有多快地抛弃旧值、生成新值的度量。如果学习率是 1,新的估计值会成为新的 Q 值,并完全抛弃旧值。

通过 Q-learning 深入理解强化学习

更新后的 Q-table

太好了!我们刚刚更新了第一个 Q 值。现在我们要做的就是一次又一次地做这个工作直到学习结束。

实现 Q-learning 算法

既然我们知道了它是如何工作的,我们将一步步地实现 Q-learning 算法。代码的每一部分都在下面的 Jupyter notebook 中直接被解释了。

你可以在我的深度强化学习课程 repo 中获得代码。

项目地址:https://github.com/simoninithomas/Deep_reinforcement_learning_Course/blob/master/Q%20learning/Q%20Learning%20with%20FrozenLake.ipynb

回顾

  • Q-learning 是一个基于值的强化学习算法,利用 Q 函数寻找最优的「动作—选择」策略。

  • 它根据动作值函数评估应该选择哪个动作,这个函数决定了处于某一个特定状态以及在该状态下采取特定动作的奖励期望值。

  • 目的:最大化 Q 函数的值(给定一个状态和动作时的未来奖励期望)。

  • Q-table 帮助我们找到对于每个状态来说的最佳动作。

  • 通过选择所有可能的动作中最佳的一个来最大化期望奖励。

  • Q 作为某一特定状态下采取某一特定动作的质量的度量。

  • 函数 Q(state,action)→返回在当前状态下采取该动作的未来奖励期望。

  • 这个函数可以通过 Q-learning 算法来估计,使用 Bellman 方程迭代地更新 Q(s,a)

  • 在我们探索环境之前:Q-table 给出相同的任意的设定值→ 但是随着对环境的持续探索→Q 给出越来越好的近似。

就是这些了!不要忘记自己去实现代码的每一部分——试着修改已有的代码是十分重要的。

试着增加迭代次数,改变学习率,并且使用一个更复杂的环境(例如:8*8 方格的 Frozen-lake)。祝你玩的开心!

下次,我将探讨深度 Q-learning,它是 2015 年深度增强学习最大的突破之一。并且,我将训练一个打「毁灭战士(Doom)」游戏、能杀死敌人的智能体!(敬请期待机器之心的更新~)

原文链接:https://medium.freecodecamp.org/diving-deeper-into-reinforcement-learning-with-q-learning-c18d0db58efe


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

Q-learning 的相关文章

  • 利用GitHub Actions实现将GitHub代码同步到Gitee

    利用 Github Action 实现将 Github 上面的代码同步到 Gitee 中 同步的原理是利用 SSH 公私钥配对的方式拉取 Github 仓库的代码并推送到 Gitee 仓库中 所以我们需要以下几个步骤 生成 SSH 公私钥
  • 数组实现队列(详细)

    我们都知道 队列是一种先进先出的数据结构 每当有人问你队列是什么 你的回答就是 一种先进先出的数据结构 当然这样的回答也是完全没有错的 它就是一种先进先出的数据结构 为什么我们不能描述的多一点呢 更详细一点 下面我们就来详细的描述一下队列
  • 纠错输出编码(Error-Correcting Output Codes: ECOC)

    最近在利用Error Correcting Output Codes做论文 发现网上没有一种讲的比较清楚的 那我今天就花点时间大致上讲一下这种方法 最初提出ECOC方法的是如下的文章 Solving Multiclass Learning
  • 简述sql注入中万能密码的原理

    进行SQL注入的原理就是将特殊输入作为参数传入web程序 从而欺骗服务器执行信息查询功能 而万能密码则是利用sql库中运算符的优先级使得所传入数据库查询语句恒为true的SQL语句 1 用户登录时 后台执行的数据库查询操作 SQL语句 是
  • GIT 常用命令整理

    常用git命令 欢迎大家参考 1 git介绍 git与svn一样都是基于仓库来管理代码的 不过git的仓库在客户端和服务端都是存在的 我们通常都是在本地进行代码commit 然后再提交到远端服务器仓库的 而svn的话 差不多相当于大家一群人
  • 利用Jmeter做接口测试(功能测试)全流程分析

    利用Jmeter做接口测试怎么做呢 过程真的是超级简单 明白了原理以后 把零碎的知识点填充进去就可以了 所以在学习的过程中 不管学什么 我一直都强调的是要循序渐进 和明白原理和逻辑 这篇文章就来介绍一下如何利用Jmeter做接口测试的流程
  • Maven锦集:Linux/Windows环境安装配置

    前言 Maven在日常开发中 显得尤为重要 比如 RocketMQ的运作 就需提前配置好Maven 一起学习在Linux或Windows不同环境安装和配置Maven 本文以Maven3 8 6为例 温馨提示 如果你本机安装有多个Linux版
  • ROC,AUC及其基于Sklearn的实现

    ROC AUC及其基于Sklearn的实现 ROC和AUC的概念 sklearn的实现 from sklearn metrics import roc curve auc 多分类问题的ROC绘制 代码实现sklearn官方文档 API文档
  • Python之定时器的使用

    python中的定时器的使用 一 必须引入库 import threading 引入库 二 上代码 usr bin python coding UTF 8 import threading 引入库 def name timer print
  • 命令登陆mysql数据库_命令操作Mysql数据库

    MySql中添加用户 新建数据库 用户授权 删除用户 修改密码 注意每行后边都跟个 表示一个命令语句结束 1 新建用户 1 1 登录MYSQL gt mysql u root p gt 密码 1 2 创建用户 登录mysql后创建新用户 后
  • Android屏幕适配全攻略

    Android屏幕适配出现的原因 在我们学习如何进行屏幕适配之前 我们需要先了解下为什么Android需要进行屏幕适配 由于Android系统的开放性 任何用户 开发者 OEM厂商 运营商都可以对Android进行定制 修改成他们想要的样子
  • 2020运营商SDN和NFV的投入超200亿美元

    近两年 在网络领域最火热的非软件定义网络SDN和网络功能虚拟化NFV莫属 并且可以预计 在未来的一段时间内 SDN和NFV都将成为网络世界的 主角 其中SDN将让网络具备可灵活调配资源的能力 从而提高网络利用率 并降低网络服务成本 是未来新
  • 复现ThinkPHP5 5.0.23远程代码执行漏洞

    访问 index php s captcha页面 会出现如下报错 执行whoami 查看当前目录 method construct filter system method get server REQUEST METHOD pwd 写入一
  • 最大公约数和最小公倍数问题

    等差数列 蓝桥杯192 gcd问题 题目描述 数学老师给小明出了一道等差数列求和的题目 但是粗心的小明忘记了一 部分的数列 只记得其中 N 个整数 现在给出这 N 个整数 小明想知道包含这 N 个整数的最短的等差数列有几项 思路 求出每一项
  • Web学习笔记4:html初级篇-基础标签(1)

    话接上次 一 基本框架 在html语言中 也会有所谓的基本框架 我们来看一下 我们来一个一个解释 首先 我们要明确一点 框架中的标签都是一对的 这是什么意思 我们可以看到 在框架中有和 有和 有和 这些 只要是中间的文字一样 且标签形式为前
  • nginx中斜杠(/)详解

    本文主要介绍了nginx中斜杠 详解 配置location proxy pass时 加 与不加 的区别 文中通过示例代码介绍的非常详细 具有一定的参考价值 感兴趣的小伙伴们可以参考一下 不知大家日常在nginx配置时 是不是会对是否加斜杠充
  • 练习:字符串统计(坑:f‘string‘报错)

    练习 字符串统计 今天刷到字符串统计的题目 能看懂了 用自己的代码也来实现一次 题目 代码实现 re代码实现 f str 报错 我的博文推荐 练习题目 回首页 代码运行效果 python代码 如果从语句注释不能清楚作用 请评论区留言指教和探

随机推荐

  • android中的UI视图更新不能放在子线程中操作

    surfaceview不能再子线程里更新 需要通过Handler更新
  • 部署Node节点 配置kubelet证书自动申请 CSR、审核及自动续期

    k8s1 18 8版本 kubelet首次启动流程 第一次启动时没有证书如何连接 apiserver 这个问题实际上可以去查看一下 bootstrap kubeconfig 和 token csv 得到答案 在 apiserver 配置中指
  • vite+vue+cesium搭建

    vite vue cesium搭建 学习教程 https www bilibili com video BV1X44y1x7J2 p 1 npm install g yarn npm安装yarn yarn v 查看yarn版本 cmd Wi
  • 服务器 分布式 虚拟化,「云计算」云计算的两大特性:虚拟化、分布式

    云计算技术出现以后 它会加速电信和互联网业务的融合 这个融合除了技术和运营方式的融合 或者创新模式的转变 主要是电信业务网络的全IP化和宽带化的发展 相互之间的渗透趋势越来越明显 借鉴互联网云计算发展思路 可以将电信网络现在的很多资源 包括
  • 系统提示缺少xinput1_3.dll怎么办?

    我们在使用电脑的过程中 总会遇到一些dll文件丢失的情况 大概是因为系统的内部组件受损或者是出现了某种冲突引起的 比如系统提示xinput1 3 dll丢失要如何解决呢 缺少xinput1 3 dll丢失怎么修复 1 出现如下的窗口提示 不
  • 【数据结构-队列】阻塞队列

    欢迎来到我的博客 很高兴能够在这里和您见面 希望您在这里可以感受到一份轻松愉快的氛围 不仅可以获得有趣的内容和知识 也可以畅所欲言 分享您的想法和见解 推荐 kuan 的首页 持续学习 不断总结 共同进步 活到老学到老 导航 檀越剑指大厂系
  • c++中 string 和 int 类型转换

    一 int 类型转换为 string 类型 示例 include
  • 逻辑综合——优化电路

    对进行时序路径 工作环境 设计规则等进行约束完成之后 DC就可以进行综合 优化时序了 DC在优化过程中主要的策略将在下面进行说明 然而 当普通模式下不能进行优化的 就需要我们进行编写脚本来改进DC的优化来达到时序要求 DC进行优化的目的是权
  • CTFSHOW萌新计划 web16-17

    题目地址 https ctf show 0x01 web16 这个直接爆破就可以了 但是如果你是官网群里的成员 就会知道有个36d的梗 payload 36d 爆破的话给个脚本 import hashlib str1 abcdefghijk
  • emulator: ERROR: x86 emulation currently requires hardware acceleration! Please ensure Intel HAXM is

    原文错误提示 emulator ERROR x86 emulation currently requires hardware acceleration Please ensure Intel HAXM is properly instal
  • ege库基于前中后序动态建立二叉树、序列检错以及查找公共父节点C++

    一 需求分析 1 任意输入前序 中序序列或者中序 后序序列 生成二叉树 3 利用打印二叉树功能显示二叉树的逐步构造过程 使用自上而下的二叉树显示 4 使用EGE xege org SFML www sfml dev org download
  • 写给程序员的机器学习入门 (九) - 对象识别 RCNN 与 Fast-RCNN

    因为这几个月饭店生意恢复 加上研究 Faster RCNN 用掉了很多时间 就没有更新博客了 这篇开始会介绍对象识别的模型与实现方法 首先会介绍最简单的 RCNN 与 Fast RCNN 模型 下一篇会介绍 Faster RCNN 模型 再
  • 如何利用双休日,每月稳定增加额外1500元收入?

    针对8种不同标签的人群 良心推荐12个稳定增加收入的副业 最短一天就能有收入 月入几千的大有人在 认真看有干货 很可能会成为你的主业 最好先点赞收藏 以免后面找不到 不管你是上班族还是学生党 一个副业除了可以帮助你赚钱 更重要的是给了你平淡
  • 国家开源软件资源库

    http yp oss org cn software show cat php cat id 5 基本信息 成熟度 Dimdim 2009 05 19 1 2 3 4 5 6 7
  • C++模板详解

    目录 1 什么是c 的模板 2 模板的概念 3 函数模板 1 什么是函数模板 2 函数模板的定义格式 3 案例 4 函数模板的实例化 1 隐式实例化 2 显式实例化 5 函数模板的重载 6 函数模板与普通函数小结 7 使用函数模板要注意的问
  • 将生成的pandas DataFrame数据写入excel的指定位置

    在文件中生成了DataFrame格式数据想要写入excel的指定位置 比如第三行的第二列 网上的方法基本是使用to excel直接写入 这样写入的位置就是固定的 不能指定位置 通过openpyxl灵活设置的方式写入数据 这种方式对传统的中国
  • LoadLibrary错误182

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家拍砖 一 问题描述 在win7下用一个MFC程序把从XP拷过来的msgina dll加载起来 调用LoadLibrary后返回错误码为 二 解决
  • 二进制安全虚拟机Protostar靶场(2)基础知识讲解,栈溢出覆盖变量 Stack One,Stack Two

    前言 Protostar靶场的安装和一些二进制安全的基础介绍在前文已经介绍过了 这里是文章链接 https blog csdn net qq 45894840 article details 129490504 spm 1001 2014
  • 【python练习题 02】按身高和体重排队

    题目 某学校举行运动会 学生们按编号 1 2 3 n 进行标识 现需要按照身高由低到高排列 对身高相同的人 按体重由轻到重排列 对于身高体重都相同的人 维持原有的编号顺序关系 请输出排列后的学生编号 输入 两个序列 每个序列由n个正整数组成
  • Q-learning

    学习增强学习有段时间了 也接触了 learning了 但对此理解不是很透彻 知道看到头条文章对一篇 翻译文才对此有了较深的理解 特此copy 望见谅 目录 故事案例 table简介 Q learning 算法 学习动作值函数 action