티스토리 뷰

반응형

https://www.edwith.org/move37/lecture/59776/?isDesc=false

 

Gym은 강화학습 알고리즘을 개발하고 비교평가하는 툴킷이다.

Gym은 에이전트를 만들 때 특정한 가정을 요구하지 않고, TensorFlow나 Therno와 같은 라이브러리와도 호환된다.

 

gym 라이브러리는 강화학습의 테스트 문제들을 연습해 볼 수 있는 환경을 모아놓은 곳이다.

 

pip install gymnasium

gym은 2023년 이후로 gymnasium으로 바뀌었다.

 

 

가장 일반적인 cart pole 예

import gymnasium as gym
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import display, clear_output

env = gym.make("CartPole-v1", render_mode="rgb_array")

observation, info = env.reset(seed=42)
for _ in range(1000):
    action = env.action_space.sample()
    observation, reward, terminated, truncated, info = env.step(action)

    if terminated or truncated:
        observation, info = env.reset()

    # Render the frame and display it
    frame = env.render()
    plt.imshow(frame)
    clear_output(wait=True)
    display(plt.gcf())

env.close()

observation, reward,terminated,truncated,info를 env 함수에서 받는다.

 

각 프레임을 render 해서 보여주는 함수이다.

 

import gymnasium as gym

env = gym.make('CartPole-v1')

for i_episode in range(20):
    observation, info = env.reset(seed=None)  # `seed`를 지정할 수 있음

    for t in range(100):
        env.render()
        print(observation)
        action = env.action_space.sample()
        observation, reward, terminated, truncated, info = env.step(action)

        if terminated or truncated:
            print("Episode finished after {} timesteps".format(t+1))
            break

env.close()

 

이렇게 하게 되면, teminated나 truncated 될 때마다 해당하는 array들의 변화를 볼 수 있다.

이렇게 변화하는 과정을 관찰(observation)이라고 한다.

 

  • observation (object): 환경에 대한 관찰 결과를 알려주는 특정 환경 오브젝트입니다. 예를 들어서, 카메라의 경우에는 픽셀, 로봇에 대해서는 관절의 각도와 속도, 보드게임에서는 보드의 현재 상태 등이 됩니다.
  • reward (float): 이전의 행동으로 생긴 보상을 나타냅니다. 보상 값의 범위는 환경에 따라서 달라지지만, 목표는 언제나 전체 보상을 최대화하는 것입니다.
  • terminated : 환경을 다시 reset 해야 하는지 알려줍니다. 모든 경우는 아니지만, 대부분의 문제는 잘 정의된 사건들로 나누어져 있고, 이때 termianted True인 경우 사건이 끝났음을 의미합니다. (예를 들어, 기둥이 너무 멀리 갔거나, 마지막 목숨을 잃었을 때를 말합니다)
  • truncated (중단됨) : 에피소드가 시간 초과 등 외부 조건에 의해 중단되었는지를 나타내는 불리언 값입니다. 이는 환경이 지정된 시간 동안 지속되었을 때 True가 됩니다. CartPole-v0에서는 일반적으로 타임스텝 제한에 도달했을 때 truncated가 True가 됩니다.
  • info (dict): 디버깅에 유용하게 사용할 수 있는 진단을 위한 정보를 말합니다. 학습을 하는 데 유용하게 사용할 수도 있습니다. (예를 들어, 환경의 마지막 상태 변화의 초기 확률에 대한 정보를 포함하고 있을 수도 있습니다.) 하지만, 공식적으로는 에이전트의 학습에 이를 사용할 수는 없습니다.

gym과 gymnasium의 차이는 done이 세부적으로 두 개로 나뉘었다는 것이다.

terminated는 조건의 실패, 카트 폴에서는 막대기가 떨어지는 것이고,

truncated는 시간 초과나 외부 조건에 의해 중단되었을 경우다.

 

 

결론적으로는 각 단계에서 무작위로 행동을 취하는 것보다 더 좋은 결과를 얻기 위해서는 step 함수가 출력하는 array들에 주목할 필요가 있다.

 

공간

env = gym.make('CartPole-v0')

print(env.action_space)

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)

print(env.observation_space)

 

모든 환경에는 공간이 있다.

 

공간이 무엇이냐면, 간단히 말해 행동의 종류나 관찰의 종류를 정의할 수 있는 리스트라고 생각하면 된다.

action_space와 observation_space는 그런 공간을 정의해준다.

 

이 속성들은 Space 타입을 가지고 있고, 가능한 행동들과 관찰값의 형식을 나타낸다.

 

action_space의 결과인 Discrete 공간에서는 음이 아닌 수가 한정된 범위에서만 허용된다.

따라서 이 경우에 가능한 action은 0 또는 1이 된다.

 

observation_spacc의 결과인 Box 공간은 n차원의 박스, 즉 2차원이라면 x의 범위, y의 범위가 들어가므로

4개의 숫자로 이루어진 배열이 된다.

 

Box의 경계값을 통해 확인할 수 있다.

 

 

Box와 Discrete 공간은 가장 일반적인 space이므로, space에서 샘플을 추출하거나 space에 속하는 항목들을 확인할 수 있다.

from gymnasium 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

 

assert 문을 쓰므로, 8이 들어가면 아무것도 안나오지만, 다른 게 들어가면 error가 난다.

space가 x를 가지고 있다는 걸 확신할 수 있게 된다.

 

 

실습 예제들

 

 

https://gymnasium.farama.org/main/environments/classic_control/#classic-control

https://gymnasium.farama.org/main/environments/toy_text/#toy-text

가장 기본적인 예제들이다.

 

https://gymnasium.farama.org/main/environments/atari/#atari = 게임 관련

https://gymnasium.farama.org/main/environments/mujoco/

=로봇 관련

 

더 많은 정보는 여기서 보면 된다.

https://gymnasium.farama.org/main/

 

 

레지스트리

gym의 주요 목적은 공통적인 인터페이스와 서로 비교할 수 있는 다양한 버전의 환경들을 모아서 제공하는 것이다.

from gymnasium import envs

print(envs.registry)

>{'CartPole-v0': EnvSpec(id='CartPole-v0', entry_point='gymnasium.envs.classic_control.cartpole:CartPoleEnv', reward_threshold=195.0, nondeterministic=False, max_episode_steps=200, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='CartPole', version=0, additional_wrappers=(), vector_entry_point='gymnasium.envs.classic_control.cartpole:CartPoleVectorEnv'), 'CartPole-v1': EnvSpec(id='CartPole-v1', entry_point='gymnasium.envs.classic_control.cartpole:CartPoleEnv', reward_threshold=475.0, nondeterministic=False, max_episode_steps=500, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='CartPole', version=1, additional_wrappers=(), vector_entry_point='gymnasium.envs.classic_control.cartpole:CartPoleVectorEnv'), 'MountainCar-v0': EnvSpec(id='MountainCar-v0', entry_point='gymnasium.envs.classic_control.mountain_car:MountainCarEnv', reward_threshold=-110.0, nondeterministic=False, max_episode_steps=200, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='MountainCar', version=0, additional_wrappers=(), vector_entry_point=None), 'MountainCarContinuous-v0': EnvSpec(id='MountainCarContinuous-v0', entry_point='gymnasium.envs.classic_control.continuous_mountain_car:Continuous_MountainCarEnv', reward_threshold=90.0, nondeterministic=False, max_episode_steps=999, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='MountainCarContinuous', version=0, additional_wrappers=(), vector_entry_point=None), 'Pendulum-v1': EnvSpec(id='Pendulum-v1', entry_point='gymnasium.envs.classic_control.pendulum:PendulumEnv', reward_threshold=None, nondeterministic=False, max_episode_steps=200, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='Pendulum', version=1, additional_wrappers=(), vector_entry_point=None), 'Acrobot-v1': EnvSpec(id='Acrobot-v1', entry_point='gymnasium.envs.classic_control.acrobot:AcrobotEnv', reward_threshold=-100.0, nondeterministic=False, max_episode_steps=500, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='Acrobot', version=1, additional_wrappers=(), vector_entry_point=None), 'phys2d/CartPole-v0': EnvSpec(id='phys2d/CartPole-v0', entry_point='gymnasium.envs.phys2d.cartpole:CartPoleJaxEnv', reward_threshold=195.0, nondeterministic=False, max_episode_steps=200, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace='phys2d', name='CartPole', version=0, additional_wrappers=(), vector_entry_point='gymnasium.envs.phys2d.cartpole:CartPoleJaxVectorEnv'), 'phys2d/CartPole-v1': EnvSpec(id='phys2d/CartPole-v1', entry_point='gymnasium.envs.phys2d.cartpole:CartPoleJaxEnv', reward_threshold=475.0, nondeterministic=False, max_episode_steps=500, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace='phys2d', name='CartPole', version=1, additional_wrappers=(), vector_entry_point='gymnasium.envs.phys2d.cartpole:CartPoleJaxVectorEnv'), 'phys2d/Pendulum-v0': EnvSpec(id='phys2d/Pendulum-v0', entry_point='gymnasium.envs.phys2d.pendulum:PendulumJaxEnv', reward_threshold=None, nondeterministic=False, max_episode_steps=200, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace='phys2d', name='Pendulum', version=0, additional_wrappers=(), vector_entry_point='gymnasium.envs.phys2d.pendulum:PendulumJaxVectorEnv'), 'LunarLander-v2': EnvSpec(id='LunarLander-v2', entry_point='gymnasium.envs.box2d.lunar_lander:LunarLander', reward_threshold=200, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='LunarLander', version=2, additional_wrappers=(), vector_entry_point=None), 'LunarLanderContinuous-v2': EnvSpec(id='LunarLanderContinuous-v2', entry_point='gymnasium.envs.box2d.lunar_lander:LunarLander', reward_threshold=200, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={'continuous': True}, namespace=None, name='LunarLanderContinuous', version=2, additional_wrappers=(), vector_entry_point=None), 'BipedalWalker-v3': EnvSpec(id='BipedalWalker-v3', entry_point='gymnasium.envs.box2d.bipedal_walker:BipedalWalker', reward_threshold=300, nondeterministic=False, max_episode_steps=1600, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='BipedalWalker', version=3, additional_wrappers=(), vector_entry_point=None), 'BipedalWalkerHardcore-v3': EnvSpec(id='BipedalWalkerHardcore-v3', entry_point='gymnasium.envs.box2d.bipedal_walker:BipedalWalker', reward_threshold=300, nondeterministic=False, max_episode_steps=2000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={'hardcore': True}, namespace=None, name='BipedalWalkerHardcore', version=3, additional_wrappers=(), vector_entry_point=None), 'CarRacing-v2': EnvSpec(id='CarRacing-v2', entry_point='gymnasium.envs.box2d.car_racing:CarRacing', reward_threshold=900, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='CarRacing', version=2, additional_wrappers=(), vector_entry_point=None), 'Blackjack-v1': EnvSpec(id='Blackjack-v1', entry_point='gymnasium.envs.toy_text.blackjack:BlackjackEnv', reward_threshold=None, nondeterministic=False, max_episode_steps=None, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={'sab': True, 'natural': False}, namespace=None, name='Blackjack', version=1, additional_wrappers=(), vector_entry_point=None), 'FrozenLake-v1': EnvSpec(id='FrozenLake-v1', entry_point='gymnasium.envs.toy_text.frozen_lake:FrozenLakeEnv', reward_threshold=0.7, nondeterministic=False, max_episode_steps=100, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={'map_name': '4x4'}, namespace=None, name='FrozenLake', version=1, additional_wrappers=(), vector_entry_point=None), 'FrozenLake8x8-v1': EnvSpec(id='FrozenLake8x8-v1', entry_point='gymnasium.envs.toy_text.frozen_lake:FrozenLakeEnv', reward_threshold=0.85, nondeterministic=False, max_episode_steps=200, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={'map_name': '8x8'}, namespace=None, name='FrozenLake8x8', version=1, additional_wrappers=(), vector_entry_point=None), 'CliffWalking-v0': EnvSpec(id='CliffWalking-v0', entry_point='gymnasium.envs.toy_text.cliffwalking:CliffWalkingEnv', reward_threshold=None, nondeterministic=False, max_episode_steps=None, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='CliffWalking', version=0, additional_wrappers=(), vector_entry_point=None), 'Taxi-v3': EnvSpec(id='Taxi-v3', entry_point='gymnasium.envs.toy_text.taxi:TaxiEnv', reward_threshold=8, nondeterministic=False, max_episode_steps=200, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='Taxi', version=3, additional_wrappers=(), vector_entry_point=None), 'tabular/Blackjack-v0': EnvSpec(id='tabular/Blackjack-v0', entry_point='gymnasium.envs.tabular.blackjack:BlackJackJaxEnv', reward_threshold=None, nondeterministic=False, max_episode_steps=None, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={'sutton_and_barto': True, 'natural': False}, namespace='tabular', name='Blackjack', version=0, additional_wrappers=(), vector_entry_point=None), 'tabular/CliffWalking-v0': EnvSpec(id='tabular/CliffWalking-v0', entry_point='gymnasium.envs.tabular.cliffwalking:CliffWalkingJaxEnv', reward_threshold=None, nondeterministic=False, max_episode_steps=None, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace='tabular', name='CliffWalking', version=0, additional_wrappers=(), vector_entry_point=None), 'Reacher-v2': EnvSpec(id='Reacher-v2', entry_point='gymnasium.envs.mujoco:ReacherEnv', reward_threshold=-3.75, nondeterministic=False, max_episode_steps=50, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='Reacher', version=2, additional_wrappers=(), vector_entry_point=None), 'Reacher-v4': EnvSpec(id='Reacher-v4', entry_point='gymnasium.envs.mujoco.reacher_v4:ReacherEnv', reward_threshold=-3.75, nondeterministic=False, max_episode_steps=50, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='Reacher', version=4, additional_wrappers=(), vector_entry_point=None), 'Pusher-v2': EnvSpec(id='Pusher-v2', entry_point='gymnasium.envs.mujoco:PusherEnv', reward_threshold=0.0, nondeterministic=False, max_episode_steps=100, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='Pusher', version=2, additional_wrappers=(), vector_entry_point=None), 'Pusher-v4': EnvSpec(id='Pusher-v4', entry_point='gymnasium.envs.mujoco.pusher_v4:PusherEnv', reward_threshold=0.0, nondeterministic=False, max_episode_steps=100, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='Pusher', version=4, additional_wrappers=(), vector_entry_point=None), 'InvertedPendulum-v2': EnvSpec(id='InvertedPendulum-v2', entry_point='gymnasium.envs.mujoco:InvertedPendulumEnv', reward_threshold=950.0, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='InvertedPendulum', version=2, additional_wrappers=(), vector_entry_point=None), 'InvertedPendulum-v4': EnvSpec(id='InvertedPendulum-v4', entry_point='gymnasium.envs.mujoco.inverted_pendulum_v4:InvertedPendulumEnv', reward_threshold=950.0, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='InvertedPendulum', version=4, additional_wrappers=(), vector_entry_point=None), 'InvertedDoublePendulum-v2': EnvSpec(id='InvertedDoublePendulum-v2', entry_point='gymnasium.envs.mujoco:InvertedDoublePendulumEnv', reward_threshold=9100.0, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='InvertedDoublePendulum', version=2, additional_wrappers=(), vector_entry_point=None), 'InvertedDoublePendulum-v4': EnvSpec(id='InvertedDoublePendulum-v4', entry_point='gymnasium.envs.mujoco.inverted_double_pendulum_v4:InvertedDoublePendulumEnv', reward_threshold=9100.0, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='InvertedDoublePendulum', version=4, additional_wrappers=(), vector_entry_point=None), 'HalfCheetah-v2': EnvSpec(id='HalfCheetah-v2', entry_point='gymnasium.envs.mujoco:HalfCheetahEnv', reward_threshold=4800.0, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='HalfCheetah', version=2, additional_wrappers=(), vector_entry_point=None), 'HalfCheetah-v3': EnvSpec(id='HalfCheetah-v3', entry_point='gymnasium.envs.mujoco.half_cheetah_v3:HalfCheetahEnv', reward_threshold=4800.0, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='HalfCheetah', version=3, additional_wrappers=(), vector_entry_point=None), 'HalfCheetah-v4': EnvSpec(id='HalfCheetah-v4', entry_point='gymnasium.envs.mujoco.half_cheetah_v4:HalfCheetahEnv', reward_threshold=4800.0, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='HalfCheetah', version=4, additional_wrappers=(), vector_entry_point=None), 'Hopper-v2': EnvSpec(id='Hopper-v2', entry_point='gymnasium.envs.mujoco:HopperEnv', reward_threshold=3800.0, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='Hopper', version=2, additional_wrappers=(), vector_entry_point=None), 'Hopper-v3': EnvSpec(id='Hopper-v3', entry_point='gymnasium.envs.mujoco.hopper_v3:HopperEnv', reward_threshold=3800.0, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='Hopper', version=3, additional_wrappers=(), vector_entry_point=None), 'Hopper-v4': EnvSpec(id='Hopper-v4', entry_point='gymnasium.envs.mujoco.hopper_v4:HopperEnv', reward_threshold=3800.0, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='Hopper', version=4, additional_wrappers=(), vector_entry_point=None), 'Swimmer-v2': EnvSpec(id='Swimmer-v2', entry_point='gymnasium.envs.mujoco:SwimmerEnv', reward_threshold=360.0, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='Swimmer', version=2, additional_wrappers=(), vector_entry_point=None), 'Swimmer-v3': EnvSpec(id='Swimmer-v3', entry_point='gymnasium.envs.mujoco.swimmer_v3:SwimmerEnv', reward_threshold=360.0, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='Swimmer', version=3, additional_wrappers=(), vector_entry_point=None), 'Swimmer-v4': EnvSpec(id='Swimmer-v4', entry_point='gymnasium.envs.mujoco.swimmer_v4:SwimmerEnv', reward_threshold=360.0, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='Swimmer', version=4, additional_wrappers=(), vector_entry_point=None), 'Walker2d-v2': EnvSpec(id='Walker2d-v2', entry_point='gymnasium.envs.mujoco:Walker2dEnv', reward_threshold=None, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='Walker2d', version=2, additional_wrappers=(), vector_entry_point=None), 'Walker2d-v3': EnvSpec(id='Walker2d-v3', entry_point='gymnasium.envs.mujoco.walker2d_v3:Walker2dEnv', reward_threshold=None, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='Walker2d', version=3, additional_wrappers=(), vector_entry_point=None), 'Walker2d-v4': EnvSpec(id='Walker2d-v4', entry_point='gymnasium.envs.mujoco.walker2d_v4:Walker2dEnv', reward_threshold=None, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='Walker2d', version=4, additional_wrappers=(), vector_entry_point=None), 'Ant-v2': EnvSpec(id='Ant-v2', entry_point='gymnasium.envs.mujoco:AntEnv', reward_threshold=6000.0, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='Ant', version=2, additional_wrappers=(), vector_entry_point=None), 'Ant-v3': EnvSpec(id='Ant-v3', entry_point='gymnasium.envs.mujoco.ant_v3:AntEnv', reward_threshold=6000.0, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='Ant', version=3, additional_wrappers=(), vector_entry_point=None), 'Ant-v4': EnvSpec(id='Ant-v4', entry_point='gymnasium.envs.mujoco.ant_v4:AntEnv', reward_threshold=6000.0, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='Ant', version=4, additional_wrappers=(), vector_entry_point=None), 'Humanoid-v2': EnvSpec(id='Humanoid-v2', entry_point='gymnasium.envs.mujoco:HumanoidEnv', reward_threshold=None, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='Humanoid', version=2, additional_wrappers=(), vector_entry_point=None), 'Humanoid-v3': EnvSpec(id='Humanoid-v3', entry_point='gymnasium.envs.mujoco.humanoid_v3:HumanoidEnv', reward_threshold=None, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='Humanoid', version=3, additional_wrappers=(), vector_entry_point=None), 'Humanoid-v4': EnvSpec(id='Humanoid-v4', entry_point='gymnasium.envs.mujoco.humanoid_v4:HumanoidEnv', reward_threshold=None, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='Humanoid', version=4, additional_wrappers=(), vector_entry_point=None), 'HumanoidStandup-v2': EnvSpec(id='HumanoidStandup-v2', entry_point='gymnasium.envs.mujoco:HumanoidStandupEnv', reward_threshold=None, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='HumanoidStandup', version=2, additional_wrappers=(), vector_entry_point=None), 'HumanoidStandup-v4': EnvSpec(id='HumanoidStandup-v4', entry_point='gymnasium.envs.mujoco.humanoidstandup_v4:HumanoidStandupEnv', reward_threshold=None, nondeterministic=False, max_episode_steps=1000, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='HumanoidStandup', version=4, additional_wrappers=(), vector_entry_point=None), 'GymV21Environment-v0': EnvSpec(id='GymV21Environment-v0', entry_point=<function _raise_shimmy_error at 0x000001DA8BDD6F20>, reward_threshold=None, nondeterministic=False, max_episode_steps=None, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='GymV21Environment', version=0, additional_wrappers=(), vector_entry_point=None), 'GymV26Environment-v0': EnvSpec(id='GymV26Environment-v0', entry_point=<function _raise_shimmy_error at 0x000001DA8BDD6F20>, reward_threshold=None, nondeterministic=False, max_episode_steps=None, order_enforce=True, autoreset=False, disable_env_checker=False, apply_api_compatibility=False, kwargs={}, namespace=None, name='GymV26Environment', version=0, additional_wrappers=(), vector_entry_point=None)}

 

 

왜 GYM을 사용해야 하는가?

https://www.edwith.org/move37/lecture/59776/?isDesc=false 발췌

 

강화학습(RL)은 의사 결정과 운동 제어와 관련된 머신 러닝의 세부 분야입니다. 강화학습은 에이전트가 복잡하고 불확실한 환경에서 목표를 달성하는 과정을 배우는 방법을 연구합니다. 이러한 연구는 다음의 두 가지 이유 때문에 주목받고 있습니다:

  • 강화학습은 의사결정과 관련된 모든 문제를 포괄할 수 있는 매우 일반적인 방법입니다: 예를 들어, 로봇의 모터를 작동해서 달리거나 뛰도록 할 수도 있고, 회사에서 가격 책정이나 재고 관리와 같은 결정을 내리도록 할 수도 있고, 비디오 게임 보드게임을 하도록 할 수도 있습니다. 강화학습은 순차적 혹은 구조적인 출력값을 가지는 지도학습 문제에도 적용할 수 있습니다. 
  • 강화학습 알고리즘은 어려운 환경에서도 좋은 결과를 얻기 시작했습니다. 강화학습의 역사는 길지만, 최근에 딥 러닝에 대한 연구가 진행되기 전까지는 문제별로 다른 엔지니어링 방식이 필요했습니다. 딥마인드의 아타리(Atari) 연구 결과, Pieter Abbeel 연구단의 BRETT, 그리고 알파고는 모두 자신의 환경에 대해 많은 추정을 하지 않는 딥 강화학습 알고리즘을 사용했기 때문에 다른 환경에도 이를 적용할 수 있었습니다.

하지만 강화학습 연구는 다음 두 가지의 이유로 인해 그 속도가 느려지고 있습니다:

  • 더 나은 벤치마킹이 필요해지고 있습니다. 지도 학습에 대한 연구는 ImageNet과 같은 대규모의 라벨링 된 데이터를 가지고 진행되어 왔습니다. 강화학습에서도 이처럼 연구를 위해 필요한 것은 대규모의 다양한 환경의 집합입니다. 하지만 기존의 강화학습 환경에 대한 오픈 소스들은 다양하지 않고, 설치하고 사용하기조차 어려운 경우가 많습니다.
  • 강화학습 관련 자료들에 사용되는 환경들이 표준화되어 있지 않습니다. 보상 함수나 행동 집합과 같은 문제 정의에서의 미묘한 차이는 연구를 아주 어렵게 만듭니다. 이러한 문제로 인해 발표된 연구 결과를 재현하거나 이를 다른 논문과 비교하는 것이 어려워집니다.

Gym은 이러한 두 문제를 해결하기 위해 만들어졌습니다.

반응형