自动驾驶高大上?其实在浏览器里也能玩。
上面那个视频是一个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传送门。