Saltar al contenido
Aprendizaje por Refuerzo con Python

Entendiendo los conceptos básicos detrás del Aprendizaje por Refuerzo

Introducción

Aprendizaje por Refuerzo (RL)

El Aprendizaje por Refuerzo (RL, por sus siglas en inglés) es una rama de la inteligencia artificial que busca desarrollar algoritmos y sistemas capaces de aprender de manera autónoma a partir de la interacción con un ambiente específico. A diferencia del aprendizaje supervisado, el RL no se basa en datos etiquetados, sino que se enfoca en maximizar una recompensa numérica a través de la realización de acciones específicas según la información que recibe del ambiente.

Componentes del Aprendizaje por Refuerzo

  1. Agente: El sistema que toma decisiones.
  2. Ambiente: Proporciona la información relevante para que el agente tome sus decisiones.

Proceso de Aprendizaje

El agente aprende a partir de la retroalimentación que recibe del ambiente al realizar una acción en un estado determinado. El objetivo es maximizar una función de recompensa asignada. El proceso de aprendizaje implica ensayo y error, y el objetivo es que el agente encuentre la mejor política de acciones para maximizar su recompensa.

Aplicaciones del Aprendizaje por Refuerzo

  • Robótica: Para controlar robots que interactúan con su entorno.
  • Videojuegos: Para crear inteligencia artificial que juega de manera eficiente.
  • Finanzas: Para optimizar portafolios y estrategias de trading.
  • Publicidad Online: Para maximizar el impacto de anuncios personalizados.

El RL es una herramienta poderosa para automatizar tareas complejas y mejorar la eficiencia en diversos sectores.

Resumen

El Aprendizaje por Refuerzo es una rama del Machine Learning que se enfoca en cómo una máquina puede aprender a tomar decisiones de manera autónoma a través de la interacción con un entorno. A diferencia de otros tipos de Machine Learning, como el aprendizaje supervisado o no supervisado, el Aprendizaje por Refuerzo se basa en la retroalimentación que recibe el agente sobre sus acciones para aprender y mejorar.

Elementos Principales del Aprendizaje por Refuerzo

  1. Agente: El algoritmo que está siendo entrenado para tomar decisiones en el entorno.
  2. Entorno: El mundo en el que el agente se mueve y toma decisiones.
  3. Recompensa: Una señal que indica al agente si la decisión tomada fue buena o mala.

Proceso de Aprendizaje

El objetivo del Aprendizaje por Refuerzo es que el agente aprenda a tomar decisiones que maximicen su recompensa a largo plazo. Para lograr esto, se utiliza un proceso iterativo donde el agente:

  1. Interactúa con el entorno.
  2. Toma decisiones basadas en el estado actual.
  3. Recibe una recompensa que evalúa la calidad de su decisión.

Comparación con Otros Tipos de Machine Learning

  • Aprendizaje Supervisado: Se le proporciona al algoritmo un conjunto de datos etiquetados y se entrena para identificar patrones en esos datos.
  • Aprendizaje No Supervisado: El algoritmo aprende a encontrar patrones en un conjunto de datos sin etiquetas.
  • Aprendizaje por Refuerzo: El algoritmo aprende a tomar decisiones a través de la interacción con un entorno dinámico y la retroalimentación en forma de recompensas.

Resumen

El Aprendizaje por Refuerzo es un tipo de aprendizaje que se enfoca en cómo las máquinas pueden aprender a tomar decisiones autónomas mediante la interacción con un entorno dinámico y la retroalimentación en forma de recompensas. El agente mejora su desempeño a lo largo del tiempo mediante un proceso iterativo, con el objetivo de aprender una política óptima que le permita maximizar su recompensa a largo plazo.

Aplicación teórica

En el contexto del aprendizaje por refuerzo, puedo imaginar fácilmente la situación del robot que aprende a caminar. El robot, como agente, debe interactuar con su entorno para aprender a caminar de manera eficiente y evitar obstáculos mientras se mueve desde el punto A al punto B.

El proceso se desarrollaría de la siguiente manera:

  1. Interacción con el Entorno: El robot comienza su entrenamiento y toma su primera acción, que podría ser dar un paso adelante. El entorno, que está diseñado con obstáculos y una superficie irregular, responde a la acción del robot.

  2. Recompensa o Castigo: Si el robot da un paso correctamente y avanza sin tropezar ni chocar con obstáculos, recibe una recompensa positiva. Esto refuerza la acción que tomó el robot. Sin embargo, si el robot se cae o choca con un obstáculo, recibe un castigo negativo, lo que indica que esa acción no fue beneficiosa.

  3. Aprendizaje y Ajuste de Comportamiento: A lo largo del tiempo y después de numerosas interacciones con el entorno, el robot aprende qué acciones conducen a recompensas positivas y cuáles a castigos negativos. Utilizando algoritmos de aprendizaje por refuerzo, el robot ajusta su comportamiento para maximizar la obtención de recompensas y minimizar la recepción de castigos.

  4. Mejora Continua: Con el tiempo, el robot mejora su habilidad para caminar de manera eficiente y evitar obstáculos. A medida que acumula experiencia y aprende de sus errores, se vuelve más hábil en la tarea de caminar y navegar por su entorno.

En resumen, el aprendizaje por refuerzo permite que el robot aprenda de su experiencia, ajuste su comportamiento y mejore continuamente su habilidad para caminar y evitar obstáculos, todo con el objetivo de maximizar su recompensa y minimizar los castigos en su tarea de llegar de un punto a otro.

Aplicación práctica

Una forma práctica de entender los conceptos básicos detrás del Aprendizaje por Refuerzo en Python es mediante la implementación de un agente que aprende a jugar al juego de "Piedra, papel o tijeras" mediante la técnica de Q-Learning. Primero, necesitamos importar algunas librerías de Python:

import numpy as np
import random
    

Luego, vamos a definir las acciones posibles que nuestro agente puede tomar:

ACTIONS = ['rock', 'paper', 'scissors']
NUM_ACTIONS = len(ACTIONS)
    

El objetivo del agente es aprender qué acción tomar en cada situación para maximizar la recompensa que recibe a largo plazo. Para hacer esto, necesitamos definir una matriz Q que asigna a cada combinación de estado y acción un valor de recompensa esperado. Inicialmente, esta matriz estará vacía y nuestro agente explorará el juego de forma aleatoria para llenar la matriz de Q:

# La matriz Q inicializada con todos los valores en cero.
Q = np.zeros([3,3])

# El factor de descuento que controla cuánto peso dar a las recompensas futuras.
GAMMA = 0.8

# La tasa de aprendizaje que controla cuánto de la diferencia entre el valor esperado y el valor real debe aprender el agente.
LEARNING_RATE = 0.5

# Función que selecciona una acción aleatoria.
def select_random_action():
    return random.choice(range(NUM_ACTIONS))
    

Ahora podemos definir una función que nos permita seleccionar la mejor acción posible en función de los valores almacenados en la matriz Q. Esta función utiliza un valor de exploración para animar al agente a tomar acciones aleatorias de vez en cuando:

# Valor de exploración que controla la probabilidad de tomar una acción aleatoria.
EPSILON = 0.1

def select_best_action(state):
    if random.uniform(0, 1) < EPSILON:
        return select_random_action()
    else:
        return np.argmax(Q[state, :])