【Unity ML-Agents ver 0.5】サンプル「Basic」の使い方とスクリプトやパラメータの解説

投稿者: | 2018年12月4日

フィア
カレン…ついに、機械学習のサンプルを触ってみるよ…!
カレン
バージョンが違うかったりして、いろいろ大変だったけど

いよいよって感じね…!

フィア
今回もv0.4の情報は使えないから注意してね

 

スポンサーリンク

 

 

— YouTubeなら12分28秒で学べます ―

 いいね    チャンネル登録

 

 

目次

 

 

Unity ML-Agentsの準備

前回の記事

 

前回の記事を参照して、「6、Unity側のML-Agentsの設定」まで終わらせてください。今回もAnaconda Navigatorのコマンドプロンプトを使用します。

また、前回同様、開発環境はWindows 10 (64 bit)、Python 3.7 、Unity 2017.4.13f1、ML-Agents ver 0.5を想定しています。

 

 

 

「Basic」の概要

デフォルトで入っているサンプル、「Basic」は、1体のAgent(Cube)を操作してゴール(Sphere)まで導くエピソードを学習させる「Single-Agentシナリオ」です。

Agentとは、移動や回転といった、「行動」を起こす学習者のオブジェクトを指します。

 

 

「Basic」の準備

Unityを起動して、File > Open Projectより「UnitySDK」を開いてください。場所はml-agents-master/UnitySDKです。

前回の記事を読んで、ML-Agentsのインポートが完了しておりましたら、「ML-Agents」のフォルダがAsset内にあると思います。

ML-Agents/Examples/Basic/Scenes内の「Basic」を開いてください。

 

 

以下のような画面になります。

 

 

AgentをPlayerで操作してみる

Hierarchyの「BasicBrain」のInspector内にBrainスクリプトがアタッチされています。

その中の「Brain Type」を「Player」にしてください。これで、人間の入力を使用した学習が行えます。

操作方法はKey Aで左に移動し、Key Dで右に移動です。また、Discreate Player Actions を見てもらったら分かるように、Key Aを押すとValue=1が返され、Key DでValue =2が返されます。

実行してAとDで移動し、緑のボールに当たるとゲームがリセットされます。この一連の動きを「エピソード」と呼び、これを学習させていきます。

 

 

TensorFlowを使用した機械学習

「BasicBrain」のBlain Typeを「External」に変更してください。これで、外部からTensorFlow(または自作のMLライブラリ)を使った学習が行えます。

ちなみに、Hierarchy内で重要なオブジェクトが3つあります。それは、「Brain」「Agent」「Academy」です。

学習の流れとしては、「Agent」が行った行動を「Brain」が記憶、計算し推論モデルを形成することで動きを決定していきます。こういった学習環境を管理する役割が「Academy」です。

ML-Agentsではこれら3つが必須となります。

 

 

続いて、Anaconda Navigator を起動して、コマンドプロンプトを開いてください。

 

私の時は変更する必要はなかったですが、もし、各行の頭が(base)のようになっていたら、「activate ml-agents」と入力して実行し、(ml-agents)に変えてください。

 

続いて、コマンドプロンプトのディレクトリをml-agents-master/ml-agentsへ移動したいので、ml-agentsフォルダを開いて絶対パスをコピーしてください。

私の場合はml-agents-masterフォルダはデスクトップ上においてあります。ユーザー名などに日本語が入っている場合はエラーが出る場合がございますので、適宜移動させてください。

 

続いて、コマンドプロンプト上で「cd 絶対パス」のように入力してEnterを押して下さい。

 

続いて、「mlagents-learn ../config/trainer_config.yaml –run-id=実行結果を保存するフォルダ名 –train」のように入力してください。

 

 

 

「mlagents-learn」は学習と推論の両方を設定できるスクリプトです。一つ前のバージョンv0.4 では「python3 learn.py」のように使用しておりましたが、v0.5で「mlagents-learn」に変更となりました。

「../」で ml-agentsフォルダの一つ上のフォルダに移動し、その中のconfigフォルダ内にある「trainer_config.yaml」を実行してくださいというコマンドになります。

trainer_config.yamlの中身は以下のように、機械学習に用いる様々なパラメータが入っています。

「–run-id=実行結果のファイル名」で学習後に生成されるフォルダ名を決定します。すでにその名前が使用されている場合は、同フォルダ内にファイルが生成されます。上書きはされません。

最後に、「–train」で学習を実行します。

 

trainer_config.yaml(一部抜粋)

 

–train を実行すると以下のようなUnityのロゴと共に、一番下に「Start training by pressing the Play button in the Unity Editor」という文字が現れるので、Unity上でゲームを実行してください。

 

ゲームを実行すると、自動でAgentが動き出し、学習し始めます。

以下のように次々に文字や数字が流れていきます。

「Step」が移動などのActionを実行した回数、「Mean Reward」が平均報酬額、「Std of Rward」が報酬額の標準偏差になります。

今回の場合、小さいボールに到達したときが報酬「+0.1」、大きいボールに到達したときが「+1」になってます。

また、今回では1Stepごとに報酬「-0.01」となるので、最短距離で移動した方が高い報酬を得られる仕組みになってます。

 

 

Unity上でゲームを停止すると、学習も自動的に停止されます。

学習したデータは ml-agents-master/ml-agents/summaries内にあります。

先ほど学習したデータを確認する場合は、コマンドプロンプト上で「tensorboard –logdir=summaries」と入力してください。

 

すると、「http://○○:6006」のようなローカルホストのURLが生成されますので、これをブラウザに入力して移動してください。

これで、「TensorBoard」上で得られたデータをグラフ化してみることができます。

 

 

グラフの見方は以下のリンクを参考にしてください。

 

 

推論モデルをUnityで使用する

学習して得られた推論モデルは ml-Agents/models/自分で指定した名前のフォルダ内に入ってます。

「自分で指定した名前.bytes」ファイルをドラッグ&ドロップでUnityのAsset内にコピーしてください。

UnityのHierarchyのBasicBrainのBrainTypeを「Internal」に変更して、Graph Model に先ほどの.bytesファイルをドラッグ&ドロップしてください。

ゲームを実行すると、推論モデルを適用してAgentが動きます。

 

 

「Basic」のパラメータ設定

trainer_config.yaml(一部抜粋)

trainer_config.yamlではdefault のパラメータがあらかじめ表記されており、それを上書きする形でパラメータを変更します。

「Brain」では「Basic Brain」がそれにあたります。

 

batch_size: 32、buffer_size: 256

今回のActionは移動のみであり、値はx = 0, 1, 2…のように離散的です。

このように、整数のみを扱う「Discrete」の場合は小さな値を使用します。範囲はBatch_size(32~512)、Buffer_size(2048~409600)です。

なお、Buffer_sizeはBatch_sizeの倍数である必要があります。

 

nurmalize:false

Agentの行動により得られた値(Observation)を自動的に正規化するかどうかを指定します。今回はしないのでfalse。

 

num_layers:1

単純な問題の場合、レイヤーを少なくした方が学習効率が上がりやすく、複雑な問題の場合は多くのレイヤーが必要になる。レイヤー数の範囲は1~3層。

単純な系なので小さな値1を指定。

 

hidden_units: 20

Actionが簡単な場合は小さな値を使用します。範囲は(32 ~ 512)

 

beta: 5.0e-3

betaはエントロピーの正則化の強さを表しています。値を大きくするとBrainのActionのランダム性が増します。

エントロピーの減少が早すぎるときはbetaを増やす必要があります。範囲は0.01 ~ 10000です。

 

gamma: 0.9

gamma は報酬割引率を表しています。遠い将来のためにAgentが行動しているときは大きな値を使用します。範囲は0.8 ~ 0.995。

 

max_steps: 5.0e5

学習の最大ステップ数です。

 

summary_freq: 2000

学習した統計情報を保存する間隔です。今回は2000ステップで1回です。

 

time_horizon: 3

Agentごとに取集するデータのステップ数です。エピソード内で頻繁に報酬が与えられる場合は小さな値を使用。範囲は(64 ~ 2048)。

 

 

 

「Basic」のスクリプトの解説

Asset/ML-Agents/Example/Basic/Scripts内にある「BasicAgent.cs」に、Agentの行動や報酬を受け取る条件が記入されています。

コメントを付けておきましたので、興味のある方はご覧ください。

BasicAgent.cs

 

 

 

終わりに

フィア
とりあえず動いたって感じだねー
カレン
これでなんとなく一連の流れはつかめたと思うわ
フィア
いろいろ使えそうだから、頑張って勉強しようね

 

↓ v0.4 のコードを使っていますが、私のサイトと併用すれば結構いい本です ↓

 

忙しい人のためのUnity入門講座へ戻る