La implementación del vector de palabras corresponde a la capa de incrustación en PyTorch, y la función de código fuente de su código de implementación (la versión de PyTorch es 2.0) es la siguiente:
torch.nn.Embedding(num_embeddings, embedding_dim, padding_idx=Ninguno, max_norm=Ninguno, norm_type=2.0, scale_grad_by_freq=False, sparse=False, _weight=Ninguno)
Esta función genera aleatoriamente un vector, que se puede considerar como una tabla de búsqueda de vectores de palabras con un tamaño de [num_embeddings, embedding_dim]. donde num_embeddings es el tamaño de la tabla de consulta y embedding_dim es la dimensión de cada vector de consulta.
Explicación de los parámetros de función:
- num_embeddings: int, el tamaño de la tabla de consulta
- embedding_dim: int, la dimensión de cada vector de consulta
- padding_idx: int, ID de relleno
- max_norm: flotante, la norma máxima, cada vector de incrustación cuya norma exceda max_norm se volverá a normalizar a su norma max_norm
- norm_type: float, p-norm (p=norm_type), el valor predeterminado es 2
Cabe señalar que el tipo de datos del vector de subíndice de consulta debe ser Long, es decir, Int 64.
Veamos algunos ejemplos del uso de la capa Embedding.
- Ejemplo 1:
# -*- coding: utf-8 -*-
import torch
import torch.nn as nn
# an Embedding module containing 10 tensors of size 3
embedding = nn.Embedding(10, 3)
print(embedding.weight)
# a batch of 2 samples of 4 indices each
input = torch.LongTensor([[1, 2, 4, 5], [4, 3, 2, 9]])
print(embedding(input))
producción:
Parameter containing:
tensor([[ 1.9260, -1.3492, 0.3753],
[ 1.2182, 1.8350, 0.7975],
[ 0.1568, 0.9562, 1.1164],
[ 1.4660, 0.8763, 0.1681],
[ 0.4175, 0.4029, -1.3495],
[-0.5182, 0.1465, 0.0280],
[ 0.7748, 0.1848, -0.4229],
[ 0.3740, -0.2761, 1.5017],
[-0.4583, 0.2934, 0.2217],
[-0.1402, -0.5671, -1.7069]], requires_grad=True)
tensor([[[ 1.2182, 1.8350, 0.7975],
[ 0.1568, 0.9562, 1.1164],
[ 0.4175, 0.4029, -1.3495],
[-0.5182, 0.1465, 0.0280]],
[[ 0.4175, 0.4029, -1.3495],
[ 1.4660, 0.8763, 0.1681],
[ 0.1568, 0.9562, 1.1164],
[-0.1402, -0.5671, -1.7069]]], grad_fn=<EmbeddingBackward>)
Process finished with exit code 0
- Ejemplo 2:
# -*- coding: utf-8 -*-
import torch
import torch.nn as nn
# Embedding with padding_idx
embedding = nn.Embedding(5, 3, padding_idx=0)
print(embedding.weight)
input = torch.LongTensor([[0, 2, 0, 4]])
print(embedding(input))
producción:
Parameter containing:
tensor([[ 0.0000, 0.0000, 0.0000],
[-1.4159, -1.2288, 0.2698],
[-2.2287, -1.5313, 0.3296],
[-1.0393, -0.3102, 0.2819],
[-0.2162, -0.2060, 0.3289]], requires_grad=True)
tensor([[[ 0.0000, 0.0000, 0.0000],
[-2.2287, -1.5313, 0.3296],
[ 0.0000, 0.0000, 0.0000],
[-0.2162, -0.2060, 0.3289]]], grad_fn=<EmbeddingBackward>)
A partir de esto podemos encontrar que el vector correspondiente a padding_idx en la capa de incrustación es un vector cero.
referencias
- Código fuente de incrustación: https://pytorch.org/docs/stable/generated/torch.nn.Embedding.html