Unity機器學習代理ML-Agents v0.2版本

下載ML-Agents v0.2

下載地址:

 https://github.com/Unity-Technologies/ml-agents


發行說明:

https://github.com/Unity-Technologies/ml-agents/releases/tag/0.2.0

ML-Agents v0.2新特性

課程學習 

課程學習是一種訓練機器學習模型的方法,它會對同一個問題逐漸增加難度,來讓模型每次都接受最適合的挑戰。


這種方法由來已久,因爲這是人類的典型學習方法。如果你能回想我們的小學教育,所學習的課程和知識點都是有一定次序。例如:我們先學算數再學代數。學習代數後,學習的微積分。我們在早期課程中所學到的技能和知識都爲以後的課程提供了學習基礎。同樣的原理可以應用到機器學習中,在簡單的任務上進行訓練,是爲後續更困難的任務提供基礎。

當我們思考強化學習是如何運作的時候,在訓練過程中代理偶爾會得到的獎勵,這會作爲主要學習信號。在更復雜或困難的任務中,這種獎勵往往是稀少的,而且很少得到。


例如:在任務中代理需要將方塊推起來測量牆的高度。訓練代理將以一個隨機策略作爲完成此任務的起點。這個開始策略由於是隨機的,很可能會讓代理在場景中瞎轉,也可能永遠無法準確地測量牆的高度來獲得獎勵。但如果我們讓代理從一個簡單的任務開始,比如朝着沒有障礙的目標前進,那麼代理就可以很容易地學會完成這個任務。從這裏開始,我們可以通過逐漸增加牆的大小來慢慢提高任務的難度,直到代理能夠完成一開始不可能完成的任務,測出牆的高度。在我們的ML-Agents v0.2中就包含這樣的一個環境,叫Wall Area。

要想在實際操作裏看到效果,觀察下面這二條學習曲線。它們都顯示了對使用PPO訓練的大腦得到的獎勵,這組訓練使用了相同的訓練超參數和來自32個同時運行的代理提供的數據。


橙色線是大腦直接使用完整高度的牆來進行訓練的,而藍色線是大腦通過課程學習任務一點點增加牆的高度來訓練的。如你所見,沒有使用課程學習,代理要獲得獎勵很困難,即使在300萬步之後仍然沒有完成任務。我們認爲,通過精心設計的課程,使用增強學習訓練的代理將能在較短的時間裏順利完成任務,否則就會困難得多。

那麼它是如何工作的?爲了定義一個課程,第一步就是決定環境中的哪些參數會改變。在Wall Area環境中,牆的高度是會改變的。我們可以將它定義爲我們場景中的學院對象的重置參數,並通過Python API來進行調整。然後我們創建一個簡單的JSON文件來描述課程的結構。


在訓練過程中,我們可以通過這個JSON文件來確定牆的高度在哪個點將會發生什麼變化,可以根據已經發生的訓練步驟的百分比決定,也可以根據代理最近獲得的平均獎勵決定。這些完成後,我們只要通過使用課程文件標記(–curriculum-file)指向JSON文件來打開ppo.py即可,我們將使用課程學習來進行訓練。當然,我們可以通過TensorBoard來跟蹤當前的課程和進展。


下面是一個JSON文件的示例:定義了Wall Area環境的課程。

{
    "measure" : "reward",
    "thresholds" : [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5],
    "min_lesson_length" : 2,
    "signal_smoothing" : true, 
    "parameters" : 
    {
        "min_wall_height" : [0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5],
        "max_wall_height" : [1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0]
    }
}

廣播

 如今三種大腦類型,也就是內部(internal)、啓發式(heuristic)和玩家(player)大腦,都加入了“廣播”功能,默認情況下這個功能是激活的。


在活動狀態下,所有與該大腦相連的代理的狀態、操作和獎勵都可通過Python API來獲得。這與v0.1版本不同,在之前的版本中,只有外部大腦可以向Python API發送信息。該功能可用於記錄、分析或存儲來自Python的這些大腦類型的信息。具體來說,這個功能使模仿學習變得可能,來自玩家、啓發式、或者內部大腦的數據能被作爲監督信號來訓練一個獨立的網絡,而不需要定義一個獎勵功能,或者額外增加一個獎勵功能來增強訓練信號。我們認爲這能給遊戲開發者在思考如何讓遊戲更智能時提供一個新思路。

靈活的監控器 

我們重寫了代理監控(Agent Monitor),讓它的可用性更強。原來的監控器只能顯示代理的固定的一組統計數據,新的監控器現在可以顯示與代理相關的任何所需信息。而你只需要調用Monitor.Log()來把信息顯示在屏幕上,或是場景中的代理上。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章