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:
vocabundvocab_size: das Vokabular und seine Größeword_to_ixundix_to_word: Wörterbuch für Wort-zu-Index- und Index-zu-Wort-Zuordnungeninput_dataundtarget_data: in Eingabe-Ausgabe-Paare umgewandelter Datensatzembedding_dimundhidden_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
Deep Learning für Text mit PyTorch
Anleitung zur Übung
- 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 Übung
Vervollständige den Beispielcode, um diese Übung erfolgreich abzuschließen.
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")