用深度强化学习玩atari游戏_(一)深度强化学习·入门从游戏开始
1.在开始正式进入学习之前,有几个概念需要澄清,这样有利于我们对后续的学习有一个大致的框架感
- 监督型学习与无监督型学习
- 深度强化学习的范畴
监督型学习是基于已有的带有分类标签的数据集合,来拟合神经网络,用以判断新的输入类型。
无监督型学习是对无标签的数据集合,仅基于数据结构特征,对数据进行分类,比如常见的K-means。
那么深度强化学习属于哪一种分类?深度强化学习通过自身与环境的交互获取数据集合,但这些数据并不是人为打标的;深度强化学习通过神经网络来拟合状态->动作的映射,使其适应所处环境以换取最高奖励。
深度强化学习既有典型监督型学习的特征,又需要克服数据的天然缺陷:比如没有预先的数据集,采集的数据集不i.i.d等。需要结合动态规划等知识来适应一些问题。
简而言之,深度强化学习并不是简单的监督型学习,是介于监督型学习和无监督型学习之间的特殊类型
2.板车平衡游戏(cart-pole)
cart-pole可以算是深度强化学习入门最简单的一个游戏了。游戏的目标只有一个,左右移动小车,使得杆子不掉落。
对于这样一个游戏,人类玩家通常基于的经验是:当我右移小车,杆子会加速向左,左移小车,杆子会加速向右。在初期。人类玩家很容易找到平衡的方法,但随着杆摇摆幅度和角速度的增加,外加上小车移动距离的限制(左右不得超过槽距),我们很快便对杆子失去了控制。
所以,该轮到我们深度强化学习出场了。
一个很天然的缺陷是,神经网络最开始并不具备人类的经验或者物理知识基础,于是最初的神经网络随机发出指令,甚至在杆子即将向右倒下时依旧发出向左的命令,游戏很快就结束了。所以我们需要开发出一套基于强化学习的奖励机制的算法,纠正神经网络发出的错误指令。
流程如下
in one epoch:list_observation= []list_action= []list_reward= []in one eposide (total 16)observation -> nn -> action[reward] || -> observation -> nn -> action[reward] || ->.....-> action[reward] || (-> observation(judge) -> terminte)get: chain[observation] || chain[action] || sum[reward]list_observation+= chain[obersavation] list_action+= chain[action] list_reward+= sum[reward] end fortop_list_reward = list_reward.top(percentile)top_index = top_list_reward.indextop_list_observation = list_observation[top_index]top_list_action = list_action[top_index]{top_observation,top_action} = flatten(top_list_observation, top_list_action)top_observation -> nn -> random_actionloss = nn.CrossEntropyLoss(random_action,top_action)do_optimizer_gradient_descent(loss)
有神经网络编程基础的同学应该能很快了解其中的原理。对强化学习基础了解不多的同学,可以自行补充下,这里就不再解释强化学习的结构和神经网络的损失函数等原理了。
仅仅对笔者独特风格的伪代码流程做一个解释:首先在一个epoch中,我们初始化了三个列表,分别用以存放对环境的观察(observation),采取的动作(action),收获的奖励(reward)。
对于板车平衡游戏来说,奖励的设置为,只要杆子没倒,多撑过一秒,奖励就加1。
我们首先观察游戏开始时的环境提供的obervation,包括车子的位置,杆子的角度,转动的速度等,将这些因素打包成一个observation(就是一个代表环境数据的数值向量),输入我们随机初始化的神经网络中,神经网络输出一个action的概率(例如:左0.7或右0.3,加起来为一),并获取一个reward,根据输出的动作概率选择一个动作(向右记为1,左记为0),左右移动小车,此时观察环境提供的新的obervation,并再次输入神经网络。每个动作有执行时间,你可以认为每0.5秒才能进行一次动作。
循环以上步骤直至再执行某一个动作之后,环境提供的observation显示,杆子已经倒下,游戏结束。
此时我们得到一条链:
observation -> nn -> action[reward] || -> observation -> nn -> action[reward] || ->.....-> action[reward] || (-> observation(judge) -> terminte)
我们收集这条链上的数据作为本次游戏的经验:
chain[observation] chain[action] sum[reward]
并将这些经验存入初始化的列表中
list_observation+= chain[obersavation]
list_action+= chain[action]
list_reward+= sum[reward]
我们把游戏重开,再进行一次游戏直到结束,并把得到的经验加入到列表中。循环重复16次(当然可以是你喜欢的任意次)
执行完16局游戏之后,我们规定:把玩的差的那几局游戏删了,丢人!(其实就是去掉reward较低的几局游戏)只给领导展示我们的优秀作战成果~~取reward列表中的前percentile,并找到对应的chain[obersavation]和chain[action]。
这里要对之前得到的数据进行一些处理。
top_list_reward = list_reward.top(percentile)
top_index = top_list_reward.index
top_list_observation = list_observation[top_index]
top_list_action = list_action[top_index]
{top_observation,top_action} = flatten(top_list_observation, top_list_action)
数据都有了,接下来就是最激动人心的无脑梯度下降环节了!!!
但是最关键的问题是我们怎么设计loss函数
我们进行完16局游戏后,所获得的经验中的标签数据是什么?联想下监督学习,标签数据都是实际的分类(人类手动打标),强化学习没有人为打标的数据,数据来源于与环境的交互。
在本轮(16次)尝试中,我们去掉了并不好的结果,那就姑且认为筛选后剩下的优良游戏结果是正确的打标结果吧(其实只是纯粹的运气好,采用了更正确的action)!
这里要注意:神经网络输出的是动作的概率(某个observaion下,左0.7,右0.3),而我们实际采用的(存储在chain[action]中)的动作是单个值(0或1,代表左或右),所以损失函数的定义为
top_observation -> nn -> random_action
loss = nn.CrossEntropyLoss(random_action,top_action)
do_optimizer_gradient_descent(loss)
然后做反向传播+梯度下降应该就不用多说了吧!
然后拿着新鲜的更新过的神经网络做下一个epoch吧!
3.总结
循环上面的算法无数次(一般很快loss就收敛了),我们会得到一个很不错的网络,这个网络能够在几百个动作之后依旧保持杆子不倒下。
回过头来思考为什么如此朴素的算法有这么好的结果。
本质上,我们做的也就是只是与环境交互并去除不好的模拟结果以得到相对准确的标签信息,在神经网络看来,并没有小车,杆子,倒下与否一系列的概念,需要的只是在输出一个动作后,能够得到环境的回馈,并从中筛选出有效信息,这也是强化学习之美,简洁的模型,朴素的学习流程。
在下一个章节,我们将会换一个游戏模型,并探讨深度强化学习在不同游戏上的不同表现以及应对措施。
用深度强化学习玩atari游戏_(一)深度强化学习·入门从游戏开始相关推荐
- 用深度强化学习玩atari游戏_被追捧为“圣杯”的深度强化学习已走进死胡同
作者 | 朱仲光 编译 | 夕颜出品 | AI科技大本营(ID:rgznai1100) [导读]近年来,深度强化学习成为一个被业界和学术界追捧的热门技术,社区甚至将它视为金光闪闪的通向 AGI 的圣杯 ...
- 深度学习模型建立过程_所有深度学习都是统计模型的建立
深度学习模型建立过程 Deep learning is often used to make predictions for data driven analysis. But what are th ...
- python连连看小游戏_利用Python制作一个连连看小游戏,边学边玩!
导语 今天我们将制作一个连连看小游戏,让我们愉快地开始吧~ 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块 环境搭建 安装Python并添加到环 ...
- cmd小游戏_使用pygame制作Flappy bird小游戏
原文链接: [Python]使用Pygame做一个Flappy bird小游戏(一)mp.weixin.qq.com 最近看到很多大佬用强化学习玩Flappy bird.所以打算也上手玩一玩,但是苦 ...
- java实现潜艇大战游戏_基于Java实现的潜艇大战游戏
一.需求分析 本次游戏课程设计小组成员团队合作的方式,通过游戏总体分析设计,场景画面的绘制,游戏事件的处理,游戏核心算法的分析实现,游戏的碰撞检测,游戏的反复测试,游戏的打包运行等一个完整的游戏设计编 ...
- 用记事本编写小游戏_记事本3分钟编写放置小游戏(v0.4 土豪情趣屋与大型灵石盾构)...
------------------------- v0.4新增问山村的土豪情趣屋(大量生产人口),新增灵石盾构(提升灵石产量)! ------------------------- 说明: 本教程无 ...
- 用python做五子棋游戏_用python来做一个五子棋游戏,源码分享~
五子棋的规则大家肯定都了解,也是大家在百忙之中娱乐的一部分,也都在网上玩过五子棋的游戏,那么大家有没有想过自己编写一个五子棋游戏呢.很多人都感觉做"游戏"这个词汇听着就很难,不知道 ...
- 手机海豚模拟器怎么添加游戏_小忍计划模拟器手机版游戏下载-小忍计划模拟器手机版游戏v0.1.9.3...
小忍计划模拟器手机版是一款非常好玩的3D恋爱模拟游戏,在这里玩家将拥有第一视角,游戏中你将有一个叫做小忍的虚拟女友,玩家可以通过克重任务来解锁服饰装扮她,还能够带她去人任何地方,你的任务就是让小忍高兴 ...
- java写潜艇大作战游戏_基于Java实现的潜艇大战游戏
一.需求分析 本次游戏课程设计小组成员团队合作的方式,通过游戏总体分析设计,场景画面的绘制,游戏事件的处理,游戏核心算法的分析实现,游戏的碰撞检测,游戏的反复测试,游戏的打包运行等一个完整的游戏设计编 ...
最新文章
- 【译】表变量和临时表的比较(转)
- FFmpeg常用命令总结
- 程序调试的时候利用Call Stack窗口查看函数调用信息
- 聊聊rocketmq的RemotingException
- Apache Commons工具集简介
- iis express8 自动关闭
- Linux C语言结构体
- leetcode 456. 132 模式(单调栈)
- 【POJ - 3026】Borg Maze(bfs预处理 + 最小生成树,建图)
- linux shell结构,linux——Shell的控制结构(附shell编写代码和运行结果)
- JDBC之数据库的连接步骤(六步)
- sql server复制表_具有超过246列的表SQL Server复制
- Python使用线性回归简单预测数据
- 主力用计算机吸筹,主力进场 主力吸筹
- 9种常用的软件容错处理方式
- 作为一名计算机学院普通的大学生如何提高兴趣敲代码?谈谈我的感受,欢迎交流
- Lecture 07 08 RNN---Hinton课程
- android五角星图像识别,ImageFound
- android 高德地图卡顿,【报Bug】快速反复缩放地图会卡死(plus.maps)
- Ubuntu安装ping工具
热门文章
- node.js编写网页_为Node.js编写可扩展架构
- react hooks_React Hooks简介
- mac 设置终端样式_如何将终端样式设置为freeCodeCamp或任何您想要的样式
- 宝塔linux_Linux虚拟机上快速搭建宝塔 部署PHP运行环境
- Python内置函数——locals
- Xamarin:安卓通过“第三发应用打开”实现文件跨应用传输
- 关于Oxygen版 Eclipse JSP或html 中option标签使用c:if报错的问题
- 教你用Python 每日定时推送睡前小故事给你__的人
- Hadoop 生态系列之 1.0 和 2.0 架构
- Python Flask实现查询和添加数据