Métodos de Monte Carlo

Reinforcement Learning com Gymnasium em Python

Fouad Trad

Machine Learning Engineer

Recap: aprendizado com modelo

 

  • Depende da dinâmica do ambiente
  • Sem interação com o ambiente

Diagramas de iteração de política e de valor, vistos no vídeo anterior.

Reinforcement Learning com Gymnasium em Python

Aprendizado sem modelo

 

  • Não depende da dinâmica do ambiente
  • Agente interage com o ambiente
  • Aprende a política por tentativa e erro
  • Mais adequado para aplicações reais

Imagem de um robô interagindo com um ambiente de xadrez.

Reinforcement Learning com Gymnasium em Python

Métodos de Monte Carlo

  • Técnicas sem modelo
  • Estimam Q-values a partir de episódios

Imagem mostrando o esqueleto de um episódio coletado: estados, ações, recompensas e retornos.

Reinforcement Learning com Gymnasium em Python

Métodos de Monte Carlo

  • Técnicas sem modelo
  • Estimam Q-values a partir de episódios

Imagem mostrando a segunda etapa de estimar Q-values e como é uma Q-table: linhas = estados, colunas = ações.

Reinforcement Learning com Gymnasium em Python

Métodos de Monte Carlo

  • Técnicas sem modelo
  • Estimam Q-values a partir de episódios

Imagem mostrando a etapa final de obter a política ótima, que mapeia cada estado para a ação ótima.

  • Dois métodos: primeira-visita, toda-visita
Reinforcement Learning com Gymnasium em Python

Grid world customizado

Imagem do grid world customizado com 6 estados (2 linhas, 3 colunas), numerados do canto superior esquerdo (0) ao inferior direito (5). O agente está no estado 3, há uma montanha no 4 e o objetivo no 5.png

Reinforcement Learning com Gymnasium em Python

Coletando dois episódios

Imagem mostrando o primeiro episódio coletado em termos de estados, ações, recompensas e retornos.

Imagem mostrando o segundo episódio coletado em termos de estados, ações, recompensas e retornos.

Reinforcement Learning com Gymnasium em Python

Estimando Q-values

Imagem mostrando estados, ações, recompensas e retornos coletados para os dois episódios.

  • Q-table: tabela de Q-values

Imagem de uma Q-table vazia a ser preenchida.

Reinforcement Learning com Gymnasium em Python

Q(4, esquerda), Q(4, cima) e Q(1, baixo)

Imagem com estados, ações, recompensas e retornos dos dois episódios, com (4, esquerda), (4, cima) e (1, baixo) destacados.

  • (s,a) aparece uma vez -> preenche com o retorno

Q-table com os valores de (4, esquerda), (4, cima) e (1, baixo) preenchidos.

Reinforcement Learning com Gymnasium em Python

Q(4, direita)

Imagem com estados, ações, recompensas e retornos dos dois episódios, com (4, direita) destacado em ambos

  • (s,a) ocorre uma vez por episódio -> faça a média

Q-table com o valor de (4, direita) preenchido pela média dos retornos dos dois episódios.

Reinforcement Learning com Gymnasium em Python

Q(3, direita) - Monte Carlo de primeira visita

Imagem com estados, ações, recompensas e retornos dos dois episódios, com (3, direita) destacado só na primeira ocorrência em ambos

  • Faça a média da primeira visita a (s,a) nos episódios

Q-table com o valor de (3, direita) pela média dos retornos nas linhas destacadas (primeiras ocorrências de (3, direita)).

Reinforcement Learning com Gymnasium em Python

Q(3, direita) - Monte Carlo de toda visita

Imagem com estados, ações, recompensas e retornos dos dois episódios, com (3, direita) destacado em todas as ocorrências

  • Faça a média de todas as visitas a (s,a) nos episódios

Q-table com o valor de (3, direita) pela média dos retornos nas linhas destacadas (todas as ocorrências de (3, direita)).

Reinforcement Learning com Gymnasium em Python

Gerando um episódio

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
Reinforcement Learning com Gymnasium em Python

Monte Carlo de primeira visita

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
Reinforcement Learning com Gymnasium em Python

Monte Carlo de toda visita

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
Reinforcement Learning com Gymnasium em Python

Obtendo a política ótima

def get_policy():
    policy = {state: np.argmax(Q[state]) for state in range(num_states)}    
    return policy
Reinforcement Learning com Gymnasium em Python

Juntando tudo

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}

Imagem mostrando a política ótima com a ação ótima em cada estado em forma de setas.

Reinforcement Learning com Gymnasium em Python

Vamos praticar!

Reinforcement Learning com Gymnasium em Python

Preparing Video For Download...