Cuándo debería preferir Muestreo de Thompson sobre pruebas A/B.

When to prefer Thompson Sampling over A/B testing.

Una explicación detallada de “Thompson Sampling”, una alternativa más eficiente al A/B testing para el aprendizaje en línea

[Imagen de Autor]

Imagina que tienes dos anuncios para elegir: el rojo y el azul. Por supuesto, te gustaría mostrar a tus usuarios el anuncio con la tasa de clics más alta.

¿Qué mostrar al usuario, el anuncio rojo o el anuncio azul? [Imagen de Autor]

Pero, ¿cómo descubres qué anuncio tiene la tasa de clics más alta?

El enfoque más común para responder a esta pregunta es hacer una prueba A/B. Esto implica separar a algunos usuarios y mostrarles el primer anuncio a la mitad de ellos y el segundo anuncio a la otra mitad. Finalmente, puedes calcular la tasa de clics de cada alternativa y seleccionar la mejor.

Supongamos que, al final de la prueba A/B, tienes los siguientes resultados:

Resultados de la prueba A/B después de 10,000 visualizaciones. [Imagen de Autor]

La versión azul es claramente superior a la roja: una tasa de clics del 18% frente a una tasa de clics del 11%. Pero esto significa que perdimos muchas oportunidades: podríamos haber mostrado el anuncio azul a muchos más usuarios, y así podríamos haber obtenido muchos más clics.

Por otro lado, ¿qué sucedería si detuviéramos el experimento muy temprano, digamos después de solo 20 usuarios?

Resultados de la prueba A/B después de 20 visualizaciones. [Imagen de Autor]

Sabemos intuitivamente que, después de 20 usuarios, los resultados no son lo suficientemente confiables para enviar la variante con mejor rendimiento a todos los usuarios.

En general, el problema con las pruebas A/B es que:

  • si separamos a demasiados usuarios, perdemos oportunidades en las variantes de menor rendimiento;
  • si separamos a muy pocos usuarios, la prueba es inconclusa.

En otras palabras, las pruebas A/B son ineficientes porque son demasiado estáticas. Idealmente, necesitaríamos un sistema inteligente que pueda aprender de manera dinámica a medida que obtiene más datos.

Este sistema debería:

  • explorar las diferentes alternativas cuando los resultados son demasiado pequeños para ser confiables;
  • explotar los resultados cuando comienzan a ser lo suficientemente confiables, enviando cada vez más tráfico a la mejor alternativa de rendimiento.

Buenas noticias: tal sistema existe y se llama Thompson Sampling.

Usando distribuciones de probabilidad en lugar de números

El enfoque que hemos visto anteriormente intentó evaluar cada alternativa con un solo número: su tasa de clics. El problema con este enfoque es que un solo número no expresa la incertidumbre asociada con la estimación en sí misma.

Para resolver este problema, Thompson Sampling propone utilizar una distribución de probabilidad completa en lugar de un solo número.

El objetivo de la distribución de probabilidad es expresar la incertidumbre sobre la estimación de la métrica.

Una vez que tenemos nuestras distribuciones, una para cada alternativa, Thompson Sampling funciona dibujando un número aleatorio de cada distribución. Luego, se muestra al usuario la alternativa asociada con el número más alto.

¿Cuál es el punto de hacer esto? Bueno, la idea es que si las distribuciones expresan una alta incertidumbre, el resultado depende mucho del azar.

En otras palabras, cuanto menos confianza tengamos en nuestra creencia, más el sistema explorará diferentes alternativas. Por el contrario, a medida que aumenta la confianza, el sistema explota cada vez más la alternativa de mejor rendimiento.

Veamos dos distribuciones de probabilidad que podrían obtenerse a partir de los resultados que hemos visto anteriormente.

Distribuciones de probabilidad después de 20 impresiones. [Imagen del autor]

Si intenta extraer números aleatorios de estas dos distribuciones, descubrirá que el número obtenido de la distribución roja es mayor que el número obtenido de la distribución azul el 24% del tiempo. Esto demuestra numéricamente nuestra intuición de que la diferencia aún no es estadísticamente significativa.

¿Pero qué pasa después de 10,000 impresiones?

Distribuciones de probabilidad después de 10,000 impresiones. [Imagen del autor]

Ahora estamos muy seguros de que la página azul funciona mejor que la página roja. Y, de hecho, es prácticamente imposible que el número obtenido de la distribución roja sea mayor que el obtenido de la distribución azul.

¿Qué distribución debería usar?

En nuestro ejemplo, como tenemos un resultado binario (clic o no clic), la distribución a utilizar es la distribución Beta. Lo bueno de Beta es que se basa completamente en dos parámetros, a y b, que se pueden interpretar de una manera muy sencilla:

  • a: número de éxitos (en nuestro caso, número de clics).
  • b: número de fracasos (en nuestro caso, número de no clics).

El valor esperado de la distribución es a / (a + b), que es nuestra cantidad de interés: la tasa de clics.

La distribución Beta también está disponible en Scipy y es muy fácil de calcular:

import numpy as npfrom scipy import stats# input: number of clicks and number of missesclicks = 1misses = 4# get 1000 equally spaced points between 0 and 1 for plotting purposesx = np.linspace(start = 0, stop = 1, num = 1_000)# calculate probability distribution function of betabeta_pdf = stats.beta(a = clicks, b = misses).pdf(x = x)

Veamos algunos ejemplos. Tomemos una tasa de clics del 20%: ¿qué sucede con la distribución Beta cuando aumenta el número de impresiones?

Cómo cambia la distribución Beta cuando el número de clics y no clics aumenta proporcionalmente. [Imagen del autor]

Como esperábamos, a medida que aumenta el número de usuarios, los resultados son cada vez más ciertos: esto se traduce en una distribución que se concentra cada vez más alrededor del valor esperado: 20%.

En otras palabras, trabajar con distribuciones de probabilidad nos permite asignar una medida cuantitativa de certeza a nuestra evaluación cualitativa.

¿Por qué no la distribución Normal?

Si tomó Estadística 101, podría preguntarse: “Espera un minuto. Según el Teorema del Límite Central, si tenemos pruebas independientes, deberíamos usar la distribución Normal. Entonces, ¿por qué estamos usando la distribución Beta?”

De hecho, este es un buen punto. Veamos cómo calcular tanto la función de distribución de probabilidad Beta como la Normal en Python.

import numpy as npfrom scipy import stats# input: number of clicks and number of missesclicks = 1misses = 4# compute n and click raten = clicks + missesclick_rate = clicks / n# get 1000 equally spaced points between 0 and 1 for plotting purposesx = np.linspace(start = 0, stop = 1, num = 1_000)# calculate the probability distribution function of betabeta_pdf = stats.beta(a = clicks, b = misses).pdf(x = x)# calculate the probability distribution function of normalnormal_pdf = stats.norm(  loc = click_rate,   scale = np.sqrt(click_rate * (1 - click_rate) / n)).pdf(x = x)

Repetimos este proceso para diferentes números de usuarios y comparamos las dos distribuciones:

Las distribuciones Beta y Normal son casi iguales cuando el número de observaciones es grande. [Imagen del autor]

Como se puede ver, la distribución Beta y la distribución Normal se vuelven cada vez más similares a medida que aumenta el número de impresiones. Y se vuelven prácticamente lo mismo después de solo 50 iteraciones.

Por lo tanto, usar la distribución Beta o Normal no haría mucha diferencia. Esta es una gran noticia porque significa que, gracias al TLC, siempre podemos usar la distribución Normal, independientemente de la métrica que elijamos.

Thompson Sampling en acción

Hagamos un ejemplo para ver Thompson Sampling en acción.

Queremos probar 4 versiones de un anuncio: gris, rojo, verde y azul. Supongamos que también conocemos la tasa real de clics para cada versión.

4 anuncios diferentes con su tasa de clics verdadera. [Imagen del autor]

Como en el párrafo anterior, usaremos la distribución Beta. Pero necesitamos un pequeño ajuste. Dado que los parámetros para Beta ( a y b ) deben ser estrictamente mayores que 0, en caso de que al menos uno entre a y b sea cero, entonces agregaremos 1 a cada uno de ellos.

import numpy as npdef draw_from_beta(clicks, misses):  """Dibujar un número aleatorio de Beta."""    if min(clicks, misses) == 0:    clicks += 1    misses += 1    return np.random.beta(a=clicks, b=misses)

Para cada nuevo usuario, debemos hacer lo siguiente:

  1. Basándose en el recuento actual de clics y fallos para cada variante, obtener la correspondiente distribución Beta.
  2. Dibujar un número de la distribución de cada variante obtenida en el punto 1.
  3. Mostrar al usuario la variante asociada con el número más alto.
  4. Actualizar el contador con el resultado obtenido en el usuario actual (clic o fallo).

Veamos una representación gráfica de este proceso para los primeros 1,000 usuarios:

El algoritmo de Thompson Sampling en acción en los primeros 1,000 usuarios. [Imagen del autor]

Como se puede ver, después de 100 iteraciones, nuestra creencia aún no está alineada con la verdad: el valor esperado de la variante verde es mayor que el azul. Pero esto se debe solo a la casualidad. A medida que la experiencia se acumula, nuestras estimaciones convergerán hacia la verdad. Esto significa que:

  • la media de la distribución estará más cerca de la tasa verdadera;
  • la desviación estándar de la distribución será cada vez más cercana a cero.

Veamos cómo evolucionan estas dos cantidades durante las primeras 400 iteraciones.

Las primeras 400 iteraciones del algoritmo. Cómo cambian la desviación estándar y la media a medida que aumenta el número de iteraciones. [Imagen del autor]

Como hemos visto, después de 1,000 impresiones este es el resultado:

El número de clics y fallos obtenidos mediante Thompson Sampling. [Imagen del autor]

El muestreo de Thompson es tan efectivo que, después de solo 1,000 iteraciones, ya ha concentrado el 50.6% de las visualizaciones en la mejor alternativa (azul) y el 37.7% en la segunda mejor (verde).

Por el contrario, ¿qué sucedería si usamos el enfoque de pruebas A/B, enviando cada alternativa a la misma cantidad de usuarios? Mostrar cada anuncio a 250 usuarios produciría el siguiente resultado:

Número esperado de clics y fallos si asignamos variantes de manera puramente aleatoria (enfoque de prueba A/B). [Imagen del autor]

Usando el muestreo de Thompson tenemos 145 clics, con las pruebas A/B tenemos en cambio 135 clics. ¡Esto significa un 7.4% más de clics gracias al muestreo de Thompson! Y la diferencia sería aún mayor si llevamos a cabo más iteraciones.

Conclusión

El muestreo de Thompson es perfecto para el aprendizaje en línea porque aborda eficientemente el dilema de exploración/explotación.

Lo hace asignando una distribución de probabilidad a cada variante que debe ser probada. La distribución sirve para expresar la incertidumbre asociada con la estimación.

El hecho de que el muestreo de Thompson se adapte dinámicamente al conocimiento acumulado de las iteraciones anteriores lo hace más eficiente que las pruebas A/B.

Por ejemplo, hemos visto un ejemplo con 4 variantes y, en solo 1,000 iteraciones, el muestreo de Thompson fue capaz de obtener un 7% más de clics que las pruebas A/B.

Todo el código utilizado para este artículo se puede encontrar en este cuaderno.

¡Gracias por leer! Espero que hayas disfrutado este artículo. Si quieres, ¡agrégame en Linkedin!

We will continue to update Zepes; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

Inteligencia Artificial

dbt Incremental - La forma correcta

Cuando mi equipo en GlamCorner comenzó la transición de bases de datos tradicionales de MySQL a ELT en una base de da...

Inteligencia Artificial

OLAP vs. OLTP Un análisis comparativo de los sistemas de procesamiento de datos

Una comparación exhaustiva entre los sistemas OLAP y OLTP, explorando sus características, modelos de datos, necesida...

Inteligencia Artificial

La IA detecta emisiones de metano desde el espacio

Una nueva herramienta de aprendizaje automático utiliza datos de satélites hiperespectrales para detectar automáticam...

Inteligencia Artificial

Personalizando compañeros de codificación para organizaciones

Los modelos de IA generativa para compañeros de codificación se entrenan principalmente con código fuente disponible ...

Inteligencia Artificial

Aprendizaje por Reforzamiento una Introducción Sencilla a la Iteración de Valor

La Iteración de Valor (VI) es típicamente uno de los primeros algoritmos introducidos en la vía de aprendizaje del Ap...

Inteligencia Artificial

Una breve guía sobre cómo convertirse en un ingeniero de consultas eficiente

¿Estás buscando convertirte en un profesional de la IA? Lee nuestra guía para obtener información sobre roles laboral...