CommencezCommencez gratuitement

Créer des encodages positionnels

L'intégration des jetons est un bon début, mais ces représentations ne contiennent pas encore l'information sur la position de chaque jeton dans la séquence. Pour y remédier, l'architecture Transformer utilise des encodages positionnels, qui injectent l'information de position de chaque jeton dans les vecteurs d'intégration.

Vous allez créer une classe PositionalEncoding avec les paramètres suivants :

  • d_model : la dimension des vecteurs d'intégration en entrée
  • max_seq_length : la longueur maximale de séquence (ou la longueur de séquence si elles ont toutes la même longueur)

Cette activité fait partie du cours

Modèles Transformer avec PyTorch

Voir le cours

Instructions de l’exercice

  • Créez une matrice de zéros de dimensions max_seq_length par d_model.
  • Effectuez les calculs de sinus et cosinus sur position * div_term pour créer les valeurs d'encodage positionnel paires et impaires.
  • Assurez-vous que pe n'est pas un paramètre apprenable pendant l'entraînement.
  • Ajoutez les encodages positionnels transformés aux vecteurs d'intégration des jetons en entrée, x.

Exercice interactif pratique

Essayez cet exercice en complétant ce code d’exemple.

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])
Modifier et exécuter le code