las ecuaciones de esta slide
φ : V → ℝd,   d ∈ [128, 4096](definición de embedding)
un embedding es una función que asigna a cada token del vocabulario V (palabra, frase, canción, producto…) un vector denso de dimensión d. El criterio que organiza el espacio: tokens semánticamente cercanos ⇒ vectores cercanos.
ew ∈ {0,1}|V|,   cos(eu, ev) = 0  si  u ≠ v(el problema del one-hot)
la codificación one-hot da a cada palabra un vector con un único 1 en su posición del vocabulario. Dos one-hot de palabras distintas son siempre ortogonales: su producto escalar es 0, luego su coseno es 0. "hipoteca" y "préstamo" quedan tan lejos como "hipoteca" y "camiseta": el formato no puede codificar similitud, por construcción.
guion paso a paso
  1. Deja A = hipoteca y mueve B por las 8 palabras mirando la fila "coseno one-hot" del lector. Siempre 0.000 (salvo cuando B = A, que da 1): el one-hot no distingue "casi sinónimo" de "no tiene nada que ver".
  2. Ahora mira la fila "coseno denso" con A = hipoteca: compara B = préstamo y B = camiseta. ≈0.99 contra ≈0.4: el denso ordena por parentesco semántico; el panel inferior lo muestra como ángulo.
  3. Pon A = turbina, B = panel solar. Coseno denso alto aunque las cadenas de texto no compartan ni una letra: la similitud vive en el vector, no en la ortografía.
  4. Sube |V| a 106 y lee la comparación de memoria. Un millón de dimensiones one-hot frente a d = 300 densas: el embedding comprime el vocabulario unas 3300 veces y encima gana la noción de similitud.
Comprueba que entiendes: ¿por qué el coseno entre dos one-hot distintos es exactamente 0 y no "pequeño"?
Porque el producto escalar suma producto a producto de coordenadas, y los dos vectores no tienen ningún 1 en la misma posición: cada sumando es 0·1 o 1·0 o 0·0. No es que la similitud sea débil: es que el formato la hace estructuralmente imposible. Cualquier noción de parecido tiene que venir de fuera (de los datos de co-ocurrencia, como verás en la slide de skip-gram), y para almacenarla hacen falta coordenadas reales compartidas: eso es el embedding denso.

Setup. Vocabulario de juguete con 8 palabras de tres sectores: banca (hipoteca, préstamo, crédito), retail (camiseta, vestido, zapatos) y energía (turbina, panel solar). Arriba: las dos palabras elegidas como vectores one-hot (8 casillas, un único 1). Abajo: las mismas 8 palabras como embeddings densos de dimensión d = 2, dibujados como flechas en el plano; A y B van resaltadas y el arco marca su ángulo. Spotify hace exactamente esto con 100 millones de canciones: nadie las etiqueta a mano; cada una es un vector y la cercanía es similitud.

Juega. Recorre pares dentro del mismo sector y entre sectores. En el one-hot, el coseno es un interruptor (1 si son la misma palabra, 0 si no); en el denso es una escala continua que ordena: préstamo está más cerca de hipoteca que de crédito, y los tres lejísimos de camiseta. El slider de |V| no toca la geometría: solo te enseña la factura de memoria de cada formato a escala real.

Lee así. El lector da los dos cosenos y la memoria por palabra: |V| números (casi todos 0) en one-hot contra d = 300 números con información en denso. La razón |V|/d es el factor de compresión.

Mensaje. Un embedding convierte datos complejos en vectores donde la cercanía es similitud. Todo lo demás del día (coseno, word2vec, búsqueda semántica, recomendación) es explotar esa geometría.

Términos. one-hot: vector indicador con un 1 en la posición de la palabra y 0 en el resto. denso: vector de d coordenadas reales, todas informativas. φ(w): el embedding de la palabra w. |V|: tamaño del vocabulario.

las ecuaciones de esta slide
cos(u,v) = uv‖u‖2 ‖v‖2 = Σi uivi√(Σi ui²) √(Σi vi²) ∈ [−1, 1](Ec. coseno)
la similitud estándar entre embeddings: numerador = producto escalar (suma de productos coordenada a coordenada); denominador = las dos normas euclídeas. Dividir por las normas borra la longitud: solo queda el ángulo. Vale 1 si apuntan igual, 0 si son perpendiculares, −1 si son opuestos.
dcos(u,v) = 1 − cos(u,v) ∈ [0, 2](distancia coseno)
la distancia asociada: 0 = misma dirección, 1 = perpendiculares, 2 = opuestos. En alta dimensión las normas se concentran y la distancia euclídea pierde discriminación; el ángulo sigue siendo informativo: por eso los embeddings se comparan con coseno.
guion paso a paso
  1. Con los ángulos en 25° y 65°, sube ‖v‖ de 0.2 a 3. El producto escalar u·v cambia mucho, pero el coseno no se mueve ni una milésima: la división por las normas elimina la longitud.
  2. Acerca θv a θu. El coseno sube hacia 1.000 y el badge pasa a "similares" cuando cruza tu umbral: así decide un buscador semántico si un documento es relevante.
  3. Pon θv = θu + 90. cos = 0.000 exacto: perpendiculares = "no tienen nada que ver". Sigue hasta +180 y verás cos = −1: significados opuestos.
  4. Baja el umbral a 0.50 y vuelve a 0.95 con un ángulo intermedio fijo. El mismo par pasa de "similares" a "no similares" sin tocar los vectores: el umbral es una decisión de negocio (precisión vs cobertura), no una propiedad de la geometría.
Comprueba que entiendes: dos embeddings con normas 0.3 y 2.9 dan cos = 0.98, ¿son similares o no?
Similares. El coseno solo mira la dirección, y 0.98 dice que apuntan casi igual. La norma puede codificar otras cosas (frecuencia de la palabra, longitud del documento), pero la semántica de "hablan de lo mismo" vive en el ángulo. Por eso la receta práctica del curso es normalizar los embeddings a norma 1 al guardarlos: entonces el producto escalar YA es el coseno y la comparación se reduce a una multiplicación de matrices, que es exactamente lo que hace la línea sims = embs @ query de la receta del deck.

Setup. Dos vectores 2D, u (tinta) y v (dorado), controlados por su ángulo y su módulo. El arco marca el ángulo entre ambos; la circunferencia gris es la de norma 1, donde viven los embeddings normalizados. El lector calcula en vivo u·v, las normas, el coseno con la fórmula completa y la distancia dcos = 1 − cos.

Juega. El experimento clave es el primero del guion: cambia los módulos cuanto quieras y comprueba que el coseno no se inmuta. Es la propiedad que lo hace adecuado para embeddings: "lo mismo dicho más alto" (un vector más largo en la misma dirección) sigue siendo lo mismo. Después juega con el ángulo, que es donde vive toda la información.

Lee así. En 2D, cos(u,v) coincide con el coseno trigonométrico del ángulo θu − θv, y el lector te enseña ambos números para que verifiques que la fórmula algebraica y la geometría dicen lo mismo. En dimensión 768 no puedes dibujar el ángulo, pero la fórmula es idéntica.

Mensaje. Cuándo dudar: si tus vectores no están normalizados y la magnitud sí codifica algo (por ejemplo frecuencia), la euclídea puede tener sentido. En RAG, sentence-similarity y búsqueda semántica: coseno, y normaliza al guardar.

Términos. u·v: producto escalar, Σuivi. ‖u‖2: norma euclídea, √(Σui²). normalizar: dividir el vector por su norma para dejarlo en la esfera unidad. umbral: corte de decisión sobre el coseno; lo eliges tú, no el modelo.

las ecuaciones de esta slide
q = (1,0,1):   cos(q,d1) = 12 = 0.500,   cos(q,d2) = 1√2 = 0.707,   cos(q,d3) = 22 = 1.000(el ejemplo del deck)
con d1 = (1,1,0), d2 = (0,0,1), d3 = (1,0,1): productos escalares 1, 1 y 2; normas ‖q‖ = √2, ‖d1‖ = √2, ‖d2‖ = 1, ‖d3‖ = √2. El ranking d3 > d2 > d1 es el principio de la búsqueda semántica.
u = (1,2,3), v = (2,4,6):   cos(u,v) = 28√14 · √56 = 1.000(colineales)
u·v = 2+8+18 = 28; ‖u‖ = √14 ≈ 3.74, ‖v‖ = √56 ≈ 7.48; 28/(3.74·7.48) = 1. v = 2u: misma dirección en distinta escala ⇒ representan lo mismo. Es la verificación numérica de la slide anterior.
guion paso a paso
  1. Con la query por defecto (1,0,1), reproduce a mano la primera fila de la tabla: q·d1 = 1·1 + 0·1 + 1·0. Sale 1; con las normas √2·√2 = 2, el coseno es 0.500, exactamente lo que pone la tabla. Toda la slide es esta cuenta repetida.
  2. Sube q₂ de 0 a 3. d1 = (1,1,0) escala posiciones en el ranking: acabas de mover la query hacia su tema. d3 pierde el primer puesto sin que d3 haya cambiado.
  3. Pon q = (2,0,2). cos(q,d3) = 1.000 otra vez: (2,0,2) es el doble de (1,0,1), misma dirección. Es el ejemplo u = (1,2,3), v = (2,4,6) del panel, en vivo.
  4. Pon q = (0,0,3). cos(q,d2) = 1.000 y cos(q,d1) = 0.000: query y documento perpendiculares no comparten ninguna coordenada activa.
Comprueba que entiendes: ¿por qué cos(q,d₃) = 1 no significa "documentos idénticos" sino "misma dirección"?
Porque el coseno es ciego a la escala: q = (2,0,2) y d3 = (1,0,1) dan coseno 1 siendo vectores distintos. En recuperación esto es una virtud: un documento largo que habla de lo mismo que tu query corta debe puntuar alto. Si necesitases distinguir escala (por ejemplo, intensidad de una señal), el coseno sería la métrica equivocada y volverías a la euclídea, como avisaba la slide anterior.

Setup. El ejemplo a mano del deck, hecho manipulable: una query q de 3 componentes (sliders) y tres documentos fijos d1 = (1,1,0), d2 = (0,0,1), d3 = (1,0,1). Piensa cada componente como "cuánto habla de" un tema: 1 = hipotecas, 2 = rebajas, 3 = energía. Arriba: las cuatro barras de componentes. Abajo: los tres cosenos como barras ordenadas. La tabla da la cuenta completa: producto escalar, normas, coseno y ranking.

Juega. La gracia está en ver el ranking reordenarse en vivo: cada slider mueve la query por el espacio de temas y los tres documentos, quietos, suben y bajan en la tabla. Eso es literalmente lo que hace un buscador semántico con tu pregunta: la codifica, calcula tres (o tres millones de) cosenos y ordena.

Lee así. En la tabla, comprueba que el coseno nunca sale del rango [0,1] aquí: con componentes no negativas no hay ángulos obtusos. El −1 del rango teórico solo aparece con coordenadas negativas, que los embeddings reales sí tienen.

Mensaje. No hay magia: la búsqueda semántica de BBVA o de un buscador corporativo es esta tabla con d = 1024 en vez de d = 3 y un millón de documentos en vez de tres. La cuenta por celda es la misma multiplicación y la misma división.

Términos. query: la pregunta del usuario, convertida en vector. documento: cada texto del corpus, convertido en vector al indexar. ranking: orden descendente por coseno; el top-k se le enseña al usuario.

las ecuaciones de esta slide
vecinos(q) = argmaxw ∈ V  cos(φ(q), φ(w))(búsqueda de vecinos)
la operación elemental sobre un mapa semántico: dada una query q, ordenar TODO el vocabulario por coseno con ella y quedarse con los k primeros. Es la misma fórmula de las slides anteriores aplicada |V| veces.
indexar: φ(dj) ∀j  →  consultar: φ(q)  →  ordenar: cos(φ(q),φ(dj))(pipeline de 3 pasos)
el pipeline completo de la nota técnica: (1) calcular el embedding de cada elemento del corpus y guardarlo en una base vectorial (FAISS, Milvus, Qdrant); (2) calcular el embedding de la query; (3) devolver los k de mayor coseno. Es la columna vertebral de RAG.
guion paso a paso
  1. Con la query por defecto, lee la tabla. Los k vecinos son todos de banca (hipoteca, préstamo, ahorro…): la query apunta hacia ese barrio del mapa.
  2. Arrastra la query con los sliders hasta el barrio de retail (x ≈ 0.3, y ≈ 1.0). El ranking entero se reordena en vivo: camiseta, rebajas y Zara suben; los términos de banca caen al fondo con cosenos bajos.
  3. Plántala entre dos barrios (x ≈ 0.65, y ≈ 0.65). La tabla mezcla banca y retail con cosenos parecidos: las fronteras semánticas son graduales, no muros. Aquí es donde un buscador devuelve resultados "de ambos temas".
  4. Pon y negativa (x ≈ 0.1, y ≈ −1.0). Aparecen serie, película, Netflix: el cuadrante del streaming. Cuatro sectores, cuatro direcciones; el coseno solo mide a qué dirección te pareces más.
Comprueba que entiendes: dos palabras del mismo barrio con radios distintos (una más lejos del origen), ¿cuál gana en la tabla?
La que tenga el ángulo más parecido al de la query, sin importar el radio: el coseno normaliza las normas. Una palabra "más lejos del origen" en este mapa no es más relevante, solo tiene un vector más largo. Si quisieras que la popularidad o la frecuencia contara, tendrías que meterla aparte (por ejemplo multiplicando el coseno por un peso de negocio), que es exactamente lo que hacen los buscadores reales con señales de ranking adicionales.

Setup. Veinte términos de negocio con coordenadas fijas en un plano semántico de juguete, agrupados en cuatro barrios direccionales: banca (hipoteca, préstamo, ahorro, interés, BBVA), retail (camiseta, vestido, rebajas, tienda, Zara), energía (turbina, panel solar, gas, red eléctrica, Iberdrola) y streaming (serie, película, playlist, podcast, Netflix). La flecha dorada es tu query; las líneas finas la conectan con sus k vecinos más próximos por coseno, y la tabla da el ranking exacto.

Juega. Mueve la query como si fuera la pregunta de un usuario que va cambiando de tema. Fíjate en que el ranking es continuo: no hay un salto brusco al cruzar de barrio, sino un relevo gradual de cosenos. Esa suavidad es la que permite a un buscador semántico responder bien preguntas ambiguas.

Lee así. En la tabla, la columna cos es el número que una base vectorial calcula para cada documento del índice; la columna barrio te deja verificar que la geometría coincide con la semántica. En producción el mapa tiene d = 1024 dimensiones y no se puede dibujar, pero el ranking se construye igual.

Mensaje. Un mapa semántico es un índice: indexar = colocar cada elemento en su sitio del espacio; buscar = colocar la query y mirar quién cae cerca. Inditex lo hace con productos, Spotify con canciones, BBVA con documentos hipotecarios.

Términos. base vectorial: almacén optimizado para "dame los k vectores de mayor coseno con este" (FAISS, Milvus, Qdrant). vecino: elemento del índice con coseno alto respecto a la query. k: cuántos resultados devuelves.

las ecuaciones de esta slide
φ(rey) − φ(hombre) + φ(mujer) ≈ φ(reina)(Ec. aritmética)
el resultado canónico de word2vec: rey y reina comparten el componente "realeza" y difieren en el componente "género"; restar hombre y sumar mujer es un paseo por el eje de género. Si la aritmética funciona, los vectores han capturado relaciones semánticas reales, no solo co-ocurrencia.
respuesta = argmaxw ∉ {a,b,c}  cos(a − b + c, φ(w))(cómo se evalúa)
en la práctica la analogía se resuelve calculando el vector r = a − b + c y buscando la palabra del vocabulario más cercana por coseno, excluyendo las tres palabras de entrada (si no, a menudo gana la propia a). La tabla de la derecha hace exactamente esto.
guion paso a paso
  1. Con la analogía rey − hombre + mujer, lleva t de 0 a 1 despacio. El punto dorado sale de rey, recorre una trayectoria paralela al vector hombre→mujer y aterriza encima de reina: la dirección "género" es la misma en las dos parejas.
  2. Con t = 1, lee la tabla. reina gana con coseno ≈ 1; princesa queda segunda (comparte realeza y género pero no exactamente el mismo punto). El argmax excluye rey, hombre y mujer.
  3. Cambia a Zara − ropa + banca. El paseo "quita el sector ropa y pone el sector banca" manteniendo el componente marca: aterriza en BBVA, con Santander cerca. La misma álgebra sirve para marcas.
  4. Prueba Netflix − película + música y Madrid − España + Francia. Spotify y París: dos ejes distintos (catálogo→medio, capital→país) capturados por la misma resta de vectores.
Comprueba que entiendes: ¿por qué funciona la resta? ¿Qué tiene que cumplir el espacio para que a − b + c caiga en el sitio correcto?
Que la relación semántica sea aproximadamente una traslación constante: el vector que va de hombre a mujer debe ser casi el mismo que va de rey a reina (y de actor a actriz…). Entonces φ(reina) ≈ φ(rey) + (φ(mujer) − φ(hombre)), que es la ecuación del panel reordenada. word2vec produce esta estructura porque palabras que se usan en contextos análogos reciben desplazamientos análogos durante el entrenamiento. Cuando la relación no es lineal (polisemia, jerga), la aritmética falla, y eso motivó los embeddings contextuales.

Setup. Cuatro analogías con vectores 2D de juguete cuyos ejes son interpretables (por ejemplo, eje x = "género / es-marca / es-ciudad", eje y = "realeza / sector / país"). El canvas dibuja las cuatro palabras implicadas, el vector diferencia c − b (flecha discontinua) y el paseo a + t·(c − b), que con t = 1 completa el paralelogramo. Los puntos grises son el resto del vocabulario de esa analogía: los distractores entre los que el argmax tiene que acertar.

Juega. El slider t convierte la ecuación en un viaje: en t = 0 estás en a; según creces, le vas restando b y sumando c. Mira cómo la tabla de vecinos del punto móvil se reordena durante el viaje: a mitad de camino el punto está "entre dos significados".

Lee así. El lector da el vector r = a − b + c calculado en vivo, su palabra más cercana excluyendo las entradas y el coseno con la respuesta correcta. Si el coseno del ganador es bajo, la analogía es dudosa: con embeddings reales ocurre constantemente, y conviene mirar siempre el número, no solo el argmax.

Mensaje. La aritmética es el test de calidad clásico de un espacio de embeddings: verifica que las direcciones codifican relaciones. Para negocio importa porque las mismas direcciones (sector, gama, urgencia) se pueden explotar para navegar catálogos y carteras sin etiquetar nada a mano.

Términos. analogía: a es a b lo que c es a ¿? paralelogramo: la figura que completa a − b + c. distractor: palabra del vocabulario que podría ganar el argmax por error.

las ecuaciones de esta slide
L(θ) = Σt=1..T Σwc ∈ Ct  log pθ(wc | wt)(Ec. skip-gram)
el objetivo de word2vec (variante skip-gram): para cada posición t del corpus, la palabra central wt debe predecir cada palabra de su ventana de contexto Ct. Maximizar L empuja a que palabras que comparten contextos acaben con embeddings parecidos.
pθ(wc | wt) = softmax(φ(wc)φ(wt)) = exp(φ(wc)φ(wt))Σw ∈ V exp(φ(w)φ(wt))(el softmax caro)
la probabilidad de un contexto es el producto escalar de embeddings pasado por softmax. El denominador recorre todo el vocabulario (105–106 términos) en cada paso de entrenamiento: por eso la slide siguiente lo sustituye por negative sampling.
guion paso a paso
  1. Con m = 2, recorre la frase 1 con el slider de posición. La franja superior marca en dorado la palabra central y en dorado pálido su ventana: cada posición genera |Ct| pares (central, contexto). El lector los cuenta.
  2. Sube m de 1 a 4 con la misma posición. El heatmap entero se rellena: más ventana = más pares = más co-ocurrencias contadas. El total de pares del corpus en el lector crece de decenas a cientos.
  3. Busca la celda (banco, hipoteca) en el heatmap con m = 2. Está encendida porque co-ocurren en las frases 1 y 3; la celda (banco, rebajas) está apagada: nunca comparten ventana. Esta asimetría es TODA la señal de la que aprende word2vec.
  4. Compara las filas de "hipoteca" y "préstamo". Patrones de co-ocurrencia casi idénticos (ambas se encienden con banco, cliente, paga…): palabras con filas parecidas acabarán con embeddings parecidos. Distribucionalismo puro: "dime con quién co-ocurres y te diré qué significas".
Comprueba que entiendes: "hipoteca" y "préstamo" casi nunca aparecen JUNTAS en una misma frase. ¿Por qué acaban cerca en el espacio?
Porque lo que las acerca no es co-ocurrir entre sí, sino co-ocurrir con los mismos terceros: ambas comparten ventana con banco, cliente, paga, concede. En el objetivo skip-gram, ambas necesitan producto escalar alto con esos mismos contextos, y la forma geométrica de lograrlo es apuntar en direcciones parecidas. La similitud emerge de filas parecidas en la matriz de co-ocurrencia, no de celdas individuales. Por eso los sinónimos (que rara vez van juntos en una frase) quedan cerca.

Setup. Corpus de juguete con 7 frases de negocio ("el banco concede la hipoteca", "la tienda lanza rebajas de ropa"…), con los artículos y preposiciones ya filtrados. Arriba: la frase elegida como tira de tokens, con la palabra central wt en dorado y su ventana Ct (m palabras a cada lado) en dorado pálido. Abajo: la matriz de co-ocurrencia de TODO el corpus construida en vivo con la ventana m: la celda (i,j) cuenta cuántas veces la palabra j cayó en la ventana de la palabra i.

Juega. La ventana es el único hiperparámetro y decide qué significa "contexto": con m = 1 solo cuentan los vecinos inmediatos (señal sintáctica); con m = 4 casi toda la frase co-ocurre con casi todo (señal temática, más difusa). Google entrenó el word2vec original con este mismo mecanismo sobre 100 000 millones de palabras de Google News.

Lee así. El lector enumera los pares (central, contexto) de la posición elegida: son exactamente los sumandos de L(θ) que esa posición aporta. El heatmap es la "contabilidad" agregada de todos esos pares; el entrenamiento de la slide siguiente no ve la matriz, ve los pares de uno en uno, pero converge a la misma información.

Mensaje. Un embedding no sabe diccionario: sabe estadística de compañías. La hipótesis distribucional (palabras que aparecen en contextos parecidos significan cosas parecidas) convertida en un objetivo de predicción es todo el secreto de word2vec.

Términos. wt: palabra central en la posición t. Ct: su ventana de contexto, m palabras a cada lado. co-ocurrencia: número de veces que dos palabras comparten ventana. T: longitud del corpus en tokens.

las ecuaciones de esta slide
L = −log σ(vcvt) − Σi=1..k log σ(−vnivt),    σ(x) = 11+e−x(Ec. negative sampling)
la pérdida que sustituye al softmax: el primer término quiere producto escalar alto con el contexto real vc (par positivo); el segundo quiere producto escalar bajo con k palabras aleatorias vni (negativos). Con k = 5–20 negativos por par, word2vec aprende sobre vocabularios enormes; aproxima la estimación contrastiva de ruido (NCE).
∂L∂vt = (1−σ(vcvt)) vcΣi σ(vnivt) vni(el gradiente que dibuja el canvas)
el paso de descenso, leído en palabras: acerca vt hacia su contexto (con fuerza grande si aún no se parecen: 1−σ grande) y aleja vt de cada negativo (con fuerza grande si por azar se parecen: σ grande). El botón "un paso" aplica literalmente esta fórmula a cada embedding 2D del plano.
guion paso a paso
  1. Pulsa "reiniciar" y mira el plano. Las 10 palabras caen al azar: banco tan lejos de hipoteca como de rebajas. El coseno medio de los pares positivos del lector ronda el 0: aún no hay semántica.
  2. Pulsa "un paso de entrenamiento" tres o cuatro veces seguidas. En cada pulsación los puntos se desplazan: las líneas doradas (pares que co-ocurren) se acortan y la pérdida del panel inferior baja. Estás viendo el gradiente de la ecuación, no una animación.
  3. Pulsa "20 pasos". El plano se organiza en tres barrios (banca, retail, música) sin que nadie le haya dicho qué palabra es de qué tema: solo había pares de co-ocurrencia. La separación positivos/aleatorios del lector se abre.
  4. Reinicia, pon η = 0.8 y dale a "20 pasos". La pérdida baja a tirones o oscila: un paso demasiado grande sobrepasa el mínimo. Baja a η = 0.1 y verás la bajada suave pero lenta: el dilema clásico del learning rate.
  5. Reinicia y compara k = 1 contra k = 5 (mismos pasos). Con k = 5 la nube de "no relacionados" se separa antes: más negativos = mejor señal de contraste por paso, a más coste.
Comprueba que entiendes: ¿por qué hacen falta los negativos? ¿Qué pasaría entrenando solo con el término positivo?
Sin negativos, la pérdida −log σ(vcvt) se minimiza haciendo TODOS los productos escalares enormes: la solución degenerada es que todos los embeddings colapsen en la misma dirección con norma creciente (coseno 1 entre todo). El espacio sería inútil: todo se parecería a todo. Los negativos son la fuerza repulsiva que lo impide: cada par aleatorio empuja en dirección contraria. El equilibrio entre atracción (co-ocurrencias) y repulsión (azar) es lo que esculpe los barrios semánticos, igual que en cualquier aprendizaje contrastivo moderno (SimCLR, CLIP).

Setup. Diez palabras del corpus de la slide anterior, con embeddings 2D inicializados al azar (semilla reproducible). Los pares positivos son las co-ocurrencias reales del corpus (banco–hipoteca, tienda–rebajas, playlist–música…), dibujados como líneas doradas. Cada "paso de entrenamiento" recorre todos los pares positivos, muestrea k negativos al azar para cada uno y aplica el gradiente exacto del panel de ecuaciones con tasa η. El panel inferior registra la pérdida media por par en cada paso.

Juega. Esta slide es el corazón del día: el plano moviéndose ES word2vec entrenando, a escala 10 palabras y d = 2 en vez de un millón de palabras y d = 300. Todo lo que ajustes (k, η) son los mismos hiperparámetros que ajustaría un ingeniero de Google en 2013.

Lee así. El lector da tres números: pérdida media actual, coseno medio de los pares positivos (debe subir hacia 1) y coseno medio de pares no relacionados (debe bajar hacia 0 o negativo). La diferencia entre ambos cosenos es la "calidad semántica" del espacio: cuando se estanca, el modelo ha convergido.

Mensaje. Entrenar embeddings = geometría con dos fuerzas: acercar lo que co-ocurre, alejar lo aleatorio. El softmax completo haría la repulsión contra el vocabulario entero en cada paso; el negative sampling la aproxima con k muestras y hace el problema tratable.

Términos. vt, vc, vn: embeddings de la palabra central, del contexto real y del negativo muestreado. σ: sigmoide, convierte un producto escalar en una probabilidad. η: tasa de aprendizaje. época: una pasada por todos los pares positivos.

las ecuaciones de esta slide
φctx(wt) = Transformer(w1:T)t(Ec. contextual)
en word2vec cada token tiene UN vector, sea cual sea la frase; en BERT y descendientes el vector del token t depende de la frase entera w1:T: la misma palabra produce vectores distintos en frases distintas. Se entrena con Masked Language Modeling: se oculta el 15% de los tokens y la red los reconstruye mirando todo el contexto bidireccional.
demo: φctx(banco) ∝ φ(banco) + γΣw ∈ frase aw φ(w),   aw = exp(φ(w)φ(banco)/T°)Σw′ exp(φ(w′)φ(banco)/T°)(atención de juguete)
la maqueta mínima de esa idea, calculada en vivo: el vector estático de "banco" se mezcla con los vectores de sus vecinos de frase, ponderados por una atención softmax (pesos aw que suman 1). γ regula cuánto contexto entra y T° cuán concentrada está la atención. Es el germen del mecanismo de atención del Día 09.
guion paso a paso
  1. Con la frase 1 ("el banco aprueba la hipoteca con interés fijo"), sube γ de 0 a 1. El punto dorado sale del "banco" estático (a medio camino entre los dos sentidos) y viaja hacia el ancla "entidad financiera": el coseno con ese sentido sube por encima de 0.95.
  2. Cambia a la frase 2 ("me senté en el banco de madera del parque") con la misma γ. El MISMO token viaja ahora hacia el ancla "asiento": dos frases, dos vectores. Esto es lo que word2vec no puede hacer.
  3. Pon la frase 3 ("junto al parque, el banco ofrece hipotecas") y mira la tabla de atención. "parque" e "hipotecas" compiten; el vector queda entre los dos sentidos, más cerca del financiero porque "hipotecas" y "ofrece" suman más atención. La ambigüedad real produce vectores intermedios.
  4. Baja T° a 0.2 en la frase 3. La atención se concentra casi toda en la palabra más afín y el vector se decanta de golpe; con T° = 3 la atención se reparte casi uniforme y el vector apenas se decide. La temperatura controla cuán "tajante" es el contexto.
Comprueba que entiendes: ¿por qué el "banco" estático de word2vec está condenado a quedar a medio camino entre los dos sentidos?
Porque el entrenamiento le exige un único vector con producto escalar alto a la vez con los contextos financieros (hipoteca, aprueba, interés) y con los de mobiliario (parque, madera, sentarse). La solución de compromiso es un promedio ponderado por frecuencia de los dos sentidos, que no representa bien ninguno. Un buscador semántico construido sobre vectores estáticos devuelve bancos de parque a quien pregunta por hipotecas; el embedding contextual deshace la mezcla frase a frase, y por eso es la pieza fundamental de la búsqueda semántica empresarial moderna.

Setup. El plano muestra dos anclas de sentido (ancla "entidad financiera" y ancla "asiento de parque"), los vectores de las palabras de contexto (gris), el embedding estático de "banco" (tinta, fijo) y su embedding contextual (dorado, móvil), calculado en vivo con la atención de juguete del panel: softmax real sobre productos escalares, mezcla con peso γ, normalización final. La tabla da los pesos de atención aw de cada palabra de la frase, que suman 1.000.

Juega. El experimento central es el contraste entre las frases 1 y 2: idéntico token, vectores finales opuestos. La frase 3 añade el caso interesante de verdad: contexto mixto, vector intermedio. Con γ = 0 recuperas exactamente word2vec; con γ = 1 el contexto domina.

Lee así. En el lector, los dos cosenos (a sentido financiero y a sentido asiento) cuantifican la desambiguación; el badge declara el sentido ganador. En BERT real esto mismo lo hacen 12 capas de atención con cientos de dimensiones, pero la lógica (mezclar el token con sus vecinos ponderados por afinidad) es la que acabas de tocar.

Mensaje. Estático → contextual es el salto de 2013 a 2018 (word2vec → ELMo/BERT) y la razón de que la búsqueda semántica moderna funcione con lenguaje ambiguo. El Día 09 abre la caja del Transformer que calcula esta atención en serio.

Términos. MLM: Masked Language Modeling, ocultar tokens y reconstruirlos. atención: pesos softmax con los que un token mira a sus vecinos. : temperatura del softmax; baja = atención concentrada. mean pooling: promediar los vectores contextuales de una frase para obtener su embedding de oración (SBERT, MPNet).

las ecuaciones de esta slide
scoresem(q, dj) = cos(φ(q), φ(dj))(ranking semántico)
la columna vertebral de RAG: embebe la query, embebe cada documento al indexar, ordena por coseno. No necesita que compartan ni una sola palabra: compara significados.
scorelex(q, d) = Σt ∈ q ∩ d  idf(t) tf·(k₁+1)tf + k₁(1 − b + b |d|/ℓ̄),   idf(t) = ln(1+N−df+0.5df+0.5)(BM25 simplificado)
el buscador clásico: solo puntúan los términos t que aparecen literalmente en query y documento (q ∩ d); tf = veces que t aparece en d, df = en cuántos documentos aparece (los términos raros valen más), |d|/ℓ̄ penaliza documentos largos; k₁ = 1.2, b = 0.75. Si no hay palabras compartidas, la suma es vacía: score 0, por relevante que sea el documento.
guion paso a paso
  1. Empieza con la query 2 ("gastos de abrir un préstamo bancario"). El léxico solo encuentra el documento que dice "préstamo"; el semántico también levanta "la hipoteca incluye comisión de apertura", que es la respuesta buena y no comparte ni una palabra con la query.
  2. Pasa a la query 3 ("ropa de mujer barata"). BM25 = 0.00 en TODOS los documentos: ni "ropa" ni "barata" aparecen literalmente en el corpus. El buscador léxico devuelve la página vacía; el coseno rankea rebajas, camisetas y vestidos sin despeinarse.
  3. Prueba la query 4 ("oficinas del banco"). El léxico pica con "el banco del parque es de madera" (¡contiene "banco"!) y lo pone arriba; el semántico lo hunde porque su embedding vive en el barrio del parque, no en el de banca. Es el fallo inverso: coincidencia de caracteres sin coincidencia de significado.
  4. Vuelve a la query 1 ("costes de una hipoteca"). Aquí ambos aciertan: cuando query y documento comparten el término clave, el léxico es excelente. La lección no es "BM25 malo": es que cada uno falla donde el otro acierta; los buscadores serios combinan ambos (búsqueda híbrida).
Comprueba que entiendes: ¿por qué BM25 da exactamente 0 a un documento perfecto que no comparte palabras, y qué propiedad del embedding evita ese colapso?
BM25 suma únicamente sobre q ∩ d, los términos literalmente compartidos: conjunto vacío, suma 0, sin matices. Es una métrica sobre símbolos discretos: "hipoteca" y "préstamo vivienda" son tan distintos como "hipoteca" y "playlist". El embedding rompe esa discreción: proyecta ambos textos a un espacio continuo donde el entrenamiento (co-ocurrencia, contrastivo) ya colocó cerca los significados afines, y el coseno mide esa cercanía aunque el solapamiento léxico sea nulo. La sinonimia se paga en BM25 y es gratis en el espacio semántico.

Setup. Mini-buscador sobre 10 documentos de juguete (frases de banca, retail, energía, streaming, y un "banco del parque" puesto ahí con toda la intención), con embeddings 2D precalculados coherentes con el mapa semántico de la slide 4. Para cada query: el panel superior sitúa documentos y query en el plano; el inferior compara las dos puntuaciones por documento (barra dorada = coseno, barra tinta = BM25 reescalado); la tabla da números y rankings exactos. El BM25 se calcula de verdad sobre los textos tokenizados: tf, df, longitudes y todo.

Juega. Las cuatro queries están elegidas para cubrir la casuística completa: ambos aciertan / el léxico se queda corto (sinonimia) / el léxico devuelve vacío (vocabulario disjunto) / el léxico acierta de más (polisemia de "banco"). Recorre las cuatro mirando primero el badge y luego la tabla.

Lee así. En la tabla, rks y rkl son las posiciones en cada ranking. Las discrepancias grandes entre ambas columnas son exactamente los casos que justifican pagar por un buscador semántico; donde coinciden, BM25 (gratis y rapidísimo) ya bastaba.

Mensaje. La receta de 10 líneas del deck (SentenceTransformer + normalize + producto escalar) implementa la columna dorada de esta tabla. En el Día 15 le añadiremos la generación encima: eso es RAG.

Términos. tf: frecuencia del término en el documento. df: número de documentos que contienen el término. idf: peso que premia términos raros. búsqueda híbrida: combinar score léxico y semántico (p. ej. suma ponderada o reciprocal rank fusion).

las ecuaciones de esta slide
afinidad(u, pi) = cos(u, pi),    recomendar = top-k por afinidad(usuarios y productos, mismo espacio)
el truco de los recomendadores de embeddings (Netflix, Spotify, Amazon): proyectar usuarios y productos al mismo espacio. El perfil del usuario es un vector (p. ej. el promedio de lo que compró); recomendar es buscar sus vecinos entre los productos: la misma operación del buscador, con personas en vez de queries.
CTR̂i = σ(8·(cos(u,pi) − 0.6)),    KPI = Σi ∈ top-k CTR̂i · precioi · margen(del coseno al euro)
el puente a negocio de esta demo: una curva de respuesta (sigmoide) convierte afinidad en probabilidad de clic, y el KPI esperado por usuario suma probabilidad × precio × margen (20%) sobre lo recomendado. Calibrar esa curva con datos reales es trabajo del equipo de analytics; la estructura coseno → propensión → euros es la estándar.
guion paso a paso
  1. Con el perfil por defecto (moda 0.8, tecnología 0.2), lee la tabla. El top-3 es todo moda (vestido, bolso, abrigo): el usuario apunta hacia ese lado del espacio y el coseno lo sabe.
  2. Invierte el perfil (moda 0.1, tecnología 0.9). El top-3 salta a móvil, portátil, auriculares y el KPI esperado se multiplica: la tecnología de este catálogo tiene precios mucho más altos. Mismo algoritmo, cesta más cara.
  3. Pon un perfil mixto (0.6, 0.6). Entran productos puente (smartwatch, cámara): comparten dirección con ambos gustos. El recomendador interpola gustos sin reglas escritas a mano.
  4. Con el perfil mixto, sube k de 1 a 6 mirando el KPI. Cada producto extra añade cada vez menos: el CTR estimado cae con el coseno (rendimientos decrecientes). Elegir k es equilibrar ingreso esperado contra saturar al usuario: decisión de negocio sobre una curva que ahora sabes leer.
Comprueba que entiendes: ¿de dónde sale el vector de un usuario nuevo que aún no ha comprado nada?
No sale: es el problema del arranque en frío. Las soluciones estándar son tres: usar atributos declarados (al registrarse marca "me interesa moda" ⇒ vector inicial como el de tus sliders); usar el embedding de su comportamiento inmediato (las dos primeras búsquedas de la sesión, embebidas y promediadas); o arrancar con el vector medio de la población e ir actualizándolo con cada clic. En cuanto hay historial, el perfil pasa a ser el promedio (a menudo ponderado por recencia) de los embeddings de los productos con los que interactuó: u vive en el mismo espacio que los pi por construcción.

Setup. Doce productos de un e-commerce con embeddings 2D fijos en dos ejes interpretables (afinidad a moda, afinidad a tecnología) y un precio cada uno: camisetas de 15€ en una esquina, portátiles de 999€ en la otra, productos puente (smartwatch, cámara) en medio. Tus dos sliders definen el vector del usuario en ese mismo espacio. El canvas dibuja catálogo, usuario (flecha dorada) y el top-k recomendado (resaltado); la tabla calcula coseno, CTR estimado y contribución en euros de cada recomendación.

Juega. Piensa cada movimiento de slider como un segmento de clientes distinto: la fashionista, el gadgetero, el indeciso. El mismo espacio y la misma fórmula sirven para los tres; lo único que cambia es dónde está u. Esto es lo que significa "recomendación personalizada a escala": no hay una regla por cliente, hay un espacio compartido y un coseno.

Lee así. El KPI del lector es ingreso esperado por usuario y sesión. Multiplícalo mentalmente por los 5 millones de sesiones mensuales de un retailer mediano: una mejora de céntimos en esta pantalla son millones al año. Por eso Netflix atribuye más de 1000 M$/año a su recomendador.

Mensaje. Búsqueda y recomendación son el mismo problema geométrico: vecinos por coseno en un espacio compartido. Si entendiste el buscador de la slide anterior, ya entiendes Discover Weekly: cambia documentos por canciones y queries por tu historial.

Términos. u: vector de perfil del usuario. pi: embedding del producto i. CTR: probabilidad de clic. top-k: los k productos de mayor afinidad. arranque en frío: usuario o producto sin historial.

1 — Representar: de one-hot a denso
Slides: One-hot · Mapa
"El one-hot hace la similitud imposible (todos los cosenos 0); el embedding φ : V → ℝd la hace geométrica: tokens semánticamente cercanos, vectores cercanos. Veinte palabras de negocio caben en un plano y sus barrios son sectores."
2 — Medir: la similitud coseno
Slides: Coseno · A mano
"cos(u,v) = uv / (‖u‖ ‖v‖): solo dirección, nunca longitud. Sabes calcularla a mano (q = (1,0,1) contra tres documentos) y sabes que normalizar al guardar convierte la búsqueda en un producto de matrices."
3 — Entrenar: co-ocurrencia + contraste
Slides: Skip-gram · Negativos · Analogías
"Skip-gram maximiza Σ log p(wc|wt) sobre las ventanas; negative sampling sustituye el softmax carísimo por acercar pares reales y alejar k aleatorios. El espacio resultante hace aritmética: rey − hombre + mujer ≈ reina."
4 — Contextualizar: de word2vec a BERT y E5
Slides: Contexto
ctx(wt) = Transformer(w1:T)t: 'banco' deja de tener un único vector y se desplaza hacia el sentido que dicta la frase. SBERT, E5 y BGE empaquetan esto en un vector por frase: el estado del arte para retrieval (benchmark MTEB)."
5 — Explotar: buscador y recomendador
Slides: Buscador · Recomendar
"Indexar φ(dj), embeber la query, ordenar por coseno: gana donde BM25 no ve nada (sinonimia) y donde BM25 ve de más (polisemia). Con usuarios y productos en el mismo espacio, recomendar es el mismo top-k, y el coseno se convierte en euros vía CTR × precio × margen."

En una frase. Un embedding convierte significado en geometría; el coseno convierte geometría en ranking; y el ranking, puesto delante de un cliente, convierte semántica en negocio. El Día 09 abre la máquina que fabrica los mejores embeddings: el Transformer.

Garrido-Merchán — ecgarrido@comillas.edu — Deep Learning para Business Analytics — Día 08 · Embeddings semánticos