2017年12月22日 星期五

在遊戲中運用機器學習Machine Learning

作者:Alessia Nigretti 原文
潤稿:Wei J


Unity機器學習團隊已經發佈過一系列的介紹機器學習文章以及三個範例專案。Unity發佈機器學習代理工具ML-Agents的消息引起了Unity社群中眾多開發人員的興趣。這些開發人員有的是人工智慧領域的技術專家,有的則是對機器學習改變遊戲製作和玩遊戲的方式感興趣。

Unity的技術經理Alessia Nigretti和Ciro Continisio都不是機器學習的專家,但他們一起開發了第一個基於Unity新機器學習代理系統製作的遊戲範例專案。並在DevGAMM Minsk 2017遊戲開發者大會上作了展示。今天的文章基於他們在大會上演講的內容,向大家介紹在創作機器學習範例專案過程中所思所想,幫助開發者進一步熟悉和瞭解Unity機器學習代理工具。

介紹


Unity核心價值觀之一是讓遊戲開發大眾化,所以我們希望確保每一個想要學習與使用的人都能適用這個新的機器學習代理工具。首先我們與Unity機器學習團隊進行了合作,並製作了一些小型的範例專案,以瞭解它們的工作原理。我們碰到很多問題是第一次接觸機器學習代理的開發者也可能會碰到的,所以我們把問題記錄了下來,盡可能的簡單總結所有內容。這樣你在讀這篇文章時,即使你不知道機器學習是什麼或者它是如何運作的,你也仍然可以在Unity機器學習代理的世界中找到自己的方向!

我們的機器學習範例專案《Machine Learning Roguelike》 是一款2D動作遊戲,玩家必須與兇惡狡猾的史萊姆戰鬥。這些由機器學習控制的敵人將會不斷攻擊我們的英雄,絲毫不留喘息的機會,而當它們感覺到有生命危險時則會四散而逃。

什麼是機器學習?


讓我們從介紹機器學習開始。機器學習是人工智慧的一種應用,它為系統提供了一種不靠人工設計,而是從資料中自主學習的能力。機器學習的工作原理是通過給系統提供可用於尋找模式的資訊與意見(observations),並對未來的結果進行預測。更籠統的說,系統需要習得期望之輸入與輸出的映射關係。這樣系統才可以選擇接下來的最佳動作,以達到最佳的結果。

實現的方法有很多種,取決於我們將何種類型的意見提供給系統。在本文中環境中使用的強化學習(Reinforcement Learning)。強化學習的特點是:它不會告訴系統做什麼,而只會指出什麼是正確、什麼是錯誤。這意味著,我們讓系統執行隨機行為,而我們根據這些行為結果判斷對錯,提供獎勵或懲罰。最終系統將會明白,要獲得獎勵必須要執行什麼樣的操作。我們可以把這想像成訓練小狗坐下:小狗不會明白我們的意圖,但如果我們在它做對的行為時給予小獎勵,它最終將會把動作和獎勵聯繫到一起。 





我們使用強化學習來訓練一個神經網路(Neural Network),這是一個基於神經系統的電腦系統模型。神經網路由單元或“神經元”(Neuron)組成。神經元被分為多個層。與外部環境交互並收集所有資訊的層是輸入層。與之相反,輸出層的所有神經元被用於在網路中儲存某個特定輸入的結果資訊。在中間的是隱藏層,它們包含的神經元負責進行所有的計算。它們學習輸入資料的複雜抽象表徵,從而使它們的最終結果是“智慧”的。大多數的層是“完全連接”的,也就是意味著該層裡的神經元與前一層中的所有神經元都有連接。每個連接都由一個“權重”定義,這個數值用於強化或弱化神經元之間的連接。

在Unity中,我們的“代理”(執行學習的實體)使用強化學習模型。代理在一個環境中執行動作。動作會引發環境的改變,引起的改變將會連同一些獎勵或懲罰回饋給代理。動作發生的地方我們稱之為學習環境(Learning Environment),在實踐中對應的就是一個常規的Unity場景。

在學習環境中有一個學院(Academy),這是一個腳本,包涵了定義訓練的屬性,例如:幀率、時間尺度等。學院將這些參數傳遞給大腦(Brain),即包含了訓練模型的實體。最後代理連接到大腦,獲得動作和回饋資訊,以促進學習進程。為了執行訓練,系統需要使用一個額外的模組,允許大腦使用TensorFlow機器學習庫和外部的Python環境進行交流。一旦訓練完成後,這個環境會將學習過程提煉成一個“模型(Model)”,這是一個二進位格式的檔。隨後可以將模型重新導入Unity,作為一個已訓練的大腦。

將機器學習應用到遊戲


在製作簡單範例專案3D平衡小球和其它用幾個小時完成的小專案之後,如下圖所示。我們被這項技術的潛力所吸引。

 
 

我們發現了一個可用於2D Roguelike遊戲的實際應用。在建構場景時,我們還使用了2D Tilemap和Cinemachine 2D等新功能。

機器學習範例專案《Machine Learning Roguelike》 的意圖是創作一款簡單的動作遊戲,而遊戲中所有的實體都是機器學習代理。這樣,我們建立了一種同時可用於玩家和敵人之間的通用交互語言。遊戲的目的非常簡單:四處移動,並在遭遇中倖存下來。


訓練設定

每一個良好的訓練都是從有關訓練演算法的高級腦力激盪會議開始的。這是在代理的類別中運行的程式,確定輸入對代理的影響以及產生的回報。我們先定義什麼是遊戲的基本動作(移動、攻擊、治療…)、動作彼此交互的方式、我們希望代理能從中學習到什麼,以及我們在什麼狀況會給予獎勵或懲罰。

首先第一個要做的決定,是狀態(State)和動作(Action)應該使用離散(Discrete)資料還是連續(Continuous)資料。離散意味著狀態和動作一次只能有一個值—它是真實環境的簡化版本,因此代理可以更容易地將動作與獎勵聯繫起來。在範例中,我們使用離散的操作,一共有6個值:0:保持靜止; 1- 4:向一個方向移動; 5:攻擊。連續意味著可以有多個狀態或動作,且都是浮點數值。但是它們的可變性會使代理混淆,所以很難使用。在《Roguelike》專案中,我們使用連續狀態來檢測生命、目標、目標距離等。

獎勵功能


我們提出的初始演算法是,如果代理在不產生危險的前提下,能不斷接近目標就給予獎勵。同樣,如果發生危險時,它與目標之間的距離增加(代理“逃跑”),就會得到獎勵。此外,該演算法還包括對代理的懲罰,以防止它在不允許的情形下進行攻擊。

經過反復的測試,初始演算法發生了很大的變化。我們認識到,要獲得期望的行為,最好的方式就是遵循一個簡單的模式:嘗試,失敗,從失敗中學習,迴圈。就像我們希望機器從我們通過反復試驗得到的意見中學習一樣,我們也想從不斷的試錯意見中進行學習。

例如,我們注意到的一件事是,代理總能找到一種方法來取得獎勵:在我們的案例中,代理開始來回移動,因為每當它再次向前移動時,它就會得到一些獎勵。基本上,它找到了一種利用我們的演算法獲得最大獎勵的方法!

我們學到什麼

從尋找合適解決方案的研究中,我們學到了許多不同的東西,並成功將它們應用於我們最終的專案。要謹記,只要我們認為代理做“對”了,在遊戲中的任何時候都可以給予獎勵!。

訓練場景


在設定好演算法後,下一步就是設定訓練場景。我們選擇設定一個小場景作為訓練環境,然後在另一個更大場景的遊戲中使用代理,訓練模型就是從此場景匯出的。我們決定創建4個不同的房間,每個房間都有不同的長度和寬度參數,這是為了讓代理能考慮所有可能的變數,避免它習慣於特定類型的房間。訓練場景負責代理位置的配置、代理與大腦的連接,以及學院和參數的設定。

我們學到甚麼

從建立訓練場景的過程中,我們認識到使用平行訓練,代理可以獲得更多的資料進行學習,而不僅僅是重複幾次同樣的情況,因此能使訓練更加有效。要做到這一點,需要設定一些啟發式代理來執行一些簡單的操作,説明代理學習,且不會導致他們做出錯誤的假設。例如,我們設定了一個簡單的啟發式(Heuristic)腳本,使代理進行隨機攻擊,為我們的訓練代理提供一個範例,以瞭解當它們受到傷害時會發生什麼。



訓練


一旦環境準備就緒,就可以開始訓練了。如果我們計畫進行一個很長的訓練,最好檢查你的演算法邏輯有沒有問題。這不是編譯時的錯誤,或者與你是否是一個優秀的程式師無關—正如之前所提到的,代理將會找到一種方法來利用演算法,所以要確保沒有邏輯缺陷。要確保萬無一失,可以啟動一個1x倍速度的訓練,看看會發生什麼。觀察一下,看看你的代理是否像期望的那樣進行動作。

訓練的準備工作就緒後,我們需要新建一個可以在Python中和TensorFlow環境進行互動的版本。

首先,我們將進行外部訓練的大腦設定為“External”,然後產生(build)遊戲。完成後,我們打開Python環境,設定超參數(hyperparameter)然後啟動訓練。有關如何產生訓練專用版本以及如何選擇超參數的資訊,在機器學習的Github頁面都可以找到。


我們在進行訓練的同時,可以觀察到代理所獲得的平均獎勵。獎勵應該會緩慢增加,直到代理停止學習時獎勵會趨於穩定。當我們對模型滿意後,就可以將它導回到Unity查看效果。



上圖中的動畫展示了1小時訓練的成果:與我們的預期一致,史萊姆靠近另一個代理進行攻擊,直到被還擊並損失大部分生命。同時它開始逃跑進行回血,然後折返再次攻擊對手。

測試

當我們把這個模型應用回Roguelike遊戲,可以看到它的行為方式保持一致。史萊姆已經學會如何有智慧地行動,以及適應與訓練環境不同的場景。


結語

本文旨在提供一些小型範例,說明你能用Unity的機器學習代理工具做些什麼,而不必對機器學習有任何具體的技術知識。
本專案你可以從這裡下載

如果你已經著手在遊戲製作中實現機器學習,還有很多事情可以做:例如將訓練和啟發式結合成一個複雜的行為,這會讓機器學習代理難以訓練,但同時會為遊戲帶來一些真實性。

如果你想為訓練增加更多策略,也可以通過一個封閉的Beta測試或內部試玩來整合真實玩家的遊戲風格、策略和意圖。有了這些資料,你就可以進一步優化代理的訓練,以達到下一級別的AI複雜度。如果你喜歡大膽嘗試,你可以試著建立自己的機器學習模型和演算法,以獲得更多的靈活性!

沒有留言:

張貼留言

關於我自己

我的相片
Unity台灣官方部落格 請上Facebook搜尋Unity Taiwan取得Unity中文的最新資訊