写点什么

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

评论

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

(1-1/1)底层逻辑读后感:三种对错观四类表述

mtfelix

无限生长 2022Y300P

分布式系统必知必会

小梁编程汇

分布式 分布式系统 共识算法 分布式通信算法 #raft

首次!中西方数据库大咖“时空对话”,为中国分布式数据库开发者大会打call

OceanBase 数据库

OceanBase 开源 OceanBase 社区版 开发者大会

LabVIEW纹理分析(基础篇—9)

不脱发的程序猿

机器视觉 图像处理 LabVIEW 纹理分析

【LeetCode】统计特殊四元组Java题解

Albert

算法 LeetCode 1月月更

架构训练营 week4 作业

红莲疾风

「架构实战营」

写时复制技术(COW)详解

小梁编程汇

性能优化 操作系统 CopyOnWrite;

03 Prometheus之架构及数据模型

穿过生命散发芬芳

Prometheus 1月月更

(1-2/2)AI的落地:读caoz的文章有感

mtfelix

无限生长 2022Y300P

设计微博评论的高性能高可用计算架构

drizzle

「架构实战营」

C++ 动态内存分配的问题,你都懂了吗?

小梁编程汇

c++ 堆内存管理 内存分配 smart pointer

盘点 2021 | 云原生拥抱之路

xcbeyond

程序人生 云原生 盘点2021 xcbeyond

一个cpp协程库的前世今生(九)协程参数与返回值的处理

SkyFire

c++ cocpp

千万级学生管理系统的考试试卷存储方案

swallowluo

架构实战营 #架构实战营 「架构实战营」

【新年互动搞起!】元旦快乐!这里是2022年的 OceanBase

OceanBase 数据库

开发者 OceanBase 社区版 2022年新年祝福 元旦

数据库批量插入这么讲究的么?

秦怀杂货店

Java 数据库 批量插入

一份简单够用的 Nginx Location 配置讲解

冴羽

nginx 后端 博客 后端开发 博客配置

盘点 2021|一个普通人的不普通的2021

慕枫技术笔记

程序人生 盘点 2021

hw8-设计消息队列存储消息数据的MySQL表格

WWH

架构实战营

java 组件开发的准备工作

努力努力再努力

1月月更

滴滴夜莺监控发布v5正式版,定位Prometheus企业版

巴辉特

Prometheus zabbix Open-Falcon Nightingale

Prometheus云原生监控:运维与开发实战

方勇(gopher)

云原生 #Prometheus

获奖公布!OceanBase 第一届技术征文大赛圆满收官!

OceanBase 数据库

开发者 征文大赛 oceanbase OceanBase 开源

Flutter 让你的Dialog脱胎换骨吧!(Attach,Dialog,Loading,Toast)

小呆呆666

flutter ios android 前端 大前端

川大记忆

wood

300天创作 川大

SpringMVC框架基础知识(02)

海拥(haiyong.site)

28天写作 1月月更

架构实战训练营-模块5-作业

温安适

「架构实战营」

Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据

万俊峰Kevin

微服务 stream go-zero Go 语言

在线JSON转CSV,TSV工具

入门小站

工具

世界女性科技群落(五):数字化黄金时代,东南亚女性都是隐藏的阿尔法

脑极体

《张汉东的 Rust 实战课》学习笔记

贾献华

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