
マイケル
みなさんこんにちは!
マイケルです!
マイケルです!

エレキベア
こんにちクマ〜〜〜

マイケル
今日は引き続きML-Agentsを触っていきます!
前回は簡単なサンプル作成まで行いましたが、今回はセルフプレイを使った学習について見ていこうと思います。
前回は簡単なサンプル作成まで行いましたが、今回はセルフプレイを使った学習について見ていこうと思います。

エレキベア
セルフプレイって何クマ?

マイケル
簡単に言うと、エージェント同士を競い合わせて学習させる手法のことだよ!
テニスやサッカー等、1対1やチーム同士で競う場面で使用することができるね。
テニスやサッカー等、1対1やチーム同士で競う場面で使用することができるね。

エレキベア
エージェント同士で実際にゲームをプレイしながら学ぶのクマね

マイケル
イメージとして、ポン風のゲームを学習させてみたのはこんな感じ!

エレキベア
おお〜〜〜
ちゃんといい感じにバトルしてるクマね
ちゃんといい感じにバトルしてるクマね

マイケル
ちょっとガクガクしてるけどそれっぽいよね!
こちらは下記の書籍に載っていたサンプルを使わせていただいています。
こちらは下記の書籍に載っていたサンプルを使わせていただいています。
Unity ML-Agents 実践ゲームプログラミング v1.1対応版

マイケル
サンプルをそのまま載せても面白くないので、
今回はこれを少し改造した大玉転がしのセルフプレイ学習に挑戦してみようと思います!
今回はこれを少し改造した大玉転がしのセルフプレイ学習に挑戦してみようと思います!

エレキベア
大玉転がし楽しそうクマね
大玉転がしのセルフプレイ学習
セルフプレイとは

マイケル
まずはセルフプレイとは何かについて!
これは先ほど説明した通り、エージェント同士を競い合わせて学習させる手法のことです!
基本的な学習方法は前回と同じだけど、下記に注意して学習させる必要があります!
これは先ほど説明した通り、エージェント同士を競い合わせて学習させる手法のことです!
基本的な学習方法は前回と同じだけど、下記に注意して学習させる必要があります!
・最終的な報酬を-1、0、1に設定する。
・敵対するエージェントの単位でチームIDを振り分ける。

マイケル
この最終的な報酬とチームIDから、ELOという指標を使って
学習の進行状態を調べることになります。
学習の進行状態を調べることになります。

エレキベア
お互いに強くなっていくのを確認できるクマね
プロジェクト構成

マイケル
オブジェクト構成は下記のように設定しました。
ボール(Ball)、エージェント(PlayerAgent)の他に、
ステージの端にゴールとなるエリア(ScoreArea)を追加しています。
ボール(Ball)、エージェント(PlayerAgent)の他に、
ステージの端にゴールとなるエリア(ScoreArea)を追加しています。

マイケル
大玉転がしのため、ルールは
ボールを押し合って相手のエリアに入れたら勝ちというだけです!
ボールを押し合って相手のエリアに入れたら勝ちというだけです!

エレキベア
大玉転がしのルールってそれぞれのチームで転がして競争する競技じゃなかったクマ?

マイケル
・・・・・・。

マイケル
「大玉押し合いバトル」のセルフプレイ学習を行います!!

エレキベア
(無理矢理変えたクマ・・・)

マイケル
よく考えたら大玉転がし人生で一度もやったことないよ!!

エレキベア
マジかよクマ・・・
エージェント学習スクリプトの作成

マイケル
それでは気を取り直して・・・
メインとなるエージェントの学習スクリプトを見ていきます!
メインとなるエージェントの学習スクリプトを見ていきます!

マイケル
スクリプト全体はこんな感じです!
観察値としては下記の12個の値を設定しています。
観察値としては下記の12個の値を設定しています。
↑観察値の設定

マイケル
設定値自体は各オブジェクトの位置、速度になっていますが、
一点、注意点としては相手と対面しているため、片方のエージェントは向きを考慮して反転させなければならないことです。
一点、注意点としては相手と対面しているため、片方のエージェントは向きを考慮して反転させなければならないことです。

エレキベア
なるほどクマ
反対側から見たら逆になるクマね
反対側から見たら逆になるクマね

マイケル
それとGetOffsetLocalPositionの部分については、複数の学習環境を並べて学習させたいために変換しています。
localPositionだと回転等考慮しないといけなかったので・・・。
localPositionだと回転等考慮しないといけなかったので・・・。

エレキベア
学習の効率化クマね

マイケル
行動については離散値を使用していて、
下記のように移動+何もしないの5種類を設定しています。
こちらも向きを反転させないといけない点には注意しましょう。
下記のように移動+何もしないの5種類を設定しています。
こちらも向きを反転させないといけない点には注意しましょう。
↑エージェントが取る行動

マイケル
報酬については基本的に外側から設定しますが、
ボールに向かっていくようエージェント内でも少し報酬を与えています。
最終的に1、-1に近づけないといけないため、あまり大きな報酬を与えないようにしましょう。
ボールに向かっていくようエージェント内でも少し報酬を与えています。
最終的に1、-1に近づけないといけないため、あまり大きな報酬を与えないようにしましょう。
↑ボールにあたると報酬を与える

エレキベア
ボールを押すと褒めてあげるクマね

マイケル
あとはこのスクリプトとBehavior Parameters、Decision Requesterコンポーネントを
各エージェントにアタッチして、下記のように設定します。
各エージェントにアタッチして、下記のように設定します。

マイケル
AgentIdとTeamIdを振り分ける点には注意しましょう!
以上でエージェントの設定は完了です!
以上でエージェントの設定は完了です!

エレキベア
こんな感じでグループ分けするクマね
ゲーム管理スクリプトの作成

マイケル
そして次はゲーム全体を管理するスクリプトを作成します。
こちらもこれまでとは異なる点ですが、ゲームが終了した時点で勝敗を判断し、
各エージェントに報酬を与えています。
こちらもこれまでとは異なる点ですが、ゲームが終了した時点で勝敗を判断し、
各エージェントに報酬を与えています。
↑ゲーム管理オブジェクト

エレキベア
エピソード終了処理も管理クラス側から呼び出すクマね
スコアエリアスクリプトの作成

マイケル
そして最後に各ゴールエリアに下記のスクリプトをアタッチしましょう!
winAgentIdには、そのエリアにボールを入れた際に勝利するエージェントのIDを指定します。
winAgentIdには、そのエリアにボールを入れた際に勝利するエージェントのIDを指定します。

エレキベア
ゴールに入れたらゲーム終了処理を呼び出すクマね

マイケル
以上でプロジェクトの設定は完了です!
訓練ファイルの作成

マイケル
次に学習させるための訓練ファイルを作成しましょう!
この時セルフプレイ学習特有のパラメータ(self_playの部分)を設定しなければなりません。
詳細は公式のドキュメントをご参照ください!
この時セルフプレイ学習特有のパラメータ(self_playの部分)を設定しなければなりません。
詳細は公式のドキュメントをご参照ください!
GitHub – Unity-Technologies
/
ml-agents
– Self-Play
↑訓練ファイルのパラメータ設定

マイケル
今回はこのような値に設定しました。
セルフプレイ学習は相手が変わっていくため、learning_rate_scheduleは上げていかずに常に一定(constant)にした方がよさそうです。
セルフプレイ学習は相手が変わっていくため、learning_rate_scheduleは上げていかずに常に一定(constant)にした方がよさそうです。

エレキベア
パラメータの内容も段々分かってきたクマね
強化学習実行

マイケル
準備が整ったところで学習実行します!
作成したyamlファイルを config/sample 配下に置いて、下記コマンドを実行します。
作成したyamlファイルを config/sample 配下に置いて、下記コマンドを実行します。

マイケル
熱戦を繰り広げていますね

エレキベア
シュールクマ・・・

マイケル
学習の進行具合をtensorboardで確認します。

マイケル
Self-playのELOの値が上がっていくのを確認できれば、
キリのいいところで学習終了させましょう!
キリのいいところで学習終了させましょう!

マイケル
ELOの値が思わしくない場合は、teamIdを振り分け忘れている等の可能性があるため、
設定を一度見直してみるといいかもしれません!
(自分は最初やらかしました)
設定を一度見直してみるといいかもしれません!
(自分は最初やらかしました)

エレキベア
やっちまったのクマね・・・
作成したモデルでの推論

マイケル
さてそれでは学習したAI同士で戦わせてみましょう!

エレキベア
どんな結果になったか楽しみクマ〜〜〜

マイケル
どうでしょうか!
割といい感じにバトルしているように見えます!
割といい感じにバトルしているように見えます!

エレキベア
少し挙動不審な感じもするクマが
お互い探り合ってる感じが面白いクマね
お互い探り合ってる感じが面白いクマね

マイケル
ちなみに僕も操作して戦ってみましたが、
割といい勝負でした・・・。
嬉しいような悲しいような・・・。
割といい勝負でした・・・。
嬉しいような悲しいような・・・。

エレキベア
衝突判定が甘いが故に難しくなってるクマね
AI相手に必死なのが面白いクマ〜〜
AI相手に必死なのが面白いクマ〜〜

マイケル
余裕だろと思ったら中々勝てなくてびっくりしたよ・・・。
おわりに

マイケル
それでは今回はここまで!
セルフプレイでの学習を行ってみたけどどうだったかな?
セルフプレイでの学習を行ってみたけどどうだったかな?

エレキベア
やっぱり生きてるみたいな動きしてくれると
見てて面白いクマね〜〜〜
見てて面白いクマね〜〜〜

マイケル
強化学習はこういうところが面白いね!
今回参考にさせていただいた書籍にはこれ以外の学習方法もたくさん載っているから、興味を持った方は是非読んでみてください!
今回参考にさせていただいた書籍にはこれ以外の学習方法もたくさん載っているから、興味を持った方は是非読んでみてください!
Unity ML-Agents 実践ゲームプログラミング v1.1対応版

マイケル
それから公式のサンプルも幅広く用意されているので、
こちらも触るとより理解が深まると思います!
こちらも触るとより理解が深まると思います!

エレキベア
多関節の学習も気になるクマ〜〜〜

マイケル
そんなこんなでML-Agentsの記事を2回続けて書いたけど、
今度はこの経験を踏まえてリバーシのAIも作ってみます!!
お楽しみに〜〜〜!!
今度はこの経験を踏まえてリバーシのAIも作ってみます!!
お楽しみに〜〜〜!!

エレキベア
やったるクマ〜〜〜〜
【Unity】ML-Agentsでセルフプレイの強化学習を行う【大玉押し合いバトル】〜完〜