개발 창고/AI

MCP(Monte Carlo Prediction)란? 강화학습 기초 개념과 파이썬 예제로 쉽게 이해하기

Royzero 2025. 7. 4. 22:00
반응형

MCP(Monte Carlo Prediction)란 무엇인가요?

강화학습에서는 에이전트가 환경과 상호작용하면서 어떤 상태(state)가 얼마나 좋은지를 학습하게 됩니다. 이때 상태의 가치를 예측하는 대표적인 방법 중 하나가 MCP(Monte Carlo Prediction) 입니다.

예시로 쉽게 설명드리겠습니다

예를 들어, 어떤 게임을 여러 번 플레이한 뒤 특정 위치에서 시작하면 평균적으로 200점이 나온다는 사실을 알게 되었다고 가정해보겠습니다. 이렇게 여러 번의 경험을 바탕으로 기대 보상을 계산하는 방식이 바로 MCP입니다.

즉, 한 번의 경험으로 결정하지 않고, 여러 번의 시도를 통해 어떤 상태에서 얼마만큼의 보상을 기대할 수 있는지를 예측하는 방식입니다.


MCP의 핵심 아이디어

  • 전체 에피소드(처음부터 끝까지의 한 번의 시뮬레이션)를 실행한 뒤,
  • 각 상태에서 받은 보상의 총합(누적 리턴)을 기반으로
  • 해당 상태의 가치를 평균값으로 계산합니다.

이는 다음과 같은 수식으로 표현됩니다.

$$
V(s) = \mathbb{E}[G_t \mid S_t = s]
$$

여기서

  • $V(s)$: 상태 $s$의 가치(value)
  • $G_t$: 시점 $t$부터 종료 시점까지 받은 총 보상(return)입니다.

파이썬 예제 (Blackjack 환경)

강화학습 라이브러리인 gymnasium의 Blackjack 환경을 활용하여 MCP를 구현한 예제를 소개해드립니다.

import gym
import numpy as np
from collections import defaultdict

env = gym.make('Blackjack-v1', sab=True)

# 상태별 리턴 총합과 방문 횟수 저장
returns_sum = defaultdict(float)
returns_count = defaultdict(int)
V = defaultdict(float)  # 상태 가치 함수

# 에피소드 생성 함수
def generate_episode(env, policy):
    episode = []
    state = env.reset()[0]
    while True:
        action = policy(state)
        next_state, reward, terminated, truncated, _ = env.step(action)
        episode.append((state, action, reward))
        state = next_state
        if terminated or truncated:
            break
    return episode

# 단순 정책: 플레이어 합이 20 이상이면 스탠드, 아니면 히트
def simple_policy(state):
    return 0 if state[0] >= 20 else 1

# MCP 알고리즘
num_episodes = 500000
for i in range(num_episodes):
    episode = generate_episode(env, simple_policy)
    visited_states = set()
    G = 0
    # 리워드 역순으로 합산
    for t in reversed(range(len(episode))):
        state, _, reward = episode[t]
        G = reward + G  # 누적 리턴
        if state not in visited_states:
            returns_sum[state] += G
            returns_count[state] += 1
            V[state] = returns_sum[state] / returns_count[state]
            visited_states.add(state)

# 일부 상태 출력
for state in list(V.keys())[:10]:
    print(f"State: {state}, Estimated Value: {V[state]:.2f}")

정리하며

  • MCP는 에피소드가 끝난 후 상태의 가치를 업데이트합니다.
  • 경험을 축적한 후 평균을 구하기 때문에 신뢰도 있는 예측이 가능합니다.
  • 단점은 매번 에피소드를 끝까지 실행해야 하므로 실시간 업데이트가 어렵다는 점입니다.
반응형