GitHub强化学习开源项目:自己动手创建虚拟自动驾驶汽车

GitHub强化学习开源项目:自己动手创建虚拟自驾车

想象一下,你生活在一个没有交通拥堵,没有交通事故,也无需花费时间开车的世界,那会多美好。

在我之前做过的一篇关于强化学习的文章中(链接在文末)曾说过,自动驾驶汽车是一场革命,主要有两个原因:

  • 每年因交通事故将挽救125万人的生命
  • 省下开车的时间,它会让你在一生中多活3年

很多公司已经在研究自动驾驶汽车了!比如特斯拉,谷歌,Wayve等等。这些自动驾驶汽车往往使用了强化学习!

再说一遍,如果你还没有读上一篇文章(链接在文末),可以先读一下,在这里我只做上篇文章的简要概述。

强化学习使机器(或者称为智能体)通过实验学习。就像人类学习走路。起初,你以一定的方式移动你的腿,但是你会跌倒。你跌倒了很多次,但最终,经过多次尝试,你会慢慢学会如何移动你的腿来走路。强化学习的原则与此相同!

比较正式的说法是,具有特定状态的环境中的智能体具有可以执行的一组动作。在执行这些动作后,它会收到一个奖励 ,让智能体知道这个动作有多好。当然,我们希望得到与我们目标相符的最高的奖励。贝尔曼方程用于说明未来的奖励,它通常是一系列导致积极结果的动作。在Q学习函数(Q-Learning)中,我们使用这些奖励来更新可以告诉我们某个状态有好坏的Q值。在深度Q学习(Deep Q-Learning)中,我们使用可以近似Q值的深度神经网络来代替Q值。当下次我们的智能体在环境中移动时,它将使用深度Q网络(Deep Q-Network)为每个动作生成Q值,并采用具有最高Q值的动作。

概念说太多也许你不明白,直观理解就足够了。强化学习与我们学习的方式进行比较是:

我们采取的行动会产生正面或反面的后果。如果它是正面的,我们会再次采取行动,反之亦然。就这么简单!

现在开始构建我们的虚拟自动驾驶汽车,让我们来看看构建的过程。

1.建立环境

首先,我需要为我的车创建虚拟环境。我最初想到创建一个Unity环境,但我的笔记本电脑在创建Unity游戏时感觉已经快死了。再加上机器学习和录制软件,我认为这么麻烦不值得。

我使用了一个名为Kivy的python包来创建UI。

GitHub强化学习开源项目:自己动手创建虚拟自驾车

我们从一张空地图开始。“汽车”的目标是在地图的左上角到右下角之间来回移动。

GitHub强化学习开源项目:自己动手创建虚拟自驾车

但是,我可以在地图上绘制“沙地”。如果汽车碰到了沙地,就会被视为出了车祸!

我们将使用强化学习(RL),特别是深度Q-Learning来制造我们的自动驾驶汽车。RL算法都有3个关键元素,状态(State),动作(Action)和奖励(Reward)。以下我的程序中定义这些元素的方式:

状态

汽车所处的状态包括5个变量:

  • 传感器红色
  • 传感器黄色
  • 传感器蓝色
  • 方向
  • 负方向

前三个来自汽车前部的3个传感器。每个传感器(红色,黄色,蓝色)都能探测到距离自身10像素半径内的沙地的像素。从逻辑上讲,也就是说,如果汽车左侧有一堵沙墙,蓝色传感器会比黄色传感器探测到的沙地更多。这使汽车可以确定沙地的位置,从而确定行进的方向。最后2个变量代表汽车的方向。以角度衡量,0度将指向上方。我们还添加了负方向方便优化和提升性能。

动作

有三种可能的行动:

  • 顺时针旋转20度
  • 逆时针转动20度
  • 不转弯

奖励

主要奖励包括:

  • -5:如果汽车驶入沙地
  • -0.1:如果汽车离目的地越远
  • 0.1:如果汽车更接近目的地

这些只是主要的奖励。我还根据汽车的性能定义了其他奖励。例如,我后来意识到汽车离地图的边缘太近了,所以每当距离边缘10个像素内时我就给它一个负奖励。在实践中,你可以自行定义奖励,以获得自己想要达到的效果。

2.选择模型

我决定使用强化学习,特别是深度Q学习。这是我的神经网络的架构:

  • 输入层:5个节点(每个状态一个输入节点)
  • 隐藏层:30个节点
  • 输出层:3个节点(每个动作一个)
  • 激活函数:ReLU
  • 优化器:Adam

一个隐藏层通常足以解决这类简单的问题。再进行训练需要更长的时间,并且不会带来显著的性能提升。

GitHub强化学习开源项目:自己动手创建虚拟自驾车

3.训练

训练时,汽车开始行驶,并逐渐适应环境。我添加了按钮来保存,并将以前的模型加载到当前的自动驾驶汽车中。以下是我们实际学习的代码片段:

GitHub强化学习开源项目:自己动手创建虚拟自驾车

4.评估和参数调整

GitHub强化学习开源项目:自己动手创建虚拟自驾车

这是智能体每个时间步获得奖励的图。在图中,智能体每次接近目标时都获得+1奖励,远离则获得-1奖励。这由+0.1和-0.1累积而来。训练在1500个时间步后达到稳定水平。

GitHub强化学习开源项目:自己动手创建虚拟自驾车

上面是更早之前生成的图。这是当智能体视离目标的远近分别获得+0.1和-0.1奖励。如你所见,奖励在2000步之后稳定了,而不是这次的1500步。这两个图平均需要10个不同的训练周期。结果表明,+1和-1奖励训练速度比+0.1和-0.1奖励更快。

对该模型进行了许多其他更改。比如:

  • 天气调整
  • 额外的奖励(例如,智能体不采取最佳路线。我们增加奖励,鼓励智能体降低与上一圈相比达到目标的步数。)
  • 不同的神经网络架构(例如,层数,节点数,优化器,激活函数)

5.预测!

现在,我们的优化模型。我们的汽车可以无碰撞地进行自动驾驶!

我在这里开发了RL驱动的自动驾驶汽车的基础架构。现实生活中的汽车将更难进行编码,但我相信我们最终会成功。并且,我是在笔记本电脑上进行研发,其计算能力比特斯拉公司的小数百万倍。

GitHub:https://github.com/Jerry2001Qu/Self-Driving-Car

上一篇:https://towardsdatascience.com/reinforcement-learning-towards-general-ai-1bd68256c72d

本文为ATYUN(www.atyun.com)编译作品,ATYUN专注人工智能
请扫码或微信搜索ATYUN订阅号及时获取最新内容

发表评论