# aprendizaje-por-refuerzo-en-python
Aprendizaje por Refuerzo en Python
Volver a la portada del cursoLectura: Estrategias de Política
Sección 3 · Métodos de Búsqueda y Política
Estrategias de política
PyShop puede mostrar en su portada uno de cuatro banners: «envío gratis», «2x1», «10 % descuento» y «regalo sorpresa». Cada uno tiene una tasa de clics real (4 %, 5 %, 7 % y 3 %), pero el agente no la conoce: solo ve si cada visita hizo clic o no. Si siempre muestra el banner que hoy parece mejor, puede quedarse con uno mediocre para siempre; si prueba de más, regala clics. Esta lectura reúne las estrategias para manejar ese dilema.
Explorar o explotar
Explotar es elegir la acción con la mejor estimación actual. Explorar es elegir otra para conocerla mejor. Con 5000 visitas, mostrar siempre el banner de 7 % daría unos 350 clics esperados; ese es el techo. Los resultados con la semilla 42:
| Estrategia | Clics | Qué pasó |
|---|---|---|
| Aleatorio | 224 | Muestra cada banner unas 1250 veces; nunca aprovecha lo aprendido. |
| Greedy (solo explotar) | 190 | Se pega a «envío gratis» las 5000 veces y jamás prueba los demás. |
| ε-greedy, ε = 0.01 | 194 | Explora tan poco que casi no sale del primer banner. |
| ε-greedy, ε = 0.1 | 329 | Muestra el banner de 7 % 4487 veces. |
| ε-greedy, ε = 0.3 | 297 | Encuentra el mejor, pero explora de más. |
| UCB, c = 0.2 | 298 | Explora donde hay más incertidumbre. |
ε-greedy
La estrategia más usada es simple: con probabilidad $\varepsilon$ se elige una acción al azar y, el resto de las veces, la mejor estimada. Cada estimación es el promedio de clics del banner, actualizado de forma incremental:
import numpy as np
tasas = [0.04, 0.05, 0.07, 0.03] # verdaderas, ocultas para el agente
rng = np.random.default_rng(42)
veces, estim, clics = np.zeros(4, dtype=int), np.zeros(4), 0
epsilon = 0.1
for t in range(5000):
if rng.random() < epsilon:
b = int(rng.integers(4)) # explorar
else:
b = int(np.argmax(estim)) # explotar
r = int(rng.random() < tasas[b])
clics += r
veces[b] += 1
estim[b] += (r - estim[b]) / veces[b]
print(clics, veces)
329 [ 233 141 4487 139]
Un truco común es el decaimiento de ε: empezar explorando mucho y bajar poco a poco. En el almacén, el curso empieza con $\varepsilon = 1$ y lo multiplica por 0.99 después de cada episodio, con un mínimo de 0.05, al que llega después de unos 300 episodios.
UCB: explorar donde hay duda
ε-greedy explora a ciegas: puede volver a probar un banner que ya conoce bien. UCB (upper confidence bound) suma a cada estimación un bono que crece si el banner se ha mostrado pocas veces:
$$\text{puntaje}(b) = \hat{q}(b) + c\,\sqrt{\frac{\ln t}{n(b)}}$$
donde $\hat{q}(b)$ es la tasa estimada, $n(b)$ las veces que se mostró y $t$ la visita actual. Con una sola semilla, UCB (298) queda debajo de ε = 0.1 (329), pero una semilla es una sola historia. Promediando 20 semillas, el orden cambia: UCB 325.4, ε = 0.1 296.1, aleatorio 238.4 y greedy 195.4. Compara estrategias siempre con varias repeticiones.
Optimismo inicial
Hay una forma de explorar sin azar. En el almacén, la tabla Q empieza en 0 y cada paso cuesta −1. Una acción probada baja su valor; una no probada sigue en 0 y parece mejor. El agente greedy prueba todo por su cuenta. Por eso, en el almacén, entrenar con $\varepsilon = 0$ desde el inicio resuelve el problema: retorno 3.0 y 100 % de éxito. En los banners, en cambio, la estimación inicial 0 no es optimista (las tasas reales son positivas) y greedy se atasca en 190 clics. La exploración necesaria depende del problema.
Otra estrategia que verás en la literatura es softmax (o Boltzmann): elegir cada acción con una probabilidad que crece con su valor estimado, en lugar de todo o nada.
On-policy y off-policy: SARSA y Q-learning
La estrategia de exploración también afecta lo que el agente aprende. Los dos algoritmos tabulares clásicos actualizan la tabla Q con un objetivo distinto:
- Q-learning (Watkins, 1989) es off-policy: usa el mejor valor del estado siguiente, $\max_{a'} Q(s', a')$, aunque luego explore. Aprende la política greedy.
- SARSA (Rummery y Niranjan, 1994; el nombre SARSA, propuesto por Richard Sutton, aparece en una nota al pie de ese trabajo) es on-policy: usa el valor de la acción que de verdad tomará, $Q(s', a')$, exploración incluida. Aprende la política que sigue.
CliffWalking-v1 lo muestra bien: una cuadrícula de 48 estados con un acantilado en la orilla (−100 si cae, −1 por paso). Con $\varepsilon = 0.1$ fijo, 500 episodios, $\alpha = 0.5$ y $\gamma = 1$:
| Algoritmo | Retorno medio entrenando (últimos 100) | Ruta greedy final |
|---|---|---|
| Q-learning | −39.1 | −13 (13 pasos por la orilla) |
| SARSA | −21.6 | −17 (ruta lejos del borde) |
Q-learning encuentra la ruta más corta, pegada al acantilado, pero mientras explora se cae seguido. SARSA cuenta con su propia exploración y aprende un camino más seguro: más largo al final, mejor durante el entrenamiento.
Trampas comunes
- ε fijo y alto. Con 0.3 se desperdician visitas.
- Concluir con una semilla. UCB pierde con la semilla 42 y gana en promedio.
- Evaluar con exploración activa. Para medir la política aprendida, juega con ε = 0.
- Elegir algoritmo sin mirar el costo de explorar. Si equivocarse durante el aprendizaje es caro, SARSA suele ser más prudente.
El notebook exploracion-y-politicas repite estos experimentos, grafica el decaimiento de ε y la comparación con 20 semillas, y entrena SARSA y Q-learning en CliffWalking para que veas las dos curvas.