IniziaInizia gratis

Creare le codifiche posizionali

Effettuare l'embedding dei token è un buon inizio, ma questi embedding non contengono ancora informazioni sulla posizione di ciascun token nella sequenza. Per risolvere questo problema, l'architettura transformer utilizza le codifiche posizionali, che incorporano l'informazione posizionale di ogni token negli embedding.

Creerai una classe PositionalEncoding con i seguenti parametri:

  • d_model: la dimensionalità degli embedding in input
  • max_seq_length: la lunghezza massima della sequenza (o la lunghezza della sequenza se ogni sequenza ha la stessa lunghezza)

Questo esercizio fa parte del corso

Modelli Transformer con PyTorch

Visualizza il corso

Istruzioni dell'esercizio

  • Crea una matrice di zeri di dimensioni max_seq_length per d_model.
  • Esegui i calcoli di seno e coseno su position * div_term per creare i valori di embedding posizionali pari e dispari.
  • Assicurati che pe non sia un parametro apprendibile durante l'addestramento.
  • Somma gli embedding posizionali trasformati agli embedding dei token di input, x.

Esercizio pratico interattivo

Prova a risolvere questo esercizio completando il codice di esempio.

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])
Modifica ed esegui il codice