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’implémenter un RNN avec un mécanisme d’attention pour prédire le mot suivant d’une phrase. On vous fournit un jeu de données avec des phrases et un vocabulaire construit à partir de celles-ci.
Les paquets 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→indice et indice→motinput_dataettarget_data: jeu de données converti en paires entrée-sortieembedding_dimethidden_dim: dimensions pour l’embedding et l’état caché du RNN
Vous pouvez inspecter la variable data dans la console pour voir les phrases d’exemple.
Cet exercice fait partie du cours
Deep Learning pour le texte avec PyTorch
Instructions
- Créez une couche d’embedding pour le vocabulaire avec la
embedding_dimdonnée. - Appliquez une transformation linéaire à la sortie séquentielle du RNN pour obtenir les scores d’attention.
- Obtenez les pondérations d’attention à partir des scores.
- Calculez le vecteur de contexte comme la somme pondérée des sorties du RNN et des pondérations d’attention.
Exercice interactif pratique
Essayez cet exercice en complétant cet exemple de code.
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")