Unity3D ML – Agent (2) – 程式功能介紹

簡介

當大家有Unity ML三大核心元素(Academy , Brain , Agent)觀念後,來講講要寫比較多程式的Agent核心,再提醒一下Agent最主要是跟Brain數據溝通,並由Agent來與Environment加上數據啟動Action與虛擬環境做交互作用,那就讓我們看看怎麼透過程式啟動這些功能與串連三大核心元素的方法。

Agent – Collect Observations

字面上的意思Collect Observations,就是透過Agent來擷取Brain所制定的Space Size : 8個元素(他是個陣列,8個空間儲存每次觀察到的資料)。我們可以看到上圖紅框框,是Brain所制定的限制,但你在設計自己的訓練環境中要先想好自己的腳本,才知道有哪些數據需要被搜集的。

看到上圖,在上一篇的程式基礎架構就把需要被搜集的數據都放在 CollectObservations() 之中。而我們依然使用平衡小球的數據,AddVectorObs() 這是ML Agent中搜集數據的函式,並把要觀察的物件位移、角度、差值等等細部參數放在函式中即可。

可以看到上圖二會看到:
1.agent物件的Z軸轉動角度。
2.agent物件的X軸轉動角度。
3-5.平衡小球與agent物件的X、Y、Z的各軸向差值。
6-8.平衡小球的重力X、Y、Z的環境軸向。

Agent – Discrete or Continuous + Action

在平衡小球範例中我們是使用Continuous連續值觀察變量,如上圖。可以看到判斷式是擷取brain.brainParameters的SpaceType中的Continuous中,有兩個Space Size,所以我們就在此判斷式中新增兩個可變變數,actionZ:水平變量、actionX:垂直的變量,來擷取Brain發出的每次的Action值。並分別判斷XZ的轉動值是不是在我們想要的每次變動值接受範圍,就作動Action。

Continuous 連續觀察寫法:
由於Unity-ML使用ppo演算法運算,在Continuous space type中,將我們在brain制定好的space vector變量轉換成一個值,介於-1 , 1之間,需要運用mathf.clamp函式,最後給agent去轉換成下一步的動作。如下圖。

Discrete 分散式觀察寫法:
SetActionMask (brance  , actionIndices),這方法只能在playbrain或是heuristic brain下使用,並寫在CollectObservations()之中。這用法是在引導AI去學習對的方向,有點像考試open book,給AI一個學習的方向。舉個例子,假如我有個角色掛了一個agents,學習目的是遇到敵人擊殺他,我運用了discrete設定了兩個branch type,其中0的type裡有四個分支,砍、檔、躲、跑,我們解決敵人最快的方式就是躲跟跑,所以我SetActionMask可以寫成這樣 : SetActionMask ( 0 , intp[2]{2,3}) ,接著掛載檢盤事件,當我按下某鍵後會優先執行這個函式來加快他訓練速度。

Agent – Reward

Reward在unity機器學習增強學習PPO演算法中是不可或缺的東西,有好的reward機制會讓它學得更精確更快速。但reward不會再模仿學習或是已經訓練好的brain中使用到。在場景中可以將累積reward的機制視覺化,可以在editor模式看他長時間訓練的過程與結果來從中微調reward機制。

分配獎勵機制的函示 AddReward () 必須寫在AgentAction()方法裡面。
– 他分配獎勵的數值介於-1 ~ 1 之間。假如分數限制在這範圍之外,會使訓練變得不穩定。
– 當一次訓練完畢後,他的執會回到0,接著進行下一個決策動作。
– 如果有多筆呼叫AddReward()的動作在同一個agent時,所有的值將會加總在一起並去評估哪一個decision是最好的。這方法被稱為SetReward()。

Agent – Other

Monitoring Agent:
這功能就是將agent在training的過程視覺話,會顯示在scene中,如次就不用看command line的那些看不太懂的東西,也可以知道reward的累積,CollectObservations的變量等等。

Instantiating an Agent in runtime:
在runtime的時候即時新增agent prefab去執行訓練,就如同我們一班使用到的gameobject.instantiate()方式。
但要注意的是要runtime新增agent需要用到CreateAgent()方法,並要指定給他位置、旋轉角度、brain

Destroying an Agent:
當Agent完成一次的訓練後就把Agent物件刪除掉,這方法執行的時間點有點像Reward中段落講述到的Done類似。

小結

我們講到這邊,基礎的Unity ML其實也講了差不多了,著重於講述Brain – Learning Brain的模式下,透過Brain – Continuous 觀察值,統一由Agent來做交互作用,並把一次epoch的值由Agent傳給Brain再由External – Academy與外部python來溝通,而下篇我們來講述外部溝通的部分,train_config檔案中所列的參數到底是在做什麼、是什麼意思。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *