发布在即!企业 AIGC 应用程度测评,3 步定制专属评估报告。抢首批测评权益>>> 了解详情
写点什么

Q-learning 算法实践

  • 2020-02-14
  • 本文字数:5953 字

    阅读完需:约 20 分钟

Q-learning算法实践

我们将会应用 Q-learning 算法完成一个经典的 Markov 决策问题 – 走迷宫!


项目描述:


1530180453875080109.png


在该项目中,你将使用强化学习算法,实现一个自动走迷宫机器人。


  1. 如上图所示,智能机器人显示在右上角。在我们的迷宫中,有陷阱(红色炸弹)及终点(蓝色的目标点)两种情景。机器人要尽量避开陷阱、尽快到达目的地。

  2. 小车可执行的动作包括:向上走 u、向右走 r、向下走 d、向左走 l。

  3. 执行不同的动作后,根据不同的情况会获得不同的奖励,具体而言,有以下几种情况。


  • 撞到墙壁:-10

  • 走到终点:50

  • 走到陷阱:-30

  • 其余情况:-0.1


  1. 我们需要通过修改 robot.py 中的代码,来实现一个 Q Learning 机器人,实现上述的目标。


Section 1 算法理解


1. 1 强化学习总览


强化学习作为机器学习算法的一种,其模式也是让智能体在“训练”中学到“经验”,以实现给定的任务。但不同于监督学习与非监督学习,在强化学习的框架中,我们更侧重通过智能体与环境的交互来学习。通常在监督学习和非监督学习任务中,智能体往往需要通过给定的训练集,辅之以既定的训练目标(如最小化损失函数),通过给定的学习算法来实现这一目标。然而在强化学习中,智能体则是通过其与环境交互得到的奖励进行学习。这个环境可以是虚拟的(如虚拟的迷宫),也可以是真实的(自动驾驶汽车在真实道路上收集数据)。


在强化学习中有五个核心组成部分,它们分别是:环境**(Environment、智能体Agent、状态State)、动作Action和奖励Reward)**。在某一时间节点 t:


  • 智能体在从环境中感知其所处的状态

    1530180923464001413.png

  • 智能体根据某些准则选择动作

    1530180936237020471.png

  • 环境根据智能体选择的动作,向智能体反馈奖励

    1530180947763091372.png


通过合理的学习算法,智能体将在这样的问题设置下,成功学到一个在状态


1530180959024016899.png


选择动作


1530180966720058733.png


的策略


1530180976289090382.png


1.2 计算 Q 值

在我们的项目中,我们要实现基于 Q-Learning 的强化学习算法。Q-Learning 是一个值迭代(Value Iteration)算法。与策略迭代(Policy Iteration)算法不同,值迭代算法会计算每个”状态“或是”状态-动作“的值(Value)或是效用(Utility),然后在执行动作的时候,会设法最大化这个值。因此,对每个状态值的准确估计,是我们值迭代算法的核心。通常我们会考虑最大化动作的长期奖励,即不仅考虑当前动作带来的奖励,还会考虑动作长远的奖励。


在 Q-Learning 算法中,我们把这个长期奖励记为 Q 值,我们会考虑每个 ”状态-动作“ 的 Q 值,具体而言,它的计算公式为:


1530180985028022434.png


也就是对于当前的“状态-动作”


1530180993703033340.png


,我们考虑执行动作


1530181003121030727.png


后环境给我们的奖励


1530181008767097807.png


,以及执行动作


1530181014952059949.png


到达


1530181021050040542.png


后,执行任意动作能够获得的最大的 Q 值


1530181170074019389.png



1530181183293036764.png


为折扣因子。


不过一般地,我们使用更为保守地更新 Q 表的方法,即引入松弛变量 alpha,按如下的公式进行更新,使得 Q 表的迭代变化更为平缓。


1530181055096015203.png


1530181080916012783.png


根据已知条件求


1530181104375035416.png



已知:如上图,机器人位于 s1,行动为 u,行动获得的奖励与题目的默认设置相同。在 s2 中执行各动作的 Q 值为:u: -24,r: -13,d: -0.29、l: +40,γ取 0.9。


1530181116066078997.png


1.3****如何选择动作


在强化学习中,「探索-利用」问题是非常重要的问题。具体来说,根据上面的定义,我们会尽可能地让机器人在每次选择最优的决策,来最大化长期奖励。但是这样做有如下的弊端:


  1. 在初步的学习中,我们的 Q 值会不准确,如果在这个时候都按照 Q 值来选择,那么会造成错误。

  2. 学习一段时间后,机器人的路线会相对固定,则机器人无法对环境进行有效的探索。


因此我们需要一种办法,来解决如上的问题,增加机器人的探索。由此我们考虑使用 epsilon-greedy 算法,即在小车选择动作的时候,以一部分的概率随机选择动作,以一部分的概率按照最优的 Q 值选择动作。同时,这个选择随机动作的概率应当随着训练的过程逐步减小。


在如下的代码块中,实现 epsilon-greedy 算法的逻辑,并运行测试代码。


  1. import random

  2. import operator

  3. actions = [‘u’,‘r’,‘d’,‘l’]

  4. qline = {‘u’:1.2, ‘r’:-2.1, ‘d’:-24.5, ‘l’:27}

  5. epsilon = 0.3 # 以 0.3 的概率进行随机选择

  6. def choose_action(epsilon):

  7. range(100):

  8. print(res)

  9. res = ‘’

  10. for i in range(100):

  11. print(res)

  12. ldllrrllllrlldlldllllllllllddulldlllllldllllludlldllllluudllllllulllllllllllullullllllllldlulllllrlr

Section 2 代码实现

2.1. Maze 类理解

我们首先引入了迷宫类 Maze,这是一个非常强大的函数,它能够根据你的要求随机创建一个迷宫,或者根据指定的文件,读入一个迷宫地图信息。


  1. 使用 Maze("file_name") 根据指定文件创建迷宫,或者使用 Maze(maze_size=(height, width)) 来随机生成一个迷宫。

  2. 使用 trap number 参数,在创建迷宫的时候,设定迷宫中陷阱的数量。

  3. 直接键入迷宫变量的名字按回车,展示迷宫图像(如 g=Maze("xx.txt"),那么直接输入 g 即可。

  4. 建议生成的迷宫尺寸,长在 6~12 之间,宽在 10~12 之间。


在如下的代码块中,创建你的迷宫并展示。


  1. from Maze import Maze

  2. %matplotlib inline

  3. %confer InlineBackend.figure_format = ‘retina’

  4. ## to-do: 创建迷宫并展示

  5. g=Maze(maze_size=(6,8), trap_number=1)

  6. g


1530179816094079444.png


Maze of size (12, 12


)


你可能已经注意到,在迷宫中我们已经默认放置了一个机器人。实际上,我们为迷宫配置了相应的 API,来帮助机器人的移动与感知。其中你随后会使用的两个 API 为 maze.sense_robot() 及 maze.move_robot()。


  1. maze.sense_robot() 为一个无参数的函数,输出机器人在迷宫中目前的位置。

  2. maze.move_robot(direction) 对输入的移动方向,移动机器人,并返回对应动作的奖励值。


随机移动机器人,并记录下获得的奖励,展示出机器人最后的位置。


  1. rewards = []

  2. ## 循环、随机移动机器人 10 次,记录下奖励

  3. for i in range(10):

  4. ## 输出机器人最后的位置

  5. print(g.sense_robot())

  6. ## 打印迷宫,观察机器人位置

  7. g


(0,9)


1530179793744005425.png

2.2. Robot 类实现

Robot 类是我们需要重点实现的部分。在这个类中,我们需要实现诸多功能,以使得我们成功实现一个强化学习智能体。总体来说,之前我们是人为地在环境中移动了机器人,但是现在通过实现 Robot 这个类,机器人将会自己移动。通过实现学习函数,Robot 类将会学习到如何选择最优的动作,并且更新强化学习中对应的参数。


首先 Robot 有多个输入,其中 alpha=0.5, gamma=0.9, epsilon0=0.5 表征强化学习相关的各个参数的默认值,这些在之前你已经了解到,Maze 应为机器人所在迷宫对象。


随后观察 Robot.update 函数,它指明了在每次执行动作时,Robot 需要执行的程序。按照这些程序,各个函数的功能也就明了了。


运行如下代码检查效果(记得将 maze 变量修改为你创建迷宫的变量名)。


  1. import random

  2. import operator

  3. class Robot(object):

  4. # from Robot import Robot

  5. # g=Maze(maze_size=(6,12), trap_number=2)

  6. g=Maze(“test_world\maze_01.txt”)

  7. robot = Robot(g) # 记得将 maze 变量修改为你创建迷宫的变量名

  8. robot.set_status(learning=True,testing=False)

  9. print(robot.update())

  10. g


('d', -0.1)  
复制代码


1530179766935039317.png


Maze of size (12, 12)  
复制代码

2.3 用 Runner 类训练 Robot

在完成了上述内容之后,我们就可以开始对我们 Robot 进行训练并调参了。我们准备了又一个非常棒的类 Runner,来实现整个训练过程及可视化。使用如下的代码,你可以成功对机器人进行训练。并且你会在当前文件夹中生成一个名为 filename 的视频,记录了整个训练的过程。通过观察该视频,你能够发现训练过程中的问题,并且优化你的代码及参数。




尝试利用下列代码训练机器人,并进行调参。可选的参数包括:


  • 训练参数

  • 训练次数 epoch

  • 机器人参数:

  • epsilon0 (epsilon 初值)

  • epsilon衰减(可以是线性、指数衰减,可以调整衰减的速度),你需要在 Robot.py 中调整

  • alpha

  • gamma

  • 迷宫参数:

  • 迷宫大小

  • 迷宫中陷阱的数量

  • ## 可选的参数:

  • epoch = 20

  • epsilon0 = 0.5

  • alpha = 0.5

  • gamma = 0.9

  • maze_size = (6,8)

  • trap_number = 2


  1. from Runner import Runner

  2. g = Maze(maze_size=maze_size,trap_number=trap_number)

  3. r = Robot(g,alpha=alpha, epsilon0=epsilon0, gamma=gamma)

  4. r.set_status(learning=True)

  5. runner = Runner(r, g)

  6. runner.run_training(epoch, display_direction=True)

  7. #runner.generate_movie(filename = “final1.mp4”) # 你可以注释该行代码,加快运行速度,不过你就无法观察到视频了。

  8. g


1530179729275061019.png




使用 runner.plot_results() 函数,能够打印机器人在训练过程中的一些参数信息。


  • Success Times 代表机器人在训练过程中成功的累计次数,这应当是一个累积递增的图像。

  • Accumulated Rewards 代表机器人在每次训练 epoch 中,获得的累积奖励的值,这应当是一个逐步递增的图像。

  • Running Times per Epoch 代表在每次训练 epoch 中,小车训练的次数(到达终点就会停止该 epoch 转入下次训练),这应当是一个逐步递减的图像。


使用 runner.plot_results() 输出训练结果。


  1. runner.plot_results()


1530181321915066661.png


本文转载自宜信技术学院网站。


原文链接:http://college.creditease.cn/detail/148


公众号推荐:

2024 年 1 月,InfoQ 研究中心重磅发布《大语言模型综合能力测评报告 2024》,揭示了 10 个大模型在语义理解、文学创作、知识问答等领域的卓越表现。ChatGPT-4、文心一言等领先模型在编程、逻辑推理等方面展现出惊人的进步,预示着大模型将在 2024 年迎来更广泛的应用和创新。关注公众号「AI 前线」,回复「大模型报告」免费获取电子版研究报告。

AI 前线公众号
2020-02-14 10:38787

评论

发布
暂无评论
发现更多内容

2023-06-20:给定一个长度为N的数组arr,arr[i]表示宝石的价值 你在某天遇到X价值的宝石, X价值如果是所有剩余宝石价值中的最小值,你会将该宝石送人 X价值如果不是所有剩余宝石价值中的

福大大架构师每日一题

Go rust 算法、 福大大架构师每日一题

Golden Gate’s (GGX) : 通过多方计算实现跨链一体化

股市老人

音视频开发进阶|第七讲:分辨率与帧率·下篇

ZEGO即构

直播 分辨率 视频 RTC 帧率

程序员这种巫师职业即将消失

FN0

AIGC

关于AI我们唯一确定知道的是…

FN0

AIGC

谁是蔡崇信?|耶鲁大学QA

B Impact

让你彻底掌握Less的基础,介绍得清晰易懂!

Apifox

程序员 前端 开发 less

低代码工具浅析

互联网工科生

软件开发 低代码 JNPF

C语言编程语法—利用栈实现对后缀表达式的求解

攻城狮Wayne

C语言 6 月 优质更文活动

谁是远程界的天花板?2023年5款最常用的远程软件横测:ToDesk、向日葵、TeamViewer、Splashtop、AnyDesk

dvlinker

向日葵 远程软件 ToDesk TeamViewer AnyDesk

实现10倍提升!昇思MindSpore SPONGE套件助力核磁共振蛋白质动态结构解析加速

彭飞

昇思 昇思MindSpore

向量数据库的行业标准逐渐清晰!Vector DB Bench 正式开源!

Zilliz

非结构化数据 测试工具 Milvus 向量数据库 zillizcloud

自动驾驶优缺点都有什么

来自四九城儿

透过数据看世界,打开AIGC的天窗——TE产服为AIGC新商业而来

TE智库

人工智能 openai AIGC 生成式AI

软件测试/测试开发丨用户端Web自动化测试学习笔记

测试人

Python 程序员 软件测试 学习笔记 web自动化

不错的IT项目管理系统有哪些?对比2023年最受欢迎的8款项目管理工具

PingCode

PingCode 项目管理软件

低代码开发将彻底颠覆编程行业!你还需要学习编程吗?

不在线第一只蜗牛

低代码 数字化 低代码开发

Flyway:简化数据迁移以适应敏捷开发

inBuilder低代码平台

让AI来帮你看看,五行缺啥

FN0

AIGC

IT知识百科:什么是计算机蠕虫?

wljslmz

计算机蠕虫 6 月 优质更文活动

提升网站速度的秘密武器:国外主机的优势解析!

一只扑棱蛾子

国外主机

数字化转型与架构|开篇

数字随行

架构 数字化转型

从辅助驾驶到自动驾驶道路还很远

来自四九城儿

在AIGC魔法世界里,你是麻瓜吗?

白洞计划

AIGC

在AIGC魔法世界里,你是麻瓜吗?

脑极体

AI

机器视觉在自动驾驶应用有什么

来自四九城儿

数学学渣能掌握大语言模型技术吗?

FN0

AIGC

华为云数据库GaussDB,无惧“卡脖子”,给世界一个更优选择

轶天下事

商业版数据库断供风险愈发扩大,浅谈GaussDB与国内企业的应对方式

轶天下事

一种很新的交互式智能标注技术

澳鹏Appen

人工智能 交互 数据标注 智能标注 交互式标注

Spring事务优化解析:实现高效率、高并发、低失效的全新策略

xfgg

spring 事务 6 月 优质更文活动

Q-learning算法实践_服务革新_杨飞_InfoQ精选文章