Unity を検索

ML-Agents を使用してエージェントを 7 倍速くトレーニングしよう

2019年11月11日 カテゴリ: Engine & platform | 13 分 で読めます
取り上げているトピック
シェア

Is this article helpful for you?

Thank you for your feedback!

ML-Agents の v0.9 および v0.10 では、トレーニング時間の短縮を目的として、一連の機能(機能名は Asynchronous Environments(非同期環境)、Generative Adversarial Imitation Learning(敵対的模倣学習:GAIL)、および Soft Actor-Critic(SAC))を取り入れました。弊社のパートナーの JamCity によって ML-Agents の v0.8 で取り入れた並列 Unity インスタンス機能を以前の記事でご紹介しましたが、この機能を使うことでバブルシューターゲーム『Snoopy Pop』で単一のインスタンスを使うよりエージェントのトレーニングを 7.5 倍速く行えるようになりました。本記事では、これらの結果に基づいて v0.9 および v0.10 がどのように開発されたかを説明します。また、『Snoopy Pop』のトレーニング時間をさらに 7 倍短縮できることを示し、より高性能なエージェントが効率的な時間内でトレーニングできるようしました。

Unity ML-Agents Toolkit の目的は、ゲームデベロッパーが深層強化学習(DRL)を使用してプレイアブルおよび非プレイアブルキャラクターの両方の挙動を開発できるようにすることです。DRL は物理演算ベースのキャラクターからパズルゲームまで、さまざまな挙動を学習することに使用できる一般的ツールです。しかし、DRL が効果的な挙動を学習するには大量のゲームプレイデータが必要です。実際のゲームについては、スピードアップの程度において通常の速度に制限しなければならないという問題があります。

数か月前、ML-Agents v0.8 のリリースにより単一のマシンでゲームの複数 Unity インスタンスを実行する ML-Agents の能力を取り入れ、トレーニング中に収集できるトレーニングサンプル(すなわちエージェントの観測、アクション、報酬)のスループットを劇的に向上させました。私たちは JamCity と提携して『Snoopy Pop』のパズルゲームのステージをエージェントにプレイさせるトレーニングを行いました。v0.8 の並列環境の機能を使用すると『Snoopy Pop』の難易度の高いステージでエージェントのトレーニングを従来より 7.5 倍速く行えるようになりました。

ただし、並列環境では限界があります。単一のマシンで実行できる同時 Unity インスタンス数には制限があるのです。リソースに制限があるマシンでトレーニング時間を改善するには、別の方法を見つける必要がありました。概して、トレーニング時間を改善するには 2 通りの方法があります。一つは、秒当たりの収集されるサンプル数を増加させる(サンプルスループット)、もう一つは、良い挙動を学習するのに必要なサンプル数を減らす(サンプル効率)の 2 つです。最終的に v0.9 では、非同期的にサンプルを収集するように並列トレーナーを改善したことで、サンプルスループットを増加させました。

さらに、Generative Adversarial Imitation Learning(GAIL)を追加しました。GAIL は人間のデモンストレーションを用いて学習プロセスを導くことができるので、サンプル効率を改善します。v0.10 では、ついに v0.8 の Proximal Policy Optimization(近接方策最適化 / PPO)トレーナーよりかなり高いサンプル効率のトレーナー、Soft Actor-Critic(SAC)も取り入れました。これらの変更により単一のマシンでトレーニング時間がさらに 7 倍速く行えるように改良されました。つまり、『Snoopy Pop』では、ステージを解決するエージェントを作成するだけでなく、人間のプレイヤーと同じステップ数でステージを解決するエージェントを作成することが可能です。サンプルスループットおよび効率が高まるに伴って、以前はマシンのクラスターで数日間のトレーニングが必要でしたが、単一のマシンで『Snoopy Pop』の多数のステージをトレーニングすることが可能になりました。本記事では、ML-Agents について後続の各バージョンで行われた改良、およびそれらが『Snoopy Pop』の結果にどのように影響を及ぼしたかについて詳しく説明していきます。

ML-Agents Toolkit +『Snoopy Pop』

弊社の ML-Agents v0.8 の記事で初めて ML-Agents を取り入れた『Snoopy Pop』を紹介しました。下記の図は、エージェントが見えるもの、実行できること、そして受け取った報酬をまとめたものを示しています。『Snoopy Pop』を活用した以前の実験と比較すると、正の報酬の大きさを減らし、バブルの使用に対する罰を増やしたことで、単純にステージを終えるのではなく、人間のプレイヤーと同じようにできるだけ少ないステップ数でバブルをクリアすることにエージェントを集中させるようにしました。これはどうにかステージを解決することよりもはるかに難しい問題であり、良い方策を学習するまでに非常に時間がかかります。

図:『Snoopy Pop』用に定義された観測、アクション、および報酬

ML-Agents 0.8:『Snoopy Pop』の複数の同時インスタンスを実行する

ML-Agents v0.8 では、複数の Unity インスタンス機能を同時にトレーニングできる機能を取り入れました。『Snoopy Pop』の単一のインスタンスをどこまでスピードアップさせられるかには限度がありますが、マルチコアプロセッサーを使用すれば、複数のインスタンスを単一のマシンで実行できます。このゲームでは 1 回 1 回のプレイスルーが独立しているので、トレーニングデータの収集を自明に並行処理化することが可能です。

各シミュレーション環境は共通の学習バッファにデータをフィードします。学習バッファはトレーナーがその方策を更新して、ゲームをより上手にプレイできるよう学習するために使用されます。この新しいパラダイムによって、時間スケールやその他のゲームのパラメーターを変更してゲームプレイの仕組みに悪い影響を与える必要がなくなり、かつ、従来よりはるかに多くのデータを収集できるようになりました。

ML-Agents v0.9: 非同期環境と模倣学習

ML-Agents v0.9 では、サンプル効率サンプルスループットにそれぞれ 2 つの改善が取り入れられました。

非同期環境

v0.8 の並列環境の実装では、各 Unity インスタンスは他のインスタンスと同期してステップ実行し、トレーナーはすべての観測情報を受け取りすべてのアクションを同時に送ります。ML-Agents ツールキットに含まれるような環境では、エージェントがほぼ同じ頻度で意思決定を行い、足並みをそろえて実行することは問題ではありません。しかし、実際のゲームでは、特定のアクションは他のアクションより時間がかかる場合があります。例えば、『Snoopy Pop』では、多数のバブルをクリアすると、1 つもクリアしないときより長いアニメーションが発生します。また、ゲームを解決しステージをリセットすると、バブルを狙い撃つことよりもはるかに時間が長くかかります。つまり、並列環境の 1 つでもこれらの長いアクションを行ったら、他のアクションはステップが完了するのを待たなければなりません。

ML-Agents v0.9 では、並列環境のステッピングが非同期的に行われるようにしました。数ある環境のうち 1 つでもアクションの実行を完了したら、トレーナーは新しいアクションを送り次のステップに進みます。ステップ時間が異なる環境では、これは大幅にサンプルスループットを向上することができます。

敵対的模倣学習(Generative Adversarial Imitation Learning:GAIL)

通常の深層強化学習(DRL)トレーニングプロセスにおいて、エージェントはランダムな行動により初期化され、環境でランダムなアクションを実行し、その結果として、報酬が発生する場合があります。そしてより高い報酬を得られる行動を強化し、時間経過とともに挙動は環境での報酬を最大化するものに収束していき、ランダム性も低くなっていきます。

ただし、ランダムな挙動を取らせているうちに最適な挙動が簡単に見つかる場合ばかりではありません。たとえば、報酬がスパースな場合は、エージェントは報酬を得るまでに正しい挙動を取り続けなければならなくなります。また、環境に局所最適解(local optima)が多数あり、エージェントが最大報酬を得られる解のように見えて、実はそうではない解に嵌ってしまう場合もあります。これらの問題は両方とも力任せなランダム検索で解決することも可能ですが、そのためには多数のサンプルが必要になります。『Snoopy Pop』でこれを行うと学習に数百万のサンプルに必要になりますし、それだけのサンプルを入力しても最適な挙動が見つからない場合もあります。

しかし、ゲームでの人間のデモンストレーションをエージェントに模倣させることによって、エージェントを良い挙動に導くことにより少し良い結果を出せるとしたらどうでしょう?この研究分野は模倣学習と呼ばれ、ML-Agents v0.3 に追加されました。ML-Agents でサポートしている模倣学習の欠点の一つは、強化学習とは別にしか使えないことでした。模倣学習はデモンストレーションだけでエージェントをトレーニングしますが、環境からの報酬はありません。

v0.9 では、Jonathan Ho 氏と彼の同僚によるリサーチに基づいて、これらの課題の両方に対処する GAIL を取り入れました。アルゴリズムの詳細については、彼らの論文をお読みください。

ML-Agents に追加された模倣学習を使うには、最初に人間のプレイヤー(または、ボット)にゲームを数回プレイさせて、デモンストレーションファイルに観測情報とアクションを保存します。トレーニング中、エージェントはいつものように環境で動作し、エージェント自体の観測情報を集めることができます。おおまかに言えば、GAIL は第二のアルゴリズム(ニューラルネットワークを用いて実装された識別器)をトレーニングして、特定の観測(必要に応じて、アクションも含む)がエージェントによるものか、デモンストレーションに由来するものかを分類することで動作します。そのためエージェントは収集する観測ごとに、エージェントの観測およびアクションがどの程度デモンストレーションのものに近いか評価され、その評価に基づいて報酬を与えられます。エージェントはこの報酬を最大化する方法を学習します。識別器はエージェントの新しい観測によって更新され、識別精度を向上させます。この学習の繰り返しによって、識別器の識別能力が高まっていきます。しかし学習を長く続けていると、エージェントは識別器を「だます」ことに長けるようになり、デモンストレーションを模倣する精度ばかりを高めるようになっていきます。

GAIL はエージェントに報酬を与えるだけで、学習プロセスを変更しないまま、ゲーム自体で得られる GAIL の報酬を単に加重合計することによって、GAIL を報酬ベースの DRL と組み合わせることができます。ゲームの報酬の大きさが GAIL で得られる報酬よりも大きいことが保証されているなら、エージェントは大きな環境報酬を見つけることができるまで、ゲームで人間のプレイヤーのパスをたどるように動機付けされます。

図:敵対的模倣学習(Generative Adversarial Imitation Learning)

ML-Agents v0.10: Soft Actor-Critic

最初のリリース以降、ML-Agents Toolkit は、学習を安定化させる、柔軟な DRL アルゴリズムの Proximal Policy Optimization(近接方策最適化 / PPO)を使用していました。v0.10 では、実際のゲームでのトレーニングをスピードアップするために Tuomas Haarnoja 氏と彼の同僚の研究「Soft Actor Critic—Deep Reinforcement Learning with Real-World Robots」をベースに第二の DRL アルゴリズムである SAC をリリースしました。もともと実際のロボットで学習するために作成された SAC の重要な機能の 1 つはサンプル効率です。ゲームについて考えると、これは長時間ゲームを実行する必要なく良い方策を学習することができるということです。

DRL アルゴリズムは、2 つのカテゴリ(方策オン型・方策オフ型)に分類されます。PPO などの方策オン型アルゴリズムでは、サンプル数を収集し、それらに基づく方策を改善する方法を学習した後、それに応じて方策を更新します。現在の方策を使用してサンプルを収集することによって、方策自体を改善する方法を学習し、報酬につながるアクションを実行する確率を高め、報酬につながらないアクションの実行を減らすことができます。たとえば PPO のような、ほとんど最新の方策オン型アルゴリズムでは、価値評価(エージェントが特定のステートにあると仮定して、エピソードの終わりまでの報酬について予想される割引合計)あるいは、Q 関数(特定のステートで指定したアクションが実行された場合の報酬について予想される割引合計)など評価関数の一形態としても学習します。方策オン型のアルゴリズムにおいて、これらの評価は現在の方策が実行されると仮定して一連の報酬を予測します。詳細は省略しますが、この報酬予測はアルゴリズムのトレーニングをより安定させるのに役立ちます。

SAC などの方策オフ型のアルゴリズムは、少し違った動作をします。環境のダイナミクスおよび報酬関数が修正されたと仮定すると、指定されたステートで特定のアクションを実行することと、累積報酬(すなわち最良の方策は何を得ることができるか?)を得ることの間に最適な関係が存在します。この関係を知っていたら、効率的な方策を学習するのは本当に簡単だと思います!現在の方策がどれくらい優れているかを学習するのではなく、方策オフ型のアルゴリズムでは、すべての方策でこの最適な評価関数を学習します。これは方策オン型のケースよりも学習が難しい問題があり、実際の関数は非常に複雑になります。しかし、あなたはグローバル関数を学習しているため、最初から収集したすべてのサンプルを使用し評価者の学習に役立てることができます。また、方策オフ型のアルゴリズムを方策オン型のアルゴリズムよりもサンプル効率をはるかに向上させることができます。この古いサンプルの再利用は Experience Replay と呼ばれ、すべてのサンプルは、ゲームで収集された全データについて、数百(数千とまではいかなくとも)ものゲームに相当するデータの保存が可能な大規模な Experience Replay バッファに蓄積されます。

私たちのツールキットでは、ML-Agents ですでにお使いいただけるすべての機能(再帰型ニューラルネットワーク(メモリ)ブランチ離散アクション好奇心、GAILなど)をサポートするために、継続的なアクション移動タスクを実行するように設計されたもともとの SAC アルゴリズムを採用しました。

図:方策オフ型 DRL アルゴリズムと方策オン型 DRL アルゴリズムの比較

『Snoopy Pop』でのパフォーマンス結果

私たちの以前の実験では、『Snoopy Pop』の難易度の高いステージ(ステージ 25)について、単一の環境(すなわち、ML-Agents v0.7 の環境)から、単一マシン上の 16 個の並列環境に移行したことで、7.5 倍の速度向上に相当するトレーニング時間の短縮が見られました。つまり、単一のマシンを用いてステージ 25 の基本的な解法を 9 時間以内に見つけることができたのです。この機能を用いて、さらにステージ 25 を習得するようにエージェントをトレーニング(すなわち、ステージ 25 を人間並みのパフォーマンスで解決できるようにトレーニング)しました。これは、単にステージを解決するよりもかなり長い時間(平均で約 33 時間)を要します。

ここでは、1000 ステップの間にエージェントが人間の平均的なプレイヤーのパフォーマンスに到達(人間のプレイヤーが使うバブルの数と同じかそれ未満のバブルを使ってステージを解決)した場合、エージェントがステージを「習得した」と宣言します。ステージ 25 の場合、人間のプレイヤーによる 21 回のプレイの平均から、この値は 25.14 ステップ(=バブルの発射)と計算されました。

次に、v0.9 および v0.10 から一つ一つの改善について追加的にテストを行い、そのステージで人間のパフォーマンスを超えるまでにかかる時間を測定しました。全体として、ステージを習得することに、さらに 7 倍のスピードアップを実現しました。トレーニング時間は実行するたびに異なる可能性があるため、表に示す各値は 3 回の実行における平均時間をとったものです。幸運にも、エージェントがすぐに良い解法を見つけられるときもあるでしょう。すべての実行は、トレーニングを K80 GPU で高速に行うことができる 16 コアのマシンで行われました。トレーニング中、16 個のインスタンスを並行して実行しました。

GAIL の実験では、結果をトレーニングするためのデモンストレーションとして、『Snoopy Pop』の 21 回の人間のプレイスルーを使用しました。ステージ 25 のバブルの色はランダムに生成されるため、21 回のプレイスルーがステージのすべてのボードの設定を網羅するようなことは決してありません。もしそうだとしたら、エージェントはプレイヤーの挙動を記憶しコピーすることで非常に速く学習するでしょう。次に、GAIL の報酬信号を『Snoopy Pop』のゲームによって提供される信号と合わせ、GAIL でプロセスの初期段階でエージェントの学習をリードして、かつ、あとの段階でエージェントが独自の解法を見つけられるようにします。

並列環境 (v0.8)非同期環境(v0.9)PPO を用いた GAIL(v0.9)SAC(v0.10)SAC を用いた GAIL (v0.10)
人間のパフォーマンスに到達するまでの時間

(時間)

34:0331:0823:185:584:44
サンプルスループット(サンプル/秒)10.8314.8114.5115.0415.28

下記のグラフ形式でスピードアップを視覚化しましょう。非同期環境を使用することによって、サンプルスループットが増加し、アルゴリズムに変更を加えることなくトレーニング時間の短縮をもたらすことがわかります。しかし、トレーニング時間の大幅な短縮は、トレーニングのサンプル効率の改善によるものです。サンプルスループットは、ML-Agent v0.9 および v0.10 の間で大きな変化を示さなかったことにご注意ください。デモンストレーションを追加し、トレーニングを導くために GAIL を使用すると、エージェントは同じトレーニング行動に到達するために使用するサンプル数は 26% 減少し、トレーニング時間にも同程度の短縮が見られました。方策オフ型アルゴリズムの Soft Actor-Critic に切り替えると、エージェントはバニラな PPO より 81% 少ないサンプルでステージを解決し、GAIL を SAC に加えることでさらなる改善が認められました。

これらの改善は、新しい報酬関数および人間のパフォーマンスにたどり着くという目標だけに有効というわけではありません。以前の実験で行ったように、単純にステージを解決する課題に SAC+GAIL を使用すると、以前は 8 時間 24 分かかっていたところ、1 時間 11 分で解決できるようになりました。

次のステップ

この機械学習とゲーム開発が交差するエキサイティングなフィールドで仕事をしたいとお考えの方は、現在複数のポジションで採用中ですので、是非ご応募ください!

本リリースにおいて提供される機能をお使いになったあなたからのご報告をお待ちしております。Unity ML-Agents Toolkit に関するフィードバックについては、以下のアンケートにご記入ください。また、電子メールにてお気軽にお問い合わせください。問題やご質問がある場合は、ML-Agents GitHub の issues ページに是非ご報告ください。

2019年11月11日 カテゴリ: Engine & platform | 13 分 で読めます

Is this article helpful for you?

Thank you for your feedback!

取り上げているトピック