Help us understand the problem. What is going on with this article?

失敗からも学ぶ 強化学習 HERのアルゴリズムを理解して、OpenAI Gymの新しいロボットで試してみた

More than 1 year has passed since last update.

概要

OpenAI Gymが新しい環境Roboticsを公開したので(公式ブログ)試してみました。 また、その中でHER(Hindsight Experience Replay)で、良いパフォーマンスが出たそうなので、アルゴリズムを理解し、動かしてみました。

Picture1.gif

環境作り

Python3.5.2の環境で、OpenAI GymのインストールとMuJoCoとmujoco-pyのインストールが必要です。
MoJoCoを使うのはライセンスが必要ですが、一旦、無償版(30日間)を使いました。

MuJoCoのライセンス取得
MuJoCoとMuJoCo-pyのインストール方法(公式GitHub)
OpenAI Gymのインストール方法(公式GitHub)

環境の種類

今回、8つのRobotics環境が公開されました。
Fecthと呼ばれる、物を摘めるようなロボットと、ShadowHandという手の動きを再現しているロボットがあります。

それぞれの環境の目的は以下の通りです。

Screenshot 2018-03-01 14.13.18.png

HER(Hindsight Experience Replay)

考え方

私たち人間はボールを転がした時、もしも目的の場所に辿り着かなくても、
「今の感じで転がすとあの辺に行くのか。ということは...」
と、失敗してもその体験を次のチャレンジに活かします。

強化学習でも同じように、試行結果が失敗で報酬が無くても、その試行データを利用して目的の達成に役立てよう、という考えです。

image.png

特徴

通常の価値関数は「ある状態$s$である行動$a$をとる価値」を表しますが、HERでは「ゴール:$g$」というインプットを増やし、「あるゴール$g$に対し、ある状態$s$である行動$a$をとる価値」を価値関数として定めます。

一度試行してみて、本来のゴールとは違う場所に辿り着いたとしても、後からそこを擬似ゴールとみなして報酬$+1$を設定し、今しがた試行した軌跡は擬似ゴールに辿りつくための成功の軌跡とみなし、その軌跡情報から、価値関数を更新します。

このような(Roboticsのような)問題・環境では、各ゴール間の空間的な距離(各位置)は意味を持っているため、ゴールの位置がインプットになっている価値関数において、失敗による擬似ゴールでの価値関数の更新が有効利用されます。

アルゴリズム全体

準備

  • オフポリシーのアルゴリズム($Algorithm$)を選びます。(DQN等)
  • 擬似ゴールを設定する戦略($Storategy$)を定めます。
  • 報酬関数は $r:S \times A \times G \rightarrow R$ ($G$はゴール位置)

学習

1. バッファー$Re$を初期化
2. 以下を必要な回数分繰り返す
  2-1. 本当のゴール$g$と初期状態$s_0$を定める
  2-2. 以下を終末まで繰り返す
    2-2-1. $Algorithm$のポリシーからゴール$g$に対する状態$s_t$の時の$a_t$を決めて行動する
  2-3. 以下を2−2.の軌跡で繰り返す
    2-3−1. ($s_t, s_{t+1}, r_t, a_t, g$)を全て観測して$Re$に記録しておく
    2-3−2. 今回のエピソード2−2.の軌跡から$Storategy$に沿って、擬似ゴール$G$を決める
    2-3−3. 全ての擬似ゴール$g' \in G$において以下を繰り返す
     2-3−3−1. 擬似ゴールに対する報酬を$r'$として取得する
     2-3−3−2. ($s_t, s_{t+1}, r'_t, a_t, g'$)を全て観測して$Re$に記録しておく
  2-4. $Re$からミニバッチを取り出し、$Algorithm$のパラメータ更新を1エポック実施する。

$Storategy$の一番簡単なものは、エピソードの最後の位置を擬似ゴールにすることですが、エピソード内のその時点$t$より先の位置をランダムに複数選択すると、良い場合もあるようです。

Screenshot 2018-03-01 22.33.38.png

  • future : エピソード内の、現時点より先の位置を擬似ゴールとする
  • episode : エピソード内のランダム時点の位置を擬似ゴールとする
  • random : 別エピソードも含めて過去のランダムな時点の位置を擬似ゴールとする
  • final : エピソードの最後の時点の位置を擬似ゴールとする

Baselinesで試す

HERを試すため、OpenAIから出ているBaselinesを利用しました。(⬅︎ 手抜き)
Baselinesのインストール 公式
インストールでmpiのエラーが出たので、以下で対処。

brew install mpich
pip install mpi4py

学習

引数で環境の設定を好きなものに書き変えられます。
デフォルトはFetchReach-v0です。今回は変えませんでした。

python -m baselines.her.experiment.train

結果

分かりにくいですが、全部成功してます。

python -m baselines.her.experiment.play {生成されたpklファイルパス}

test.gif

bokeh_plot.gif

論文ではDDPGだけのものと比較していますが、HERありの方がパフォーマンスが良いのが分かります。

Screenshot 2018-03-01 20.30.30.png

実装して試す

一旦、流れだけ書きました。
ちゃんと書いたら、記事を更新します。

import gym
env = gym.make('FetchSlide-v0')
obs = env.reset()
done = False
R =[]
action_list = []
substitute_goal = None


while not done:
    # off-policyアルゴリズムの方策によって、Actionを決める
    action = policy(obs['observation'], obs['desired_goal'])
    next_obs, reward, done, info = env.step(action)
    # バッファに記録
    R.append((action, obs['observation'], next_obs['observation'],
              reward, obs['desired_goal']))
    # 擬似ゴール用の行動履歴
    action_list.append(action)
    if done:
        # 今辿り着いたところを擬似ゴールと設定
        substitute_goal = obs['achieved_goal']
    obs = next_obs

for replay_action in action_list:
    next_obs, reward, done, info = env.step(replay_action)
    # 擬似ゴールに対する報酬の取得
    substitute_reward = env.compute_reward(
        obs['achieved_goal'], substitute_goal, info)
    # バッファに記録
    R.append((replay_action, obs['observation'], next_obs['observation'],
              substitute_reward, substitute_goal))
    obs = next_obs

上記のようにバッファRに記録をしたら、Rからミニバッチを取得してアルゴリズムのパラメータ更新を行う。

参考

Hindsight Experience Replay 論文
Medium : Learning from mistakes with Hindsight Experience Replay
Qiita : 物理エンジンmujoco登録の仕方
Open AI Gym & MuJoCo を使う

おわり

3Dロボットカッコいいので、MuJoCoのライセンスを買おうかな、と思いました:blush:

記載に誤りがありましたら、ご指摘いただけたら嬉しいです。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away