ComeçarComece de graça

Criando um modelo RNN com atenção

Na PyBooks, a equipe vem explorando várias arquiteturas de deep learning. Após algumas pesquisas, você decide implementar uma RNN com mecanismo de Atenção para prever a próxima palavra em uma frase. Você recebeu um conjunto de dados com frases e um vocabulário criado a partir delas.

Os seguintes pacotes já foram importados para você: torch, nn.

Os seguintes itens já foram pré-carregados para você:

  • vocab e vocab_size: o conjunto de vocabulário e seu tamanho
  • word_to_ix e ix_to_word: dicionário de mapeamentos de palavra para índice e de índice para palavra
  • input_data e target_data: conjunto de dados convertido em pares de entrada e saída
  • embedding_dim e hidden_dim: dimensões para o embedding e para o estado oculto da RNN

Você pode inspecionar a variável data no console para ver as frases de exemplo.

Este exercício faz parte do curso

Deep Learning para Texto com PyTorch

Ver curso

Instruções do exercício

  • Crie uma camada de embedding para o vocabulário com o embedding_dim fornecido.
  • Aplique uma transformação linear à saída em sequência da RNN para obter os escores de atenção.
  • Obtenha os pesos de atenção a partir do escore.
  • Calcule o vetor de contexto como a soma ponderada das saídas da RNN e dos pesos de atenção

Exercício interativo prático

Experimente este exercício completando este código de exemplo.

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 e executar o código