前言:
上一篇博文已經介紹了Unity ml-agents的環境配置(https://www.cnblogs.com/KillerAery/p/10629963.html)了。
我的建議先敲demo再摸清概念比較容易上手。所以本文先提供一個demo示例,再提供概念相關。html
並將以前下載的ml-agents項目UnitySDK目錄下的Assets和ProjectSettings導入(複製覆蓋)進新建的Unity項目ios
RollerAcademy 是將用於學院(更確切是指學習環境的管理)的組件:git
//RollerAcademy.cs //繼承Academy用於重寫學院設置,就目前而言無需改動,所以簡單的直接繼承便可。 using MLAgents; public class RollerAcademy : Academy { }
RollerAgent 是將用於智能體對象的組件:github
//RollerAgent.cs //繼承Agent用於重寫智能體的AgentReset,CollectObservations,AgentAction等方法。 using MLAgents; using UnityEngine; public class RollerAgent : Agent { Rigidbody rBody; void Start() { rBody = GetComponent<Rigidbody>(); } public Transform Target; //Reset時調用 public override void AgentReset() { if (this.transform.position.y < 0) { //若是智能體掉下去,則重置位置+重置速度 this.rBody.angularVelocity = Vector3.zero; this.rBody.velocity = Vector3.zero; this.transform.position = new Vector3(0, 0.5f, 0); } //將目標球重生至一個新的隨機位置 Target.position = new Vector3(Random.value * 8 - 4,0.5f,Random.value * 8 - 4); } //收集觀察結果 public override void CollectObservations() { //------ 觀測 //觀測到目標球和智能體的位置 AddVectorObs(Target.position); AddVectorObs(this.transform.position); //觀測到智能體的速度 AddVectorObs(rBody.velocity.x); AddVectorObs(rBody.velocity.z); //在這裏由於目標球是不會動的,智能體也不會在y軸上又運動,因此沒有必要觀察這些值的變化。 //AddVectorObs(rBody.velocity.y); } public float speed = 10; //處理動做,並根據當前動做評估獎勵信號值 public override void AgentAction(float[] vectorAction, string textAction) { //------ 動做處理 // 接受兩個動做數值 Vector3 controlSignal = Vector3.zero; controlSignal.x = vectorAction[0]; controlSignal.z = vectorAction[1]; rBody.AddForce(controlSignal * speed); //------ 獎勵信號 float distanceToTarget = Vector3.Distance(this.transform.position,Target.position); // 到達目標球 if (distanceToTarget < 1.42f) { //獎勵值+1.0f SetReward(1.0f); Done(); } // 掉落場景外 if (this.transform.position.y < 0) { Done(); } } }
更改好名字(本文取了RollerBallBrain和RollerBallPlayer),這樣就建立了兩個Brain文件。dom
LearningBrain適用於訓練模型的決策體,而PlayerBrain只是映射鍵盤按鍵的決策體(即玩家控制)。
之因此建立PlayerBrain,在訓練前可以讓玩家經過真實操控測試當前遊戲環境是否正確,而後確認無問題後再切換LearningBrain交給機器去操控(訓練)。機器學習
從上面寫的RollerAgent腳本,咱們知道:ide
而後咱們讓RollerBallBrain直接Copy Brain Parameters from剛剛配置好的RollerBallPlayer:學習
而後如今能夠打開開始菜單,直接使用cmd命令窗口,
cd到以前下載ml-agents項目的目錄裏測試
cd C:\Downloads\ml-agents
再輸入激活ml-agents環境:ui
activate ml-agents
開啓訓練:
mlagents-learn config/config.yaml --run-id=RollerBall-1 --train
下面是config.yaml示例:
default: trainer: ppo batch_size: 10 beta: 5.0e-3 buffer_size: 100 epsilon: 0.2 gamma: 0.99 hidden_units: 128 lambd: 0.95 learning_rate: 3.0e-4 max_steps: 3.0e5 memory_size: 256 normalize: false num_epoch: 3 num_layers: 2 time_horizon: 64 sequence_length: 64 summary_freq: 1000 use_recurrent: false use_curiosity: false curiosity_strength: 0.01 curiosity_enc_size: 128
config/config.yaml裏面的參數具體配置之後再更新說明,如今懶得寫
當出現以下畫面:
你的命令窗口也會時刻告訴你訓練階段的信息。
另一提,最新的介紹文檔資料示例等都在Unity官方機器學習的github項目,感興趣能夠持續保持關注它的更新:
https://github.com/Unity-Technologies/ml-agents
Unity官方博客機器學習概念詳解(1):https://blogs.unity3d.com/2017/12/11/using-machine-learning-agents-in-a-real-game-a-beginners-guide/
Unity官方博客機器學習概念詳解(2):https://blogs.unity3d.com/2017/06/26/unity-ai-themed-blog-entries/
Unity ml-agents概念詳解國內翻譯博客:https://blog.csdn.net/u010019717/article/details/80382933
這裏只作部分概念簡介,懶得寫太多了。
爲了更好理解概念,這裏以多人戰爭遊戲中的軍醫AI爲例介紹:
它能夠被附加到一個 Unity 遊戲對象上(場景中的 任何角色),負責生成它的觀測結果、執行它接收的動做並適時分配獎勵。在例子裏,它應該附加到軍醫遊戲對象上。
觀測 : 軍醫對環境的感知。觀測能夠是數字和/或視覺形式。數字觀測會從 Agent 的角度測量環境的屬性。對於軍醫來講,這將是軍醫能夠看到的戰場屬性。根據遊戲和 agent 的不一樣,數字觀測的數據能夠是__離散__的或__連續__的形式。對於大多數有趣的環境,Agent 將須要若干連續的數字觀測,而對於具備少許獨特配置的簡單環境,離散觀測就足夠了。另外一方面,視覺觀測是附加到 agent 的攝像頭所生成的圖像,表明着 agent 在該時間點看到的內容。
- 咱們一般會將 agent 的觀測與環境狀態混淆。環境狀態表示包含全部遊戲角色的整個場景的信息。可是,agent 觀測僅包含它本身所瞭解的信息,一般是環境狀態的一個子集。例如,軍醫觀測不能包含隱身敵人的信息。
動做 : 軍醫可採起的動做。動做能夠是連續的或離散的。就軍醫而言,若是環境是一個只是簡單的網格世界, 那麼採用四個方向的離散動做就足夠了(即上下左右)。可是,若是環境更加複雜而且軍醫能夠自由移動,那麼使用兩個連續動做(一個對應於方向, 另外一個對應於速度)更合適。
- 除了上述的移動動做外,軍醫還應有救治動做等。
獎勵信號 : 一個表示軍醫行爲的標量。例如,軍醫在死亡時會獲得很大的負獎勵,每當恢復受傷的隊員時會獲得適度的正獎勵,而在受傷隊員因缺少救助而死亡時會獲得適度的負獎勵。
- 獎勵信號表示如何將任務的目標傳達給 agent,因此採用的設置方式須要確保當得到的獎勵達到最大值時,agent可以產生咱們最指望的行爲。
- 注意,不須要在每一個時刻都提供獎勵信號,只有在軍醫執行好的或壞的動做時才提供。
它封裝了 Agent 的決策邏輯。實質上,Brain 中保存着每一個 Agent 的 policy,決定了 Agent 在每種狀況下應採起的動做。更具體地說,Agent 給其綁定的 Brain 發送 Agent的觀測結果和獎勵 ,而後 Brain 返回下一步的動做。
每一個它是負責指揮場景內全部 Agent 的觀測和決策過程的總體訓練環境。它能夠指定若干環境參數,例如渲染質量和環境運行速度參數。