Reinforcement Learning

[Gym] Gym 시작하기

ju_young 2022. 1. 29. 17:10
728x90

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]

https://gym.openai.com/docs/

728x90