Skip to content

Architecture

naoyuki-sakai edited this page Aug 24, 2017 · 35 revisions

アーキテクチャの概要

このサンプルプログラムは以下のモジュールで構成されています:

クラス図

アーキテクチャ全体の概要図はCacooで公開されているクラス図を参照してください。

クラス図

Unity

このレポジトリではUnityを学習環境に用います。Unityのシーン内のエージェントがHTTPのクライアントを持っておりそれがPythonスクリプトのサーバと接続し通信を行います。Unityから送信されるHTTPリクエストは以下の4パターンが存在します。

メソッド パス 動作
POST /create/:id :idという名前のエージェントを作成します。
POST /step/:id :idという名前のエージェントを1ステップ実行します。
POST /reset/:id :idという名前のエージェントのエピソードを終了します。
POST /flush/:id :idという名前のエージェントを初期化します。

Unityでは解くべき各課題がシーン別に実装されているためコードを改変する必要は原則としてありません。もし改変したい場合は以下に簡単に各要素の解説を列挙しますのでクラス図も併せて参考にしながら改変してください。※むやみなソースコードの改変を行った場合動作の保証及びサポートは致しかねますので予めご了承ください。

Agent

各シーンのEnvironmentオブジェクト内に含まれているAgentオブジェクトは以下の3つの要素を持っています。

  • AgentSensor sensor
  • AgentController controller
  • AgentBehaviour behaviour

AgentSensorはAgentに紐付けられているカメラから画像を取得します。初期状態では通常のRGBカメラと深さカメラの二つのカメラが紐付いています。

AgentControllerはAgentの動きを制御します。サーバから返却されたアクションの値に応じて"0": 右転回、"1": 左転回、"2": 直進、の三つの動作を行うのに加え、ManualOverrideオプションを有効にした場合は左右の矢印キーで左右に転回、上の矢印キーで直進させることができます。

AgentBehaviourにはAgentの振る舞いが定義されています。HTTPクライアントの実態を持ち、シーンが初期化される時にサーバにcreateのリクエストを送信します。以降は1フレーム毎に呼び出し中でなければstepリクエストを送り、サーバからアクションが返却されている場合にはそのアクションを元にAgentControllerを呼び出してAgentを動かします。

Task

各シーン毎のタスクを定義するためにTaskクラスを継承したクラスが実装されています。Taskのサブクラスは必ず

  • 現在のタスク名を返すName()
  • 次のシーン名を返すNext()
  • タスクの成功を判定するSuccess()
  • タスクの失敗を判定するFailure()
  • タスクの終了を判定するDone(int, int)

をオーバーライドする必要があります。

TaskはAgentをメンバ変数として持っており必要に応じて

  • 初期化をInitialize()で
  • 報酬との衝突時の処理をOnRewardCollision()で
  • 毎フレーム発行される負の報酬地をPunishment()で

定義できます。

Environment

Environmentではタスクの実行や分岐などを行います。Success()/Failure()メソッドの返り値を元に成功・失敗回数を保持しそれらの値をDone(int, int)に渡して真が返った場合にNext()で定義されたシーンに切り替えます。

Python

Cognitive

Cognitiveパッケージ内では認知アーキテクチャの各要素が定義されており、BriCAに対応したComponentを定義するmodule、WBRA定義ファイルに基いてエージェントを組み上げるinterpreter、組み上がったAgentに対して学習や実行などの動作を発行するserviceという三つに分割されています。

module の中には今回のWBRAで必要となる要素がBriCAのComponentとして定義されています。

  • VVCComponent
    • 腹側視覚野のモデル、内部にCNNを用いた特徴抽出器を持つ
  • BGComponent
    • 大脳基底核のモデル、内部にQ-Networkを持つ
  • UBComponent
    • 海馬のモデル、内部にExperienceクラスを持つ
    • Umataro Box (アトムの開発者で海馬の研究者でも合った天満午太郎より)
  • FLComponent
    • 前頭葉のモデル、アクションと報酬の制御を行う

また,上記のComponentに対して環境とインタラクションを行うための入出力Componentとして以下を定義しています.

  • RBComponent
    • RewardBoxの略。環境から得られた報酬をFLとBGに渡します。
  • V1Compnent
    • 視覚野にあたるComponent。環境から得られた画像(observation)をVCCに渡す。
  • MOComponent
    • MotorOutputの略。BGで選択されたactionをFLを通して環境に返す。

※RB, V1, MOComponentはクラスとしては定義していませんが、WBRAの定義ファイルに記述しています。

これらの結合などの定義はWBRAの定義ファイルに書かれており、interpreterに記述されたBriCA言語インタプリタを用いて実体化されます。

ML

認知アーキテクチャの要素の実装となる機械学習アルゴリズムが含まれています。

  • CnnFeatureExtractor
    • 特徴抽出用の学習済みCNN
  • QNet
    • 強化学習用の標準的なQ-Network
  • Experience
    • 実装すべき海馬の機能を持つ学習器

今回ハッカソン参加者の皆さまにはExperienceの実装を改変しUnity環境中のタスクに挑戦して頂きます。規定タスクはExperienceに海馬の様々な機能を実装することで解くことの出来るタスクセットとなっています。Experienceには

  • 現在の状態
  • 前ステップの状態
  • 現在の報酬値
  • 最後に行ったアクション
  • オドメトリ― (任意)

が渡されます。状態はRGBカメラと深さカメラの画像がそれぞれ一枚ずつ与えられます。

外部ライブラリ

CherryPy

HTTPサーバはCherryPyを用いて実装されています。Unityの項目で列挙されている4つのPOSTエンドポイントを実装しています。

BriCA V1

認知アーキテクチャの実行にはBriCA V1を用います。認知アーキテクチャをWBRAに基いて構成するためのラッパーとして用いています。