CommencerCommencer gratuitement

Créer des encodages positionnels

L’intégration des tokens est un bon début, mais ces embeddings ne contiennent pas encore d’information sur la position de chaque token dans la séquence. Pour y remédier, l’architecture Transformer utilise des encodages positionnels, qui injectent dans les embeddings l’information liée à la position de chaque token.

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

  • d_model : la dimension des embeddings en entrée
  • max_seq_length : la longueur maximale de séquence (ou la longueur de séquence si toutes les séquences ont la même longueur)

Cet exercice fait partie du cours

Modèles Transformer avec PyTorch

Afficher le cours

Instructions

  • Créez une matrice de zéros de dimensions max_seq_length par d_model.
  • Effectuez les calculs sinus et cosinus sur position * div_term pour générer 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 embeddings des tokens en entrée, x.

Exercice interactif pratique

Essayez cet exercice en complétant cet exemple de code.

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