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éemax_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
Instructions
- Créez une matrice de zéros de dimensions
max_seq_lengthpard_model. - Effectuez les calculs sinus et cosinus sur
position * div_termpour générer les valeurs d’encodage positionnel paires et impaires. - Assurez-vous que
pen’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])