기본 사용법

Gymnasium은 모든 단일 에이전트 강화 학습 환경을 위한 API(애플리케이션 프로그래밍 인터페이스)를 제공하는 프로젝트이며, cartpole, pendulum, mountain-car, mujoco, atari 등과 같은 일반적인 환경의 구현체도 포함합니다. 이 페이지에서는 Gymnasium의 기본 사용법을 네 가지 핵심 함수인 make(), Env.reset(), Env.step(), :meth:`Env.render`를 포함하여 설명합니다.

Gymnasium의 핵심은 강화 학습 이론의 마르코프 결정 과정(MDP)을 나타내는 상위 수준의 파이썬 클래스인 :class:`Env`입니다(참고: 이는 완벽한 재구성이 아니며 MDP의 여러 구성 요소가 누락되어 있습니다). 이 클래스는 사용자에게 초기 상태를 생성하고, 주어진 행동에 따라 새로운 상태로 전이/이동하며, 환경을 시각화할 수 있는 기능을 제공합니다. :class:`Env`와 함께, :class:`Wrapper`는 특히 에이전트 관찰, 보상 및 취해진 행동을 포함하여 환경을 증강/수정하는 데 도움이 되도록 제공됩니다.

환경 초기화

Gymnasium에서 환경 초기화는 매우 쉬우며, make() 함수를 통해 수행할 수 있습니다.

import gymnasium as gym
env = gym.make('CartPole-v1')

이 함수는 사용자가 상호작용할 수 있는 :class:`Env`를 반환합니다. 생성할 수 있는 모든 환경을 보려면 :meth:`pprint_registry`를 사용하세요. 또한, :meth:`make`는 환경에 키워드를 지정하고, 래퍼를 추가/제거하는 등 여러 추가 인수를 제공합니다. 자세한 내용은 :meth:`make`를 참조하세요.

환경과 상호작용하기

강화 학습에서 아래에 그려진 고전적인 “에이전트-환경 루프”는 에이전트와 환경이 서로 어떻게 상호작용하는지에 대한 단순화된 표현입니다. 에이전트는 환경에 대한 관찰을 받고, 에이전트는 행동을 선택하며, 환경은 이를 사용하여 보상과 다음 관찰을 결정합니다. 이 주기는 환경이 끝날(종료될) 때까지 반복됩니다.

../../_images/AE_loop.png ../../_images/AE_loop_dark.png

Gymnasium의 경우, “에이전트-환경 루프”는 단일 에피소드(환경이 끝날 때까지)에 대해 아래에 구현되어 있습니다. 각 줄에 대한 설명은 다음 섹션을 참조하세요. 이 코드를 실행하려면 swig를 설치(pip install swig, 다운로드, 또는 macOS 사용 시 Homebrew를 통해)하고 pip install "gymnasium[box2d]"를 설치해야 합니다.

import gymnasium as gym

env = gym.make("LunarLander-v3", render_mode="human")
observation, info = env.reset()

episode_over = False
while not episode_over:
    action = env.action_space.sample()  # agent policy that uses the observation and info
    observation, reward, terminated, truncated, info = env.step(action)

    episode_over = terminated or truncated

env.close()

출력은 다음과 같을 것입니다.

https://user-images.githubusercontent.com/15806078/153222406-af5ce6f0-4696-4a24-a683-46ad4939170c.gif

코드 설명

먼저, 환경이 어떻게 시각화되어야 하는지를 지정하는 추가 키워드 "render_mode"``와 함께 :meth:`make`를 사용하여 환경을 생성합니다. 다양한 렌더 모드의 기본 의미에 대한 자세한 내용은 :meth:`Env.render`를 참조하세요. 예시에서는 에이전트가 안전하게 착륙해야 하는 우주선을 제어하는 ``"LunarLander" 환경을 사용합니다.

환경 초기화 후, 환경의 첫 번째 관찰과 추가 정보를 얻기 위해 환경을 Env.reset`합니다. 특정 랜덤 시드 또는 옵션(가능한 값은 환경 문서를 참조)으로 환경을 초기화하려면 :meth:`reset`에 ``seed`() 또는 options 매개변수를 사용하세요.

환경이 끝날 때까지(알 수 없는 수의 타임스텝) 에이전트-환경 루프를 계속하고자 하므로, 환경과의 상호 작용을 언제 멈춰야 하는지 알기 위한 변수 ``episode_over``와 이를 사용하는 while 루프를 정의합니다.

다음으로, 에이전트는 환경에서 행동을 수행하며, :meth:`Env.step`은 선택된 행동(이 경우 ``env.action_space.sample()``로 무작위 행동)을 실행하여 환경을 업데이트합니다. 이 행동은 로봇을 움직이거나 게임 컨트롤러의 버튼을 눌러 환경 내 변화를 일으키는 것으로 상상할 수 있습니다. 결과적으로 에이전트는 업데이트된 환경으로부터 새로운 관찰과 행동을 취한 것에 대한 보상을 받습니다. 이 보상은 예를 들어 적을 파괴하면 양수, 용암 속으로 이동하면 음수일 수 있습니다. 이러한 하나의 행동-관찰 교환을 **타임스텝**이라고 합니다.

그러나 일부 타임스텝 후 환경이 끝날 수 있습니다. 이를 종료 상태(terminal state)라고 합니다. 예를 들어 로봇이 충돌했거나 작업을 성공적으로 완료했을 경우, 에이전트가 더 이상 진행할 수 없으므로 환경을 멈춰야 합니다. Gymnasium에서는 환경이 종료되었으면 step`에서 번째 변수 ``terminated``로 반환됩니다. 마찬가지로, 고정된 수의 타임스텝 환경을 종료하고 싶을 수도 있습니다. 경우 환경은 truncated 신호를 발생시킵니다. ``terminated`() 또는 truncated 둘 중 하나라도 ``True``이면 에피소드를 종료하지만, 대부분의 경우 사용자는 환경을 재시작하고 싶을 수 있으며 이는 ``env.reset()``으로 할 수 있습니다.

행동 및 관찰 공간

모든 환경은 유효한 행동 및 관찰의 형식을 action_spaceobservation_space 속성으로 지정합니다. 이는 환경의 예상 입력 및 출력을 모두 아는 데 도움이 되며, 모든 유효한 행동 및 관찰은 해당 공간 내에 포함되어야 합니다. 위의 예시에서는 에이전트 정책을 사용하여 관찰을 행동에 매핑하는 대신 ``env.action_space.sample()``을 통해 무작위 행동을 샘플링했습니다.

중요한 점은 Env.action_spaceEnv.observation_space`가 주요 함수인 :meth:`Space.contains 및 :meth:`Space.sample`를 제공하는 상위 수준 파이썬 클래스인 :class:`Space`의 인스턴스라는 것입니다. Gymnasium은 사용자가 필요할 수 있는 다양한 공간을 지원합니다.

  • Box: n차원 형상의 상한 및 하한을 가진 경계 공간을 설명합니다.

  • Discrete: ``{0, 1, …, n-1}``이 관찰 또는 행동이 취할 수 있는 가능한 값인 이산 공간을 설명합니다.

  • MultiBinary: n차원 형상의 이진 공간을 설명합니다.

  • MultiDiscrete: 각 요소에 다른 수의 행동이 있는 일련의 Discrete 행동 공간으로 구성됩니다.

  • Text: 최소 및 최대 길이를 가진 문자열 공간을 설명합니다.

  • Dict: 더 간단한 공간들의 딕셔너리를 설명합니다.

  • Tuple: 더 간단한 공간들의 튜플을 설명합니다.

  • Graph: 노드와 엣지가 서로 연결된 수학적 그래프(네트워크)를 설명합니다.

  • Sequence: 가변 길이의 더 간단한 공간 요소들을 설명합니다.

공간 사용 예시는 문서유틸리티 함수 <../api/spaces/utils>`_를 참조하세요. :class:`Graph, Sequence, :class:`Text`와 같은 몇 가지 더 틈새 시장 공간도 있습니다.

환경 수정하기

래퍼는 기본 코드를 직접 변경하지 않고도 기존 환경을 수정할 수 있는 편리한 방법입니다. 래퍼를 사용하면 많은 상용구 코드를 피하고 환경을 더 모듈화할 수 있습니다. 래퍼는 효과를 결합하기 위해 연결될 수도 있습니다. gymnasium.make`를 통해 생성되는 대부분의 환경은 기본적으로 :class:`TimeLimit(), OrderEnforcing, :class:`PassiveEnvChecker`를 사용하여 이미 래핑됩니다.

환경을 래핑하려면 먼저 기본 환경을 초기화해야 합니다. 그런 다음 이 환경을 (선택적일 수 있는) 매개변수와 함께 래퍼의 생성자에 전달할 수 있습니다.

>>> import gymnasium as gym
>>> from gymnasium.wrappers import FlattenObservation
>>> env = gym.make("CarRacing-v3")
>>> env.observation_space.shape
(96, 96, 3)
>>> wrapped_env = FlattenObservation(env)
>>> wrapped_env.observation_space.shape
(27648,)

Gymnasium은 이미 흔히 사용되는 많은 래퍼를 제공합니다. 몇 가지 예시는 다음과 같습니다.

  • TimeLimit: 최대 타임스텝 수를 초과했거나(또는 기본 환경이 truncated 신호를 발생시켰을 경우) truncated 신호를 발생시킵니다.

  • ClipAction: ``step``에 전달된 모든 행동이 기본 환경의 행동 공간 내에 있도록 클립합니다.

  • RescaleAction: 환경의 새로운 하한 및 상한에 대해 선형적으로 스케일링하기 위해 행동에 아핀 변환을 적용합니다.

  • TimeAwareObservation: 타임스텝의 인덱스에 대한 정보를 관찰에 추가합니다. 어떤 경우에는 전이가 마르코프 속성을 가지도록 보장하는 데 도움이 됩니다.

Gymnasium에 구현된 래퍼의 전체 목록은 래퍼를 참조하세요.

래핑된 환경이 있고, 모든 래퍼 레이어 아래에 있는 래핑되지 않은 기본 환경을 가져오고 싶다면(수동으로 함수를 호출하거나 환경의 기본 측면을 변경하기 위해), unwrapped 속성을 사용할 수 있습니다. 환경이 이미 기본 환경인 경우, unwrapped 속성은 단순히 자신을 반환합니다.

>>> wrapped_env
<FlattenObservation<TimeLimit<OrderEnforcing<PassiveEnvChecker<CarRacing<CarRacing-v3>>>>>>
>>> wrapped_env.unwrapped
<gymnasium.envs.box2d.car_racing.CarRacing object at 0x7f04efcb8850>

추가 정보