看点>今日科技

如何丝滑地入门神经网络?写个AI赛车游戏,只训练4代就能驾驶

2019-02-08 07:32:00    今日必看

车栗子 发自 凹非寺

量子位 出品 | 公众号 QbitAI

如何丝滑地入门神经网络?写个AI赛车游戏,只训练4代就能驾驶

训练前

要了解机器学习、了解神经网络,一种非常有趣的方式,就是找个小游戏,自己实现一下。

游戏里的每一位AI玩家 (智能体) ,都是一个小小的神经网络。

一开始,它们什么都不懂,刚开局就GG。但有了进化算法(Evolution) ,AI可以在一代一代更迭中,掌握强大的游戏技能。

如何丝滑地入门神经网络?写个AI赛车游戏,只训练4代就能驾驶

成效显著

比如,在这个赛车游戏里,萌新车手跑出去不久便撞上了马路牙子。不过,用不了几代进化,就有AI车手可以毫发无损地跑完一周。

进化的赛车手

AI赛车手如何快速炼成?

首先,要有一个庞大的车队。

赛车AI的开发者,是一位叫做Johan Eliasson的程序猿。他的训练计划里,有650辆车同时训练。

第二,AI开车需要一些空间信息。

如何丝滑地入门神经网络?写个AI赛车游戏,只训练4代就能驾驶

这5条黄线代表5个距离,指示离马路牙子还有多远;

除此之外,AI还需要知道自己当前的速率,以及方向。

这样算来,神经网络一共会接受7个输入。

第三,就是让神经网络不断进化。

输入七个值,处理一下,输出两个值:

一个代表方向盘,按照数值大小,分为左转、右转、方向不变三种操作;

一个代表油门/刹车,按照数值大小,分成加速、减速、速率不变三种操作。

最开始,谁不知道游戏规则,输出值很随机。

如何丝滑地入门神经网络?写个AI赛车游戏,只训练4代就能驾驶

第一代,死得快

650辆车冲出去没多久,路边就出现了大批车辆的尸体。

但重要的是,依然有硕果仅存的汽车,不止通过了第一次的右转考验,也机智地发现下一处弯道应该猛烈左转。

如何丝滑地入门神经网络?写个AI赛车游戏,只训练4代就能驾驶

虽然,它并没有成功掉头,但依然是下一代的希望:进化算法就是要在每一代里,选出最优秀的一只或者几只智能体,繁育出色的后代。

(这里,程序猿没有找到一种很好的方法,让系统自动选择出优质的个体,于是就手动马克了,反正也没有训练很多代。)

所以,第二代的650辆车,全是这一只智能体的子嗣,各自有些轻微的变异:神经网络的权重发生小小的变化。

变异是为了保持车队的多样性,期待从中生产出更加优秀的个体,繁育下一代。

如何丝滑地入门神经网络?写个AI赛车游戏,只训练4代就能驾驶

第二代,马克三只

由于继承了优良传统,第二代汽车大部分都完成了第一次右转,还有一小部分掉头成功。

这一次,把冲到最前面的3辆车马克一下,它们差一点就能达成两次连续掉头的S形操作。

既然,第三代的父母有3位,那么繁育过程中除了变异之外,还涉及杂交:就是把不同的神经网络揉到一起:

如何丝滑地入门神经网络?写个AI赛车游戏,只训练4代就能驾驶

第三代的表现更加精进,有的智能体完成了多次连续转弯,胜利在望。

第四代,便有智能体跑完一周,值得纪念:

如何丝滑地入门神经网络?写个AI赛车游戏,只训练4代就能驾驶

程序猿说:这效果比想象的好多了,之前我还有点怀疑,现在只能说机器学习好厉害。

第四代车队中的佼佼者,已经不太撞到路肩,只是速度还很慢,就像一大波僵尸。

车队的主人表示,后面的主要任务就是训练速度。毕竟,这是赛车。

到了第十代,速度已经有了明显的提升,不过依然不算快:

如何丝滑地入门神经网络?写个AI赛车游戏,只训练4代就能驾驶

第十代

不知训练了多少代,现在把每一代的优质选手放在一起跑。你看,好快:

这才是赛车

成果斐然之余,程序猿还请大家注意一个重点:

AI不知道自己在开车,不知道有跑道。它只接收七个输入的数值,不了解它们代表什么意思,也不知道自己输出的每一个决策,产生了怎样的效果。

就算这样,它还是学会了怎样在游戏世界里更好地生存。

不想开车?还有其他游戏

虽然,赛车游戏的视频,没有讲到程序猿用了怎样简单的神经网络。不过,可以通过另一个简单的游戏,来感受一下:

Flappy Bird

如何丝滑地入门神经网络?写个AI赛车游戏,只训练4代就能驾驶

这个HTML 5实现, 也是进化算法和神经网络共同的结晶。而且开源了。

它的作者ssusnic说,神经网络部分,用的是突触神经网络 (Synaptic Neural Network) 库。

没有650辆车那么多,种群里只有10只小鸟。每一只,都是一个三层的神经网络:

输入层:两个神经元

隐藏层:六个神经元

输出层:一个神经元

如何丝滑地入门神经网络?写个AI赛车游戏,只训练4代就能驾驶

输入两个值,代表小鸟当前距离下一个障碍物的相对位置,分成水平距离 (x) 和竖直距离 (y) 。

经过隐藏层的处理,输出一个0-1之间的数值,决定下一步要不要扇翅膀:

如果大于0.5,就扇翅膀,反之就不操作。

如何丝滑地入门神经网络?写个AI赛车游戏,只训练4代就能驾驶

第一代

第一代的小鸟,都是随机神经网络(Random Neural Networks) ,集体见光死。

全部阵亡之后,要选出四只最优质的小鸟去繁殖。问题来了,肉眼看去相差无几,要选哪几只?

展开全文
使用头条App阅读体验更佳

为您推荐