這次主要都是跟著官方放在github的說明文件實作,如果英文OK的話那邊會寫的比較詳細一些(還有簡體中文的樣子,不過翻譯版版本較舊,不確定會不會什麼差別),網址如下
要利用Ml-agents建立一個可供訓練的架構,會需要三個東西:
Agent的功能是觀測環境、設定可操作的動作以及提供reward function,而在觀測環境中Ml-agents可以用記錄特徵向量或是用視覺化的方式來觀測。
Academy用來管理環境,負責環境的初始化及重置。
Brain是用來訓練的物件,藉由操作設計好的agent來和環境互動,以得到最高的reward為目標。在Ml-agents裡有提供三種brain:
Learning Brain:用來訓練的,當你的環境設定好,agent也沒問題就可以用這個brain來訓練。
Heuristic Brain:用來自行設計brain的動作選擇process(實際使用方式待確認)。
Player Brain:用來測試agent的動作。
這次的範例是跟著官方提供的範例走一次,簡單了解一下ML-agents的主要運作方式。
要訓練的環境是由一顆可自由移動的球在平台上讓它順利往目標的正方體移動。
分別將球、平台、正方體命名為Rolleragent、plane、Target,球要再加上rigidbody。
然後球的位置設為0,0.5,0,正方體的位置設為3,0.5,3,平台則是0,0,0。
新建一個空的GameObject,命名為Academy,再新增一個script,取名為Roller academy,將程式碼改寫如下:
using System.Collections;
using System.Collections.Generic;
public class RollerAcademy : Academy{
這裡用ML-agents預設的Academy即可,所以不用去改寫其他東西。
3.建立Agent和Learning brain。
在Roller agent加入新script,命名為roller agent,並改寫程式碼,然後把Decision interval改成10。
using System.Collections;
using System.Collections.Generic;
public class RollerAgent : Agent {
// Use this for initialization
rBody = GetComponent<Rigidbody>();
public override void AgentReset()
if (this.transform.position.y < 0)
// If the Agent fell, zero its momentum
this.rBody.angularVelocity = Vector3.zero;
this.rBody.velocity = Vector3.zero;
this.transform.position = new Vector3(0, 0.5f, 0);
// Move the target to a new spot
Target.position = new Vector3(Random.value * 8 - 4,
public override void CollectObservations()
// Target and Agent positions
AddVectorObs(Target.position);
AddVectorObs(this.transform.position);
AddVectorObs(rBody.velocity.x);
AddVectorObs(rBody.velocity.z);
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,
if (distanceToTarget < 1.42f)
if (this.transform.position.y < 0)
接著,從左上的assets選單選擇create->ML-agents->Learning Brain
將它命名為RollerBallBrain,並將右方的數值改成如圖。
然後將它拖到academy中boardcast hub的brains下面,把control打勾。
在開始訓練前,先去之前下載好的ML-agent裡面的config資料夾裡面,複製trainer_config.yaml到unity的專案資料夾,然後改寫裡面default中的數值:
之後開啟終端機,切換到放trainer_config.yaml的資料夾,在終端機輸入
mlagents-learn trainer_config.yaml --run-id=RollerBall-test –train
執行後按下Unity編輯器的play按鈕,便會開始訓練了。
5.讀取訓練好的檔案。
訓練完之後,model會存在models\RollerBall-test-0資料夾中,把裡面的nn檔放到Learning brain的inspector的model選項,並把academy的control取消打勾,再按下play就可以看到結果了。
如果有什麼錯誤的地方歡迎在下面留言或是來信告知,感謝!