Vector Embeddings: Espacios Latentes y Similitud Coseno
Análisis de la representación de variables categóricas en espacios vectoriales continuos mediante modelos de distribución como Word2Vec y GloVe.
Contexto técnico
El procesamiento de lenguaje natural (NLP) tradicionalmente ha lidiado con la representación discreta de palabras. Técnicas como One-Hot Encoding generan vectores dispersos (sparse) de alta dimensionalidad (tamaño $V$ del vocabulario), donde la ortogonalidad entre vectores impide capturar relaciones semánticas; para un sistema computacional, "perro" y "canino" son tan distintos como "perro" y "automóvil".
Los embeddings vectoriales resuelven esto proyectando palabras en un espacio vectorial continuo ($R^d$, donde $d \ll V$) denominado espacio latente. En este espacio, la posición geométrica codifica el significado semántico derivado de la co-ocurrencia en grandes corpus de texto.
El estándar industrial se basa en arquitecturas predictivas (Word2Vec) y de factorización de matrices globales (GloVe). Aunque modelos recientes basados en mecanismos de atención comienzan a explorar representaciones contextuales, los embeddings estáticos siguen siendo la base para tareas de clasificación, similitud y sistemas de recomendación.
Fundamentos matemáticos
El objetivo es aprender una función de mapeo $f: V \rightarrow R^d$. En el modelo Skip-gram (arquitectura común de Word2Vec), se maximiza la probabilidad de predecir palabras de contexto $w_{t+j}$ dado un término central $w_t$.
La función objetivo a maximizar (log-likelihood promedio) se define como:
$$J(\theta) = \frac{1}{T} \sum_{t=1}^{T} \sum_{-c \leq j \leq c, j \neq 0} \log p(w_{t+j} | w_t)$$
Donde $c$ es el tamaño de la ventana de contexto. La probabilidad $p(w_O | w_I)$ se modela típicamente usando la función softmax:
$$p(w_O | w_I) = \frac{\exp({v'_{w_O}}^\top v_{w_I})}{\sum_{w=1}^{W} \exp({v'_{w}}^\top v_{w_I})}$$
Aquí, $v_w$ y $v'_w$ son las representaciones vectoriales de "entrada" y "salida" de la palabra $w$. Dado que el cálculo del denominador es computacionalmente costoso ($\mathcal{O}(V)$), en la práctica se utilizan aproximaciones como Negative Sampling o Hierarchical Softmax.
Para evaluar la relación semántica entre dos vectores $A$ y $B$ en el espacio latente, la distancia euclidiana es menos efectiva debido a la maldición de la dimensionalidad. Se utiliza la Similitud de Coseno, que mide el coseno del ángulo entre los vectores, ignorando su magnitud y enfocándose en la orientación:
$$\text{similarity}(A, B) = \cos(\theta) = \frac{A \cdot B}{\|A\| \|B\|} = \frac{\sum_{i=1}^{n} A_i B_i}{\sqrt{\sum_{i=1}^{n} A_i^2} \sqrt{\sum_{i=1}^{n} B_i^2}}$$
El resultado oscila entre -1 (opuestos) y 1 (idénticos), con 0 indicando ortogonalidad (sin relación).
Una representación gráfica de la aritmética vectorial de embeddings es la siguiente; es la misma que se utilizará en la implementación práctica.
Implementación práctica
La implementación estándar en Python se realiza mediante la biblioteca gensim, optimizada en C. A continuación, se muestra la carga de un modelo pre-entrenado y operaciones vectoriales directas.
import numpy as np
from gensim.models import KeyedVectors
# Carga de vectores pre-entrenados (e.g., Google News, 300 dimensiones)
# Formato binario estándar de Word2Vec
model_path = 'GoogleNews-vectors-negative300.bin'
print("Cargando modelo (esto puede consumir +3GB de RAM)...")
model = KeyedVectors.load_word2vec_format(model_path, binary=True)
# 1. Extracción del vector denso
vector_king = model['king']
print(f"Dimensión del vector: {vector_king.shape}") # (300,)
# 2. Cálculo manual de Similitud de Coseno
def cosine_similarity(v1, v2):
dot_product = np.dot(v1, v2)
norm_v1 = np.linalg.norm(v1)
norm_v2 = np.linalg.norm(v2)
return dot_product / (norm_v1 * norm_v2)
sim = cosine_similarity(model['apple'], model['banana'])
print(f"Similitud manual 'apple' vs 'banana': {sim:.4f}")
# 3. Uso de la API de Gensim para analogías
# Ecuación: King - Man + Woman = ?
result = model.most_similar(positive=['woman', 'king'],
negative=['man'],
topn=1)
print(f"King - Man + Woman = {result[0][0]} (Score: {result[0][1]:.4f})")
Análisis de comportamiento
Al desplegar estos modelos en producción, se observan los siguientes comportamientos:
- Aritmética Vectorial: Los vectores capturan relaciones sintácticas y semánticas lineales. Operaciones como $v_{Madrid} - v_{España} + v_{Francia}$ resultan consistentemente en un vector muy cercano a $v_{Paris}$.
- Estabilidad y Dimensionalidad: Existe un trade-off en la dimensión $d$. Vectores muy pequeños ($d < 50$) no logran capturar matices semánticos, mientras que dimensiones muy altas ($d > 600$) incrementan el coste computacional y de memoria sin ganancias significativas de accuracy en tareas downstream. El estándar habitual es $d=300$.
- Interpretabilidad: A diferencia de modelos basados en árboles, las dimensiones individuales de un embedding no son interpretables por humanos (e.g., la dimensión 42 no significa "plural" o "género"). La información está distribuida.
Comparativas o referencias técnicas
Existen dos enfoques dominantes para la generación de estos espacios:
| Característica | Word2Vec (Skip-gram) | GloVe (Global Vectors) |
|---|---|---|
| Método | Predictivo (Red Neuronal Local) | Factorización de Matriz (Co-ocurrencia Global) |
| Contexto | Ventana deslizante local | Estadísticas de todo el corpus |
| Performance | Mejor en tareas de analogía semántica | Ligeramente más rápido en entrenamiento, robusto en datasets pequeños |
| Manejo de OOV | No (requiere re-entreno o heurística) | No |
FastText (Facebook AI Research) surge como una alternativa capaz de manejar palabras fuera del vocabulario (OOV) mediante la incorporación de información de sub-palabras (n-gramas de caracteres), aunque incrementa significativamente el tamaño del modelo en memoria.
Limitaciones y casos donde no conviene usarlo
El uso de embeddings estáticos presenta limitaciones críticas que deben considerarse antes de la implementación:
- Polisemia estática: Esta es la limitación más severa. La palabra "banco" tiene un único vector $v_{banco}$, que es un promedio de todos sus significados (institución financiera, asiento, conjunto de peces). El modelo no puede distinguir el sentido según el contexto en tiempo de inferencia.
- Sesgo incorporado: Los espacios latentes replican sesgos presentes en el corpus de entrenamiento (e.g., asociaciones de género estereotipadas en profesiones). Operaciones algebraicas pueden amplificar estos sesgos si no se aplican técnicas de debiasing.
- Palabras fuera del vocabulario (OOV): Si el sistema recibe una palabra no vista durante el entrenamiento (o un error tipográfico), Word2Vec y GloVe no pueden generar un vector, debiendo recurrir a un token genérico
<UNK>o vectores aleatorios, degradando el rendimiento. - Incapacidad contextual: No capturan la sintaxis compleja o la negación a larga distancia. Para tareas que requieren comprensión profunda del discurso, los embeddings por sí solos son insuficientes y deben alimentarse a redes recurrentes (LSTM/GRU).