AI的更新叠代和《空洞騎士》的叙事達成了奇妙的和諧:要不斷嘗試,不斷犯錯,直到戰勝敵人。
開始直播第五天,Ailec的直播間誕生了一場頗為精彩的戰鬥。
正在直播的遊戲是《空洞騎士》,玩家挑戰的BOSS是作品中的高人氣角色大黃蜂。小騎士先是用沖鋒的無敵幀躲過大黃蜂的沖刺,接着又在大黃蜂擲出飛針的同時下劈并靠近,攻擊得手後一個小跳,輕易躲過收回的飛針……
迅速靠近敵人,大黃蜂起跳瞬間預判使用法術,在BOSS做出沖鋒姿勢時一刀打出硬直,幾乎沒有停頓地位移靠近繼續輸出。
耗時40秒,小騎士用最後一刀劈中正處于沖鋒狀态的大黃蜂,利落地結束了這場戰鬥。彈幕一時飄過好幾串代表着驚訝和振奮的“ohhhhhh”,而小騎士隻是沉默,繼續開始與大黃蜂糾纏新的一局。
不少觀衆感慨這位才剛開始玩遊戲沒幾天的新手已經擁有了遠超自己的水平,甚至認為其中某些精妙的操作已經超脫了正常人類的範疇——當然,其中完全沒有質疑小騎士舞弊的意思。
畢竟,這位幕後的玩家本來就不是人類。
1
老實說,AI打遊戲并不算是什麼稀罕事。
有以實力強著稱的,像橫掃圍棋界的AlphaGo和《星際争霸2》達到宗師段位的AlphaStar,已經被不少人稱作人工智能領域的裡程碑。也有以實力差聞名的,日本一家AI公司的首席技術官曾經在推特上發布一個“史上最弱”的黑白棋AI,即便是職業棋手上陣,想在它面前輸掉比賽也不得不絞盡一番腦汁。
勝率逼近0.5%
而且AI往往不按套路出牌。你讓它玩索尼克,他跑去牆角卡BUG走捷徑通關。
你讓它學俄羅斯方塊,他迅速落下每一塊方塊并在遊戲即将Game Over的時候按下暫停鍵。因為每落下一塊方塊都能使AI獲得的更多獎勵分,而在輸掉遊戲前按下暫停就不會得到失敗的懲罰——你得承認,這對它來說确實是一種極具效率的得分方式。
正在美國留學,且面臨着期末考核的Ailec在開始自己的作業前就已經做好了一定的心理預期,可即便是站在前人的肩膀上,直到真正開始調教AI打遊戲,他才切身感受到這是一項多麼充滿坎坷的挑戰。
之所以選擇《空洞騎士》,除了Ailec自己剛在去年年底通關了這款遊戲之外,更直接的原因是他恰巧點進了一位名叫“烽征戰”的up主的直播間。
烽征戰是一位國内的研究生,雖然平日學業繁忙,但偶爾也會在B站開直播,今年三月份的時候,他正在嘗試的項目是訓練AI擊敗《空洞騎士》中的大黃蜂。
為什麼是《空洞騎士》,為什麼是大黃蜂,其中實際上包含了諸多考量。首先,《空洞騎士》是一款2D平面遊戲,且BOSS戰需要投入關注的對象隻有自己和BOSS,這減輕了計算機的工作量,其次,大黃蜂的整體攻略難度不高,而且招式多變,相對來說是個難易程度适中的好老師。
Ailec和烽征戰一拍即合,與對方溝通交流一番後便開始了同樣内容的直播。他覺得這是個再合适不過的期末作業——創造一個能夠穩定戰勝大黃蜂的AI。
2
Ailec最初版本的AI框架基本繼承自一位名叫“藍魔digital”的up主。這位在2020年寫了一套AI學習打《隻狼》的代碼,借鑒其代碼創作的AI擊敗葦名弦一郎的視頻還上過B站首頁。
不出所料,在《隻狼》中如魚得水的AI 立馬對《空洞騎士》呈現出水土不服的症狀。作為“隻狼”,AI需要做出的判斷是鎖定弦一郎、揮刀、格擋、适時看破,而作為“小騎士”,“格擋”和“看破”這樣的機制在遊戲中并不存在,它得重新學習如何使用基本的揮砍和法術打敗敵人。
于是Ailec開始馬不停蹄地修改代碼。白天對AI算法進行更新叠代,睡前打開直播,把AI扔進遊戲訓練學習——這時候國内正是上午。一覺醒來,審視一下學習成果,和觀衆們聊上兩句,然後緊接着投入新的更新叠代。
Ailec至今清楚記得第一次重大更新(事故)發生在容器7身上——容器,這是直播間的觀衆為AI取的名字。你知道,有關遊戲的具體版本,開發者往往會用上1.1、1.2甚至是尼爾那樣行為藝術的“1.22474487139”加以描述區分,但具體到《空洞騎士》中,AI的版本更叠和遊戲的叙事産生了奇妙的映射關系。根絕遊戲的設定,玩家操縱的小騎士是萬千容器中的一個,在他必然踏上的旅途中,無數容器曾經曆過與其相似卻又不同宿命,就像一代代挑戰大黃蜂又倒在她針下的AI。
容器7之所以與衆不同,主要在于這是Ailec第一次嘗試手把手教AI如何戰鬥。簡單來說,他将自己對陣大黃蜂的錄像演示給AI,希望它能從中學習到一些操作技巧,結果容器7受到教誨後,不僅沒有成長為武林高手,反而立地成佛,具體表現為隻追着BOSS跑,靠近後卻一刀不砍——可惜大黃蜂不會因此手下留情。
事後反思時,Ailec找到了症結所在。對人類來說,靠近BOSS是為了有效擊中BOSS,這點不言而喻。但AI不能理解人類的思路,它認為小騎士花了更多的操作和時間接近大黃蜂,最後卻隻揮出一刀。如果進攻一次的得分是1,那麼靠近BOSS可能占0.9,揮刀則占0.1。既然如此,一個勁往BOSS身上靠就是十分合乎邏輯的操作……
Ailec挂在直播間的FAQ
3
總結失敗經驗,不斷優化算法,一個個容器因此誕生。進化到11号容器時,Ailec終于做出了大刀闊斧的改動。
具體的嘗試主要體現在兩方面:一是優化獎勵機制,降低移動在“得分”中的權重,杜絕隻追着BOSS不砍這種現象的發生;二是将動作組合起來,命令AI一次性做出一組動作,比如在沖刺後銜接攻擊,從而更好地抓住輸出機會。
容器11的表現一度十分亮眼,文章開篇的那頓精彩操作就是它的閃光時刻之一。不過好景不長,威猛沒多久,11号就陷入了日牆狀态。
病因和容器7類似,在不斷的練習過程中,容器11的進攻權重完全壓倒了移動權重,換句話說,這回隻知道砍不知道動了。
除此之外,動作組合的弊端同樣顯現出來。原本Ailec為容器們設定的操作隻有17項(例如左移動、右移動、左攻擊、右攻擊……),但在強行添加派生動作後,AI的學習難度陡然增加,根據BOSS行動作出的反饋延遲也劇增——小騎士一刀揮出最快隻需要0.25秒,但AI的反應時間卻長達0.3、0.4甚至0.8秒。
Ailec最終找到的應對方法是放棄動作組合,将小騎士的移動和攻擊分别交給兩組模型管理,其中方向腦隻負責移動,而行動腦則負責除移動之外的揮刀、法術、跳躍等等。
應用這套框架後,Ailec又在容器16身上嘗試削弱延遲獎勵機制對AI 影響。延遲獎勵機制的主要作用是讓AI認清長期利益,他用迷宮舉例,看上去離出口更近的岔路口可能是死路,延遲獎勵能夠讓AI意識到短時間内的繞路實際上會節省更多的時間。
但《空洞騎士》不是迷宮,大黃蜂的攻擊方式是多變的,小騎士的一次操作也不會對後續戰鬥造成類似于迷宮選錯岔路口那麼嚴重的影響——降低延遲獎勵機制對AI的影響之後,容器16的勝率終于穩定在了30%左右。
Ailec幾乎以天為單位對算法進行細緻的優化,容器們的勝率也因此來回波動不定。當然,也有做無用功的時候,比如一位觀衆曾建議他嘗試應用RNN(循環神經網絡),結果花了兩天時間改的代碼最終對小騎士毫無幫助。
但容器們總體上還是在一點點變得更強的。容器23,Ailec對獎勵機制做出細化,使得隻能控制移動的方向腦即便無法通過“攻擊”行為得分,也能憑借靠近BOSS獲得獎勵。
追着大黃蜂揍的23
容器24,Ailec進一步完善行動腦的獎勵機制,鼓勵AI做出諸如“在距離BOSS過遠時使用沖刺”之類的操作,同時完全去除了延遲獎勵機制——此時24号已經基本能夠以90%以上的勝率擊敗大黃蜂。
對整體神經網絡結構進行最後一次大範圍改動優化,并“灌頂”容器24的經驗後,容器26達到了接近完美的狀态。起初它的表現一般,但用Ailec的話來說,就像學會了挂擋、把方向盤、控制離合刹車,卻沒适應怎麼打開車門——打開車門終究不是什麼難事,很快容器26就能夠以将近百分百的勝率戰勝敵人,即使是難度更高的進升級大黃蜂,勝率也在最後達到了90%。
一血險勝進升級大黃蜂
它已經是個足夠強大的小騎士了。
4
交流過程中,Ailec曾數次向我提起教授、朋友(烽征戰)以及直播間觀衆對他的幫助,于是我問:“你覺得為什麼會有這麼多人來看AI打大黃蜂?”
他想了想,覺得自己也不太能确定。可能是這部分觀衆本身對人工智能感興趣,可能是AI的一點點強大帶給觀衆“兒子長大了”的快感,甚至可能隻是因為AI與“容器”之間産生一種奇妙的對應關系。
寫到這裡,我對這個問題也大緻有了自己的想法。讓AI訓練小騎士打敗大黃蜂即是對機器的挑戰,也是對人的挑戰,而《空洞騎士》,或者說“容器們”,用一種和諧而直觀的方式呈現出機器的成長,以及人的成長。
就像在淚水之城,大黃蜂告訴玩家操縱的小騎士:“你的靈魂出自兩個虛空,難怪你能到達這世界的中心。”
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!