Search Unity

ML-Agents ツールキット(v0.4) の新しいバージョンがリリースされました。そのエキサイティングな新機能のひとつが、好奇心に基づく内発的報酬を使用してエージェントのトレーニングを行う機能です。

この機能については多くの説明が必要となるため、追加の記事をお届けすることにしました。この機能によって、(報酬が疎な場合に)エージェントにより効率的に環境を探索させるための動機付けが簡単に行えるようになりました。これは、「エージェントが自分自身に与える報酬」を使用して行われます。この報酬は、エージェントが自分自身の行動の結果に対してどの程度「驚いた」か(自身の行動がどの程度「目新しい」結果をもたらしたか)に応じて与えられます。本記事では、この新機能の仕組みを解説し、バニラな強化学習(Reinforcement Learning / RL)アルゴリズムでは解決が非常に困難なタスクを、この機能を使用して解決しやすくする方法をご紹介します。

好奇心駆動探索

強化学習においては、主要な学習信号は報酬(エージェントが決断を行う度にエージェントに提供されるスカラー値)という形で提供されます。この報酬は通常は環境自体によって提供され、環境の作成者によって設定されます。例えば目的地点への到達が +1.0、死亡が -1.0、などといった形で決められます。こういった報酬はエージェントの外から与えられるものなので、外発的な報酬(extrinsic reward)と考えることができます。外発的な報酬があるということは、内発的な報酬(intrinsic reward)もあるはずです。内発的報酬は環境から提供されるのではなく、特定の基準に沿ってエージェント自体によって生成されます。もちろん、内発的報酬であればどんなものでも良いという訳ではなく、最終的に何かしらの役に立つものである必要があります。例えば、その内発的報酬を得たエージェントが、さらに大きな外発的報酬を得るべく挙動を変えたり、より能動的に世界を探索するようになるなどです。人間(およびその他の哺乳類)の場合、このような内発的報酬はしばしば「内発的動機付け」(intrinsic motivation)と呼ばれ、私たちの運動主体感(feelings of agency)と密接に関係しています。

強化学習の分野においては、自然界のエージェントの動機付けと同じような動機付けをエージェントに与える良いシステムを開発するために、非常に多くの研究が成されて来ました。一般的なアプローチのひとつは、エージェントに好奇心を与え、それが自身の周囲の世界に対してどの程度「驚いた」(目新しさを認識した)かに応じてエージェントに報酬を与えるというものです。赤ん坊が世界について学ぶ時、その子は何か特定の目的のために学習しているというよりは、経験自体に目新しさを見い出すゆえに遊び、探索しています。つまり、子供は好奇心を持っていると言うことができます。好奇心駆動探索の考え方とは、このような動機付けをエージェントに組み込むということです。「目新しい」状態の達成によって報酬を得られたエージェントは、より多くの「目新しい」状態を見つけるべく、環境探索の方法を学習して行きます。その過程で、上手くいけば外発的報酬(迷路の奥にあるゴール地点や、まばらにある資源など)も見つけることができます。

今回実装したアプローチは、昨年カリフォルニア大学バークレー校の博士課程学生である Deepak Pathak 氏らによって公開された論文で紹介されたものです。これは「Curiosity-driven Exploration by Self-supervised Prediction」(自己教師あり学習による予測を用いた好奇心駆動探索)と呼ばれています。(論文はこちらでお読みいただけます。)著者はこの論文中で、「好奇心」を導入するという考え方を分かり易く説明した上で、2 つの別々のニューラルネットワーク(順モデルと逆モデル)をトレーニングすることを提唱しています。逆モデルのニューラルネットワークはエージェントの受け取った現在および次の観測を取得してその両方を同一のエンコーダーでエンコードし、その結果を使って 2 つの観測の間に取られた行動を見積るようにトレーニングされます。その後に順モデルのニューラルネットワークが、エンコード済の現在の観測および行動を取得してエンコード済の次の観測を見積るようにトレーニングされます。そして、見積りのエンコード結果と実際のエンコード結果の差が内発的報酬として使用され、エージェントに与えられます。この差が大きいほど「驚き」(目新しさ)が大きくなり、したがって内発的報酬も大きくなります。

これら 2 つのモデルを併用することで、報酬は、「目新しい物事」を単純に全てキャッチするのではなく、エージェントがその行動によって作用を及ぼすことのできる「目新しい物事」のみをキャッチするようになります。このアプローチを用いると、一切の外発的報酬を使用せずに、純粋に内発的報酬のみによってエージェントをトレーニングしてスーパーマリオブラザーズを進行することができます。以下の図はこのプロセスを簡易的に示したものです。

この図は Intrinsic Curiosity Module(内発的好奇心モジュール)の仕組みを表したものです。白いボックスは入力、青いボックスはニューラルネットワークのレイヤーと出力、青い実線はネットワーク内のアクティベーションの流れ、緑の点線は差分計算のための比較、緑のボックスは内発的報酬の計算を表します。

サンプル環境「Pyramids」

好奇心を導入したテストは、普通の環境では行えません。ML-Agents ツールキット v0.3 のサンプル環境のほとんどは報酬が比較的密なので、好奇心などの探索強化の方法を用いてもあまり効果が見られません。このため、新しい要素である好奇心のテストを行えるように、「Pyramids」という報酬の疎な環境を新たに作成しました。この環境には報酬がひとつしか含まれておらず、エージェントはランダムな探索ではめったにそれを見つけることはできません。「Pyramids」に含まれるエージェントは、過去に公開されたいくつかの環境でお馴染みの青いキューブ形です。このエージェントは前進・後退、右折・左折ができ、キューブの前面から発せられるレイキャストによって周囲の世界を「見る」ことができます。

レイキャスト(ここでは分かりやすいように黒線で表示)を使用して周囲を観測するエージェント

このエージェントが、9 つの部屋を含む閉鎖されたスペースに入れられています。このうち 1 つの部屋にはランダムに配置されたスイッチがあり、その他の部屋にはランダムに配置された動かせない石のピラミッドがあります。エージェントがスイッチに(衝突することで)インタラクトすると、スイッチは赤から緑に変わります。この色の変化と共に、動かせる茶色いブロックのピラミッドが 1 つ、多数ある部屋のうちの 1 つにランダムに生成されます。このピラミッドの頂上には黄金のブロックが 1 つ載っています。エージェントがこのブロックに衝突すると +2 の外発的報酬を得ます。チャレンジ要素は、新しい部屋に移動したりスイッチを切り替えたりタワーを崩したりしても即座に得られる報酬はないことです。エージェントはこの一連の流れを、一切の中間的補助なしで学習しなければなりません。

Proximal Policy Optimization(近接方策最適化 / PPO)と好奇心を併用してトレーニングされたエージェントが、スイッチとのインタラクト後にピラミッドに向かって移動しています。

バニラな Proximal Policy Optimization(近接方策最適化 / PPO)(ML-Agents のデフォルトの強化学習アルゴリズム) でトレーニングされたエージェントはこのタスクを効率的に遂行できず、200,000 ステップ後でも偶然(平均報酬 -1)より高い結果を出せないことがしばしばあります。

これに対し、PPO と好奇心駆動の内発的報酬を併用してトレーニングしたエージェントの場合、常に 200,000 ステップ以内で解決できるばかりでなく、その半分の時間で解決できることも少なくありません。

 

PPO と好奇心でトレーニングされたエージェント(青)と PPO のみでトレーニングされたエージェント(赤)の、外発的報酬の累計獲得量の経時変化(それぞれ 5 回実行した平均)

また、内発的報酬信号のみを使ってトレーニングしたエージェントについてもテストしました。この場合、タスクの解決は学習しませんが、外発的報酬信号のみの場合に学習された方策(1 つの部屋の中で小さな円を描くように動く)よりも面白い方策(複数の部屋を移動する)を学習します。

PPO と好奇心を併用しよう

ご自分の環境内でも、好奇心を使用したエージェントのトレーニングは簡単に行えます。まず、最新のML-Agents ツールキットを入手し、トレーニングしたいブレインのハイパーパラメーターファイルに「use_curiosity: true」というラインを追加してください。後は通常の手順でトレーニングを行っていただけます。TensorBoard をお使いの場合は、いくつかのメトリックがトラッキングされていることにお気付きになると思います。これには、順モデルの損失および逆モデルの損失や、エピソードごとの内発的報酬の累積などが含まれます。

エージェントに好奇心を与えても、全ての状況で有益な訳ではありません。例えば「Crawler」や「Walker」のように環境に密な報酬機能が既に含まれていて、ゼロ以外の報酬がほとんどのアクション後に与えられる場合は、大きな改善は見られません。環境の報酬が疎な場合には、内発的報酬を追加することで元は解決不可能だったタスクが(強化学習によって)簡単に解決可能になる可能性があります。特に、報酬が「勝ち / 負け」や「クリア / 失敗」などのように単純な場合に適しています。

好奇心に関連した機能をお使いの方は、ぜひご意見・ご感想をお聞かせください。GitHub の「Issues」のページで、または Eメール(ml-agents@unity3d.com)で、皆様のフィードバックをお待ちしています。それでは、楽しいトレーニングを!

17 コメント

コメントの配信登録

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

  1. You left out the most interesting part: how do you calculate the “surprise” level ? Is it done automatically by the toolkit ? Else, what parameters are taken in account?

    1. Arthur Juliani

      7月 4, 2018 11:01 am

      Hi Manu,

      Here is the paragraph in the post where this is mentioned:

      We chose to implement one specific such approach from a recent paper released last year by Deepak Pathak and his colleagues at Berkeley. It is called Curiosity-driven Exploration by Self-supervised Prediction, and you can read the paper here if you are interested in the full details. In the paper, the authors formulate the idea of curiosity in a clever and generalizable way. They propose to train two separate neural-networks: a forward and an inverse model. The inverse model is trained to take the current and next observation received by the agent, encode them both using a single encoder, and use the result to predict the action that was taken between the occurrence of the two observations. The forward model is then trained to take the encoded current observation and action and predict the encoded next observation. The difference between the predicted and real encodings is then used as the intrinsic reward, and fed to the agent. Bigger difference means bigger surprise, which in turn means bigger intrinsic reward.

      1. Yes, I had read that. My interrogation is how the current observation is calculated so that we can make a difference between 2 of these ?
        My guess is that we should hand-code the parameters needed to calculate it depending on our environment (eg: agent x,y,z location or the room number the agent is in), but my guesses in AI aren’t very good… :-p

  2. Marc Lambert

    7月 1, 2018 4:57 pm

    Great staff ! I would want to port Udacity self driving car simulation (imitation learning with nvidia CNN) on your framework. Concerning imitation learning, what sort of neural network are you using ? Regarding the PPO python script, it seem you use only full connected network, am I right ?

    1. Arthur Juliani

      7月 3, 2018 3:27 pm

      Hi Marc,

      The training code we provide adapts itself to the observation space of the brains you set-up in your scene. If you have a brain with visual (camera) observations, then we will use a CNN. If it is only vector observations, then fully-connected layers. If it is both, then we will process each in its own “stream” and them combine them.

  3. Alvin Zhang

    6月 28, 2018 9:04 am

    How to treat the self-motivation intrinsic reward? In my opinion, can it be treated as multiple task learning? Because a different rewards defines a different task. Here, external rewards is for getting blocks and intrinsic rewards is for navigate to a different room. To this point, it has some kind of flavor of meta learning or option discovery in hierarchical RL. While, from the perspective of reward shaping, it’s kind of related to inverse RL. It’s true the method is good and workig, but I think we lack of the systematic mind about how to solve the task. Even we don’t know where should we attribute this problems to, because of the tremendous coined terms. I do hate this.

    1. Arthur Juliani

      7月 3, 2018 3:30 pm

      Hi Alvin,

      Thanks for your discussion. There are a number of ways to think about it. For me at least, I think about us driving the policy of the agent through “policy space” along a vector that is the combination of the extrinsic and intrinsic reward signals. The extrinsic reward pushes the policy in a direction that maximized cumulative extrinsic reward, which the intrinsic signal pushed the policy in a space where the result’s of the agent’s actions are more difficult to predict.

  4. Can’t wait to see a model that modulate between exploitation (extrinsic reward) and exploration base on evolving environment (when extrinsec reward decrease or the agent is in a kind of satiate state (boredom)). Also I would like to see experiment that minimize the effort taken toward the reward (basically reward lazyness/efficiency, ie same outcome with less actions) a lot of NN ai have noisy movements or actions.

    1. Arthur Juliani

      7月 3, 2018 3:32 pm

      Hi Kharil,

      Thanks for the comments. These are interesting ideas! One thing our RL-trained agents actually attempt to optimize for is “entropy regularized reward,” which doesn’t quite equate to a laziness signal, but something similar. It encourages the agent to learn a policy that maximized reward, while also being least committed to any single action. It turns out this formulation helps a lot for learning, since the agents can more quickly adapt to new situations, and give up bad behaviors for newer better ones.

  5. Cool to see Pathak et al.’s intrinsic curiosity work being applied to new tasks. I was curious to see how it could be used in other environments that weren’t in the paper. Nice work!

  6. well, this one looks very promising. I will definitely try this feature next weekend (when I have enough time for the hobby projects)
    Also, I am wondering about how we can set up an environment where multiple agents (maybe even with different brains) communicates about their current states and next actions.
    For example:
    Agent A : “Hey I am going to jump over that wall.”
    Agent B : “Cool, Agent A go ahead and jump.”
    Agent C : “Nah, I have been there, there is no reward behind that wall, Don’t waste your time.”
    Agent A : “Oh, okay then, I will go somewhere else”:

    1. Something similar seems to have been used by Open AI recently : https://blog.openai.com/openai-five/
      In the video they talk about some “team_spirit” hyperparameter that was used so that the agents do not act in a selfish manner.

      1. Thank you Mad, I am aware of openai-five but somehow I missed that team-spirit hyperparameter part. I will pay close attention to that part. Thank you again.

    2. Arthur Juliani

      7月 3, 2018 3:34 pm

      Hi Emre,

      Multi-agent communication is definitely something we are looking at. In fact, there have already been researchers who have done similar things to your ideas in their work. I think there are a lot of potentially cool applications these kinds of agents can have in games.

      1. I can’t wait to see what you are going to create about multi-agent communication. I tried to create agents that aware of what other agents are observing, but that wasn’t enough.
        Do you have any guess about when we can get this type of integration?

  7. xavier mucuta

    6月 26, 2018 2:33 pm

    preciso enteder a programação podes me ajudar ?

  8. xavier mucuta

    6月 26, 2018 2:28 pm

    preciso de ajuda ajuda para comesar a programar.