Unity 用ml-agents機器學習造個遊戲AI吧(2)(入門DEMO)

前言:
上一篇博文已經介紹了Unity ml-agents的環境配置(https://www.cnblogs.com/KillerAery/p/10629963.html)了
我的建議先敲demo再摸清概念比較容易上手。所以本文先提供一個demo示例,再提供概念相關。html

本次示例:訓練一個能追蹤小球的遊戲AI

1.新建一個Unity項目

並將以前下載的ml-agents項目UnitySDK目錄下的Assets和ProjectSettings導入(複製覆蓋)進新建的Unity項目ios

2.進入Unity項目,先編寫好兩個腳本

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();
        }

    }
}

3.建立Brain決策體

建立兩個Brain文件

  • 打開Asset => Create => ML-Agents => LearningBrain
  • 打開Asset => Create => ML-Agents => PlayerBrain

更改好名字(本文取了RollerBallBrain和RollerBallPlayer),這樣就建立了兩個Brain文件。dom

LearningBrain適用於訓練模型的決策體,而PlayerBrain只是映射鍵盤按鍵的決策體(即玩家控制)。
之因此建立PlayerBrain,在訓練前可以讓玩家經過真實操控測試當前遊戲環境是否正確,而後確認無問題後再切換LearningBrain交給機器去操控(訓練)。機器學習

對RollerBallPlayer進行配置

從上面寫的RollerAgent腳本,咱們知道:ide

  • Observation Space Size調整爲8:由於總共觀察 2個3D位置+2個1D速度,所以總共大小空間爲8個float大小。
  • Action Space Size 調整爲2:由於總共動做 有2個數值
  • 引入了4個按鍵WASD:爲了讓操做對2個動做值影響,因此4個按鍵分別對應2個動做值的正負1

對RollerBallBrain進行配置

而後咱們讓RollerBallBrain直接Copy Brain Parameters from剛剛配置好的RollerBallPlayer:學習

  • 還要調整Inference Device 爲GPU

4.搭建好遊戲場景

建立一個地板(Plane)

建立一個小球(Target)

建立要控制的智能體(RollerAgent)

  • Brain 綁定RollerBallPlayer時,是玩家能夠操控它。綁定RollerBallBrain時,是機器操控它。
  • Decision Interval(決策間隔)調整爲10,讓它的Brain作決策不要太頻繁也不要太過稀疏

建立訓練環境遊戲對象(Academy)

  • 在BroadcastHub綁定好那兩個Brain文件

目前場景預覽:

  • 此外將RollerAgent的Brain綁定RollerBallPlayer,運行Unity場景,嘗試本身用WASD鍵盤操控小球,測試遊戲場景是否OK。

5.開始訓練(掛機)

  • 將RollerAgent的Brain綁定RollerBallBrain

  • 而後將Academy的BroadcastHub裏RollerBallBrain的Control勾上

而後如今能夠打開開始菜單,直接使用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/config.yaml是訓練配置文件,RollerBall-1是你給訓練出來的模型取的名字
  • 此外注意config/config.yaml是不存在的,須要本身仿照於官方的示例配置文件config/trainer_config.yaml並修改配置而新建的。

下面是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,點下運行鍵,那麼你就會看到Unity執行訓練。


你的命令窗口也會時刻告訴你訓練階段的信息。

  • 能夠去睡覺等待結果了,亦或者在某個時間中止Unity運行。那麼ml-agents會將目前爲止訓練出來的數據模型保存到ml-agents\models目錄下。

6.跑訓練出來的模型

  • 將ml-agents\models目錄下跑出來的RollerBall-1文件夾整個複製到你剛剛Unity項目裏。
  • Unity裏,將RollerBallBrain的Model綁定上剛剛複製文件夾的NNModel。

  • Unity裏,將Academy的BroadcastHub的Control勾選去掉。

  • 運行Unity場景,看看你跑出來的模型的蠢樣了(笑)。

概念

另一提,最新的介紹文檔資料示例等都在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爲例介紹:

Agent(智能體)

它能夠被附加到一個 Unity 遊戲對象上(場景中的 任何角色),負責生成它的觀測結果、執行它接收的動做並適時分配獎勵。在例子裏,它應該附加到軍醫遊戲對象上。

  • 觀測 : 軍醫對環境的感知。觀測能夠是數字和/或視覺形式。數字觀測會從 Agent 的角度測量環境的屬性。對於軍醫來講,這將是軍醫能夠看到的戰場屬性。根據遊戲和 agent 的不一樣,數字觀測的數據能夠是__離散__的或__連續__的形式。對於大多數有趣的環境,Agent 將須要若干連續的數字觀測,而對於具備少許獨特配置的簡單環境,離散觀測就足夠了。另外一方面,視覺觀測是附加到 agent 的攝像頭所生成的圖像,表明着 agent 在該時間點看到的內容。

    • 咱們一般會將 agent 的觀測與環境狀態混淆。環境狀態表示包含全部遊戲角色的整個場景的信息。可是,agent 觀測僅包含它本身所瞭解的信息,一般是環境狀態的一個子集。例如,軍醫觀測不能包含隱身敵人的信息。
  • 動做 : 軍醫可採起的動做。動做能夠是連續的或離散的。就軍醫而言,若是環境是一個只是簡單的網格世界, 那麼採用四個方向的離散動做就足夠了(即上下左右)。可是,若是環境更加複雜而且軍醫能夠自由移動,那麼使用兩個連續動做(一個對應於方向, 另外一個對應於速度)更合適。

    • 除了上述的移動動做外,軍醫還應有救治動做等。
  • 獎勵信號 : 一個表示軍醫行爲的標量。例如,軍醫在死亡時會獲得很大的負獎勵,每當恢復受傷的隊員時會獲得適度的正獎勵,而在受傷隊員因缺少救助而死亡時會獲得適度的負獎勵。

    • 獎勵信號表示如何將任務的目標傳達給 agent,因此採用的設置方式須要確保當得到的獎勵達到最大值時,agent可以產生咱們最指望的行爲。
    • 注意,不須要在每一個時刻都提供獎勵信號,只有在軍醫執行好的或壞的動做時才提供。

Brain(決策體)

它封裝了 Agent 的決策邏輯。實質上,Brain 中保存着每一個 Agent 的 policy,決定了 Agent 在每種狀況下應採起的動做。更具體地說,Agent 給其綁定的 Brain 發送 Agent的觀測結果和獎勵 ,而後 Brain 返回下一步的動做。

Academy(學院,更確切是指學習環境的管理設置)

每一個它是負責指揮場景內全部 Agent 的觀測和決策過程的總體訓練環境。它能夠指定若干環境參數,例如渲染質量和環境運行速度參數。

相關文章
相關標籤/搜索