Unity ML-Agentsの導入と自作ゲーム適応時の体験談

こんにちは、何時も元気に這いよる混沌に飲み込まれたk0buです。

いつもはコミケと技術書典でProcedural Generation系を書かせていただいていますが、地味にサイトの方で記事を投稿するのは初めてですね。

さてKCSアドベントカレンダーの4日目を飾らせていただく私の記事の内容は、Unityが提供してくださっているML-Agentsの導入、また自分のゲームに適用する際の考慮点について話させていただきます。

 

Unity ML-Agentsの準備

 

今回説明するUnity ML-Agentsのバージョンはv0.5.0となっております。また自分はWindows 10を使用しておりますので他OSでも同様の操作で使用できる保証はできません。また、Unity2017.4以降を使用しろと公式が書いているためそれ以前のUnityでは動く保証はないです。

また新たにバージョンが更新された場合は公式のドキュメントがあるGithubの方を確認していただいた方が安全です。

 

Unity ML-Agents関係のインストール

 

まず、Unity ML-AgentsではPythonを使用するため、そのインストールが必要です。今の所Python3.6であれば大丈夫そうです。個人的には脳死でAnacondaを通してインストールをしても良いと思います。とりあえずPythonで機械学習を学ぶ際に必要なモノは入っているため、分からない時はAnaconda一択ですね。

自分はPythonをそこまで使わないのでAnacondaしか使用したことなく、仮想環境もそちらの方で用意しました。使い分けをすることは無いと思った場合は仮想環境はなくても良いと思います。

今回は途中でpipを使うためAnacondaはもしかしたらあまりよろしくないかもしれません。元々Anacondaを使っている人は仮想環境を今回のために分け、pipをcondaでインストールし、rootのpipを使わず仮想環境上のpipを用いましょう(これが対策になるかわかっていない)。

Anacondaでの仮想環境の作り方を簡単に説明させていただくと、

1
conda create -n 仮想環境の名前 python=3.6

という風にCommand PromptかPowerShellで打っていただくと作ることができ、”activate 仮想環境の名前“と”deactivate 仮想環境の名前“で仮想環境に入っている状態と入っていない状態の間を遷移できます。

それではML-Agentsをインストールしていきますが、まずインストールするファイル/ディレクトリを作成(mkdir)し、CommandPromptかPowershell上でそのディレクトリ上に移動(cd)しておいてください。そこで

 

と打っていただき、GitHubにあるML-Agentsのディレクトリをダウンロードしてきます。gitに生き恥を曝され恨んでいる人はUnityのGitHubページからzipファイルをダウンロードし、解凍してください。

AdventCalenderUnityML12/04MLdirectory

ダウンロード(clone)終了後、ml-agents\ml-agentsのディレクトリに移動し、そこで

1
pip install .

をしてください。これで今回用いるUnityが作ったPythonのパッケージであるmlagentsと、他に必要なパッケージがインストールされます。初めてPythonを入れた方の場合はコンソル上に文字がびっしり出てきて、ある程度の時間はかかると思いますので珈琲でもお茶でも飲みながら優雅に待ちましょう。ちなみに私はアールグレイが好きです。

用意されている環境をテストしてみる

まずUnityでGitHubよりインストールしたディレクトリよりml-agents\UnitySDKというファイルを開きます。次にAssets\ML-Agents\Examples\3DBall\Scenes下にある3DBallシーンをUnity上で開きます。

AdventCalenderUnityML12/03scene

ここでUnity上のEdit\Project Settings\Player内のOther Settings以下にあるScripting Runtime Version.Net 4.x Equivalentにします。またScripting Defined SymbolsENABLE_TENSORFLOWになっている事を確認します。そして、Resolution and Presentation以下にあるRun In Background欄がチェックに、Display Resolution Dialog欄がDisableになるようにしてください。またProduct Nameの方も3DBallにしておきます。

AdventCalenderUnityML12/04playerSettingsAdventCalenderUnityML12/03playerSettingNameBG

AdventCalenderUnityML12/03playerSettingEnableTensorflow

また、TensorFlowSharpをUnityに対応させたプラグインのインポートもする必要があるためこのリンクをクリックし、パッケージをUnity上でインポートしてください。

元々学習したモデルが用意されていますので、今回はそちらを利用しUnity ML-Agentsの体験をしてみようと思います。Hierarchy上のBall3DAcademyの子オブジェクトであるBall3DBrain内のインスタンスにBrain Typeを弄るパラメータがありますので、そちらをInternalにします。

AdventCalenderUnityML12/04finidingBrainAdventCalenderUnityML12/03ball3DBrainType

そうすると、モデルを入れるGraph Modelというパラメータが出てきますので、そちらに\Example\3DBall\TFModelsに存在する拡張子がbytesである3DBall.bytesファイルを入れてください。

そしてプレイボタンを押していただくと、ボールを落とさないように各板が動いているのが観察できます。凄いです(小並感)。

AdventCalenderUnityML12/03gameSceneTest

今度は自分で3DBall用のモデルを学習させてみます。まず先ほどのBrain TypeをExternalに直します。

次にビルドをします、ファイルはml-agents\envs下に保存します。

これから学習をさせていくためCommandPromptまたはPowerShellを用います。インストールしたプロジェクトの一番親であるml-agentsディレクトリに移動します。そこで

1
mlagents-learn config/trainer_config.yaml –env=envs/3DBall.exe –run-id=firstRun –train

と打っていただくと、以下のような画面になりUnityのゲームが起動し学習中の画面を表示してくれます。

AdventCalenderUnityML12/03trainingScene

AdventCalenderUnityML12/03training

学習したモデルはml-agents\models\firstRun-0\3DBall_firstRun-0.bytesとなりますのでこれをUnity上に分かる所に保存しましょう。

後はBrain TypeをInternalに戻し、Graph Modelに学習したモデルを入れゲームを再生すると、先ほど学習させた結果を見る事ができます。

もし学習時のconfigを弄りたい時は、ml-agents/config/trainer_config.yamlでハイパーパラメータ等の値を調整できるのでそちらを見てみてください。また、mlagents-learnを実行する時の引数によっても調整できるモノもあるのでこちらを参照してください。

ML-Agentsの概要

 

まず強化学習を簡単に説明すると、トライアンドエラーによる学習です。学習者であるAgentが存在し、Agentが何らかのアクションを決めて行いそれが環境に影響を与えます、その影響された環境という結果から状態および報酬を受け取り、またアクションを判断し起こすというサイクルでモデルは学習します。ML-Agentsでは端的にその出力するアクションの定義、どのような環境の時に正や負の報酬を出すのかを設定するだけでゲームのAIを作れるという風になっております。

まとめるとML-Agentsを使用する際に把握しておくべき重要な要素として

  • Observations(環境を見るための変数)
  • Actions(環境から決定されたアクション)
  • Rewards(環境から決定された報酬)

の3つとなっています。

ML-Agentsでの強化学習、模範学習のモデルとしてはOpen AI Gymを中では用いているようですが、これにまたラッパー(wrapper)としてUnityが作成したPython API(mlagents)が存在し、そちらを弄る方が簡単に学習を行うことができるようになりました。Open AI Gymを用いたり自身でTensorflow/Kerasでモデルを書いたりし、それを学習させることもできますが、機械学習を何も知らずにできるという利点においてはML-Agentsはそれを成し遂げていると感じました(現に私は強化学習に全く明るくありませんでした)。

またUnity上でTensorflowで学習したモデルを読みこめるようにするため、上でインポートしたTensorFlowSharpをUnityに対応させたパッケージがありました。TensorFlowSharp自身はTensorflowの学習モデルを.Net APIにおいて使用できるようにしたという感じです。

新しいゲームに適応させてみた際の触感

 

のちのち投稿するかもしれない動画のネタとして活用したい為、コード類は省かせていただきますが、それだと寂しいので考慮しないといけない点を書いていきます。

今回適応させたゲームでは画像を入力(環境を表す変数)として試してみましたが、この時の得られた知見を書きます。

  • 1つ目は環境を表すパラメータの数をなるべく少なくする事です。これは機械学習の点で考えた際、単純に入力数が多くなると計算量が多くなるためそれだけ1つ1つの学習に時間がかかるためオススメはできません。また、短期間の間隔でアクションを決定しないといけないとき程、遅延が発生しないように計算量を減らす事が重要です。
  • 2つ目はバグを取り除く作業が通常以上に難しくなる可能性です。大体のエラーはML-Agents内のスクリプト内で現れるのでゲームのコードをML-Agents様に実装している間にどのようなミスが起きたかが分かりにくくなっています。偶に自分が最終的に頼りにしているprintでのデバッギングも予想以上に動かず、バグを取り除くのに1日以上かかる時もありました(分からなくて単にサボタージュしていたとも言える)。
  • 3つ目はドキュメントやGitHubのIssueが潤っていないため、上で生じたバグやエラーは自分で解決しないといけません。そのため通常検索して終わる程度の見落としでも長い時間苦しまないといけないこともあります。しかし、皆さんが使用し始めIssueが潤えば、この問題は解消されますので是非使用してみてください!

 

完走した感想

 

Unity ML-Agentsをワークフローに取り入れれば確かにゲームAIの作成時間が早まる可能性はあります。しかし、学習時の細かい調整(ハイパーパラメータや環境を表すパラメータの取り方)をしなければならないため結果的に現状どちらとも言えないですね。模倣学習の方もあるのでそちらの方も試してみて、出来ればまた記事か動画を投稿したいと思います。

明日はKCSの音楽系の神の一柱であるGMAさんの記事です、どのような記事を書かれるか期待が高まりますね!

私は音楽といえばAtlusの世界樹の迷宮、メガテン、ペルソナが大好きですね。世界樹の迷宮に至っては目を閉じればそのゲームの一つ一つの階層が見え、またボウケンシャー達の活躍や失敗、苦難が見えてきて、現実を忘れるには持ってこいの曲が一杯です!

皆さんはどのような音楽が好きでしょうか、それではまた次の 12月30日(日曜日)にあるc95の東ト59b にてお会いしましょう。

ではでは~

 

←3日目 5日目→

 

Posted on: 2018年12月4日, by :