UnityのML-Agentsで自分で動かしたキャラクターの模倣学習をさせてみる

今回はUnityのML-Agentsを使って自分でキャラクターを動かして作ったデモの動きを模倣して学習するキャラクターを作ってみたいと思います。

今回の記事までにML-Agentsを使って以下の記事のような事をしてきました。

UnityでML-Agentsを使った機械学習の環境作りをする
UnityでML-Agentsを使った機械学習をする為にML-AgentsコンポーネントのインストールとAnacondaのインストール等の環境作りをしていきます。
UnityのML-Agentsのサンプルを動かしてみる
UnityのML-Agentsのツールキットのサンプルを動かして機械学習をさせてみようと思います。
UnityのML-Agentsを使って敵キャラを強化学習して主人公を追いかけるようにする
UnityのML-Agentsを使って敵キャラクターに強化学習をし主人公を追いかけるようにしていきます。
UnityのML-AgentsのAPIリファレンスを自動生成する
UnityのML-AgentsのAPIリファレンスを自動生成してスクリプトの作成に役立てたいと思います。

今回の記事でわからない部分は上の記事を参照してみてください。

スポンサーリンク

機能の概要

今回はまず自分でキャラクターを操作して観察データとアクションデータのデモファイルを作成します。

デモファイルの作成はML-AgentsのDemonstration Recorderコンポーネントをエージェントゲームオブジェクトに取り付けて行います。

デモファイルが出来たら通常通りの学習の実行を行うとデモファイルのデータを使って模倣学習を行います。

学習用の設定ファイルyamlファイルの中身は模倣学習用のパラメータ設定を追加します。

学習の舞台を作成する

まずはキャラクターを操作したり学習をさせる舞台を作成します。

まずはCreate Emptyで空のゲームオブジェクトを作成し名前をEnvironmentとし、インスペクタのTransformの3つの点の部分を押しResetを選択してデフォルト値にします。

模倣学習用の舞台環境

Environmentを選択した状態で右クリックから3D Object→Planeを選択し、名前をFloorとします。

TransformのScaleのXを2、Zを10とします。

模倣学習用のフロア

次はFloorを覆う外壁とFloorの道中に置く障害物の作成をします。

全て右クリックから3D Object→Cubeを選択し作成していきます。

外壁は縦2、横2、障害物は3作りますので合計7のCubeを作成します。

外壁の縦の長い部分のTransformのScaleはYを5、Zを100とします。

模倣学習用の舞台の縦に長い外壁のScale

外壁の横の部分のTransformのScaleのXは20、Yは5とします。

模倣学習用の舞台の横の外壁

障害物のTransformのScaleはXは8、Yを3とします。

模倣学習用の舞台の障害物

縦横の外壁と障害物のTransformのPositionはそれぞれ調整してください。

また7つのゲームオブジェクトにはそれぞれWallタグを作成し設定しておきます。

ここまでの階層は以下のようになります。

模倣学習用の舞台の階層

実際の画像は以下のようになります。

模倣学習用の舞台の画像

次にキャラクターが移動すると報酬を得てエピソードを終了する領域を作成します。

Cubeを使って作成し名前をGoalとし、マテリアルには半透明なものを設定し、インスペクタのBox ColliderコンポーネントのIs Triggerにチェックを入れ衝突をしないようにし、検知エリアとして使います。

Transformは舞台に合わせて調整してください。

またGoalタグを作成し設定します。

模倣学習用の舞台のゴールのインスペクタ

わたくしの場合は半透明な青色のマテリアルを設定したので以下のようになりました。

模倣学習用の舞台のゴールの画像

エージェントの作成

次は舞台を移動するキャラクターの作成です。

キャラクターにはCharacterControllerコンポーネントを取り付けコライダのサイズを調整します。

キャラクターに設定するAnimatorControllerはアニメーションパラメータにFloat型のSpeedを作成し、

Idle状態とWalk状態を持ち、Speedが0.1より上の時はIdle→Walk、0.1より下の時はWalk→Idleへと遷移するように作ってください。

キャラクターゲームオブジェクトの名前はImitationLearningCharacterとします。

エージェントスクリプトの作成

キャラクターに設定するエージェントスクリプトは前回の記事で作成したものとほとんど同じなので詳細は割愛します。

新しくImitationLearningCharacterスクリプトを作成します。

スクリプトは完成してからキャラクターに取り付けます。

エピソードを終了したら最初の位置に戻したいのでinitCharacterPositionに開始時のキャラクターの位置を入れておきます。

goalはインスペクタでGoalゲームオブジェクトをドラッグ&ドロップして設定します。

Initializeメソッドはエージェント開始時に1回だけ呼ばれるのでそこでコンポーネントの取得をします。

OnEpisodeBeginメソッドはエピソード開始時に呼ばれるのでそこでデータのリセットを行います。

CollectObservationsメソッドでは観察データの追加を行っています。

今回の場合はキャラクターの位置を舞台のサイズに合わせて正規化したVector3の値と、キャラクターの速度のVector3の値、ゴールの方向のVector3の値を追加しています。

OnActionReceivedメソッドではアクションの実行と報酬を与えています。

Resetメソッドはキャラクターの位置を元の位置に戻しています。

Heuristicメソッドは自分でキー操作する時に呼び出すメソッドです。

ここまで出来たらキャラクターにImitationLearningCharacterスクリプトを取り付け設定をします。

模倣学習用のキャラクターのインスペクタの設定

キャラクターにはPlayerタグを設定し、AnimatorにAnimatorControllerを設定しApply Root Motionのチェックを外します。

Behavior ParametersのBehavior NameにはImitationLearningCharacterという名前を付けます。

Vector Observationはスクリプトで設定した観察数なのでSpace Sizeを9、Stacked Vectorsは過去のデータをどれだけ保持しておくかなので5にします。

Vector ActionはContinuousにし連続的な数値を扱えるようにします。今回の場合はSpace Sizeを2にし、移動のfloat値を2つ使います。

ImitationLearningCharacterではMax Stepを5000にし、GoalにGoalゲームオブジェクトをドラッグ&ドロップします。

Decision Requesterコンポーネントの取り付け

次にImitationLearningCharacterのインスペクタのAdd ComponentからML Agents→Decision Requesterコンポーネントを追加します。

これはどれだけの頻度決定を下すかを設定するものです。

模倣学習用のキャラクターに取り付けたDecision Requesterコンポーネント

これは初期設定のまま使用します。

このコンポーネントがないとエージェントは学習をしません(決定をしてアクションを起こせない為)。

Demonstration Recorderコンポーネントの取り付け

次にエージェントの観察とアクションをデモファイルに保存してくれるコンポーネントDemonstration Recorderを取り付けます。

ImitationLearningCharacterのインスペクタのAdd ComponentからML Agents→Demonstration Recorderを選択し取り付けます。

エージェントの観察とアクションを記録する為のコンポーネント

Recordにチェックを入れるとUnityのエディターのプレイボタンを押した時にエージェントの観察とアクションを記録します。

Num Steps To Recordは何ステップを記録するかの数値で、0を設定するとUnityエディターのプレイボタンを押してから再度プレイボタンを押すまでずっと記録します。

Demonstration Nameはデモファイルの名前です。
Demonstration Directoryはデモファイルまでのパスを設定します。

Ray Perception Sensor 3Dコンポーネントの使用

ImitationLearningCharacterスクリプトでキャラクターの位置、キャラクターの速度、ゴールの方向のVector3型の9つの値を観察に追加しましたが、それとは別にレイを使って衝突した物理的な物体の観察データも収集出来るようにしておきます。

ImitationLearningCharacterゲームオブジェクトを選択した状態で右クリックからCreate Emptyを選択し、名前をRaySensorとします。

RaySensorゲームオブジェクトの位置を少し上に移動し、キャラクターの目の辺りに移動させます。

模倣学習用のキャラクターの階層

インスペクタのAdd ComponentからML Agents→Ray Perception Sensor 3Dを選択し取り付けます。

模倣学習用のキャラクターのRayPerceptionSensor3Dコンポーネントの設定

Detectable TagsのSizeを2にし、WallタグとGoalタグをレイが衝突する相手として設定します。

Ray Lengthを10にしレイの長さを調節します。

Stacked Raycastsはレイの過去のデータを何個分保持するかなのでBehavior ParametersのVector ObservationsのStacked Vectorsで指定した5と同じ数値分保持出来るようにしました。

シーンビューで見ると以下のような感じでレイが飛んでいるのがわかります。

模倣学習用のキャラクターからレイを飛ばした様子

これでエージェントキャラクターが出来ました。

ImitationLearningCharacterゲームオブジェクトの位置を変更しGoalゲームオブジェクトと反対の方に移動させます。

模倣学習用の舞台の全体図

Goalスクリプトの作成

キャラクターがゴールエリアに入ったら報酬を与えてエピソードを終了させる必要があります。

なので、新しくGoalスクリプトを作成し、Goalゲームオブジェクトに取り付けます。

インスペクタでimitationLearningCharacterにImitationLearningCharacterゲームオブジェクトを設定します。

OnTriggerEnterメソッドでPlayerタグを持つコライダが侵入したらエージェントに報酬を与えてエピソードを終了させます。

カメラにエージェントキャラクターを追尾させる

デモファイル作成時にカメラがキャラクターを追尾してくれると楽なのでMain CameraゲームオブジェクトのインスペクタのAdd Componentの検索窓にfollowと入力し、出てきたFollow Targetコンポーネントを取り付けます(UnityのStandard Assetsを入れていないとFollow Targetはありません)。

TargetにImitationLearningCharacterゲームオブジェクトをドラッグ&ドロップし、Offsetにオフセット位置を設定します。

模倣学習用の舞台のカメラにFollow Targetを取り付ける

デモファイルを作成する

学習環境の舞台とエージェントが出来たので実際に自分でキャラクターを操作してデモを作成します。

Unityエディターのプレイボタンを押してキャラクターを操作し、障害物をジグザグに移動し、ゴールエリアに到達するということを20回ほど繰り返し実行します。

移動するルートは全て同じにします。

以下のような感じで繰り返します。

20回ほどエピソードを実行したらUnityのエディターボタンを押して記録を終了します。

学習中にも記録しないようにImitationLearningCharacterのDemonstration RecorderのRecordのチェックをあらかじめ外しておきます。

Demonstration RecorderコンポーネントのRecordのチェックを外す

Unityエディターの実行を終了してすぐにはデモファイルは作成されませんが、少し待つとDemonstration RecorderのDemonstration Directoryに指定した場所にデモファイルが作成されます。

自分で操作したデモンストレーションファイルが作成される

デモを使用した学習用設定ファイル

デモファイルを使用して学習をさせる場合の設定ファイルにいくつかの項目を追加します。

設定ファイルはML-AgentsのツールキットのサンプルのPushBlockの模倣学習用の設定ファイルを変更して使う事にします。

まだダウンロードしていない方は以下のCodeからZIPファイルをダウンロードしてデスクトップにすべてのファイルを展開します。

Unity-Technologies/ml-agents
Unity Machine Learning Agents Toolkit. Contribute to Unity-Technologies/ml-agents development by creating an account on GitHub.

デスクトップにML-Agentsツールキットのrelease8をファイル展開しているとすれば以下のフォルダにPushBlock.yamlファイルがあるのでデスクトップにそのファイルをコピーし、名前をImitationLearningCharacter.yamlにします。

C:\Users\ユーザー名\Desktop\ml-agents-release_8\ml-agents-release_8\config\imitation

設定項目の詳細についてはUnityのGitHubのマニュアルを参照してください。

Unity-Technologies/ml-agents
Unity Machine Learning Agents Toolkit. Contribute to Unity-Technologies/ml-agents development by creating an account on GitHub.

今回の場合はデモのアクションを模倣させたいのでreward_signalsのgailのuse_actionsをfalseにしました。

demo_pathはデモファイルまでのパスを指定します。

behavioral_cloningは行動のクローンに関する設定でdemo_pathでデモファイルへのパスを指定し、stepsを0にするとトレーニングの実行全体にわたって一定の模倣を行うようです。

samples_per_updateも0にすると各更新ステップですべてのデモをトレーニングするようです。

色々設定を変えて試す必要がありそうですね・・・・((+_+))

学習の実行

設定ファイルが出来たので学習を開始してエージェントの動きを確認してみます。

前回の記事と同様にヒエラルキーのEnvironmentを選択し、Ctrl+Dキーを押して複製し10個の同じ学習環境を作成します。

模倣学習の学習環境を10個に増やす

Anacondaのコマンドプロンプトでコマンドを実行

AnacondaのコマンドプロンプトでML-Agentsの環境をアクティブにし、デスクトップに階層を移動した状態で以下のようにコマンドを打ちます。

mlagents-learn ./ImitationLearningCharacter.yaml –run-id ImitationLearningCharacter01

コマンドを実行してUnityのエディターのプレイボタンを押せという表示がされたらUnityエディターのプレイボタンを押し学習をさせます。

今回20回ほどのエピソードを実行したデモを使って学習させたモデルをBehavior ParametersのModelに設定して実行すると以下のようになりました。

20回ほどしかエピソードを実行していなかったり設定ファイルのパラメータの影響もあるのかデモとまったく同じに学習するということは出来ませんでしたが、ジグザグに動いてゴールに到達するという感じは学習してくれたのではないかと思います。

終わりに

今回の模倣学習を使えば例えばゲームプレイの見本の動きとかを作成するとき使えそうですね。

対戦ゲームの敵の動きを模倣学習を使ってどんどん強くさせたモデルを作るというのも出来るかもしれません。

んーしかし、まだまだ使いこなせないなぁ・・・・(´Д`)

参考サイト

模倣学習によるトレーニング

ML-AgentsToolkitの概要

タイトルとURLをコピーしました