ML-Agent[0.13.1]を使った強化学習の環境構築
0.はじめに
近年、第三次AIブームが到来し、画像認識(パターン認識)などにおいて、人口知能はより身近な存在となってきました。
本記事では、人工知能の中でも機械学習(強化学習)を身近に感じてもらうために、Unityを使った導入方法を紹介します。
なお、UnityとAnacondaは【1.使用したもの】をすでにインストールしているものとして説明をしますので、インストール方法などについては別途サイトをご覧ください。
1.使用したもの
・WindowsPC
・UnityHub→Unity2019.3.13f1
・Anaconda(python3.7の64bitインストーラー)
・ML-Agents(var 0.13.1)
2.Unity ML-Agentsのダウンロード
「Unity ML-Agents」のダウンロードには2つの方法があります。ただし、保存場所が異なりますので、フォルダーの作成から説明します。
(0)フォルダーの作成
「C:\Users\ユーザー名」に進み、”新規フォルダーの作成”で『Unity0.13.1』と名前を付けて作成してください(※フォルダー名は、英数字であればなんでもいい)。
今回は『Unity0.13.1』フォルダー内に"Unityプロジェクト"と”ml-agentsフォルダー"をまとめて説明しますが、以下の理由があるからです。
・日本語フォルダーや多階層によってうまく動作しない
・"Unity"と”ml-agents"を別々の保存先にするとうまく動作しない
※私が解決した方法であり、必ずしもこれが正しいわけではありません。
(1)GitHubからのダウンロード
URL: https://github.com/Unity-Technologies/ml-agents
↑には、最新のml-agentsのリポジトリがあります。
今回のように旧バージョンをダウンロードする際は、リンクページの下にいくと下図のような表があります。
今回は「0.13.1」をダウンロードし、(0)で作成したフォルダー内に解凍してください。
※説明の都合上、解凍したフォルダーの名前を「ml-agents」だけに変更してください。
(2)コマンドプロンプトを使ったダウンロード
コマンド入力によりダウンロードすることもできます。ただし、起動時のディレクトリ(選択フォルダー)がユーザー名になっています。違う場所にダウンロードしてしまっても、後で「ml-agents」フォルダーをいどうさせればよいので、安心してください。
手順
①コマンドプロンプトを起動する。
②「cd␣(0)で付けた名前」で(0)のディレクトリを移動する。
※私であれば「cd Unity0.13.1」である
③次のコードを入力(orコピペ)をしてダウンロードする。
※環境によって少し時間がかかります
※完了後「ml-agents」というフォルダーが作成されます。
git clone https://github.com/Unity-Technologies/ml-agents.git -b 0.13.1
3.Pythonの仮想環境の構築
次の手順で、「Anaconda Prompt」を使って、Pythonの仮想環境を構築します。
手順
(1)「mlagents」という名前の環境を作成する。「y/n」の選択肢が出たら「y」を選択し、インストールを続行する。
※すでに「mlagents」の名前の環境がある人は、削除して作り直すか、後ろに番号を付けるなどして対応してくだい。
$ conda create -n mlagents python=3.7
(2)環境をアクティブ化する
$ conda activate mlagents //自分で付けた環境名
(3)【2.Unity ML-Agentsのダウンロード】でダウンロードした「ml-agents」ディレクトリに移動する。
※ユーザー名のディレクトリからスタートしているものとする
cd Unity0.13.1/ml-agents
(4)次のコマンドを実行して、ml-agentsをインストールします。
※2回目の「pip install -e ./」は時間かかります。
cd ml-agents-envs
pip install -e ./
cd ..
cd ml-agents
pip install -e ./
cd ..
4.Unityの環境設定
(1)プロジェクトの新規作成
プロジェクト名:ML-Agents sample (←様々なサンプルを試せるので)
保存先:C:\Users\ユーザー名\Unity0.13.0
テンプレート:3D
(2)強化学習用アセットのコピー
「ml-agents → UnitySDK → Asset」のフォルダー内にある『ML-Agents』のフォルダーをUnityのプロジェクトウィンドウ内にドラッグしてコピーする。
(3)Platformの設定
「File → Build Settings」から『PC, Mac & Linux Standalone』を選択する。
(4)「Api Compatibility Level」を設定
"Build Setting"の左下にある『Player Settings...』を選択し、左の『Player』から「Other Settings → Api Compatibility Level」を「.Net 4.x」に選択する。
※選択後は、✕で閉じる
(5)「Barracuda 0.4.0」をインストール
「Windows → Package Manager」を開き、『Advanced』から「Show Preview Packages」を選択する。右の検索スペースに『Barracuda』と入力し、左にある"▽"マークを押して展開して"See all versions"でさらに展開する。「preview - 0.4.0」を選択し、右下の"install"でインストールする。
補足:
『ml-agents 0.13.1』は「Barracuda 0.4.0」で動き、
『ml-agents 0.14.0』からは「Barracuda 0.5.0」で動きます。
旧バージョンは最新バージョンに対応していないことがあるので気を付けてください。
(6)プロジェクトの保存
「File → Save Project」で設定を保存します。
5.サンプルを開く
(1)3DBallのシーン選択
プロジェクトウィンドウより「Assets → ML-Agents → Examples → 3DBall → Scenes」にある『3DBall』を選択する。
(2)まずは実行
再生ボタンを押すことで、すでに訓練(学習)された「推論モデル」が動作し、球を落とさないようにCubeが動きます。
(3)すでにあるモデルを取り除く
すでに訓練された「推論モデル」が"Prefab"に組み込まれているので、一度取り除きます。
①プロジェクトウィンドウより「Assets → ML-Agents → Examples → 3DBall → Prefabs」にある『3DBall』をダブルクリックで選択し、"Prefab"の編集を有効にする。
②ヒエラルキーウィンドウの”Agent"を選択する。
③インスペクターウィンドウより「Behavior Parameters(Script) → Model」にある『3DBall(NNModel)』を"none"に変更する。
(4)シーンの保存
「File → Save」で、シーンを保存する。
(5)補足
学習モデルをのけて実行すると次のようになります。学習の時はどれだけのスピードでやってるかの参考に覚えておいてください。
6.Pythonスクリプトを使って学習させる
(0)Anacondaを終了してしまった場合
"Anaconda Prompt"を再度起動し、アクティブ化する。
※アクティブ化の『mlagents』は【3.Pythonの仮想環境の構築】でつけた名前です。
$ conda activate mlagents
次に、「ml-agents」のディレクトリに移動する。
cd Unity0.13.0/ml-agents
(1)学習の準備をする
次のコマンドを入力して、学習を始める準備をする。
※(3)でも述べるが、原則『推論モデル』の名前は、trainer_config.yamlに書かれた名前で保存される。ステップごとに保存したい場合は、「id=firstRun」の部分を変更すれば別のフォルダーが作成され、別途保存できる。ただし『推測モデル』名前は変わらない
mlagents-learn config/trainer_config.yaml --run-id=firstRun --train
(2)Unityを実行する
プロンプトが下図のようになったら、スタートの合図です。Unityに戻って実行ボタンを押すと学習が開始されます。
実行したて(落ちても次へ次へとどんどん学習しています)
10000ステップ後(だいぶ落とさなくなりました)
(3)学習を終了する
終了するには2つの方法があります。
・プロンプトの方で、「Ctrl + C」で止める
・Unityの方で、実行ボタンを押して止める
終了するとプロンプトが次の図のようになり、赤枠で囲まれた部分が『推論モデル』の保存先+データ名となる。
保存先:models → firstRun-0
保存名:3DBall.nn (←nn形式が推論モデル)
7.『推論モデル』を使って実行
(1)『推論モデル』をUnityにコピー
①プロジェクトウィンドウの「Assets → ML-Agents → Examples → 3DBall」内に、『NNModel』と新規フォルダーを作成する。
②「ml-agents → models → firstRun-0」の中にある、『3DBall.nn』を『NNModel』の中にドラッグしてコピーする。
(2)プレハブに組み込む
①プロジェクトウィンドウより「Assets → ML-Agents → Examples → 3DBall → Prefabs」にある『3DBall』をダブルクリックで選択し、"Prefab"の編集を有効にする。
②ヒエラルキーウィンドウの”Agent"を選択する。
③インスペクターウィンドウより「Behavior Parameters(Script) → Model」に先ほど保存した『3DBall.nn』をドラッグして追加する。
(3)実行
実行すると、学習したことを生かしてボールが落ちないようにバランスをとる。下の図は30000回実行した学習結果である。
8.他のサンプルでも試してみよう
ここまで出来たら、あとはサンプルのシーンを変えるだけです。手順としては次のようになります。
①シーンを切り替える
②『推論モデル』を取り除く
③AnacondaでPythonスクリプトの実行
※アクティブ化にすることを忘れないように
の繰り返しである。
①➁については【5.サンプルを開く】、③については【6.Pythonスクリプトの実行】を参考にしてください。
テニスの実行例を載せておきます。
・モデルをなくした場合(全然動きませんパラメータの都合かな?)
・学習中
・4000stepでの学習結果
相手側にうまく返せるようになってきました。
・『サンプルの推論モデル(青)』vs『4000step推論モデル(紫)』
青の方が滑らかで確実にボールを終えてますが、紫はまだ追い切れてませんね。
9.最後に
ML-Agetnsは「0.13.1」から「0.14.0」にバージョンアップをした際に、フォルダーの構成が変わってしましましたが、動作としての流れは、全く同じです。また、ペンギンを使ったものや木の棒を取りに行く犬など、まだまだ試せるサンプルはありますので、本記事でうまくいったら他の記事でも試し、機械学習に少しでも興味を持ってもらえたらと思います。
↓Next Stage