Search Unity

ゲームの開発は、ゲームコンセプトやロジックの設定、アセットやアニメーションの構築、NPC 挙動の設定、難易度やバランスの調整、そして最後には実際のプレイヤーによる公開前のゲームのテストなど、様々な難しいステップを含むクリエイティブなプロセスです。私達は、このクリエイティブなプロセスの全体にわたって機械学習を使用が可能であると考えています。本記事は、これらの難しいステップのひとつである「NPC 挙動の設定」に焦点を絞ってお届けします。

従来のゲーム開発では、NPC の挙動はスクリプトとビヘイビアツリーを使用してハードコードされます。これらの規則の(往々にして長い)リストが NPC の周囲の環境に関する情報(「観測」)を処理し、その NPC の次のアクションを決定します。ゲームが進化するに従って、こうした規則の記述や維持は時間の掛かる作業になります。強化学習は、NPC 挙動を定義する際に、この代替となる頼もしいフレームワークを提供します。具体的には、観測の定義からアクションのマッピングまでを手動で行う代わりに、NPC が目標のゴールに達する度に報酬を与えることで NPC をトレーニングすることが可能となります。

「良い子犬・悪い子犬」のメソッド

強化学習による NPC のトレーニングは、子犬に(木の棒などを投げて持って帰って来させる)「持ってこい遊び」の訓練をするのと大変似ています。子犬にご褒美を見せてから棒を投げます。子犬は最初は何をすれば良いか分らずその辺を歩き回りますが、そのうちに棒を拾って帰って来て、その後すぐにご褒美をもらいます。何度か繰り返すうちに、子犬は棒を拾って来るのがご褒美をもらうための最善の方法であることを学習し、これを継続して行うようになります。

NPC 挙動のトレーニングにおいて強化学習が機能する仕組みもこれと全く同じです。NPC がタスクを正しく完了するたびに報酬を与えます。NPC は、(犬が「持ってこい遊び」を何度も繰り返すように)ゲームのシミュレーションを何度も繰り返すことで、報酬を最大化するために各状況において行うべきアクションに関する内部的なモデルを構築します。これにより意図した通りの理想的な挙動が作り出されます。このため、NPC の各観測ごとに低水準のアクションを作成・維持する代わりに、タスクが正しく完了された際に高水準の報酬を与えるだけで、NPC は適切な低水準の挙動を学習します。

コギーのプッポ

私達は、このテクニックがいかに効率的かをお見せするために、デモゲーム『Puppo, The Corgi』を作成し、これを Unite Berlin で発表しました。これは可愛い子犬と「持ってこい遊び」をするモバイルゲームです。画面をスワイプしてプッポに向かって棒を投げると、プッポがそれを拾って帰って来ます。高水準のゲームロジックには従来のスクリプト記述が用いられていますが、コギーは強化学習によって歩き・走り・ジャンプ・棒拾いを学習するようになっています。アニメーションやスクリプト記述された挙動を使用する代わりに、コギーの動きは強化学習によってのみトレーニングされます。このコギーはとびきり可愛いだけでなく、モーションが物理エンジンのみで実現されています。このため例えば、コギーのモーションは周囲のリジッドボディからの影響を受けることができます。

プッポは Unite Berlin で非常に好評で、多くのデベロッパーの皆様から、どのように作成したのかという質問がありました。そこで、本記事を執筆し、皆様にお試しいただけるようにプロジェクトをリリースすることにしました。

 

プロジェクトをダウンロード

 

以下の項では、まず始めに、基本的な概念についてと、コギーのトレーニングを行うに当たって事前に必要な作業についてご説明します。次に、私達が実際にトレーニングを行った際の体験をお話しして、最後に、プッポを主人公にした本ゲームをどのような手順で作成したかをご紹介します。

事前の作業

詳しい解説に入る前に、強化学習に関わるいくつかの概念をご説明しましょう。強化学習の目的とは、エージェントのための方策の学習です。エージェントとは、環境とインタラクトするエンティティ(実体)を指します。学習の各ステップにおいて、エージェントは環境の状態に関する観測を収集し、アクションを実行し、そのアクションに対する報酬を得ます。エージェントがその認識する観測に基づいてどのようなアクションを取るかは、方策によって決定されます。方策は、エージェントが適切に行動した時に報酬を与えることで、進化させていくことができます。

本デモゲームにおいては、ゲームのシーンが環境、プッポがエージェントとなります。プッポは「持ってこい遊び」ができるようになるために方策を学習しなければなりません。実際の犬に棒を拾って来させる訓練をする時にご褒美を与えるように、プッポの場合も適切に報酬を与えることで訓練(トレーニング)を行うことができます。

プッポの作成にはラグドールを使用しており、脚は JointMotor で動かしています。このため、プッポがターゲットに到達できるようになるためには、まず JointMotor をどのように回転させるかを学習して移動できるようになる必要があります。


本物の犬は、視覚その他の感覚を使って、自分の体の向きを変えたりどこに行くか決定したりします。プッポもこれと同じ方法論に基づいて機能します。プッポは次に取るアクションを決定するために、ターゲットへの近さ、ターゲットと自分との相対的な位置関係、自分の脚の角度など、シーンに関する観測を収集します。プッポの場合のアクションとは、動くために JointMotor をどう回転させるかを指します。

プッポが何かひとつアクションを実行する度に、このエージェント(プッポ)に報酬が与えられます。報酬は以下のように構成されています。

  • Orientation Bonus: プッポがターゲットに向かって動いている時に報酬を与えます。これは Vector3.Dot() メソッドを使用して行っています。
  • Time Penalty: ひとつのアクションごとに一定のペナルティ(負の報酬)をプッポに与えます。これによりプッポは、大きなタイムペナルティを回避するために出来るだけ速く棒を拾うことを学習します。
  • Rotation Penalty: プッポが回転し過ぎた時にペナルティを与えます。本物の犬なら回転し過ぎれば目が回ってしまいます。本物のように見えるようにするため、プッポが速く回転し過ぎた場合にペナルティを与えます。
  • Getting to the target Reward: これは最も重要です ― プッポがターゲットに到達したら報酬を与えます。

プッポのトレーニング

プッポの学習開始の準備が整いました。効率的にターゲットに向かって走ることをこのワンちゃんに学習させるのに、ノートパソコンで 2 時間掛かりました。トレーニングのプロセスの中で、私達は面白い挙動を発見しました。プッポは 1 分間ほどですぐに歩けるようになりました。さらにトレーニングを続けるうちに走ることを覚えました。そしてその後すぐ、走りながら急に曲がろうとした時にひっくり返るという動きをし始めました。そして幸運なことにプッポは、本物の犬と同じように起き上がることも学習できました。この不器用な感じの挙動はとても可愛いので、この時点でトレーニングを止めてそのままゲームに使っても良いくらいです。

 

プッポのトレーニングをしてみたい方は、プロジェクト内のインストラクションに従ってください。これにはトレーニングの詳細なセットアップ手順と、選択すべきパラメータ―に関する説明が含まれています。エージェントのトレーニング方法を詳しく説明したチュートリアルは、ML-Agents のドキュメンテーションでご覧いただけます。

プッポを使ったゲームの作成

ゲーム『Puppo, The Corgi』を作成するためには、プレイヤーがトレーニング済みモデルとインタラクトできるようにするゲームロジックを定義する必要がありました。プッポはターゲットに向かって走ることを学習しているので、ゲーム内でプッポのターゲットを変えるロジックを実装する必要があります。

ゲームモードで、プレイヤーが棒を投げた直後に棒をターゲットに設定します。プッポが棒に到達したらターゲットをシーン内のプレイヤーの位置に変更し、プッポが棒を咥えてプレイヤーの所に戻るようにします。このようにするのは、ゲームフローのロジックはスクリプトで定義しつつ、プッポはターゲットに向かって移動するようにトレーニングするほうが遥かに簡単だからです。私達は、機械学習と一般的なゲーム開発方法とを組み合わせることで両方のアプローチの優れた点を活かすことができると考えています。『Puppo, The Corgi』プロジェクトには事前にトレーニングされたコギーのモデルが含まれており、これはすぐに使えてモバイルデバイスへのデプロイもできるようになっています。

今後に向けて

以上、ML-Agents Toolkit のゲーム開発への使用によってどんな事が実現可能か、本記事によって少しでもお伝えできたなら嬉しく思います。

このプロジェクトのコードを詳しく見てみたいですか?本プロジェクトはリリース済みで、こちらからダウンロード可能となっています。ML-Agents Toolkit の使い方に関する詳細は Unity の公式ドキュメンテーションおよびステップバイステップのビギナーズガイドをご覧ください。強化学習の背後にある数学やアルゴリズムや理論をより深く学びたい方は、Udacity との提携のもと提供している深層強化学習ナノ学位をご利用ください。

ML-Agents Toolkit をゲームで使用された皆様の体験・ご感想をぜひお聞かせください。Unity の GitHub の Issues のページ または メールにて、お気軽にご連絡ください。

ハッピー・クリエイティング!

10 コメント

コメントの配信登録

コメント受付を終了しました。

  1. Is the code for machine learning models behind Puppo written in Python or any other language?

    Thanks,
    https://honingds.com

  2. online data science course

    11月 13, 2018 11:22 am

    Interesting article, thanks for the same. To summarize, data science and machine learning can be used to define game logic and mimic the actions of real world players.

  3. 재미있고 머신러닝에 대한 이해를 쉽게 해주는 그런 내용인 것 같습니다. 번역되어 올라오는 글들은 모두 챙겨보고 있는데… 새로운 기술들을 이해하는데 많은 도움이 됩니다. 감사합니다.

  4. Thank you very much for the blog which is translated and re-posted in Korean. I would highly appreciate that the quality of translation is getting better and better. In addition, this posting includes a transliteration note (about rigidbody) not found in the original English text, which seems to be helpful for beginners. I think that the direction of Korean translation has been set up properly. I look forward to seeing progress continuously.

  5. It is good to know about how these works are done by defining a correct reward.
    Hope to read more posts like this one.

  6. I got very interested in this so I downloaded the pack and have tried to compile with the latest version of Unity and Unity Editor (2018.2.11f1) Followed all instructions in the attached pdf but the editor actually crashes and shuts down. Anyone else who had this issue and solved it? Also tried to compile a standalone both Windows PC version and WebGL but it does not seem to work completely.

    1. Sorry to hear that it didn’t work for you. We will attempt to reproduce this issue on our end. In the meantime, would you please post an issue on the ML-Agents GithHub page or send an email to ML-Agents@unity3d.com so we can connect and help resolve?

      1. Is there a logfile or something that I could send together with the report?

  7. Interesting topic depicted in a cute way is a key in education of young audience. Good work.

  8. Terry Scrimsher

    10月 2, 2018 10:33 pm

    I remember seeing @punchesbears work on this on a live stream a few months back.