2017年12月24日 星期日

[攻略]Unity - 3D小球機器學習專案架設

整理潤稿:Wei J,Kelvin Lo

本文將分享如何安裝Unity機器學習代理工具(Unity Machine Learning Agents),並透過官方範例3D小球,了解整個環境的安裝方法。

在本文中使用的案例是3D平衡小球(3D Balance Ball)的運行環境。該環境包含多個平板和小球。這些平板可以自己做縱向及橫向旋轉,來保持小球不掉離平板。每個平板都是一個代理,通過保持小球在平板上的時間得到獎勵;掉出平板,則會扣除獎勵。這個訓練過程的目的在於讓平板學習永遠不讓球落下。 

3D小球實際成果展示

-------------------------------------
整篇文章為參考以下文件列表所整合的一個攻略流程:
Windows 10安裝攻略 by Jason Weimann
Mac安裝攻略 by 
鲍健运
專案Github
整合Unity教學
Ptyhon與其他軟體安裝
--------------------------------------------------

開始:


如果你要架在Windows 10平台上:

本教學需要安裝的軟體清單如下:
Nvidia CUDA toolkit - CUDA 8.0.61
CUDNN檔案 - CUDA 8.0使用的v6.0版
安裝Anaconda會安裝以下套件:
- Python
- Jupyter
- TensorFlow
- Matplotlib
- numpy
- pillow
- docopt
Unity範例專案


設定Unity機器學習代理工具和TensorFlow環境(Windows 10)
本章節轉載由Jason Weimann所寫的文章,說明在Windows 10上如何設定Unity機器學習和TensorFlow環境。本章節完成後會繼續說明如何設定Unity官方的機器學習展示專案 - 3D Ball。

說明

  • 本章節針對Windows 10平台,Mac環境設定請跳過本章節。 
  • 請注意軟體所對應的版本,如果版本不同可能會導致安裝不成功。 
  • 下載和安裝軟體前請關閉Unity和Visual Studio,並確認你的Windows 10電腦採用NVIDIA顯卡,因為本文所使用的GPU加速工具包是NVIDIA的CUDA。 

安裝CUDA工具


首先需要下載CUDA 8.0.61。請到GUDA下載頁面,選擇下載CUDA Toolkit 8.0 GA2。 (會有很多新版本,但本案要下載這個版本)




下載完成後執行安裝,當出現下圖所示的選擇安裝介面。請選擇“Express”,一直下一步到完成CUDA工具的安裝。



安裝CUDA深度神經網路資料庫CUDNN


接下來需要下載CUDA深度神經網路庫(CUDA Deep Neural Network),簡稱CUDNN。它是專門針對深度神經網路框架設計的一套GPU計算加速方案。全世界的深度學習研究者和框架開發者都使用CUDNN來增強GPU計算效能。這讓他們能專注於訓練神經網路、開發軟體應用,不用在低級別的GPU性能調整上耗費時間。CUDNN支持當下流行的各種深度學習框架,包括Caffe2、MATLAB、Microsoft Cognitive Toolkit、TensorFlow和PyTorch等。

CUDNN下載頁面,選擇CUDA 8.0使用的v6.0版本下載。當下載CUDNN時,Nvidia 會要求你登入,可以註冊一個免費帳號登入。





下載完成後解壓縮會有三個目錄(bin、include和lib資料夾),確定CUDA工具安裝完成後,把這三個目錄複製到CUDA 8.0工具資料夾。 

一般來說安裝CUDA時的預設路徑是:
C:\Program Files\NVIDIA GPU Computing Toolkit\cuda\v8




複製bin、include和lib資料夾到\
NVIDIA GPU Computing Toolkit\cuda\v8目錄底下

設定環境變數和路徑


接下來需要幫Windows系統增加環境變數和路徑設定。


1.開啟檔案總管,在本機上按右鍵選內容
2.進入系統控制台後選進階系統設定
3.點選進階頁面底下的環境變數




4.點"新增"按鈕。 
加一個CUDA_HOME,數值設為: 
C:\Program Files\NVIDIA GPU Computing Toolkit\cuda\v8.0(路徑是你的CUDA安裝路徑)

選擇"確定"。




編輯路徑Path

先找到Path,反白後點"編輯",會開出系統路徑快捷表。



新增兩個系統路徑。
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\extras\CUPTI\libx64


最上面兩個是安裝CUDA時產生的不要去動它
新加的路徑會在最下面,注意不要打錯字了


安裝Anaconda


為了要安裝Python和Jpyther套件,為了避免繁瑣的安裝流程,建議採用Anaconda來安裝會比較容易。
到Anaconda的下載頁面,下載Python 3.6,選擇64位版本。下載完成後安裝Anaconda,按照系統下一步到完成安裝


安裝完成後你應該可以在快速選單找到Anaconda Prompt。開啟它。 



接下來所有的Command line指令都是在
Anaconda Prompt執行。

下一步,我們要創建使用Python 3.5.2的執行環境。在Anaconda Prompt中輸入指令來建立環境:

conda create -n tensorflow-gpu python=3.5.2


然後輸入指令啟動剛剛創建的環境:

activate tensorflow-gpu


最後用這個指令安裝TensorFlow:

pip install tensorflow-gpu


當安裝完成後,你就可以輸入指令啟動Python來測試剛剛的流程是否成功。指令為:

python


然後輸入指令測試:import tensorflow as tf


下載Unity的範例專案 


接下來要下載本次的3D小球專案,你需要從GitHub頁面下載專案,可以直接下載並解壓縮到任意位置。或是透過Github Desktop直接克隆一份道你電腦上。為了讓工作輕鬆建議不要太深的目錄,例如D:\ml\就好。

接下來從選單找到Anaconda Prompt。用右鍵點擊Anaconda Prompt,選擇更多->"以系統管理員身份執行"(Run as administrator)。




剛剛解壓縮後的Unity - 3D小球專案目錄下有一個python目錄。從這個Anaconda prompt視窗把目錄切換到剛下載好的ml-agents專案裡的python目錄位置。 

例如:我專案放在D:\ml\ml-agents\,那麼我們要把目錄切換到D:\ml\ml-agents\python。執行:

cd d:\ml\ml-agents\python


然後要安裝Html5lib庫,輸入指令:

conda install --force html5lib


然後輸入:

pip install .


注意:"pip install ." 最後有個點.


如果以上步驟一切正常,你就可以到下一章節
用TensorFlow和機器學習設定你的Unity專案了。
----------------------------
如果你要架在Mac OSX平台上:

  • macOS版本要求:OS X El Capitan(10.11)及以上。 
  • 建議下文中所使用的軟體版本都使用最新的版本。 

安裝Homebrew


對於許多使用macOS作為作業系統的開發者來說,一般習慣於使用命令列安裝所需應用,當然這樣也能顯得很geek。而Homebrew也是很常用的套裝軟體管理工具,能在Mac中方便的安裝軟體或者卸載軟體。

打開Terminal應用,輸入以下命令下載安裝最新的Homebrew。


/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安裝完Homebrew後,建議重啟Terminal。


透過Homebrew 安裝 Python 3


Python是機器學習常用的語言,TensorFlow就使用它作為主要開發語言。作為解釋語言,它不需要進行編譯,對於機器學習所需要的大量原型化和反覆運算處理有相當高的效率。而且Python開發生態成熟,有許多庫可供使用。通過pip(Python Package Index)工具,你可以安裝各種基於Python的庫。

輸入 
brew install python 3 安裝 Python 3。在安裝完Python 3之後,建議重啟Terminal。 


安裝專案所需Python庫和工具

以下說明兩種安裝路線:可以二選一

路線一:
安裝Jupyter Notebook

Jupyter Notebook是一個開源的Web應用程式,可以讓你建立和共用包含即時程式碼,方程式,視覺化和說明文本的文檔。 用途包括:資料清理與轉換,數值類比,統計建模,機器學習等等。

輸入 pip3 install jupyter 安裝Jupyter Notebook。


安裝NumPy

NumPy是Python語言的開源數學擴展庫。支援高級大量的維度數組與矩陣運算,此外也針對陣列運算提供大量的數學函式程式庫。由於NumPy剛剛宣佈不再支援Python 2,所以建議直接使用Python 3。

輸入 pip3 install numpy 安裝 NumPy。


安裝Pillow

Pillow是PIL(Python Imaging Library,Python圖像庫)的一個分支,提供了對於開發者許多比較友好和直觀的功能。

輸入 pip3 install pillow 安裝 Pillow。


安裝docopt

docopt是Python的命令列參數解析器,其基於多年來用於描述程式介面的説明資訊而設計的,因此可以給開發者清晰的輸出體驗。

輸入 pip3 install docopt 安裝 docopt 。


安裝TensorFlow

TensorFlow是現今非常流行的使用資料流程圖進行數值計算的開源軟體庫。圖中的節點代表數學運算, 而圖中的邊則代表在這些節點之間傳遞的多維陣列。這種靈活的架構可讓你使用一個 API 將計算工作部署到設備、伺服器或者移動設備中的一個或多個CPU或 GPU。TensorFlow 最初是由Google 機器智慧研究部門的 Google Brain 團隊中的研究人員和工程師開發的,用於進行機器學習和深度神經網路研究, 但它是一個非常基礎的系統,因此也可以應用於眾多其他領域。

輸入 pip3 install tensorflow 安裝 TensorFlow。

路線二:
Python庫快捷安裝

一步步通過pip3安裝這些庫可能有些麻煩,如果你已經安裝了Python 3,並且克隆了Github上完整的ml-agents專案。


你可以打開Terminal,把目錄改到ml-agents專案下python的目錄(目錄每個人都不同):

cd /Users/(你的名字)/UnityMachineLearningAgents/python 。

輸入“pip3 install .”,安裝以上所有的Python庫和工具(install後面有個.號不要漏掉)。


完成安裝

如果你按照以上2種方法順利操作的話Mac環境下Unity Machine Learning Agents所需功能基本安裝完畢。你就可以開始用TensorFlow和機器學習配置你的Unity專案了。

-----------------------------

上面的環境安排好了之後,接下來我們就可以到Unity裡面設定要學習的內容

確保你已經下載Unity在GitHub上的ml-agents專案。
確保使用Unity 2017.1 或以上版本


設定Unity環境


啟動Unity,開啟剛剛下載資料裡的unity-environment目錄(本展示專案)。

在啟動視窗中,選擇Open,並在彈出的檔流覽視窗中,選擇unity-environment,點擊Open。



注意:如彈出警告”Opening Project in Non-Matching Editor Installation”,請直接忽略。


打開專案後,在Project視窗,到資料夾Assets/ML-Agents/Examples/3DBall/,按兩下Scene檔的圖示開啟場景。




點擊功能列Edit -> Project Settings -> Player,選中Resolution and Presentation裡的Run in Background屬性。

將Resolution and Presentation中的Display Resolution Dialog屬性,選擇Disabled。




在左邊的場景hierarchy 視窗中,展開Ball3DAcademy遊戲物件,並選中它的子物件Brain3DBrain,在右邊的Inspector中查看屬性。

將物件的Type of Brain設定為External。
(註:設為External是為了在外部做訓練,未來把訓練資料放回專案後,設回Internal就可以在Unity裡面看到訓練後的行為)




點擊File -> Build Settings
選擇目標平台。(選項)勾選Development Build來記錄除錯資訊。點Build開始打包。
重要:存檔路徑請直接指定ml-agents底下的python目錄,給予的檔名也請記住,待會設定要填入一樣的檔名。





用強化學習訓練大腦

測試Python API

---Windows---
如果上面已經跑過Jupyter安裝流程,你可以:
開啟Anaconda Prompt
切換目錄到專案的python目錄

cd d:\ml\ml-agents\python

執行jupyter notebook

開啟瀏覽器localhost:8888就會看到jupyter notebook在python的位置被打開(目錄資料結構確保和下圖相同)






用PPO訓練模型


下一步我們訓練代理,讓它在平台上平衡小球的位置,我們會使用一個叫做近端策略優化(Proximal Policy Optimization),簡稱PPO的強化學習演算法。這個演算法經過實驗,證明是十分安全、高效且比其他強化學習演算法實用性更強的,所以我們選擇這個演算法來作為Unity機器學習代理的範例演算法。


如果想要瞭解更多關於近端策略優化演算法的資訊,請參閱OpenAI發佈的文章


現在請按照下面步驟操作:


  • 在Jupyter中打開PPO.ipynb
  • 修改env_name的值 = 剛剛打包的專案檔名稱
  • run_path目前設定為ppo,依需求可以改到別的目錄也可以不改
  • 按途中的前進按鈕,執行PPO.ipynb的程式,注意不要執行"Export the trained Tensorflow graph."這行文字後的程式。



(選項)針對本專案如果你想要快點訓練完成,可以多調整以下設定:
max_steps = 5000
buffer_size = 5000
batch_size = 512

觀察訓練過程


如果順利的話,你的機器人應該已經開始訓練了。要更仔細地觀察訓練過程,你可以使用Tensorboard。

在Anaconda Prompt視窗切換目錄到專案的python目錄


cd d:\ml\ml-agents\python

輸入:

tensorboard --logdir=summaries



然後在瀏覽器中打開localhost:6006





從Tensorboard上,你會看到以下多個統計圖:


  • 累計獎勵(Cumulative Reward):所有代理各自的平均累計獎勵。在成功的訓練過程中,這個變數應該會增大。
  • 數值損失(Value Loss) :數值函式更新時的平均損失。這關係到模型是否能預測每個狀態下的數值。在成功的訓練過程中,這個變數會減小。
  • 策略損失(Policy Loss) :策略函式更新時的平均損失。這關係到策略(決定行為的過程)的變化大小。在成功的訓練過程中,這個變數的大小會減小。
  • 事件長度(Episode Length) :設定環境下,所有代理中每個事件的平均長度。
  • 數值估計(Value Estimates) :代理所存取的所有狀態下的平均數值估計。在成功的訓練過程中,這個變數數值會增大。
  • 策略信息量(Policy Entropy):這個變數告訴你模型的決定隨機度有多大。在成功的訓練過程中,這個變數會緩慢減小。如果它減小得太快,beta hyperparameter應該會增大。



將訓練好的模型載入Unity環境


經過一段時間訓練後,當訓練過程顯示的平均獎勵大於等於75時,你可以回到PPO檔案繼續往下執行Export the trained Tensorflow graph這一區,匯出保存資料。

資料會存在python/models/ppo(檔案裡面run_path所指的目錄)
會看到一個同名.bytes




停止執行PPO就能停止訓練。現在你就已經有訓練好的TensorFlow模型。你必須將保存的模型轉換為Unity可使用的格式,透過以下步驟載入到Unity專案中。

把訓練好的bytes檔案複製到:
Assets/ML-Agents\Examples\3Dball\TFModels




設定對TensorFlowSharp的支援


因為對TensorFlowSharp的支持目前還處於實驗階段,預設情況下它是被禁用的。要打開它,你必須按照下列步驟。
請注意Internal Brain模式只在完成以下步驟後才能使用。


  • 確保使用的是Unity 2017.1以上版本。
  • 從這裡下載TensorFlowSharp套件,並匯入Unity中。
  • 功能表選擇Edit -> Project Settings -> Player。找到Other Settings,在Scripting Runtime Version屬性中選擇Experimental (.NET 4.6 Equivalent),在Scripting Defined Symbols屬性中,加入ENABLE_TENSORFLOW。(請注意:多個平台代表每個平台都要設定)
  • 重開Unity


務必重開之後回來確認Symbols還在


  • 重新開啟3DBall場景
  • 從場景的hierarchy視窗選擇Ball3DBrain物件
  • 如下圖將Type of Brain改為Internal
  • 如下圖將Graph Model指定剛剛匯入的.bytes檔



  • 將Graph Placeholder的size值設為1
  • 增加名為epsilon的placeholder,設定類型為floating point,範圍從0到0。


注意:上面這兩個設定應該在專案裡已經設好了。
設定這兩個步驟是有必要的,因為3DBall是個持續的控制環境,而TensorFlow模型會用噪音參數來決定行動。但那樣的情況下控制過程是離散的,所以不需要epsilon變數)

最後按Play按鈕,查看訓練後的結果在Unity Editor裡呈現。


流程非常繁瑣但現在你應該可以看到被訓練好的模型已經能自行控制平衡小球的行為。

Jason Weimann的兩段教學影片對本專案非常有幫助,建議遇到問題的開發者可以參考這兩段影片

Unity3D Machine Learning Setup for ML-Agents on Windows 10 with Tensorflow

2017年12月22日 星期五

在遊戲中運用機器學習Machine Learning

作者:Alessia Nigretti 原文
潤稿:Wei J


Unity機器學習團隊已經發佈過一系列的介紹機器學習文章以及三個範例專案。Unity發佈機器學習代理工具ML-Agents的消息引起了Unity社群中眾多開發人員的興趣。這些開發人員有的是人工智慧領域的技術專家,有的則是對機器學習改變遊戲製作和玩遊戲的方式感興趣。

Unity的技術經理Alessia Nigretti和Ciro Continisio都不是機器學習的專家,但他們一起開發了第一個基於Unity新機器學習代理系統製作的遊戲範例專案。並在DevGAMM Minsk 2017遊戲開發者大會上作了展示。今天的文章基於他們在大會上演講的內容,向大家介紹在創作機器學習範例專案過程中所思所想,幫助開發者進一步熟悉和瞭解Unity機器學習代理工具。

介紹


Unity核心價值觀之一是讓遊戲開發大眾化,所以我們希望確保每一個想要學習與使用的人都能適用這個新的機器學習代理工具。首先我們與Unity機器學習團隊進行了合作,並製作了一些小型的範例專案,以瞭解它們的工作原理。我們碰到很多問題是第一次接觸機器學習代理的開發者也可能會碰到的,所以我們把問題記錄了下來,盡可能的簡單總結所有內容。這樣你在讀這篇文章時,即使你不知道機器學習是什麼或者它是如何運作的,你也仍然可以在Unity機器學習代理的世界中找到自己的方向!

我們的機器學習範例專案《Machine Learning Roguelike》 是一款2D動作遊戲,玩家必須與兇惡狡猾的史萊姆戰鬥。這些由機器學習控制的敵人將會不斷攻擊我們的英雄,絲毫不留喘息的機會,而當它們感覺到有生命危險時則會四散而逃。

什麼是機器學習?


讓我們從介紹機器學習開始。機器學習是人工智慧的一種應用,它為系統提供了一種不靠人工設計,而是從資料中自主學習的能力。機器學習的工作原理是通過給系統提供可用於尋找模式的資訊與意見(observations),並對未來的結果進行預測。更籠統的說,系統需要習得期望之輸入與輸出的映射關係。這樣系統才可以選擇接下來的最佳動作,以達到最佳的結果。

實現的方法有很多種,取決於我們將何種類型的意見提供給系統。在本文中環境中使用的強化學習(Reinforcement Learning)。強化學習的特點是:它不會告訴系統做什麼,而只會指出什麼是正確、什麼是錯誤。這意味著,我們讓系統執行隨機行為,而我們根據這些行為結果判斷對錯,提供獎勵或懲罰。最終系統將會明白,要獲得獎勵必須要執行什麼樣的操作。我們可以把這想像成訓練小狗坐下:小狗不會明白我們的意圖,但如果我們在它做對的行為時給予小獎勵,它最終將會把動作和獎勵聯繫到一起。 





我們使用強化學習來訓練一個神經網路(Neural Network),這是一個基於神經系統的電腦系統模型。神經網路由單元或“神經元”(Neuron)組成。神經元被分為多個層。與外部環境交互並收集所有資訊的層是輸入層。與之相反,輸出層的所有神經元被用於在網路中儲存某個特定輸入的結果資訊。在中間的是隱藏層,它們包含的神經元負責進行所有的計算。它們學習輸入資料的複雜抽象表徵,從而使它們的最終結果是“智慧”的。大多數的層是“完全連接”的,也就是意味著該層裡的神經元與前一層中的所有神經元都有連接。每個連接都由一個“權重”定義,這個數值用於強化或弱化神經元之間的連接。

在Unity中,我們的“代理”(執行學習的實體)使用強化學習模型。代理在一個環境中執行動作。動作會引發環境的改變,引起的改變將會連同一些獎勵或懲罰回饋給代理。動作發生的地方我們稱之為學習環境(Learning Environment),在實踐中對應的就是一個常規的Unity場景。

在學習環境中有一個學院(Academy),這是一個腳本,包涵了定義訓練的屬性,例如:幀率、時間尺度等。學院將這些參數傳遞給大腦(Brain),即包含了訓練模型的實體。最後代理連接到大腦,獲得動作和回饋資訊,以促進學習進程。為了執行訓練,系統需要使用一個額外的模組,允許大腦使用TensorFlow機器學習庫和外部的Python環境進行交流。一旦訓練完成後,這個環境會將學習過程提煉成一個“模型(Model)”,這是一個二進位格式的檔。隨後可以將模型重新導入Unity,作為一個已訓練的大腦。

將機器學習應用到遊戲


在製作簡單範例專案3D平衡小球和其它用幾個小時完成的小專案之後,如下圖所示。我們被這項技術的潛力所吸引。

 
 

我們發現了一個可用於2D Roguelike遊戲的實際應用。在建構場景時,我們還使用了2D Tilemap和Cinemachine 2D等新功能。

機器學習範例專案《Machine Learning Roguelike》 的意圖是創作一款簡單的動作遊戲,而遊戲中所有的實體都是機器學習代理。這樣,我們建立了一種同時可用於玩家和敵人之間的通用交互語言。遊戲的目的非常簡單:四處移動,並在遭遇中倖存下來。


訓練設定

每一個良好的訓練都是從有關訓練演算法的高級腦力激盪會議開始的。這是在代理的類別中運行的程式,確定輸入對代理的影響以及產生的回報。我們先定義什麼是遊戲的基本動作(移動、攻擊、治療…)、動作彼此交互的方式、我們希望代理能從中學習到什麼,以及我們在什麼狀況會給予獎勵或懲罰。

首先第一個要做的決定,是狀態(State)和動作(Action)應該使用離散(Discrete)資料還是連續(Continuous)資料。離散意味著狀態和動作一次只能有一個值—它是真實環境的簡化版本,因此代理可以更容易地將動作與獎勵聯繫起來。在範例中,我們使用離散的操作,一共有6個值:0:保持靜止; 1- 4:向一個方向移動; 5:攻擊。連續意味著可以有多個狀態或動作,且都是浮點數值。但是它們的可變性會使代理混淆,所以很難使用。在《Roguelike》專案中,我們使用連續狀態來檢測生命、目標、目標距離等。

獎勵功能


我們提出的初始演算法是,如果代理在不產生危險的前提下,能不斷接近目標就給予獎勵。同樣,如果發生危險時,它與目標之間的距離增加(代理“逃跑”),就會得到獎勵。此外,該演算法還包括對代理的懲罰,以防止它在不允許的情形下進行攻擊。

經過反復的測試,初始演算法發生了很大的變化。我們認識到,要獲得期望的行為,最好的方式就是遵循一個簡單的模式:嘗試,失敗,從失敗中學習,迴圈。就像我們希望機器從我們通過反復試驗得到的意見中學習一樣,我們也想從不斷的試錯意見中進行學習。

例如,我們注意到的一件事是,代理總能找到一種方法來取得獎勵:在我們的案例中,代理開始來回移動,因為每當它再次向前移動時,它就會得到一些獎勵。基本上,它找到了一種利用我們的演算法獲得最大獎勵的方法!

我們學到什麼

從尋找合適解決方案的研究中,我們學到了許多不同的東西,並成功將它們應用於我們最終的專案。要謹記,只要我們認為代理做“對”了,在遊戲中的任何時候都可以給予獎勵!。

訓練場景


在設定好演算法後,下一步就是設定訓練場景。我們選擇設定一個小場景作為訓練環境,然後在另一個更大場景的遊戲中使用代理,訓練模型就是從此場景匯出的。我們決定創建4個不同的房間,每個房間都有不同的長度和寬度參數,這是為了讓代理能考慮所有可能的變數,避免它習慣於特定類型的房間。訓練場景負責代理位置的配置、代理與大腦的連接,以及學院和參數的設定。

我們學到甚麼

從建立訓練場景的過程中,我們認識到使用平行訓練,代理可以獲得更多的資料進行學習,而不僅僅是重複幾次同樣的情況,因此能使訓練更加有效。要做到這一點,需要設定一些啟發式代理來執行一些簡單的操作,説明代理學習,且不會導致他們做出錯誤的假設。例如,我們設定了一個簡單的啟發式(Heuristic)腳本,使代理進行隨機攻擊,為我們的訓練代理提供一個範例,以瞭解當它們受到傷害時會發生什麼。



訓練


一旦環境準備就緒,就可以開始訓練了。如果我們計畫進行一個很長的訓練,最好檢查你的演算法邏輯有沒有問題。這不是編譯時的錯誤,或者與你是否是一個優秀的程式師無關—正如之前所提到的,代理將會找到一種方法來利用演算法,所以要確保沒有邏輯缺陷。要確保萬無一失,可以啟動一個1x倍速度的訓練,看看會發生什麼。觀察一下,看看你的代理是否像期望的那樣進行動作。

訓練的準備工作就緒後,我們需要新建一個可以在Python中和TensorFlow環境進行互動的版本。

首先,我們將進行外部訓練的大腦設定為“External”,然後產生(build)遊戲。完成後,我們打開Python環境,設定超參數(hyperparameter)然後啟動訓練。有關如何產生訓練專用版本以及如何選擇超參數的資訊,在機器學習的Github頁面都可以找到。


我們在進行訓練的同時,可以觀察到代理所獲得的平均獎勵。獎勵應該會緩慢增加,直到代理停止學習時獎勵會趨於穩定。當我們對模型滿意後,就可以將它導回到Unity查看效果。



上圖中的動畫展示了1小時訓練的成果:與我們的預期一致,史萊姆靠近另一個代理進行攻擊,直到被還擊並損失大部分生命。同時它開始逃跑進行回血,然後折返再次攻擊對手。

測試

當我們把這個模型應用回Roguelike遊戲,可以看到它的行為方式保持一致。史萊姆已經學會如何有智慧地行動,以及適應與訓練環境不同的場景。


結語

本文旨在提供一些小型範例,說明你能用Unity的機器學習代理工具做些什麼,而不必對機器學習有任何具體的技術知識。
本專案你可以從這裡下載

如果你已經著手在遊戲製作中實現機器學習,還有很多事情可以做:例如將訓練和啟發式結合成一個複雜的行為,這會讓機器學習代理難以訓練,但同時會為遊戲帶來一些真實性。

如果你想為訓練增加更多策略,也可以通過一個封閉的Beta測試或內部試玩來整合真實玩家的遊戲風格、策略和意圖。有了這些資料,你就可以進一步優化代理的訓練,以達到下一級別的AI複雜度。如果你喜歡大膽嘗試,你可以試著建立自己的機器學習模型和演算法,以獲得更多的靈活性!

2017年12月21日 星期四

Unity機器學習ML-Agents v0.2版發佈

作者:Arthur Juliani 原文
潤稿:Wei J


Unity機器學習代理最新版ML-Agents v0.2現已發佈!在本版本裡,我們作了以下改進:

  • 為Unity SDK和Python API增加了新特性
  • 更多新範例環境
  • 改進了預設的增強學習演算法(PPO)
  • 修復Bug及小功能改進
查詢在Github上的更新紀錄或下載專案

新的連續控制和平台化環境


很多開發者希望我們能提供更多的範例環境,讓他們在開發初期能有更多種類的基底幫忙構築專案。所以在ML-Agents v0.2版本中包含了四個新的環境。其中兩個是新的連續控制環境,另外兩個平台化環境為展示新的課程學習特性而設計。






ML-Agents v0.2新特性

課程學習 Curriculum Learning

課程學習是一種訓練機器學習模型的方法,藉由對同一個問題逐漸增加難度,讓模型每次都接受最適合的挑戰。想要更深入研究可以參考原文研究內容

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




課程學習中的數學課程範例:課程中的題目從簡單到複雜,每個題目都根基於前一個題目


當我們提到強化學習的實際運作方式,主要是透過訓練中偶爾會得到的獎勵作為學習信號。而在更複雜或困難的任務中,這種獎勵往往是稀少且難以獲得的。

例如:在任務中代理需要推動並利用方塊來翻過一面牆並到達目標地點。一開始訓練代理會以隨機的模式作為完成此任務的策略,而隨機策略可能會導致代理在場景中裝忙,並且可能永遠無法越過牆壁到達地點來得到獎勵。但如果我們讓代理從一個簡單的任務開始,比如朝著沒有障礙的目標前進,那麼代理就可以很容易地學會完成這個任務。從這裡開始,我們可以通過逐漸增加牆的大小來慢慢提高任務的難度,直到代理能夠完成一開始不可能完成的任務-攀越牆壁。在我們的ML-Agents v0.2中就包含這樣的一個環境,叫Wall Area。



課程訓練場景的範例 : 場景中逐漸增高的牆阻礙了通往目標的道路

要想在實際操作裡看到效果,觀察下面這二條曲線,顯示了使用PPO訓練的大腦隨時間進展得到的獎勵,兩組訓練皆使用了相同的訓練超參數和32個同時運行的代理所提供的資料。

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



藍線對應使用課程學習訓練的大腦
橙色線對應沒有使用課程學習訓練的大腦
垂直的藍色點線對應於在課程訓練期間的課程變化

那麼課程學習是如何運作的?為了定義一個課程,第一步就是決定環境中的哪些參數會改變。在Wall Area環境中,牆的高度是會改變的。我們可以將牆的高度定義為我們場景中的學院物件的重置參數,並通過Python API來進行調整。接著我們創建一個簡單的JSON檔來描述課程的結構,而非自己手動調整。

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

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



如果你成功創建了機器學習環境,卻很難讓自己的代理解決問題,我們鼓勵你嘗試使用課程學習,我們很樂意聽取你們從中發現了什麼。

廣播 Broadcasting

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

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



檢視視窗中的 Brain元件加入了“Broadcas(廣播)”


靈活的監控器 Flexible Monitor

我們重寫了代理監控(Agent Monitor)以增強它的可用性,原來的監控器只能顯示代理的固定的一組統計資料,新的監控器現在可以顯示與代理相關的任何所需資訊。你只需要呼叫Monitor.Log()來把資訊顯示在螢幕上,或是場景中的代理上。



3D平衡小球環境中使用監控器來顯示各種訓練資訊


作為一個Beta釋出版本肯定會有很多bug及問題,誠摯歡迎你在Github上的問題頁面與大家分享你所遇到的問題。


Unity機器學習社群挑戰賽

文章的最後,我們很高興宣佈,Unity將會舉辦一個Unity機器學習社群挑戰賽。無論你是機器學習專家,或是對如何將ML-Agents應用到遊戲感興趣,這個挑戰賽都是你學習、探索和獲取靈感的最佳機會。

我們很希望看到開發者如何應用新的課程學習方法,但我們沒有限定任何類型或風格,所以不要受到拘束自由發揮吧!在挑戰賽結束後將會頒發一些禮物及驚喜,給予那些活動中獲得最多讚的創作者。


加入機器學習代理挑戰賽

第一輪的機器學習代理挑戰賽從2017年12月7日開始至2018年一月31日止,歡迎任何有Unity基本知識經驗的開發者參加。按此連結加入挑戰。如果你有任何對於機器學習代理的疑問,歡迎透過mail聯絡我們或加入Unity Connect上的機器學習Channel

2017年12月19日 星期二

ADAM : Unity 支援Alembic匯入工具的開發歷程

作者:Sean Low 原文
潤稿:Kelvin Lo


你是否好奇Oats Studios怎麼ADAM:The MirrorADAM:Episode 3製作出那樣逼真的場景、人物和服飾?


接下來我們將提供一系列文章,解釋ADAM製作過程中有關照明、Alembic支援、布料模擬、著色器、即時渲染等內容。
我叫SerEn(Sean) Low, 是一名在Made with Unity團隊裡的美術工具設計師(Art Tool Engineer),我之前在迪士尼協助皮克斯、漫威和盧卡斯影業等團隊開發遊戲機的動畫工具。在Adam短片裡,我負責整合像是Alembic和Timeline的工具,確保動畫流程的順暢和維護性。


背景:UnityAlembic的誕生


大約二年前,Unity研發團隊開始開發Alembic匯入工具,當時主要是給Marza動畫星球的TheGift的動畫短片用。The Gift中最具挑戰性的鏡頭之一是將從Houdini模擬產生Alembic資料匯入Unity,那是一個有幾百萬顆塑膠球組成的巨浪。這結果證明Alembic很適合讓美術匯入來自各種其他程式的模擬資料Alembic還使美術可以突破即時引擎中基於關節網格變形的限制。

Oats Studios決定在製作過程中使用Alembic工具時,還希望有一些額外的功能和優化,以便能處理布料模擬的擬真效果以及即時臉部捕捉。由於這些需求與當初Alembic工具的設計目的差異很大,Unity開發團隊在升級這個工具上做了很大的努力。

Alembic工具的主要升級


第一個主要改變是針對Timeline的整合。這讓Alembic資料在執行時可以即時輸入並透過Timeline播放。同時在編輯狀態中,開發者可以在Timeline上直接拖動就可以播放Alembic動畫。為了完成這個功能,我們在Alembic Importer包裡面加了一個自訂PlayableBehavior (Alembic Stream Player) PlayableAsset (Alembic Shot Asset)TrackAsset (Alembic Track)
想了解更多可以查看文件
Timeline中,你可以先加一個Alembic Track,然後建立一個Alembic Shot Asset,最後透過一個Alembic Stream Player元件將它和場景中的Alembic實例進行關聯。


Timeline中的一個Alembic TrackAlembic Shot Asset

場景物件上的一個Alembic Stream Player元件

第二個重要更新是針對頂點共用(Vertext Sharing)的支持。這對優化網格拓撲資源的Alembic流傳輸效能十分重要。典型的Alembic資料是用來進行動態模擬,比如粒子,它們的網格拓撲會不停變化。我們將共用的頂點合併,以優化重播效能。這非常的重要,因為網格在每一幀都會基於資料流程進行即時重建。透過合併共用頂點,其它網格屬性,例如邊、UV、法線以及切線也都會被更新,動態Alembic網格現在的行為就與一個FBX網格一樣。這確保了網格可以根據場景中指定的材質、著色器和光照做出回饋。


Unity中的Alembic網格顯示共用頂點

第三個重要更新是在Alembic頂點資料中添加了插值(Interpolation)。既然Alembic網格基本上是一個每幀都會重建的新網格,它就沒有先前以及之後頂點位置的變化資訊。這在你嘗試對Alembic網格應用運動模糊進行渲染時會產生問題。有了插值,Unity中的Alembic資源可以計算位置之間的插值,並輸出要進行運動向量計算所必需的速度。那意味著,你現在可以從Alembic網格匯出精確的運動向量,以用於著色器計算或後期處理特效包Post-Processing Stack。這增強了最終渲染圖像中的運動模糊品質,同時還因為採樣數降低,使效能得到了提升。


Alembic網格上的運動向量

計算運動模糊前

計算運動模糊後

運動向量緩衝區

此外我們還實現了好幾個對實際生產中有幫助的特性,能讓工作流程更順暢。例如Alembic Playable Asset的自動啟動,這使Alembic Playable Asset無需在Timeline中增加額外的Activation Track即可啟動。Time Scale屬性使你可以重新調整Alembic資料的重播時間。Turn Quad Edge屬性使你可以選擇網格表面三角化的方向。另外還有一個選項可以在Alembic場景物件啟用時緩存所有Alembic樣本,而無需在重播中緩存資料。

Oats Studios 使用Alembic的流程


“Alembic串
流傳輸對於我們來說,是此專案能夠成功一個非常重要的原因。將模擬的東西導入十分困難,而Unity中的Alembic工具是個大功臣Oats Studios的特效總監Chris Harvey說。

Timeline編輯器中組合多個Alembic資源


基於真實的演出服裝,OatsADAM影片中所有的服飾,都是透過攝影製圖法(photogrammetry)捕捉還原,然後在Marvelous Designer中重建和模擬。Sean Frandsen負責Marvelous Designer中對不同的編織類型羊毛、棉、皮革等賦予真實的物理屬性和動畫。同時捕捉的面部表情被轉換成一系列靜態網格用於Alembic播放。幕後花絮可以看這裡


ADAMAlembic被主要用在兩個地方:布料和臉部


資料隨後被導入到Autodesk Maya,進行進一步處理和調整後匯出為一個Alembic檔。這是流程的示意圖。


導入UnityAlembicFBX資源流水線

在空間和時間中組裝模擬資源


Unity階段,OatsTimeline作為一個裝配工具,組合Alembic資源,並在場景空間中將它們和其它資產一起進行編排。例如為了完整地組裝一套角色表演,使用了兩個Alembic軌道,分別用於面部和布料。這兩個軌道位於一個包含FBX格式的身體表演的Animation軌道之上,如下圖所示。

裝配好的角色在Timeline中栩栩如生
有了Timeline中的所有東西,Oats可以同步並根據每個鏡頭的時間對所有資源進行排序,以進行即時重播。但是在實際的生產過程中,大量的資源會很容易使Timeline編輯器介面雜亂不堪,極難維護。為了解決這個問題,Oats使用可自由展開和折疊的TrackGroup來組織場景中的資源。為了進行更好的組織管理,Oats還使用了另一個Unity特性ControlTrack,它可用於處理多個嵌套的Timeline實例。

展開與折疊的Track Group

ControlTracks處理嵌套時間軸資源


一鍵自動化


在隨後的製作階段,面部捕捉和布料模擬生成的Alembic資料檔案總數接近300個。因此,Oats需要一個自動化過程來將多個Alembic檔導入到Timeline,所以他們編寫了自己的匯入器,自動將Alembic檔導入,進行預定義設定,在場景中產生實體並加上所需的元件,以及在Timeline中排序。在Unity開發團隊的幫助下,Oats最終可以只點一個按鈕就能啟動這整個自動化過程。我們從這個專案中還收集了許多很好的回饋和API需求,用於對Timeline進行深入改進。

為不同的角色和道具管理幾百個Alembic資源

小結


在整個製作ADAM專案的過程中,Alembic匯入工具變得更加成熟和適於實際工作環境。你可以用它處理動態拓撲類比網格和靜態拓撲網格,如布料和臉部。它針對Unity現有的和即將到來的特性進行了優化,更好的整合。越來越多的美術和工作室對使用Alembic表現出興趣,特別是在即時CG電影方面,我們很期待它可以成就許多驚豔的Unity專案

Alembic Vertex Sharing Github發佈 版本 (1.0f1) 
以Unity Package格式下載.

著作人