大老师的前生——AlphaMao项目的回顾和总结

1,523 阅读12分钟

内容来源:基于深度学习的电竞数据分析——阵容对抗和赛况评估,来看看VPGAME美国团队的研究成果分享。IT 大咖说经授权发布。

阅读字数:4897 | 13分钟阅读

摘要

去年夏天TI前的时候,VPGAME推出了一个叫AlphaMao的产品。可能很多同学都没有用过,简单地介绍一下,这是个基于阵容的胜率预测器,你输入两边阵容,他还给你一个胜率。这个灵感来自于平时我们看直播的时候主播们经常说的“这个阵容我觉得几几开”,以及现在会说的“我们来看一下大老师觉得几几开”。

现在AlphaMao还挂在网上,不过模型已经8个月没更新了,地址:http://www.vpgame.com/alphamao,仔细想想这算不算现网事故?(๑°⌓°๑)

AlphaMao截图

刚上线的时候还是有一些不错的反响的,上一些我们VPGAME APP社区的截图

VPGAME的社区讨论

在NGA和百度贴吧上也有不少帖子在讨论,上几个百度出来的链接(换手机了找不到其他的截图QAQ,其实当时非常用心地截了很多很多用户的反馈T T)

百度贴吧链接:https://tieba.baidu.com/p/5200087942

(NGA链接已失效,这里就不贴了)请xiao8在直播的时候玩过,然后后来好像还有几个主播自己玩了玩。

按时间算,我们应该是最早的大数据分析胜率的模型(产品上线是17年5月份)。在我们推出2个月后的MDL上,也有另外一个team做了一个根据时间变化的胜率模型,但是显然他们低估了这个项目的难度,我在MDL的前两天还特别关注了一下那个模型的效果,结果开局动不动就99%、100%判死刑真是有点难看= =关键是死刑被打脸的概率实在太高了_(•̀ω•́ 」∠)_

然后后来虽然计划上是有不少地更新计划,但是因为公司职能结构的变化,继续训练所需要的数据系统进行了停工重构。所以这个项目也就暂停了。后来大老师推出的时候我也一度非常地沮丧想要离职(主要是看到Valve做出来的东西基本上和我计划的是一模一样的,以及我们曾经如此close…˃̣̣̥᷄⌓˂̣̣̥᷅ 当然现在已经在新的项目上站起来了!然后被OpenAI用钱又打趴下了#怎么可能233#)

网上说如何做出大老师的文章那么多,不过基本上都是科普文,没怎么说怎么做的。所以在这篇文章里,我就来说一下我们是怎么做出来的。由于好久没有用中文写文章以及不知道中文术语,会混一些英文单词。然后我们一开始在立项的时候把这个称之为“胜率预测器Win Rate Prediction Tool”,所以下文基本上会以胜率预测器或者wrpt来代指项目。

因为文章有点长,准备分两篇发,在这一部分中我会提到:

  • 代码

  • 结果

  • 简单地回顾下制作过程

  • 改进模型过程中的几个比较关键的点

代码

代码见:https://github.com/vpus/dota2-win-rate-prediction-v1

我们Team内对于开源的不同意见有很多,但是最终我决定还是开源我们的项目。有如下几个方面考虑:

  1. Dota Plus的推出,使得我们的成果已经不再是行业领先的了,甚至从商用角度来说已经意义没有那么大了,所以开源对于公司的损失已经比较低了

  2. 非常多的人对于游戏、特别是Dota2大数据非常感兴趣,现在网上大多数都是科普文而没有干货,希望能给大家带来不同方向的帮助(๑˃̵ᴗ˂̵)

  3. 我们希望能有更多的人能够在我们的基础上做出更好的模型,或是利用我们的模型去使用在更多的地方。有任何想法都可以在Github/知乎上和我们讨论或者发我邮箱shimakaze@vpesports.com

  4. (自吹警告_(:з」∠)_)除去Dota Plus,目前应该是没有比我们这个更好的模型了(笑)

结果

去年6月份时提交给我们公司运营部门的公关文:

在过去的半年中,模型每天都在通过学习新的比赛样本来更新自己的模型。目前模型拥有60%的总体准确率以及高达97.6%的相对准确率。在针对7月15日的所有比赛的预测中,模型结果是5:5时的比赛有51%的准确率、模型结果是6:4时的比赛有59%的准确率、模型结果是7:3时的比赛有66%的准确率、模型结果是8:2时的比赛有79%的准确率、模型结果是9:1时的比赛有89%的准确率。

虽然没有达到我们在做之前觉得的可以达到80%左右的总体准确率,但是自己的感觉还是不错的。在去年TI中,也获得了比较不错的结果(错误集中在我最爱的VP这支20分钟强无敌、30分钟僵持、40分钟雪崩的队伍上(*´▽`*))

简单地回顾下制作过程

我们是在16年12月底的圣诞节假期开始弄这个模型的。前后一共耗时3个星期的样子。当时我们一共尝试了4个不同的模型/神经网络,然后在效果最好的v4之上我们去掉了训练多个Epoch的设定,改成了只训练1个Epoch得到了v5。最后在4月份上线产品前,又在那之上调整了其中的英雄之间Advantage(互克关系评分)的公式,并且移除了训练数据中的比赛具体数据(如每个英雄的KDA、出装等),经过了6个版本得到了最终现在挂在github上的版本v1。

关于v1具体的模型的话可以看下代码,因为是一步步改进为v1的,以及我觉得这个模型肯定不是最优Network,所以我就不一行一行解释why do we construct this NN了。想分享一下我们在改到这个模型所经历的几个比较关键的改动。

改进模型过程中的几个比较关键的点

1. 增加2个支持数据

我们在模型当中导入了两个支持数据,分别是英雄在同一队时候的胜率(combo_win_rate),以及英雄在两个队时候的胜率(against_win_rate)。

最一开始的时候,我们是没有添加这两个数据的,训练数据只有两边的阵容 [h1, h2, … h10]以及比赛最终结果0 or 1。这个思路其实并不是错误的——所谓Deep Learning或是大数据,归根结底还是在寻找input和output之间的relationship,可以说是一种更高级的统计。所以训练数据只放输入值和输出值其实是可以的,但是训练效率会比较低。同时这么做其实还有另外一层好处,就是去除任何人为想法,为模型添加人为思路是我认为在机器学习中比较双刃剑的操作,好处在于也许很快就能做出一个你期望的结果,坏处就是也许你“过度”地指导了你的模型,使得你的模型只是在按照你想的去成长而已,并不是带给你一个正确的solution。

只有双方阵容和比赛结果作为训练数据

在第一轮的训练中,训练效果非常的不好,这个时候我们先想到的并不是帮助模型去更快地理解这个数据,而是选择了加大训练量的方式。我们做了两种改进:

1、在原有的一个月数据基础上,再新增了一个月的数据(每个月大约有3千万场比赛)

2、多训练几个Epoch,这么做的Benefit有很多,可以参考这个Quora贴

https://www.quora.com/Why-are-multiple-epochs-needed-for-deep-learning#%EF%BC%89

在做了上面这两项更新后,我们发现效果还是不好,的确有看到预测准确度在往上涨,但是涨的非常缓慢(好像是从50%涨到了51%),而此时我们的训练数据已经打到了差不多60G的样子了。这个数据量其实是非常的大的,举个例子:从我在大三接触到机器学习到今年PhD被Master Out的5年学习中,在任何一个项目中都没有用过超过2个G的训练数据,这其中甚至还包括了很多图片学习的项目。继续增加数据集也许的确能够给我们带来一个可观的结果,但是绝对不是我们应该做的事情。于是我们开始着手改进模型。

我们首先想到的点是:作为一个玩家,我们平时是怎么选择阵容的?显然,大多数时候我们想的是A英雄和B英雄配在一起非常厉害,比如神域哈斯卡;以及对面有什么英雄我就要选什么英雄,比如对面选骷髅王你选敌法猴子。所以在这次模型改进中,我们加入了同队和异队胜率。

加上了两个辅助Layer

因为非常重要,所以再次强调一遍,并不是说不添加这两项,就没有希望得到一个很好的结果。事实上当你的数据达到一定量的时候,模型最终在某一层NN中是会学到同队和异队胜率的。但是会比较慢。

2. 从异队胜率到互克评分

上面我们说到在模型中添加两个胜率,但是实际看代码的话会发现,我们最终并没有使用互克的胜率,而是使用了互克的评分。这其中主要由这两个原因:

1、版本是有强势英雄的。举个例子来说,在我们当时训练的时候,全能的胜率是非常恐怖的(好像有60%),而蜘蛛只有30几的胜率。这其中有操作难度的问题,也有被克制英雄多少的问题。所以单从胜率来说的话,并不能很好地体现互克关系。这也是为什么无论是Dotabuff还是Dotamax在英雄互克关系的时候,都额外使用了一个叫“克制指数”的数据。

2、每个英雄的选择次数以及遇上的场次不一样,单纯比较胜率并不合适。

Dotabuff的克制指数

DotaMax的克制指数

所以我们引入了我们在做这个项目之前就做好了的互克关系函数,公式出来的结果基本和Dotabuff一致,使用的方法是A对B的胜率到A的平均胜率的距离。不过我们的结果当时和Dotamax有一定的差别。

3. 数据处理

我们在这当中还做过的一项非常重要的改进就是训练数据的处理。这一点其实是我们在做训练数据的时候疏忽了。在这个项目的前置项目——计算阵容组合胜率的时候我们发现,以火枪、大屁股还有三个其他特定英雄几乎拥有100%的胜率,这主要是来自当初非常流行的小语种速推代练。然后我们当时就一个英雄的使用难度是否应该被考虑进去也有过争论。最终我们尝试了以下几种手段:

  • 清除所有Normal局;清除所有NormalHigh局;只使用VPGAME/CDEC认证选手的比赛来削弱使用难度因素

  • 清除所有时间小于10/15/20分钟的比赛

  • 清除胜率过高的阵容

在比较处理后的数据集以及训练结果后,最终我们依然使用所有Skill level的比赛并清除了所有时间小于15分钟的比赛。

4. 英雄位置是不是有关系?

其实在做这一项改动之前,我们的模型已经能够产出一个非常不错的结果了(接近60%的general accuracy以及非常不错的相对准确度(参考上文结果))。但是我们还是想能不能再进一步,于是我们想到了应该把英雄位置也添加进去一起考虑。一场比赛后,装备和金钱是最适合用来判断一个英雄在他的队伍中所处的位置的。于是在这一版本中,我们添加了的几乎所有的基础比赛数据,即每个英雄的最终等级、KDA、GPM、XPM、身上装备这些。关于这个改动,由于结果相近,我和当时主要负责这个模型的同学有不同的看法:我认为这个数据可以不用添加,因为从结果上看差距非常接近,然后他极大地影响了训练数据大小以及训练效率;他则是认为这个数据也许再结果上体现出的改进不大,但是从模型角度说却是实实在在地补上了一块空缺。这个现在我觉得其实都可以,我认为Valve在做大老师的时候没有特别考虑英雄位置(开局前)。