[PyTorch로 시작하는 강화학습 입문] 1편: 강화학습과 PyTorch 소개, 개발환경 준비, 그리고 첫 실행 예제

강화학습(Reinforcement Learning, RL)은 에이전트(Agent)가 환경(Environment)과 상호작용하며 보상(Reward)을 최대화할 수 있는 정책(Policy)을 학습하는 기계학습 분야입니다. 최근 딥러닝 기술과 결합되어, Atari 게임을 수준 높게 공략하거나 로봇팔 제어, 자율주행 의사결정, 바둑·스타크래프트 같은 복잡한 게임에서 인간 프로나 챔피언을 능가하는 성능을 선보이면서 큰 주목을 받았습니다.

이 시리즈에서는 RL에 처음 입문하는 독자를 위해, 파이썬과 PyTorch를 활용해 기본적인 강화학습 알고리즘을 단계적으로 구현하고 실험해 볼 예정입니다. 이 과정을 따라가며 RL의 기본 구조와 PyTorch를 사용한 신경망 연산을 체득할 수 있습니다. 이번 글에서는 먼저 강화학습 개념을 가볍게 되짚어보고, PyTorch가 왜 딥러닝 구현에 널리 쓰이는지 알아본 뒤, 개발환경을 준비하고, 간단한 예제를 통해 RL 환경(OpenAI Gym)을 실행해 보겠습니다. 아직은 학습 없이 "랜덤" 행동을 하는 에이전트를 돌려보며, 이후 진짜 알고리즘을 적용하기 위한 발판을 마련하는 데 초점을 둡니다.

강화학습 기초 개념

강화학습의 핵심은 다음과 같은 상호작용 구조에 있습니다.

  • 에이전트(Agent): 정책(Policy)에 따라 행동(Action)을 선택하는 주체
  • 환경(Environment): 에이전트의 행동을 받아 다음 상태(State)와 보상(Reward)을 반환하는 외부 세계
  • 상태(State): 환경이 현재 상황을 묘사하는 정보(예: 카트폴에서 카트 위치와 막대 기울기)
  • 행동(Action): 에이전트가 환경에 취할 수 있는 선택(예: 왼쪽/오른쪽으로 카트 이동)
  • 보상(Reward): 행동 결과로 환경에서 받는 실수값 신호. 에이전트는 보상을 최대화하는 방향으로 정책을 개선하려 함.

에이전트는 env.reset()으로 환경을 초기화하고 상태를 받고, env.step(action)으로 행동을 취해 다음 상태와 보상을 얻습니다. 이를 반복하며 에피소드(episode)를 구성하고, 여러 에피소드를 통해 정책을 점진적으로 개선합니다. 이번 글에서는 아직 개선 없이 랜덤 행동을 할 것이지만, 이후 글에서 Q-learning, Policy Gradient 등 알고리즘을 도입하며 점차 '똑똑한' 에이전트를 만들게 될 것입니다.

왜 PyTorch인가?

과거 딥러닝 연구자들은 주로 Lua 기반 Torch 라이브러리를 사용했으며, 이후 TensorFlowCaffe 같은 프레임워크가 등장하여 파이썬 기반으로 널리 쓰였습니다. 그러나 TensorFlow 초기 버전은 정적 그래프(Static Graph) 방식으로, 모델 정의와 실행을 분리하는 패러다임을 가졌습니다. 이는 대규모 프로덕션 환경에서는 장점이 있지만, 연구나 프로토타이핑 단계에서는 코드 디버깅과 실험이 불편했습니다.

PyTorch는 2017년 등장 후 빠르게 인기를 얻었는데, 그 이유는 다음과 같습니다.

  • 즉시 실행(Eager Execution) 방식: 파이썬 코드처럼 직관적으로 모델 연산을 정의하고 바로 실행·디버깅 가능
  • 유연한 API: 파이썬과 유사한 문법, 풍부한 텐서 연산, 직관적인 자동미분(Autograd) 지원
  • 활발한 커뮤니티: 연구용 구현체나 튜토리얼, 예제 코드가 풍부하며, 최신 논문 구현이 빠르게 공유됨
  • 분야별 응용 용이성: 컴퓨터 비전, 자연어 처리, 강화학습 등 다양한 분야에 쓰이는 레퍼런스 코드 존재

TensorFlow나 JAX 같은 다른 딥러닝 라이브러리도 있지만, RL 연구자나 입문자에게 PyTorch는 코드 이해와 실험 과정을 단순화해 주기 때문에 상당히 유리합니다. 또한 많은 RL 알고리즘 구현 예제가 PyTorch 기반으로 제공되고 있어 자료 수급에도 편리합니다.

개발환경 준비 상세 가이드

다음은 개발환경을 준비하는 방법 중 하나의 예입니다. Conda나 venv를 활용하면 프로젝트별 패키지 관리가 용이하므로 권장합니다.

1. Python 3.x 설치:

Python 공식 홈페이지에서 설치하거나, Miniconda 또는 Anaconda를 설치해 Python 환경 관리 가능.

2. 가상환경 생성(선택적):
Conda 예:

conda create -n rl_env python=3.9
conda activate rl_env

venv 예:

python -m venv rl_env
source rl_env/bin/activate  # Linux/macOS
rl_env\Scripts\activate     # Windows

3. PyTorch 설치:
CPU 전용으로 시작해도 되고, GPU(CUDA) 지원을 원하면 PyTorch 공식 페이지를 참조하세요. 예시(CPU 전용):

pip install torch torchvision torchaudio

4. OpenAI Gym 설치:
RL 실험 환경을 제공하는 라이브러리.

pip install gym

5. 테스트:버전이 잘 출력되면 설치 완료.

python -c "import torch; print(torch.__version__)"
python -c "import gym; print(gym.__version__)"

이후 글에서 사용할 PyTorch 텐서, 네트워크, Autograd 기능, 그리고 Gym 환경 모두 준비가 끝났습니다.

첫 예제: CartPole 환경에서 랜덤 정책 실행

이제 가장 간단한 RL 환경인 CartPole을 실행해보겠습니다. 이 환경은 막대기(pole)가 카트(cart) 위에 세워진 상태를 유지해야 하는 문제로, 왼쪽이나 오른쪽으로 카트를 움직여 막대가 넘어가지 않게 하는 행동을 취해야 합니다. 여기서는 아무런 학습 없이 매 스텝 랜덤 하게 행동을 선택합니다.

코드를 run_random_cartpole.py로 저장한 뒤 실행할 수 있습니다.

import gym
import torch

def run_random_agent(env_name="CartPole-v1", max_episodes=2, max_steps=200):
    env = gym.make(env_name)
    for episode in range(max_episodes):
        state = env.reset()
        total_reward = 0
        for step in range(max_steps):
            action = env.action_space.sample()  # 랜덤 행동
            next_state, reward, done, info = env.step(action)
            total_reward += reward
            state = next_state
            if done:
                print(f"Episode {episode+1} finished after {step+1} steps, total reward: {total_reward}")
                break
    env.close()

def tensor_example():
    x = torch.randn((3,4))
    print("PyTorch 텐서 예제:")
    print(x)
    print("텐서 크기:", x.shape)

if __name__ == "__main__":
    run_random_agent()
    tensor_example()

이 코드를 실행하면, 약 2개의 에피소드 동안 CartPole을 랜덤하게 조작하는 결과를 볼 수 있습니다. 대개 몇십 스텝 안에 막대가 넘어가며 에피소드가 끝나므로, 총 보상은 매우 낮게 나옵니다. 또한 tensor_example()를 통해 PyTorch로 생성한 텐서를 출력하며 텐서의 기본 형태를 살펴볼 수 있습니다.

아직은 RL의 핵심인 "학습" 과정이 없습니다. 하지만 이번 실습으로 환경과 상호작용하는 기본 흐름(state, action, reward, done)을 체감하고, PyTorch 텐서를 다루는 최소한의 워밍업을 마쳤습니다. 다음 글부터는 Q함수(Value-based) 개념을 도입하고, PyTorch로 신경망을 구성해 Q값을 근사하며 랜덤 정책보다 유용한 행동을 선택할 수 있는 간단한 알고리즘을 구현해 볼 것입니다.

마무리

이번 글에서는 강화학습의 기본 아이디어를 간단히 되짚어보고, PyTorch와 그것이 개발자·연구자들 사이에서 인기를 끌게 된 이유, 그리고 다른 라이브러리에 비해 어떤 장점을 가지는지 살펴보았습니다. 또한 개발환경 구축 과정을 단계별로 안내하고, CartPole 환경에서 랜덤 행동 에이전트를 돌려보며 RL 환경의 기본 동작 원리를 실감했습니다.

앞으로 시리즈를 따라가며 RL 알고리즘을 하나씩 구현해보면, 점점 더 복잡한 문제를 다룰 수 있게 될 것이며, PyTorch로 딥러닝 모델을 유연하게 구성하고 개선하는 능력을 자연스럽게 얻게 될 것입니다.

반응형