Creare un modello RNN con attention
In PyBooks, il team sta esplorando varie architetture di deep learning. Dopo alcune ricerche, decidi di implementare un RNN con meccanismo di Attention per prevedere la parola successiva in una frase. Ti viene fornito un insieme di dati con frasi e un vocabolario creato a partire da esse.
I seguenti pacchetti sono già stati importati per te: torch, nn.
Hai a disposizione i seguenti oggetti pre-caricati:
vocabevocab_size: l'insieme del vocabolario e la sua dimensioneword_to_ixeix_to_word: dizionario per le mappature parola→indice e indice→parolainput_dataetarget_data: insieme di dati convertito in coppie input–outputembedding_dimehidden_dim: dimensioni per l'embedding e lo stato nascosto dell'RNN
Puoi ispezionare la variabile data nella console per vedere le frasi di esempio.
Questo esercizio fa parte del corso
Deep Learning per il testo con PyTorch
Istruzioni dell'esercizio
- Crea un livello di embedding per il vocabolario con il
embedding_dimfornito. - Applica una trasformazione lineare all'output di sequenza dell'RNN per ottenere i punteggi di attenzione.
- Ricava i pesi di attenzione a partire dai punteggi.
- Calcola il vettore di contesto come somma pesata delle uscite dell'RNN e dei pesi di attenzione.
Esercizio pratico interattivo
Prova a risolvere questo esercizio completando il codice di esempio.
class RNNWithAttentionModel(nn.Module):
def __init__(self):
super(RNNWithAttentionModel, self).__init__()
# Create an embedding layer for the vocabulary
self.embeddings = nn.____(vocab_size, embedding_dim)
self.rnn = nn.RNN(embedding_dim, hidden_dim, batch_first=True)
# Apply a linear transformation to get the attention scores
self.attention = nn.____(____, 1)
self.fc = nn.____(hidden_dim, vocab_size)
def forward(self, x):
x = self.embeddings(x)
out, _ = self.rnn(x)
# Get the attention weights
attn_weights = torch.nn.functional.____(self.____(out).____(2), dim=1)
# Compute the context vector
context = torch.sum(____.____(2) * out, dim=1)
out = self.fc(context)
return out
attention_model = RNNWithAttentionModel()
optimizer = torch.optim.Adam(attention_model.parameters(), lr=0.01)
criterion = nn.CrossEntropyLoss()
print("Model Instantiated")