Capa incrustada en PyTorch

  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.

  1. 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
  1. 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

  1. Código fuente de incrustación: https://pytorch.org/docs/stable/generated/torch.nn.Embedding.html

Supongo que te gusta

Origin blog.csdn.net/jclian91/article/details/129654814
Recomendado
Clasificación