【Unity】ML-Agentsの学習環境をつくる(ML-Agentsで機械学習&強化学習をやってみる その4)

投稿日:2022年1月14日
最終更新日:2022年1月14日

ML-Agentsの学習環境をつくる

前回はExampleのプロジェクトを使って、PythonでAgentに学習させて、学習モデルを作ってみた。今回は、プロジェクトの作成から始まり、ML-Agentsを使ってボール(Agent)を箱(Traget)の方に動かすモデルをつくるための学習環境をつくってみる。参考文献の本で言うと2章の2-1~2-3までの部分にあたる。

ちなみに、本で紹介されているサンプルコードはML-Agents公式ドキュメントから引用されているようで、内容はほとんど同じ。ただ、本のコードそのままだと動かない部分があるので、以下の現状最新版のコードを使った方が無難だと思う。

https://github.com/Unity-Technologies/ml-agents/blob/release_18_docs/docs/Learning-Environment-Create-New.md

また、前回はExampleプロジェクトのに合わせてUnity 2019.4.25f1を使ったが、今回は現時点で最新のLTS版であるUnity 2020.3.25f1を使ってやってみる。

 

実行環境

Windows 10

Unity 2020.3.25f1

Anaconda 4.6.11 (Python 3.7.3)

ML-Agents Release 18

 

Unityの3Dプロジェクトを新規作成&ML-Agentsのパッケージ追加

まずはUnity 2020.3.25f1で3Dのプロジェクトを新規作成する。

プロジェクトを作成したら、まずは前回同様にML-Agentsの以下のpackageをimportする。今回の内容だけだったらml-agenstsのものだけでも良いのだが、発展して色々いじるかもしれないので一応ml-agents.extensionsの方もimportしておいた。

com.unity.ml-agents\package.json
com.unity.ml-agents.extensions\package.json

 

3Dオブジェクトの配置&Behavior Parametersの追加

Create → 3D Objectから以下の3つのオブジェクトを追加する。SphereにだけAdd ComponentでRigid Bodyを追加しておく。

  • Plane (今回はFloorという名前をつけた)
  • Cube (今回はTargetという名前をつけた)
  • Sphere (今回はRollerAgentという名前を付けた。Rigid Bodyを追加しておくこと)

 

Materialは設定しなくても良いが、お好みでCreate → Materialで適当にMaterialを作ってオブジェクトに付加して色を付けても良い。

最後に、RollerAgentオブジェクトにAdd ComponentでBehavior Parametersを追加する。本に書かれている内容からVector Actionの設定項目が少し変わっているので注意。

 

ML-Agentsのスクリプト作成&オブジェクトへの追加

今回は公式のドキュメントのコードをほぼ丸写ししてるのでここではコード全ては載せないが、公式ドキュメントのコードを以下のように並べてRollerAgent.csという名前で保存すればOK。

using System.Collections.Generic;
using UnityEngine;
using Unity.MLAgents;
using Unity.MLAgents.Sensors;
using Unity.MLAgents.Actuators;

public class RollerAgent : Agent
{
    Rigidbody rBody;
    void Start () {…省略…}

    public Transform Target;
    public override void OnEpisodeBegin()
    {…省略…}

    public override void CollectObservations(VectorSensor sensor)
    {…省略…}

    public float forceMultiplier = 10;
    public override void OnActionReceived(ActionBuffers actionBuffers)
    {…省略…}

    public override void Heuristic(in ActionBuffers actionsOut)
    {…省略…}
}

ちなみに、本のRollerAgent.csのコードを使う場合は、ML-AgentsのRelease 18 + Unity 2020.3.25f1の環境だと以下のようなエラーが出てそのままだと使用できない。

RollerAgent.cs(45,26): error CS0115: 'RollerAgent.OnActionReceived(float[])': no suitable method found to override

RollerAgent.cs(70,26): error CS0115: 'RollerAgent.Heuristic(float[])': no suitable method found to override

もし本のコードを使いたい場合は、以下2点の変更を加えればOK。

  • using Unity.MLAgents.Actuators;を追加
  • OnActionReceived、Heuristicの部分を上記の公式ドキュメントのものにさしかえ

 

あとはRollerAgentオブジェクトにRollerAgent.csを追加し、Add ComponentでDesicion Requesterを追加すれば完了。パラメータは以下のように設定した。

まだ学習は未実行なので、この状態で実行するとヒューリスティックモード(手動で操作できるモード)で動くため、キーボードで操作ができる。静止画だとよくわからないと思うが、以下が主導で動かしているときの画像。キーボードの方向キーで操作している。

これで学習環境の作成は完了。長くなったので今回はここで切って、次回はこの環境を使って学習を実行し、RollerAgentをTargetの方に動くモデルを作ってみたいと思う。

 

参考文献

基本的には以下の本を読みつつ勉強していき、最終的には自分で何かしらゲームを作っていく予定。最低限ML-Agentsを使うための流れはブログで書いていこうと思っているが、詳細については説明しないので、深く理解するには本を買って勉強してみることをオススメする。

一部環境構築の記載などは古いけど、強化学習の概念やML-Agentsの学習方法、ゲームへの応用例などが日本語で整理してまとめられているので貴重な本だと思う。

古くなった情報を補完するため、本と合わせて以下のML-Agents Release 18の公式ドキュメントを参照している。

https://github.com/Unity-Technologies/ml-agents/tree/release_18_docs/

 

日記まとめ

この日記は以下でまとめてます。

【Unity】ML-Agentsで機械学習&強化学習をやってみる まとめ

 


投稿者: wakky

映画と旅行が大好きなエンジニア。お酒、ゲーム、読書も好き。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください