Unityではじめる強化学習 / Unity ML-Agents 0.9.0のチュートリアル
「Unity ML-Agents」は、Unity で「強化学習」の「環境」を構築し、「エージェント」の学習および推論を行うためのフレームワークです。
最新版「0.9.0」がリリースされたので、サンプルの学習環境「3DBall」を使って、学習および推論の手順を解説します。
1. 開発環境の準備
◎Unityの開発環境のインストール
「Unity ML-Agents」を利用するには、「Unity 2017.4」以降が必要になります。以下のサイトからダウンロード後、インストールしてください。
◎Unity ML-Agentsのリポジトリのダウンロード
「Unity ML-Agents」のリポジトリには、
・強化学習の「環境」を作成するためのUnityアセット
・学習用のPythonスクリプト
が含まれています。
以下のサイトの「Clone or Download」ボタンでダウンロード後、任意の場所に解凍してください。「ml-agents-master」フォルダが生成されます。
・Unity-Technologies/ml-agents:Unity Machine Learning Agents
フォルダ構成は、次の通りです。
・UnitySDK:強化学習の「環境」を作成するためのアセットが含まれるUnityプロジェクト。
・UnitySDK/Assets:強化学習の「環境」を作成するためのアセット。
・ml-agents:強化学習の学習を行うPythonパッケージ。
・ml-agents-envs:Unity環境とml-agentsパッケージ間のインタフェースとなるPythonパッケージ。
・gym-unity:OpenAI Gymと連携するためのパッケージ。
・docs:ドキュメント
◎Pythonの仮想環境の作成
Anacondaで「Python 3.6」の仮想環境を作成し、以下のコマンドで「mlagentsパッケージ」をインストールします。現在は、Python 3.7またはPython 3.5はサポートされていません。
$ pip install mlagents
「mlagentsパッケージ」をインストールすると、以下のような依存関係もインストールされます。
・TensorFlow:深層学習ライブラリ
・Jupyter Notebook:プログラムの実行結果を記録しながらデータ分析を行うためのツール
・Matplotlib:グラフ描画ライブラリ
・NumPy:数値計算ライブラリ
・Pillow(PIL):画像処理ライブラリ
・docopt:コマンドラインオプションパースライブラリ
自分の環境ではインストール時に以下のエラーが発生しました。
ERROR: mlagents-envs 0.9.0 has requirement Pillow<=5.4.1,>=4.2.1, but you'll have pillow 6.1.0 which is incompatible.
以下のコマンドでpillowのバージョンを調整しました。
$ pip install pillow==5.4.1
2. Unity ML-Agentsのプロジェクトの作成
「Unity ML-Agents」を使うプロジェクトの作成方法は、以下の通りです。
(1)Unityを起動し、Unityのプロジェクトを「3D」で新規作成。
(2)強化学習の「環境」を作成するためのアセット(UnitySDK/Assets/ML-AgentsとUnitySDK/Assets/Gizmos)をプロジェクトの「Assets」フォルダにコピー。
ML-Agents内のフォルダ構成は、次の通りです。
・Editorフォルダ:エディタ関連のスクリプト
・Examplesフォルダ:サンプルの学習環境のフォルダ
・Pluginsフォルダ:Unity ML-Agentsの各種プラグイン
・Resourcesフォルダ:Unity ML-Agentsの各種リソース
・Scriptsフォルダ:Unity ML-Agentsの各種スクリプト
サイズが大きいので、サンプルの学習環境を利用しない場合は「ML-Agents/Examples」と「ML-Agents/Editor/Tests」は削除しても良いですが、今回は利用します。
(3)メニュー「Edit→Project Settings→Player」を選択。
(4)ターゲットとするプラットフォーム(Macの場合はMac and Linux Standalone、Windowsの場合はPC)の「Other Settings」を開く。
(5)「Scripting Runtime Version」と「Api Compatibility Level」で「.Net 4.x」を選択。
(6)メニュー「File→Save Project」を選択し、設定を保存。
3. サンプルの学習環境の作成
「Unity ML-Agents」が提供しているサンプルの学習環境の1 つである「3DBall」を作成します。板の傾きでバランスを取り、ボールを落下させないようにキープする学習環境です。
作成手順は、次の通りです。
(1)Projectウィンドウで「Assets/ML-Agents/Examples/3DBall/Scene」を選択し、シーンを開く。
(2)HierarchyウィンドウでAcademy「Ball3DAcademy」を選択し、InspectorでBrainsにBrain「Assets/ML-Agents/Examples/3DBall/Brains/3DBallLearning」をドラッグ&ドロップし、Controlをチェック。
Academyに学習・推論対象のBrainを登録し、Controlをチェックすると「学習モード」になります。(チェックをはずした時は「推論モード」です。)
3DBallに用意されているBrainは、次の通りです。(Hard除く)
・3DBallLearning:Actionの決定は、ニューラルネットワーク(学習および推論)を使用
・3DBallHeuristic:Actionの決定は、プレイヤー(人間)の入力を使用
・3DBallPlayer:Actionの決定は、ルールベース(手書きのプログラム)を使用
(3)Projectウィンドウの「Assets/ML-Agents/Examples/3DBall/Prefabs/Game」内の「Platform」を選択し、InspectorでBrainにBrain「Assets/ML-Agents/Examples/3DBall/Brains/3DBallLearning」をドラッグ&ドロップ。
Agentで利用するBrainを設定します。
3DBall環境のボールと板の1セットをGameプレハブで作り、12個並べています。Platformの設定を変更することで、12個のエージェントの設定が変わります。
5. Pythonスクリプトによる学習
「サンプルの学習環境」を「学習用のPythonスクリプト」から実行して「学習」を行います。「学習」が完了すると「推論モデル」が生成されます。
(1)Pythonの仮想環境で、「ml-agents-master」のルートに移動し、「mlagents-learn」コマンドで「学習」を開始。
「mlagents-learn」の書式は次の通りです。
$ mlagents-learn <学習コンフィグファイルのパス> --run-id=<実行ID> --train
「学習コンフィグファイル」は学習パラメータをまとめたyamlファイルで、「ml-agents-master/config/trainer_config.yaml」にあります。「実行ID」は学習の実行結果を管理するためのIDで任意の文字列を指定します。
今回は、次のようにコマンドを入力します。
$ mlagents-learn ./config/trainer_config.yaml --run-id=firstRun --train
以下のようなログが表示されます。
▄▄▄▓▓▓▓
╓▓▓▓▓▓▓█▓▓▓▓▓
,▄▄▄m▀▀▀' ,▓▓▓▀▓▓▄ ▓▓▓ ▓▓▌
▄▓▓▓▀' ▄▓▓▀ ▓▓▓ ▄▄ ▄▄ ,▄▄ ▄▄▄▄ ,▄▄ ▄▓▓▌▄ ▄▄▄ ,▄▄
▄▓▓▓▀ ▄▓▓▀ ▐▓▓▌ ▓▓▌ ▐▓▓ ▐▓▓▓▀▀▀▓▓▌ ▓▓▓ ▀▓▓▌▀ ^▓▓▌ ╒▓▓▌
▄▓▓▓▓▓▄▄▄▄▄▄▄▄▓▓▓ ▓▀ ▓▓▌ ▐▓▓ ▐▓▓ ▓▓▓ ▓▓▓ ▓▓▌ ▐▓▓▄ ▓▓▌
▀▓▓▓▓▀▀▀▀▀▀▀▀▀▀▓▓▄ ▓▓ ▓▓▌ ▐▓▓ ▐▓▓ ▓▓▓ ▓▓▓ ▓▓▌ ▐▓▓▐▓▓
^█▓▓▓ ▀▓▓▄ ▐▓▓▌ ▓▓▓▓▄▓▓▓▓ ▐▓▓ ▓▓▓ ▓▓▓ ▓▓▓▄ ▓▓▓▓`
'▀▓▓▓▄ ^▓▓▓ ▓▓▓ └▀▀▀▀ ▀▀ ^▀▀ `▀▀ `▀▀ '▀▀ ▐▓▓▌
▀▀▀▀▓▄▄▄ ▓▓▓▓▓▓, ▓▓▓▓▀
`▀█▓▓▓▓▓▓▓▓▓▌
¬`▀▀▀█▓
INFO:mlagents.trainers:{'--base-port': '5005',
'--curriculum': 'None',
'--debug': False,
'--docker-target-name': 'None',
'--env': 'None',
'--help': False,
'--keep-checkpoints': '5',
'--lesson': '0',
'--load': False,
'--no-graphics': False,
'--num-envs': '1',
'--num-runs': '1',
'--run-id': 'firstRun',
'--sampler': 'None',
'--save-freq': '50000',
'--seed': '-1',
'--slow': False,
'--train': True,
'<trainer-config-path>': './config/trainer_config.yaml'}
INFO:mlagents.envs:Start training by pressing the Play button in the Unity Editor.
「Start training by pressing the Play button in the Unity Editor」と表示されたら準備完了です。
(3)UnityのPlayボタン(▶)を押して学習開始。
最初のうちはボールを落としますが、徐々に上達する様子が見れます。
ログにはMean Reward(平均報酬)とStd of Reward(標準偏差)が出力されます。
INFO:mlagents.trainers: firstRun-0: 3DBallLearning: Step: 1000. Time Elapsed: 8.842 s Mean Reward: 1.188. Std of Reward: 0.722. Training.
INFO:mlagents.trainers: firstRun-0: 3DBallLearning: Step: 2000. Time Elapsed: 18.164 s Mean Reward: 1.222. Std of Reward: 0.688. Training.
INFO:mlagents.trainers: firstRun-0: 3DBallLearning: Step: 3000. Time Elapsed: 27.447 s Mean Reward: 1.514. Std of Reward: 0.997. Training.
:
50000ステップ(学習コンフィグファイルの初期設定)に達すると学習完了です。「ml-agents-master/models/firstRun-0/3DBallLearning.nn」に「推論モデル」が出力されています。
6. Unityでの推論モデルの実行
「推論モデル」の利用手順は次の通りです。
(1)推論モデル「3DBallLearning.nn」を「Assets」にコピー。
(2)Projectウィンドウで「Assets/ML-Agents/Examples/3DBall/Brains/3DBallLearning」を選択し、「Learning Brain」の「Model」に「3DBallLearning.nn」をドラッグ&ドロップ。
Brainで利用する推論モデルを指定しています。
(3)Hierarchyウィンドウで「Ball3DAcademy」を選択し、BrainsのControlのチェックを外す。
Controlのチェックをはずすと「推論モード」になります。
(4)UnityのPlayボタン(▶ボタン)を押して推論開始。
「推論モード」で実行され、ボールがバランスをとる様子を見ることができます。
この記事が気に入ったらサポートをしてみませんか?