El aprendizaje por refuerzo (RL, por sus siglas en inglés) es un área del aprendizaje automático donde un agente aprende a tomar decisiones mediante la interacción con un entorno. En este módulo, exploraremos cómo implementar algoritmos de aprendizaje por refuerzo utilizando PyTorch.
Contenido
Introducción al Aprendizaje por Refuerzo
El aprendizaje por refuerzo se basa en la idea de que un agente aprende a tomar acciones en un entorno para maximizar una recompensa acumulada. Los componentes clave son:
- Agente: El aprendiz o tomador de decisiones.
- Entorno: Todo lo que el agente interactúa con.
- Acción: Lo que el agente puede hacer.
- Estado: La situación actual del entorno.
- Recompensa: La retroalimentación del entorno como resultado de una acción.
Conceptos Clave
- Política (π): Estrategia que el agente sigue para decidir qué acción tomar en un estado dado.
- Función de Valor (V): Valor esperado de las recompensas acumuladas a partir de un estado.
- Función Q (Q): Valor esperado de las recompensas acumuladas a partir de un estado y una acción.
Configuración del Entorno
Antes de comenzar, asegúrate de tener PyTorch y las bibliotecas necesarias instaladas. Puedes instalar las dependencias con:
Implementación de un Agente RL
Vamos a implementar un agente utilizando el algoritmo Q-Learning, uno de los algoritmos más simples y populares en RL.
Paso 1: Importar Bibliotecas
Paso 2: Definir la Red Neuronal
Definimos una red neuronal simple para aproximar la función 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 xPaso 3: Definir el Agente
class Agent:
def __init__(self, state_size, action_size, lr=0.001, gamma=0.99, epsilon=1.0, epsilon_decay=0.995, epsilon_min=0.01):
self.state_size = state_size
self.action_size = action_size
self.gamma = gamma
self.epsilon = epsilon
self.epsilon_decay = epsilon_decay
self.epsilon_min = epsilon_min
self.qnetwork = QNetwork(state_size, action_size)
self.optimizer = optim.Adam(self.qnetwork.parameters(), lr=lr)
self.criterion = nn.MSELoss()
def act(self, state):
if np.random.rand() <= self.epsilon:
return np.random.choice(self.action_size)
state = torch.FloatTensor(state).unsqueeze(0)
with torch.no_grad():
q_values = self.qnetwork(state)
return np.argmax(q_values.numpy())
def learn(self, state, action, reward, next_state, done):
state = torch.FloatTensor(state).unsqueeze(0)
next_state = torch.FloatTensor(next_state).unsqueeze(0)
reward = torch.FloatTensor([reward])
action = torch.LongTensor([action])
done = torch.FloatTensor([done])
q_values = self.qnetwork(state)
next_q_values = self.qnetwork(next_state)
q_value = q_values.gather(1, action.unsqueeze(1)).squeeze(1)
next_q_value = reward + (1 - done) * self.gamma * next_q_values.max(1)[0]
loss = self.criterion(q_value, next_q_value.detach())
self.optimizer.zero_grad()
loss.backward()
self.optimizer.step()
if self.epsilon > self.epsilon_min:
self.epsilon *= self.epsilon_decayEntrenamiento del Agente
Paso 4: Entrenar el Agente
env = gym.make('CartPole-v1')
state_size = env.observation_space.shape[0]
action_size = env.action_space.n
agent = Agent(state_size, action_size)
episodes = 1000
for e in range(episodes):
state = env.reset()
total_reward = 0
done = False
while not done:
action = agent.act(state)
next_state, reward, done, _ = env.step(action)
agent.learn(state, action, reward, next_state, done)
state = next_state
total_reward += reward
print(f"Episode {e+1}/{episodes}, Total Reward: {total_reward}")Evaluación del Agente
Paso 5: Evaluar el Agente
total_rewards = []
for e in range(100):
state = env.reset()
total_reward = 0
done = False
while not done:
action = agent.act(state)
state, reward, done, _ = env.step(action)
total_reward += reward
total_rewards.append(total_reward)
print(f"Average Reward over 100 episodes: {np.mean(total_rewards)}")Ejercicio Práctico
Ejercicio 1: Modificar la Red Neuronal
Modifica la arquitectura de la red neuronal para mejorar el rendimiento del agente. Prueba diferentes números de capas y neuronas.
Ejercicio 2: Implementar DQN
Implementa el algoritmo Deep Q-Network (DQN) utilizando una red neuronal con experiencia de repetición (experience replay).
Ejercicio 3: Entrenar en un Entorno Diferente
Entrena el agente en un entorno diferente de OpenAI Gym, como MountainCar-v0.
Conclusión
En este módulo, hemos cubierto los conceptos básicos del aprendizaje por refuerzo y cómo implementar un agente simple utilizando PyTorch. Hemos visto cómo definir una red neuronal, entrenar al agente y evaluar su rendimiento. Los ejercicios prácticos proporcionan una oportunidad para profundizar en el tema y experimentar con diferentes enfoques.
En el siguiente módulo, exploraremos cómo desplegar modelos PyTorch en producción.
PyTorch: De Principiante a Avanzado
Módulo 1: Introducción a PyTorch
- ¿Qué es PyTorch?
- Configuración del Entorno
- Operaciones Básicas con Tensores
- Autograd: Diferenciación Automática
Módulo 2: Construcción de Redes Neuronales
- Introducción a las Redes Neuronales
- Creación de una Red Neuronal Simple
- Funciones de Activación
- Funciones de Pérdida y Optimización
Módulo 3: Entrenamiento de Redes Neuronales
- Carga y Preprocesamiento de Datos
- Bucle de Entrenamiento
- Validación y Pruebas
- Guardar y Cargar Modelos
Módulo 4: Redes Neuronales Convolucionales (CNNs)
- Introducción a las CNNs
- Construcción de una CNN desde Cero
- Aprendizaje por Transferencia con Modelos Preentrenados
- Ajuste Fino de CNNs
Módulo 5: Redes Neuronales Recurrentes (RNNs)
- Introducción a las RNNs
- Construcción de una RNN desde Cero
- Redes de Memoria a Largo Plazo (LSTM)
- Unidades Recurrentes con Puerta (GRUs)
Módulo 6: Temas Avanzados
- Redes Generativas Antagónicas (GANs)
- Aprendizaje por Refuerzo con PyTorch
- Despliegue de Modelos PyTorch
- Optimización del Rendimiento
