速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

如何训练智能体 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:241717

评论

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

vue的几个提效技巧

yyds2026

Vue

Apache SeaTunnel(Incubating) 2.2.0-beta 版本发布!API 重构,连接器与引擎解偶

Apache SeaTunnel

数据同步 Seatunnel 版本发布 数据集成平台 新版本/特性发布

5分钟带您了解DSL、以太网线缆和光纤之间的区别,值得收藏!

wljslmz

dsl 光纤 以太网 10月月更

如何搭建知识库网页?

Baklib

顶级理解!阿里这份Github星标63.7K的Redis高级笔记简直不要太细

程序知音

Java 数据库 redis 架构 后端技术

全彩LED显示屏在单位形象的作用

Dylan

LED显示屏 全彩LED显示屏 led显示屏厂家

Apache RocketMQ 5.0 在Stream场景的存储增强

阿里巴巴云原生

阿里云 云原生 Apache RocketMQ

KunlunBase功能体验范例

KunlunBase昆仑数据库

MySQL 数据库

强引用、软引用、弱引用、幻象引用的区别

zarmnosaj

10月月更

实验精神终将胜利:量子纠缠的祛魅七十年

脑极体

企业级MQTT物联网接入平台EMQX正式上线VMware Marketplace

EMQ映云科技

物联网 IoT emqx 10月月更 VMware Marketplace

企业如何低成本快速搭建团队知识库,实现企业知识管理?

Baklib

【一Go到底】第十天---位运算and移位运算符

指剑

Go golang 10月月更

企业级低代码开发平台有哪些?

优秀

企业级低代码平台 企业级低代码

epoll的实现原理

C++后台开发

数据结构 后台开发 linux开发 epoll C++开发

聊聊Vuex原理

yyds2026

Vue

解读Vue3模板编译优化

yyds2026

Vue

RocketMQ Streams在云安全及 IoT 场景下的大规模最佳实践

阿里巴巴云原生

阿里云 云原生 Apache RocketMQ

这几款小程序插件可以让效率翻倍

Geek_99967b

小程序

英国国民信托 CIO:如何讲好可持续发展故事

雨果

CIO

Python基础(十四) | Python之禅与时间复杂度分析

timerring

Python 时间复杂度 10月月更 python之禅

Flowable 设置任务处理人的四种方式

江南一点雨

Java springboot flowable JavaEE

软件测试 | 测试开发 | 测试过程中遇到的那些奇葩bug

测吧(北京)科技有限公司

测试

我奋斗了 18 年才和你坐在一起喝咖啡

宇宙之一粟

详解webpack构建优化

Geek_02d948

webpack

如何制作企业在线产品手册?这里有一些简单的方法!

Baklib

展示出你的创意,知识库搭建也可以这样玩!

Baklib

如何打造优秀的客户体验?

Baklib

客户体验 客户体验管理

外包学生管理系统

早安

架构

【指针】有哪些类型?

Geek_65222d

10月月更

量化自动套利分红机器人系统开发(成熟技术)

开发微hkkf5566

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