中超

基于TensorFlow的强化学习在毁灭

2019-08-12 05:53:41来源:励志吧0次阅读

  基于TensorFlow的强化学习,在《毁灭战士》游戏里训练Agent

  (公众号:):本文原标题Reinforcement learning with TensorFlow,作者为Justin Francis,全文由雷锋字幕组编译。

  翻译/ 林立宏 文加图

  校订/ Julia

  整理/ 凡江

  深度强化学习(或增强学习)是一个很难掌握的一个领域。在众多各式各样缩写名词和学习模型中,我们始终还是很难找到最好的解决强化学习问题的方法。强化学习理论并不是最近才出现的。实际上,一部分强化学习理论可以追溯到1950年代中期。如果你是强化学习的纯新手,我建议你先看看我前面的文章《介绍强化学习和OpenAI Gym》来学习强化学习的基础知识。

  深度强化学习需要更新大量梯度。有些深度学习的工具 ,比如TensorFlow在计算这些梯度的时候格外有用。 深度强化学习也需要可视化状态来表现得更抽象,在这方面,卷积神经络表现最好。在这篇译文中, 我们将会用到Python, TensorFlow和强化学习库Gym来解决3D游戏Doom(《毁灭战士》)里医药包搜集的环境,想取得全部版本的代码和需要安装的依赖,请访问我们的GitHub仓库和这篇文章的Jupyter Notebook。

  环境探测

  在这个环境中,玩家将扮演一个站在强腐蚀性水中的人,需要找到一条收集医药包并且安全离开的道路。

  图1. 环境, Justin Francis提供

  我们能够解决这个问题的一种强化学习方法是——结合基准算法的强化学习。这种强化会简单点,它仅仅需要来自当前环境行动下的状态和嘉奖数据。强化也被称为一种策略梯度方法,由于它仅仅评估和更新了智能体的策略。策略是当前状态下智能体会表现出的行动。 例如,在游戏pong(类似于打乒乓球)中, 一个简单的策略是: 如果这个球以一定的角度移动,那末最好的行动是对应这个角度移动挡板。除了用卷积神经络来评估给定状态下的最好的策略,我们也用到相同的络根据给定状态来评估价值或预测长时间的嘉奖 。

  首先,我们会用Gym定义我们的环境

  在让Agent学习之前,我们看这个是观察一个随机挑选的Agent的基准,很明显我们还有很多需要学习的地方。

  图 2.随机代理, Justin Francis提供

  设置我们的学习环境

  强化学习被认为是学习中的蒙特卡洛方法,这意味着这个Agent将会在全部行动过程中搜集数据并且在行为结束后开始计算。在我们的例子中,我们将会收集多种行为来训练它。我们将会把我们的环境训练数据初始化为空,然后逐步添加我们的训练数据。

  接下来我们定义一些训练我们的神经络过程中将会用到的超参数。

  Alpha 是我们的学习率, gamma 是奖励折扣率。嘉奖折扣是在给定智能体奖励历史的情况下评估未来可能的嘉奖的一种方法。如果嘉奖折扣率趋向于0,那么Agent只需要关注当前的嘉奖而不需要去斟酌未来的嘉奖。我们可以写一个简单的函数来评估某个行为下的一系列奖励,下面是代码:

  计算嘉奖:

  你可以看到这些高折扣率的,由于后面有大的奖励,中间的大的负奖励就被忽视了。我们还可以给我们的折扣嘉奖添加正规化,来确保我们的嘉奖范围保持在一定范围内。这在解决doom环境中非常重要的。

  给定状态下我们的价值函数会一直将不断地试图接近折扣奖励。

  建立卷积神经络

  下一步,我们将建立卷积神经络来接收状态,然后输出对应动作的可能性和状态值。我们会有三个可以选择的动作:向前、后左和向右。这个近似策略的设置和图象分类器是一样的,但是不同的是输入代表的是一个类的置信度,我们输出会表示一个特定动作的置信度。比较于大的图象分类模型,使用了增强学习,简单的神经络会更好。

  我们会使用convnet ,和之前使用的著名DQN算法是类似的,我们的神经络会输入一个紧缩大小为84X84像素的图象,输出一个16卷积4跨度的8X8内核,跟随32个卷积4跨度的8X8内核,以一个完全连接的256层级的神经元结束。对卷积层,我们会使用 VALID 填充,会极大缩小图象的大小。

  我们的近似策略和我们的值策略,都会使用同样的卷积神经元络去计算他们的值。

  在深度学习中,权重初始化是非常重要的,yers默许会使用glorot uniform intializer,就是我们熟知的xavier初始化,来初始化权重。如果你用了太大的偏差来初始化权重的话,Agent会有有偏差,如果用了太小的偏差表现的极其随机。理想的状况是一开始的表现为随机,然后渐渐改变权重的值去最大化奖励。在增强学习中,这被称为勘探和开采,是由于初始的时候Agent会表现为随机探索环境,然后随着每个的更新他会把可能的行动慢慢朝向能够取得好的奖励的动作去靠。

  计算和提高性能

  现在我们建立了模型,但是我们要怎样让它开始学习呢?解决方法很简单。我们想要改变神经络的权重来提高我们采取动作的置信度,改变多少则是基于如何准确估计我们的价值的基础上。总体上,我们需要最小化我们的损失。

  在TensorFlow上面实现,计算我们的策略损失可以使用 sparse_softmax_cross_entropy 函数。稀疏意味着我们的行动标签是单个整数,而logits是我们终究的未激活的策略输出。这个函数计算了softmax和log 损失。这使得执行的动作的置信度接近1,损失接近0。

  然后,我们将交叉熵损失乘以贴现嘉奖与我们的价值近似值的差值。 我们使用常见的平均误差损失来计算我们的价值损失。然后我们把损失加在一起来计算我们的总损失。

  训练Agent

  我们现在已经准备好去训练Agent了。我们使用当前的状态输入到神经络中,通过调用ltinomial 函数获得我们的动作,然后指定该动作并保留状态,动作和未来的奖励。我们存储新的state2作为我们当前的状态,重复这样的步骤直到该场景的结束。然后我们加上状态,动作和奖励数据到一个新的列表中,然后我们会用这些输入到络中,用于评估批次。

  根据我们的初始权重初始化,我们的Agent终究应该以大约200个训练循环解决环境,平均奖励1200。OpenAI的解决这个环境的标准是在超过100次实验中能获取1000的奖励。允许Agent进一步训练,平均能到达1700,但似乎没有击败这个平均值。这是我的Agent经过1000次训练循环:

  图 3. 1,000遍后,Justin Francis提供

  为了更好的测试Agent的置信度,在给定任意帧图象你需要将状态输入到神经络中并观察输出。这里

  ,当遇到墙的时候,Agent有90%的置信度这个需要采取向右是最好的动作,当接下来的图像在右侧时候,Agent有61%的置信度得到向前是最好的动作。

  图4. 状态比较,Justin Francis提供

  仔细思考一下,你可能会认为,61%的信心似乎是一个明显的好动作,这并不是那末好,那你就是对的了。我怀疑我们的Agent主要是学会了避免墙壁,而且由于Agent只收到幸存的嘉奖,它不是专门试图拿起医药包。随手捡起医药包,使得生存时间更长。在某些方面,我不会认为这个Agent是完全智能的。Agent也几近无视了左转。Agent用了一个简单的策略,它已会自我学习,还挺有效的。

  图 5. 损失和奖励比较,Justin Francis提供

  深入一步

  现在,我希望你理解了策略梯度方法的基础知识。更优的Actor-Critic方法、 A3C 或 PPO,这些都是推动策略梯度方法进步的基石。增强模型不斟酌状态转换,操作值或TD毛病,也可以用于处理信用分配的问题。要解决这些问题,需要多个神经络和更多的智能训练数据。还有很多方式可以用来提高性能,比如调整超参数。通过一些小的修改,你可以使用相同的络去解决更多的Atari游戏问题。去试试吧,看看效果如何!

  (原作者注:这篇文章是由OReilly 和 TensorFlow. See our statement of editorial independence 合作完成。)

  原址:

  原创文章,未经授权禁止转载。详情见转载须知。

白银旅游网
杭州母婴网
武汉体育网
分享到: