Gym은 강화학습 알고리즘을 개발하고 비교하기위한 Toolkit입니다. 하지만 처음 강화학습을 접하는 저에게는 무슨 말인지 이해가 안갑니다.
Installation
1. pip install
python 3.5 이상이어야한다고 합니다.
pip install gym
** Error
ImportError: Cannot import pyglet. HINT: you can install pyglet directly via 'pip install pyglet'. But if you really just want to install all Gym dependencies and not have to think about it, 'pip install -e .[all]' or 'pip install gym[all]' will do it.
위 에러가 뜨면 에러 내용에 나온 것 처럼 pyglet을 설치하면 된다.
pip install pyglet
2. git clone & install
git clone을 해서 install 하는 방법은 gym을 직접 수정하거나 environment를 추가할 때 사용하면 유용하다고 합니다.
git clone https://github.com/openai/gym
cd gym
pip install -e .
Environments
다음 코드는 CarPole-v0라는 환경의 인스턴스를 실행하여 1000번의 time steps를 진행합니다. 그리고 이때 각 단계에서 환경을 렌더링한다고 합니다. 여기서 렌더링이 무엇이고 환경은 무엇인지는 아직 잘 모르겠습니다.
import gym
env = gym.make('CartPole-v0')
env.reset()
for _ in range(1000):
env.render()
env.step(env.action_space.sample()) # take a random action
env.close()
실행 결과 다음과 같이 진행되는 이상한 것을 보게 됩니다.
위 코드를 실행하면 cart-pole이 점점 오른쪽으로 이동하면서 화면을 벗어나고 이후에도 계속 진행이 되는데 보통은 화면에서 벗어나면 simulation을 끝낸다고 합니다.
다른 환경의 action을 확인하려면 MountaionCar-v0나 MsPacman-v0로 변경하면 됩니다. 이외에도 더 있지만 몇 개만 해보면 될 것 같습니다.
Observations
환경에서 step 함수는 다음과 같은 4개의 값을 반환합니다.
- observation(object): 환경에 대한 observation을 나타내는 개체, 예를 들어 카메라의 픽셀 데이터, 로봇의 관절 각도 및 속도 또는 보드 게임의 보드 상태를 말합니다.
- reward(float): 이전 action으로 달성한 reward의 양
- done(boolean): 환경을 다시 재설정해야하는 지의 여부
- info(dict): 디버깅에 필요한 정보
각 time step에서 agent는 action을 선택하고 환경은 observation과 reward를 반환합니다.
process는 초기 observation을 반환하는 reset()을 호출하여 시작됩니다. 다음 코드에서는 done flg를 고려하여 진행합니다.
import gym
env = gym.make('CartPole-v0')
for i_episode in range(20):
observation = env.reset()
for t in range(100):
env.render()
print(observation)
action = env.action_space.sample()
observation, reward, done, info = env.step(action)
if done:
print("Episode finished after {} timesteps".format(t+1))
break
env.close()
출력은 다음과 같이 나옵니다.
[-0.061586 -0.75893141 0.05793238 1.15547541]
[-0.07676463 -0.95475889 0.08104189 1.46574644]
[-0.0958598 -1.15077434 0.11035682 1.78260485]
[-0.11887529 -0.95705275 0.14600892 1.5261692 ]
[-0.13801635 -0.7639636 0.1765323 1.28239155]
[-0.15329562 -0.57147373 0.20218013 1.04977545]
Episode finished after 14 timesteps
[-0.02786724 0.00361763 -0.03938967 -0.01611184]
[-0.02779488 -0.19091794 -0.03971191 0.26388759]
[-0.03161324 0.00474768 -0.03443415 -0.04105167]
Spaces
위에서 했던 것들은 environment의 action space에서 random action을 샘플링한 것입니다. 그런데 여기서 action이 무엇일까요? 모든 environment에는 action_space와 observation_space가 있습니다. 이 속성들은 space type이고 유효한 action과 observation을 설명합니다. 다음 코드를 직접 실행해서 확인해보겠습니다.
import gym
env = gym.make('CartPole-v0')
print(env.action_space)
#> Discrete(2)
print(env.observation_space)
#> Box(4,)
출력은 다음과 같이 나옵니다.
Discrete(2)
Box([-4.8000002e+00 -3.4028235e+38 -4.1887903e-01 -3.4028235e+38], [4.8000002e+00 3.4028235e+38 4.1887903e-01 3.4028235e+38], (4,), float32)
action_space의 출력의 Discrete(이산) 공간은 음수가 아닌 숫자의 고정된 범위를 허용하므로 이 경우 유효한 action은 0 또는 1이라고 합니다. 그리고 observation_space 출력의 Box 공간은 n 차원 box를 표현합니다. 그래서 observation은 4개의 숫자로 구성된 array가 됩니다. box 의 경계는 다음과 같이 확인 할 수 있습니다.
print(env.observation_space.high)
#> [4.8000002e+00 3.4028235e+38 4.1887903e-01 3.4028235e+38]
print(env.observation_space.low)
#> [-4.8000002e+00 -3.4028235e+38 -4.1887903e-01 -3.4028235e+38]
그리고 다음 코드와 같이 space에서 sampling하거나 거기에 어떤 것이 속해있는지 확인할 수 있습니다.
from gym import spaces
space = spaces.Discrete(8) # Set with 8 elements {0, 1, 2, ..., 7}
x = space.sample()
assert space.contains(x)
assert space.n == 8
[reference]