开发者学堂课程【深度学习与自动驾驶:深度强化学习-运动规划(3)】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/533/detail/7153
深度强化学习-运动规划(3)
内容介绍:
一、The Game of Traffic
二、ConvNetJS
三、Monaco Editor
四、Web Workers
一、The Game of Traffic
1、Open Question(Again):
Is driving closer to chess or to every day conversation?
驾驶领域,有关强化学习方面的内容,看一下强化学习能涉足智能驾驶领域的哪些方面,这就又回到了昨天它们提出的那个公开的问题,智能驾驶更接近于国际象棋还是人们的日常交谈?国际象棋,意味着它可以通过更简单化的方式被形式化,假如你把它作为一个避障的问题来想,一旦避障问题解决,你只需要为它在有限空间中做出导航,你选择车在车道上左转以及右转,你决定车加速或是减速。假设这是一个更类似于国际象棋的游戏。
2、Deep Traffic : Solving Traffic with Deep Reinforcement Learning
Goal: Achieve the highest average speed over a long period of time.
Requirement for Students: Follow tutorial to achieve a speed of 65mph
和明天相反,今天看一下左侧的内容,看到的是Deep Traffic,这里是这个游戏的模拟。游戏的目的是,在这七个驶满车辆的高速公路车道上,获得你所能达到的最大的平均速度,需要按照指导的要求完成任务,需要做的是建立神经网络让小车达到65英里/小时的速度,有一个排行榜,你点一下按钮就能提交,所有的这些都在浏览器中进行,你当然想要想办法提高自己的名次。
3、The Road,The Car,The Speed
关注一下这个世界,二维交通系统对于智能系统,对于智能系统来说是什么样的,将现实的交通抽象成左边的网络图,这是状态的表现,有七个车道,每个车道都被分块化,如果有一辆车在一块区域内,车的长度大概有3个块,这三个网格,这个红色的车是你要控制的,这
辆车在智能系统中运行,图片的左边显示了红车的当前速度,这个红车的车顶标有MIT,而且还有一个数字显示了你超过了多少车,如果你的网络表现不好,这个数字会变成负数。
4、Simulation Speed
你也可以改变仿真速度,从左边的普通模式到右边的快速模式,快速模式加速了仿真的进行,但左边的普通模式更接近真实的驾驶。
5、Display Options
可以选择不同的显示选项,默认方式只显示道路上的车辆,还有一个学习输入显示选项,整个空间都被你可以选择红车的视野,你可以选择它前后能看到多远,左右能看到多远,因此能够通过选择学习输入,来看到学习输入在仿真中是什么样的。另一种显示选项是安全系统,这是一个自我保护系统,这个游戏的一个设定是所有的车都按照类似的方式行驶,如果你的车具有智能。如果你的车具有自适应巡航控制系统。它依然按照与其它车相似的方式行驶。当它接近前面的车,它不会跑到左边,或者右边,离开车道,因此能够限制红车的行动,在这种运作方式下能够防止你(的车)撞到其它车,否则需要模拟碰撞,模拟会因此变得一片混乱,因此可以保护你不遭受碰撞,你可以用一个可视化框来显示安全系统显示选项,另一种显示选项是将整个图可视化,你可以得到整个占有图,如果你想把这个作为网络的输入,
每个网格在输入中都对应一个数字,并不是0或1来表示对应的网格是否有车,对应的数字是最高限速,80英里每小时,当这个块是空的时候,它被设置为80英里每小时,当块被车占用时,它被设置为车的当前速度,红车点有的块,被设置为一个很大的数,比80英里每小时的最高限速高很多。
6、Safety System
(1)问题:什么是第三个显示选项?
你控制的就是那辆红色的车,红车占有的块被设置为一个非常大的数字,让学习算法知道这些块是非常特殊的,
安全系统。图片中红色的部分,是你不能进入的网格区域。因此,当一些块变成红色的时候,车不能加速进入这些块,当左边或者右边的块变成红色,这意味着你不能改变车道进入左边或者右边,图片的右边这张图中,你没有任何限制,可以进入任何区域,这就是所有块都是黄色时的含义。
7、Driving / Learning
learn = function (state, lastReward)
{
brain. backward( lastReward) ;
var action = brain. forward(state);
return act ion;
}
var noAction = 0 ;
var accelerateAction = 1;
var decelerateAction = 2;
var goLeftAction = 3;
var goRightAction = 4;
安全系统提示你可以采取五个行动中的任意一个,五个行动分别是向左,向右,保持,加速或者减速,这些动作将作为输入,这个行动是由这里调用的 brain 产生的,Brain 将 state,last reward 作为输入,
利用输入来产生和学习,来利用反向函数训练网络,反向传播,然后要求brain基于当前的状态,通过前向达代,前向函数给出下一个动作,并不需要知道这个函数的运作,不需要担心这个,但可以自定义学习步长。
lanesSide=1;
patchesAhead=10;
patchesBehind=0;
网页上只有几行代码,你可以点一下按钮来改变代码,来改变网络的仿直和设计,你不需要任何特殊的硬件,你不需要任何特殊的操作,在指导中会给出所有的步骤,你可以设计一个深度神经网络,这是强化学习agent的一部分,在网页中有一个 DQN agent,你可以选择 landslde (变量名)变量,这个变量控制了你旁边能看到的车道的数量,如果这个变量是 O,你只能向前看,如果这个值是1,你会在左右两边分别看到一个车道,这是感知系统的感知半径,PatchesAhead(变量名)是指你向前能看多远,Pachesbehind (变量名)是指你能向后看多远,
lanesSide=2;
patchesAhead=10;
patchesBehind=0;
举例说明,landside 等于2意味着,它向左看。向右看。很明显,如果向右看,是离开车道,这些块中的值是0,如果将 pachesbehind 变量设为10,它能向后看10个块,从车头的网格开始算。
8、Evaluation
(1)Scoring: Average Speed
(2)Method:
① Collect average speed
② Ten runs, about 30 (simulated) minutes of game each
③ Result: median speed of the 10 runs
(3)Done server side after you submit
(no cheating possible! (we also look at the code ..))
(4)You can try it locally to get an estimate
① Uses exactly the same evaluation procedure/code
② But: some influence of randomness
③ Our number is what counts in the end!
评估这场竞赛的得分,是你预定义的一段时间的平均速度,所以我们所使用的获取速度的方法,是我们运行10次代理,每一次大约是30个模拟分钟,然后我们取十次运行结果的中间车速。这就是我们所讲的得分。这些工作是在服务器端完成的,所以,假设我们已经获取了一些数值,但由于这是在服务器端完成,用JavaScript实现,之后在浏览器中运行,希望是个沙盒,你可以在本地试运行来获取一些估测,有一些标识评估的按钮,它可以即刻给你返回一个,你现在处理的网络有多好的记分。
9、Evaluation (Locally)
这个按钮是:开始评估运行:你按下按钮,就会显示进度条并让你获取一个平均速度。
10、Coding/Changing the Net Layout
这是代码框,你可以在里边修改所有之前提及的变量,之后一旦你准备好,你可以修改一些东西,按下apply code按钮之后重新启动,它将清除所有,你截止到现在完成的训练或重置并再一次启动训练。
11、Training
(1)Done on separate thread (Web Workers, yay!)
① Separate simulation, resets, state, etc.
② A lot faster (1000 fps +)
(2)Net state gets shipped to the main simulation from time to time
You get to see the improvements/learning live
所以需要多次保存,保存按钮在这,所以训练是在网络工作端的分离的线程完成的,这是一件比较令人激动的事情因为它允许JavaScript运行,惊人地在多个CPU核心上并行运行,模拟这个分数,训练已经完成了,比真实的时间快很多,每秒1000帧,就是每秒会有1000次运动的步骤。这会全部在JavaScript里编写,然后它们被运送到主要的模拟中时地随着训练进行,然后他们被运送到主要的模拟中,不时地随着训练进行。
12、Training
trainIterations=100000;
所以你要做的全部工作就是按下run training按钮,随着时间推移。它的训练和汽车呈现的情况会更好。
13、Loading/Saving
Save Code/Net to File
Danger: Overwrites all of your code and the trained net
Load Code/Net from File
在浏览器中展示,看一下它是否运行良好,当它启动的时候,在浏览器里就会有运行情况的展示,人工智能,这是在浏览器中的一个神经网络,现在运行不是很顺利,现在的速度仅仅是一小时两英里,并看着每一个车辆驶过,现在正被展示的是按差的损失函数,为了去训练它,达到一秒1000帧,你只需按动run training按钮之后它就可以很快地学会,基于你在代码框里改动的网络,并基于输入以及刚提及的所有工作。
训练完成,它已经学会如何可以做得更好,有目的性的将不是很好的网络放置在这里,所以在平均水平下,它们就不会做得那么好,但它将会比站在那里更好,之后你就可以开始评估运行,来模拟比真实情况快很多的网络环境,来看它的运行情况,这是一个与我们采用的相似的评估步骤,当你确定你站在在现有的平均速度排行的位置时,在这10次运行模拟中,它的平均速度是56.56英里每小时,如果你已经登录,你可以点击“提交你的代码”。如果你没有登录,它会反馈:“您还未登录,请在登陆后提交您的代码”
之后要做的工作就是登陆,之局你再次点击提交模型submit model按键,然后成功。
“感谢您的提交”那么现在提交已经作为“Lex”名被放入了排行中,速度是56.56,大家都会进行尝试然后击败这个速度,如果想要保存代码,可以通过按“保存代码save code”按钮,它会保存不同的JavaScript结构,它会将网络布局保存到文件中,当然也可以从文件中下载,但也会有它帮你重写代码的危险。
14、Submitting
Submit Model to Competition
(1)Submits your code and the trained net state
Make sure you ran training!
(2)Adds your code to the end of a queue ,
Gets evaluated some time (no promises here)
(3)You can resubmit as often as you like
① If your code wasn't evaluated yet it we still remove it from the queue (and move you to the end)
② The highest/most recent???? score counts.
你按动submit的按钮来将你的模型提交到比赛中,你要确保你来训练网络,你提交了模型之后,你一定要按训练train按钮,然后它就会得到进入队列的时间的评估,现在是公共阶段,所以队列可能发展得很巨大,之后他就会进入队列。评估它,之后它就会进入队列。如果你进入了前十名,你会被添加到展示的排行榜上,你可以重新提变多次。但只有最高的分数有效。
二、ConvNetJS
1、ConvNetJS / The Actual Deep Learning Part
用这段代码,现在只使用JavaScript来完成神经网络,现在只使用JavaScript来完成神经网络,由原先在斯坦福读博后来在OpenAI工作的Andrej Karpathy完成,ConvnetJS是一个图书馆。可以在这里完成可视化,也可以在游戏中完成可视化的是进入到网络的输入,在这个情况下是135个输入。不仅仅可以指定,能看到左右前后多远的距离,也可以指定你看上去还有多远,所以这里可视化的是网络135个神经元的输入,然后它的输出类似于一种回溯,刚才所看到的有10个输出的带数字的,如果它在这里的值是0、1···10,这里的输出将是五个动作其中的一个,五个动作分别是左转、右转、留在原地、加速或减速。
2、ConvNetJS: Settings
var num_ inputs = ( lanesSide * 2 + 1) *(patchesAhead + patchesBehind ) ;
var num_ actions = 5 ;
var temporal_ window = 3 ;
var network_ size = num_ inputs * temporal_ window + num_ actions *
temporal_ window + num_ inputs ;
对于这个ConvNet.JS的设置,可以选择一些输入,如果想打乱这些输入数据。但是这些数据是不需要去打乱,因为已经给了车道边和补丁等变量,你可以选择一些动作,时间窗口和网络规模。
3、ConvNetJS: Hidden / Fully Connected Layers
layer_ defs. Push
{
type :'fc',
num_ neurons
:
10,
activation: ' relu'
}
);
Var
layer_ defs =
[];
layer_ defs. push(
{
type :"input',
out_ SX:1,
out_ sy:1,
out_ depth:network_ size
});
因此。网络定义为,这是输入,输入的大小。第一亮全连接层,它具有10层的神经元,relu激活函数,与之前在输出回归层,谈到的平滑函数类似。
4、ConvNetJS: Output Layer
layer_ defs. push({
type:' regression' ,
num neurons :num_ actions
});
5、ConvNetJS: Options
var opt = {};
opt. temporal_ window = temporal_window ;
opt, experience_ size = 3000;
opt.start_ learn_ threshold = 500;
opt.gamma = 0.7;
opt. learning_ steps_ total = 10000;
opt. learning_ steps_ burnin = 1000;
opt.epsilon_ _min = 0.0;
opt. epsilon_ test_ time = 0.0;
opt. layer_ _defs = layer_ defs;
opt. tdtrainer_options = {
learning_ rate: 0. 001, momentum: 0.0, batch_ size: 64, l2_ decay: 0.01
};
brain = new deepqlearn. Brain(num_ inputs, num_ actions, opt);
而且还有一帮其它乱七八糟的选项。
6、ConvNetJS: Learning
learn = function (state,
lastReward)
{
brain. backward ( lastReward) ;
var action = brain. forward(state) ;
draw_ net() ;
draw_ stats() ;
Return
action;
}
选择层数,这些层的大小,可以建立和驱动自己的神经网络,实际的学习是与反向传输一起进行的,然后返回一个动作向前传递到网络。
三、Monaco Editor
<script src="monaco-editor/min/vs/loader, is"></script>
<script>
require. config({
paths: {
'vs': . monaco- editor/min/vs "
}
});
require(['vs/editor/editor. main'], function () {
editor = monaco. editor, create( document. getE lementById ( 'container'), {
value: "some code···”
language: ' javascript',
wrappingColumn: 75,
});
});
</script>
这是一个代码编辑器。这就是 Monaco 编辑器。它会做一些自动补全。所以当你使用它时,一切代码编辑都将非常方便。
HTML5 Canvas
<canvas id="canvas" width="400" height="700"></ canvas>
<script>
var ctx = document . getElementById( ' canvas ').
getContext
('2d');
ctx.fillStyle = 'rgba(0,120,250,0.5)';
ctx. fillRect(0, 0, 100, 100);
</script>
我们明天会谈论很多这样的可视化的模拟游戏,使用 HTML5 画布游览器中完成。这是用画布蓝盒子的简单的规范,这是非常有效和易于使周。
四、Web Workers
//main.js
if (window, Worker) {
var myWorker = new Worker("worker.js");
myWorker , onmessage = function (e) {
console. log(e.data);
};
}
//worker.js
postMessage ("Hello world!");
你所做的不单单只是运行,JavaScrp就像V8发动机一样的超级快。可以在这个浏览器中训练神经网络。对于网络工作者,只要你有浏览器,新版浏览器。可以在分开的单独的线程中运行多进程,所以可以做很多的东西,可以单独做可视化,可以训练单独的线程。
五、Human-in-the-Loop Reinforcement Learning: Driving Ready?
深度强化学习最令大兴奋的成就在于,围棋是一个机器不可能获胜的游戏,因为这有组合复杂的,数量众多的选项。它可比象棋复杂的多,所以深度强化学习最了不起的成就,是A1phaGo第一次在围棋比赛中将人类的世界冠军击败,它们获胜的方式与驾驶非常相关,首先通过受监督的方式首先创建决策网络,用专业玩家的对决数据来构建一个网络。因此你不和自己对抗。人工智能代理不和自己对抗,而是从专业的游戏中学习,所以有一些基准数据,人的基准数据代表现实,对于驾驶来说,这是很重要,开始得到很多数据,这些是由司机记录的,它们做到了这一点。现在作为一个提醒什么时候代理可以做自动驾驶,在通过模拟运行代理之前可以学习这些数据,接下来通过仿真可以从更多数据集中学习,他们做到了这一点。现在作为一个提醒什么时候代理可以做自动驾驶,问题是不能相信初步估计的奖励功能是安全的,和对社会生产有用的,当在谈论智能系统获得在现实世界的操作,这仅仅是一个提醒。再一次说明,所有的引用都是在网上提供
我想你可能有一些问题,你可以来跟我讨论这些问题
问题:DeepTraffic 之中的可视化是什么?
你看到汽车在移动,为什么移动?它是基于你训练网络的最新快照而移动的,所以它是可视化的。