使用深度Q网络(Deep Q Network)学习控制倒立摆

2023-05-16

使用深度Q网络(Deep Q Network)学习控制单摆

原文:https://qiita.com/ashitani/items/bb393e24c20e83e54577
摘要: 我们将尝试使用Deep Q网络(通常称为DQN)来解决单摆向上的问题,该网络结合了Q学习(一种强化学习方法)和深度神经网络。{我完全不会日语,很多表达可能跟原文完全不一样。}
关键词: python,机器学习,深度学习,强化学习,chainer

问题描述

  这次设置了“单摆向上问题”。首先,空气中有一个固定的电机,杆的一端连接到电机轴上。杆的中心质量集中并且是刚性的。它是一种普通的棍子,直径为0。最初,杆根据重力向下摆。目标是将摆从这种状态向上摆动并使其静止在倒置状态。在经典的控制工程中,您必须使用包含非线性元素的控制器在两个分别设计用于摆动和静止的控制器之间切换。不,我从来没有做过,但似乎是。
  在这种情况下,电机只能以恒定的扭矩向右或向左旋转。另外,虽然有点烦人,但电机的扭矩不是很大,即使您从初始状态持续向一个方向旋转,也无法克服重力向上摆动。下面是陷入这个陷阱的动画。它处于一直向右施加扭矩的状态,但越是水平,重力加速度对角加速度的作用就越大,因此它被推回并摆动。
initial.gif
  这篇很棒的文章详细介绍了 DQN 本身 ,因此我将主要解释结果和实现的独创性。

让我们从结果开始

  智能体(在这种情况下是电机的控制器)对环境(电机和杆)采取动作(指示电机的旋转方向),并在获得奖励并获得一些观察结果的条件下学习最优策略。
  奖励 r r r 是从电机上看到的杆尖的高度 h h h 的函数
r ( h ) = { 5 h , h ≥ 0 h , h < 0 r(h)=\begin{cases} 5h,h\ge 0 \\ h,h<0 \end{cases} r(h)={5h,h0h,h<0
我偏向于积极的一面,但这可能是额外的小心。为了观察,在ATARI示例中,直接输入屏幕的图像,但这次我输入了摆的角度本身。 假设仿真的四个参数的数组序列可以作为一个数组得到。
  下面是曲线图。横轴是实验次数,纵轴是实验中获得的总分。蓝点是每一代的结果,红线是最高分。
bestER.png
  也许是因为非线性和多模态系统,结果非常不稳定,即使在收敛后也摆动着正负结果,但高分结果却在稳步增长。让我们来看看下面的增长过程。
  第一次,你被困住了。
000000.gif
  在第120次,我意识到如果我来回走动,我可以摆动起来,但在那之后我无法阻止它。
000120.gif
  第6950次,他似乎已经掌握了摆动后站着不动的窍门。 快到了! 祝你好运!
006950.gif
  第7640次,我们几乎实现了目标。
007640.gif
  这是 30000 次迭代中的最佳结果。这有点过分了,但它似乎已经意识到,在尽可能短的时间内进行第一次挥杆更有利。
024410.gif
  我有点惊讶它比我预期的要好。对于最后一个示例,绘制了电机的高度曲线和控制输入随时间的变化。摆动向上的动作和直觉完全不同,但你可以看到它们正在学习。
profile.png

关于DQN的实现

  我之前提到的 DQN 博客也展示了实现,但这次我尝试重新造轮子来理解。我把我根据 这篇论文(Playing Atari with Deep Reinforcement Learning) 实现的内容放在 https://github.com/ashitani/DQN_pendulum。仅仅通过阅读论文,我并没有完全理解如何构建和更新基本的深度网络。我会解释一下。
  深度Q网络是一个神经网络,当您输入一系列状态观察结果时,它输出每个动作值。在这种情况下,动作值是一个向量,指示“在输入角度序列指示的情况下将电机左右转动有多少奖励”。
  当然在学习初期,这个网络是随机的,所以会返回荒谬的结果。从现在开始按照说明的顺序更新的话,将来会训练为能得到很多总奖励的好网络。
  假设对状态 s t s_t st 执行某个动作 a t a_t at 以获得报酬 r t r_t rt,并将其更改为 s t + 1 s_{t+1} st+1。此时,在输入 s t s_t st 时的 Q Q Q 输出的动作价值向量 Q ( s t ) Q(s_t) Q(st) 中,只按照下面的式子改写了相当于 a t a_t at 的动作价值,记作 y t y_t yt(符号与原始论文相比已更改很多)
y t = Q ( s t ) y t [ a t ] ← r t + γ max ⁡ Q ( s t + 1 ) y_t=Q(s_t) \\ y_t[a_t]\leftarrow r_t+\gamma\max Q(s_{t+1}) yt=Q(st)yt[at]rt+γmaxQ(st+1)
  为了让 Q ( s t ) Q(s_t) Q(st) 接近这个 y t y_t yt,一步更新网络的权重。这次的奖励和下一步得到的最优动作价值要加上一定的折扣率 γ \gamma γ。加上 batch size 之前的动作价值的和,决定这次动作的价值是理想的,但是在运算时间上也有困难,所以只进行下一步。如果重复无限次此更新过程,您将从状态中获得基于总报酬的行为价值。真的吗?至少我是这么理解的,就这么表达吧。
  深度网络本身的组成并没有太多的试错,但我认为把它加深没有错。包含 Dropout 和 Batch Normalization 以提高泛化性能真的更好吗?我认为这取决于不同的问题。

最佳经验回放

  这个实现基本上是按照论文的,但是我只设计了一点,所以我会解释它。
  最好使用一组用于学习的“状态、动作和奖励”,这些状态、动作和奖励彼此不相关。因此,一种称为ER(经验回放)的方法很重要。这听起来像是DQN最大的观点之一。这是一种记住过去的经验并从前一组随机学习的方法。
  一次审判被称为一集,但在原始论文中,所有情节都被完整地记住了。为了获得新的经验,在每一集中我将用一种叫做 ε-greedy 的方法尝试很多事情。恒定概率ε可以选择随机操作和净跟随操作(贪婪操作)ε-greedy。在学习的早期ε您将仅从大型的,主要是随机的行为中学习。
  在学习足够先进之后,你只能通过贪婪的运动来产生结果。出于这个原因,我有时会尝试运行一个完全贪婪的操作,看看它是如何进行的。
  我一直在DQN论文中对此感到疑惑,但是当我尝试时,它仍然是真实的,尤其是在早期,有越来越多的情节显然不值得记住,为数不多的美好经历从记忆中消失了。毕竟,这完全是随机的。当然,我们可以从失败中学到一些东西,但我认为无论如何最好使用良好的经验作为模型。所以这一次,ε- 我决定不区分贪婪的情节和贪婪的情节,并优先考虑获得好成绩(终身奖励)的情节,以将其保留在我的记忆中。我们将保留有史以来最好的 100 集,只有属于排名的剧集才会被记住。但是,即使您没有将其列入排名,您也有1%的机会记住它。
  让我们称此方法为最佳ER。从使用相同的种子值初始化的状态中,我绘制了最佳ER和简单ER之间的收敛状态差异。
compare.png
  它似乎非常有效。由于计算机资源的原因,我没有在各种情况下尝试过。
  我尝试了一种暂时没有融入任何新经验的方法,但在收敛之后,我发现它会在黄金时代过一段时间后褪色。它看起来像这样:
bestER2.png
  当我更改随机数的种子时,也发生了同样的事情。我没有很好地调查原因,但我想它发生在成长的贪婪情节的高分表现填满排名之后,所以我认为这是因为数据过于相关或失去多样性。但是,改进版似乎还没有达到黄金时代,所以我认为还有改进的空间。
  另外,我认为最佳ER可能会过于沉迷于小成功并上瘾。此外,我们无法充分应对环境的变化。因为我们陷入了过去的荣耀中。这有点像我之前提到的黄金时代,我很想把它与我的人生理论重叠,但这取决于任务。
  这可能是DQN的一种趋势,但很难知道学习是否在进步,因此保存看起来不错的候选人至关重要。此外,与多模态函数的数值优化一样,我的印象是产生结果的时间在很大程度上取决于初始值。但是,在多次尝试这种情况后,您几乎可以在 15000 次迭代左右达到最高分。在我的PC上花了大约2个小时(MacBook Pro Core i5 2.1GHz x2Core)。

总结

  我能够尝试DQN,我一直想尝试。我还提出了一种称为最佳ER的方法,作为加速收敛的一种方式。最好自己实现,加深理解。
  令人惊讶的是,控制器端的任何调谐或开关都无法产生这样的结果。我想做各种各样的事情,例如使电机控制量连续,双摆,用图像而不是角度观察,以及使用实际的机器和网络摄像头进行观察,但由于时间限制,我将在这里停止。
  这次我用CPU做了,但毕竟在这个领域试错是有限制的。我很期待最近宣布的云机器学习。我可以听到有人悄悄地告诉我要买一个 GPU…

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

使用深度Q网络(Deep Q Network)学习控制倒立摆 的相关文章

  • angular6解析模板字符串,$compile服务在angular6中的实现方法

    angular6解析动态字符串模板 依赖 xff1a Compiler服务viewContanierRef服务 步骤 xff1a 创建指令 xff0c 并通过指令接受字符串接受字符串 xff0c 并通过此字符串动态创建组件及模块compil
  • “JSON parse error: Unexpected character (‘1‘ (code 49))的解决方式

    现在是 xff1a 2022年4月30日22 29 49 大家好 xff0c 我是雄雄 刚刚在调用接口的时候 xff0c 出现了个错误 xff1a span class token punctuation span span class t
  • springboot实现用户统一认证、管理-前端实现

    大家好 xff0c 我是雄雄 xff0c 欢迎关注微信公众号 xff1a 雄雄的小课堂 前言 现在是 xff1a 2022年6月2日15 43 51 上篇文章讲述了springboot中实现用户统一认证的具体内容 xff0c 主要从后端角度
  • Settings 添加一级菜单

    Settings添加一级菜单 xff1a 1 一级菜单项的实现是Activity 例如MySettings java xff0c 此类文件直接继承的是Activity xff0c 添加比较简单 xff08 1 xff09 在清单文件中添加如
  • Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 4171 异常的解决方法

    在做本地json文件的解析时遇到了这个问题 原代码为 64 RequestMapping value 61 34 readJson1 34 public String readJson1 String cityJsonCode json解析
  • Visual Studio 中 Tab 转换为空格的设置

    在 Visual Studio 中写代码时 xff0c 按 Tab 键 xff0c 会自动进行缩进 有时希望实现按 Tab 键 xff0c 出现多个空格的效果 Visual Studio 提供了这样的功能 xff0c 具体设置方法为 xff
  • 剑指offer—03

    剑指 Offer 03 数组中重复的数字 找出数组中重复的数字 在一个长度为 n 的数组 nums 里的所有数字都在 0 xff5e n 1 的范围内 数组中某些数字是重复的 xff0c 但不知道有几个数字重复了 xff0c 也不知道每个数
  • JSONArray.remove(index)失败原因分析

    集合在执行remove方法的时候 xff0c 有两种执行方式 xff0c 第一种移除对象remove xff08 object xff09 xff0c 另一种根据下标移除remove xff08 intIndex xff09 错误案例 Li
  • 【批处理bat】暂停功能命令

    一 目的 对暂停功能做修改 二 功能 2 1屏蔽 pause gt nul 在原本的pause上使用右尖括号写入nul即可不显示任何内容 2 2修改 echo press anykey to continue XD 在pause前利用ech
  • AOSP的编译及刷机

    简介 众所周知 xff0c Android是开源的 xff0c AOSP xff08 Android Open Source Project xff09 为Android开源项目的缩写 作为一名Android开发 xff0c 掌握Andro
  • Linux常用命令记录(du、find、grep、hadoop/hdfs、sed、tar、tr)

    Linux常用命令 查询格式 语句1 语句2 语句3 xff1a 对语句1的输出结果进行语句2的判定 xff0c 然后对输出结果进行语句3的判定 如 xff1a cat a txt head 10 wc l 39 cat a txt 39
  • 虚拟机运行出现蓝屏的现象如何解决

    前两天给大家分享了如何在电脑上安装虚拟机 xff0c 听到有部分小朋友私信跟我反馈说 xff0c 自己本身电脑可以安装vm虚拟机但是他安装过后一运行就立马进入蓝屏修复界面 所以今天想跟大家分享一下遇见这种情况如何解决 xff08 本文以华硕
  • 小白也能学懂——子网划分(2)

    我前天讲了一下子网划分 xff0c 昨天比较忙碌就忘记写剩下的内容了 xff0c 今天吃过饭 xff0c 想给他补上 xff0c 主要还是细分一下子网划分的作用 xff0c 以及如果进行计算 xff0c 本章还不是算难 xff0c 但是计算
  • 三分钟告诉你什么是三层交换机!

    昨天上周我们讲了单臂路由和跨交换机传输 xff0c 今天想说一下三层交换机 xff0c 对了还有个小实验 xff0c 收到反馈说我每次都是在图里标注代码不够清晰 xff0c 所以接下来会在实际中把代码贴出来供大家复制使用 目录 一 三层交换
  • 链路聚合(二层链路和三层链路)

    昨天主要介绍了三层交换机 xff0c 今天顺其自然就讲到了链路聚合 xff0c 因为是交换机中一个比较重要的技术 xff0c 下面我们开始 目录 一 单臂路由和三层交换的复习 二 端口绑定技术 三 链路聚合 端口聚合 端口绑定实现的条件 四
  • 静态路由(也许是目前最全的)

    今天在公司 xff0c 新来了个实习生 xff0c 突然问道静态路由的问题 xff0c 他跟我讲他不会设置 然后我就很尴尬 xff0c 因为这个毕竟是基础知识嘛 所以今天整理了一下静态路由的知识 xff0c 跟大家分享一下 目录 一 路由器
  • C# 读取Json文件--代码示例

    1 C 读取Json文件 JsonConvert SerializeObject str object to string JsonConvert DeserializeObject obj string to json 2 Json文件创
  • 网络地址转换协议——NAT(恐怕是最全的版本)

    前天我说第二天要跟大家讲一下NAT的 xff0c 结果放假有些懒 xff0c 所以就放在今天更新 xff0c 希望大家不要凶我 xff0c 哈哈哈 目录 一 什么是NAT 1 NAT简介 2 NAT作用 3 NAT内网地址的范围 4 主要应
  • linux日志文件详解

    目录 一 日志文件的分类二 日志文件位置三 常见日志文件1 分析日志文件2 内核及系统日志 四 日志消息等级五 日志文件分析1 用户日志2 程序日志 六 日志分析注意事项 一 日志文件的分类 日志文件是用于记录Linux系统中各种运行消息的
  • 虚拟化与docker基础

    文章目录 一 虚拟化1 虚拟化概述2 虚拟化的功能3 虚拟化的三种模式4 容器与虚拟化 二 Docker1 容器概述2 Docker概述3 Docker的设计宗旨4 容器与虚拟机的区别5 容器在内核中支持两种重要的技术6 Docker核心概

随机推荐

  • Docker容器网络模式与数据管理

    文章目录 一 Docker容器操作1 容器创建2 查看容器的运行状态3 启动容器4 创建并开启容器5 终止容器运行6 容器的进入7 复制文件到容器中 宿主机中8 容器的导出与导入9 删除容器 二 Docker网络1 Docker网络实现原理
  • docker镜像的创建与dockerfile

    文章目录 一 docker镜像的创建1 创建镜像的方法2 基于现有镜像创建3 基于本地模板创建4 基于dockerfile创建 二 Dockerfile1 概述2 Dockerfile结构3 Dockerfile镜像结构的分层4 Docke
  • matlab中值滤波实现

    中值滤波是一种典型的非线性滤波 xff0c 是基于排序统计理论的一种能够有效抑制噪声的非线性信号处理技术 xff0c 基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值 xff0c 让周围的像素值接近真实的值从而消除孤立的噪声点 该方
  • 程序员的情人节

    今天是一个好的节日 xff0c 七夕呀 xff01 程序是最好的女朋友 xff0c 它是不会骗你的 它偶尔会发些小的情绪 只是你没有懂它
  • stm32-Hardfault及内存溢出的查找方法

    STM32内存结构 1 要点 1 1 两种存储类型 RAM 和 Flash RAM可读可写 xff0c 在STM32的内存结构上 xff0c RAM地址段分布 0x2000 0000 0x2000 0000 43 RAM size Flas
  • raylib部分源代码功能解读

    官网 https www raylib com https github com raysan5 raylib 我根据自己的需求裁剪了多余功能后的代码 xff1a https gitee com xd15zhn raylib https g
  • 无量纲处理、量纲变换与实时仿真理论

    基本原理 万有引力公式 d 2 r
  • 局域网windows平台下时间同步

    最近单位出现很多应为系统时间不统一造成的问题 xff0c 如 客户机时间与服务器时间不同步 xff0c 而客户机使用软件是读取本机时间上传服务器 xff0c 这样就会造成排序错误 每次开机修改很繁琐 我就想到了在局域网内假设时间服务器的想法
  • 水下潜航器的建模与控制

    线性系统理论大作业 待完成 题目 水下潜器模型 xff0c 可能是潜艇或者鱼雷等对象 一个主推进螺旋桨 xff0c 前后两对水平陀翼 xff0c 后面一对垂直陀翼 潜器前进过程中 xff0c 通过调节助推进螺旋桨推力 xff0c 以及三对陀
  • 演化博弈、复制动态方程与仿真

    本文只整理和总结一下我的理解 xff0c 文末列出了可供参考的更详细完整的资料 建议先看参考资料 1 xff08 博弈论公开课 xff09 的博弈论课程 xff0c 可以直接从第11讲开始看 参考链接 2 是关于演化博弈非常经典的一本书 参
  • 演化博弈方法用于多智能体系统最优资源分配

    演化博弈方法用于多智能体系统最优资源分配 Evolutionary game theoretic approach for optimal resource allocation in multi agent systems 论文复现见 论
  • [论文复现]演化博弈方法用于多智能体系统最优资源分配

    原文 演化博弈方法用于多智能体系统最优资源分配 CSDN博客 https ieeexplore ieee org document 8243778 问题描述 有2种资源分配给6个个体 xff0c 2种资源的总量分别为 y 1 61 545
  • 基于博弈学习的分布式卫星任务规划

    基于博弈学习的分布式卫星任务规划 Distributed Satellite Mission Planning via Learning in Games 摘要 对地观测卫星群的任务规划是一个复杂的问题 xff0c 它提出了重大的理论和技术
  • 多星分布式任务分配中的博弈自组织

    多星分布式任务分配中的博弈自组织 Game theoretic self organization in multi satellite distributed task allocation 论文复现见 论文复现 多星分布式任务分配中的博
  • 自用的矩阵运算库zhnmat使用说明

    自用的矩阵运算库zhnmat使用说明 包含两个主要类 xff1a Mat和Vector3d xff0c 可以用于一些简单的矩阵和三维向量场景 xff0c 代码较简单 xff0c 没有任何性能优化 xff0c 可用于学习参考 代码仓库 htt
  • 非线性系统的反馈线性化

    仿射非线性或非仿射非线性指对输入是否是线性的 例如 xff0c 系统能够写成 x 61 f x
  • 基于特征模型的全系数自适应控制

    摘要 xff1a 首先推导了全系数和等于1的证明过程 xff0c 分析了等效时间常数的概念 xff0c 然后推导了递推最小二乘公式并用于参数辨识的方法 xff0c 最后给几个仿真的例子 全系数之和等于1 被控对象用微分方程 y n
  • raylib一些示例代码

    摘要 xff1a 几种相机视角 3D预览图视角 xff1a 鼠标拖动 xff0c 滚轮缩放 只能沿着中心点 第一视角 xff1a WSAD分别控制视角的前后左右移动 xff0c EQ分别控制上下移动 xff0c 滚轮控制移动速度 画正方体线
  • gnome session 中的开机启动程序配置文件

    我找了很久才找到的 xff1a 管理员状态下 xff1a linux Blue home library config autostart ls gnome terminal desktop stardict desktop 我开机启动的两
  • 使用深度Q网络(Deep Q Network)学习控制倒立摆

    使用深度Q网络 Deep Q Network 学习控制单摆 原文 xff1a https qiita com ashitani items bb393e24c20e83e54577 摘要 xff1a 我们将尝试使用Deep Q网络 xff0