无人机送货充电包教包会!TensorFlow复合目标强化学习教程

简介:
本文来自AI新媒体量子位(QbitAI)

本文用到的所有python代码都在GitHub上:
https://github.com/awjuliani/dfp

强化学习(Reinforcment Learning,RL)的主要内容就是不断训练agent完成任务,我们认为这会让agent学会做这件事情。

举例来说,假如我们希望训练一个会开门的机器人,或者叫agent,以强化学习为框架,就可以让机器人在不断试错中学会开门。

但如果我们希望agent能够完成多个目标,比如说完成的目标需要随着时间变化而改变,那需要怎么做呢?

在这篇文章中,结合Github上补充的材料,我将会以无人机送货为例(在这个场景中,无人机即为RL问题中的agent),首先研究一个传统强化学习能够解决的问题,随后将该问题进行拓展,并在之前的基础上提出新的解决方案。

首先我会讲述如何搭建一个简单的Q-learning agent,此时无人机这个agent在单一奖励信号的引导下进行移动,从而完成包裹的配送。随后我会讲到,这些简单的设计将会无法面对更复杂的情况,比如说没有考虑无人机充电的问题。

为了达到更大的灵活性,我将会讲述怎样用强化学习去搭建一类agents,从而在“直接特征预测(direct feature prediction,DFP)”的多目标场景下进行优化。

文中所涉及的代码都可从TensorFlow主页(https://www.tensorflow.org)和这里的iPython Jupyter Notebook(https://github.com/awjuliani/dfp)上获取。

Q-learning:为了最大的累积奖励

强化学习涉及到agent在某种环境中互动,从而随着时间推移获得最大的奖励。这个过程往往以如下形式进行:一个agent从环境中接收到状态s,进而产生一个行动a。对于给定的“状态s-行动a”对,环境会接着给agent提供一个新的状态s’和一个奖励r。强化学习需要解决的问题就是发现从状态到行动的映射,保证能够产生最大累积奖励。

Q-learning是用来解决这类问题的一种方法,它能够求出“状态-行动”对(s,a)与价值的估计值v之间的直接关系。这个估计值应与在状态s下采取行动a所得到的期望折扣奖励相对应。结合贝尔曼方程(Bellman equation),我们可以通过迭代得出所有可能的“状态-行动”对的Q估计值 Q(s,a)。这种Q值迭代的方法来自于优化Q方程的以下性质:

640?wx_fmt=png&wxfrom=5&wx_lazy=1

上式代表对于给定的状态和行动,其现在的Q值可以分解为现在的奖励和下一个状态的期望折扣奖励的和。通过收集经验,我们能够训练神经网络随着时间积累去更加精确地预测Q值,随后通过采取具有最佳期望值的行动,理论上就能从环境中得到最大的累积奖励值。

使用一个诸如神经网络的全局功能近似器,我们能对未发生的状态归纳出其Q估计值,从而使我们能够了解在任意大的状态空间下的Q方程。

无人机送货&基于目标的强化学习

Q-learning和其他传统的强化学习算法都采用单一奖励信号,因此也只能完成单一目标。就拿无人机在城市里学习送货来说,这会作为我们之后讨论基于目标的强化学习方法的范例。

在我们设置的环境中,agent将占据5*5方格栏中的一个位置,然后目的地在另外一个位置,这个agent可以在上下左右四个方向上随意移动。如果我们希望无人机能够学会运送货物,我们通常会在无人机成功飞到标记地点、完成送货时,提供一个+1的正向奖励。

640?wx_fmt=png&wxfrom=5&wx_lazy=1

 无人机送货的环境示意图,绿色图标代表目的地,黑色图标代表无人机,二者均在5*5的网格中占据着1格。作者:Arthur Juliani

上图展示了我们agent的学习内容和环境,我们将会使用5*5的RGB网格(共有75种可能)这样一个更简单的形式来表示环境。这会把学习所需要的时间从小时量级降到分钟量级(在现代台式机的配置下)。每个training episode中agent可以移动100步,在每个episode开始前会随机分配agent和目的地的位置。

使用TensorFlow实践Q-learning

以下所示的是用TensorFlow执行的Q-learning算法的异步版本,即通过同时运行多个agent来学习策略,这能在加速训练过程的同时增加稳定性。具体的实现过程见:https://github.com/awjuliani/dfp/blob/master/Async-Q.ipynb

我们在一台机器上训练四个worker,在每个worker经历过6,000个training episode后,我们得到了一个类似下图的性能曲线。

640?wx_fmt=png&wxfrom=5&wx_lazy=1

 训练过程中agent的性能曲线,四条平滑曲线代表四个worker在training episode中完成投递的数量随着training episode数量的变化。作者:Arthur Juliani

我们的agent能够在每个episode中完成20次投递,这个值可以被认作是在当前场景下的单个episode中最大可能投递数。

0?wx_fmt=gif&wxfrom=5&wx_lazy=1

直接特征预测

因为电池容量有限、需要经常充电,真实世界中的无人机并不能一直运送包裹。 无人机的每一步行动都会消耗电池中的一部分电量,而一旦电量用完,就意味着无人机将会从空中坠落,无法继续送货,在程序中即象征着没有更多的奖励。

我们可以在环境中增加一个agent可以前往充电的地点。现在所有agent需要做的就是学会在低电量的情况下去充电站充电,在其他情况下正常配送包裹。

建立一个优化的奖励函数

在时间充足、超参数经过恰当调优的情况下,Q-learning算法最终能够发现,适时进行充电在长期来看是有助于配送更多包裹的。

这样,agent就学会了在没有短期奖励的情况下,采用一系列复杂的行动,从而获得长期更大的奖励。

在这种情境下,设置一个奖励信号用来鼓励无人机进行充电乍看起来好像不错。一个naïve的想法就是当无人机飞向特定地点充电时提供一个奖励(比如说+0.5)。但在这种情况下,我们的agent将学会的行为就只会是不停地飞向充电站,因为那里肯定有奖励。

而我们需要做的,是构造出一个描述最优化行为的奖励函数,这个过程对一些问题来说是很简单的,因为不恰当的奖励函数通常会导致agent出乎意料的行为。

改变目标

如果希望避免由不正确奖励函数导致的错误,我们就需要将任务形式以更直观的方式转述给agent。

我们发现,基于episode和特定时刻提供给agent一个明确的目标,能够更好地优化agent的行为。

比如说针对这个充电的问题,我们可以在无人机电量低于一个阈值的时候将行动目标从“配送包裹”改为“去充电”。这样,我们就不用担心奖励函数的形式,而且神经网络也可以专心学习环境的动态变化。

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

 考虑充电问题的无人机配送情景。作者:Arthur Juliani

将寻找目标的任务形式化

为了让这个概念便于使用,我们需要对上述描述采用更正式的说法。

在强化学习中有多种方式可以实现目标寻找,我接下来将要介绍的一种方法来自今年ICLR会议上的一篇paper:Learning Act by Predicting the Future(https://arxiv.org/pdf/1611.01779.pdf),这正是我们准备训练我们的agent做的事情。

首先需要说明,文中展示的模型并不是论文结果的直接应用。在论文中,他们把他们的网络称作“直接特征预测(direct feature predicton,DFP)”。而我们所做的是类似DFP的一个简化版本。我做了一些调整,从而使例子更直观。

在原始论文中,作者训练他们的agent在第一人称射击游戏“Doom”中进行对抗,令人印象深刻,但是对于本文来说难度太大了,因此我就不进一步引述。

640?wx_fmt=png&wxfrom=5&wx_lazy=1

 DFP网络结构示意图
来源:Dosovitskiy and Koltun等的论文Learning Act by Predicting the Future

与一般训练agent的过程不同,我们不是去建立状态s和Q值估计值Q(s,a)之间的映射,然后从环境中获得一个奖励r,而是对状态s增加了一系列测量值m和目标g,然后训练网络对每个行动a去预测未来测量值的改变f。

训练网络预测未来的期望

在无人机送货的场景中,我们将会用到的两个测量值:电池电量和成功配送的包裹数。

与在Q-learning中预测一个值函数不同,我们训练网络去预测在未来的1,2,4,8,16和32步移动后电池的电量和配送的包裹数。形式上这可以写成:

640?wx_fmt=png&wxfrom=5&wx_lazy=1

这里T代表时间偏移量的列表,即[1,2,4…etc.],表示agent移动的步数。

在这个例子中,不再有明确的奖励,取而代之的是用目标和测量值的匹配程度作为成功的衡量。在这个无人机配送的例子中,具体的含义就是要最大化送货量,同时保证低电量时给电池充电。

如果我们的agent能够完美地预测未来每一步的测量值,我们就只需采用能使测量值最优化的行动策略。我们的目标允许我们在任意时间下指定在意的测量值。

对更复杂目标的规划

因为我们并不是像Q-learning中那样简单地预测一个标量的估计值,就可以对更复杂的目标进行规划。

假设我们构造一个测量值矢量[电量,配送数],如果我们希望最大化电池电量的同时忽略配送数,那么我们的目标就是[1,0],即意味着希望未来有一个正向的电量测量值同时忽略配送数。如果我们希望最大化包裹的配送数,那么目标就将是[0,1]。

目标是由我们制定的,而不是由环境或者网络决定的,因此在任何合适的时间步我们都可以改变它。

这样,我们就可以在电量低于一个阈值的时候(在本例中是30%),把目标从“最大化配送数”改为“最大化电量”。通过将目标和测量值以这种方式结合,我们现在可以灵活地调整agent在飞行过程中的行为。

这种做法与Q-learning是相冲突的,在Q-learning中Q值在训练后保持不变,因此只会有一种行为模式。

同时,这个新模式从多个方面改变了我们的神经网络。现在,网络的输入不再是状态s,而是测量值和目标;之前是输出Q值,现在我们网络的输出是一个形式为[测量值×行动×偏移]的预测张量。将总计预测未来改变和目标相乘,可以选择出随着时间变化能更好满足目标的行动:

640?wx_fmt=png&wxfrom=5&wx_lazy=1

这里∑p(s,m,g)表示网络随未来时序的总和,gT是目标矢量的转置。

我们可使用简单衰退损失来训练agent预测未来真实测量值的变化:

640?wx_fmt=png&wxfrom=5&wx_lazy=1

其中P(s,m,g,a)代表对于选定的行动网络的输出结果。

当把这些结合起来时,我们就得到了一个符合要求的agent。随后我们将会在TensorFlow下使用异步实现进行训练,相关代码地址如下:
https://github.com/awjuliani/dfp/blob/master/DFP.ipynb

使用TensorFlow完成异步实现

在4个worker分别经历了10,000个训练episodes之后,我们的训练曲线如下图所示。

640?wx_fmt=png&wxfrom=5&wx_lazy=1

 包裹的配送数(左)以及每个episode中无人机移动的步数(右)随着无人机的变化。作者:Arthur Juliani

从每个episode中,无人机移动的步数不断接近100步,可以看出agent已经学会了在按照最优化路径运送货物的同时给自己充电。

0?wx_fmt=gif&wxfrom=5&wx_lazy=1

需要注意的是,这里用的环境是从现实世界中的场景大幅简化得来的。这种格栏的世界是为了让让网络在较短的时间内完成训练、展示结果。而在真实复杂的场景中,无人机应会采用平滑连续的移动模式。

进一步推动这项技术

如果你可以使用更强大的计算资源,最好在OpenAI universe(https://universe.openai.com)中提供的这些更复杂的环境下尝试这项技术。

一个简单的改进就是把这里的全连接层改为卷积层从而提供一个更好的视频流编码器。而基础的结构应该是可拓展的。

我希望这篇教程为你提供了一些思路,比如说这类复合任务的问题可以通过在不同场景下设置不同目标的方式,从而用强化学习来完成。

这种设置多个目标的方法可能在很多情况下并不是最优解,但它能为实际中复杂任务的解决提供了一种新的思路。

这份教程由O’reilly和TensorFlow合作发表,作者Arthur Juliani在目前是俄勒冈大学博士生,在认知神经科学和深度学习的交叉领域进行研究。

原文地址:https://www.oreilly.com/ideas/reinforcement-learning-for-complex-goals-using-tensorflow

—— ——

本文作者:王瀚宸
原文发布时间:2017-08-12 
相关文章
|
4月前
|
机器学习/深度学习 存储 人工智能
TensorFlow 强化学习:6~10
TensorFlow 强化学习:6~10
77 0
|
4月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
TensorFlow 强化学习:1~5
TensorFlow 强化学习:1~5
58 0
|
4月前
|
机器学习/深度学习 自然语言处理 算法
TensorFlow 强化学习:11~15
TensorFlow 强化学习:11~15
77 0
|
7月前
|
机器学习/深度学习 PyTorch TensorFlow
深度学习框架教程:介绍一些流行的深度学习框架 (如TensorFlow、PyTorch等)
深度学习框架教程:介绍一些流行的深度学习框架 (如TensorFlow、PyTorch等)
80 0
|
9月前
|
XML TensorFlow API
TensorFlow Object Detection API 超详细教程和踩坑过程
TensorFlow Object Detection API 超详细教程和踩坑过程
133 1
|
机器学习/深度学习 Linux TensorFlow
基于TensorFlow训练的人脸识别神经网络 毕业设计完整教程
基于TensorFlow训练的人脸识别神经网络 毕业设计完整教程
200 0
|
机器学习/深度学习 PyTorch TensorFlow
史上最全深度学习环境配置教程---适用于各种深度学习框架---Pytorh TensorFlow Keras-等和各种python环境(三)
史上最全深度学习环境配置教程---适用于各种深度学习框架---Pytorh TensorFlow Keras-等和各种python环境(三)
史上最全深度学习环境配置教程---适用于各种深度学习框架---Pytorh TensorFlow Keras-等和各种python环境(三)
|
机器学习/深度学习 TensorFlow 算法框架/工具
史上最全深度学习环境配置教程---适用于各种深度学习框架---Pytorh TensorFlow Keras-等和各种python环境(二)
史上最全深度学习环境配置教程---适用于各种深度学习框架---Pytorh TensorFlow Keras-等和各种python环境(二)
史上最全深度学习环境配置教程---适用于各种深度学习框架---Pytorh TensorFlow Keras-等和各种python环境(二)
|
机器学习/深度学习 Web App开发 IDE
史上最全深度学习环境配置教程---适用于各种深度学习框架---Pytorh TensorFlow Keras-等和各种python环境(一)
史上最全深度学习环境配置教程---适用于各种深度学习框架---Pytorh TensorFlow Keras-等和各种python环境(一)
史上最全深度学习环境配置教程---适用于各种深度学习框架---Pytorh TensorFlow Keras-等和各种python环境(一)
|
机器学习/深度学习 人工智能 数据可视化
斯坦福tensorflow教程(八) 计算机视觉和卷积网络简介
斯坦福tensorflow教程(八) 计算机视觉和卷积网络简介
126 0
斯坦福tensorflow教程(八) 计算机视觉和卷积网络简介

热门文章

最新文章