Tensorforce 基本 : イントロダクション & Getting Started (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 04/24/2020 (0.5.4)
* 本ページは、Tensorforce : Basics の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
基本 : イントロダクション& Getting Started
Tensorforce はオープンソースの深層強化学習フレームワークで、研究と実践におけるアプリケーションのためのモジュール化された柔軟なライブラリ設計と簡単な使い勝手を重視しています。Tensorforce は Google の TensorFlow フレームワーク version 2.0 (!) の上に構築されていて Python 3 と互換です (Python 2 サポートは version 0.5 でドロップされました)。
Tensorforce は高位設計選択のセットに従います、これは他の類似のライブラリから差別化します :
- モジュール式コンポーネントベースの設計: とりわけ、特徴実装はできる限り一般的に適用可能で構成可能であることを目標にしています、紹介するペーパーの詳細を忠実に似せるためにある程度のコストを潜在的に払いながら。
- RL アルゴリズムとアプリケーションの分離: アルゴリズムは入力 (状態/観測) と出力 (アクション/決定)、更にアプリケーション環境との相互作用のタイプと構造に不可知論者です。
- Full-on TensorFlow モデル: アプリケーション・プログラミング言語とは無関係に可搬な計算グラフを可能にし、そしてモデルの配備を容易にするため、制御フローを含む、強化学習ロジック全体は TensorFlow で実装されています。
Getting started
環境を初期化する
Environment.create(…) インターフェイスを通して環境を初期化することが推奨されます。
from tensorforce.environments import Environment
例えば、OpenAI CartPole 環境は次のように初期化できます :
environment = Environment.create( environment='gym', level='CartPole', max_episode_timesteps=500 )
Gym の事前定義されたバージョンもまたアクセス可能です :
environment = Environment.create(environment='gym', level='CartPole-v1')
代わりに、環境は config ファイルとして指定できます :
{ "environment": "gym", "level": "CartPole" }
環境 config ファイルはそれらのファイルパスを渡すことによりロードできます :
environment = Environment.create( environment='environment.json', max_episode_timesteps=500 )
カスタム Gym 環境が同じ方法で利用できますが、それに応じてインポートされて登録される対応するクラスを必要とします。
最後に、Tensorforce の Environment インターフェイスを使用してカスタム環境を実装することが可能です :
class CustomEnvironment(Environment): def __init__(self): super().__init__() def states(self): return dict(type='float', shape=(8,)) def actions(self): return dict(type='int', num_values=4) # Optional, should only be defined if environment has a natural maximum # episode length def max_episode_timesteps(self): return super().max_episode_timesteps() # Optional def close(self): super().close() def reset(self): state = np.random.random(size=(8,)) return state def execute(self, actions): assert 0 <= actions.item() <= 3 next_state = np.random.random(size=(8,)) terminal = np.random.random() < 0.5 reward = np.random.random() return next_state, terminal, reward
カスタム環境実装はそれらのモジュールパスを渡すことによりロードできます :
environment = Environment.create( environment='custom_env.CustomEnvironment', max_episode_timesteps=10 )
環境により指定されない限りは (or 評価のためでなければ) Environment.create(...) の max_episode_timesteps 引数を指定することが強く推奨されます、何故ならばそうでなければより多くのエージェント・パラメータが指定を必要とするかもしれないからです。
エージェントを初期化する
環境と同様に、Agent.create(...) インターフェイスを通してエージェントを初期化することが推奨されます。
from tensorforce.agents import Agent
例えば、一般的な Tensorforce エージェント は次のように初期化できます :
agent = Agent.create( agent='tensorforce', environment=environment, update=64, objective='policy_gradient', reward_estimation=dict(horizon=20) )
他の事前定義エージェント・クラスも代わりに使用できます、例えば、Proximal Policy Optimization :
agent = Agent.create( agent='ppo', environment=environment, batch_size=10, learning_rate=1e-3 )
代わりに、エージェントは config ファイルとして定義できます :
{ "agent": "tensorforce", "update": 64, "objective": "policy_gradient", "reward_estimation": { "horizon": 20 } }
エージェント config ファイルはそれらのファイルパスを渡すことによりロードできます :
agent = Agent.create(agent='agent.json', environment=environment)
Agent.create(...) の environment 引数として Environment.create(...) により返される environment オブジェクトを渡すことが推奨されます、その結果 states, actions and max_episode_timesteps 引数はそれに従って自動的に指定されます。
訓練と評価
訓練と評価のためには Runner ユティリティのような実行ユティリティを利用することが推奨されます、これはある範囲の configuration オプションを供給します :
from tensorforce.execution import Runner
訓練と続く評価から成る基本的な実験は数行のコードで書かれます :
runner = Runner( agent='agent.json', environment=dict(environment='gym', level='CartPole'), max_episode_timesteps=500 ) runner.run(num_episodes=200) runner.run(num_episodes=100, evaluation=True) runner.close()
実行ユティリティはエージェント-環境の相互作用を正しく処理する面倒を見ます、そして可能なところではこのように使用されるべきです。代わりに、エージェント-環境相互作用に渡るより詳細な制御が必要である場合には、単純な訓練と評価ループが次のように書けます :
# Create agent and environment environment = Environment.create( environment='environment.json', max_episode_timesteps=500 ) agent = Agent.create(agent='agent.json', environment=environment) # Train for 200 episodes for _ in range(200): states = environment.reset() terminal = False while not terminal: actions = agent.act(states=states) states, terminal, reward = environment.execute(actions=actions) agent.observe(terminal=terminal, reward=reward) # Evaluate for 100 episodes sum_rewards = 0.0 for _ in range(100): states = environment.reset() internals = agent.initial_internals() terminal = False while not terminal: actions, internals = agent.act(states=states, internals=internals, evaluation=True) states, terminal, reward = environment.execute(actions=actions) sum_rewards += reward print('Mean episode reward:', sum_rewards / 100) # Close agent and environment agent.close() environment.close()
以上