Unity中的強(qiáng)化學(xué)習(xí) Reinforcement Learning in Unity
強(qiáng)化學(xué)習(xí)是一種人工智能技術(shù),通過(guò)獎(jiǎng)勵(lì)理想的行為來(lái)訓(xùn)練agent執(zhí)行任務(wù)痕慢。在強(qiáng)化學(xué)習(xí)過(guò)程中,agent會(huì)探索其環(huán)境,觀察事物的狀態(tài)搜贤,并根據(jù)這些觀察結(jié)果采取行動(dòng)。如果行動(dòng)能得到更好的狀態(tài)钝凶,agent會(huì)收到積極的獎(jiǎng)勵(lì)仪芒。如果導(dǎo)致不太理想的狀態(tài),那么agent不會(huì)收到獎(jiǎng)勵(lì)或負(fù)面獎(jiǎng)勵(lì)(懲罰)。當(dāng)在訓(xùn)練期間學(xué)習(xí)時(shí)掂名,agent會(huì)優(yōu)化其決策据沈,以便隨著時(shí)間的推移獲得最大的回報(bào)。
ML-Agents使用稱為Proximal Policy Optimization(PPO)的強(qiáng)化學(xué)習(xí)算法饺蔑。PPO使用神經(jīng)網(wǎng)絡(luò)來(lái)逼近目標(biāo)函數(shù)锌介,該目標(biāo)函數(shù)將agent的觀察結(jié)果映射為其在給定狀態(tài)下可以采取的最佳行動(dòng)。ML-Agents PPO算法使用TensorFlow實(shí)現(xiàn)膀钠,并在單獨(dú)的Python進(jìn)程中運(yùn)行(通過(guò)socket與正在運(yùn)行的Unity應(yīng)用程序進(jìn)行通信)掏湾。
注意:如果您不是主要研究學(xué)習(xí)機(jī)器和強(qiáng)化學(xué)習(xí),只想訓(xùn)練agent完成任務(wù)肿嘲,則可以將PPO訓(xùn)練視為黑箱(black box)融击。在Unity以及Python訓(xùn)練方面有一些與訓(xùn)練相關(guān)的參數(shù)可供調(diào)整,但你不需要深入了解算法本身就可以成功創(chuàng)建和訓(xùn)練agent雳窟。訓(xùn)練部分(https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Training-PPO.md)提供了運(yùn)行訓(xùn)練過(guò)程的分步驟尊浪。
模擬和訓(xùn)練過(guò)程
培訓(xùn)和模擬由ML-Agents Academy類協(xié)調(diào)進(jìn)行。Academy與場(chǎng)景中的Agent和Brain對(duì)象一起工作以逐步完成模擬封救。當(dāng)Academy已經(jīng)達(dá)到其最大步數(shù)或場(chǎng)景中的所有agent完成時(shí)拇涤,一個(gè)episode完成。
在訓(xùn)練期間誉结,外部Python訓(xùn)練進(jìn)程與Academy進(jìn)行交流鹅士,在收集數(shù)據(jù)并優(yōu)化其神經(jīng)網(wǎng)絡(luò)模型的同時(shí)運(yùn)行一系列episodes。分配給agent的Brain類型決定了它是否參與訓(xùn)練惩坑。External brain與外部進(jìn)程溝通來(lái)訓(xùn)練TensorFlow模型掉盅。訓(xùn)練成功完成后,你可以將訓(xùn)練好的模型文件添加到Unity項(xiàng)目中以舒,以便與Internal brain一起使用趾痘。
ML-Agents Academy類按如下方式編排agent模擬循環(huán):
1. 調(diào)用您的Academy子類的AcademyReset()函數(shù)。
2. 調(diào)用場(chǎng)景中每個(gè)agent的AgentReset()函數(shù)蔓钟。
3. 調(diào)用場(chǎng)景中每個(gè)agent的CollectObservations()函數(shù)永票。
4. 使用每個(gè)agent的Brain類來(lái)決定agent的下一個(gè)動(dòng)作。
5. 調(diào)用Academy子類的AcademyAct()函數(shù)滥沫。
6. 為場(chǎng)景中的每個(gè)agent調(diào)用AgentAction()函數(shù)侣集,傳遞agent Brain選擇的動(dòng)作。(如果agent已完成兰绣,則不會(huì)調(diào)用此函數(shù)肚吏。)
7. 如果agent已達(dá)到其最大步數(shù)或者將其自身標(biāo)記為完成,則調(diào)用agent的AgentOnDone()函數(shù)狭魂。或者,你可以將agent設(shè)置為在episode結(jié)束之前完成重新啟動(dòng)雌澄。在這種情況下斋泄,Academy調(diào)用AgentReset()函數(shù)。
8. Academy達(dá)到自己的最大步數(shù)時(shí)镐牺,通過(guò)調(diào)用Academy子類的AcademyReset()函數(shù)再次開(kāi)始下一個(gè)episode炫掐。
要?jiǎng)?chuàng)建訓(xùn)練環(huán)境,請(qǐng)擴(kuò)展Academy和Agent類以實(shí)現(xiàn)上述方法睬涧。Agent.CollectObservations()和Agent.AgentAction()函數(shù)是必需的; 其他方法是可選的 - 你是否需要實(shí)現(xiàn)它們?nèi)Q于你的具體情況募胃。
注意:Python
PPO訓(xùn)練進(jìn)程用于在訓(xùn)練期間與Academy進(jìn)行通信并控制Academy的API也可用于其他目的。
例如畦浓,您可以使用API將Unity用作您自己的機(jī)器學(xué)習(xí)算法的模擬引擎痹束。有關(guān)更多信息,請(qǐng)參閱Python
API讶请。
組織Unity場(chǎng)景
要在Unity場(chǎng)景中訓(xùn)練和使用ML-Agents祷嘶,場(chǎng)景必須包含一個(gè)Academy子類以及所需的Brain對(duì)象和Agent子類。場(chǎng)景中的任何Brain實(shí)例都必須附加到Unity場(chǎng)景層次結(jié)構(gòu)中Academy的子級(jí)GameObjects上夺溢。Agent實(shí)例應(yīng)附加到代表該Agent的GameObject论巍。
你必須為每個(gè)agent分配一個(gè)Brain,但是你可以在多個(gè)agents之間共享Brain风响。每個(gè)agent都將獨(dú)立進(jìn)行觀察并采取行動(dòng)嘉汰,但會(huì)使用相同的決策邏輯,對(duì)于Internal
brain状勤,則使用相同的經(jīng)過(guò)訓(xùn)練的TensorFlow模型鞋怀。
Academy
Academy對(duì)象總體協(xié)調(diào)agents及其決策過(guò)程。只能將一個(gè)Academy對(duì)象放置在場(chǎng)景中荧降。
你必須創(chuàng)建Academy類的子類(因?yàn)榛愂浅橄蟮模┙芋铩?chuàng)建Academy子類時(shí),可以實(shí)現(xiàn)以下方法(全部都是可選的):
- InitializeAcademy(): 初次啟動(dòng)時(shí)準(zhǔn)備環(huán)境朵诫。
- AcademyReset(): 為下一個(gè)訓(xùn)練集準(zhǔn)備環(huán)境和agent辛友。根據(jù)需要使用此功能在場(chǎng)景中放置和初始化實(shí)體。
- AcademyStep(): 為下一個(gè)模擬步驟準(zhǔn)備環(huán)境剪返。在為當(dāng)前步驟調(diào)用任何AgentAction()方法之前废累,Academy類將調(diào)用此函數(shù)。你可以使用此功能在agent采取行動(dòng)之前更新場(chǎng)景中的其他對(duì)象脱盲。請(qǐng)注意邑滨,agent已經(jīng)收集了他們的觀察結(jié)果,并在Academy調(diào)用此方法之前選擇了一個(gè)操作钱反。
基礎(chǔ)Academy類還定義了可以在Unity Editor檢查器中設(shè)置的幾個(gè)重要屬性掖看。對(duì)于訓(xùn)練匣距,這些屬性中最重要的是Max Steps,它決定了每次訓(xùn)練持續(xù)的時(shí)間哎壳。一旦Academy的步數(shù)計(jì)數(shù)器達(dá)到此值毅待,它將調(diào)用AcademyReset()函數(shù)開(kāi)始下一個(gè)episode。
請(qǐng)參閱Academy(https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Learning-Environment-Design-Academy.md)了解Academy屬性及其用途的完整列表归榕。
Brain
Brain囊括了決策過(guò)程尸红,該對(duì)象必須是Unity場(chǎng)景層次結(jié)構(gòu)中Academy的子級(jí)。每個(gè)agent都必須分配一個(gè)Brain刹泄,但是您可以將同一個(gè)Brain與多個(gè)agents一起使用外里。
直接使用Brain類,而不是子類特石。 Brain行為取決于Brain的類型盅蝗。在訓(xùn)練期間,將agent的Brain類型設(shè)置為“External”县匠。要使用訓(xùn)練好的模型槽畔,請(qǐng)將模型文件導(dǎo)入到Unity項(xiàng)目中瘫怜,并將Brain類型更改為“Internal”。有關(guān)使用不同類型的Brain的詳細(xì)信息,請(qǐng)參閱Brain(https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Learning-Environment-Design-Brains.md)奴潘。如果四種內(nèi)置類型不能滿足您的需求吩案,您可以擴(kuò)展CoreBrain類以創(chuàng)建不同的Brain類型研儒。
Brain類有幾個(gè)重要的屬性恋昼,您可以使用Inspector窗口進(jìn)行設(shè)置。這些屬性必須適合使用Brain的agent玖姑。例如愕秫,“矢量觀察空間大小”屬性必須與agent完全創(chuàng)建的特征矢量的長(zhǎng)度相匹配。有關(guān)創(chuàng)建agent和正確設(shè)置Brain實(shí)例的信息焰络,請(qǐng)參閱agent(http://www.reibang.com/p/6d40059a3454)戴甩。
Agent
Agent類表示場(chǎng)景中的一個(gè)行動(dòng)者(actor),收集觀察結(jié)果并執(zhí)行操作闪彼。
Agent類通常附加到場(chǎng)景中的GameObject對(duì)象 -例如甜孤,在足球比賽中的球員對(duì)象或車輛模擬中的車對(duì)象。 每個(gè)agent必須分配一個(gè)Brain畏腕。
要?jiǎng)?chuàng)建agent缴川,需要擴(kuò)展agent類并實(shí)現(xiàn)基本的CollectObservations()和AgentAction()方法:
- CollectObservations(): 收集agent對(duì)其環(huán)境的觀察。
- AgentAction(): 執(zhí)行agent大腦選擇的行動(dòng)并為當(dāng)前狀態(tài)分配獎(jiǎng)勵(lì)描馅。
這些函數(shù)的實(shí)現(xiàn)決定了分配給此agent的Barin屬性該怎樣設(shè)置把夸。
您還必須確定Agent如何完成任務(wù)或超時(shí)。Agent完成(或不可撤銷地失斆邸)任務(wù)后恋日,可以手動(dòng)將Agent程序設(shè)置為在AgentAction()函數(shù)中完成膀篮。還可以將Agent的Max Steps屬性設(shè)置為正值,并且Agent在執(zhí)行了多個(gè)步驟后會(huì)認(rèn)為自己已完成谚鄙。當(dāng)Academy達(dá)到自己的最大步數(shù)時(shí)各拷,它開(kāi)始下一episode。如果將Agent的ResetOnDone屬性設(shè)置為true闷营,則該Agent可以在一個(gè)episode中多次嘗試其任務(wù)。(使用Agent.AgentReset()函數(shù)準(zhǔn)備Agent以再次啟動(dòng)知市。)
這里(http://www.reibang.com/p/6d40059a3454)有更詳細(xì)的介紹傻盟。
環(huán)境
ML-Agents中的環(huán)境可以是Unity中構(gòu)建的任何場(chǎng)景。Unity場(chǎng)景提供了Agent進(jìn)行觀察嫂丙,行動(dòng)和學(xué)習(xí)的環(huán)境娘赴。如何將Unity場(chǎng)景設(shè)置為學(xué)習(xí)環(huán)境,這取決于你的目標(biāo)跟啤。
你可能試圖解決范圍有限的特定強(qiáng)化學(xué)習(xí)問(wèn)題诽表,在這種情況下,你可以使用相同的場(chǎng)景進(jìn)行訓(xùn)練和測(cè)試受過(guò)訓(xùn)練的agent隅肥「妥啵或者,您可能會(huì)訓(xùn)練agent在復(fù)雜的游戲或模擬中操作腥放。在這種情況下泛啸,創(chuàng)建專門構(gòu)建的訓(xùn)練場(chǎng)景可能更加高效和實(shí)用。
訓(xùn)練和測(cè)試(或正常游戲)場(chǎng)景都必須包含一個(gè)Academy對(duì)象來(lái)控制agent決策過(guò)程秃症。Academy定義了幾種可以針對(duì)訓(xùn)練場(chǎng)景與常規(guī)場(chǎng)景設(shè)置不同的屬性候址。Academy的配置屬性控制渲染和時(shí)間尺度。你可以設(shè)置訓(xùn)練配置以最大限度地縮短Unity花費(fèi)渲染圖形的時(shí)間种柑,以加快訓(xùn)練速度岗仑。你可能還需要調(diào)整其他的Academy設(shè)置。 例如聚请,Max Steps應(yīng)盡可能縮短培訓(xùn)時(shí)間——只需要足夠長(zhǎng)的時(shí)間以便阿根廷完成任務(wù)荠雕,并在學(xué)習(xí)過(guò)程中有一些額外的時(shí)間來(lái)“漫游”。在常規(guī)場(chǎng)景中良漱,你經(jīng)常不希望Academy完全重置場(chǎng)景; 如果是這樣的話舞虱,Max Steps應(yīng)該設(shè)置為零。
在Unity中創(chuàng)建訓(xùn)練環(huán)境時(shí)母市,必須設(shè)置場(chǎng)景以便可以通過(guò)外部訓(xùn)練進(jìn)程來(lái)控制場(chǎng)景矾兜。
考慮因素包括:
- 訓(xùn)練場(chǎng)景必須在訓(xùn)練過(guò)程啟動(dòng)Unity應(yīng)用程序時(shí)自動(dòng)啟動(dòng)。
- 場(chǎng)景必須至少包含一個(gè)External brain患久。
- 學(xué)院必須將場(chǎng)景重置為每個(gè)訓(xùn)練集合的有效起點(diǎn)椅寺。
- 訓(xùn)練集必須有一個(gè)明確的結(jié)局 - 使用
Max Steps
或每個(gè)agent設(shè)置自己為完成狀態(tài)浑槽。