Vytvoření RNN modelu s mechanismem pozornosti
Tým v PyBooks prozkoumává různé architektury deep learningu. Po důkladném výzkumu se rozhodneš implementovat RNN s mechanismem pozornosti (Attention) pro predikci dalšího slova ve větě. K dispozici máš dataset s větami a slovníkem vytvořeným z nich.
Následující balíčky jsou již naimportované: torch, nn.
Následující proměnné jsou předpřipraveny:
vocabavocab_size: sada slovníku a jeho velikostword_to_ixaix_to_word: slovníky pro mapování slov na indexy a indexů na slovainput_dataatarget_data: dataset převedený na dvojice vstup–výstupembedding_dimahidden_dim: rozměry pro embedding a skrytý stav RNN
V konzoli si můžeš prohlédnout proměnnou data s ukázkovými větami.
Toto cvičení je součástí kurzu
Deep Learning for Text with PyTorch
Pokyny k cvičení
- Vytvoř vrstvu embeddingů pro slovník s daným rozměrem
embedding_dim. - Aplikuj lineární transformaci na sekvenční výstup RNN, abys získal/a skóre pozornosti.
- Ze skóre pozornosti získej váhy pozornosti.
- Vypočítej kontextový vektor jako vážený součet výstupů RNN a vah pozornosti.
Interaktivní cvičení na vyzkoušení si v praxi
Vyzkoušejte si toto cvičení dokončením tohoto ukázkového kódu.
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")