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:
vocabyvocab_size: el conjunto de vocabulario y su tamañoword_to_ixeix_to_word: diccionario para los mapeos de palabra a índice e índice a palabrainput_dataytarget_data: conjunto de datos convertido a pares entrada-salidaembedding_dimyhidden_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
Instrucciones del ejercicio
- Crea una capa de embeddings para el vocabulario con el
embedding_dimdado. - 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")