2019/1/17こちらのページでは、ML-Agentsの公式サンプルに入っています、「Tennis」についての解説ページになります。「Tennis」は2つの「Agent」(青ラケット君と赤ラケット君)を左右移動+ジャンプさせてお互いにボールを打ち合っていこう!というゲームになります。今回のサンプルは、1つのBrainに紐づけられた2つのAgentがお互いに対戦することで機械学習を行うサンプルになっています。本ページはML-Agents(ver0.5)に基づいて解説していきます。2018年12月17日に、ML-Agents(ver0.6)が新規にリリースされました。Typeの設定方法が大きく変更されております。設定方法についてはこちらのページにまとめましたので、ML-Agents(ver0.6)でサンプルをいじる際は本ページと併せて参考にして下さい。自分で遊んでみようとりあえず、どんなゲームかを体感するために自分で遊んでみましょう。今回のゲームには2種類のBrain「PlayerBrain」と「TennisBrain」が用意されています(初期状態では両Agent共に「TennisBrain」が紐づいています)。Type:Player」にすると分かりますが、下図の通り違う操作キーが割り当てられています。よって、両者のAgentを異なるBrainと紐づければ人vs人の対戦も可能なゲームとなります。Type:Internal)」を紐づけて、人vsAIの対戦をやってみましょう(「PlayerBrain」が非表示になっている場合は表示させて下さい、非表示のままだとエラーになります)。・「←」:vectorAction[0]に値「-1」を返す・「→」:vectorAction[0]に値「1」を返す・「左Ctrl」:vectorAction[1]に値「1」を返すです。後で解説しますようにスクリプト(TennisAgent.cs)を見ると、以下のように対応していることが分かります。・「左Ctrl」:AgentA(青ラケット君)が上にジャンプちなみにスクリプト全体を見渡すと、ボールを自陣に落下させると報酬-0.01、相手側にボールを返すと報酬+0.1、が入る仕組みになっており、これからいかにラリーを続けられるか、というゲームになっていることが分かります。相手側にボールを落とすこと以上に、いかに自陣にボールを落とさないかが大切なゲームになっているようですね。Type:External)」を紐づけてこのゲームを機械学習させてみましょう(実行のための詳細手順はコチラのページを参照)。今回、ゲーム内には18コート並んでいますので、3DBallのサンプルと同様、TennisBrainに18×2個のAgentが紐づき、効率良く機械学習出来るようになっております。機械学習の最初の方では↓のように、両者のAgentは共にランダムにウロウロしているだけで、ボールを受け取ろうともしません。ラリーが始まらない...。(注:上の動画は機械学習のオプションに「--slow(通常速度で学習実行)」を入れて実行したものを撮影しています)しかし、5万ステップ程学習した後の動きを見てみると、↓のようにちゃんとTennisしております!機械学習の効果により、両者のAgentはゲームの目的をしっかり理解して行動しているようです。本当機械学習ってスゴイですね!スクリプトの中身についてこの「Tennis」には、4つのスクリプト(TennisAcademy.cs、TennisAgent.cs、TennisArea.cs、HitWall.cs)が付いております。TennisArea.csは各コートの親オブジェクト「TennisArea」に、HitWall.csは「Ball」オブジェクトに、TennisAgent.csは両者の「Agent」に紐づいております。Academy、Agentスクリプトの概要についてはサンプル集解説0にて書いた通りですが、今回TennisAcademy.csには特に何も書かれておりません。よって、本ページではそれ以外の3スクリプトについて解説していきます。解説の都合上、「TennisAgent.cs」→「HitWall.cs」→「TennisArea.cs」の順に解説していきます。これまでのサンプル解説ページではスクリプトの中身を極力全部解説していましたが、各ページかなり長い解説になっているため、今回以降は重要な箇所に絞って解説していきます(それでも長いですが...)。解説を省略した箇所については、基本これまでのサンプル解説(その1、その2、その3)で同様のスクリプトが登場しているハズ...ですので、一度ご自身で探してみて下さい。スクリプト解説1「TennisAgent.cs」サンプル集解説0にて書きましたが、「Agent」に付けるスクリプトは「Agent」クラスを継承しており、5つの(オーバーライド)メソッドを持っているんでしたね。各メソッドの詳細を見ていきましょう。AgentReset()メソッド:エピソード終了時呼び出し>「Agent」を初期位置に戻し、速度も0に戻します。初期の左右位置(x座標)には少しだけランダム要素があるようです。bool変数invertX(チェックあり:True、チェックなし:False)に依る変数で、以下のように値が入ります。・AgentA:チェックなし→invertX=False→invertMult=+1f・AgentB:チェックあり→invertX=True→invertMult=-1f要するに、AgentAもAgentBも同じスクリプト「TennisAgent.cs」で紐づいていますが、net(x=0)を挟んで反対側にいますので、両者に対応するためにはx座標の±をひっくり返す必要があります。そこの役割を変数invertMultにさせております。CollectObservations()メソッド:State取得時に呼び出し>今回のゲームでは、Agent(自分自身)の状態(位置+速度)に加え、Ballの状態(位置+速度)をBrainに返しています。この辺は3DBallのサンプルと同様で、Agent(自分自身)の状態だけ分かっても、BallがどこにあるかでAgentがやるべき行動は全然変わります(基本、Ballの下に潜り込む必要がありますよね)ので、Ballの状態も知ることが機械学習には必須ですよね。ballRb.velocity.x);AddVectorObs(ballRb.velocity.y);}具体的には、上のように「Agent(自分自身)の位置座標(x、y)、速度(x、y)」「Ballの位置座標(x、y)、速度(x、y)」で、float値を合計8成分返しています(今回のゲームは奥行方向に動かないのでz方向の情報は不要)。Size」が「8」になっているのはこれが理由です。Size:2」なので、vectorAction[0]と[1]が使用出来ます。Type:External」の場合、vectorAction[0]と[1]には任意?のfloat値が入り、「Agent」の行動が決まります。今回の場合、以下のスクリプトより、vectorAction[0]に0~1が入ると右方向、-1~0が入ると左方向の速度が追加⇒左右移動し、vectorAction[1]に0.5~1が入りAgentが地面に居ると上方向の速度が追加⇒ジャンプします(よって空中ジャンプは不可)。0f);なお、以下のif文でAgentの位置座標に制約を課しています。要するにnet(x=0)に近付き過ぎはNGってことです。通常のMonoBehaviourクラスのスクリプトですが、Ballオブジェクトが他のオブジェクトと衝突・干渉した際にAgentA、AgentBに報酬を与える(、エピソード完了を通知する)役割を持っています。今回のゲームの1コート(親オブジェクト「TennisArea」)には右図のようにオブジェクトが配置されています(点線のオブジェクトは透明)。スクリプト中ではまず、OnTriggerExitメソッド(当たってもすり抜け)内にて、overオブジェクトと干渉完了=netの上を越えたら直前にBallを打った(*)Agentに報酬+0.1が入ります。OnCollisionEnterメソッド(当たったらはね返り)内にて、上図内のover以外のオブジェクトと衝突すると、勝ったAgentに報酬+0(代わりに点数+1)、負けたAgentに報酬-0.01が入ります。スクリプト中では、様々なシチュエーションに対して報酬をどうするか、が事細かに書かれていますが、要するに勝ち負け判定(*)は通常のテニスのルールに準拠しています。報酬・得点を支払った後は、Doneメソッドにてエピソード終了になります。(*)変数lastAgentHitという、AgentAが打てば0、AgentBが打てば1になる変数により、直前に誰が打ったか分かる、という仕組みを取っています。勝敗判定する際にも、最後に誰がボールを打ったかは重要ですよね。1;}また、別スクリプト「TennisArea.cs」より、最初にボールが落下してきて誰も打ち返してない状態ではlastAgentHit=-1になっています。通常のMonoBehaviourクラスのスクリプトで、先程の「HitWall.cs」内でエピソードの終了を宣言した際、併せて本スクリプト中のMatchResetメソッドが発動します。本メソッド内に書かれているのは、要するに「Ball」を初期位置に戻し、速度も0に戻すだけです。初期の左右位置(x座標)には少しだけランダム要素があるようです。あと、左or右どちらのコートに落とすかもランダムです。~3DBall~こちらのページでは、ML-Agentsの公式サンプルに入っています、「3DBall」についての解説ページになります。~GridWorld~こちらのページでは、ML-Agentsの公式サンプルに入っています、「GridWorld」についての解説ページになります。~PushBlock~こちらのページでは、ML-Agentsの公式サンプルに入っています、「PushBlock」についての解説ページになります。~Basic~こちらのページでは、ML-Agentsの公式サンプルに入っています、「Basic」についての解説ページになります。「Basi...記事を読むML-Agents(ver0.5→0.6)の変更点まとめ(Windows版)2018年12月17日、ML-Agents(ver0.6)が新規にリリースされました。コメントをキャンセルメールアドレスが公開されることはありません。Unityゲーム制作日記.。