티스토리 뷰
sinanju06/딥러닝 환경 셋팅 및 코드 분석
강화학습 실습 2편 : OpenAI GYM 기반 환경(env) 코드 분석
hanyangrobot 2021. 10. 15. 16:12작성자 : 한양대학원 융합로봇시스템학과 유승환 석사과정 (CAI LAB)
안녕하세요~~ 저번 1편에서는 Open AI GYM에서 제공하는 Atrai Game들을 A2C 모델로 학습해보는 시간을 가졌었습니다! 이번 2편에서는 강화학습의 환경(env)과 관련된 코드를 분석하는 시간을 가지겠습니다!!ㅎㅎ 아쉽게도 Atari 게임의 코드는 공식적으로 지원하지 않습니다 ㅜㅜ 그래서 Atrai의 환경 코드는 간단하게만 보고, 대표적인 환경 중 하나인 'mountain car' 예제를 분석해보겠습니다~~~!! 그럼 시작하겠습니다~!
강화학습 실습 1편 : https://ropiens.tistory.com/153
1. 강화학습 실습 1편에서 사용했던 Atari Game의 env 코드의 간략 분석
(1-1) Atari Game의 Env의 큰 그림 보기
- 먼저, 저번 시간에 사용했던 코드를 한번 보겠습니다~
from stable_baselines3.common.env_util import make_atari_env
from stable_baselines3.common.vec_env import VecFrameStack
from stable_baselines3 import A2C
# There already exists an environment generator
# that will make and wrap atari environments correctly.
# Here we are also multi-worker training (n_envs=4 => 4 environments)
env = make_atari_env('Breakout-v0', n_envs=4, seed=0)
# Frame-stacking with 4 frames
env = VecFrameStack(env, n_stack=4)
model = A2C('CnnPolicy', env, verbose=1)
model.learn(total_timesteps=25000)
obs = env.reset()
while True:
action, _states = model.predict(obs)
obs, rewards, dones, info = env.step(action)
env.render()
- 위 코드에서 'Breakout-v0'의 환경에 대한 코드의 흐름은 아래와 같습니다!
- (1) env = make_atari_env() -> (2) env.reset() -> (3) env.step() -> (4) env.render()
- (1) : env의 class를 선언하는 부분입니다. 강화학습을 하기 위해선 env의 정의가 필요한데, 이를 수행하는 코드라고 보실 수 있습니다!
- (2) : 새로운 에피소드 학습을 위해 환경(state, reward, action 등등)을 초기화하는 코드입니다!
- (3) : agent(여기선 model이 agnet라고 볼 수 있죠 ㅎㅎ)가 행동한 action에 대한 다음 state, reward를 줄 수 있는 함수입니다!
- (4) : 우리가 학습 진행 과정을 볼 수 있게, 시각적으로 보여주는 시뮬레이션 툴이라고 보시면 됩니다ㅎㅎ
- * 강화학습에선 episode와 step의 구분이 중요합니다! 아래의 이미지로 이해하시면 됩니다~
(1-2) env = make_atari_env() 코드 분석하기
- make_atari_env() 함수의 코드는 아래의 링크에서 확인할 수 있습니다!
- env_utils.py 링크 : https://github.com/DLR-RM/stable-baselines3/blob/master/stable_baselines3/common/env_util.py
- 코드 분석의 길은 험난합니다! 일단 위 env_utils.py 중 def make_atari_env() 함수만을 확인해봅시다~ 해당 함수는 line 108에 있습니다~
- (저 함수만 보는 이유는, 저희의 코드에서 from stable_baselines3.common.env_util import make_atari_env를 사용했기 때문입니다!)
- 보시면 무언가 엄청나게 많은 input과 output이 있는 것을 볼 수 있습니다!
- input으로는 환경과 관련된 정보를 받네요~ 우리는 env_id로 'Breakout-v0'를 줌으로써, 수 많은 아타리 게임 중 Breakout-v0를 불러오는 것을 확인할 수 있습니다!
- 또한 n_envs는 병렬로 실행할 환경 수인데요, 위 코드에서는 n_envs=4로 설정되어있기 때문에 env.render()를 수행할 시 게임 화면이 4개가 뜨는 것을 볼 수 있었습니다!! 만약에 n_envs=1로 설정하면 게임 화면이 1개만 뜹니다~
- 마지막으로 seed입니다! seed와 관련된 내용은 아래의 링크에서 확인해주시면 됩니다!
- seed란? : https://yang-wistory1009.tistory.com/95
- def make_atari_env()는 이렇게 받은 input을 바탕으로 def make_vec_env()를 output으로 내는 것을 볼 수 있습니다!
- def make_vec_env()는 def make_atari_env()와 같은 링크의 line 38에 존재합니다!
- make_vec_env()의 핵심은 output으로 env를 return하는데, 이 env는 line 92의 Monitor Class에 의해 생성됩니다!
- 이 Monitor Class 내에 env.reset(), env.step()가 포함되어 있습니다~~ 이를 분석해보겠습니다~
(1-3) env.reset(), env.step() 코드 분석하기
- Monitor Class에 대한 코드는 아래의 링크에서 확인할 수 있습니다~
- monitor.py 링크 : https://github.com/DLR-RM/stable-baselines3/blob/09e9fc42eb653cacc0b6db203fa83faa0530e297/stable_baselines3/common/monitor.py#L17
- 먼저, line 60의 reset 함수부터 분석해보겠습니다!
- 그래서 line 72를 보시면 self.rewards = []로 reward를 초기화는 것을 볼 수 있습니다~
- 그리고 return으로 self.env.reset()을 통해 env를 첫 state로 초기화시키게 되는데, 이에 대한 분석은 각 환경에 대한 깃헙 소스 코드를 확인해야 합니다! 아쉽게도 Breakout과 같은 공식 깃헙 코드는 삭제된 이유로... 아래에서 Mountain_car 예제를 통해 좀 더 보겠습니다~!
- 여기에서 핵심은 환경의 첫 state로 초기화시키는 것입니다!
- 그 다음은 env.step()입니다!!
- step 함수를 보시면 action 값을 넣음으로써 다음 state, reward, done, info를 받는 것을 확인할 수 있습니다! 이 역시 아래의 mountain_car 예제를 통해 좀 더 자세히 보겠습니다~
- 일단 reward는 다들 아실거니깐 패스~
- done은 한 에피소드가 끝남을 알려주는 신호입니다! 보통 time step이 max가 되거나, 게임에 성공했을 때 (ex : Breakout에서 모든 벽돌을 깼을 때!), 에피소드가 끝남을 알려주게 됩니다.
- info는 굳이 왜 저런 형태로 있는지 잘 모르겠습니다... 저 코드에서는 episode를 알려주기 위해 info를 구성했는데, 사실 저런 형태 말고 다른 형태로도 구성할 수 있죠 ㅎㅎ (ex : 모델에 같이 저장하기)
2. Mountain_car 예제를 통한 openai gym 환경 분석
(1) Mountain_car 환경을 이해하기
- 이대로 마무리하기 아쉬우니, mountain_car의 환경을 보겠습니다!
- mountain_car 링크 : https://github.com/openai/gym/blob/master/gym/envs/classic_control/mountain_car.py
- 먼저 mountain_car란 어떤 환경인지 알아보겠습니다~
- mountain_car 영상 : https://www.youtube.com/watch?v=7sgilwJ9Fig&t=29s
- 이제 직관적으로 확인을 하셨으니, 글로 정리해서 보겠습니다 ㅎㅎ
- mountain_car는 state로 car(agent)의 위치와 속도를 받는 것을 확인할 수 있습니다!
- car의 위치는 최소 -1.2, 최대 0.6이며, 속도는 -0.07 ~ 0.07까지 냄을 볼 수 있습니다~
- car의 action은 discrete한 action으로 0은 왼쪽으로 가속, 1은 멈추기, 2는 오른쪽으로 가속하는 것을 볼 수 있습니다!
- car의 reward는 산의 꼭대기(플래그가 있는 곳, 위치는 0.5라고 합니다)에 도착하면 0, 그외는 -1을 줍니다.
- * 만약에 continous한 action을 학습하고 싶으면, 아래의 countinuous_mountain_car.py를 확인해보시면 됩니다~~
- * countinuous_mountain_car.py : https://github.com/openai/gym/blob/master/gym/envs/classic_control/continuous_mountain_car.py
- 또한 초기 위치는 -0.6 ~ -0.4 내에서 랜덤한 위치에서 생성되고, 초기 속도는 0입니다.
- 에피소드는 car가 산 꼭대기에 도착(=position 0.5)하거나, 타임 스텝이 200이 넘어가면 종료된다고 하네요~
- 자 이제 코드로 구현된 것을 보겠습니다~~
(2) Mountain_car 환경의 코드 분석하기
- 먼저 reset() 함수를 보겠습니다!!
- 보시면, 제가 위에서 언급했던 것과 같이 초기 위치를 -0.6 ~ -0.4로 랜덤한 위치로 생성시키고, 그것을 반환하게 되네요!
- -0.6~-0.4 사이로 나온 랜덤한 값이 mountain_car 환경의 에피소드 별 초기 상태가 됩니다!
- 그 다음 step() 함수를 보겠습니다~
- step 함수를 보시면 action의 값 (0, 1, 2)에 의해 velocity가 정해지고, 이 velocity 값이 position에 영향을 주는 것을 볼 수 있습니다!
- 그리고 해당 poisition과 velocity에 의해 reward를 산출하게 됩니다~
- 이때 goal_position과 goal_velocity는 def __init__() 에서 선언해줍니다!
- done의 경우 reward 조건을 만족하면 1, 그 외는 0이 되네요~
- info의 경우 따로 저장되는 값이 없음을 볼 수 있습니다!
- 이런 원리로 step 함수가 작동되어, 최종적으로 다음 상태, action, reward, done, info를 반환하는 것을 볼 수 있습니다!!
여기까지 따라오시느라 고생하셨습니다~! 이번 시간에는 강화학습의 환경에 관한 코드를 분석했습니다 ㅎㅎ 다음 시간에는 강화학습의 대표적인 모델 중 하나인 DDPG : Deep Deterministic Policy Gradient에 관한 예제 실습을 진행해보겠습니다!
'sinanju06 > 딥러닝 환경 셋팅 및 코드 분석' 카테고리의 다른 글
YOLO 실습 : the faster yolov3-tiny! (2) | 2021.11.28 |
---|---|
OMOROBOT : R1-Mini + CNN으로 간단한 자율주행 해보기 (0) | 2021.10.25 |
Text To Speech 실습 1편 : Window 10에서 한국어 GLOW-TTS 모델 학습하기 (작성 중) (2) | 2021.10.04 |
강화학습 실습 1편 : OpenAI GYM-Atari 환경 셋팅 (Window 10, anaconda) (8) | 2021.09.29 |
OMOROBOT : R1-Mini + ORB SLAM 2로 지도 그려보기 (6) | 2021.04.11 |
댓글