今回はUnityとML-Agentsを使って比較的簡単かつ視覚的にも面白い方法で、ディープラーニングを試してみようと思います。
Unityはゲーム開発エンジンで、ML-AgentsはUnity上で動く機械学習・強化学習用のパッケージです。
完成品は以下のようになります。
真ん中の方に1つだけ学習が下手なものを混ぜました。
右下のものは自分で操作できます。
以下のURLから動かせるので、実際にどれぐらい難しいか確認してみてください。
https://shiki-sci.jp/game/mlball/
ML-Agentsのサンプルプロジェクトの確認
まずはUnityエディタ上でML-Agentsのプロジェクトのサンプルを動かしてみましょう
必要なもの「Unity」「ML-agents」
- Unityのインストール
https://unity3d.com/jp/get-unity/downloa - ML-Agents のインストール
現時点(2023.11)での最新はRelease21ですが、
安定性などを考えて今回はRelease20を使用します。
https://github.com/Unity-Technologies/ml-agents/releases/tag/release_20
ML-Agentsとは?
ML-Agentsとは
Unityでゲーム内のキャラクター(ここではエージェントと呼びます)が強化学習を使って最適な行動を
取れるように学習し、行動するためのパッケージです。ゲーム内のエージェント自らが学ぶことが
できるようになります。
なぜ面白いの? ML-Agentsを使うと、私達はエージェントに「何をすべきか」を直接教えるのではなく、環境の中で 学習させることができます。これにより、柔軟で自然な動き方を持ったキャラクターを作ることが可能です。
ML-Agentsのインストール
ダウンロードしてきたzipファイルを解凍して適当な場所に置いておきましょう。
私の場合は~/Users/<username>に置きました。
▶︎UnityHubから「追加▼」→「ディスクから加える」
ml-agents-release_20の中の「Project」→「プロジェクトを加える」を選択
▶︎先ほど追加したプロジェクトをクリックしてunityを起動してプロジェクトが開けたら
左下の「Project」から「Asset」→「ML-Agents」→「Examples」
「3DBall」→「Scenes」→「3DBall」をクリック
「Play▶︎」ボタンを押してみましょう!
ボールを落とさないように、上手く動いているのが分かりますね!
学習済みのデータがエージェントに既にセットされているので、上手く動くようになっています。
では、実際にこのプロジェクトを使ってエージェントにディープラーニングさせてみましょう!
学習環境の作成 → 学習 → 学習結果をもとに実行 と言う流れでやっていくよ。
Anaconda から学習環境を作ろう!
今回、環境を作るためにAnacondaを利用するので、インストールしましょう。
確認動作環境:MacBook Air M2チップ
Windowsでも大体同じだと思います。
- Anacondaのインストール
https://www.anaconda.com/download
英語での表示になっているから、適宜日本語に変えてインストールしてね!
Anacondaって何?
Anacondaは、プログラミングやデータ分析のための便利なツールセットのことです。
このツールセットには、Pythonというプログラミング言語や、データの取り扱いに役立つツールが含まれています。Anacondaを使うことで、コンピュータでプログラムを書いたり、データを分析したりするのがとても簡単になります。
(一から環境構築するのはすごく大変なんです。。。)
また、やりたい事ごとに独立した環境を作成できるので、異なる作業をきちんと整理できます。
つまり、Anacondaはプログラミングやデータ解析をするための魔法のツールボックスのようなものです!
今回はPythonのバージョンを指定したいので、バージョン管理機能が便利な
Anacondaを使っています。
Anacondaの使い方
インストールできたら、Anacondaのアプリを開きましょう。
以下AnacondaNavigatorが開かれると思うので
▶︎Environments → Create
→ Name:「仮想環境名」(私の場合はmy-mlagents-testとしました)
Packages:「3.9.18 」pythonのバージョンを確認 今回は3.9.18を使用しました。
理由はmlagentsのRelease20はpython3.8~3.9に対応しているからです。
(3.10以上だと動かない可能性があるので、注意しましょう)
3.9の後ろの数字は、バグ修正履歴のようなものなので同じでなくても大丈夫です。
→ Createボタンを押下
仮想環境が出来上がったら、緑の▶︎ボタンから、「Open Terminal」を押しましょう。
作成した仮想環境がアクティブになった状態でターミナルが開かれていると思います。
仮想環境がアクティブ・・・ターミナル右下の部分に「Py (仮想環境名)」となっていて
作成した仮想環境が使える状態になっています。
ML-Agentsのインストール
▼以下のコマンドを入力
pip install mlagents==0.30 pip list
pip listを入力するとインストールされたものの一覧が出力されます。
無事mlagentsがインストールされていますね!
ここで、mlagentヘルプコマンドを入力して、ちゃんと動作するか確認してみましょう。
mlagents-learn -h
PCの環境(Windowsなのか、Macなのか、CPUやグラフィックボードが何製なのか等 )によって
問題なく動くこともありますが、大抵の場合はエラーが出ます。
私の環境では以下のようなエラーが出ました。
エラーが出なければOK、エラーが出た場合は以下コマンドを入力します。
pip install protobuf==3.20.1 pip install grpcio==1.54.0
もう一度、mlagents-learn -hを入力して動くか確認しましょう。
以下のようなヘルプ画面が出てきたら、mlagents環境は作成完了です!
ML-Agentsで学習させてみよう!
学習の仕組み エージェントは仮想環境内で学習を行います。これは強化学習と呼ばれ、エージェントはさまざまな 行動を試しながら報酬を最大化するように学習します。 仮想環境内のPyhtonがUnityに接続されて、学習が開始されます。
では、先ほどのサンプルで動かした環境下で学習させてみましょう!
Unityも使用するので、先ほど動かしたプロジェクトを開いておきましょう。
mlagensを置いたフォルダへ移動します。私は先ほど、Users/<Username>に置いたので
以下のコマンドで移動します。
cd /Users/<Username>/ml-agents-release_20/
移動できたら、以下のコマンドを入力します。
mlagents-learn ./config/ppo/3DBall.yaml --run-id=first3DBallRun
第一引数は学習設定ファイルのパス
第二引数は実行IDになります。
今回、学習設定ファイルはml-agents-release_20の下のconfig/sample/3DBall.yamlを使用するのでパスは./config/sample/3DBall.yamlです。
--run-id=(実行ID)
–run-id=の後ろに自分の好きなID名を指定します。今回は、「first3DBallRun」にしました。
「実行 ID」は学習結果として出力するモデルや情報のフォルダ名に使われます。
同じIDを使用すると重複エラーが出るので、新規学習を開始する度に
別の「実行 ID」を使いましょう。
このような画面が出てくるのでUnityの「Play▶︎」ボタンを押下しましょう。
そうするとターミナルでは以下のような画面になって学習が開始されます。
Unityでもエージェントが動いて学習が開始されていますよね。
学習が進むとだんだん上手くなってきて、ボールを落とさなくなる様子を確認しましょう!
ターミナルのログに「Mean Reward」(平均報酬)と「Std of Reward」(標準偏差)
と言うものが出力されています。
「平均報酬」・・・エピソード報酬の平均で上手く学習できていると上昇します。
大体1を超えると学習完了と判断して大丈夫です。
「標準偏差」・・・データの散らばり具合を表す数値で小さい値のほうが信頼できる値となります。
学習を終了させたい場合、Macでは「control + c」にて終了させましょう。
ニューラルネットワークモデルファイルを使って結果をみてみよう!
ニューラルネットワークモデルファイル 人間の脳を模したモデル。ML-Agentsで学習が終わると出力されます。 学習結果となるモデルファイルをUnity環境内に置いて活用します。 Unity環境がモデルファイルを読み込んで利用し、学習結果としてどのような行動を取るのか観察します。
学習を終了させたら、「ml-agents-release_20 フォルダ」を開きましょう。
「ml-agents-release_20 」→「results」→「実行ID名」(私の場合はfirst3DBallRun)の中に「モデルファイル」と「統計情報」が出力されています。
モデルファイルをUnityエディタの「Asset」→「 ML-Agents」→「 Examples」 →「3DBall 」→「Scenes」へドラッグ&ドロップしましょう。
(ドラッグ&ドロップの場所は任意の場所でOKです。分かりやすくするためここに置きました)
Hierarchyウインドウの3DBallの好きなBallを選び
3DBallの▶︎を押下して「Agent」選択します。Inspectorウインドウが右側に出てくるので「BehaviorParameters」のModelに先ほどの3DBallをドラッグ&ドロップして入れます。
「Play▶︎」ボタンを押してみましょう。
私の場合、2列目の左から2番目のエージェントに入れたのですが
ボールを落としまくっています。学習不足で大分下手なモデルとなってしまいました。
このことから、先ほどの学習時間では足りないと言うことが推論できます。
手動で動かしてみよう
エージェント自体を自分で動かして、推論することもできます。
好きな3DBallのAgentを選択 → 「BehaviorParameters」→ 「BehaviorType」を選択
「Heuristic Only」に変えて「Play▶︎」ボタンを押しましょう。
PCのカーソルを動かしてみると、選択したエージェント自分で操作できるようになります。
実際に自分で操作するのは難しいですよね?
終わりに
ここまでサクッと駆け足で説明しましたが、いかがだったでしょうか?
意外に簡単にディープラーニングできましたよね!?
これを見て少しでも面白いと思った人はぜひ、試してみてね!
難しいところはお父さんやお母さんに助けてもらいながら、やってみよう!
それでもできなかったら、無料相談会の中で体験授業も行っているので一緒にやりましょう!!!
申し込みはこちらです。
https://shiki-sci.jp/game-course/#form