LoginSignup
36
27

自作中のシンプルな分散強化学習フレームワークの紹介

Last updated at Posted at 2022-05-03

今までいろいろな強化学習アルゴリズムを実装してきましたが、以下の問題を毎回感じていました。

  1. アルゴリズム毎に環境と学習のための実装が必要
     (gym等は環境側のインタフェースまでは提供されているが、学習を含めた実装は提供されていない)
  2. アルゴリズムの学習フローがそもそも複雑になりやすい(デバッグしづらい)
  3. 分散学習まで考えるとなお大変
  4. アルゴリズムと環境が分離しきれず結構依存する
    1. Atariの画像の前処理とその入力に依存したニューラルネットワークの設計
    2. アクションが離散値と連続値の場合によるアルゴリズム側の違い
    3. よくある数フレーム入力やフレームスキップ、実行できないアクション等を加味した場合の変更
    4. 学習フローの差異(AlphaZeroやモデルベース強化学習など)
  5. ログや可視化等の作成

既存のフレームワークを試したりしましたが自作アルゴリズムを作ろうとした場合、フレームワークの理解から勉強が必要になりかなりハードルが高いような気がしました。
そこでなるべくハードルが低くなるようなフレームワークを自作しようと思い作成しました。

このフレームワークの特徴は以下です。

  1. カスタマイズ可能な環境の提供
  2. カスタマイズ可能な強化学習アルゴリズムの提供
  3. 環境とアルゴリズム間のインタフェースの自動調整
  4. 分散強化学習のサポート
  5. 有名な強化学習アルゴリズムの提供
  6. (新しいアルゴリズムへの対応)

本記事はフレームワークの説明をすると共に実装しているアルゴリズムも説明していこうかと思います。
各項目については別記事にして少しずつ作成する予定です。

Github

各項目

1.インストール

Github からの pip install を想定しています。(PyPIへの登録予定は今のところありません)
また、ダウンロードだけでも使えます。詳細はGitHubを見てください。

インストールする一例は以下です。

git clone https://github.com/pocokhc/simple_distributed_rl.git
cd simple_distributed_rl
pip install .

2.使い方

import numpy as np
import srl

# ---  1. 使うアルゴリズムをimport
from srl.algorithms import ql

def main():

    # --- 2. 各configを設定
    env_config = srl.EnvConfig("Grid")  # 環境config
    rl_config = ql.Config()     # アルゴリズムconfig

    # --- 3. Runnerを作成
    runner = srl.Runner(env_config, rl_config)

    # --- 4. 学習
    if True:
        # 逐次学習の場合
        runner.train(timeout=20)
    else:
        # 分散学習の場合
        runner.train_mp(timeout=20)
    
    # 評価
    rewards = runner.evaluate(max_episodes=10)
    print(f"10回テストした結果の平均報酬: {np.mean(rewards)}")

    # 可視化
    # Terminal上で1エピソードを見る
    runner.render_terminal()

    # 1エピソードをアニメーション化('opencv-python','pillow','matplotlib','pygame'が別途必要)
    runner.animation_save_gif("_Grid.gif")

if __name__ == '__main__':
    main()

  • アニメーション

Grid.gif

  • Terminal上での結果
10回テストした結果の平均報酬: 0.7960000045597553
### 0, action 3, rewards [0.], next 0
env   None
work0 None
......
.   G.
. . X.
.P   .
......


   : 0.10151
   : 0.07913
   : 0.02751
*  : 0.36339

### 1, action 3, rewards [-0.04], next 0
env   {}
work0 {}
......
.   G.
.P. X.
.    .
......


   : 0.17283
   : 0.11623
   : 0.17698
*  : 0.48977

### 2, action 2, rewards [-0.04], next 0
env   {}
work0 {}
......
.P  G.
. . X.
.    .
......


   : 0.23222
   : 0.18907
*  : 0.61112
   : 0.24942

### 3, action 2, rewards [-0.04], next 0
env   {}
work0 {}
......
. P G.
. . X.
.    .
......


   : 0.25572
   : 0.31604
*  : 0.76530
   : 0.32385

### 4, action 2, rewards [-0.04], next 0
env   {}
work0 {}
......
.  PG.
. . X.
.    .
......


   : 0.32941
   : 0.26414
*  : 0.92709
   : 0.44327

### 5, action 2, rewards [-0.04], next 0
env   {}
work0 {}
......
.  PG.
. . X.
.    .
......


   : 0.32941
   : 0.26414
*  : 0.92709
   : 0.44327

### 6, action 2, rewards [1.], done(env), next 0
env   {}
work0 {}
......
.   P.
. . X.
.    .
......

おわりに

少しずつ開発しているので温かく見守っていただければ幸いです。

36
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
27