搞自动驾驶汽车很复杂?其实一个浏览器就行(讲解、代码全都有)

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

自动驾驶高大上?其实在浏览器里也能玩。


上面那个视频是一个2D环境下的无人驾驶系统,在神经网络的驱动下,小车学会如何自动驾驶。这些小车以速度为奖励,来判断当前应该采取怎样的行动。

这个项目的Demo在此,你可以在系统中用鼠标设置新的障碍物,小车可以自己学会绕过障碍。这真是一个让人很兴奋的项目。

下面讲解一下这个项目的技术实现。

神经网络

代理通过调整神经网络(近似函数)的权重来学习。在这个案例中,这涉及两个神经网络:一个状态→动作的网络(3层,150个神经元),一个状态+动作→Q值的网络(2层,200个神经元)。Q值描述了动作的好坏。

通过学习第二个网络,即“价值网络”,可以获取策略梯度,然后可以据此学习第一个网络。第一个网络,即“执行器网络”,就变成了决策者。这个算法成为深度确定性策略梯度(DDPG)。除此以外,这个项目还用到如下技术:优先级经验重放缓冲,ReLU非线性等。

不过最麻烦的部分,还是神经网络中超参数的搜索。至少有十几个参数需要调整,以便达到最佳效果,这是一个缺点。未来希望可以通过自动超参数搜索来解决,即通过一组超参数的迭代来找到最佳选择。

传感器

代理的状态(或称神经网络的输入)由两个时间步长组成,当前时间步长和先前时间步长。这有助于代理基于时间带来的变化作出决策。在每个时间步长内,代理通过19个分布在不同方向的距离传感器收集环境的信息。

传感器就是小车身上伸出的几条线,碰到物体时就会“缩短”。传感器线条越短,代理获得的输入越高(0-代表什么也没碰到,1-代表距离非常近)。此外,时间步长还包括了当前的速度。总的来说,神经网络的输入有158个维度。

探索

DDPG的一个主要问题就是探索。在常规DQN(Deep Q-Network)中,可以把动作进行离散再行选择。那样就能简单的通过Epsilon-Greedy随机动作,混合动作-状态-空间。

而在DDPG的连续空间中就不那么简单了。这个项目使用了dropout作为一种探路方式。意思是随机丢弃执行器网络最后一层的一些神经元,从而在行动中获得某种变化。

多代理学习

除了把dropout应用到执行者网络,我还把四个代理同时放在虚拟环境中。所有这些代理共享相同的价值网络,但有各自的执行器,所以有不同的方法找到不同的状态,这样每个代理就能探索状态-动作空间的不同部分。

总之,这有助于更好和更快的收敛。

这个项目的所有代码、Demo、JavaScript库都能在GitHub上找到。

在量子位微信公众号( ID:QbitAI )对话界面,回复:“小车”两个字,发给您GitHub传送门。

本文作者:janhuenermann 
原文发布时间:2017-02-28
相关文章
|
7月前
|
Web App开发 JavaScript
Vue 项目中使用 debugger 在 chrome 谷歌浏览器中失效以及 console.log 指向去了 vue.js 代码
Vue 项目中使用 debugger 在 chrome 谷歌浏览器中失效以及 console.log 指向去了 vue.js 代码
817 0
|
Web App开发 移动开发 JavaScript
【前端用法】HTML5 Video标签如何屏蔽右键视频另存为的js代码以及如何禁用浏览器控件,Video 禁止鼠标右键下载
【前端用法】HTML5 Video标签如何屏蔽右键视频另存为的js代码以及如何禁用浏览器控件,Video 禁止鼠标右键下载
375 0
|
3月前
|
Web App开发 JavaScript 前端开发
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
添加浮动按钮点击滚动到网页底部的纯JavaScript演示代码 IE9、11,Maxthon 1.6.7,Firefox30、31,360极速浏览器7.5.3.308下测试正常
|
4月前
|
Rust 安全 JavaScript
Rust 和 WebAssembly 搞大事啦!代码在浏览器中运行,这波操作简直逆天!
【8月更文挑战第31天】《Rust 与 WebAssembly:将 Rust 代码运行在浏览器中》介绍了 Rust 和 WebAssembly 的强大结合。Rust 是一门安全高效的编程语言,而 WebAssembly 则是新兴的网页技术标准,两者结合使得 Rust 代码能在浏览器中运行,带来更高的性能和安全性。文章通过示例代码展示了如何将 Rust 函数编译为 WebAssembly 格式并在网页中调用,从而实现复杂高效的应用程序,同时确保了内存安全性和跨平台兼容性,为开发者提供了全新的可能性。
171 0
|
5月前
|
机器人 Shell 开发者
`roslibpy`是一个Python库,它允许非ROS(Robot Operating System)环境(如Web浏览器、移动应用等)与ROS环境进行交互。通过使用`roslibpy`,开发者可以编写Python代码来远程控制ROS节点,发布和订阅话题,以及调用服务。
`roslibpy`是一个Python库,它允许非ROS(Robot Operating System)环境(如Web浏览器、移动应用等)与ROS环境进行交互。通过使用`roslibpy`,开发者可以编写Python代码来远程控制ROS节点,发布和订阅话题,以及调用服务。
|
5月前
|
存储 缓存 JavaScript
|
5月前
|
前端开发 JavaScript
vue3【实战】创建项目、创建并提交代码到远程仓库,安装 SASS, 清除浏览器默认样式 reset-css, 清除模板代码,提升开发效率的必要集成
vue3【实战】创建项目、创建并提交代码到远程仓库,安装 SASS, 清除浏览器默认样式 reset-css, 清除模板代码,提升开发效率的必要集成
83 0
|
7月前
|
前端开发 JavaScript
浏览器通过构建DOM树来解析HTML代码
【4月更文挑战第30天】浏览器通过构建DOM树来解析HTML代码
78 1
|
7月前
|
监控 前端开发 JavaScript
如何使用浏览器调试前端代码?
【4月更文挑战第11天】前端开发中,浏览器调试是关键技能,能提升代码质量。本文介绍了如何使用浏览器的调试工具:1) 打开调试窗口(F12或右键检查);2) Elements标签页检查DOM结构和样式;3) Console调试JavaScript,查看日志和错误信息;4) Sources设置断点调试JS文件;5) 利用Network、Performance和Memory等标签页优化性能。熟悉调试工具、利用日志和错误信息能有效定位问题,提高开发效率。
416 7
|
7月前
|
监控 前端开发 JavaScript
如何在浏览器中使用javaScript进行代码调试
【4月更文挑战第11天】在浏览器中调试JavaScript是前端开发的关键技能。使用开发者工具(可通过F12、右键检查或菜单栏访问),遵循以下步骤:1) 打开Sources标签页查看所有脚本;2) 设置断点在需要暂停的代码行;3) 刷新页面触发断点;4) 利用调试工具如Scopes、Watch、Call Stack等检查代码状态;5) 使用Console辅助调试;6) 利用其他工具如Network、Performance和Memory进行性能分析。确保使用最新工具,保持代码清晰,以提升调试效率。
636 4
下一篇
DataWorks