原文鏈接:https://github.com/Unity-Technologies/ml-agents/blob/master/docs/ML-Agents-Overview.md
ML-Agents概述
Unity機器學習Agent(ML-Agents)是一款開源的Unity插件,可讓游戲和模擬作為訓練智能Agent的環境。通過簡單易用的Python API,Agent可以使用強化學習,模仿學習,神經元演化或其他機器學習方法進行訓練。
我們還提供最新算法的實現(基於TensorFlow),使游戲開發者和業余愛好者能夠輕松地為2D,3D和VR / AR游戲訓練智能Agent。這些受過訓練的Agent可以用於多種目的,包括控制NPC行為(在多種Agent和敵對情況下的各種設置中),
游戲構建的自動化測試和評估不同游戲設計的預發布決策。 ML-Agents對於游戲開發者和AI研究人員來說都是互利的,因為它提供了一個中央平台,可以在Unity的豐富環境中評估AI的優勢,然后得到更廣泛的研究和游戲開發者社區的青睞。
根據您的背景(即研究人員,游戲開發人員,愛好者),目前您可能會有非常不同的問題。為了讓您更輕松地轉換到ML-Agents,我們提供了多個包含概述和有用的資源的背景頁面,其中包括Unity引擎,機器學習和TensorFlow。
如果您不熟悉Unity場景,基本的機器學習概念,或者以前沒有聽說過TensorFlow,我們強烈建議您瀏覽相關的背景頁面。
本頁面的其余部分深入介紹了ML-Agents,其關鍵組件,不同的訓練模式和場景。到最后,對於能用ML-Agent做什么,你應該有一個很好的理解。隨后的文檔頁面提供了如何使用ML-Agents的示例。
運行示例:訓練NPC行為
為了幫助解釋本頁面中的材料和術語,我們將始終使用一個假設的運行示例。我們將探討在游戲中訓練非可玩角色(NPC)行為的問題。 (NPC是一個永遠不受人類玩家控制的游戲角色,其行為由游戲開發者預先定義。)更具體地說,我們假設我們正在構建一個多玩家,以戰爭為主題的游戲,玩家可以控制戰士。在這場比賽中,我們有一名NPC擔任醫護人員,尋找並救治受傷的球員。最后,讓我們假設有兩支隊伍,每支隊伍有五名隊員和一名NPC醫生。
軍醫的行為相當復雜。它首先需要避免受傷,這需要檢測何時處於危險中並移動到安全位置。其次,它需要了解其團隊成員中哪些人受傷並需要幫助。在多人受傷的情況下,
它需要評估受傷程度並決定首先幫助誰。最后,一名優秀的醫生總能把自己置於一個可以快速幫助其團隊成員的位置。考慮所有這些特征意味着醫生需要在每種情況下測量環境的若干屬性(例如團隊成員的位置,
敵人的位置,其團隊成員中的哪些人受到傷害並達到什么程度),然后決定采取行動(例如躲避敵人的射擊,移動以幫助其成員之一)。鑒於環境的大量設置以及軍醫可采取的大量行動,
手動定義和實現這種復雜的行為是具有挑戰性的,並且容易出錯。
使用ML-Agents,可以使用各種方法來訓練這些NPC(稱為Agent)的行為。基本想法很簡單。我們需要在游戲的每個時刻定義三個實體(稱為環境):
-
觀察 - 醫生對環境的看法。觀測可以是數字化和/或可視的。從Agent的角度來看,數字化觀察測量環境的屬性。對於我們的醫生來說,這將是戰場上可見的屬性。
根據游戲和Agent的復雜性,觀察可以是離散的或連續的。對於大多數有趣的環境,Agent將需要幾次連續的數字觀測,而對於具有少量獨特配置的簡單環境,離散觀測就足夠了。目測觀察,
另一方面,是從連接到Agent的攝像頭生成的圖像,代表該Agent在該時間點看到的內容。通常會將Agent的觀察與環境(或游戲)狀態混淆。環境狀態表示關於包含所有游戲角色的整個場景的信息。
但是,Agent觀察僅包含Agent知道的信息,通常是環境狀態的子集。例如,醫生觀察到的信息不能包括醫生不知道的信息如隱藏的敵人。 -
行動 - 醫生可以采取什么行動。類似於觀察,取決於環境和Agent的復雜性,動作可以是連續的或離散的。對醫生來說,如果環境是一個只包含他們位置的簡單網格世界,那么一個離散的行動采取四個值之一(北,南,東,
西)就足夠了。但是,如果環境更加復雜並且醫護人員可以自由移動,那么使用兩個連續的行動(一個用於方向,另一個用於速度)更合適。 -
獎勵信號 - 表示醫生的行為如何的標量值。請注意,獎勵信號不需要在每個時刻都提供,而是只有在醫生執行好的或壞的行為時才會提供。例如,如果死亡可以獲得大量的負面獎勵,每當治療受傷的團隊成員時可獲得適度的積極獎勵,
當受傷的團隊成員因缺乏援助而死亡時,他們會得到適度的負面報酬。請注意,獎勵信號關系到任務的目標如何傳達給Agent,所以他們需要以最大化獎勵產生期望的最佳行為的方式進行設置。
在定義這三個實體(強化學習任務的構建塊)之后,我們現在可以訓練醫師的行為。這是通過模擬許多試驗的環境來實現的,隨着時間的推移,軍醫學習通過最大化未來獎勵來衡量每次觀察所采取的最佳行動。
關鍵是,通過學習最大化獎勵的行動,軍醫正在學習能使其成為一名優秀軍醫的行為(即拯救最多的生命)。在強化學習術語中,所學習的行為稱為策略,其實質上是從觀察到行動的(最佳)映射。
請注意,通過運行模擬學習策略的過程稱為訓練階段,而使用學習策略的NPC玩游戲稱為推理階段。
ML-Agents提供了將Unity用作模擬引擎的所有必要工具,用於了解Unity環境中不同對象的策略。在接下來的幾節中,我們將討論如何實現ML-Agent以及它提供的功能。
關鍵部件
ML-Agents是一個Unity插件,它包含三個高級組件:
- 學習環境 - 包含Unity場景和所有游戲角色。
- Python API - 其中包含用於訓練的所有機器學習算法(學習行為或策略)。請注意,與學習環境不同,Python API不是Unity的一部分,但它位於外部並通過外部通信器與Unity通信。
- 外部通訊器 - 將學習環境與Python API連接起來。它包含在學習環境中。
ML-Agents的簡化框圖。
學習環境包含三個幫助組織Unity場景的附加組件:
- Agent - 連接到Unity GameObject(場景中的任何角色)並處理其觀察到的信息,執行它接收的操作並在適當時分配獎勵(正/負)。每個Agent只與一個Brian相關聯。
- Brian - 它封裝了為Agent制定決策的邏輯。實質上,Brian持有每個Agent的策略,並決定了Agent在每個實例應采取的行動。更具體地說,它是接收來自Agent的觀察並返回行動的組件。
- Academy - 協調觀察和決策過程。在Academy內,可以指定幾個環境參數,例如渲染質量和在運行環境中的速度。Academy包含了外部通訊器。
對於場景中的每個角色,每個學習環境總是會有一個全局Academy和一個Agent。雖然每個Agent必須與一個Brian相連,但具有相似觀察和行為的Agent可能與同一Brian相關聯。在我們的示例游戲中,我們有兩個擁有各自醫生的團隊。
因此,在我們的學習環境中,我們將有兩個Agent,每名軍醫都有一名Agent,但這兩個Agent都可以連接到同一個Brian。請注意,這兩個醫生與同一個Brian相連,因為他們的觀察和行動的空間是相似的。這並不意味着在每種情況下,他們都會有相同的觀察和行動值。
換句話說,Brian定義了所有可能的觀察和行動的空間,而與之相關的Agent(在這種情況下是醫療人員)可以各自擁有自己獨特的觀察和行動價值。如果我們將我們的游戲擴展到駕駛坦克的NPC,
那么附加到這些角色的Agent不能與鏈接到醫療人員的Agent(醫療和司機有不同的行動)共享一個Brian。
我們示例游戲的ML-Agents示例框圖
我們尚未討論ML-Agents如何訓練行為,以及Python API和External Communicator分別扮演何種角色。在我們深入了解這些細節之前,讓我們總結一下之前的組件。每個角色都綁定到一個Agent上,並且每個Agent都連接到一個Brian上。Brian從Agent處收到觀察和並返回行動。
Academy確保除了控制整個環境的設置之外,所有Agent和Brian都處於同步狀態。那么Brian如何控制Agent做什么呢?
實際上,我們有四種不同類型的Brian,它們可以實現廣泛的訓練和推理場景:
-
外部 - 使用Python API進行決策。在這里,Brain收集的觀察結果和獎勵通過外部通訊器轉發給Python API。 Python API然后返回Agent需要采取的相應操作。
- 內部 - 使用嵌入式TensorFlow模型進行決策。嵌入式TensorFlow模型代表一種學習策略,Brain直接使用此模型確定每個Agent的操作。
-
玩家 - 使用鍵盤或控制器的實際輸入做出決定。在這里,一個人類玩家正在控制該Agent,並且Brian收集的觀察和獎勵不用於控制該Agent。
-
啟發式 - 使用硬編碼行為進行決策。這類似於當前定義的大多數角色行為,並且可以有助於調試或比較具有硬編碼規則的Agent與其行為已被訓練的Agent。在我們的例子中,
一旦我們為醫療人員訓練了一個Brian,我們就可以將一名醫生分配給訓練有素的Brian,並在另一個團隊中為醫生分配一個具有硬編碼行為的啟發式Brian。然后我們可以評估哪種醫療更有效。
正如目前所描述的那樣,外部通訊器和Python API似乎只能被外部Brian所利用。這不是真的。可以配置內部,玩家和啟發式Brian,通過外部通訊器(一種稱為廣播的功能)將觀察,獎勵和行動發送到Python API。
我們很快會看到,這將使更多的訓練模式成為可能。
一個配置有多個Agent和Brains的場景的例子
訓練模式
考慮到ML-Agents的靈活性,可以通過幾種方式進行訓練和推理。
內置的訓練和推理
如前所述,ML-Agents附帶了多種用於訓練智能Agent的最新算法的實現。在此模式下,Brain類型在訓練期間設置為External,在推理期間設置為Internal。更具體地說,在訓練期間,
場景中的所有醫務人員通過外部通訊器將觀察結果發送到Python API(這是外部Brian的行為)。 Python API處理這些觀察結果並返回每個醫生采取的行動。
在訓練期間,這些操作大多是探索性的,以幫助Python API學習每位醫生的最佳策略。一旦訓練結束,每個軍醫的學習策略都可以導出。鑒於我們所有的實現都基於TensorFlow,所學的策略只是一個TensorFlow模型文件。然后在推理階段,
我們將Brain類型切換為Internal,並包含從訓練階段生成的TensorFlow模型。現在,在推理階段,醫療人員仍然繼續生成他們的觀察結果,但不是被發送到Python API,而是被輸入到他們的(內部的,
嵌入式)模型,以便為每位醫護人員在每個時間點采取最佳行動。
總結一下:我們的內置實現基於TensorFlow,因此,在訓練期間,Python API使用收到的觀察數據來學習TensorFlow模型。
然后在推理過程中將該模型嵌入內部Brian中,以便為與該Brian相關的所有Agent生成最佳動作。請注意,我們的內部Brian目前是實驗性的,因為它僅限於TensorFlow模型並利用第三方TensorFlowSharp庫。
3D平衡球示例教程入門介紹了3D平衡球示例環境的這種訓練模式。
定制訓練和推理
在之前的模式中,使用外部Brian類型進行訓練以生成內部Brian類型可以理解和使用的TensorFlow模型。然而,ML-Agents的任何用戶都可以利用自己的算法進行訓練和推理。在這種情況下,
在訓練和推理階段,Brain類型將被設置為External,並且場景中所有Agent的行為都將在Python中進行控制。
我們目前沒有教程突出展示此模式,但您可以在此處了解有關Python API的更多信息。
課程學習
此模式是內置訓練和推理的擴展,在訓練復雜環境中的復雜行為時特別有用。課程學習是一種訓練機器學習模型的方式,在這個模型中, 問題的更困難的方面逐漸被引入, 從而使模型始終處於最優的挑戰之中。
這個想法已經存在了很長一段時間,這是我們人類通常學習的方式。如果你想象任何兒童時期的小學教育,就有一個課程和主題的排序。例如,算術在代數之前被教導。同樣,代數也是在微積分之前教授的。
早期課程中學到的技能和知識為后面的課程提供了一個腳手架。同樣的原則可以應用於機器學習,在這種情況下,對較簡單的任務進行訓練可以為將來的較困難的任務提供一個腳手架。
數學課程的例子。從簡單課程到更復雜課程的學習過程,每一個都是建立在之前之上。
當我們考慮強化學習的實際工作方式時,學習信號是在整個訓練過程中偶爾收到的獎勵。訓練Agent完成此任務時的起點將是一個隨機策略。該起始策略將使Agent以循環形式運行,並且可能永遠不會,
或者很少獲得復雜環境的回報。因此,通過在訓練開始時簡化環境,我們允許Agent人將隨機策略快速更新為更有意義的策略,隨着環境逐漸復雜化,策略也會不斷改進。在我們的例子中,
我們可以想象,當每支球隊只包含一名球員,然后反復增加球員人數(即環境復雜度)時,首先要對球員進行訓練。 ML-Agents支持在Academy內設置自定義環境參數。
這允許根據訓練進度動態調整與難度或復雜性相關的環境要素。
訓練與課程學習教程將介紹Wall Area示例環境的訓練模式。
模仿學習
簡單地展示我們希望Agent執行的行為通常更直觀,而不是嘗試通過試錯法來學習。例如,這種模式不是通過設置獎勵功能來訓練醫生,而是通過游戲控制器提供醫生應該如何表現的實例。
更具體地說,在這種模式下,訓練期間的Brian類型被設置為玩家,並且使用控制器執行的所有動作(除了Agent觀察)將被記錄並發送到Python API。模仿學習算法將使用這些來自人類玩家的觀察和行動來學習策略。
帶模仿學習的訓練教程將介紹Banana Collector示例環境的訓練模式。
靈活的訓練方案
目前為止的討論主要集中在使用ML-Agents對單個Agent進行訓練,有幾種訓練方案是可能的。我們很期待看到社區創造了什么樣的新奇和有趣的環境。對於那些訓練智能Agent的人來說,下面是一些可以作為啟發的例子:
- 單個Agent。與單個Brian相連的單個Agent人,擁有自己的獎勵信號。傳統的訓練Agent方式。例子是任何一個單人游戲,比如Chicken。視頻鏈接
-
同時單個Agent。具有獨立獎勵信號的多個獨立Agent人與單個Brian相關聯。傳統訓練場景的並行版本,可以加速和穩定訓練過程。當你在一個應該學習類似行為的環境中擁有多個相同角色的版本時,這很有用。
一個例子比如訓練一打機器人手臂同時打開一扇門。視頻鏈接 -
對抗自我。兩個敵對的Agent與反向獎勵信號鏈接到一個單一的Brian。在雙人游戲中,對抗自我玩法可以讓Agent變得越來越熟練,同時始終擁有完美匹配的對手:本身。這是訓練AlphaGo時采用的策略,
並且最近被OpenAI用於訓練一個擊敗人類的1對1 Dota 2Agent。 -
合作多Agent。具有共享獎勵信號的多個交互Agent鏈接到單個或多個不同的Brian。在這種情況下,所有Agent必須共同完成一項不能單獨完成的任務。示例包括每個Agent只能訪問部分信息的環境,
需要共享才能完成任務或協作解決難題。 - 競爭多Agent。具有反向獎勵信號的多個交互Agent鏈接到單個或多個不同的Brian。在這種情況下,Agent必須相互競爭才能贏得比賽,或獲得一些有限的資源。所有團隊運動都屬於這種情況。
-
生態系統。具有獨立獎勵信號的多個交互Agent鏈接到單個或多個不同的Brian。這種情景可以被認為是創建一個小世界,其中動物有不同目標且相互作用,比如可能有斑馬,大象和長頸鹿的稀樹草原,
或城市環境中的自主駕駛模擬。
附加功能
除了提供靈活的訓練方案外,ML-Agents還包含其他功能,可提高訓練過程的靈活性和可解釋性。
-
按需決策 - 使用ML-Agents,只有在需要時,Agent才能請求決策,而不是在環境的每個步驟請求決策。這可以適用於訓練回合制游戲、Agent必須對事件作出反應的游戲或Agent可以采取持續變化的行動的游戲。
在每一步決策和按需決定之間切換只需點擊一下按鈕。您可以在這里了解更多關於按需決定功能的信息。 -
記憶增強型Agent - 在某些情況下,Agent必須學會記憶過去,才能做出最佳決策。當Agent只能部分觀察環境時,跟蹤過去的觀察可以幫助Agent學習。我們提供了一個Long Short-
(LSTM),使Agent商能夠在未來的步驟中使用存儲器。您可以在此處了解有關啟用LSTM的更多信息。 -
監控Agent的決策 - 由於ML-Agents中的通信是雙向的,因此我們在Unity中提供一個Agent監控類,它可以顯示受過訓練的Agent的各個方面,例如Agent對其在Unity環境中執行效果的看法(稱為價值估計)。
通過利用Unity作為可視化工具並實時提供這些輸出,研究人員和開發人員可以更輕松地調試Agent的行為。你可以在這里了解更多關於使用Monitor類的信息。 -
復雜的視覺觀測 - 與其他平台不同,其中Agent的觀測可能僅限於單個矢量或圖像,ML-Agents允許多個攝像機用於每個Agent的觀測。這使Agent可以學習整合來自多個視覺流的信息。
這可以在幾個場景中有所幫助,例如訓練需要具有不同視角的多個攝像頭的自駕車或可能需要整合空中和第一人稱視覺的導航Agent。您可以在此處了解更多關於向Agent添加視覺觀察的信息。 -
廣播 - 如前所述,默認情況下,外部Brian將所有Agent的觀察結果發送給Python API。這對訓練或推斷有幫助。廣播是可以為其他三種模式啟用的功能(播放器,內部,
啟發式),其中Agent觀察和操作也被發送到Python API(盡管Agent不受Python API控制)。模仿學習利用了這一特征,其中玩家Brian的觀察和行動被用於通過示范學習Agent人的政策。然而,
這對啟發式和內部Brian也有幫助,尤其是在調試Agent行為時。您可以在這里了解更多關於使用廣播功能的信息。 - Docker設置(實驗) - 為了便於在不直接安裝Python或TensorFlow的情況下設置ML-Agent,我們提供了關於如何創建和運行Docker容器的指南。
-
AWS上的雲訓練 - 為了促進在亞馬遜網絡服務(AWS)機器上使用ML-Agent,我們提供了有關如何設置除公共預配置的亞馬遜機器映像(AMI)之外的EC2實例的指南。
總結和后續步驟
簡要總結一下:ML-Agents使得Unity中建立的游戲和模擬可以作為訓練智能Agent的平台。它旨在實現多種訓練模式和場景,並且提供了多種功能,使研究人員和開發人員能夠在Unity中利用(並增強)機器學習。
為了幫助您使用ML-Agents,我們為安裝ML-Agents創建了幾個深入的教程,開始使用3D Balance Ball環境(我們眾多示例環境之一)並創建您自己的環境。