CommencezCommencez 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'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 :

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

Voir le cours

Instructions de l’exercice

  • Créez une couche d'intégration pour le vocabulaire avec le embedding_dim fourni.
  • 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")
Modifier et exécuter le code