IniziaInizia gratis

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:

  • vocab e vocab_size: l'insieme del vocabolario e la sua dimensione
  • word_to_ix e ix_to_word: dizionario per le mappature parola→indice e indice→parola
  • input_data e target_data: insieme di dati convertito in coppie input–output
  • embedding_dim e hidden_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

Visualizza il corso

Istruzioni dell'esercizio

  • Crea un livello di embedding per il vocabolario con il embedding_dim fornito.
  • 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")
Modifica ed esegui il codice