Morikatron Engineer Blog

モリカトロン開発者ブログ

CEDEC2020 質疑応答

こんにちは、モリカトロンでプログラマをやっています。馬淵です。

先日発表させていただいたCEDEC2020ですが、講演時でのコメントやアンケートが届いたため、今回はそれらに寄せられた質疑応答を私が代表してここに書かせていただきます。

発表時のスライドは以下に投稿してあるので、適宜参照してください。講演時には紹介しきれなかった内容の追記もしてあります。また、講演後に補足という形でブログを投稿しているため、そちらも参照していただけるとより深く理解していただけるかと思います。

cedil.cesa.or.jp tech.morikatron.ai

3Dアクションゲームを攻略する

模倣学習(発表者:竹内,回答者:竹内)

Q1 . 報酬をもらったらそれ以上いい行動をしないのでは、と思ってしまうのですが、「よりよい報酬」というのをエージェントに教えてあげるのでしょうか?

一度報酬をもらっても、より良い行動を見つけるために敢えてランダムな行動を取る探索も一定の確率で行っています。ただし模倣学習の場合は探索する確率は通常の強化学習よりかなり低めの設定となっています。最終的にエージェントは将来に渡って得られるすべての報酬の和(正確には割引報酬和)を最大化するように方策を学習します。

Q2. どれくらいDeepなモデルを使ったんだろう

多層パーセプトロンに残差スキップ接続を適用したモデルを使用しています。詳しくはブログを御覧ください。

Q3. 先ほどの人のプレイ例では敵から攻撃を受けるシーンがあったと思うのですが、攻撃を受けたときやステージから落ちたときなどの負の報酬は設定していないのでしょうか?

負の報酬は初期に導入していたものの、コントロールが難しい(負の報酬が大きすぎるとそれを避けるが故に探索が進まなくなってしまう)と感じたため最終的には使用しませんでした。

敵からの攻撃を躱すような行動は適切に報酬が設定できたとしても学習が難しいという点を考慮して負の報酬は導入していません。また、ステージ落下に関しては、ステージから落ちると直近のチェックポイント地点にリスポーンしますが、リスポーンした地点の状態価値がリスポーン前の状態価値より低い(報酬が遠ざかる)ため、それが擬似的に負の報酬と同じ役割を果たしています。

Q4. ML-Agentsの利用はローカルなPCで計算させたのでしょうか?

会社にあるゲーミングPCで計算しました。 マシンスペックについては CEDEC の資料 P35 を参照してください。

(地形にハマりやすい点に関して)

Q5. 環境の大域的な特徴を入れていないからですかね

ステージが変わるごとに調節しなければ行けない項目が極力少なくなるように、地形などの情報を予め与えておくことはしていません。もう少しステージごとの特徴を入力に利用すればスムーズになる可能性はあります。

Q6. 地形にハマったりするのは、画像を入力にすれば改善するのかな

未検証ですが、改善される可能性はあるかと思います。

Q7. この計算コストでここまでうまく行くんですね

大規模な並列計算などは利用しておらず、NVIDIA 2080TiレベルのGPU1台あれば3~4日で到達出来ます。(実際に使用したマシンについてはブログをご参照ください。)

Q8. スムーズにプレイできていてすごいです。このようにプレイできるのは何回に1度ぐらいでしょうか?

最後のギミックを作動させボスまで到達するところまでは殆どのエピソードで再現できましたが、ボスを倒すところまで到達できたのは2割ぐらいのエピソードにとどまりました。

多くはボスとの戦闘中に膠着状態に陥ってしまったり、リスポーン後にボスから遠ざかってしまうような状態に陥ってしまいました。ブログでも考察していますが、ボスとの戦闘は不確定要素が多く、デモに存在しない状態に陥りやすいためうまく攻略が進まないためと考えられます。

Q9. レイキャストを使用しているために人間のプレイヤができないような操作が出現したりすることはあったのでしょうか?

操作については人間が同じ操作方法でデモを作成する必要がある以上、人間ができないような操作が出現することは無いかと思います。レイキャストによる情報についても、人間が画面を見て得られる範囲の情報(極端に遠くの物体の検出などは行わず)のみを利用しています。

Q10. 連続する移動する床をAIに解決させるには複数のレイキャスト、移動先の予知、移動元の予知などが必要かと思われますが、どういったアプローチでの解決を考えておりますでしょうか?

今回検証したステージでは移動先まで予測する必要が無い程度の難易度だったため、キャラクターから水平に全方位に30度ずつレイキャストを飛ばして検出していましたが、移動先の予知(つまり移動方向の区別)が必要な場合は過去の複数のフレームに渡るレイキャストの情報をひとまとめにしてエージェントに与える方法が考えられます。

またレイキャストを飛ばす方向に関しても床の方向に応じて角度をつけて飛ばすなどのアプローチが必要になってくる場合も考えられます。

デモ無し学習(発表者:本間,回答者:本間)

Q1. 攻撃方策は雑魚敵用とボス敵用と敵の種別ごとに学習させたほうが良かったりするのでしょうか?

攻撃方策は敵に応じて分けたほうが良いと思います。 状況に応じて直接的な行動を扱う下位方策を使い分けるというのが階層型強化学習の基本となる考え方だと思いますが、 敵との戦闘方法が大きく異なる場合はそれぞれ別の攻撃方策を学習して使い分けた方が良いと思います。

Q2. パス検索の目標地点はどうやって決めているんでしょう?あと、報酬は移動距離なのでしょうか?ナビゲーションメッシュをどうやって入力につかったのでしょうか?格子状の影響マップとかに変更するでしょうか?

目標座標の決定方法はスライド資料をご参照下さい。 座標値は通常小数点が含まれる連続値情報として扱いますが、今回利用した強化学習モデル「DQN」は離散値情報しか扱う事が出来ません。 そのためステージ全体を九分木で空間分割する事で(かなり強引に)目標座標を離散値として扱うようにしました。

Q3. アクションゲームの自動攻略ですが、移動する床を渡る方策、ボスの攻撃を避ける方策、ボスを攻撃する方策、 という風に細かく分ければ攻略できるようになるのでしょうか?

Q1と被りますが、細かく分けた方が攻略には近づくかと思います。 しかし現実的には方策を細かく分けて沢山用意するのは作業コスト的にあまりやりたくないですよね…。 時間の問題で講演では紹介しませんでしたが、事前に下位方策を用意せずステージ学習中に上位方策と下位方策を随時学習(オンライン学習)する階層方強化学習の手法もあります(階層型強化学習としてはこちらの手法が本来主流です)。 ゲーム攻略のために用意すべき下位方策があれよあれよと増えていき辛くなる前に、こちらの手法もご検討下さい。 ちなみに随時学習する階層型強化学習手法を扱わなかった理由は、「クリア出来れば多少ズルしてもOK」というゲーム開発を前提として学習の効率化をメインで扱いたかったというところがあります。 ステージクリアしたかったなぁ…。

格闘ゲームAI(発表者:馬淵,回答者:馬淵,岡島)

Q1. 自己対戦学習ではより強い相手を選ぶとのことでしたが、攻撃型と防御型で強さの基準は共通でしょうか?同じなら何を評価値にされたのでしょうか。

強さの基準は「100ラウンド内での報酬和が多い」ほど強いとしています。 報酬の与え方はスタイル毎に違っているので(詳しくは発表スライドの付録2-2をご参照ください)、攻撃型と防御型で強さの基準は違うと言えます。 自己対戦時は直近の100ラウンド内での報酬和を常に記録しておき、より報酬が得られるものを対戦者候補リストに追加しています。

Q2. NNの思考はどのぐらいのフレーム間隔で行われているのでしょうか?上位と下位で同じでしょうか?

下位方策は6フレーム、上位はその5倍の30フレームごとに判断するようにしています。つまり、上位方策は下位方策に5回行動を選択させたら、使う下位方策を 選択するようにしました。これは下位方策は短期的、上位方策はより長期的な戦略を学習できるようにするといった狙いがあります。

Q3.上位方策への入力ベクトルは、下位方策と同じでしょうか?

変えています。同じである必要はなく、下位方策は短期的、上位方策は長期的な戦略を見つけて欲しいため下位方策はHPや残り時間といった情報を入力していません。 格ゲーAIパートの補足ブログにより詳しい説明があるのでそちらをご参照ください。

Q4.WANNの利用は通常のNNの判断に、ランダム性を入れることで実現するモデルよりも自然に手加減ができるのでしょうか

今回の手加減の仕方は最終的に人間が設計しています。手加減自体は、softmax値の変更やQ値に乱数を加えてランダム性の高いモデルを作る方法でも出来ると思いますが、 WANNは人間からみて理解しやすいという利点があるため、人が後から「こういった行動をさせたい」という要求に対してより柔軟に対応でき、より人が考える自然な手加減に近づける ことができると思われます。

Q5.ハイパーパラメータの調整にはどれくらい時間がかかったでしょうか?

ハイパーパラメータの調整だけであれば、既存のCPUに対して安定的に勝てるようになるまで2週間程度かかりました。 今回はUE4との通信およびPythonを利用したOpenAI Gym風の環境整備と並行してハイパーパラメータを調整していたたため、 それらも含めつつ、人月で換算すると少し長く2人月程度かかっています。 また、CPU相手の学習結果が安定した後も、自己対戦用にパラメータをいくつか追加、調整をしながらの試行錯誤もしていました。

Q6.「AIの反応を遅らせる」、「下位方策の性能を落とす」、「上位方策の性能を落とす」の三つの手加減はルールベースで組み込まれていると思うのですが、扱いやすかった、あるいは調整が難しかったものはありましたでしょうか?

調整が難しかったのは下位方策の性能を変化させる手法です。

この手法では強さの異なる下位方策を切り替えることで性能を落とすため、事前に複数の下位方策を用意しなければなりません。 検証では下位方策にルールベースAIを使用したので、攻撃/防御のそれぞれに弱中強の3パターンを用意することになり、手間がかかりました。
(下位方策にニューラルネットを利用する場合でも、沢山ある学習途中のモデルからどれを選ぶのかを考える必要があるでしょう。)

扱いやすさについては、特筆するものはありません。 下位方策の用意を除いては、3つの手法全てであまり大きな苦労はありませんでした。

Q7.下位方策を再学習などでアップデートした場合、上位方策はどの程度再学習が必要となるのでしょうか?

学習環境が変わったら再学習が必要なように、下位方策が変わったら基本的には上位方策も再学習するべきなのは間違いないでしょう。 しかし、下位方策のアップデート前後でどの程度行動が変化するか次第ですが、あまり変化していないのあれば上位方策を再学習せずに使いまわしても問題はなさそうです。

AIに手加減させる方法として下位方策を切り替えるという事をしていますが、それでもだいたい正しく動作しておりますし、 私が実験した限りでも、下位方策の行動パターンがあまり変わらない範囲であれば問題はなさそうでした。

Q8.気絶等の特殊な状況はルールベースで作っても実用上は問題なさそうですか?

問題ないと思います。

「特定の条件下で特定の行動を取って欲しい」という要望はよくあると思いますが、そういう挙動を取るように学習させるのは困難ですし、 そこだけルールベースで記述してしまうのは実用的なテクニックだと思います。