Los Multi-Armed Bandits (MAB) forman una piedra angular en el mundo del aprendizaje por refuerzo y ofrecen un mecanismo poderoso para negociar escenarios que requieren un equilibrio óptimo entre la exploración y la explotación. La exploración se refiere a probar opciones novedosas, mientras que la explotación significa apegarse a la mejor opción actual. En tales circunstancias, los MAB a menudo resultan ser una elección estelar debido a sus mecanismos de aprendizaje inteligentes.
Primero, desentrañemos el concepto detrás de los MAB. Imagine a un jugador rodeado por una variedad de máquinas tragamonedas, cada una conocida como un "bandido de un solo brazo". Las decisiones críticas a tomar aquí implican determinar qué máquinas jugar, el orden de juego y la frecuencia de juego. El problema es que cada máquina ofrece una recompensa diferente e incierta. El objetivo final es acumular la recompensa acumulativa más alta en una secuencia de jugadas.
El nombre "bandido de múltiples brazos" proviene de un experimento mental que involucra a un jugador en una fila de máquinas tragamonedas (a menudo conocido como "bandidos de un solo brazo"). El jugador debe decidir en qué máquinas jugar, cuántas veces jugar en cada máquina y en qué orden, con el objetivo de maximizar su recompensa total.
En una definición más formal, un problema MAB es una tupla (A, R)
El objetivo del problema MAB es encontrar una política π
(un mapeo de datos históricos a acciones) que maximice la recompensa total esperada Q
durante un número determinado de rondas.
El dilema clave en MAB es el compromiso entre "exploración" y "explotación":
Equilibrar la exploración y la explotación es un desafío central en el aprendizaje por refuerzo y los problemas MAB.
Para abordar este problema, se han desarrollado una gran cantidad de algoritmos, incluidas las estrategias Epsilon-Greedy, Upper Confidence Bound (UCB) y Thompson Sampling.
La revisión detallada de Contextual Bandits como extensión del MAB se tratará en próximos artículos.
La estrategia Epsilon(ε)-Greedy se adhiere a un principio sencillo. La mayoría de las veces, cuantificada como (1 - ε), opta por la acción que produce la mayor recompensa estimada, explotando así la opción más conocida. Sin embargo, el resto del tiempo, cuantificado como ε, elige una acción aleatoria, explorando así nuevas posibilidades. El ingenio de esta estrategia radica en su simplicidad y efectividad, a pesar de la advertencia de que podría seleccionar acciones menos gratificantes con la misma probabilidad que las más gratificantes durante su fase de exploración y el valor de ε determina el equilibrio entre exploración y explotación.
Matemáticamente se puede definir como:
Esto se puede definir mediante el siguiente pseudocódigo:
Initialize Q(a) for all a Repeat: Generate a random number p between 0 and 1 If p < epsilon: Select a random action a Else: Select action a with the highest Q(a) Execute action a and observe reward r Update Q(a) = Q(a) + alpha * (r - Q(a))
La implementación Pythonic de la estrategia Epsilon-Greedy es bastante sencilla:
import numpy as np class EpsilonGreedy: def __init__(self, epsilon, counts, values): self.epsilon = epsilon self.counts = counts self.values = values def select_arm(self): if np.random.random() < self.epsilon: return np.random.choice(len(self.values)) else: return np.argmax(self.values) def update(self, chosen_arm, reward): self.counts[chosen_arm] += 1 n = self.counts[chosen_arm] value = self.values[chosen_arm] new_value = ((n-1) / float(n)) * value + (1 / float(n)) * reward self.values[chosen_arm] = new_value
El algoritmo ε-voraz tiene el beneficio de la simplicidad y la garantía de que continuará explorando (un poco) incluso después de muchos pasos. Sin embargo, no tiene en cuenta cuánto se sabe sobre cada acción cuando explora, a diferencia de UCB o Thompson Sampling.
Por el contrario, la estrategia UCB tiene en cuenta tanto la recompensa estimada como la incertidumbre o varianza asociada al decidir una acción. Exhibe preferencia por acciones con alta incertidumbre, buscando disminuirla y asegurando una fase de exploración más productiva. La estrategia UCB se define matemáticamente de la siguiente manera:
Su implementación en Python es la siguiente:
class UCB: def __init__(self, counts, values): self.counts = counts self.values = values def select_arm(self): n_arms = len(self.counts) for arm in range(n_arms): if self.counts[arm] == 0: return arm ucb_values = [0.0 for arm in range(n_arms)] total_counts = sum(self.counts) for arm in range(n_arms): bonus = sqrt((2 * log(total_counts)) / float(self.counts[arm])) ucb_values[arm] = self.values[arm] + bonus return np.argmax(ucb_values) def update(self, chosen_arm, reward): self.counts[chosen_arm] += 1 n = self.counts[chosen_arm] value = self.values[chosen_arm] new_value = ((n-1) / float(n)) * value + (1 / float(n)) * reward self.values[chosen_arm] = new_value
El equilibrio entre exploración y explotación en UCB proviene de su fórmula: el valor estimado de una acción más un término que disminuye con el tiempo (a medida que se aprende más sobre la acción) pero aumenta con la incertidumbre sobre esa acción. Por lo tanto, el algoritmo tiende a explorar armas con alta incertidumbre y alta recompensa potencial.
Thompson Sampling es un algoritmo de inspiración bayesiana para el problema del bandido con múltiples brazos. Asigna una distribución previa a las probabilidades de recompensa de cada bandido (o cada acción), luego actualiza estas distribuciones previas a medida que se observan las recompensas. La selección de acciones es probabilística, según la distribución posterior sobre la mejor acción.
En un marco Beta-Bernoulli, consideramos la distribución de recompensas de cada bandido como una distribución de Bernoulli (es decir, recompensas binarias 0 o 1). Luego asignamos una Beta antes de la probabilidad de obtener una recompensa. La distribución Beta es la anterior conjugada de la distribución de Bernoulli, lo que permite una fácil actualización posterior.
Lógica:
Asigne a cada bandido una distribución Beta con parámetros α=1, β=1 (Uniforme antes).
Para cada ronda:
import numpy as np from scipy.stats import beta class Bandit: def __init__(self, true_probability): self.true_probability = true_probability self.alpha = 1 self.beta = 1 def pull(self): return np.random.random() < self.true_probability def sample(self): return np.random.beta(self.alpha, self.beta) def update(self, reward): self.alpha += reward self.beta += (1 - reward) def Thompson(bandits, num_trials): rewards = np.zeros(num_trials) for i in range(num_trials): # Thompson sampling j = np.argmax([b.sample() for b in bandits]) # Pull the arm for the bandit with the largest sample reward = bandits[j].pull() # Update rewards log rewards[i] = reward # Update the distribution for the bandit whose arm we just pulled bandits[j].update(reward) return rewards # Suppose we have 3 bandits with these true probabilities true_probabilities = [0.2, 0.5, 0.75] bandits = [Bandit(p) for p in true_probabilities] # Run experiment rewards = Thompson(bandits, num_trials=10000) # Print the total reward print("Total reward earned:", rewards.sum()) print("Overall win rate:", rewards.sum() / len(rewards))
Por lo tanto, Thompson Sampling "explora" acciones sobre las que no está seguro (aquellas para las que la distribución de valores está dispersa) y "explota" acciones que cree que pueden tener un alto valor (aquellas para las que la distribución está sesgada hacia valores altos).
Con el tiempo, a medida que se aprende más sobre cada acción, las distribuciones alcanzan un máximo y las acciones elegidas por el algoritmo tienden a converger en la que tiene el valor esperado más alto.
El equilibrio exploración/explotación en Thompson Sampling proviene naturalmente de la forma de las distribuciones. Este método es bastante efectivo, pero puede ser más complejo de implementar que UCB o ε-greedy, particularmente para problemas con espacios de acción grandes o continuos, o estructuras de recompensa complejas.
Los Multi-Armed Bandits (MAB) tienen una amplia gama de aplicaciones en diversas industrias y dominios. Estos son algunos ejemplos de cómo se pueden utilizar:
En esencia, la utilidad de los MAB se extiende mucho más allá de las tareas de aprendizaje por refuerzo convencionales. Simbolizan un marco efectivo para mejorar los procesos de toma de decisiones en entornos de incertidumbre, brindando soluciones prácticas a problemas del mundo real en varios dominios. Por lo tanto, cuando la tarea en cuestión implica equilibrar la exploración y la explotación, los MAB a menudo surgen como la opción de acceso, proporcionando una solución versátil, sólida y adaptable a los enigmas de la toma de decisiones.
Multi-Armed Bandits, con su capacidad para equilibrar la exploración y la explotación de manera efectiva, brindan una solución sólida a muchos problemas de toma de decisiones del mundo real. Su adaptabilidad y versatilidad inherentes los convierten en una herramienta valiosa, no solo en el ámbito del aprendizaje por refuerzo, sino también en una amplia gama de aplicaciones, desde la atención médica hasta la publicidad en línea. Tanto si es un científico de datos, un entusiasta del aprendizaje automático o un profesional que busca mejorar sus procesos de toma de decisiones, comprender e implementar las estrategias MAB puede ser una experiencia enriquecedora y gratificante.