고전 게임에 AI적용하기 1 OpenAI Gym

OpenAI Gym은 강화 학습(reinforcement learning) 알고리즘을 개발하고 비교하기 위한 도구입니다. 이 도구는 에이전트가 스스로 걷거나 탁구 또는 핀볼과 같은 게임을 스스로 플레이 할 수 있도록 가르치는 것을 지원합니다.

Gym 시작하기

Gym은 에이전트의 구조를 미리 결정하지 않으며, TensorFlow 또는 Theano와 같은 모든 수치 계산 라이브러리와 호환됩니다.

Gym라이브러리는 강화 학습 알고리즘을 수행하는데 사용할 수 있는 테스트 (환경)의 모음입니다. 이러한 환경에는 공유 인터페이스가 있어 일반 알고리즘을 작성할 수 있습니다. 즉 Gym 파이썬 라이브러리는 일반 알고리즘을 작성하고 테스트하기 위한 공유 인터페이스를 제공하여 강화학습(RL) 에이전트의 알고리즘에서 작동하는 수많은 테스트 환경을 제공합니다.

설치하기

시작하려면 Python 3.5 이상이 설치되어 있어야 합니다. (링크에서 버전 확인) 간단히 Pip을 사용하여 Gym을 설치합니다. *소스로 설치는 링크에서 확인하세요.

쉽게 설치하는 방법은 터미널에 “pip install gym”을 입력하고 실행하면 Gym이 설치되고 에이전트를 작동할 수 있는 환경을 얻게 됩니다.

pip install gym

환경(Environments)

아래 코드를 복사하여 실행하면 “카트폴” 환경이 로드되고 기본적인 제어만 설정됩니다. 이 코드는 카트폴 실행시키는 최소한의 파이썬 코드입니다. 이렇게하면 1000 단계마다 CartPole-v0 환경의 인스턴스가 실행되어 각 단계에서 환경이 렌더링됩니다. 윈도우 팝업창에서 렌더링되는 클래식 카트 폴(classic cart-pole)을 볼 수 있습니다.

# 1. It renders instance for 1000 timesteps, perform random actions
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()
# 2. To check all env available, uninstalled ones are also shown
from gym import envs
print(envs.registry.all())

위 코드를 실행하면 다음과 같은 결과를 볼 수 있습니다.

일반적으로 카트폴이 화면을 벗어나면 시뮬레이션이 종료됩니다. 여기서 done = True를 반환하더라도 step() 호출에 대한 경고를 무시하세요.

Algorithmic, Atari, Box2D 및 Robotics와 같은 다른 환경을 확인할 수 있습니다. 다른 환경이 작동하는 것을 보고 싶다면 위의 CartPole-v0MountainCar-v0, MsPacman-v0, Hopper-v1 과 같은 것으로 바꾸세요. 환경은 모두 Env 기반 클래스에서 상속받게 됩니다. 종속성이 누락된 경우 내용을 알려주는 유용한 오류 메시지가 표시됩니다. 해결은 여기 링크에서

MountainCar-v0

Observations

위 프로그램 소스의 각 단계에서 무작위적인 행동을 취하는 것보다 더 나은 방법을 원한다면, 실제로 액션이 환경에 어떤 영향을 미치는지 아는 것이 좋습니다.

환경의 step() 함수는 우리가 필요로 하는 것을 정확하게 되돌려줍니다. 실제로 step() 함수는 다음의 네 가지 값을 반환합니다. step() 함수는 환경 상태를 나타내는 객체 타입의 observation, 이전 액션의 플로트 타입 reward, 환경이나 목표를 재설정하는 불 타입의 done, 디버깅을 위한 사전형 타입의 info를 반환합니다. info는 환경의 마지막 상태에 대한 확률이 포함된 경우 학습에 사용됩니다.

  • observation (객체): 환경 관찰을 나타내는 환경 특정 객체. 예를 들어, 카메라의 픽셀 데이터, 로봇의 관절 각도 및 관절 속도 또는 보드 게임의 보드 상태입니다.
  • reward (float): 이전 액션에 의해 달성된 보상 값입니다. 크기는 환경마다 다르지만 목표는 항상 전체 보상을 증가시키는 것입니다.
  • done (boolean): 환경을 다시 재설정해야하는지 여부입니다. 대부분의 (전부는 아님) 작업은 잘 정의된 에피소드로 나뉘어져 있으며 True가 된 것은 에피소드가 종료되었음을 나타냅니다. (예를 들어, 장대가 너무 멀리 기울었거나, 마지막 생명을 잃었을 수 있습니다.)
  • info (dict): 디버깅에 유용한 진단 정보입니다. 때로는 학습에 유용할 수 있습니다 (예 : 환경의 마지막 상태 변경에 대한 원시 확률이 포함될 수 있음). 그러나 에이전트의 공식 평가는 학습에 이것을 사용할 수 없습니다.

이것은 전형적인 “에이전트 환경 루프”의 구현입니다. 타임 스텝마다 에이전트는 작업(action)을 선택하고 환경(environment)은 관찰(observation)과 보상(reward)을 반환합니다.

출처:https://blog.floydhub.com/an-introduction-to-q-learning-reinforcement-learning/

프로세스는 reset() 함수를 호출하여 시작되며, 초기 observation 값을 반환합니다. 따라서 이전 코드 보다 더 적절한 방법은 done 플래그를 사용하는 것입니다.

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()

위 코드의 실행은 다음 비디오와 같고 출력도 확인해 볼 수 있습니다. done값이 True인 재설정이 발생하는 위치를 볼 수 있어야 합니다. 즉 done값이 True이면 안쪽의 for문을 끝내고 reset()으로 재설정합니다.

Spaces

action-space와 observation-space은 특정 env에서 사용할 수있는 유효한 형식을 설명합니다. 위의 예에서는 환경의 작업 공간에서 임의의 작업을 샘플링했습니다.

action = env.action_space.sample() 

하지만 실제로는 어떤 actions이 있었습니까? 모든 환경에는 action_spaceobservation_space을 같이 사용합니다. 이러한 속성은 Space의 유형이며 유효한 actions과 observations의 형식을 설명합니다.

import gym
env = gym.make('CartPole-v0')
print(env.action_space)
#> Discrete(2)
print(env.observation_space)
#> Box(4,)

Discrete 스페이스는 음수가 아닌 고정된 범위의 숫자를 허용하므로 이 경우 유효한 action은 0 또는 1입니다. 이 값은 카트폴의 경우, 밸런싱의 왼쪽 및 오른쪽 이동과 같습니다. Box 페이스는 n차원 배열의 box를 나타내므로 유효한 observations 값은 4개의 숫자로 이루어진 배열입니다. Box의 범위를 확인할 수도 있습니다. env.observation_space.high / [low] 범위를 확인하고 일반적인 알고리즘으로 코딩할 수 있습니다.

print(env.observation_space.high)
#> array([ 2.4       ,         inf,  0.20943951,         inf])
print(env.observation_space.low)
#> array([-2.4       ,        -inf, -0.20943951,        -inf])

*참고

OpenAI Gym의 기본 사항을 알고 나면 Gym의 모든 종속성을 설치한 후 다음 명령으로 Gym을 완전히 설치할 수 있습니다. 여기에서 python2.x를 사용하거나 python3.x를 사용할 수도 있습니다.

sudo apt-get install -y python-numpy python-dev cmake zlib1g-dev libjpeg-dev xvfb libav-tools xorg-dev python-opengl libboost-all-dev libsdl2-dev swig

sudo pip install 'gym[all]'