Parking HER サンプル - 交通流の強化学習ツール highway-env
強化学習におけるOpenAI Gymを拡張させたツールに、交通流を扱うhighway-envがある。その解説ページにあるParking HERのサンプルについて説明する。
以下は2023/2時点での情報である。
計算手法と前処理
このサンプルでは切り捨て分位数クリティクス(TQC)という手法を使っている。
エージェントはSB3 Contribを使っている。残念ながらSB3は、2023/1の時点で最新のGymに対応していない。よってバージョンの調整が必要になる。以下はバージョン調整を入れた前処理である。
TQCはオフポリシー・アクター・クリティックという手法の一種である。オフポリシー・アクター・クリティックは、ロボットなどの連続値に対する学習で有効とされる手法である。アクターは行動する処理、クリティックは行動を批評する処理で、この2つが分かれている。アクター・クリティックは連続値のように行動選択が無数にあっても計算量が少ない。オフポリシーは両者の方策が別々になる事を示す。
TQCはクリティック側の過大評価バイアスを減らすために、複数のクリティックを使い分位数による切り捨てを行っている、との事である。論文はこのリンクから取得できる。2020年の比較的新しい論文である。
タイトルや引用元の説明にはHERと書いてあるが、これはTQCと似た手法である。TQCのライブラリはHERの処理を拡張して作られていると思われる。ソース内にはSACも使えるという記載がある。それぞれの論文はHERのリンクとSACのリンクから取得できる。HERは2017年、SACは2018年の論文である。
##### 修正点、全部バージョン調整 !pip install stable-baselines3 !pip install sb3-contrib !pip install 'highway_env==1.5.0' #!pip install git+https://github.com/DLR-RM/stable-baselines3 #!pip install 'gym==0.25.2' #!pip install 'highway_env==1.6.0' # Install environment and agent #!pip install highway-env # TODO: we use the bleeding edge version because the current stable version does not support the latest gym>=0.21 versions. Revert back to stable at the next SB3 release. #!pip install git+https://github.com/DLR-RM/stable-baselines3 #!pip install sb3-contrib # Environment import gym import highway_env # Agent from stable_baselines3 import HerReplayBuffer, SAC from sb3_contrib import TQC
上記の「修正点」は私がソースを修正した箇所である。このページに書いてあるソースは、上から順に実行すると2023/1時点のColabで動作するようになっている。
学習
以下の処理で学習を行う。環境は駐車場での駐車であり、ハンドルの切り方が連続値になると思われる。26分程度の計算時間が掛かる。
env = gym.make("parking-v0") her_kwargs = dict(n_sampled_goal=4, goal_selection_strategy='future', online_sampling=True, max_episode_length=100) # You can replace TQC with SAC agent model = TQC('MultiInputPolicy', env, replay_buffer_class=HerReplayBuffer, replay_buffer_kwargs=her_kwargs, verbose=1, buffer_size=int(1e6), learning_rate=1e-3, gamma=0.95, batch_size=1024, tau=0.05, policy_kwargs=dict(net_arch=[512, 512, 512])) model.learn(int(5e4))
動画準備
以下の処理で動画の準備を行う。何故かパスの指定に誤りがあり修正した。
!pip install gym pyvirtualdisplay !apt-get install -y xvfb python-opengl ffmpeg from IPython import display as ipythondisplay from pyvirtualdisplay import Display from gym.wrappers import RecordVideo from pathlib import Path import base64 from tqdm.notebook import trange display = Display(visible=0, size=(1400, 900)) display.start() def show_video(): html = [] for mp4 in Path("videos").glob("*.mp4"): ##### 修正点、パスが違う video_b64 = base64.b64encode(mp4.read_bytes()) html.append('''<video alt="{}" autoplay loop controls style="height: 400px;"> <source src="data:video/mp4;base64,{}" type="video/mp4" /> </video>'''.format(mp4, video_b64.decode('ascii'))) ipythondisplay.display(ipythondisplay.HTML(data="<br>".join(html)))
テスト結果
以下の処理でテスト結果を動画で確認できる。実行するごとに結果は変わる。最悪でも1度切り返せば停車できるようだ。ただ白線内にきっちり止まる訳ではない。
env = gym.make("parking-v0") env = RecordVideo(env, video_folder='./videos', episode_trigger=lambda e: True) env.unwrapped.set_record_video_wrapper(env) for episode in trange(3, desc="Test episodes"): obs, done = env.reset(), False while not done: action, _ = model.predict(obs, deterministic=True) obs, reward, done, info = env.step(action) env.close() show_video()
目次
Parking HER サンプル