Créer un modèle RNN avec mécanisme d'attention
Chez PyBooks, l'équipe explore différentes architectures de deep learning. Après quelques recherches, vous décidez d'implanter un RNN avec un mécanisme d'attention pour prédire le prochain mot d'une phrase. On vous fournit un jeu de données contenant des phrases et un vocabulaire créé à partir de celles-ci.
Les modules suivants ont été importés pour vous : torch, nn.
Les éléments suivants ont été préchargés pour vous :
vocabetvocab_size: l'ensemble du vocabulaire et sa tailleword_to_ixetix_to_word: dictionnaires pour les correspondances mot-vers-indice et indice-vers-motinput_dataettarget_data: jeu de données converti en paires entrée-sortieembedding_dimethidden_dim: dimensions pour l'intégration et l'état caché du RNN
Vous pouvez examiner la variable data dans la console pour voir les phrases d'exemple.
Cette activité fait partie du cours
Apprentissage profond pour le texte avec PyTorch
Instructions de l’exercice
- Créez une couche d'intégration pour le vocabulaire avec le
embedding_dimfourni. - Appliquez une transformation linéaire à la sortie séquentielle du RNN pour obtenir les scores d'attention.
- Obtenez les poids d'attention à partir des scores.
- Calculez le vecteur de contexte comme la somme pondérée des sorties du RNN par les poids d'attention.
Exercice interactif pratique
Essayez cet exercice en complétant ce code d’exemple.
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")