몬테카를로 방법

Python으로 배우는 Gymnasium 기반 Reinforcement Learning

Fouad Trad

Machine Learning Engineer

리캡: 모델 기반 학습

 

  • 환경 동역학 지식에 의존
  • 환경과 상호작용 없음

이전 영상에서 본 정책 반복과 가치 반복 알고리즘 다이어그램.

Python으로 배우는 Gymnasium 기반 Reinforcement Learning

모델 프리 학습

 

  • 환경 동역학 지식에 의존하지 않음
  • 에이전트가 환경과 상호작용
  • 시행착오로 정책 학습
  • 실제 응용에 더 적합

체스 환경과 상호작용하는 로봇 이미지.

Python으로 배우는 Gymnasium 기반 Reinforcement Learning

몬테카를로 방법

  • 모델 프리 기법
  • 에피소드 기반으로 Q-값 추정

상태, 행동, 보상, 리턴으로 구성된 수집된 에피소드의 골격을 보여주는 이미지.

Python으로 배우는 Gymnasium 기반 Reinforcement Learning

몬테카를로 방법

  • 모델 프리 기법
  • 에피소드 기반으로 Q-값 추정

Q-테이블의 형태(행=상태 수, 열=행동 수)를 보여주는 Q-값 추정 2단계 이미지.

Python으로 배우는 Gymnasium 기반 Reinforcement Learning

몬테카를로 방법

  • 모델 프리 기법
  • 에피소드 기반으로 Q-값 추정

각 상태를 최적 행동에 매핑하는 최적 정책 도출의 마지막 단계를 보여주는 이미지.

  • 두 가지: 첫 방문, 모든 방문
Python으로 배우는 Gymnasium 기반 Reinforcement Learning

사용자 지정 그리드월드

2행 3열의 6개 상태로 구성된 사용자 지정 그리드월드 이미지. 좌상단(0)부터 우하단(5)까지 번호가 있으며, 에이전트는 상태 3, 산은 상태 4, 목표는 상태 5에 있음.

Python으로 배우는 Gymnasium 기반 Reinforcement Learning

두 개의 에피소드 수집

상태, 행동, 보상, 리턴으로 구성된 첫 번째 에피소드 수집 이미지.

상태, 행동, 보상, 리턴으로 구성된 두 번째 에피소드 수집 이미지.

Python으로 배우는 Gymnasium 기반 Reinforcement Learning

Q-값 추정

두 에피소드에 대해 수집된 상태, 행동, 보상, 리턴을 보여주는 이미지.

  • Q-테이블: Q-값을 담는 표

채워야 할 빈 Q-테이블 이미지.

Python으로 배우는 Gymnasium 기반 Reinforcement Learning

Q(4, left), Q(4, up), Q(1, down)

두 에피소드의 상태, 행동, 보상, 리턴 중 (4, left), (4, up), (1, down)이 강조된 이미지.

  • (s,a)가 한 번만 등장 -> 해당 리턴으로 채움

Q-테이블에서 (4, left), (4, up), (1, down)의 값이 채워진 이미지.

Python으로 배우는 Gymnasium 기반 Reinforcement Learning

Q(4, right)

두 에피소드 모두에서 (4, right)이 강조된 이미지.

  • (s,a)가 각 에피소드에서 한 번씩 -> 평균값 사용

두 에피소드의 리턴 평균으로 (4, right) 값을 채운 Q-테이블.

Python으로 배우는 Gymnasium 기반 Reinforcement Learning

Q(3, right) - 첫 방문 몬테카를로

두 에피소드에서 (3, right)의 첫 발생만 강조한 이미지.

  • 에피소드 내 (s,a)의 첫 방문 평균

강조된 행(첫 (3, right) 발생)의 리턴 평균으로 값을 채운 Q-테이블.

Python으로 배우는 Gymnasium 기반 Reinforcement Learning

Q(3, right) - 모든 방문 몬테카를로

두 에피소드에서 (3, right)의 모든 발생을 강조한 이미지.

  • 에피소드 내 (s,a)의 모든 방문 평균

모든 (3, right) 발생의 리턴 평균으로 값을 채운 Q-테이블.

Python으로 배우는 Gymnasium 기반 Reinforcement Learning

에피소드 생성

def generate_episode():
    episode = []
    state, info = env.reset()

terminated = False while not terminated: action = env.action_space.sample()
next_state, reward, terminated, truncated, info = env.step(action)
episode.append((state, action, reward)) state = next_state
return episode
Python으로 배우는 Gymnasium 기반 Reinforcement Learning

첫 방문 몬테카를로

def first_visit_mc(num_episodes):
    Q = np.zeros((num_states, num_actions))
    returns_sum = np.zeros((num_states, num_actions))
    returns_count = np.zeros((num_states, num_actions))

for i in range(num_episodes): episode = generate_episode() visited_states_actions = set()
for j, (state, action, reward) in enumerate(episode):
if (state, action) not in visited_states:
returns_sum[state, action] += sum([x[2] for x in episode[j:]])
returns_count[state, action] += 1 visited_states_actions.add((state, action))
nonzero_counts = returns_count != 0
Q[nonzero_counts] = returns_sum[nonzero_counts] / returns_count[nonzero_counts] return Q
Python으로 배우는 Gymnasium 기반 Reinforcement Learning

모든 방문 몬테카를로

def every_visit_mc(num_episodes):
    Q = np.zeros((num_states, num_actions))
    returns_sum = np.zeros((num_states, num_actions))
    returns_count = np.zeros((num_states, num_actions))    

    for i in range(num_episodes):
        episode = generate_episode()  

        for j, (state, action, reward) in enumerate(episode):

            returns_sum[state, action] += sum([x[2] for x in episode[j:]])
            returns_count[state, action] += 1


    nonzero_counts = returns_count != 0
    Q[nonzero_counts] = returns_sum[nonzero_counts] / returns_count[nonzero_counts]
    return Q
Python으로 배우는 Gymnasium 기반 Reinforcement Learning

최적 정책 구하기

def get_policy():
    policy = {state: np.argmax(Q[state]) for state in range(num_states)}    
    return policy
Python으로 배우는 Gymnasium 기반 Reinforcement Learning

종합하기

Q = first_visit_mc(1000)

policy_first_visit = get_policy()
print("First-visit policy: \n", policy_first_visit)
Q = every_visit_mc(1000)
policy_every_visit = get_policy()
print("Every-visit policy: \n", policy_every_visit)
First-visit policy:
{0: 2, 1: 2, 2: 1, 
 3: 2, 4: 2, 5: 0}

Every-visit policy:
{0: 2, 1: 2, 2: 1, 
 3: 2, 4: 2, 5: 0}

각 상태에서의 최적 행동을 화살표로 나타낸 최적 정책 이미지.

Python으로 배우는 Gymnasium 기반 Reinforcement Learning

연습해 봅시다!

Python으로 배우는 Gymnasium 기반 Reinforcement Learning

Preparing Video For Download...