欢迎来到机器学习工程师纳米学位的第四个项目!在这个notebook文件中,模板代码已经提供给你,有助于你对智能出租车的分析和实现学习算法。你无须改动已包含的代码,除非另有要求。 你须要回答notebook文件中给出的与项目或可视化相关的问题。每个你要回答的问题前都会冠以'问题 X'。仔细阅读每一个问题,并在后面'回答'文本框内给出完整的回答。你提交的项目会根据你对于每一个问题的回答以及提交的agent.py
的实现来进行评分。javascript
提示: Code 和 Markdown 单元格可经过 Shift + Enter 快捷键来执行。此外,Markdown能够经过双击进入编辑模式。css
在这个项目中,你将构建一个优化的Q-Learning驾驶代理程序,它会操纵智能出租车 经过它的周边环境到达目的地。由于人们指望智能出租车要将乘客从一个地方载到另外一个地方,驾驶代理程序会以两个很是重要的指标来评价:安全性和可靠性。驾驶代理程序在红灯亮时仍然让智能出租车行驶往目的地或者勉强避开事故会被认为是不安全的。相似的,驾驶代理程序频繁地不能适时地到达目的地会被认为不可靠。最大化驾驶代理程序的安全性和可靠性保证了智能出租车会在交通行业得到长期的地位。html
安全性和可靠性用字母等级来评估,以下:html5
等级 | 安全性 | 可靠性 |
---|---|---|
A+ | 代理程序没有任何妨害交通的行为, 而且老是能选择正确的行动。 |
代理程序在合理时间内到达目的地的次数 占行驶次数的100%。 |
A | 代理程序有不多的轻微妨害交通的行为, 如绿灯时未能移动。 |
代理程序在合理时间内到达目的地的次数 占行驶次数的90%。 |
B | 代理程序频繁地有轻微妨害交通行为, 如绿灯时未能移动。 |
代理程序在合理时间内到达目的地的次数 占行驶次数的80%。 |
C | 代理程序有至少一次重大的妨害交通行为, 如闯红灯。 |
代理程序在合理时间内到达目的地的次数 占行驶次数的70%。 |
D | 代理程序形成了至少一次轻微事故, 如绿灯时在对面有车辆状况下左转。 |
代理程序在合理时间内到达目的地的次数 占行驶次数的60%。 |
F | 代理程序形成了至少一次重大事故, 若有交叉车流时闯红灯。 |
代理程序在合理时间内到达目的地的次数 未能达到行驶次数的60%。 |
为了协助评估这些重要的指标,你会须要加载可视化模块的代码,会在以后的项目中用到。运行下面的代码格来导入这个代码,你的分析中会须要它。java
# 检查你的Python版本
from sys import version_info
if version_info.major != 2 and version_info.minor != 7:
raise Exception('请使用Python 2.7来完成此项目')
# Import the visualization code
import visuals as vs
# Pretty display for notebooks
%matplotlib inline
在开始实现你的驾驶代理程序前,首先须要了解智能出租车和驾驶代理程序运行的这个世界(环境)。构建自我学习的代理程序重要的组成部分之一就是了解代理程序的特征,包括代理程序如何运做。原样直接运行agent.py
代理程序的代码,不须要作任何额外的修改。让结果模拟运行一段时间,以观察各个不一样的工做模块。注意在可视化模拟程序(若是启用了),白色车辆就是智能出租车。python
用几句话,描述在运行默认的agent.py
代理程序中,你在模拟程序里观察到了什么。一些你能够考虑的状况:jquery
提示: 从顶层的/smartcab/
目录(这个notebook所在的地方),运行命令linux
'python smartcab/agent.py'
回答:android
1.从启动的pygame window中能够看出白色车辆没有移动css3
2.奖励一会正一会负,Agent properly idled at a red light时,奖励为正,Agent idled at a green light with no oncoming traffic时,奖励为负。
3.因为车未动,当交通灯为红时,符合交通规则,为正奖励,交通灯变为绿时,而且迎面没有车驶来,此时中止不动,不符合交通规则,为负奖励
除了要了解世界以外,还须要理解掌管世界、模拟程序等等如何运做的代码自己。若是一点也不去探索一下“隐藏”的器件,就试着去建立一个驾驶代理程序会很难。在顶层的/smartcab/
的目录下,有两个文件夹:/logs/
(以后会用到)和/smartcab/
。打开/smartcab/
文件夹,探索每一个下面的Python文件,而后回答下面的问题。
agent.py
Python文件里,选择 3 个能够设定的 flag,并描述他们如何改变模拟程序的。environment.py
Python文件里,当代理程序执行一个行动时,调用哪一个Environment类的函数?simulator.py
Python 文件里,'render_text()'
函数和'render()'
函数之间的区别是什么?planner.py
Python文件里,'next_waypoint()
函数会先考虑南北方向仍是东西方向?回答:
agent.py
1.learning
设置为True
,强制驱动代理使用Q-learning。
2.enforce_deadline
设置为True
,以执行最后期限度量。
3.num_dummies
环境中其余车子数
environment.py
1.act函数
simulator.py
1.render_text()
使agent运行时在终端中显示日志信息 2.render()
则是将agent的状态显示与pygame窗口
planner.py
1.东西
建立一个优化Q-Learning的驾驶代理程序的第一步,是让代理程序确实地执行有效的行动。在这个状况下,一个有效的行动是None
(不作任何行动)、'Left'
(左转)、'Right'
(右转)或者'Forward'
(前进)。做为你的第一个实现,到'choose_action()'
代理程序函数,使驾驶代理程序随机选择其中的一个动做。注意你会访问到几个类的成员变量,它们有助于你编写这个功能,好比'self.learning'
和'self.valid_actions'
。实现后,运行几回代理程序文件和模拟程序来确认你的驾驶代理程序每步都执行随机的动做。
要从最初的模拟程序得到结果,你须要调整下面的标志:
'enforce_deadline'
- 将此标志设定为True
来强制驾驶代理程序捕获它是否在合理时间内到达目的地。'update_delay'
- 将此标志设定为较小数值(好比0.01
)来减小每次试验中每步之间的时间。'log_metrics'
- 将此标志设定为True
将模拟结果记录为在/logs/
目录下的.csv
文件。'n_test'
- 将此标志设定为'10'
则执行10次测试试验。可选的,你还能够经过将'display'
标志设定为False
来禁用可视化模拟(可使得试验跑得更快)。调试时,设定的标志会返回到他们的默认设定。重要的是要理解每一个标志以及它们如何影响到模拟。
你成功完成了最初的模拟后(有20个训练试验和10个测试试验),运行下面的代码单元格来使结果可视化。注意运行一样的模拟时,日志文件会被覆写,因此留意被载入的日志文件!在 projects/smartcab 下运行 agent.py 文件。
# Load the 'sim_no-learning' log file from the initial simulation results
vs.plot_trials('sim_no-learning.csv')
利用上面的从你初始模拟中获得的可视化结果,给出关于驾驶代理程序的分析和若干观察。确保对于可视化结果上的每一个面板你至少给出一条观察结果。你能够考虑的一些状况:
答案:
major violation在0.2左右,minor violation在0.1左右,其余两个各0.05左右,Total Bad Actions = Major Voilation + Minor Voilation + Major Accident + Minor Accident=0.4
合理,随机驾驶安全性和到达目的地几率低
得到了负奖励,为-5左右,代表它受到了惩罚
随着实验数增长,输出结果没有大变化
不安全,由于事故率高,不可靠,由于没有到达目的地
建立一个优化Q-Learning的驾驶代理程序的第二步,是定义一系列代理程序会在环境中发生的状态。根据输入、感知数据和驾驶代理程序可用的变量,能够为代理程序定义一系列状态,使它最终能够学习在一个状态下它须要执行哪一个动做。对于每一个状态的'若是这个处于这个状态就那个行动'
的情况称为策略,就是最终驾驶代理程序要学习的。没有定义状态,驾驶代理程序就不会明白哪一个动做是最优的——或者甚至不会明白它要关注哪一个环境变量和条件!
查看'build_state()'
代理程序函数,它显示驾驶代理函数能够从环境中得到下列数据:
'waypoint'
,智能出租车去向目的地应该行驶的方向,它是智能出租车车头方向的相对值。'inputs'
,智能出租车的感知器数据。它包括
'light'
,交通灯颜色。'left'
,智能出租车左侧车辆的目的方向。若是没有车辆,则返回None
。'right'
,智能出租车右侧车辆的目的方向。若是没有车辆,则返回None
。'oncoming'
,智能出租车交叉方向车辆的目的方向。若是没有车辆,则返回None
。'deadline'
,智能出租车在时间以内到达目的地还所需的剩余动做数目。代理程序的哪些可用特征与学习安全性和效率相关性最高?你为何认为这些特征适合在环境中对智能出租车建模?若是你没有选择某些特征,放弃他们的缘由是什么?
回答:
1.安全性考虑:inputs-智能出租车的感知器数据,包括交通灯颜色和附近是否有车辆行驶,若不考虑,则会发生事故。
2.可靠性考虑:waypoint-行驶方向,若不考虑,智能出租车不能到达目的地。
3.放弃deadline,首先这个时效性地信息是没有意义的,由于在每次训练过程当中,起点、终点在随机变更,因此用它训练出来的Q表在不一样的环境下不具有泛化性,使用它反而会模糊小车的行动。(deadline在每次训练时候,值的分布都不一样,那么必定程度上会干扰训练成果)。其次,它的值是5倍的小车与终点的曼哈顿距离,大概会将状态空间增长14倍(由于默认的地图尺寸是 6*8,1~6+8,共有14个取值),大幅增长状态空间的大小,致使小车很难训练。最后,这个deadline
还有某种 “急于求成” 的意思,即使有意义,也会过度追求时间效率——而这一特征和安全性在某种程度上存在对立关系,也会引入必定的问题。
经过运行代码对比发现加入deadline随着试验次数的增长会增长事故率。以下图加入deadline后可视化结果。
# Load the 'sim_no-learning-deadline' log file from the initial simulation results
vs.plot_trials('sim_no-learning-deadline.csv')
当定义一系列代理程序会处于的状态,必需考虑状态空间的大小。就是说,若是你指望驾驶代理程序针对每一个状态都学习一个策略,你会须要对于每个代理状态都有一个最优的动做。若是全部可能状态的数量很是大,最后会变成这样的情况,驾驶代理程序对于某些状态学不到如何行动,会致使未学习过的决策。例如,考虑用下面的特征定义智能出租车的状态的状况:
('is_raining', 'is_foggy', 'is_red_light', 'turn_left', 'no_traffic', 'previous_turn_left', 'time_of_day')
. 发生如(False, True, True, True, False, False, '3AM')
的状态的频次如何?没有近乎无限数量的训练,很怀疑代理程序会学到一个合适的动做!
若是用你在问题4中选择的特征来定义一个状态,状态空间的大小是多少?假定你了解环境以及它是如何模拟的,你以为通过合理数量的训练以后,代理驾驶能学到一个较好的策略吗?(碰见绝大部分状态都能做出正确决策。) 提示: 考虑特征组合来计算状态的总数!
回答:
waypoint的状态:farword、left、right(3个),waypoint的状态来判断到达目的地的方向,若为None,则说明已经到达目的地。因此只有三个状态
inputs:
light的状态:red、green(2个)
left的状态:None、forward、left、right(4个)
right的状态:None、forward、left、right(4个)
oncoming的状态:None、forward、left、right(4个)
状态空间大小:3×2×4×4×4 = 384
因为状态空间不是很大,agent能在合理数量训练后学得策略
刻意的选择列表中第一个最大的,就会致使agent缺乏探索精神。相同最大值action随机更能训练出好的模型。由于应当的状况更多了
要完成你的第二个实现,去到'build_state()'
代理程序函数。根据你在问题4给出的判断,你如今要将'state'
变量设定为包含全部Q-Learning所需特征的元组。确认你的驾驶代理程序经过运行代理程序文件和模拟会更新它的状态,注意状态是否显示了。若是用了可视化模拟,确认更新的状态和在模拟程序里看到的一致。
注意: 观察时记住重置模拟程序的标志到默认设定!
建立一个优化Q-Learning的驾驶代理程序的第三步,是开始实现Q-Learning自身的功能。Q-Learning的概念至关直接:每一个访问的状态,为全部可用的状态-行动配对在Q-table里建立一条记录。而后,当代理程序遇到一个状态并执行了一个动做,基于得到的奖励和设定的相互的更新规则,来更新关联的状态-动做配对的Q-value。固然,Q-Learning还带来其余的收益,如此咱们可让代理程序根据每一个可能的状态-动做配对的Q-values,来为每一个状态选择最佳动做。在这个项目里,你会实现一个衰减 $\epsilon$ -贪心 的Q-learning算法,不含折扣因子。听从每一个代理程序函数的TODO下的实现指导。
注意代理程序的属性self.Q
是一个字典:这就是Q-table的构成。每一个状态是self.Q
字典的键,每一个值是另外一个字典,包含了action和Q-value。这里是个样例:
{ 'state-1': { 'action-1' : Qvalue-1, 'action-2' : Qvalue-2, ... }, 'state-2': { 'action-1' : Qvalue-1, ... }, ... }
此外,注意你要求利用一个衰减$\epsilon$(探索)因子。所以,随着试验的增长,$\epsilon$会向0减少。这是由于,代理程序会从它的行为中学习,而后根据习得的行为行动。并且当$\epsilon$达到特定阈值后(默认阈值为0.01),代理程序被以它所学到的东西来做检测。做为初始的Q-Learning实现,你将实现一个线性衰减$\epsilon$的函数。
要从最初的Q-learning程序得到结果,你须要调整下面的标志和设置:
'enforce_deadline'
- 将此标志设定为True
来强制驾驶代理程序捕获它是否在合理时间内到达目的地。'update_delay'
- 将此标志设定为较小数值(好比0.01
)来减小每次试验中每步之间的时间。'log_metrics'
- 将此标志设定为True
将模拟结果记录为在/logs/
目录下的.csv
文件,Q-table存为.txt
文件。'n_test'
- 将此标志设定为'10'
则执行10次测试试验。'learning'
- 将此标志设定为'True'
来告诉驾驶代理使用你的Q-Learning实现。此外,使用下面的$\epsilon$衰减函数:
$$ \epsilon_{t+1} = \epsilon_{t} - 0.05, \hspace{10px}\textrm{for trial number } t$$
若是你在实施时遇到困难,尝试把'verbose'
标志设为True
来调试。调试时,在这里设定的标志会返回到它们的默认设定。重要的是你要理解每一个标志作什么而且解释它们怎么影响模拟!
当你成功完成初始的Q-Learning模拟程序后,运行下面代码单元格来使结果可视化。注意当相同的模拟运行时,log文件会被覆写,因此要留意载入的log文件!
# Load the 'sim_default-learning' file from the default Q-Learning simulation
vs.plot_trials('sim_default-learning.csv')
利用上面的从你默认的Q-Learning模拟中获得的可视化结果,像在问题3那样,给出关于驾驶代理程序的分析和若干观察。注意模拟程序应该也产生了Q-table存在一个文本文件中,能够帮到你观察代理程序的算法。你能够考虑的一些状况:
回答:
类似之处,随机探索action
20次,由于衰减函数1 - 0.05t,每次epsilon衰减0.05,20次训练正好就能够从1降低到0
是,图中探索率(Exploration factor)随实验次数(Trial Number)的增长,直线降低
随着试验次数增长,Total Bad actions呈现降低趋势,Reward per Action是增长的。
很低
建立一个优化Q-Learning的驾驶代理程序的第三步,是执行优化!如今Q-Learning算法已经实现而且驾驶代理程序已经成功学习了,须要调整设定、调节参数让驾驶代理程序学习安全性和效率。一般这一步须要不少试验和错误,由于某些设定一定会形成更糟糕的学习。要记住的一件事是学习的行为自己和须要的时间:理论上,咱们能够容许代理程序用很是很是长的时间来学习;然而,Q-Learning另外一个目的是将没有习得行为的试验试验变为有习得行为的行动。例如,训练中总让代理程序执行随机动做(若是$\epsilon = 1$而且永不衰减)固然可使它学习,可是不会让它行动。当改进你的Q-Learning实现时,要考虑作一个特定的调整的意义,以及它是否逻辑上是否合理。
要从最初的Q-learning程序得到结果,你须要调整下面的标志和设置:
'enforce_deadline'
- 将此标志设定为True
来强制驾驶代理程序捕获它是否在合理时间内到达目的地。'update_delay'
- 将此标志设定为较小数值(好比0.01
)来减小每次试验中每步之间的时间。'log_metrics'
- 将此标志设定为True
将模拟结果记录为在/logs/
目录下的.csv
文件,Q-table存为.txt
文件。'learning'
- 将此标志设定为'True'
来告诉驾驶代理使用你的Q-Learning实现。'optimized'
- 将此标志设定为'True'
来告诉驾驶代理你在执行一个优化版本的Q-Learning实现。优化Q-Learning代理程序能够调整的额外的标志:
'n_test'
- 将此标志设定为某个正数(以前是10)来执行那么屡次测试试验。'alpha'
- 将此标志设定为0 - 1之间的实数来调整Q-Learning算法的学习率。'epsilon'
- 将此标志设定为0 - 1之间的实数来调整Q-Learning算法的起始探索因子。'tolerance'
- 将此标志设定为某个较小的大于0的值(默认是0.05)来设定测试的epsilon阈值。此外,使用一个你选择的$\epsilon$ (探索因子)衰减函数。注意不管你用哪一个函数,必定要以合理的速率衰减到'tolerance'
。Q-Learning代理程序到此才能够开始测试。某个衰减函数的例子($t$是试验的数目):
$$ \epsilon = a^t, \textrm{for } 0 < a < 1 \hspace{50px}\epsilon = \frac{1}{t^2}\hspace{50px}\epsilon = e^{-at}, \textrm{for } 0 < a < 1 \hspace{50px} \epsilon = \cos(at), \textrm{for } 0 < a < 1$$
若是你想的话,你也可使用$\alpha$ (学习率) 的衰减函数,固然这一般比较少见。若是你这么作了,确保它知足不等式$0 \leq \alpha \leq 1$。 若是你在实施时遇到困难,尝试把'verbose'
标志设为True
来调试。调试时,在这里设定的标志会返回到它们的默认设定。重要的是你要理解每一个标志作什么而且解释它们怎么影响模拟!
当你成功完成初始的Q-Learning模拟程序后,运行下面代码单元格来使结果可视化,请注意为了达到项目要求你须要在安全性和可靠性上得到至少都为A的评分。注意当相同的模拟运行时,log文件会被覆写,因此要留意载入的log文件!
# Load the 'sim_improved-learning' file from the improved Q-Learning simulation
vs.plot_trials('sim_improved-learning.csv')
# Load the 'sim_improved-learning' file from the improved Q-Learning simulation
vs.plot_trials('sim_improved-learning.csv')
利用上面的从你改进的Q-Learning模拟中获得的可视化结果,像在问题6那样,给出关于改进的驾驶代理程序的最终分析和观察。你须要回答的问题:
回答:
使用了ϵ=0.995的t次方,这个指数函数epsilon是单调变化的,随着试验数目t的增长而减小的。
测试以前大概须要1200次训练
tolerance = 0.001和alpha为默认值0.5,tolerance下降有助于提升训练次数,训练的次数足够多将各类状态遇到基本就能够达到较好的训练效果,alpha平衡了已有经验和新的探索对智能车行动的影响。epsilon的几率进行探索,起始值取1,是为了刚开始让其大胆尝试新的事物,随着试验次数增长,ε探索减小,而从前面学到的经验中学习更多。
安全性和可靠性有所提升
成功学习到一个合适的策略
满意
有时,对于重要的问题“我要让个人代理程序学习什么?”的答案,只是理论性的,没法具体描述。然而这里,你能够具体定义代理程序要学什么,就是美国通行权交通法案。这些法律是已知信息,你能够基于这些法律,为智能出租车进一步定义每个状态所作的最优动做。在那种状况下,咱们称这一系列最优状态-动做配对为最优策略。所以,不像那些理论性的回答,不只经过收到的奖励(惩罚),并且纯观察,代理程序是否在“错误”地行动能很清晰地得知。若是代理程序闯了红灯,咱们既看见它得到了一个负面奖励,也知道这是一个错误的行为。这能够用来帮你验证驾驶代理程序习得的策略是否正确,或只是个次优策略。
给出几个关于最优策略是什么样子的例子(用你已定义的状态)。以后,查看'sim_improved-learning.txt'
文本文件,看你的改进的Q-Learning算法的结果。_每一个从模拟中纪录的状态,对于给定的状态,策略(得分最高的动做)是否正确?是否对于有些状态,有策略不一样于预期的最优策略?_给出一个状态和记录的状态-动做的奖励,解释为何正是个正确的策略。
回答:
sim_improved-learning.txt(对应状态:目标,灯,对面,左,右)
('left', 'red', None, 'forward', 'forward')
-- forward : -37.36
-- None : 1.70
-- right : -14.77
-- left : -19.75
上面显示应该左转,当前为红灯,对面车是None,左边车是前行的,右边车是前行的,因为是红灯且要左转,因此最佳策略为None,算法也是None为正,奖励最大,红灯是不能够左转的,不然违反交通规则,右转不违反交通规则,因此right为负奖励,但比left高。
2.('forward', 'red', None, None, 'left')
-- forward : -10.33
-- None : 1.86
-- right : 0.98
-- left : -9.50
上面显示当前应该前行,可是为红灯,对面车是None,左车是None,右车是左转,因此最佳策略为None,算法也是None为正,且最大,右转是不违反交通规则的,虽然不符合预期,可是不会出事故,因此权值为正数且小于None为0.98,直行和左转都是违反交通规则的,因此都是负数
3.('forward', 'red', 'right', None, None)
-- forward : -10.07
-- None : 2.25
-- right : 0.65
-- left : -37.40
上面显示当前应该直行,灯为红色,对面车是右转,左车是None,右车是None,因为迎面车有车右转,若再直行则发生事故,红灯右转不违反交通规则,因此奖励为正仅次于None,因此最佳策略为None,算法也是None为正,且奖励最高
'gamma'
¶也许你会好奇,做为Q-Learning算法的一部分,以前要求你在实现中不要使用折扣引子'gamma'
。在算法中包含将来奖励能有助于在将来状态回溯到当前状态时的反向正面奖励。本质上,若是给予驾驶代理程序执行若干动做到达不一样状态的选择,包含将来奖励会是代理程序偏向能够获得更多奖励的状态。一个例子是驶向目的的驾驶代理程序:全部行动和奖励都相等,那么理论上若是到达目的地会有额外奖励,驶向目的会得到更好的奖励。然而,即便在这个项目里,驾驶代理程序也要在规定的时间里到达目的地,包含将来奖励不会有益于代理程序。实际上,若是代理程序给予屡次试验学习,它甚至会给Q-value带来负面影响!
在项目中有两个特色使得将来奖励在这个Q-Learning算法无效。一个特色是关于智能出租车自己,另外一个是关于环境。你能指出它们是什么以及为何将来奖励不会在这个项目中起效?
回答:
注意:当你写完了全部的代码,而且回答了全部的问题。你就能够把你的 iPython Notebook 导出成 HTML 文件。你能够在菜单栏,这样导出File -> Download as -> HTML (.html)把这个 HTML 和这个 iPython notebook 一块儿作为你的做业提交。
欢迎扫码关注,或搜索大数据与知识图谱,按期分享大数据与知识图谱相关知识点: