本文经授权转载自公众号 AI科技评论 作者:耳洞打三金

大家好,我是三金。

前几天我在上班摸鱼的时候,发现朋友圈好多人都在转一个狼吃羊的AI智障游戏,是在讲狼发现自己吃不到羊的情况下直接选择自杀:

自杀的场景大概如下:

事情是这样的,就在前几天,微博上一位网友@二雨TR发文称 “听我老师给我讲他搞游戏ai的事情他妈笑死我了 。”

目前这条微博已经有两万多转发、三千多评论,并且这条微博上的三张图已经火出了圈,在朋友圈、知乎、豆瓣等很多平台都能见到它的身影。

下面就来看一下这三张图都讲了啥吧:

狼为什么会选择直接撞死呢?

因为自杀分数最高:

如果抓羊,在狼学会躲避障碍物之前它是碰不到羊的。假设前5w次狼做了一些绕开障碍的尝试但是都死了。

那他通过这5w次学到的东西就是——

  • 原地站着15秒得-1.5分;
  • 一头扎死得-1.1分;
  • 尝试绕路但是撞死得-1.1 到-2.4分。 

所以由于狼根本没有吃到过羊,因此狼在-1.1到-2.4分之间选择了-1.1,也就是自杀。

那么不懂强化学习的网友们如何看待这件事呢?

连人工智能都开始知道拒绝内卷了

网友们眼很尖心很细,把AI狼自杀和内卷联系到了一起:

  • AI:就这? 你们还tm想着我统治人类?
  • 连人工智能都知道拒绝内卷的。
  • 狼就是打工人...每秒扣的是青春和时间,羊永远达不到的“升职、加薪、迎娶白富美、走上人生巅峰”。
  • 面对不合理的KPI和奖惩机制,连ai展现出了令人类叹为观止的尊严。
  • 为了激励狼快点抓羊而倒扣分是错误的,相反,应该激励狼活下去而每秒加0.1分。想要最高分当然会尽量抓羊,抓不到羊还撞障碍物扣分已经很劝退了,只有加分才能激励狼活下去。太现实了,只有活着本身就是一种奖励,人才愿意活下去。要不然真的不如一头撞死。
  • 请给狼加一个参数:生命成本。这个参数的定义是我活这么大不容易随便死了太不值了。每次抓不到羊挫败-0.1,但每多活一天就累积+1,降到0才执行自杀,你就收获了一群要死不死的社畜狼了。

关于以上网友的发言,尽管和强化学习不沾边,但是我们也可以看着乐一乐,某些玩笑话或许在冥冥之中还是有某些道理的。

奖励机制不合理

有网友直言这是强化学习的奖励函数机制做的不合理,碰撞的惩罚太大了且死亡的惩罚应该给到负无穷大,让狼知道痛的滋味和代价,这样狼就不会选择自杀了:

这个狼自杀的事虽然是因为奖励机制设置不合理的原因导致的,但总归还是很有意思的,所以三金我决定深入事件背后一线吃瓜图片。

据了解,文章开头发三张聊天截图的网友@二雨TR 并不是程序猿而是一位游戏绘画师,而她口中的老师是墨尔本的一位在读研究生。

三金与二雨TR口中的老师 @星尘研 取得了联系,在联系之后,星尘研表示狼自杀的错误是很多东西共同影响产生的,最主要的一个错误是迭代次数太少,20W次完全不够学,后面提高到100W次起步, 效果直线上升。

狼之后是可以成功抓到羊的:

另一个就是奖励分数设置有问题,最后他们控制在了-2到1之间,效果也很好。大概在第十九代狼的时候就差不多可以用了,但是因为项目时间问题就没再接着往后训练了, 狼还是有点蠢。

更巧的是星尘研刚好把这个事情的大概经过以及狼抓羊的游戏录制了一个说明视频放在了B站上面:

据星尘研向三金介绍,他目前研究生专业是“动画,游戏和交互”,本科时候的专业是游戏和图形编程Games and Graphics Programming, 这个狼抓羊的项目是他本科最后一年的AI课和泰国的一位同学合作完成的,这时当时课程其中的一个作业,要求仅是【使用神经网络和强化学习、遗传算法等配合制作一个AI相关的游戏】。

星尘研表示他只是AI的初学者、门外汉,也是第一次接触强化学习,懂得不多,一切都是摸索着来的。

“这个项目一共4-5个星期,决定做什么, 然后怎么设计这套东西就花了一个星期, 再弄环境和开始的碰壁也花了不少时间,所以最后实际用在调算法bug的时间并不是很多。

游戏整体都是在Unity上面开发的,开发语言是C#,算法主体是基于Unity上封装好的一个强化学习包——MLAgent,GPU用的是他朋友淘汰的2手1080 Ti  。

星尘研表示而他们摸索的过程并不顺利:

我们最初的一个目标是让狼学会判断他要抓的是羊,并且学会去抓,这里的区别点在于狼要能认识到他要去吃羊,而不是我直接把羊的位置给他, 让狼自己去追。

比如下面这是我们最开始的训练场景,在前几千次训练的时候, 狼都不知道要去吃羊,每次训练狼有大概5秒钟的时间在这个场地上面方向随机的乱跑乱逛 。在这个过程中, 狼可能会无意中吃到羊,并发现, 这一次的得分也许比之前要高,那么狼就可以靠得到更多分的奖励来慢慢学习抓羊。

最开始的训练没有使用障碍物的原因, 就是要让狼先学到抓到羊,不然游戏没法继续。

之后刚把障碍物加入时, 狼会特别完美的躲开障碍物,但是把障碍物稍微挪一下, 或者换一个形状,就不行了,原因就是狼只是记住了哪些点不能碰,而不是真正学会了识别障碍物。

这时会发生很多种情况,比如说其中三种:

1. 狼游荡了10秒, 什么都没碰 -> 得-0.6分。
2. 狼游荡了10秒, 什么都没碰,并且吃了羊 -> 得0.4分。
3. 狼花了3秒, 碰了一个障碍, 但是吃到了羊 -> 得0.72分。

可以看出这时狼即使撞了石头也还是有一个不错的得分的。

至于狼吃羊游戏的基本目标则是:
狼的目标:在20秒的时间内得分越高越好。
羊的目标:存活时间越长得分越高。

狼吃羊游戏基本规则描述:

1、开局两只狼(训练时其实是一只)、六只羊,位置随机,石头位置随机 ,地图上带 X的符号就是狼和羊可能随机出现的位置。
2、狼和羊的感知范围由坐标面前的射线所定义,狼面前的6根线是会和障碍物以及地图边界碰撞的,碰撞的时候会返回一个坐标。
3、狼和羊之间的白线是狼和最近的羊之间连接,狼每次优先去吃离它最近的羊。
4、最开始把羊固定了位置,狼学会抓羊之后,才让羊动。
5、羊撞到石头不会死,羊的高分条件只有一个:存活时间尽量长。羊没有说被训练成要故意躲着狼,羊被吃没有直接惩罚,也不会主动躲避石头。
6、狼得分高的背后就意味着:
狼吃到羊的数量越多越好:抓羊的奖励是每只=1/羊的数量,抓到所有羊奖励为1。
吃到羊所用时间越短越好:表现在狼多花费一秒则每秒惩罚0.06,撞到石头扣0.2。
7、狼和羊是有面积大小的,地图大小在Unity里是80X80 。

而星尘研他们在发现狼自杀后的三天内也不是什么都没做:

为何要让狼撞石头死亡呢?

星尘研的解释是“只是为了加快训练时间,因为在狼学会吃到羊之前它可能只会打转会原地不动来等时间消耗,大大增加了训练所花费的时间。”

在训练了300万次后,狼已经可以成功地吃到羊:

虽然有时是在最后一刻才吃到全部的羊:

当然游戏因为各种原因还是存在缺陷的,比如两只狼还是会偶尔撞石头而死:

两只狼会对着石头硬怼,绕不过去,就把自己磕死:

上面的一只狼出现了未知的bug导致它原地死亡:

两只狼之间无形之间学会了合作?

狼吃羊的游戏先演示到这里,想看到更多的案例可以移步原视频。

这里多问一句有没有更合理的奖励和惩罚机制呢?

知乎网友@曾伊言给出了回答:

那么除了这个狼吃羊的游戏之外,AI出Bug或者说AI智障的例子还多吗?