Search Unity

Unity AI に関するブログシリーズ第 2 回となる本記事では、前回に引き続きコンテクスチュアルバンディット問題を完全な強化学習問題へ拡張する方法を解説します。その一環として、学習された Q 関数(特定の環境下における特定のアクション実行の長期的価値を予測するもの)によって行動するエージェントの使用方法を示したデモもご提供します。この例では、簡単なグリッドと Q 関数の表のみを使用します。幸運なことに、このベーシックなコンセプトがほぼ全てのゲームに当てはまります。Q 学習のデモは、こちらのリンクからお試しにいただけます。以下本文では、Q 学習の仕組みに関する詳細なウォークスルーをお届けします。

Q 学習アルゴリズム

コンテクスチュアルバンディットに関する前回のまとめ

強化学習を行う目的は、特定の環境内で、未来の報酬を最大化させるための行動を学習できるエージェントをトレーニングすることです。本シリーズ前回の記事では、この環境は比較的静的なものでした。前回の環境においては、状態とは単純に「3 つの部屋のうちどれにエージェントがいるか」、そしてアクションとは「その部屋の中のどの宝箱を開けるかの選択」でした。そしてアルゴリズムは、この状態とアクションの各組合せの Q 関数(Q(s, a))を学習するものでした。この Q 関数は、特定の状態下での特定のアクションの実行によって時間と共に獲得が予測される未来の報酬を表すものでした。この問題を「コンテクスチュアルバンディット」と呼びます。

強化学習問題

このコンテクスチュアルバンディットの例は、2 つの要素(疎な報酬状態の移行)が欠けているために、完全な強化学習問題たり得ませんでした。「疎な報酬」とは、エージェントが、実行する全てのアクションからは報酬を得られない状態です。この報酬は時として遅延する(実際は最適であるアクションを実行したとしても、一連の最適なアクションが実行されるまでは報酬が受け取れない)場合があります。つまり、エージェントが正しい経路を進行していたとしても、その途中の各ステップごとにではなく、経路の最後でしか報酬を受け取れない場合があるということです。これらのアクションのそれぞれは(実行直後には報酬が与えられなかったとしても)最終的な報酬の獲得に不可欠であった可能性があるということです。このため、貢献度分配を実行する(「過去に実行したアクションが、間接的であれ価値のあるものだった」ことをエージェントが学習できるようにする)ための方法が必要です。

前回のコンテクスチュアルバンディットに欠如していた 2 つ目の要素は状態間の遷移です。完全な強化学習問題にはこれが備わっています。状態間の遷移がある場合、アクションは、報酬関数 R(s, a) ⇨ r に基づいて報酬を生成するだけでなく、状態遷移関数 P(s, a) ⇨ s’ に基づいて新しい状態も生成します。具体的な例を挙げると、経路に沿って歩くエージェントは、その経路上を進む一歩ごとに、経路上の新しい場所(したがって新しい状態)に置かれます。ゆえにエージェントには、現在の潜在的報酬を最大化するための行動を学習させるだけでなく、それよりさらに大きな報酬をもたらすと分かっている状態に向かって遷移するための行動も学ばせる必要があります。

ベルマン更新

複雑性を高めるこれら 2 つの追加的要素は互いに関連性がないように思われますが、実際にはこれらは直接関連したものです。両方とも、エージェントが置かれる可能性のある未来の状態と、エージェントが受け取る可能性のある未来の報酬との関係を示すものです。少しの知識さえあれば、この関係性を利用して、これらの状況下で最適なアクションを取ることを学習することができます。つまり、「真の」 最適な Q 関数(実際には到達できない可能性のある理論上の関数)の下では、現在の状態とアクションの価値は「即時的報酬 r」+「そのアクションを実行することによってエージェントが次に置かれる状態における、将来的な最大予測報酬の割引」となります(以下参照)。

これはベルマン方程式と呼ばれ、以下のように記述することができます。

上記におけるγ(ガンマ)は割引率で、「エージェントに潜在的な未来の報酬をどの程度考慮させたいか」に関連します。γを 1.0 に設定すると、エージェントは全ての潜在的な未来の報酬を同等に考慮し、永久に続くトレーニングのエピソードにおいては、予測価値は無限に増加し得ます。このため、γは 0 より大きく 1 より小さい値に設定します。通常は 0.7 と 0.99 の間で設定されます。

ベルマン方程式は、Q 関数自体からブートストラッピングすることによって Q 関数を更新する方法を考える上で役立ちます。Q*(s, a) は最適な Q 関数を示しますが、現在の「次の状態の準最適な Q 値予測」も、現在の状態をより正確な方向に調整するために役立ち得ます。主にベースとなっているのは各ステップにおける真の報酬なので、Q 値予測自体が徐々に改善されることは確実です。ベルマン方程式を使用して、以下の通り新しい Q 学習の更新が作成できます。

これは前回のコンテクスチュアルバンディット更新アルゴリズムに類似していますが、Q ターゲットに「次のステップにおける未来の予測報酬の割引」が含まれている点において異なっています。

探索

エージェントが状態空間を適切に探索することを確実にするためには、Epsilon-Greedy(ε-グリーディー) と呼ばれる探索法を使用します。Epsilon-Greedy 法の使用方法は、イプシロン値 ϵ を 1.0 に設定し、エージェントがアクションを実行するたびにそれを少しずつ減少させるだけです。エージェントはアクションを選択する時、貪欲(グリーディー)なアクションである argmax(Q(s, a)) または、確率 ϵ を持つランダムなアクションのどちらかを選択します。直感的に理解できるのは、トレーニングの最初はエージェントの Q 値予測は非常に不正確な傾向にあるが、環境の学習が進み ϵ が減少する従って徐々に Q 関数が環境の真の Q 関数と一致してゆき、それを使用して実行するアクションが徐々に正確性を増していくということです。

Unity で作成した環境『Gridworld』

青いブロックはエージェント、赤いブロックは障害物、緑のブロックはゴールの位置を表します。緑と赤の球体は、GridWorld 内の各状態の予測価値を表しています。

Q 学習エージェントを実際にお見せするために、Unity で簡単な環境『GridWorld』を作成しました。この環境は次の 3 つの要素で構成されています ―[1]環境内にランダムに配置されたエージェント[2]ランダムに配置されたゴール位置(エージェントはゴール位置に向かって移動することを学習する)[3]ランダムに配置された障害物(エージェントはこれを回避することを学習する)。環境の状態 (s) は整数値で、グリッドの位置を表します。アクション (a) は 4 つ(上、下、左、右)あり、報酬 (r) は、ゴールがある状態に移動すると +1、障害物がある状態に移動すると -1、そして(エージェントがゴールに向かって迅速に移動することを促すために)ステップごとに -0.05 が与えられます。各エピソードは、100 ステップ完了後、またはエージェントがゴールあるいは障害物がある状態に移動した時に終了します。前回のチュートリアル同様、エージェントの Q 値は表を使用して保存されます。この表の行は状態を表し、列は可能なアクションを表します。この環境とエージェントのデモは、こちらからブラウザ上でプレイしていただけます。またこちらから、ご自分のゲーム用に修正可能な Unity プロジェクトのダウンロードも可能となっています。エージェントが環境を探索すると『GridWorld』環境内の各状態に色付きの球体が現れます。これは、その状態におけるエージェントの予測 Q 値の平均を表すものです。この球体は、エージェントが適切な方策を学習すると、開始点からゴールまでの直接の値の勾配として表示されます。

今後に向けて

ここでご紹介したエージェントと環境は、Q 学習問題では典型的な表形式になっています。このベーシックな環境は現代的なゲームとは掛け離れているのではとお考えの皆様も、ご心配には及びません。このアルゴリズムが 90 年代に公開されて以来、より幅広くダイナミックな状況で Q 学習の使用を可能にするための重要な開発が数多く行われて来ました。その最も重要なもののひとつは DeepMind 社の開発した Deep Q-Network であり、これは何十もの異なる ATARI ゲームを直接ピクセルからプレイすることを学習するために使用されました。これは、この例のようにルックアップテーブルのみを使用して行うのは不可能なことです。DeepMind 社はこれを実現するために、ディープニューラルネットワーク(DNN)によって制御されるエージェントを利用しました。ニューラルネットワークを使用することで、画面上のピクセルの新しい組み合わせなど、完全に未知の状態に適用可能な汎用 Q 関数の学習が可能となります。

今後、数週間にわたって、一式のアルゴリズムとサンプルプロジェクトを含むインターフェースを公開して参ります。これらは、今回と類似した深層強化学習エージェントのトレーニングを Unity ゲームやシミュレーションで行えるようにするものです。これらのツールでどんなことが可能かを、こちらの動画で簡単にご紹介しています。この初期リリースは限定的なものであり、主には研究、各業界、ゲーム QA テストに携わる方々に向けたものですが、私達は、モダンな深層学習の手法によるゲーム挙動の学習が拓く可能性に胸を高鳴らせています。この開発の発展とともに ML のゲームへの使用(複雑な NPC 挙動やゲームダイナミクスなどの制御)に対する関心が高まることを期待しています。深層学習のゲームへの使用はまだまだ始まったばかりです。Unity では今後も引き続き、皆様とともに、未来への歩みを進めていければと願っています。

15 replies on “Unity AI ― Q 学習を用いた強化学習”

Great initiative! I look forward to more posts in the future.

Are there any plans to integrate support for deep learning toolkits? I know the CNTK team is working on a C# wrapper. This could be a great possibility for Unity to be the first game engine to support next gen AI!

I’m not sure where you’re major errors are, but why would ML people be fixing bugs in other parts of Unity? You’re complaining in the wrong place mate ;)

Having a blast following this series thus far. I can’t wait until you guys get to explore AI that is trained to react appropriately in dynamic environments ( I guess I am just begging for NNs lol)

Thanks for these blog posts!

ML seems pretty scary from the outside, but the value is very apparent. The implementations you’ve published will be very helpful if we try to do something like this ourselves.

OpenAI is not a framework. If you mean OpenAI’s Gym (or Universe), their library of different training environments (games), it probably doesn’t make much sense for Unity as the environments use the games’ UI and only work with Python atm.

A* finds the optimal path if the graph is known (you can describe exactly each state). Q-Learning (and Reinforcement Learning in general) tries to find the optimal path under unknown circumstances (part of the algorithm is to discover possible states, and often there are so many combinations that you can’t learn all of them anyway) and in stochastic environments (action only leads to expected state with a certain probability). If you know the map of your country and want to navigate between cities, use A*. If you want to find the optimal order of steps (keystrokes) in a game, it’s impossible to describe the problem as something A* could solve. Remember that A* uses heuristics to determine the next action. In games, you typically don’t have any feedback (change in score) until much later, so you need to learn the “heuristic” over time, after playing the game over and over. You’re right that once you know all the states in the world (which you’d get if you played the game an infinite number of times), you can come up with a policy that tells you what’s the best action to take in each step, similar to A*’s policy of selecting the best (cost + heuristic) action. However, the whole process of learning the set of possible states and their costs is an integral part of Q-Learning, which A* doesn’t deal with.

Very nice.
Some of the equations could use still or animated visuals.

Cheers and looking forward to more on this series.

b

How about breaking down those equations a little more and explain them step by step.

My father always told me: “There are two types of smart people in this world: Those who want to help people, and those who want to impress people with their intelligence. I hope you are the first kind!”

I totally agree, you’ve practically summed up most of the coders/ mathematicians, no offense y’all… But when will everyone understand that math is a language, very bad language because not a lot of people understand it, and those who do are generally not very friendly to… the most (with this weird nose up in the air behavior) . What Unity need is more template kinda stuff, simplify the saving system, most stuff that you see in gaming, make a simple template version of it so people can further customize it in their own way… If something is more needed beyond that, that’s where the coding kicks in, and the big coders should be there to simplify it in general for the software, if there is a demand for it. I’m not talking about custom stuff that you buy, most of it is crap, you end up wasting your money…

Again, simplify, simplify, simplify or if you’re too cool and too smart for that, you might start losing your user base (or at least not get a new one, while somebody else take the simple approach). Make it possible for the biggest doofus to make a Battlefield type game if he wants, very simply. That should be your goal.

Comments are closed.