欢迎来到自动驾驶汽车/自动驾驶汽车的第6部分,以及使用Carla、Python和TensorFlow增强学习。在这一部分中,我们将讨论我们工作的一些初步发现。我将使用“我们”这个短语,因为这是我和Daniel Kukiela共同努力的结果。 一开始,问题刻意保持简单。代理可以采取三种行动中的一种:左转,右转,直走。 我选择了Xception模型,因为我发现这个模型很成功,并且在GTA做自动驾驶汽车。 对于奖励,我们设置如下: +1,每帧驱动>限速每小时50公里 -1,每帧驱动<限速每小时50公里 -200,碰撞和情节结束 我们发现的第一件事是,损失和q值基本上都在爆炸: 这似乎是,现在很明显,由于巨大的规模的碰撞惩罚相比其他所有。也可能是超出了范围。例如,如果我们做以下事情,我们可能会更成功: +0.005 (1/200),>每小时50公里 -0.005 (-1/200),<限速每小时50公里 -1(-200/200),碰撞和情节结束 但是我们只是这样做: +1,每帧驱动>限速每小时50公里 -1,每帧驱动<限速每小时50公里 -1,碰撞和情节结束 这似乎减少了Q值和损失的爆炸性,但我们仍然发现,当给定0 epsilon时,代理无疑会持续地只执行1个动作。 然后我们也尝试将速度输入到神经网络中。这似乎有点帮助,但仍然不是主要问题。 然后我们考虑模型。也许早该考虑一下。强化学习与监督学习有很大的不同,主要在于监督学习是纯粹的基础真理(或者至少这是期望)。你提供给它的所有图像和标签都必须是100%准确的。在强化学习中,情况就不是这样了。我们拟合一个模型,是的,但我们也要拟合这些Q值。这是一个更加复杂的操作过程,对于模型来说,事情会变得更加“模糊”。也没有理由拥有高度复杂的神经网络。当我们检查Xception模型(带有我们的速度层)时,它基本上有2300万个可训练参数:
Total params: 22,962,155 Trainable params: 22,907,627 Non-trainable params: 54,528这是一个很多! 我们发现我们的模型的准确性相当高(大约80-95%),所以这告诉我,几乎可以肯定的是,我们每次都是过拟合。 好,那我们该怎么做呢?历史上我成功使用的进化类型模型是64x3 convnets。所以为什么不再做一次呢?所以64x3卷积神经网络在这种情况下更像是300万个可训练参数(包括速度层等):
Total params: 3,024,643 Trainable params: 3,024,643 Non-trainable params: 0 def model_base_64x3_CNN(input_shape): model = Sequential() model.add(Conv2D(64, (3, 3), input_shape=input_shape, padding='same')) model.add(Activation('relu')) model.add(AveragePooling2D(pool_size=(5, 5), strides=(3, 3), padding='same')) model.add(Conv2D(64, (3, 3), padding='same')) model.add(Activation('relu')) model.add(AveragePooling2D(pool_size=(5, 5), strides=(3, 3), padding='same')) model.add(Conv2D(64, (3, 3), padding='same')) model.add(Activation('relu')) model.add(AveragePooling2D(pool_size=(5, 5), strides=(3, 3), padding='same')) model.add(Flatten()) return model.input, model.output一个更简单的模型。 这个模型被这样训练了几天,结果是: 我将显示统计数据,因为我们被跟踪大量的统计数据。首先是准确性。使用DQN,您不会像使用监督学习那样痴迷于准确性。这很重要,但实际上你只是想要一些体面的东西。如果你的模型有90%的准确率,这就值得高度怀疑,而不是高兴了。请记住,您的代理正在接受大量的纯随机操作,并且正在慢慢地学习 Q值。神经网络是操作的一部分,但是一个高度精确的神经网络,特别是在一开始会是一个危险的信号。 FPS是很重要的。当涉及到驾驶汽车时,FPS越高越好。我们的目标是平均15FPS左右,通过我们决定产生多少代理来控制它。如果您甚至不能运行一个代理,那么您就没有能力在这里进行修补。 接下来,我向epsilon展示仅仅是为了展示我对进一步探索的尝试。有时候它看起来有帮助,有时候却没有。 最后是损失率。主要是为了表明没有发生爆炸。 然后我们可以查看关于奖励的各种统计数据: 我们可以看到,随着时间的推移,最大片酬会上升到20万集,并且可能会在更多的时间里继续上升。最低报酬(比如:一个特工做的最坏的事),似乎并没有改变趋势,这并不太令人震惊。有时汽车只是掉入了一个不幸的环境。最后,我们可以看到平均奖励持续地提高。目前,人民币汇率有所下滑,但并不一定比历史上几次下滑的时间更长。 总的来说,模型确实有所改进,这款64x3的CNN是我们表现最好的模型,但是我们也做了一些其他的尝试: 更多的城市。总共有7个城市可供选择,所以我们每10集就把这个城市转到一个随机的城市。我想知道这是否能帮助我们更一般化,而不是仅仅局限于一个城市。这似乎没有帮助。 允许更多的行动。所以特工最初总是全速前进,只能向左、向右或直走。然后我们给了它刹车等选项,看看这是否可能有所帮助。事实并非如此。 我们对奖励功能进行了改进,加入了不同的时间和速度元素,使其比简单的奖励所需的速度阈值复杂得多。我们发现最好的代理时间奖励功能,限速每小时50公里的阈值。 最后,可能真的需要更多的时间。DQN可以非常擅长学习东西……不是很快。我想继续培训这个代理一段时间,看看它是否继续改进,但我最终不得不发布这个更新,我们花时间培训的不仅仅是这个代理。如果您已经修补过Carla并在任何复杂的环境中使用DQN,那么您就会明白训练一个模型需要多长时间,更不用说训练许多具有不同参数的不同模型了!单单这个模型就花了125个小时,或者说5天多的时间来训练。 如果你想玩的东西,看看你可以做得更好,请查阅:Carla-RL github