12,584 lecturas
12,584 lecturas

Embeddings 101: Unlocking Semantic Relationships in Text

por Ritesh Modi14m2025/03/27
Read on Terminal Reader
Read this story w/o Javascript

Demasiado Largo; Para Leer

Las incorporaciones abordan las limitaciones de cómo las máquinas entienden el lenguaje. No son sólo una nueva técnica fantástica, sino que abordan las limitaciones fundamentales en la comprensión del lenguaje.
featured image - Embeddings 101: Unlocking Semantic Relationships in Text
Ritesh Modi HackerNoon profile picture
0-item
1-item


Cuando empecé a trabajar con datos de texto hace años, todo el concepto de incorporaciones parecía innecesariamente complejo.Me sentía cómodo con mis enfoques de saco de palabras y vectores TF-IDF simples.


No consideré seriamente las incorporaciones hasta que encontré un desafío en un proyecto de análisis de sentimientos. Estuve trabajando con reseñas de productos, y mis modelos tradicionales siguieron clasificando erroneamente las reseñas con sarcasmo o lenguaje matizado. El problema se hizo claro: mis modelos no entendieron que "este producto está enfermo" podría ser realmente positivo o que "ha funcionado exactamente como se esperaba" podría ser neutro o negativo dependiendo del contexto.


No son sólo una nueva técnica fantástica – abordan limitaciones fundamentales en la forma en que las máquinas entienden el lenguaje.


The Old Days: Life Before Embeddings

Los viejos días: la vida antes de las incorporaciones

Entendamos la historia del uso de representaciones de texto antes de las incorporaciones sin entrar en los detalles de estos métodos y enfoques.

One-Hot Encoding

Representaba cada palabra como un vector escaso con todos los zeros excepto un único "1" en la posición correspondiente a esa palabra en un vocabulario. Representaba las palabras como vectores masivos, escasos donde cada palabra tenía su propia dimensión. Si su vocabulario tenía 100.000 palabras (que es modesto), cada vector de palabras tenía 99,999 zeros y un solo 1. Estas representaciones nos dijeron absolutamente nada de significado. Las palabras "excelente" y "fantastic" eran matemáticamente tan diferentes como "excelente" y "terrible" - faltando completamente las relaciones semánticas obvias.


«gato» → [1, 0, 0, 0, ..., 0] (posición 5432 en el vocabulario) «perro» → [0, 1, 0, 0, ..., 0] (posición 8921 en el vocabulario)


Limitaciones

    y
  • Explosión de dimensión: los vectores tenían tantas dimensiones como el tamaño del vocabulario (a menudo más de 100.000)
  • y
  • No hay relaciones semánticas: "gato" y "gato" eran tan diferentes como "gato" y "avión" (todos equidistantes)
  • y
  • Ineficiencia computacional: Multiplicar estas matrices escasas fue extremadamente intensivo en recursos
  • y
  • No hay generalización: el sistema no podía entender palabras fuera de su vocabulario original
  • y

Bag-of-Words Approach

Contaba las ocurrencias de palabras en los documentos, a veces ponderadas por su importancia.Trataba las palabras en los documentos como colecciones de palabras no clasificadas, eliminando completamente el orden de palabras. "El perro picó al hombre" y "El hombre picó al perro" tendrían representaciones idénticas.


Documento: "El gato estaba sentado en la alfombra" BoW: {"el": 2, "el gato": 1, "el gato": 1, "en": 1, "el gato": 1}

Las limitaciones:

    y
  • Pérdida del orden de las palabras: "El perro mordisca al hombre" y "El hombre mordisca al perro" tenían representaciones idénticas
  • y
  • Vectores de alta dimensión: aún se requieren vectores de tamaño de vocabulario
  • y
  • Sin comprensión semántica: los sinónimos se representaban como características completamente diferentes
  • y
  • Sin significado contextual: Cada palabra tenía una representación fija independientemente del contexto.
  • y

N-grams

Para capturar algún orden de palabras, comenzamos usando n-gramos (sequencias de n palabras consecutivas).


Con unigramas (palabras únicas), usted podría tener un vocabulario de 100.000. Con bigrams (pares de palabras), de repente está mirando a millones de características potenciales. Con trigramas? billones, teóricamente. Incluso con el corte agresivo, la dimensionalidad se hizo incontrolable.

Limitations:

Las limitaciones:
    y
  • Explosión combinatoria: el número de posibles n-gramos crece exponencialmente
  • y
  • Esparcimiento de datos: La mayoría de los n-gramos posibles nunca aparecen en los datos de entrenamiento
  • y
  • Ventana de contexto limitada: Solo se capturan relaciones dentro de ventanas pequeñas (normalmente 2-5 palabras)
  • y

TF-IDF (Term Frequency-Inverse Document Frequency)

TF-IDF mejoró las cosas por ponderar las palabras basándose en lo importante que eran para un documento específico en relación con el corpus.

Limitations:

Las limitaciones:

No hay significado semántico: es el número y la frecuencia de las palabras que determinan la importancia de su uso.

The Embedding Revolution: What Changed?

La revolución industrial: ¿qué ha cambiado?

La transición a las incorporaciones no fue sólo una mejora incremental; fue un cambio de paradigma en la forma en que representamos el lenguaje.

Meaning Through Context

La comprensión fundamental detrás de las incorporaciones es engañosamente simple: las palabras que aparecen en contextos similares probablemente tengan significados similares.Si ves que "perro" y "gato" aparecen alrededor de los mismos tipos de palabras ("animal de compañía", "alimentación", "peluquería"), probablemente estén semánticamente relacionadas.


Los primeros modelos de embalaje como Word2Vec capturaron esto entrenando a las redes neuronales para predecir:


    y
  • Una palabra basada en su contexto circundante (Saco continuo de palabras)
  • y
  • El contexto circundante basado en una palabra (Skip-gram)
  • y


Los pesos de capa ocultos de estos modelos se convirtieron en nuestros vectores de palabras, codificando relaciones semánticas en las propiedades geométricas del espacio vectorial.


Cuando planeé por primera vez los vectores de palabras y vi que "rey" - "hombre" + "mujer" ≈ "reina", sabía que estábamos en algo revolucionario.


El siguiente gran salto vino con incorporaciones contextuales.Los primeros modelos como Word2Vec y GloVe dieron a cada palabra un único vector independientemente del contexto.


"I need to bank the money" vs. "I'll meet you by the river bank"


Modelos como BERT y GPT solucionaron esto generando diferentes embeddings para la misma palabra dependiendo de su contexto circundante.


Así que primero entendamos qué son las incorporaciones y cómo transformaron la NLP y abordaron las limitaciones de los enfoques anteriores.

What Are Embeddings?

¿Qué son los Embeddings?

Los embeddings son representaciones numéricas de datos (texto, imágenes, audio, etc.) en un espacio vectorial continuo. Para el texto, los embeddings capturan relaciones semánticas entre palabras o documentos, permitiendo que las máquinas entiendan el significado de una manera que sea matemáticamente procesable.

Key Concepts:

    y
  • Vectores: listas ordenadas de números que representan un punto en un espacio multidimensional
  • y
  • Dimensiones: Número de valores en cada vector (por ejemplo, 768-dim, 1024-dim)
  • y
  • Espacio vectorial: el espacio matemático donde existen las incorporaciones
  • Similaridad semántica: medida por la distancia o ángulo entre vectores (más cerca = más similar)
  • y

What Do Dimensions Represent?

Cada dimensión en un vector de incorporación representa una característica o aspecto aprendido de los datos. A diferencia de la ingeniería de características clásica donde los humanos definen lo que significa cada dimensión, en los modelos de incorporación modernos:


    y
  • Las dimensiones surgen durante el entrenamiento para representar "conceptos" abstractos
  • y
  • Las dimensiones individuales a menudo carecen de un significado específico interpretable por el hombre.
  • y
  • El vector completo, sin embargo, captura la información semántica de manera holística
  • y
  • Algunas dimensiones pueden corresponder a sentimiento, formalidad, tema o sintaxis, pero la mayoría representan combinaciones complejas de características.
  • y

Why We Need Embeddings

Los ordenadores fundamentalmente trabajan con números, no palabras.Al procesar el lenguaje, necesitamos convertir texto en representaciones numéricas que:


    y
  1. Capturar relaciones semánticas: conceptos similares deben tener representaciones similares
  2. y
  3. Conservar el significado contextual – La misma palabra puede significar cosas diferentes en contextos diferentes
  4. y
  5. Activar operaciones matemáticas, como encontrar similitudes o realizar analogías
  6. y
  7. Trabajar de manera eficiente a escala – Procesar grandes volúmenes de texto sin explosión computacional
  8. y


Los embeddings resuelven estos problemas al representar palabras, frases o documentos como vectores densos en un espacio continuo donde las relaciones semánticas se conservan como relaciones geométricas.

Fundamentos de Embeddings

Representación del vector

En lugar de vectores escasos con miles o millones de dimensiones, las incorporaciones utilizan unos pocos cientos de dimensiones densas donde cada dimensión contribuye al significado.


"cat" → [0.2, -0.4, 0.1, -0.8, ..., 0.3] (300 dimensions)

"kitten" → [0.19, -0.38, 0.15, -0.75, ..., 0.29] (similar to "cat")


Esto hace que los ordenes de computación de magnitud sean más eficientes al tiempo que permite una representación semántica más rica.

Distribución semántica

Los embeddings están construidos sobre el principio de que "se conocerá una palabra por la empresa que mantiene" (J.R. Firth).Al analizar qué palabras aparecen en contextos similares, los embeddings capturan relaciones semánticas automáticamente.


Por ejemplo, "rey" y "reina" tendrán contextos similares, por lo que tendrán incorporaciones similares, aunque raramente aparezcan en la misma posición exacta.

Propiedades matemáticas

Los espacios incorporados tienen propiedades matemáticas notables:


vector("king") - vector("man") + vector("woman") ≈ vector("queen")


Esto permite el razonamiento analógico y las operaciones semánticas directamente en el espacio vector.

Aprendizaje de transferencia

Las incorporaciones pre-entrenadas capturan conocimientos de lenguaje general que se pueden ajustar a tareas específicas, reduciendo drásticamente los datos necesarios para nuevas aplicaciones.

Entendimiento Contextual

Las incorporaciones contextuales modernas (como las de BERT, GPT, etc.) representan la misma palabra de manera diferente en función del contexto:


"I'll deposit money in the bank" → "bank" relates to finance

"I'll sit by the river bank" → "bank" relates to geography


Con todo el conocimiento sobre la historia y la comprensión de las incorporaciones, es hora de comenzar a usarlas.

Utilice los modelos LLM/SLM para generar embeddings

Varios equipos de investigación han desarrollado modelos de embalaje entrenados en diversos conjuntos de datos que abarcan múltiples idiomas y dominios. Esta diversidad resulta en modelos con vocabularios muy diferentes y capacidades de comprensión semántica. Por ejemplo, los modelos entrenados predominantemente en la literatura científica inglesa codificarán conceptos técnicos de manera diferente a los entrenados en contenidos de redes sociales multilingües. Esta especialización permite a los profesionales seleccionar modelos de embalaje que se ajusten mejor a sus casos de uso específicos.


La implementación práctica de las incorporaciones ha sido simplificada en gran medida por bibliotecas como el paquete SentenceTransformer de Hugging Face, que proporciona un SDK completo para trabajar con varios modelos de incorporación. Del mismo modo, el SDK de OpenAI ofrece acceso directo a sus modelos de incorporación, que han mostrado un rendimiento impresionante en muchos parámetros de referencia. Estas herramientas, y hay muchas más, tienen acceso democratizado a tecnologías de incorporación de última generación, permitiendo a los desarrolladores integrar la comprensión semántica en aplicaciones sin tener que entrenar modelos desde cero.


Los modelos, por el bien de este artículo, deben ser tratados como una caja negra que toma las sentencias como una entrada y devuelve su representación vectorial correspondiente.

Uso de la biblioteca de SentenceTransformers para Embeddings

La forma más sencilla de generar embeddings usando SentenceTransformer:

from sentence_transformers import SentenceTransformer

# Load a pre-trained model
model = SentenceTransformer('all-MiniLM-L6-v2')  # 384 dimensions

# Generate embeddings
texts = ["This is an example sentence", "Each sentence becomes a vector"]

embeddings = model.encode(texts)

print(f"Shape: {embeddings.shape}")  # (2, 384)

max_seq_length = model.tokenizer.model_max_length

print(max_seq_length) # 256


​​El modelo “all-MiniLM-L6-v2” disponible de HuggingFace tiene 384 dimensiones. Esto significa que puede capturar 384 características o matices para una palabra o una frase dada. La longitud de secuencia de este modelo es 256 tokens. Las frases se descomponen en palabras y palabras en tokens por el tokenizador durante el proceso de incorporación. El número de tokens generados para una frase es generalmente 25% a 40% más que el número de palabras en la frase.


Sequence length denotes the number of tokens that can be processed by the model as given input. Anything less is padded to make it 256 in length, and anything more is discarded. There are implications of this, and we will discuss them in another post.


El método de codificación de la clase SentenceTransformer es un envoltorio en el modo de inferencia de PyTorch para usar el modelo.


from sentence_transformers import SentenceTransformer
import torch

# Load the model directly with SentenceTransformer
model = SentenceTransformer("sentence-transformers/msmarco-distilbert-base-tas-b")

# Input text
texts = ["This is an example sentence", "Each sentence becomes a vector"]

# Get embedding directly
with torch.no_grad():
    embedding = model.encode(texts, convert_to_tensor=True)
print(embedding)


Aquí, la función torch.no_grad asegura que no se calculan gradientes durante la propagación trasera.


Otra forma más genérica de generar embeddings usando PyTorch:


# Load the model
model = AutoModel.from_pretrained("sentence-transformers/msmarco-distilbert-base-tas-b")

# Get the tokenizer
tokenizer = AutoTokenizer.from_pretrained("sentence-transformers/msmarco-distilbert-base-tas-b")

# Tokenize input
text = ["This is an example sentence"]
encoded_input = tokenizer(text, padding=True, truncation=True, return_tensors='pt')

# Get embedding of the [CLS] token
with torch.no_grad():
    outputs = model(**encoded_input, return_dict=True)
    cls_embedding = outputs.last_hidden_state[:, 0]
print(cls_embedding)


La diferencia entre este y los fragmentos de código anteriores es que la función de codificación ha sido reemplazada por el uso explícito de tokenizer y modelo.


Otra diferencia es que estamos usando outputs.last_hidden_state[:, 0] para recuperar el vector relacionado con el token CLS. Este token especial CLS se añade a cada frase al comienzo de cada frase, y contiene información acumulada sobre la frase entera.


Cabe señalar que este enfoque de añadir un token CLS sólo es aplicable a ciertas arquitecturas basadas en transformadores, y esto incluye BERT y sus variantes y transformadores basados sólo en codificadores.


Best for:Tareas de clasificación y predicción a nivel de secuencia


Why they work:El token [CLS] en los modelos de estilo BERT está específicamente entrenado para agregar información de toda la secuencia durante el pre-entrenamiento. Funciona como un token "resumen" que captura el significado general.


When to choose:

    y
  • Cuando se utilizan BERT, RoBERTa o modelos similares para la clasificación
  • y
  • Cuando se necesita un vector único que represente una secuencia entera
  • y
  • Cuando su tarea a continuación implica predecir una propiedad de todo el texto
  • y


El método CLS utilizado es sólo uno de los métodos para capturar las incorporaciones de una frase.

Mean Pooling

Tomar la media de todas las incorporaciones de token es sorprendentemente eficaz para muchas tareas.Es mi método de paso cuando estoy utilizando las incorporaciones para tareas de similitud o recuperación.


Best for:Semántica de semejanza, recopilación y representaciones de propósito general.


Why it works:Mediando en todas las representaciones de token, el agrupamiento medio captura el contenido semántico colectivo mientras reduce el ruido.


When to choose:

    y
  • Para aplicaciones de semejanza de documentos o búsqueda semántica
  • y
  • Cuando necesitas representaciones robustas que no están dominadas por ningún token único
  • y
  • Cuando la prueba empírica demuestra que supera a otros métodos (a menudo lo hace para tareas de similitud)
  • y


import torch
from transformers import AutoTokenizer, AutoModel

model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)

# Tokenize input
texts = ["This is an example sentence", "Each sentence becomes a vector"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")

# Mean pooling
with torch.no_grad():
    outputs = model(**inputs)
    
    # Get attention mask to ignore padding tokens
    attention_mask = inputs['attention_mask']
    
    # Sum token embeddings and divide by the number of tokens
    sum_embeddings = torch.sum(outputs.last_hidden_state * attention_mask.unsqueeze(-1), dim=1)
    count_tokens = torch.sum(attention_mask, dim=1, keepdim=True)
    mean_embeddings = sum_embeddings / count_tokens

print(f"Shape: {mean_embeddings.shape}")  # (2, 768)


Max Pooling

Max pooling toma el valor máximo para cada dimensión en todos los tokens.Es sorprendentemente bueno en capturar características importantes independientemente de dónde aparezcan en el texto.


Best for:Detección de características y tareas de extracción de información


Why it works:Max pooling selecciona la activación más fuerte para cada dimensión en todos los tokens, capturando de manera efectiva las características más destacadas independientemente de dónde aparezcan en el texto.


When to choose:

    y
  • Cuando las características específicas importan más que su frecuencia o posición
  • y
  • Cuando se busca la presencia de conceptos o entidades particulares
  • y
  • Cuando se trata de textos largos en los que las señales importantes pueden diluirse en
  • y


import torch
from transformers import AutoTokenizer, AutoModel

model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)

# Tokenize input
texts = ["This is an example sentence", "Each sentence becomes a vector"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")

# Max pooling
with torch.no_grad():
    outputs = model(**inputs)
    
    # Create a mask to ignore padding tokens for max pooling
    attention_mask = inputs['attention_mask'].unsqueeze(-1)
    
    # Replace padding token representations with -inf so they're never selected as max
    token_embeddings = outputs.last_hidden_state.masked_fill(attention_mask == 0, -1e9)
    
    # Take max over token dimension
    max_embeddings = torch.max(token_embeddings, dim=1)[0]

print(f"Shape: {max_embeddings.shape}")  # (2, 768)

Weighted Mean Pooling

El método de agrupamiento ponderado intenta dar más peso a los tokens más importantes basados en la posición (por ejemplo, dar más peso a los tokens posteriores).


Best for:Tareas donde diferentes partes de la entrada tienen una importancia diferente


Why it works:No todas las palabras contribuyen igualmente al significado. el agrupamiento ponderado le permite enfatizar ciertos tokens en función de su posición, puntuación de atención u otras métricas de relevancia.


When to choose:

    y
  • Cuando el orden de la secuencia es importante (por ejemplo, dando más peso a los tokens posteriores)
  • y
  • Cuando ciertos tokens son inherentemente más informativos (por ejemplo, verbos y verbos vs. artículos)
  • y
  • Cuando tienes una heurística de importancia específica que tiene sentido para tu tarea
  • y


import torch
import torch.nn.functional as F
from transformers import AutoTokenizer, AutoModel

model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)

# Tokenize input
texts = ["This is an example sentence", "Each sentence becomes a vector"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")

# Weighted mean pooling - more weight to later tokens
with torch.no_grad():
    outputs = model(**inputs)
    
    # Get token embeddings and attention mask
    token_embeddings = outputs.last_hidden_state
    attention_mask = inputs['attention_mask']
    
    # Create position-based weights (later positions get higher weights)
    input_lengths = torch.sum(attention_mask, dim=1).unsqueeze(-1)
    position_indices = torch.arange(token_embeddings.size(1)).unsqueeze(0).expand_as(attention_mask)
    position_weights = position_indices.float() / input_lengths.float()
    position_weights = position_weights * attention_mask
    
    # Normalize weights to sum to 1
    position_weights = position_weights / torch.sum(position_weights, dim=1, keepdim=True)
    
    # Apply weights and sum
    weighted_embeddings = torch.sum(token_embeddings * position_weights.unsqueeze(-1), dim=1)

print(f"Shape: {weighted_embeddings.shape}")  # (2, 768)


Último Token Pooling

El último agrupamiento de token es una técnica para crear un único vector de incorporación de una secuencia de incorporaciones de token seleccionando sólo la representación del token final.


Best for:Modelos autoregresivos y procesamiento secuencial


Why it works:En modelos de izquierda a derecha como GPT, el token final contiene el contexto acumulado de toda la secuencia, lo que lo hace rico en información para ciertas tareas.


When to choose:

    y
  • Cuando se utiliza GPT u otros modelos de sólo decodificación
  • y
  • Cuando se trabaja con tareas que dependen en gran medida del contexto anterior
  • y
  • Para la generación de texto o tareas de finalización
  • y


import torch
from transformers import AutoTokenizer, AutoModel

model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)

# Tokenize input
texts = ["This is an example sentence", "Each sentence becomes a vector"]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")

# Last token pooling
with torch.no_grad():
    outputs = model(**inputs)
    
    # Get the last non-padding token for each sequence
    attention_mask = inputs['attention_mask']
    last_token_indices = torch.sum(attention_mask, dim=1) - 1
    batch_indices = torch.arange(attention_mask.size(0))
    
    # Extract the last token embedding for each sequence
    last_token_embeddings = outputs.last_hidden_state[batch_indices, last_token_indices]

print(f"Shape: {last_token_embeddings.shape}")  # (2, 768)



Hay muchas más maneras, y estos métodos se pueden combinar juntos, así como para crear métodos personalizados.Este fue sólo el comienzo para comprender las incorporaciones como un concepto y una implementación básica para obtener incorporaciones utilizando diferentes técnicas.

Looking Forward: Where Embeddings Are Headed

Mirando hacia adelante: Dónde se dirigen las incorporaciones

The embedding space (pun intended) continues to evolve:


    y
  • Las incorporaciones multimodales están rompiendo las barreras entre texto, imágenes, audio y vídeo.Los modelos como CLIP y DALL-E utilizan las incorporaciones para crear un espacio semántico compartido entre diferentes modalidades.
  • y
  • Arquitecturas más eficientes como MobileBERT y DistilBERT están permitiendo el uso de incorporaciones potentes en dispositivos con recursos limitados.
  • y
  • Las incorporaciones específicas de dominio pre-entrenadas en corpora especializada están impulsando el estado de la arte en campos como la medicina, el derecho y las finanzas.
  • y

Estoy especialmente emocionado por las incorporaciones conscientes de la composición que capturan mejor cómo se construye el significado de las unidades más pequeñas, lo que podría finalmente resolver los desafíos de larga data con la negación y las frases de composición.

Final Thoughts

Pensamientos finales

Las incorporaciones no son sólo otra técnica de NLP – son un cambio fundamental en la forma en que las máquinas entienden y procesan el lenguaje. Nos han llevado de tratar el texto como símbolos arbitrarios a capturar la rica y compleja red de significados y relaciones que los humanos entienden intuitivamente.


Cualquiera que sea la tarea de NLP en la que estés trabajando, es probable que las incorporaciones aplicadas cuidadosamente puedan hacerlo mejor.La clave es comprender no sólo cómo generarlas, sino cuándo y por qué utilizar diferentes enfoques.


Y si todavía está utilizando un paquete de palabras o una codificación caliente para el análisis de texto...


Hay un mundo de posibilidades esperándote.

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks