CommencerCommencer gratuitement

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 :

  • vocab et vocab_size : l’ensemble du vocabulaire et sa taille
  • word_to_ix et ix_to_word : dictionnaires pour les correspondances mot→indice et indice→mot
  • input_data et target_data : jeu de données converti en paires entrée-sortie
  • embedding_dim et hidden_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

Afficher le cours

Instructions

  • Créez une couche d’embedding pour le vocabulaire avec la embedding_dim donné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")
Modifier et exécuter le code