LoslegenKostenlos starten

Ein RNN-Modell mit Attention erstellen

Bei PyBooks untersucht das Team verschiedene Deep-Learning-Architekturen. Nach etwas Recherche entscheidest du dich, ein RNN mit Attention-Mechanismus zu implementieren, um das nächste Wort in einem Satz vorherzusagen. Du bekommst einen Datensatz mit Sätzen und ein daraus erzeugtes Vokabular.

Folgende Pakete wurden für dich importiert: torch, nn.

Folgendes wurde für dich vorab geladen:

  • vocab und vocab_size: das Vokabular und seine Größe
  • word_to_ix und ix_to_word: Wörterbuch für Wort-zu-Index- und Index-zu-Wort-Zuordnungen
  • input_data und target_data: in Eingabe-Ausgabe-Paare umgewandelter Datensatz
  • embedding_dim und hidden_dim: Dimensionen für Embedding und den versteckten Zustand des RNN

Du kannst die Variable data in der Konsole inspizieren, um die Beispielsätze zu sehen.

Diese Übung ist Teil des Kurses

<Kurs>Deep Learning für Text mit PyTorch</Kurs>
Kurs ansehen

Übungsanweisungen

  • Erstelle eine Embedding-Schicht für das Vokabular mit dem gegebenen embedding_dim.
  • Wende eine lineare Transformation auf die RNN-Sequenzausgabe an, um die Attention-Scores zu erhalten.
  • Erzeuge die Aufmerksamkeitsgewichte aus den Scores.
  • Berechne den Kontextvektor als gewichtete Summe der RNN-Ausgaben und der Aufmerksamkeitsgewichte.

Interaktive praktische Übung

Versuche dich an dieser Übung, indem du diesen Beispielcode vervollständigst.

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")
Code bearbeiten und ausführen