Volver

Cómo aprende una Restricted Boltzmann Machine: energía, sueños y Contrastive Divergence

Categorías

Inteligencia Artificial | Machine Learning | Restricted Boltzmann Machines

Fecha

03-07-2026

En un artículo anterior vimos cómo una Restricted Boltzmann Machine descubría, sin una sola etiqueta, un gusto oculto en los datos de una empresa de comida a domicilio. Pero dejamos una promesa pendiente: abrir el capó. En este artículo recorremos la maquinaria interna de una RBM —la función de energía, el diálogo probabilístico entre sus dos capas y el algoritmo Contrastive Divergence— para entender no sólo qué aprende la red, sino cómo lo aprende. Y lo haremos sin perder de vista la intuición: al final, entrenar una RBM consiste en comparar la realidad con lo que la red sueña.

Imagen a pantalla completa

Hay un momento, en la vida de cualquier ingeniero, en el que usar una herramienta deja de ser suficiente. Puedes pasarte años llamando a librerías de machine learning que devuelven modelos entrenados, igual que puedes pasarte años conduciendo sin haber abierto nunca el capó del coche. Y no pasa nada: el coche funciona. Pero el día que algo se rompe —y en machine learning las cosas se rompen de formas silenciosas y difíciles de diagnosticar— la diferencia entre quien entiende la maquinaria y quien sólo la usa se vuelve enorme. No es una cuestión de purismo, es una cuestión práctica: no se puede depurar lo que no se comprende.

En el artículo anterior entrenamos una Restricted Boltzmann Machine para descubrir los gustos latentes de los clientes de una empresa ficticia de comida a domicilio, y vimos cómo la red encontraba por su cuenta una dimensión —el picante— que el negocio nunca había contemplado. Aquel artículo terminaba con una promesa: dedicar uno entero a los detalles internos que entonces esquivamos elegantemente. La función de energía, el muestreo de Gibbs, el algoritmo Contrastive Divergence. Este es ese artículo.

Para ese viaje, eso sí, vamos a cambiar de laboratorio. El experimento del artículo anterior —doce platos, seis factores latentes— era perfecto para descubrir cosas, pero para hacer matemáticas en la pizarra tiene demasiadas piezas. Así que os propongo un escenario más pequeño: ahora somos una cadena de emisión deportiva, al estilo de Eurosport, y de cada usuario sabemos una única cosa: si vio o no cada una de nuestras cuatro últimas retransmisiones. Concretamente: la final de Wimbledon de 2025 entre Sinner y Alcaraz, la semifinal entre Alcaraz y Fritz, la etapa del Tour de Francia con final en Hautacam y la etapa del Mont Ventoux. Cuatro eventos, dos deportes y dos factores latentes tan obvios que casi da vergüenza: la afición al tenis y la afición al ciclismo. Esa obviedad es deliberada. Como ya sabemos la respuesta que la red debería encontrar, podremos dedicar toda nuestra atención a entender cómo la encuentra.

Os adelanto que el viaje merece la pena, porque la RBM esconde una de las ideas más bonitas que conozco en machine learning: una red que aprende comparando la realidad con sus propios sueños, y que deja de aprender exactamente en el momento en que ya no distingue la una de los otros.

Dos capas y una restricción que lo cambia todo

En el artículo anterior describimos la RBM de forma deliberadamente superficial: dos capas, conexiones con pesos, activaciones probabilísticas. Ese esqueleto nos bastó para interpretar los resultados, pero ahora vamos a recorrerlo de nuevo poniéndole nombre y apellidos a cada pieza, porque son los nombres que usaremos durante el resto del artículo.

Una RBM se compone de una capa visible y una capa oculta, ambas formadas por unidades binarias: encendido o apagado, 1 o 0. La capa visible, que llamaremos vv, es donde apoyamos los datos que observamos del mundo real; la capa oculta, hh, es donde la red construye los factores latentes que explican esos datos. En nuestra cadena deportiva: cuatro unidades visibles, una por evento retransmitido, y dos ocultas, una por cada factor que la red pueda querer inventarse.

v{0,1}4h{0,1}2v \in \{0,1\}^{4} \qquad\qquad h \in \{0,1\}^{2}

Entre ambas capas viven los pesos: una matriz WW con una fila por unidad visible y una columna por unidad oculta —en nuestro caso, WR4×2W \in \mathbb{R}^{4 \times 2}—. La celda WijW_{ij} mide la fuerza de la relación entre el evento ii y el factor jj: muy positiva si se excitan mutuamente, muy negativa si la presencia de uno suprime al otro, cercana a cero si apenas se conocen. Y aquí conviene hacer una conexión con lo que ya vimos: aquella matriz de valores en verde que interpretamos columna a columna en el artículo anterior —la que nos destapó el factor picante— no era otra cosa que WW después del entrenamiento —aquélla, eso sí, de 12 × 6—. Toda esta maquinaria que vamos a desmontar existe para producir esa tabla.

Quedan dos piezas de las que entonces no hablamos: los biases. Cada unidad, visible u oculta, lleva asociado un número propio que representa su predisposición a encenderse sin que nadie la empuje. El bias visible bivb^v_i es la audiencia base del evento ii: una final de Wimbledon la ve muchísima gente que no es especialmente aficionada al tenis, mientras que una etapa de media montaña parte con desventaja. El bias oculto bjhb^h_j es lo mismo para los factores: la tendencia del factor jj a declararse activo por defecto, antes de mirar la evidencia. Parecen actores secundarios y durante buena parte del artículo lo serán, pero no les perdáis la pista: hacia el final veremos cómo un bias oculto fuera de control estuvo a punto de cargarse el experimento entero.

Y con esto ya tenemos el modelo completo. No hay más: WW, bvb^v y bhb^h. En nuestra RBM de juguete, 4 × 2 pesos más 4 biases visibles más 2 ocultos: 14 números. Todo lo que la red llegará a saber sobre nuestros espectadores cabe en 14 números, y entrenarla no consistirá en otra cosa que en ajustarlos hasta que cuenten la verdad. Y que el tamaño no os despiste: el modelo del artículo anterior, capaz de destapar el factor picante, tampoco era mucho más grande —90 números—.

Falta la palabra que le da el apellido a la red: la restricción. En una RBM, las conexiones sólo cruzan de una capa a la otra. Cada unidad visible está conectada con todas las ocultas, y viceversa, pero dentro de una misma capa no existe ni una sola conexión: ningún evento habla directamente con otro evento, ningún factor habla directamente con otro factor. El grafo que forma la red es, en términos técnicos, bipartito:

El grafo completo de nuestra RBM. A la izquierda, la capa visible: los cuatro eventos. A la derecha, la capa oculta: los dos factores latentes. Cada evento está conectado con ambos factores y no existe ni una sola conexión dentro de una misma capa.

Puede parecer un detalle de diseño menor, casi una limitación, pero es exactamente lo contrario: es la decisión que hace que todo lo demás funcione. La intuición es esta: si yo conozco el estado completo de la capa visible, las unidades ocultas no tienen ninguna vía para influirse entre sí —no hay cables entre ellas—, así que puedo calcular el estado de cada una por separado, sin preocuparme de las demás. En la práctica, eso significa que activar la capa oculta entera se reduce a una multiplicación de matrices. Y como la estructura es simétrica, lo mismo ocurre en el sentido contrario, de la capa oculta a la visible. En una Boltzmann Machine clásica, donde todo está conectado con todo, cada unidad depende de todas las demás y calcular cualquier cosa exige tener en cuenta la red completa a la vez: entrenarla es, en el sentido más literal, una pesadilla computacional. La restricción convierte esa pesadilla en dos multiplicaciones de matrices. Es la diferencia entre un modelo teóricamente bonito y uno que se entrena en segundos en un portátil.

Ya tenemos las piezas sobre la mesa: dos capas binarias, una matriz de pesos y dos vectores de biases. La siguiente pregunta es qué hace la red con ellas, y la respuesta pasa por un concepto que la física le prestó al machine learning: la energía.

La energía: una física prestada

Para entender qué hace una RBM con sus 14 números hay que empezar por desaprender una costumbre. Estamos acostumbrados a redes que funcionan como funciones: entra un dato por un extremo, sale una predicción por el otro. Una RBM se parece más a un juez: le presentas una configuración completa —un estado concreto de la capa visible y otro de la oculta— y ella emite un veredicto sobre lo creíble que le resulta esa combinación. Ese veredicto se llama energía, y el convenio viene de la física: igual que la pelota rueda hasta el fondo del valle, las configuraciones de baja energía son las cómodas, las plausibles, las que encajan. Toda la sección se resume en una imagen: la red define un paisaje de energías sobre todas las combinaciones posibles, y aprender consistirá en moldearlo —excavar valles allí donde pisan los datos reales, levantar montañas donde no pisa nadie—.

La fórmula que puntúa cada configuración es esta, y os la enseño más por honestidad que por necesidad:

E(v,h)=bvv    bhh    vWhE(v, h) = -\, b^v \cdot v \;-\; b^h \cdot h \;-\; v^\top W \, h

Su lectura cotidiana cabe en dos frases. Cada cable WijW_{ij} resta energía cuando sus dos extremos están encendidos a la vez: juntar un evento y un factor que se llevan bien hace la configuración más cómoda, y juntarlos con un peso negativo la castiga. Y los biases son el precio —o el descuento— de encender cada unidad. Con unos pesos razonables para nuestra cadena deportiva, la configuración de energía más baja para un espectador que vio los dos partidos de Wimbledon sería la que enciende el factor tenis y apaga el de ciclismo. Que la red entienda a un espectador significa eso, y nada más que eso.

Y ahora, la confesión: esta fórmula no se aplica jamás en el algoritmo. ¿Por qué os la enseño entonces? Porque es el plano del edificio: ella no se aplica, pero todo lo que sí se aplica se deriva de ella. Tres consecuencias suyas nos acompañarán el resto del artículo:

  • De la energía nace la probabilidad. La física manda: P(v,h)=eE(v,h)/ZP(v,h) = e^{-E(v,h)} / Z. Energía baja, probabilidad alta. ¿Y qué representa ZZ? Es la suma de eEe^{-E} de todas las configuraciones posibles de la red, Z=v,heE(v,h)Z = \sum_{v',h'} e^{-E(v',h')}: el total de plausibilidad que hay para repartir. Dividir por él convierte la puntuación de cada configuración en una probabilidad de verdad —su porción de ese total, de forma que entre todas suman 1—. Y ahí está el problema: "todas las configuraciones posibles" son 64 en nuestro juguete, 262.144 en el modelo del artículo anterior y, en un catálogo realista, más que átomos tiene el universo observable. Fijaos en que lo imposible no es dividir: es conocer ZZ, porque exige sumar todos esos términos… y volver a sumarlos desde cero cada vez que el entrenamiento toque un solo peso. Ese ZZ incomputable es el motivo de que el entrenamiento exacto no exista y de que, dentro de un par de secciones, necesitemos un atajo llamado Contrastive Divergence.
  • Las preguntas útiles esquivan el denominador. ZZ aparece porque preguntamos por la probabilidad de una configuración completa, y responder eso obliga a compararla contra todas las demás configuraciones de la red. Pero si en vez de esa visión total nos conformamos con una parcial —dar por conocida una capa y preguntar sólo por la otra: ¿qué factores explican a este espectador, sabiendo ya lo que ha visto?—, el mismo ZZ acaba arriba y abajo de la fracción y se cancela. Sobreviven dos fórmulas pequeñas y rapidísimas. Esas dos sí están en el algoritmo, se ejecutan miles de veces en cada entrenamiento, y son las protagonistas de la siguiente sección.
  • Entrenar será bajarle la energía a los datos reales. Cuando lleguemos a la regla que actualiza los pesos, aunque tenga otra pinta, estaremos calculando el gradiente de esta energía: en qué dirección hay que mover cada uno de los 14 números para que las configuraciones que aparecen en los datos reales tengan cada vez menos energía, es decir, para que la red las considere cada vez más plausibles.

Si de esta sección os lleváis dos ideas, que sean estas: la red aprende moldeando un paisaje de energías, y calcular ese paisaje completo es imposible porque ZZ es inabarcable. Todo lo que queda de artículo consiste en resolver esa aparente contradicción: cómo moldear un paisaje que nunca podremos mirar entero.

Un diálogo entre capas

Nos habíamos quedado en la promesa de dos fórmulas pequeñas que esquivan el denominador. Aquí está la primera, que responde a la pregunta que cualquier negocio hace a diario: sabiendo qué ha visto un espectador, ¿qué factores lo explican?

P(hj=1v)=σ(iviWij+bjh)P(h_j = 1 \mid v) = \sigma\left( \sum_{i} v_i \, W_{ij} + b^h_j \right)

Leída con calma no tiene misterio. Para cada factor oculto jj sumamos la evidencia que le llega: los pesos de los eventos que el espectador sí ha visto, más su bias. El resultado es un número cualquiera, positivo o negativo, y la función sigmoide lo convierte en probabilidad: σ(x)=11+ex\sigma(x) = \frac{1}{1 + e^{-x}} aplasta cualquier número real al intervalo (0, 1), mandando los positivos grandes cerca del 1, los negativos grandes cerca del 0 y el cero justo al 0.5. Fijaos además en el regalo de la restricción: como los factores no tienen interacción entre sí, la fórmula de cada uno es independiente de la del otro, y todas se calculan de golpe con una única multiplicación de matrices.

Pongámosle números. Supongamos que la red ya está entrenada y sus 14 números han quedado así (me los invento, pero son los que cualquier entrenamiento razonable encontraría): cada evento se conecta con peso +2 al factor de su deporte y con peso 0 al del otro, y todos los biases valen −1. Llega un espectador que vio los dos partidos de Wimbledon y ninguna etapa, v=(1,1,0,0)v = (1, 1, 0, 0):

  • Factor tenis: evidencia 2+21=32 + 2 - 1 = 3, y σ(3)0.95\sigma(3) \approx 0.95.
  • Factor ciclismo: evidencia 0+01=10 + 0 - 1 = -1, y σ(1)0.27\sigma(-1) \approx 0.27.

La red está un 95% segura de que este espectador es aficionado al tenis, y le concede un 27% al ciclismo. Eso, y no otra cosa, es segmentar en el espacio latente: las activaciones que en el artículo anterior nos decían que María era "mexicana y picante" salían exactamente de esta fórmula.

La segunda fórmula es la misma pero con un recorrido inverso:

P(vi=1h)=σ(jWijhj+biv)P(v_i = 1 \mid h) = \sigma\left( \sum_{j} W_{ij} \, h_j + b^v_i \right)

Si la primera dirección era percibir —de los datos a los factores—, esta es imaginar —de los factores a los datos—. Dado un aficionado puro al tenis, h=(1,0)h = (1, 0), ¿qué habría visto? Cada partido de Wimbledon recibe σ(21)0.73\sigma(2 - 1) \approx 0.73 y cada etapa σ(01)0.27\sigma(0 - 1) \approx 0.27: la red dibuja a su aficionado al tenis prototípico, que probablemente vio los partidos y probablemente se saltó las etapas. Ninguna respuesta es tajante, y eso es una virtud: la red opina con la seguridad justa que la evidencia le permite.

Falta un ingrediente para que el diálogo esté completo: el azar. Una RBM es una red estocástica, y eso significa que no se queda en las probabilidades: las usa para tomar decisiones binarias lanzando una moneda al aire por cada unidad. Con 0.95, el factor tenis casi siempre se enciende; con 0.27, el ciclismo casi siempre se apaga… pero de vez en cuando no. Esto se llama muestreo de Bernoulli y, de momento, quedaos sólo con que existe: en la sección del entrenamiento veremos que ese ruido, lejos de ser un defecto, es una pieza clave del aprendizaje.

Y ahora, encadenemos las dos direcciones. Partimos de un espectador real; percibimos sus factores y muestreamos un estado oculto; desde ese estado imaginamos un espectador y lo muestreamos también; volvemos a percibir, volvemos a imaginar… vhvhvv \rightarrow h \rightarrow v' \rightarrow h' \rightarrow v'' \rightarrow \cdots Este ping-pong tiene nombre propio —muestreo de Gibbs— y una propiedad que roza la magia: si lo dejas correr el tiempo suficiente, la cadena se olvida de dónde partió, y las configuraciones que va visitando se reparten exactamente según P(v,h)P(v, h), la distribución que no podíamos calcular por culpa de ZZ. Dicho con la imagen de la sección anterior: no podemos mirar el paisaje entero, pero podemos soltar una pelota y observar por qué valles rueda.

Y como nuestra red es de juguete, podemos ver ese ping-pong con valores reales. La tabla siguiente es una ejecución auténtica de muestreo de Gibbs con nuestros 14 números —mismos pesos, muestreo de verdad—, partiendo del espectador de siempre:

Pasop(v)vp(h)hLectura
1 · percibirN/A(1, 1, 0, 0)0.95 / 0.27(1, 0)La red calcula que con un 95% de probabilidad al espectador le gusta el tenis y con un 27% el ciclismo. El muestreo enciende el tenis y apaga el ciclismo.
2 · imaginar y percibir0.73 / 0.73 / 0.27 / 0.27(1, 1, 0, 0)0.95 / 0.27(0, 0)La red imagina un espectador idéntico al real: el valle retiene a la pelota. Pero al percibirlo, el muestreo del 95% falla —ocurre una de cada veinte veces— y ningún factor se enciende.
3 · imaginar y percibir0.27 / 0.27 / 0.27 / 0.27(0, 0, 1, 1)0.27 / 0.95(0, 1)Sin factores encendidos mandan los biases; el azar enciende las dos etapas y la red, con total naturalidad, percibe a un ciclista.
4 · imaginar0.27 / 0.27 / 0.73 / 0.73(0, 1, 1, 1)La cadena se ha mudado al valle del ciclismo, sin memoria de dónde empezó. El ping-pong continúa…

Confieso que he elegido una ejecución entretenida —lo normal es que el valle de partida retenga la cadena bastantes pasos más—, pero muestra lo importante: a partir del fallo del muestreo en el paso 2, la cadena hace su vida y acaba en el valle del ciclismo, sin memoria de dónde empezó. Ese final ya no dice nada del espectador inicial: dice cosas de la red —el modelo cree que los ciclistas existen—. Y esa es la finalidad del muestreo de Gibbs: ver los sueños del modelo. Si dejáramos correr el ping-pong el tiempo suficiente y contáramos cuánto tiempo pasa la cadena en cada configuración, esas frecuencias serían exactamente P(v,h)P(v, h): habríamos muestreado la distribución de la red sin calcular ZZ jamás. Y entrenar, como veremos, exige precisamente eso: comparar los datos reales contra lo que el modelo sueña, y corregir la diferencia.

El problema está en tres palabras: "el tiempo suficiente". Nadie sabe cuántos pasos necesita la cadena para olvidar su origen —en nuestra tabla hizo falta un suceso de uno entre veinte—, no hay manera de comprobar que ya hemos llegado y, encima, el entrenamiento necesitaría ese paseo completo en cada actualización de los pesos, porque cada retoque cambia el paisaje. El ping-pong infinito es teóricamente perfecto e inviable en la práctica. La solución tiene nombre, una apuesta de un pragmatismo insultante y sección propia a continuación: Contrastive Divergence. No hace falta ver el sueño entero —con un único paso de ping-pong ya se ve hacia dónde empieza a desviarse la red, y esa dirección es todo lo que el aprendizaje necesita—.

Contrastive Divergence: comparar la realidad con el sueño

En 2002, Geoffrey Hinton propuso el atajo que hizo entrenables a las RBM, y su descaro es este: truncar el ping-pong a un solo paso. Nada de esperar a que la cadena olvide su origen; un viaje de ida, vuelta y otra vez ida, y con eso corregimos los pesos. El algoritmo se llama Contrastive Divergence, y la variante que usaremos —la estándar— es CD-1, donde el 1 es exactamente ese único paso de ping-pong.

La cadena completa tiene cinco paradas, y no hay nada nuevo que aprender: todas usan las dos fórmulas y el muestreo de la sección anterior.

v0    percibir    ph0    muestrear    h0    imaginar    pv1    percibir    ph1v^{0} \;\xrightarrow{\;\text{percibir}\;}\; p_{h}^{0} \;\xrightarrow{\;\text{muestrear}\;}\; h^{0} \;\xrightarrow{\;\text{imaginar}\;}\; p_{v}^{1} \;\xrightarrow{\;\text{percibir}\;}\; p_{h}^{1}

Un detalle antes de ponerle números: en toda la cadena sólo se muestrea una vez, al pasar de ph0p_{h}^{0} a h0h^{0}. Ese único muestreo obliga a la red a comprometerse con una interpretación binaria concreta —¿este espectador es tenis, ciclismo, ambos?— y aporta el ruido que le permite explorar. El resto de paradas se quedan en probabilidades: introducir más muestreos añadiría más ruido del necesario y haría el aprendizaje más errático. Veámosla con nuestro espectador y nuestros 14 números:

ParadaValoresQué es
v⁰ = (1, 1, 0, 0)La realidad: el espectador del dataset
pₕ⁰ = 0.95 / 0.27percibir v⁰Cómo responde la red a la realidad
h⁰ = (1, 0)muestrear pₕ⁰La interpretación concreta a la que se compromete: tenis
pᵥ¹ = 0.73 / 0.73 / 0.27 / 0.27imaginar desde h⁰El sueño de un paso: el espectador que la red imagina
pₕ¹ = 0.87 / 0.52percibir pᵥ¹Cómo responde la red a su propio sueño

Y ahora, la pregunta clave: ¿qué comparamos para corregir los pesos? Aquí hay una trampa en la que es fácil caer: no se compara v0v^{0} con pv1p_{v}^{1}, ni ph0p_{h}^{0} con ph1p_{h}^{1}, capa contra capa. Se comparan parejas contra parejas. Recordad qué significa cada peso: WijW_{ij} mide cuánto sentido tiene que el evento ii y el factor jj se enciendan juntos. Así que la pregunta que decide su actualización es: ¿este evento y este factor co-ocurren más en la realidad o más en el sueño?

ΔWij=ε(vi0ph,j0realidad    pv,i1ph,j1suen˜o)\Delta W_{ij} = \varepsilon \,\Big( \underbrace{v^{0}_{i} \cdot p^{0}_{h,j}}_{\text{realidad}} \;-\; \underbrace{p^{1}_{v,i} \cdot p^{1}_{h,j}}_{\text{sueño}} \Big)

donde ε\varepsilon es la tasa de aprendizaje, un número pequeño que convierte cada corrección en un pasito. La regla es de sentido común: si un par se enciende junto más en la realidad que en el sueño, la red aún no se cree del todo esa asociación — súbele el peso. Si se enciende más en el sueño que en la realidad, la red fantasea con una asociación que los datos no respaldan — bájale el peso. Y los biases siguen la misma lógica, comparando cada capa con su versión soñada: Δbv=ε(v0pv1)\Delta b^{v} = \varepsilon \, (v^{0} - p_{v}^{1}) y Δbh=ε(ph0ph1)\Delta b^{h} = \varepsilon \, (p_{h}^{0} - p_{h}^{1}).

Con los valores de la tabla se ve en acción. El cable entre la final de Wimbledon y el factor tenis: en la realidad, 10.95=0.951 \cdot 0.95 = 0.95; en el sueño, 0.730.870.640.73 \cdot 0.87 \approx 0.64. La realidad gana: ese peso sube. El cable entre la etapa de Hautacam y el factor ciclismo: en la realidad, 00.27=00 \cdot 0.27 = 0; en el sueño, 0.270.520.140.27 \cdot 0.52 \approx 0.14. La red sueña con más ciclismo del que este espectador justifica: ese peso baja. ¿Y no es injusto que un aficionado al tenis debilite las conexiones ciclistas? Lo sería, si entrenáramos con él solo: en la práctica cada actualización promedia las correcciones de un lote de espectadores, ciclistas incluidos, y cada cable acaba asentándose donde la realidad del conjunto lo sostiene. A continuación, una tabla de todos los pesos:

Queda lo más bonito, que es entender por qué un solo paso basta. La respuesta: porque no necesitamos saber a dónde llega el sueño, sólo hacia dónde empieza a desviarse. Si tras un único ciclo la red reproduce los datos —pv1v0p_{v}^{1} \approx v^{0}, ph1ph0p_{h}^{1} \approx p_{h}^{0}—, realidad y sueño coinciden, la resta se anula y los pesos dejan de moverse: el aprendizaje se detiene solo, exactamente cuando la red ya no distingue la realidad de sus sueños. Y si no coinciden, la dirección de la desviación es justo lo que hay que corregir. Los teóricos tardaron años en explicar del todo por qué esta aproximación funciona tan bien —el gradiente de CD-1 no es exactamente el gradiente verdadero, es un primo sesgado—, pero la evidencia práctica es aplastante: con este atajo, una RBM se entrena en segundos donde el método exacto necesitaría la edad del universo.

Esto es todo el algoritmo: percibir, muestrear, imaginar, volver a percibir, restar y dar un pasito. Repetido sobre lotes de espectadores durante unos cientos de épocas, esos 14 números —o los 90 del artículo anterior— acaban contando la verdad. Lo que queda por contar es lo que la teoría no dice: los detalles prácticos que separan un entrenamiento de manual de uno que no converge, y el bias descontrolado que prometimos al principio.