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 inputmax_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
Istruzioni dell'esercizio
- Crea una matrice di zeri di dimensioni
max_seq_lengthperd_model. - Esegui i calcoli di seno e coseno su
position * div_termper creare i valori di embedding posizionali pari e dispari. - Assicurati che
penon 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])