大老師的前生——AlphaMao專案的回顧和總結

IT大咖說發表於2019-01-12

內容來源:基於深度學習的電競資料分析——陣容對抗和賽況評估,來看看VPGAME美國團隊的研究成果分享。IT 大咖說經授權釋出。

閱讀字數:4897 | 13分鐘閱讀

摘要

去年夏天TI前的時候,VPGAME推出了一個叫AlphaMao的產品。可能很多同學都沒有用過,簡單地介紹一下,這是個基於陣容的勝率預測器,你輸入兩邊陣容,他還給你一個勝率。這個靈感來自於平時我們看直播的時候主播們經常說的“這個陣容我覺得几几開”,以及現在會說的“我們來看一下大老師覺得几几開”。

現在AlphaMao還掛在網上,不過模型已經8個月沒更新了,地址:http://www.vpgame.com/alphamao,仔細想想這算不算現網事故?(๑°⌓°๑)

大老師的前生——AlphaMao專案的回顧和總結

AlphaMao截圖

剛上線的時候還是有一些不錯的反響的,上一些我們VPGAME APP社群的截圖

大老師的前生——AlphaMao專案的回顧和總結

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。

大老師的前生——AlphaMao專案的回顧和總結

只有雙方陣容和比賽結果作為訓練資料

在第一輪的訓練中,訓練效果非常的不好,這個時候我們先想到的並不是幫助模型去更快地理解這個資料,而是選擇了加大訓練量的方式。我們做了兩種改進:

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英雄配在一起非常厲害,比如神域哈斯卡;以及對面有什麼英雄我就要選什麼英雄,比如對面選骷髏王你選敵法猴子。所以在這次模型改進中,我們加入了同隊和異隊勝率。

大老師的前生——AlphaMao專案的回顧和總結

加上了兩個輔助Layer

因為非常重要,所以再次強調一遍,並不是說不新增這兩項,就沒有希望得到一個很好的結果。事實上當你的資料達到一定量的時候,模型最終在某一層NN中是會學到同隊和異隊勝率的。但是會比較慢。

2. 從異隊勝率到互克評分

上面我們說到在模型中新增兩個勝率,但是實際看程式碼的話會發現,我們最終並沒有使用互克的勝率,而是使用了互克的評分。這其中主要由這兩個原因:

1、版本是有強勢英雄的。舉個例子來說,在我們當時訓練的時候,全能的勝率是非常恐怖的(好像有60%),而蜘蛛只有30幾的勝率。這其中有操作難度的問題,也有被剋制英雄多少的問題。所以單從勝率來說的話,並不能很好地體現互克關係。這也是為什麼無論是Dotabuff還是Dotamax在英雄互克關係的時候,都額外使用了一個叫“剋制指數”的資料。

2、每個英雄的選擇次數以及遇上的場次不一樣,單純比較勝率並不合適。

大老師的前生——AlphaMao專案的回顧和總結

Dotabuff的剋制指數

大老師的前生——AlphaMao專案的回顧和總結

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在做大老師的時候沒有特別考慮英雄位置(開局前)。


相關文章