想象一下,你生活在一个没有交通拥堵,没有交通事故,也无需花费时间开车的世界,那会多美好。
在我之前做过的一篇关于强化学习的文章中(链接在文末)曾说过,自动驾驶汽车是一场革命,主要有两个原因:
很多公司已经在研究自动驾驶汽车了!比如特斯拉,谷歌,Wayve等等。这些自动驾驶汽车往往使用了强化学习!
再说一遍,如果你还没有读上一篇文章(链接在文末),可以先读一下,在这里我只做上篇文章的简要概述。
强化学习使机器(或者称为智能体)通过实验学习。就像人类学习走路。起初,你以一定的方式移动你的腿,但是你会跌倒。你跌倒了很多次,但最终,经过多次尝试,你会慢慢学会如何移动你的腿来走路。强化学习的原则与此相同!
比较正式的说法是,具有特定状态的环境中的智能体具有可以执行的一组动作。在执行这些动作后,它会收到一个奖励 ,让智能体知道这个动作有多好。当然,我们希望得到与我们目标相符的最高的奖励。贝尔曼方程用于说明未来的奖励,它通常是一系列导致积极结果的动作。在Q学习函数(Q-Learning)中,我们使用这些奖励来更新可以告诉我们某个状态有好坏的Q值。在深度Q学习(Deep Q-Learning)中,我们使用可以近似Q值的深度神经网络来代替Q值。当下次我们的智能体在环境中移动时,它将使用深度Q网络(Deep Q-Network)为每个动作生成Q值,并采用具有最高Q值的动作。
概念说太多也许你不明白,直观理解就足够了。强化学习与我们学习的方式进行比较是:
我们采取的行动会产生正面或反面的后果。如果它是正面的,我们会再次采取行动,反之亦然。就这么简单!
现在开始构建我们的虚拟自动驾驶汽车,让我们来看看构建的过程。
首先,我需要为我的车创建虚拟环境。我最初想到创建一个Unity环境,但我的笔记本电脑在创建Unity游戏时感觉已经快死了。再加上机器学习和录制软件,我认为这么麻烦不值得。
我使用了一个名为Kivy的python包来创建UI。
但是,我可以在地图上绘制“沙地”。如果汽车碰到了沙地,就会被视为出了车祸!
我们将使用强化学习(RL),特别是深度Q-Learning来制造我们的自动驾驶汽车。RL算法都有3个关键元素,状态(State),动作(Action)和奖励(Reward)。以下我的程序中定义这些元素的方式:
汽车所处的状态包括5个变量:
前三个来自汽车前部的3个传感器。每个传感器(红色,黄色,蓝色)都能探测到距离自身10像素半径内的沙地的像素。从逻辑上讲,也就是说,如果汽车左侧有一堵沙墙,蓝色传感器会比黄色传感器探测到的沙地更多。这使汽车可以确定沙地的位置,从而确定行进的方向。最后2个变量代表汽车的方向。以角度衡量,0度将指向上方。我们还添加了负方向方便优化和提升性能。
有三种可能的行动:
主要奖励包括:
这些只是主要的奖励。我还根据汽车的性能定义了其他奖励。例如,我后来意识到汽车离地图的边缘太近了,所以每当距离边缘10个像素内时我就给它一个负奖励。在实践中,你可以自行定义奖励,以获得自己想要达到的效果。
我决定使用强化学习,特别是深度Q学习。这是我的神经网络的架构:
一个隐藏层通常足以解决这类简单的问题。再进行训练需要更长的时间,并且不会带来显著的性能提升。
训练时,汽车开始行驶,并逐渐适应环境。我添加了按钮来保存,并将以前的模型加载到当前的自动驾驶汽车中。以下是我们实际学习的代码片段:
上面是更早之前生成的图。这是当智能体视离目标的远近分别获得+0.1和-0.1奖励。如你所见,奖励在2000步之后稳定了,而不是这次的1500步。这两个图平均需要10个不同的训练周期。结果表明,+1和-1奖励训练速度比+0.1和-0.1奖励更快。
对该模型进行了许多其他更改。比如:
现在,我们的优化模型。我们的汽车可以无碰撞地进行自动驾驶!
我在这里开发了RL驱动的自动驾驶汽车的基础架构。现实生活中的汽车将更难进行编码,但我相信我们最终会成功。并且,我是在笔记本电脑上进行研发,其计算能力比特斯拉公司的小数百万倍。