EmpezarEmpieza gratis

Crear un modelo RNN con atención

En PyBooks, el equipo ha estado explorando varias arquitecturas de deep learning. Tras investigar un poco, decides implementar una RNN con un mecanismo de atención para predecir la siguiente palabra de una frase. Te proporcionan un conjunto de datos con frases y un vocabulario creado a partir de ellas.

Se han importado por ti los siguientes paquetes: torch, nn.

Se ha precargado lo siguiente:

  • vocab y vocab_size: el conjunto de vocabulario y su tamaño
  • word_to_ix e ix_to_word: diccionario para los mapeos de palabra a índice e índice a palabra
  • input_data y target_data: conjunto de datos convertido a pares entrada-salida
  • embedding_dim y hidden_dim: dimensiones para el embedding y el estado oculto de la RNN

Puedes inspeccionar la variable data en la consola para ver las frases de ejemplo.

Este ejercicio forma parte del curso

Deep Learning para texto con PyTorch

Ver curso

Instrucciones del ejercicio

  • Crea una capa de embeddings para el vocabulario con el embedding_dim dado.
  • Aplica una transformación lineal a la salida en secuencia de la RNN para obtener las puntuaciones de atención.
  • Obtén los pesos de atención a partir de la puntuación.
  • Calcula el vector de contexto como la suma ponderada de las salidas de la RNN y los pesos de atención

ejercicio interactivo práctico

Prueba este ejercicio completando este código de ejemplo.

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")
Editar y ejecutar código