Función torch.nn.Embedding de PyTorch
Manual de referencia de PyTorch torch.nn
torch.nn.EmbeddingEs el módulo de PyTorch utilizado para el embedding de palabras.
Mapea índices de vocabulario discretos a un espacio vectorial continuo; es una de las operaciones más básicas en el procesamiento del lenguaje natural.
Definición de la función
torch.nn.Embedding(num_embeddings, embedding_dim, padding_idx=None, max_norm=None, norm_type=2.0, scale_grad_by_freq=False, sparse=False)
Descripción de parámetros:
num_embeddings(int): Tamaño del vocabulario, es decir, número de filas de la matriz de embedding.embedding_dim(int): Dimensión de cada vector de embedding.padding_idx(int): Especifica el índice de padding, cuyo vector de embedding es un vector cero. Por defecto es None.max_norm(float): Si no es None, los vectores de embedding se normalizan a esta norma. Por defecto es None.norm_type(float): Orden de la norma a calcular. Por defecto es 2.0.scale_grad_by_freq(bool): Indica si se escalan los gradientes según la frecuencia de las palabras. Por defecto es False.sparse(bool): Indica si la matriz de pesos es una matriz dispersa. Por defecto es False.
Atributos:
weight(Tensor): Pesos aprendibles con forma (num_embeddings, embedding_dim).
Ejemplos de uso
Ejemplo 1: Uso básico
Crear y usar embeddings de palabras:
Ejemplo
import torch.nn as nn
# Crear la capa de embedding: vocabulario 10000, dimensión de embedding 256
embedding = nn.Embedding(num_embeddings=10000, embedding_dim=256)
# Índices de palabras (comenzando desde 0)
# Forma: (batch, seq_len)
input_indices = torch.tensor([[12, 45, 678], [901, 23, 56]])
# Obtener los vectores de embedding mediante la tabla de consulta
output = embedding(input_indices)
print("Forma del índice de entrada:", input_indices.shape)
print("Forma del embedding de salida:", output.shape) # (2, 3, 256)
# Ver la forma de la matriz de embedding
print("Forma de la matriz de embedding:", embedding.weight.shape)
Ejemplo 2: Usando padding_idx
Especificar el índice de padding:
Ejemplo
import torch.nn as nn
# Crear una capa de embedding con padding
embedding = nn.Embedding(num_embeddings=1000, embedding_dim=64, padding_idx=0)
# 0 se usa como padding
input_indices = torch.tensor([[1, 2, 3], [4, 0, 0]]) # La segunda oración tiene padding
output = embedding(input_indices)
print("Forma de entrada:", input_indices.shape)
print("Forma de salida:", output.shape)
print("Vector de embedding del padding:", output[1, 1].tolist()) # Todo ceros
print("Vector de embedding de no padding:", output[0, 0].tolist()[:5]) # Distinto de cero
Ejemplo 3: Vectores de palabras preentrenados
Cargar vectores de palabras preentrenados:
Ejemplo
import torch.nn as nn
import numpy as np
# Simular vectores de palabras preentrenados (en realidad se pueden usar GloVe, Word2Vec, etc.)
vocab_size = 1000
embedding_dim = 300
# Inicialización aleatoria (en realidad se deben cargar los vectores preentrenados)
pretrained_weights = np.random.randn(vocab_size, embedding_dim).astype('float32')
# Crear la capa de embedding
embedding = nn.Embedding(vocab_size, embedding_dim)
# Cargar los pesos preentrenados
embedding.weight.data = torch.from_numpy(pretrained_weights)
# Congelar la capa de embedding (no participa en el entrenamiento)
embedding.weight.requires_grad = False
print("Capa de embedding entrenable:", embedding.weight.requires_grad)
print("Forma de la matriz de embedding:", embedding.weight.shape)
Ejemplo 4: Limitar la norma del vector de embedding
Usar max_norm para limitar la norma del vector:
import torch.nn as nn
# Limitar la norma máxima del vector de embedding a 1.0
embedding = nn.Embedding(1000, 64, max_norm=1.0)
# Entrada
input_indices = torch.tensor([1, 2, 3])
# Norma de los pesos originales
original_norm = embedding.weight.data.norm(dim=1)[:3]
print("Norma de los pesos originales:", original_norm.tolist())
# Norma del vector después de la consulta de la tabla
output = embedding(input_indices)
output_norm = output.norm(dim=1)
print("Norma del vector de salida:", output_norm.tolist())
Ejemplo 5: Modelo completo de clasificación de texto
Clasificación de texto usando capa de embedding:
Ejemplo
import torch.nn as nn
class TextClassifier(nn.Module):
def __init__(self, vocab_size, embed_dim, hidden_dim, num_classes=2):
super(TextClassifier, self).__init__()
# Capa de embedding de palabras
self.embedding = nn.Embedding(vocab_size, embed_dim, padding_idx=0)
# LSTM
self.lstm = nn.LSTM(embed_dim, hidden_dim, batch_first=True)
# Clasificador
self.classifier = nn.Linear(hidden_dim, num_classes)
def forward(self, x):
# x: (batch, seq_len)
embedded = self.embedding(x) # (batch, seq_len, embed_dim)
# LSTM toma la última salida
_, (hidden, _) = self.lstm(embedded)
hidden = hidden[-1] # Estado oculto de la última capa
# Clasificación
logits = self.classifier(hidden)
return logits
# Parámetros
VOCAB_SIZE = 10000
EMBED_DIM = 128
HIDDEN_DIM = 256
model = TextClassifier(VOCAB_SIZE, EMBED_DIM, HIDDEN_DIM)
# Entrada: batch=4, longitud de secuencia=50
input_ids = torch.randint(1, VOCAB_SIZE, (4, 50))
output = model(input_ids)
print("Estructura del modelo:")
print(model)
print("nForma de entrada:", input_ids.shape)
print("Forma de salida:", output.shape)
Diferencia entre Embedding y EmbeddingBag
| Tipo | Entrada | Salida | Escenario de aplicación |
|---|---|---|---|
nn.Embedding |
Índice de palabra | Secuencia de vectores de palabras | Modelos secuenciales, LSTM, Transformer |
nn.EmbeddingBag |
Índice de palabra + offset | Vector agregado | Clasificación de texto, procesamiento rápido |
Preguntas frecuentes
Q1: ¿Cómo elegir la dimensión de embedding?
- Conjunto de datos pequeño: 50-100 dimensiones
- Conjunto de datos mediano: 100-300 dimensiones
- Conjunto de datos grande: 300-500 dimensiones
Q2: ¿Cuál es la función de padding_idx?
Establece el vector de embedding del índice especificado como vector cero y no calcula su gradiente durante la propagación hacia atrás.
Q3: ¿Cuándo congelar la capa de embedding?
Al usar vectores de palabras preentrenados, normalmente se congela primero durante un tiempo de entrenamiento y luego se ajusta finamente (fine-tuning).
Escenarios de uso
nn.EmbeddingLos principales escenarios de aplicación incluyen:
- Representación de vectores de palabras: convertir palabras en vectores densos
- Clasificación de texto: como capa de entrada para modelos NLP
- Modelos secuenciales: entrada de LSTM, GRU
- Sistema de recomendación: representación de embeddings de usuarios y elementos
Nota: embedding.weight es un parámetro aprendible que se puede entrenar directamente en el optimizador.
Otras extensiones