ComenzarEmpieza gratis

Crear codificaciones posicionales

Hacer el embedding de los tokens es un buen comienzo, pero estos embeddings aún no incluyen información sobre la posición de cada token en la secuencia. Para solucionarlo, la arquitectura transformer utiliza codificaciones posicionales, que incorporan la información de posición de cada token dentro de los embeddings.

Vas a crear una clase PositionalEncoding con los siguientes parámetros:

  • d_model: la dimensionalidad de los embeddings de entrada
  • max_seq_length: la longitud máxima de la secuencia (o la longitud de la secuencia si todas tienen la misma longitud)

Este ejercicio forma parte del curso

Modelos Transformer con PyTorch

Ver curso

Instrucciones del ejercicio

  • Crea una matriz de ceros de dimensiones max_seq_length por d_model.
  • Realiza los cálculos de seno y coseno sobre position * div_term para generar los valores de embedding posicional pares e impares.
  • Asegúrate de que pe no sea un parámetro entrenable durante el entrenamiento.
  • Suma los embeddings posicionales transformados a los embeddings de tokens de entrada, x.

Ejercicio interactivo práctico

Prueba este ejercicio y completa el código de muestra.

class PositionalEncoding(nn.Module):
    def __init__(self, d_model, max_seq_length):
        super().__init__()
        # Create a matrix of zeros of dimensions max_seq_length by d_model
        pe = ____
        position = torch.arange(0, max_seq_length, dtype=torch.float).unsqueeze(1)
        div_term = torch.exp(torch.arange(0, d_model, 2).float() * -(math.log(10000.0) / d_model))
        
        # Perform the sine and cosine calculations
        pe[:, 0::2] = torch.____(position * div_term)
        pe[:, 1::2] = torch.____(position * div_term)
        # Ensure pe isn't a learnable parameter during training
        self.____('____', pe.unsqueeze(0))
        
    def forward(self, x):
        # Add the positional embeddings to the token embeddings
        return ____ + ____[:, :x.size(1)]

pos_encoding_layer = PositionalEncoding(d_model=512, max_seq_length=4)
output = pos_encoding_layer(token_embeddings)
print(output.shape)
print(output[0][0][:10])
Editar y ejecutar código