Skip to content

English · Español

02 — CBOW y Skip-Gram (Word2Vec a nivel panorámico)

🇪🇸 Word2Vec (2013) plantó la semilla: un token se conoce por su compañía. Predice el centro a partir del contexto (CBOW) o el contexto a partir del centro (Skip-Gram). Implementamos CBOW por gradientes más estables, pero el principio — entrenar embeddings con un objetivo predictivo sobre el corpus — es lo que importa.

Los dos objetivos de Word2Vec

Mikolov et al. 2013 ("Efficient Estimation of Word Representations in Vector Space") introdujeron dos arquitecturas complementarias para aprender embeddings:

CBOW — Continuous Bag of Words

Predice el token centro a partir de una ventana de tokens de contexto.

Context:   [I, work, ?, every, day]    (window size 4, two tokens each side)
Center:    "hard"
Prediction: model says which token most likely sits in the ?

Skip-Gram

Predice el contexto a partir del centro.

Center:   "work"
Context:  [I, hard, every, day]    (predict each independently)

Ambos entrenan la misma matriz de embeddings \(E\). La diferencia es la estructura de la pérdida.

Por qué implementamos CBOW

Tres razones:

  1. Señal de gradiente más limpia. Promediar las embeddings de contexto antes de la proyección da un objetivo único y bien condicionado. El gradiente de Skip-Gram se suma sobre múltiples pares (contexto | centro) independientes y tiende a ser más ruidoso sobre corpus pequeños.
  2. Más eficiente con nuestro corpus minúsculo. CBOW hace una actualización por token centro; Skip-Gram hace \(2k\) actualizaciones (para ventana \(k\)).
  3. La pedagogía es la misma. Una vez que Borja tiene la intuición de CBOW, Skip-Gram es un cambio mental de 10 minutos (y lo esbozamos abajo).

La matemática de CBOW

Sea \(E \in \mathbb{R}^{V \times d}\) la matriz de embeddings de entrada y \(W \in \mathbb{R}^{V \times d}\) la proyección de salida (típicamente desatada de \(E\) en Word2Vec; las ataremos en los transformers de la Fase 17). Para una ventana de contexto de tamaño \(k\) (tokens a cada lado, por lo que \(2k\) tokens de contexto en total) alrededor del token centro \(t\):

  1. Busca las embeddings de contexto:
\[h = \frac{1}{2k} \sum_{j \in \text{context}(t)} E[j] \quad \in \mathbb{R}^d\]

(Promedia las embeddings de los tokens de contexto.)

  1. Proyecta a logits:
\[z = h \cdot W^\top + b \quad \in \mathbb{R}^V\]
  1. Softmax + pérdida de entropía cruzada:
\[\mathcal{L}_t = -\log \text{softmax}(z)_t = -z_t + \log \sum_j \exp(z_j)\]

(El cross_entropy_from_logits de la Fase 05.)

La pérdida sobre el corpus es la suma (o media) sobre todos los centros \(t\).

La matemática de Skip-Gram (esbozo)

Solo a efectos de comparación — no implementado en esta fase. Centro \(t\), predice cada palabra de contexto de forma independiente:

\[\mathcal{L}_t = -\sum_{j \in \text{context}(t)} \log \text{softmax}(E[t] W^\top + b)_j\]

Cada palabra de contexto es un término de entropía cruzada separado usando la misma predicción \(E[t] W^\top + b\).

Skip-Gram tiende a comportarse mejor con palabras raras porque cada palabra rara recibe varias actualizaciones por aparición. CBOW tiende a comportarse mejor con palabras frecuentes porque el promediado estabiliza los contextos comunes. Nuestro corpus es pequeño y bien balanceado (cada verbo aparece con igual frecuencia en las plantillas); CBOW es la opción correcta.

Negative sampling (fuera de alcance aquí)

El softmax en la pérdida tiene un denominador sobre los \(V\) tokens. Para nuestro \(V = 64\), esto es trivial. Para el setup original de Word2Vec (\(V = 10^6\)), es caro — de ahí el negative sampling: reemplaza el softmax completo por una clasificación binaria contra \(k\) tokens "negativos" aleatorios. No implementamos negative sampling; el corpus es lo bastante pequeño para el softmax completo.

Se menciona aquí para que:

  1. Cuando leas papers/código de Word2Vec, reconozcas la técnica.
  2. Cuando escales más tarde, sepas qué optimización pedir.

El tamaño de ventana \(k\)

Usamos \(k = 2\) (así que 4 tokens de contexto alrededor de cada centro). Elección de \(k\):

  • \(k\) pequeño (1-2): captura estructura sintáctica local. Bueno para nuestras frases cortas y plantilladas.
  • \(k\) grande (5-10): captura co-ocurrencia "temática" más difusa. Usado por Word2Vec en corpus de noticias.

Para el corpus de §A13 — frases cortas como I work every day .\(k = 2\) da un contexto que incluye el pronombre sujeto y un marcador temporal. Ventanas mayores incluirían otras frases y diluirían la señal.

La dimensión de embedding \(d\)

La regla práctica de PHASE_13_PLAN.md: \(d \approx V^{1/4}\) para vocabularios minúsculos. Para \(V = 64\), eso da \(d \approx 3\). Usamos \(d = 32\) — sobreparametrizado por 10× — por dos razones:

  1. Margen para el modelo aguas abajo. El transformer de la Fase 17 espera \(d_\text{model} = 64\), y la embedding acabará atada como una fila de esa matriz. Empezar en \(d = 32\) mantiene las cosas manejables; si necesitamos expandir a 64 más tarde, podemos reentrenar o hacer zero-pad.
  2. Fidelidad de la visualización. La proyección UMAP de \(d = 3\) a \(d = 2\) es un aplastamiento casi trivial; de \(d = 32\) a \(d = 2\) da a UMAP espacio suficiente para encontrar estructura.

La dinámica de entrenamiento esperada

Para nuestro corpus, sobre un CBOW con \(d = 32, k = 2\), pérdida softmax completa, SGD con momentum:

  • Epoch 1: la pérdida cae de \(\log V \approx 4{,}16\) (uniforme aleatorio) a ~3,5 a medida que el modelo aprende que algunos tokens (the, a, ,) son más frecuentes que otros.
  • Epoch 5–10: la pérdida cae a ~2,5 a medida que el modelo aprende la co-ocurrencia sujeto-verbo (I work, she works, etc.).
  • Epoch 20: pérdida ~2,0. La geometría está ahora lo bastante estructurada para plotearla.

Si tu pérdida se estanca muy por encima de \(\log V \approx 4{,}16\), tienes un bug — probablemente el flujo de gradiente no llega a \(E\). (El test de gradiente del lab 00 lo cazará.)

Si tu pérdida cae a ~0, has sobreajustado — las embeddings memorizan la co-ocurrencia específica de posición. Para nuestro corpus pequeño, un ligero sobreajuste va bien porque la geometría (lo que nos importa) es robusta frente a ello.

Qué NO cubre este archivo

  • GloVe. Otro método clásico de embeddings (Pennington et al. 2014). Fuera de alcance.
  • fastText, embeddings de subword. La Fase 11 trató la tokenización por subword; no la rehacemos aquí.
  • Embeddings contextuales (BERT, GPT). Fase 15+. CBOW da un vector por token, independientemente del contexto.
  • Implementación de negative sampling. Mencionada arriba; no codificada.

Siguiente: 03-similarity-and-visualization.md