강화 학습에 의한 2족 보행의 획득 Part2<기존의 구현으로 학습>
이번에 하고 싶은 일
지난번 강화 학습에 의한 2족 보행의 획득 Part1<환경 구축편>에서 AI Gym의 roboschool에서 강화 학습을 실시하기 위한 환경을 구축했습니다.
이번에는 그 환경에서 stable baseline에서 구현된 강화 학습 기법 PPO를 이용하여 2족 보행을 학습해 보겠습니다.
강화 학습 기법 PPO란?
PPO은 2017년 OPEN AI에서 발표된 강화 학습 기법입니다. 그리고 OPEN AI가 공개하고 있는 baselines 과 그것을 포크해 작성된 stable baseline 에 구현이 포함되어 있습니다.
PPO는 선행 연구의 TRPO을 개량한 것으로 되어 있습니다. TRPO는 방책이 급격하게 변화하지 않도록, 방책 전후의 KL 다이버전스를 일정치 이하로 억제한다는 궁리를 하고 있어, 로봇 제어 등으로 좋은 성능이 나타났습니다. 단지 방안의 KL 다이버전스의 비교를 실시하기 위한 실장이 복잡해진다는 문제점이 있었기 때문에, PPO에서는 대신 방책의 전후의 비율이 일정치 이상이면 규정치로 클리핑함으로써 실장을 간략화해 있습니다.
자세한 내용은 【논문】Proximal Policy Optimization Algorithms (PPO, 2017) 등을 참조하십시오.
실행 스크립트
실행 스크립트는 다음과 같습니다.
실장이 끝난 모델을 사용하는 것으로 학습 부분이 불과 3행으로 쓸 수 버립니다.
학습과 평가(학습 끝난 모델에 의한 시뮬레이션)를 하고 싶을 때는 변수 train과 validation을 True로 합니다. 혹은 평가만 하고 싶을 때는 train은 False, validation은 True로 합니다.
학습 시간 단계는 learn_timesteps에서 설정합니다.
학습을 실행하면 스크립트 바로 아래에 "./stable_baselines/RoboschoolHumanoid-v1/"디렉토리가 작성되어 그 안에 학습된 모델 "ppo2_model.pkl"과 tensorboard용 로그의 "tensorboard_log/"가 작성됩니다.
평가하면 시뮬레이션 결과의 동영상이 "video/openaigym.video.**.video000000.mp4"로 저장됩니다. ※**는 적당한 수치가 들어갑니다
PPO2.pyimport numpy as np
import gym, roboschool
import os
import time
from datetime import datetime
from OpenGL import GLU
from stable_baselines.common.policies import MlpPolicy
from stable_baselines.common import set_global_seeds
from stable_baselines.common.vec_env import DummyVecEnv, SubprocVecEnv
from stable_baselines.results_plotter import load_results, ts2xy
from stable_baselines import PPO2
# tensorflow gpu 設定
#import tensorflow as tf
#tf.Session(config=tf.ConfigProto(device_count = {'GPU': 2}))
def make_env(env_name, rank, seed=0):
"""
Utility function for multiprocessed env.
:param env_name: (str) the environment ID
:param rank: (int) index of the subprocess
:param seed: (int) the inital seed for RNG
"""
def _init():
env = gym.make(env_name)
env.seed(seed + rank)
return env
set_global_seeds(seed)
return _init
# 学習設定
train = True # 学習をするかどうか
validation = True # 学習結果を使って評価をするかどうか
env_name = 'RoboschoolHumanoid-v1'
num_cpu = 1 # 学習に使用するCPU数
learn_timesteps = 10**3 # 学習タイムステップ
ori_env = gym.make(env_name)
#env = DummyVecEnv([lambda: ori_env])
env = SubprocVecEnv([make_env(env_name, i) for i in range(num_cpu)])
env.reset()
#env.render()
#time.sleep(5)
savedir = './stable_baselines/{}/'.format(env_name)
logdir = '{}tensorboard_log/'.format(savedir)
os.makedirs(savedir, exist_ok=True)
starttime = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
# 学習の実行
if train:
model = PPO2(MlpPolicy, env, verbose=1, tensorboard_log=logdir)
model.learn(total_timesteps=learn_timesteps)
model.save('{}ppo2_model'.format(savedir))
endtime = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
# 学習結果の確認
if validation:
model = PPO2.load('{}ppo2_model'.format(savedir))
from gym import wrappers
video_path = '{}video'.format(savedir)
wrap_env = wrappers.Monitor(ori_env, video_path, force=True)
done = False
obs = wrap_env.reset()
for step in range(10000):
if step % 10 == 0: print("step :", step)
if done:
time.sleep(1)
o = wrap_env.reset()
break
action, _states = model.predict(obs)
obs, rewards, done, info = wrap_env.step(action)
wrap_env.close()
env.close()
print(starttime)
print(endtime)
학습 결과
먼저 learn_timesteps = 4*10**8 (4억)으로 학습을 해보겠습니다.
어떻게 든 전진하고 있습니다만, 조금 걸은 곳에서 넘어져 버리고 있습니다.
이제 조금 힘들지 않으므로 좀 더 학습 시간 단계를 늘려 개선할 수 없는지 확인해 보겠습니다.
다음은 learn_timesteps = 12*10**8 (12억)의 학습입니다.
이번에는 넘어지지 않고 계속 걸을 수 있게 되었습니다. PPO 대단해! !
걷는 방법이 기분 나쁜 것은 신경이 쓰입니다만・・・웃음
학습 과정 평가
이번에는 쉽게 획득 보상을 비교해 보겠습니다.
PPO은 2017년 OPEN AI에서 발표된 강화 학습 기법입니다. 그리고 OPEN AI가 공개하고 있는 baselines 과 그것을 포크해 작성된 stable baseline 에 구현이 포함되어 있습니다.
PPO는 선행 연구의 TRPO을 개량한 것으로 되어 있습니다. TRPO는 방책이 급격하게 변화하지 않도록, 방책 전후의 KL 다이버전스를 일정치 이하로 억제한다는 궁리를 하고 있어, 로봇 제어 등으로 좋은 성능이 나타났습니다. 단지 방안의 KL 다이버전스의 비교를 실시하기 위한 실장이 복잡해진다는 문제점이 있었기 때문에, PPO에서는 대신 방책의 전후의 비율이 일정치 이상이면 규정치로 클리핑함으로써 실장을 간략화해 있습니다.
자세한 내용은 【논문】Proximal Policy Optimization Algorithms (PPO, 2017) 등을 참조하십시오.
실행 스크립트
실행 스크립트는 다음과 같습니다.
실장이 끝난 모델을 사용하는 것으로 학습 부분이 불과 3행으로 쓸 수 버립니다.
학습과 평가(학습 끝난 모델에 의한 시뮬레이션)를 하고 싶을 때는 변수 train과 validation을 True로 합니다. 혹은 평가만 하고 싶을 때는 train은 False, validation은 True로 합니다.
학습 시간 단계는 learn_timesteps에서 설정합니다.
학습을 실행하면 스크립트 바로 아래에 "./stable_baselines/RoboschoolHumanoid-v1/"디렉토리가 작성되어 그 안에 학습된 모델 "ppo2_model.pkl"과 tensorboard용 로그의 "tensorboard_log/"가 작성됩니다.
평가하면 시뮬레이션 결과의 동영상이 "video/openaigym.video.**.video000000.mp4"로 저장됩니다. ※**는 적당한 수치가 들어갑니다
PPO2.pyimport numpy as np
import gym, roboschool
import os
import time
from datetime import datetime
from OpenGL import GLU
from stable_baselines.common.policies import MlpPolicy
from stable_baselines.common import set_global_seeds
from stable_baselines.common.vec_env import DummyVecEnv, SubprocVecEnv
from stable_baselines.results_plotter import load_results, ts2xy
from stable_baselines import PPO2
# tensorflow gpu 設定
#import tensorflow as tf
#tf.Session(config=tf.ConfigProto(device_count = {'GPU': 2}))
def make_env(env_name, rank, seed=0):
"""
Utility function for multiprocessed env.
:param env_name: (str) the environment ID
:param rank: (int) index of the subprocess
:param seed: (int) the inital seed for RNG
"""
def _init():
env = gym.make(env_name)
env.seed(seed + rank)
return env
set_global_seeds(seed)
return _init
# 学習設定
train = True # 学習をするかどうか
validation = True # 学習結果を使って評価をするかどうか
env_name = 'RoboschoolHumanoid-v1'
num_cpu = 1 # 学習に使用するCPU数
learn_timesteps = 10**3 # 学習タイムステップ
ori_env = gym.make(env_name)
#env = DummyVecEnv([lambda: ori_env])
env = SubprocVecEnv([make_env(env_name, i) for i in range(num_cpu)])
env.reset()
#env.render()
#time.sleep(5)
savedir = './stable_baselines/{}/'.format(env_name)
logdir = '{}tensorboard_log/'.format(savedir)
os.makedirs(savedir, exist_ok=True)
starttime = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
# 学習の実行
if train:
model = PPO2(MlpPolicy, env, verbose=1, tensorboard_log=logdir)
model.learn(total_timesteps=learn_timesteps)
model.save('{}ppo2_model'.format(savedir))
endtime = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
# 学習結果の確認
if validation:
model = PPO2.load('{}ppo2_model'.format(savedir))
from gym import wrappers
video_path = '{}video'.format(savedir)
wrap_env = wrappers.Monitor(ori_env, video_path, force=True)
done = False
obs = wrap_env.reset()
for step in range(10000):
if step % 10 == 0: print("step :", step)
if done:
time.sleep(1)
o = wrap_env.reset()
break
action, _states = model.predict(obs)
obs, rewards, done, info = wrap_env.step(action)
wrap_env.close()
env.close()
print(starttime)
print(endtime)
학습 결과
먼저 learn_timesteps = 4*10**8 (4억)으로 학습을 해보겠습니다.
어떻게 든 전진하고 있습니다만, 조금 걸은 곳에서 넘어져 버리고 있습니다.
이제 조금 힘들지 않으므로 좀 더 학습 시간 단계를 늘려 개선할 수 없는지 확인해 보겠습니다.
다음은 learn_timesteps = 12*10**8 (12억)의 학습입니다.
이번에는 넘어지지 않고 계속 걸을 수 있게 되었습니다. PPO 대단해! !
걷는 방법이 기분 나쁜 것은 신경이 쓰입니다만・・・웃음
학습 과정 평가
이번에는 쉽게 획득 보상을 비교해 보겠습니다.
import numpy as np
import gym, roboschool
import os
import time
from datetime import datetime
from OpenGL import GLU
from stable_baselines.common.policies import MlpPolicy
from stable_baselines.common import set_global_seeds
from stable_baselines.common.vec_env import DummyVecEnv, SubprocVecEnv
from stable_baselines.results_plotter import load_results, ts2xy
from stable_baselines import PPO2
# tensorflow gpu 設定
#import tensorflow as tf
#tf.Session(config=tf.ConfigProto(device_count = {'GPU': 2}))
def make_env(env_name, rank, seed=0):
"""
Utility function for multiprocessed env.
:param env_name: (str) the environment ID
:param rank: (int) index of the subprocess
:param seed: (int) the inital seed for RNG
"""
def _init():
env = gym.make(env_name)
env.seed(seed + rank)
return env
set_global_seeds(seed)
return _init
# 学習設定
train = True # 学習をするかどうか
validation = True # 学習結果を使って評価をするかどうか
env_name = 'RoboschoolHumanoid-v1'
num_cpu = 1 # 学習に使用するCPU数
learn_timesteps = 10**3 # 学習タイムステップ
ori_env = gym.make(env_name)
#env = DummyVecEnv([lambda: ori_env])
env = SubprocVecEnv([make_env(env_name, i) for i in range(num_cpu)])
env.reset()
#env.render()
#time.sleep(5)
savedir = './stable_baselines/{}/'.format(env_name)
logdir = '{}tensorboard_log/'.format(savedir)
os.makedirs(savedir, exist_ok=True)
starttime = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
# 学習の実行
if train:
model = PPO2(MlpPolicy, env, verbose=1, tensorboard_log=logdir)
model.learn(total_timesteps=learn_timesteps)
model.save('{}ppo2_model'.format(savedir))
endtime = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
# 学習結果の確認
if validation:
model = PPO2.load('{}ppo2_model'.format(savedir))
from gym import wrappers
video_path = '{}video'.format(savedir)
wrap_env = wrappers.Monitor(ori_env, video_path, force=True)
done = False
obs = wrap_env.reset()
for step in range(10000):
if step % 10 == 0: print("step :", step)
if done:
time.sleep(1)
o = wrap_env.reset()
break
action, _states = model.predict(obs)
obs, rewards, done, info = wrap_env.step(action)
wrap_env.close()
env.close()
print(starttime)
print(endtime)
먼저 learn_timesteps = 4*10**8 (4억)으로 학습을 해보겠습니다.
어떻게 든 전진하고 있습니다만, 조금 걸은 곳에서 넘어져 버리고 있습니다.
이제 조금 힘들지 않으므로 좀 더 학습 시간 단계를 늘려 개선할 수 없는지 확인해 보겠습니다.
다음은 learn_timesteps = 12*10**8 (12억)의 학습입니다.
이번에는 넘어지지 않고 계속 걸을 수 있게 되었습니다. PPO 대단해! !
걷는 방법이 기분 나쁜 것은 신경이 쓰입니다만・・・웃음
학습 과정 평가
이번에는 쉽게 획득 보상을 비교해 보겠습니다.
4억회에서는 안정적으로 걸을 수 없고, 12억회로 걸을 수 있게 되었습니다만, 획득 보수를 보면 특히 크게 개선해 가고 있는 것은 아닌 것 같습니다. 이런 것일까요?
이유를 잘 모르기 때문에 향후 조사해 보려고 생각합니다.
요약
이번에는 실장이 끝난 모델 PPO를 이용해 2족 보행 동작의 학습을 시켜 보았습니다.
결과적으로 학습 횟수를 늘리면 일단 계속 걸을 수 있게 되었습니다.
더 하이퍼 파라미터의 튜닝이라든지 필요하다고 생각하고 있었습니다만, 해 보면 할 수 있는 것이군요. 최근 기술의 진화를 느낍니다.
다음 번은 좀 더 상세한 해석이나 수법 차이의 비교, 걷는 방법의 개량 등을 할 수 있으면 좋겠습니다.
Reference
이 문제에 관하여(강화 학습에 의한 2족 보행의 획득 Part2<기존의 구현으로 학습>), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kinziro/items/491506c65762c6cef7c3
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(강화 학습에 의한 2족 보행의 획득 Part2<기존의 구현으로 학습>), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kinziro/items/491506c65762c6cef7c3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)