写点什么

如何训练智能体 Agent 玩毁灭战士 ViZDoom?

  • 2018-06-24
  • 本文字数:3441 字

    阅读完需:约 11 分钟

前言

毁灭战士(Doom),是由 ID Software 开发的第一人称射击游戏,是第一人称射击游戏的开拓者。ViZDoom 是基于 Doom 游戏的人工智能研究平台,主要针对的是深度强化学习的研究。ViZDoom 平台允许人工智能 Bot 使用游戏图像信息进行对战,与传统游戏内置 Bot 的区别在于,传统游戏内置 Bot 对整个游戏的信息都是知道的。而基于人工智能的 Agent 获得的游戏信息和人是相同的,需要不断地探索地图及执行相应的行动。本节主要介绍 ViZDoom 中的两个场景:射击场景,使用了 Deep Q-learning 算法;收集医药箱场景,使用了 Policy Gradients 算法。两个场景如下图所示:

在射击场景中,怪物随机地出现在界面的一端,智能体有左、右移动和射击三个动作,怪物只要被击中一次,就会被杀死。当怪物被杀死或执行100 次行动后怪物还没被杀死,则游戏结束。当怪物被杀死,智能体得到101 奖励分数;当执行射击后,怪物没有被击中,智能体得到-5 分的奖励;当执行向左或向右行动后,怪物还在存活,智能体得到-1 分的奖励。

在收集医药箱的场景中,整个地图是矩形的,地面上是酸性的腐蚀液体,液体会周期性地腐蚀智能体的生命值。地图上随机分布着一些医药箱,并且会时不时地出现一些新的医药箱。智能体为了在地图上生存下去,需要捡起医疗包,回复生命值。当智能体死亡或时间到了,游戏结束。智能体有三个行动,向左、向右及前进。每个行动后,如果智能体生存下来,获得1 奖励分数,如果死亡获取100 惩罚分数。

本文主要基于ViZDoom 中的两个场景,讲解强化学习的基本思想,Q-Learning 算法,Deep Q-Learning 算法如何应用于射击场景及Policy Gradient 算法如何应用于收集医药箱场景。

强化学习

强化学习是机器学习的一个重要分支,目前已经广泛应用于游戏博弈,机器人控制,自动驾驶,人机对话,优化调度等领域。目前,常使用的深度强化学习算法主要有Deep Q-learning, Policy Gradients, Actor Critic, and PPO(Proximal Policy Optimization)。强化学习的基本思想为在一个环境中,智能体(agent)不断地和环境交互,执行不同的行动,然后获取到相应的奖励。这样,智能体在不断的尝试过程中,学习到完成目标的最优策略,从而获取到最高的累积奖励。

强化学习的架构中主要包含的元素为:智能体(agent),环境(env),状态(state)行动(action)及奖励(reward)。如下所示:

上图中环境(env)为超级玛丽昂这个经典游戏(Super Mario);智能体(agent)可以认为是一个AI 机器人,在不断尝试玩这个游戏,实现智能体的自我进化;状态(State)为智能体(Super Mario Bros)在特定时间点的游戏界面中的位置信息,可以认为是一张游戏界面的截图;行动(action)为智能体根据当前的状态信息,所采取的动作,比如上、下、左、右、跳,相当于智能体和环境在进行交互操作;当智能体执行完动作后,智能体会从当前状态转移到下个状态,即游戏的下一帧;奖励(reward)为智能体执行完动作后获得的分数,比如执行完向前动作后,如果智能体不死,则得分加1。强化学习的基本思想为智能体能够最大化期望的累积奖励,用数学公式可表示为:

Q-Learning

Q Learning 主要用 Q Table 记录状态 s 下采取不同行动后,得到将来的期望奖励。如下所示:

其中,图中的每个小方格表示智能体的状态,共有5*5=20 种状态,对应的每个状态智能体可采取4 个行动,为向上,向下,向左,向右移动,如果为0 表示不可以移动。这样依据状态和行动,可生成表格Q-Table,每个单元格中的分数表示对状态采取对应行动后产生最大期望奖励的度量值。表格中的4 列,分别表示向左,向右,向上,向下移动;表格中的每行表示智能体的状态。对应于上节提到的老鼠吃奶酪的游戏,生成Q-Table 后,选择对应状态的行,得分最高的行动。Q-Learning 算法的主要目的是能够学习得到Q-function,如下所示:

Q-function 以状态和行动作为输入参数,返回输入状态对应的期望累积奖励。Q-Learning 算法通过迭代化地优化 Q-Table 得到 Q-function,算法的学习流程如下所示:

Deep Q-Learning

Q-Learning 算法主要是通过不断更新 Q-Table 来学习到优化的 Q-function。但是,对于大的智能体状态空间,比如说围棋,射击游戏,很难定义和更新 Q-Table,Q-Learning 算法将不起作用。Deep Q-Learning 算法,可对智能体的状态,通过神经网络算法,来逼近该状态下执行 action 后的 Q-Value 值。如下所示:

其中,Deep Q 的输入为状态信息,可以是一系列图片,输出为执行不同动作后,Q 值的期望。为了更好地利用观测到的经验数据,训练 DQN 的时候常采用经验回放机制 Experience Replay,经验回复机制主要能够解决两个方面的问题,一个是避免网络忘掉以前学到的经验信息,二是神经网络的训练数据是独立分布的,而强化学习生成的数据一般是序列化的,通过经验回放机制可以打破这种顺序结构。经验回放机制如下所示:

其中,构建一个 ReplyBuffer 数据结构,把智能体和环境交互的信息(s,a,r,s’)放入 Buffer 中,然后随机采样生成 Batch 的训练数据,输入 DQN 网络中。DQN 的优化目标,如下所示:

射击场景中,数据预处理如下所示:

其中,首先读取游戏界面图像,为了减少训练数据大小,经过图像预处理,把游戏图像转换成 84*84 大小的灰度图片;然后,为了处理智能体所处状态的时序变化,比如移动方向,把四张预处理后的图像堆叠起来,组成 84*84*4 大小的训练数据。

射击场景使用的 Deep Q-learning 的网络模型结构如下图所示:

其中,使用了 3 个卷积网络,每个卷积特征层的大小为 20*20*32,9*9*64,3*3*128;然后,经过全链接层,最后输出执行每个 action 行动后的 Q 值。损失函数的计算方式如下所示,其中 Qtarget 可基于经验回放的方式和当前 action 的奖励,由 Q-leaning 中 Q 值的更新方式计算得到。

复制代码
# Q is our predicted Q value.
self.Q = tf.reduce_sum(tf.multiply(self.output, self.actions_), axis=1)
# The loss is the difference between our predicted Q_values and the Q_target
# Sum(Qtarget - Q)^2
self.loss = tf.reduce_mean(tf.square(self.target_Q - self.Q))

Policy Gradient

Deep Q-Learning 是基于值的强化算法,而 Policy Gradients 是基于策略的强化算法,目标是能够学习到策略方程 policy function,直接实现智能体状态到行动的映射,优化的目标为策略方程π。在强化学习中有两种类型的策略:确定性策略和随机性策略。确定性策略使用在确定性的环境中,智能体执行完行动后有确定性的输出;随机性策略是输出智能体在当前状态,选择不同 action 的概率分布,随机性策略主要用于非确定性环境。

使用策略梯度算法主要有三个优点,第一:策略梯度算法有较好的收敛性,策略梯度算法会沿着梯度方向更新策略方程里面的参数,每个迭代下参数更新平稳,算法收敛性会比较好。第二:策略梯度算法在高维的 action 空间更有效果,策略梯度会直接根据根据智能体的状态输出要执行的 action,不需要计算 Q 值。第三:策略梯度算法可以适用于非确定性环境。

策略梯度算法的主要思想为通过优化θ,改变策略的概率分布,从而使得智能体能取得高的期望奖励,优化方式如下所示:

收集医药箱的场景的数据预处理方式类似于射击场景,模型结构如下所示:

复制代码
#与射击场景的模型的差异在于,输出为该状态下执行 action 的概率分布,如下所示:
self.action_distribution = tf.nn.softmax(self.logits)
#损失函数计算如下所示,其中,discounted_episode_rewards_ 为该状态下的累积奖励,logits 为模型输出的 logist 值,actions 为对应状态下选择执行的行动。
self.neg_log_prob = tf.nn.softmax_cross_entropy_with_logits_v2(logits = self.logits, labels = self.actions)
self.loss = tf.reduce_mean(self.neg_log_prob * self.discounted_episode_rewards_)

总结

本文首先介绍了 Doom 游戏的人工智能研究平台 ViZDoom,包括射击场景和医疗包收集场景;介绍了强化学习的基本思想,包括智能体,环境,状态,行动及奖励。然后,讲解了强化学习中常用的三个算法 Q-Learning,Deep Q-Learning,Policy Gradient;应用 Deep Q-Learning 于射击场景;应用 Policy Gradient 于医药包收集场景。用户可把强化学习应用到游戏博弈,机器人控制,自动驾驶,人机对话,优化调度等工业领域中的相关场景。

参考 **** 文献

[1] https://simoninithomas.github.io/Deep_reinforcement_learning_Course .

作者简介

武维(微信:allawnweiwu):博士,现为 IBM 架构师。主要从事深度学习平台及应用研究,大数据领域的研发工作。

2018-06-24 11:241684

评论

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

德勤基于Amazon WAF 云原生安全服务为客户交付价值

亚马逊云科技 (Amazon Web Services)

ZooKeeper实战

CodeWithBuff

Java zookeeper

过一过Java“锁”事

CodeWithBuff

Java 并发 同步

如何设计恒流源输出电路?

不脱发的程序猿

嵌入式 电路设计 硬件研发 恒流源输出电路

三个维度,透视5G价值的持续点亮之旅

脑极体

详解Redis主从复制原理

蘑菇睡不着

Java redis

领域驱动设计101 - 模块

luojiahu

领域驱动设计 DDD

建信金科大咖访谈:地方特色产业互联网建设思考与实践

金科优源汇

lockSupport怎么玩

卢卡多多

锁机制 6月日更

推荐一个MySQL宝藏网站

Simon

MySQL 网站

快手封停多个内容侵权账号:如何严打短视频内容侵权行为

石头IT视角

[译] R8 优化: Lambda Groups

Antway

6月日更

数据结构——顺序栈

若尘

数据结构 6月日更

【源码篇】Flutter Bloc背后的思想,一篇纠结的文章

小呆呆666

flutter ios android 大前端

如果非要在多线程中使用 ArrayList 会发生什么?(第二篇)

看山

Java 并发编程

人工智能应用架构的思考

金科优源汇

python 连接钉钉传输工作数据监控

百里丶落云

Linux之less命令

入门小站

Linux

密码学系列之:twofish对称密钥分组算法

程序那些事

加密解密 密码学 程序那些事

【源码篇】Flutter Provider的另一面(万字图文+插件)

小呆呆666

flutter ios android 大前端

毕业论文被不小心删除了,有什么方法可以恢复?

淋雨

EasyRecovery 文件恢复 硬盘数据恢复

网络攻防学习笔记 Day59

穿过生命散发芬芳

网络攻防 6月日更

迪士尼将亚马逊云科技作为首选的公有云基础设施供应商,支持 Disney+ 全球扩展

亚马逊云科技 (Amazon Web Services)

谈一谈Java的网络编程

CodeWithBuff

Java 网络io

前端面试中有趣的题目(一)

空城机

JavaScript 大前端 6月日更

我是如何用 ThreadLocal 虐面试官的?

陈皮的JavaLib

Java 面试 多线程 ThreadLocal

成为你想要看到的改变,首先就是让正确的事情持续的发生。

叶小鍵

「2021中国峰会同行记」第二回 | 探索店匠从0到1出海的技术密码

亚马逊云科技 (Amazon Web Services)

Rust从0到1-函数式编程-迭代器

rust 函数式编程 Iterator 迭代器

研发管理工具 ONES 完成3亿人民币 B1 B2 轮融资,继续领跑研发管理赛道

万事ONES

项目管理 融资 研发管理工具 ONES

「2021中国峰会同行记」第一回 | 与埃森哲一同追溯技术合力的本源

亚马逊云科技 (Amazon Web Services)

如何训练智能体Agent玩毁灭战士ViZDoom?_语言 & 开发_武维_InfoQ精选文章