Introducció

L'aprenentatge per reforç (RL) és una branca de l'aprenentatge automàtic on un agent aprèn a prendre decisions mitjançant la interacció amb un entorn. L'objectiu és maximitzar una recompensa acumulada al llarg del temps. En aquest mòdul, explorarem els conceptes bàsics de l'aprenentatge per reforç i com implementar-lo utilitzant PyTorch.

Conceptes Clau

  1. Agent: L'entitat que pren decisions.
  2. Entorn: El món amb el qual l'agent interactua.
  3. Acció (A): Les decisions que l'agent pot prendre.
  4. Estat (S): La representació de la situació actual de l'entorn.
  5. Recompensa (R): El feedback que l'agent rep després de prendre una acció.
  6. Política (π): La funció que l'agent utilitza per decidir quina acció prendre en cada estat.
  7. Funció de valor (V): Una funció que estima la recompensa esperada a llarg termini des d'un estat donat.

Implementació d'un Agent de Q-Learning amb PyTorch

Pas 1: Configuració de l'Entorn

Utilitzarem gym, una biblioteca popular per a l'aprenentatge per reforç, per crear el nostre entorn.

import gym
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np

# Creem l'entorn
env = gym.make('CartPole-v1')

Pas 2: Definició de la Xarxa Neuronal

Definirem una xarxa neuronal simple per estimar la funció Q.

class QNetwork(nn.Module):
    def __init__(self, state_size, action_size):
        super(QNetwork, self).__init__()
        self.fc1 = nn.Linear(state_size, 64)
        self.fc2 = nn.Linear(64, 64)
        self.fc3 = nn.Linear(64, action_size)
    
    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        x = self.fc3(x)
        return x

state_size = env.observation_space.shape[0]
action_size = env.action_space.n
q_network = QNetwork(state_size, action_size)

Pas 3: Definició de la Política d'Exploració

Utilitzarem una política epsilon-greedy per equilibrar l'exploració i l'explotació.

def epsilon_greedy_policy(state, epsilon):
    if np.random.rand() < epsilon:
        return env.action_space.sample()  # Exploració
    else:
        state = torch.FloatTensor(state).unsqueeze(0)
        q_values = q_network(state)
        return torch.argmax(q_values).item()  # Explotació

Pas 4: Entrenament de l'Agent

Definirem el bucle d'entrenament per actualitzar la xarxa neuronal.

optimizer = optim.Adam(q_network.parameters(), lr=0.001)
criterion = nn.MSELoss()

num_episodes = 1000
gamma = 0.99
epsilon = 1.0
epsilon_decay = 0.995
min_epsilon = 0.01

for episode in range(num_episodes):
    state = env.reset()
    total_reward = 0
    
    for t in range(200):
        action = epsilon_greedy_policy(state, epsilon)
        next_state, reward, done, _ = env.step(action)
        total_reward += reward
        
        # Calcula el valor objectiu
        next_state = torch.FloatTensor(next_state).unsqueeze(0)
        target = reward + gamma * torch.max(q_network(next_state)).item() * (1 - done)
        
        # Actualitza la xarxa neuronal
        state = torch.FloatTensor(state).unsqueeze(0)
        q_values = q_network(state)
        target_f = q_values.clone()
        target_f[0][action] = target
        
        optimizer.zero_grad()
        loss = criterion(q_values, target_f)
        loss.backward()
        optimizer.step()
        
        state = next_state.squeeze(0).numpy()
        
        if done:
            break
    
    epsilon = max(min_epsilon, epsilon * epsilon_decay)
    print(f'Episodi {episode+1}/{num_episodes}, Recompensa: {total_reward}, Epsilon: {epsilon:.2f}')

Pas 5: Validació de l'Agent

Després de l'entrenament, validarem l'agent per veure com de bé ha après a jugar.

state = env.reset()
total_reward = 0

for t in range(200):
    env.render()
    action = epsilon_greedy_policy(state, 0.01)  # Utilitzem un epsilon molt baix per maximitzar l'explotació
    next_state, reward, done, _ = env.step(action)
    total_reward += reward
    state = next_state
    
    if done:
        break

print(f'Recompensa total durant la validació: {total_reward}')
env.close()

Exercicis Pràctics

  1. Modifica la Xarxa Neuronal: Prova d'afegir més capes o canviar la mida de les capes existents per veure com afecta el rendiment de l'agent.
  2. Canvia l'Entorn: Utilitza un entorn diferent de gym i adapta el codi per entrenar l'agent en aquest nou entorn.
  3. Implementa DQN: Implementa Deep Q-Learning Network (DQN) amb una xarxa de target per millorar l'estabilitat de l'entrenament.

Conclusió

En aquest mòdul, hem après els conceptes bàsics de l'aprenentatge per reforç i hem implementat un agent de Q-Learning utilitzant PyTorch. Hem explorat com definir una xarxa neuronal, una política d'exploració i com entrenar l'agent. Els exercicis pràctics proporcionats us ajudaran a aprofundir en aquests conceptes i a experimentar amb diferents configuracions.

© Copyright 2024. Tots els drets reservats